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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:35:25