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

使用R语言poly()函数做回归:为何预测结果不一致?

为什么两个模型的预测结果不同?

你这里的核心问题出在R公式语法的细节上,而不是poly()函数的预测能力!

关键错误:公式里的q^2不是你想的那样

在R的公式语法中,^符号的作用是表示「包含主效应及所有交互项」,而不是数学意义上的平方。所以你写的:

model_2 = lm(v~1+q+q^2)

实际上等价于lm(v~1+q)——因为q^2展开是q + q:q,而q:q就是q本身,最终公式里只有一次项,这是个一次线性模型,和model_1的二次正交多项式模型自然预测结果不一样!

正确的二次模型写法

要在公式中表示数学意义上的q的平方,你需要用I()函数强制R将括号内的内容当作普通算术表达式计算,而不是解析成公式语法。正确的代码应该是:

q = 1:11
v = c(3,5,7,9.2,14,20,26,34,50,59,80)
model_1 = lm(v~poly(q,2))
model_2 = lm(v~1+q+I(q^2))  # 用I()包裹q^2

这时候你再运行predict(model_1)和predict(model_2),会发现结果完全一致——因为两个模型拟合的是同一个二次曲线,只是参数化方式不同:

  • model_1用的是正交多项式基(解决了原始多项式项的多重共线性问题,方便系数显著性解释)
  • model_2用的是原始的多项式项

关于poly()的补充说明

你提到的poly()生成正交向量对预测无实际作用是对的——只要多项式的阶数相同,不管用正交多项式还是原始多项式,模型的预测能力是完全一致的,差异只体现在参数估计的数值和可解释性上,正交化后的系数更容易通过t检验判断显著性,因为正交项之间不存在多重共线性。

内容的提问来源于stack exchange,提问作者Anthony Hauser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:43:28