You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按组为回归模型添加拟合预测值的技术实现咨询

为分组回归添加正确的拟合值

我明白你想要对每个国家(分组)分别拟合回归模型,然后给每个观测值加上对应组的拟合值。你已经用到了dplyr和modelr,这俩包搭配起来做分组建模特别顺手,我来帮你补全代码并解释清楚:

首先先把你的数据集补全(假设USA的后续数据是合理数值,这里补几个示例方便演示):

library(dplyr)
library(modelr)
library(purrr) # 用于处理嵌套数据的map函数

df <- tribble(
  ~year, ~country, ~value,
  2001, "France", 55,
  2002, "France", 53,
  2003, "France", 31,
  2004, "France", 10,
  2005, "France", 30,
  2006, "France", 37,
  2007, "France", 54,
  2008, "France", 58,
  2009, "France", 50,
  2010, "France", 40,
  2011, "France", 49,
  2001, "USA", 55,
  2002, "USA", 53,
  2003, "USA", 64,
  2004, "USA", 70,
  2005, "USA", 68,
  2006, "USA", 72,
  2007, "USA", 75,
  2008, "USA", 78,
  2009, "USA", 71,
  2010, "USA", 65,
  2011, "USA", 69
)

接下来有两种常用的方法实现分组拟合并添加预测值:

方法1:嵌套数据分步处理

这种方法逻辑清晰,适合理解分组建模的流程:

# 1. 按国家分组并嵌套数据
nested_df <- df %>%
  group_by(country) %>%
  nest()

# 2. 为每个组拟合回归模型(这里假设用year预测value,可根据需求修改公式)
nested_df <- nested_df %>%
  mutate(model = map(data, ~ lm(value ~ year, data = .x)))

# 3. 给每组原始数据加拟合值,再展开数据框
df_with_fitted <- nested_df %>%
  mutate(data_with_fitted = map2(data, model, ~ add_predictions(.x, .y, var = "fitted_value"))) %>%
  unnest(data_with_fitted) %>%
  ungroup()

# 查看前几行结果
head(df_with_fitted)

方法2:用group_modify()一步到位

如果想要更简洁的代码,group_modify()可以直接对每个分组的数据框操作:

df_with_fitted <- df %>%
  group_by(country) %>%
  group_modify(~ add_predictions(.x, lm(value ~ year, data = .x), var = "fitted_value")) %>%
  ungroup()

# 查看后几行结果
tail(df_with_fitted)

关键注意点:

  • 我这里默认拟合的是value对year的线性回归,如果你的模型有其他需求(比如加入更多自变量、非线性项),只需要修改lm()里的公式即可,比如value ~ year + I(year^2)。
  • add_predictions()的var参数可以自定义拟合值列的名字,避免和原数据列冲突。
  • 最后记得用ungroup()取消分组,防止后续操作出现分组残留的问题。
  • 哪怕你用的不是线性模型(比如glm、随机森林),这个逻辑也完全适用,只需要把lm()换成对应的建模函数就行。

内容的提问来源于stack exchange,提问作者ulima2_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:05:49