按组为回归模型添加拟合预测值的技术实现咨询
为分组回归添加正确的拟合值
我明白你想要对每个国家(分组)分别拟合回归模型,然后给每个观测值加上对应组的拟合值。你已经用到了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_
相关产品推荐
相关产品推荐

