如何让ggpmisc::stat_poly_eq()支持变量加权计算?
解决stat_poly_eq支持变量加权的方法
我之前也碰到过这个问题,折腾了一阵找到了解决方案,其实不用绕远路,stat_poly_eq是可以支持加权拟合的,只是方式和geom_smooth不一样,给你详细说下:
核心思路:通过method.args传递权重给拟合函数
stat_poly_eq默认使用lm作为拟合方法,而lm本身支持weights参数。虽然stat_poly_eq的aes()里不能直接映射weight(这就是你看到警告的原因,它不识别这个映射参数),但我们可以通过method.args把权重参数直接传给底层的lm函数,这样拟合出来的就是加权模型,对应的方程和R²也会是加权后的结果。
具体代码示例
假设你的数据是这样的:
set.seed(123) stuff <- data.frame( x = rnorm(100), y = 2 + 3*x + rnorm(100, 0, 0.5), weight = sample(1:5, 100, replace = TRUE) # 权重变量 )
然后用加权拟合的方式绘图:
library(ggplot2) library(ggpmisc) ggplot(stuff, aes(x = x, y = y)) + geom_point(aes(size = weight), alpha = 0.5) + # 用点大小展示权重 geom_smooth(method = "lm", aes(weight = weight), se = FALSE) + # 加权拟合线 stat_poly_eq( method = "lm", method.args = list(weights = ~weight), # 用公式引用数据中的权重列,更灵活 aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")), parse = TRUE # 解析公式文本 )
分组数据的加权处理
如果你的数据有分组变量,这个方法同样适用,只需要保留分组映射即可,method.args里的~weight会自动在每个分组的子数据中解析:
# 给数据添加分组变量 stuff$group <- sample(c("Group A", "Group B"), 100, replace = TRUE) ggplot(stuff, aes(x = x, y = y, color = group)) + geom_point(aes(size = weight), alpha = 0.5) + geom_smooth(method = "lm", aes(weight = weight), se = FALSE) + stat_poly_eq( method = "lm", method.args = list(weights = ~weight), aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")), parse = TRUE, position = position_dodge(width = 0.3) # 分组方程文本错开显示 )
为什么这个方法可行?
stat_poly_eq的本质是调用指定的拟合方法(比如lm)计算模型,然后提取方程和R²等信息。通过method.args传递weights参数,相当于直接执行了lm(y ~ x, data = subset_data, weights = weight),完全符合加权线性回归的要求,而且和geom_smooth的加权拟合结果完全一致。
内容的提问来源于stack exchange,提问作者silver
相关产品推荐
相关产品推荐

