如何在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
相关产品推荐
相关产品推荐

