R语言曲线模型统计分析疑问:Excel与R方程差异及代码正确性
R与Excel二次回归方程差异解析
数据与分析代码
生成数据
treatment<- c(0,24,36,48) yield<- c(4.78,9.67,8.02,6.7) dataA<- data.frame(treatment, yield)
绘制曲线图
ggplot(data=dataA, aes(x=treatment, y=yield))+ stat_smooth(method='lm', linetype=1, se=FALSE, formula=y~poly(x,2), size=0.5, color="Blue") + geom_point (col="Black", size=4) + scale_y_continuous(breaks = seq(0,12,2), limits = c(0,12)) + labs(x="Fertilizer application (kg/ha)", y="Yield (ton/ha)") + theme_classic(base_size=18, base_family="serif")+ theme(axis.line= element_line(size=0.5, colour="black"))+ windows(width=5.5, height=5)
统计显著性分析结果
regression<- lm(yield ~ poly(treatment,2), data=dataA) summary(regression)
输出结果:
Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 7.2925 0.4376 16.663 0.0382 * poly(treatment, 2)1 1.5441 0.8753 1.764 0.3283 poly(treatment, 2)2 -3.1137 0.8753 -3.557 0.1745 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.8753 on 1 degrees of freedom Multiple R-squared: 0.9404, Adjusted R-squared: 0.8211 F-statistic: 7.884 on 2 and 1 DF, p-value: 0.2442
核心疑问
- R输出的回归方程为
y=-3.1137x² + 1.5441x + 7.2925,Excel给出的方程是y = -0.006x² + 0.3234x + 4.8742,二者存在明显差异 - 差异的原因是什么?哪个方程是正确的?
- 曲线分析代码
yield ~ poly(treatment,2)是否存在错误?
解答
1. 差异根源:poly()的正交多项式默认设置
R中poly()函数默认生成正交多项式,会对原始的treatment值做中心化、缩放等转换,消除一次项和二次项之间的多重共线性,让统计推断更可靠。但这种转换后的变量和原始变量完全不是一个尺度,因此回归系数的数值和直接用原始x²的回归结果天差地别。
而Excel的二次回归是直接使用原始x值的一次项和二次项(相当于R中y ~ x + I(x^2)的写法),没有做任何正交转换,所以系数对应原始变量的拟合结果。
2. 两个方程都正确,适用场景不同
- Excel的方程:直接对应原始施肥量的数值,代入原始x就能算出预测产量,适合实际生产场景直接使用。
- R的正交多项式方程:系数是转换后变量的拟合值,不能直接代入原始x计算,但它解决了共线性问题,在系数显著性检验等统计推断场景下更稳健。
如果要在R中得到和Excel一致的原始变量系数,只需修改回归公式,禁用poly()的正交特性:
# 方法1:添加raw=TRUE参数 regression_raw <- lm(yield ~ poly(treatment,2, raw=TRUE), data=dataA) summary(regression_raw) # 方法2:显式构造二次项 regression_raw2 <- lm(yield ~ treatment + I(treatment^2), data=dataA) summary(regression_raw2)
运行后得到的系数会和Excel结果基本一致(微小差异来自计算精度)。
3. 原代码yield ~ poly(treatment,2)没有错误
这个写法本身是正确的,它实现的是正交二次回归,适合统计分析场景。如果你的需求是检验二次项的显著性,这个写法没问题;但如果需要用原始施肥量直接预测产量,就需要加上raw=TRUE参数。
内容的提问来源于stack exchange,提问作者J.K Kim
相关产品推荐
相关产品推荐

