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

