我正在尝试使用lm
在R中进行多项式回归,我有
Time=c(1980:2016)
y= rnorm(length(Time))
我用过:
reg=lm(y~poly(Time,2))
round(reg$coefficients,3)
给出:
(Intercept) poly(Time, 2)1 poly(Time, 2)2
-0.110 -1.298 0.172
并且:
Time2=Time^2
reg2=lm(y~Time+Time2)
round(reg2$coefficients,3)
它给出了
(Intercept) Time Time2
1146.590 -1.128 0.000
问题出在哪里?
答案 0 :(得分:3)
默认情况下,poly()
使用正交多项式表示,它在数值上更稳定。如果您想匹配天真的表示,可以使用raw=TRUE
。
set.seed(101)
dd <- data.frame(Time=c(1980:2016),
y=rnorm(2016-1980+1))
(c1 <- coef(lm(y~Time+I(Time^2),dd)))
## (Intercept) Time I(Time^2)
## 6.684138e+03 -6.686392e+00 1.672101e-03
(c2 <- coef(lm(y~poly(Time,2),dd)))
## (Intercept) poly(Time, 2)1 poly(Time, 2)2
## -0.04713527 -0.30359154 1.03594479
c3 <- coef(lm(y~poly(Time,2,raw=TRUE),dd))
all.equal(unname(c1),unname(c3)) ## TRUE
除了其他事项之外,您还会注意到原始多项式给出的截距和斜率是指时间= 0 时的期望值,如果您在CE中使用时间(Common Era = AD)岁月有点荒谬。
如果您想要可解释性和数值稳定性,您可以通过将时间变量居中(在观察期开始时将时间设置为零)得到合理的折衷。
dd$cTime <- dd$Time-mean(dd$Time)
c4 <- coef(lm(y~poly(cTime,2,raw=TRUE),dd))
unname(c4)
## [1] -0.237754839 -0.004674513 0.001672101