使用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
相关产品推荐
相关产品推荐

