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

如何在ggscatter的geom_smooth中按组平均年龄校正回归线?

解决ggscatter中geom_smooth纳入年龄校正的问题

嘿,我来帮你搞定这个在回归线里校正年龄的需求!你想要的其实是在每个分组中,拟合Time对Average的多元线性回归,同时控制Age这个协变量,这样画出来的回归线就是校正了年龄后的结果。

核心思路

geom_smooth里的lm方法支持自定义模型公式,我们只需要把Age作为协变量加入公式,就能实现校正。你之前写的adjust= ~age不是正确的参数,应该用formula来指定完整的回归模型。

修正后的完整代码

首先注意你的数据里分组列是group(不是groups),还有Age列首字母大写,下面是可直接运行的代码:

# 先加载需要的包
library(ggpubr)

# 你的数据
dtable <- structure(list(Time = c(0L, 0L, 0L, 0L, 6L, 12L, 18L, 18L, 0L, 12L, 18L, 6L), group = structure(c(1L, 1L, 2L, 2L, 1L, 3L, 3L, 3L, 3L, 4L, 4L, 1L), .Label = c("A", "B", "C", "D"), class = "factor"), Age = c(77, 70.2, 69.9, 65.7, 66.2, 66.7, 67.2, 67.7, 66.8, 67.8, 68.3, 68.8), Average = c(96L, 90L, 94L, 94L, 96L, 96L, 92L, 120L, 114L, 109L, 113L, 103L)), row.names = c(NA, 12L ), class = "data.frame")

# 绘制校正年龄后的散点图与回归线
ggscatter(dtable, x = "Time", y = "Average", conf.int = TRUE) +
  theme_bw() +
  geom_smooth(aes(group = 1), method = 'lm', formula = Average ~ Time + Age) +
  facet_wrap(~group)

代码解释

  • formula = Average ~ Time + Age:这个公式告诉lm模型,我们要拟合Average和Time的关系,同时把Age作为协变量纳入,也就是控制Age的影响后,看Time对Average的效应。
  • facet_wrap(~group):按group列分组展示每个组的结果,每个组都会单独拟合包含Age的回归模型。
  • 这样画出来的回归线,就是校正了年龄差异后,Time和Average的关联趋势。

如果你想要的是“按每组的平均年龄校正”(也就是把每个样本的Age替换为组内均值后拟合),那可以先预处理数据:

# 先计算每个组的平均年龄(需要dplyr包)
library(dplyr)
dtable <- dtable %>%
  group_by(group) %>%
  mutate(Age_group_mean = mean(Age, na.rm = TRUE)) %>%
  ungroup()

# 用组平均年龄校正后的模型绘图
ggscatter(dtable, x = "Time", y = "Average", conf.int = TRUE) +
  theme_bw() +
  geom_smooth(aes(group = 1), method = 'lm', formula = Average ~ Time + Age_group_mean) +
  facet_wrap(~group)

不过更常规的做法是直接把原始Age作为协变量纳入多元回归,也就是第一种方案,这样能更充分地控制年龄的混杂效应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:09:43