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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:54:01