lm中的多项式回归(2种方法)

时间:2016-11-29 16:57:17

标签: r lm

我正在尝试使用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 

问题出在哪里?

1 个答案:

答案 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