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

如何从R的stat_smooth/回归模型正确提取回归方程?提取方程绘图与原曲线不符

问题原因与解决方法

核心原因

你使用poly(x, degree = 2)时,poly()函数默认生成正交多项式,而非基于原始x变量的普通二次多项式。stat_poly_eq输出的回归系数对应正交化后的变量,直接代入原始x计算自然和原曲线不匹配。

验证差异

运行以下代码查看两种多项式拟合的系数区别:

# 正交多项式拟合(默认)
model_ortho <- lm(disp ~ poly(mpg, 2), data = mtcars)
summary(model_ortho)

# 原始变量多项式拟合
model_raw <- lm(disp ~ poly(mpg, 2, raw = TRUE), data = mtcars)
summary(model_raw)

可以看到两个模型的系数完全不同,这就是曲线不匹配的根源。

解决方法

方法一:使用原始变量多项式

在poly()中指定raw = TRUE,此时输出的系数可直接用于stat_function:

ggplot(mtcars, aes(x = mpg, y = disp)) + 
  geom_point() +
  ggpmisc::stat_poly_line(formula = y ~ poly(x, degree = 2, raw = TRUE)) +
  ggpmisc::stat_poly_eq(aes(label = after_stat(eq.label)), 
                        formula = y ~ poly(x, degree = 2, raw = TRUE)) +
  stat_function(fun = \(x) 1456.8 - 103.0 * x + 2.6 * x ^ 2)

注:上述系数需替换为raw = TRUE时stat_poly_eq输出的实际值

方法二:基于正交多项式转换计算

若坚持使用正交多项式,需先对输入x做正交化转换再代入系数:

# 获取正交多项式的转换参数
poly_ortho <- poly(mtcars$mpg, 2)
# 提取正交模型的系数
coef_ortho <- coef(lm(disp ~ poly_ortho, data = mtcars))
# 定义带正交转换的函数
ortho_fun <- function(x) {
  x_poly <- poly(x, 2, coefs = attr(poly_ortho, "coefs"))
  coef_ortho[1] + coef_ortho[2] * x_poly[,1] + coef_ortho[3] * x_poly[,2]
}
# 绘图
ggplot(mtcars, aes(x = mpg, y = disp)) + 
  geom_point() +
  ggpmisc::stat_poly_line(formula = y ~ poly(x, degree = 2)) +
  ggpmisc::stat_poly_eq(aes(label = after_stat(eq.label)), 
                        formula = y ~ poly(x, degree = 2)) +
  stat_function(fun = ortho_fun)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:05:02