Ответ 1
require(ggplot2)
require(nlme)
set.seed(101)
mp <-data.frame(year=1990:2010)
N <- nrow(mp)
mp <- within(mp,
{
wav <- rnorm(N)*cos(2*pi*year)+rnorm(N)*sin(2*pi*year)+5
wow <- rnorm(N)*wav+rnorm(N)*wav^3
})
m01 <- gls(wow~poly(wav,3), data=mp, correlation = corARMA(p=1))
Получите установленные значения (то же, что и m01$fitted
)
fit <- predict(m01)
Обычно мы можем использовать что-то вроде predict(...,se.fit=TRUE)
для получения доверительных интервалов для прогноза, но gls
не предоставляет эту возможность. Мы используем рецепт, подобный рецепту, показанному на http://glmm.wikidot.com/faq:
V <- vcov(m01)
X <- model.matrix(~poly(wav,3),data=mp)
se.fit <- sqrt(diag(X %*% V %*% t(X)))
Сопоставьте "кадр предсказания":
predframe <- with(mp,data.frame(year,wav,
wow=fit,lwr=fit-1.96*se.fit,upr=fit+1.96*se.fit))
Теперь построим с geom_ribbon
(p1 <- ggplot(mp, aes(year, wow))+
geom_point()+
geom_line(data=predframe)+
geom_ribbon(data=predframe,aes(ymin=lwr,ymax=upr),alpha=0.3))
Легче видеть, что мы получили правильный ответ, если мы строим против wav
, а не year
:
(p2 <- ggplot(mp, aes(wav, wow))+
geom_point()+
geom_line(data=predframe)+
geom_ribbon(data=predframe,aes(ymin=lwr,ymax=upr),alpha=0.3))
Было бы неплохо делать прогнозы с большим разрешением, но немного сложно сделать это с результатами poly()
fits - см. ?makepredictcall
.