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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:19:56