在R中如何使用dplyr按分组执行loess函数并获取预测值
问题原因
你原有代码分组逻辑不生效的核心原因是:stats::loess属于R基础统计函数,无法直接识别dplyr的分组标记,mutate中直接调用时本质是用全量数据集完成了一次全局loess拟合,再把预测值按分组长度重复填充,因此结果不符合预期。
修正方案
推荐使用dplyr的group_modify()函数实现按分组独立执行拟合逻辑,代码如下:
# 需先加载依赖包 library(dplyr) data.1.with.pred <- data.1 %>% # 按国家分组 group_by(country) %>% # 分组内按年份排序 arrange(year, .by_group = TRUE) %>% # 对每个分组独立执行拟合、预测逻辑 group_modify(~ { loess_fit <- loess(response ~ year, span = 0.75, data = .x) .x$pred.response <- predict(loess_fit, newdata = .x["year"]) return(.x) }) %>% # 取消分组 ungroup()
如果你更习惯嵌套数据框的写法,也可以用nest()+map()的组合实现相同效果:
library(tidyverse) data.1.with.pred <- data.1 %>% nest(data = -country) %>% mutate( loess_fit = map(data, ~loess(response ~ year, span = 0.75, data = .x)), data = map2(data, loess_fit, ~mutate(.x, pred.response = predict(.y, .x["year"]))) ) %>% unnest(data)
结果验证
将上述代码生成的pred.response列作为y值,和原始年份、国家字段传入ggplot绘制折线图,会和你原有可视化代码中geom_smooth()生成的loess平滑线完全重合,即可证明分组拟合结果正确。
内容的提问来源于stack exchange,提问作者Giuseppe Petri
相关产品推荐
相关产品推荐

