2016-11-29 3 views
-1

Ich versuche, eine Polynom-Regression in R zu tun lm mit, ich habePolynomregression in lm (2 Methoden)

Time=c(1980:2016) 
y= rnorm(length(Time)) 

I verwendet:

reg=lm(y~poly(Time,2)) 
round(reg$coefficients,3) 

die gibt:

(Intercept) poly(Time, 2)1 poly(Time, 2)2 
     -0.110   -1.298   0.172 

Und:

Time2=Time^2 
reg2=lm(y~Time+Time2) 
round(reg2$coefficients,3) 

Es gibt

(Intercept)  Time  Time2 
    1146.590  -1.128  0.000 

Wo liegt das Problem?

+0

"Wo ist das Problem?" - Ich bin geneigt, dich dasselbe zu fragen. Sie haben zwei verschiedene Modelle und zwei verschiedene Antworten bekommen. Wo ist das Problem? – joran

+0

@ZheyuanLi Time2 = Tme^2 – Math

+0

@joran Ich verwendete https://www.r-bloggers.com/fitting-polynomial-regression-in-r/ – Math

Antwort

3

Standardmäßig verwendet poly() eine orthogonale Polynom Darstellung, die numerisch stabiler ist. Sie können raw=TRUE verwenden, wenn Sie die naive Darstellung anpassen möchten.

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 

Sie werden unter anderem fest, dass der Schnittpunkt und Steigung durch die rohen Polynome beziehen sich auf die erwarteten Werte zur Zeit = 0, die, wenn Sie Zeit in CE (Common Era = AD verwenden) Jahre ist ein bisschen lächerlich.

Wenn Sie sowohl Interpretierbarkeit als auch numerische Stabilität wünschen, können Sie einen vernünftigen Kompromiss erzielen, indem Sie Ihre Zeitvariable zentrieren (das Einstellen der Zeit auf Null zu Beginn Ihrer Beobachtungszeit ist ebenfalls sinnvoll).

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