我想为配备gls的车型创建一个信心带,如下所示:

require(ggplot2)
require(nlme)

mp <-data.frame(year=c(1990:2010))

mp$wav <- rnorm(nrow(mp))*cos(2*pi*mp$year)+2*sin(rnorm(nrow(mp)*pi*mp$wav))+5
mp$wow <- rnorm(nrow(mp))*mp$wav+rnorm(nrow(mp))*mp$wav^3

m01 <- gls(wow~poly(wav,3), data=mp, correlation = corARMA(p=1))

mp$fit <- as.numeric(fitted(m01))

p <- ggplot(mp, aes(year, wow))+ geom_point()+ geom_line(aes(year,fit))
p

这只会绘制拟合值和数据,我想用

p <- ggplot(mp, aes(year, wow))+ geom_point()+ geom_smooth()
p

但是用gls模型产生的谱带.

谢谢

推荐答案

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))

年份vs wow

如果我们以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))

wav vs wow

用更高的分辨率进行预测是很好的,但用poly()次拟合的结果进行预测有点棘手——参见?makepredictcall.

R相关问答推荐

在ggplot Likert条中添加水平线

从有序数据中随机抽样

ggplot的轴标签保存在officer中时被剪切

修改用R编写的用户定义函数

错误:非常长的R行中出现意外符号

如何在Chart_Series()中更改轴值的 colored颜色 ?

如何读取CSV的特定列时,给定标题作为向量

使用范围和单个数字将数字与字符串进行比较

Ggplot2中geom_tile的动态zoom

具有重复元素的维恩图

停止ggplot将多行减少到一行

自动STAT_SUMMARY统计与手动标准误差之间的差异

优化从每个面的栅格中提取值

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

数值型数据与字符混合时如何进行绑定

如何预测原始数据集并将值添加到原始数据集中

整理ggmosaic图的标签

如何在R中创建这些列?

将数据从一列转换为按组累计计数的单个虚拟变量

使用grepl过滤特定列范围内的列名