我有
library(ISLR)
attach(Wage)
# Polynomial Regression and Step Functions
fit=lm(wage~poly(age,4),data=Wage)
coef(summary(fit))
fit2=lm(wage~poly(age,4,raw=T),data=Wage)
coef(summary(fit2))
plot(age, wage)
lines(20:350, predict(fit, newdata = data.frame(age=20:350)), lwd=3, col="darkred")
lines(20:350, predict(fit2, newdata = data.frame(age=20:350)), lwd=3, col="darkred")
预测线看起来是一样的,但为什么系数如此不同?你如何在raw=T
和raw=F
中解释它们。
我发现poly(...,raw=T)
生成的系数与~age+I(age^2)+I(age^3)+I(age^4)
生成的系数匹配。
如果我想使用系数来预测"手动" (不使用predict()
函数)有什么我应该注意的吗?我应该如何解释poly()
中正交多项式的系数。
答案 0 :(得分:51)
默认情况下,使用raw = FALSE
,poly()
计算正交多项式。它在内部使用原始编码x,x ^ 2,x ^ 3,......建立模型矩阵,然后对列进行缩放,使每列与前一列正交。这不会改变拟合值,但具有以下优点:您可以查看多项式中的某个顺序是否显着改善了较低阶的回归。
考虑简单的cars
数据,其中包含响应停止dist
和驾驶speed
。在物理上,这应该具有二次关系,但在这个(旧的)数据集中,二次项并不重要:
m1 <- lm(dist ~ poly(speed, 2), data = cars)
m2 <- lm(dist ~ poly(speed, 2, raw = TRUE), data = cars)
在正交编码中,您可以在summary(m1)
中获得以下系数:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 42.980 2.146 20.026 < 2e-16 ***
poly(speed, 2)1 145.552 15.176 9.591 1.21e-12 ***
poly(speed, 2)2 22.996 15.176 1.515 0.136
这表明存在非常显着的线性效应,而第二顺序不显着。后一个p值(即多项式中最高阶之一)与原始编码中的相同:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.47014 14.81716 0.167 0.868
poly(speed, 2, raw = TRUE)1 0.91329 2.03422 0.449 0.656
poly(speed, 2, raw = TRUE)2 0.09996 0.06597 1.515 0.136
但是低阶p值发生了显着变化。原因是在模型m1
中,回归量是正交的,而它们在m2
中高度相关:
cor(model.matrix(m1)[, 2], model.matrix(m1)[, 3])
## [1] 4.686464e-17
cor(model.matrix(m2)[, 2], model.matrix(m2)[, 3])
## [1] 0.9794765
因此,在原始编码中,如果speed
保留在模型中,则只能解释speed^2
的p值。由于两个回归量都是高度相关的,因此其中一个可以被丢弃。然而,在正交编码中speed^2
仅捕获未被线性项捕获的二次部分。然后很明显,线性部分是显着的,而二次部分没有其他意义。
答案 1 :(得分:1)
我相信基于raw=T
运行多项式回归的方法是,人们会根据该系数的pvalue
来查看最高幂项并评估其重要性。
如果发现不显着(大pvalue
)那么回归将在没有特定的非显着功率(即下一个较低程度)的情况下重新运行,并且这将一次一步地执行如果不重要
如果在任何时候更高的程度是重要的,那么该过程将停止并断言,该程度是合适的。