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
"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
@ZheyuanLi Time2 = Tme^2 – Math
@joran Ich verwendete https://www.r-bloggers.com/fitting-polynomial-regression-in-r/ – Math