R - 来自nlme的预测的标准误差

时间:2013-05-12 15:13:23

标签: r prediction mixed-models nonlinear-functions nlme

这个问题建立在Extract prediction band from lme fit的基础上,但是采用非线性混合模型。

我有一个响应值的数据集,按“条目”分组。我使用AIC模型选择程序来测试哪种类型的模型(线性,对数,指数等)最能代表响应和预测器之间的关系。现在我想绘制每个条目中数据的拟合值,然后跨条目绘制。我还想在整体趋势上绘制随附的信心带 - 请参阅Ben Bolker的博客和上面的帖子提供的代码(我理解这是解释的一些finesse,但这是另一篇文章)。后者是我遇到问题的地方 - 请参阅此示例代码:

#Load nlme
library(nlme)

#Create data frame
set.seed(6)
df=data.frame(y=c(1:5+runif(5,0,1),21:25+runif(5,1,5)),
              x=rep(1:5,2),entry=rep(letters[1:2],each=5))

#Group data by entry
df=groupedData(y~x|entry,data=df)

#Build model
mod=nlme(y~a+b*x,fixed=a+b~1,random=~a+b~1,start=c(a=1,b=1),data=df)

#Create data frame for predictions
pred=do.call(rbind,lapply(rownames(coef(mod)),function(i) {
  data.frame(x=seq(0.1,max(df[df$entry==i,"x"]),0.1),entry=i) } ) )
#Grab coefficients from model for a and b
a=coef(mod)[match(pred$entry,rownames(coef(mod))),1]
b=coef(mod)[match(pred$entry,rownames(coef(mod))),2]
#Grab fixed coefficients for overall trend and fitted values for individual entries using a and b above
pred$fixed=fixef(mod)[1]+fixef(mod)[2]*pred$x 
pred$fitted=a+pred$x*b

#Get SEs on predictions using code from Ben Bolker's website
predvar=diag(as.matrix(data.frame(a,b)) %*% vcov(mod)%*% t(as.matrix(data.frame(a,b))))
pred$fixed.SE=sqrt(predvar)
pred$fixed.SE2=sqrt(predvar+mod$sigma^2)

#Plot
ggplot()+geom_point(data=df,aes(x=x,y=y),col="grey50",alpha=0.5)+
  geom_line(data=subset(pred,max(df$x)>x & x>1),aes(x=x,y=fitted,group=entry),col="grey50")+
  geom_ribbon(data=subset(pred,max(df$x)>x & x>1),aes(x=x,ymin=fixed-2*fixed.SE,ymax=fixed+2*fixed.SE),alpha=0.5,fill="grey10")+
  geom_ribbon(data=subset(pred,max(df$x)>x & x>1),aes(x=x,ymin=fixed-2*fixed.SE2,ymax=fixed+2*fixed.SE2),alpha=0.3,fill="grey50")+
  geom_line(data=subset(pred,max(df$x)>x & x>1),aes(x=x,y=fixed),col="black",lwd=1.1)

结果情节看起来像这样,信心带来回反复:

enter image description here

我怀疑我在沿线的某个地方出错了(也许是在矩阵乘法中?)。任何帮助表示赞赏,包括有关这是否是一个好主意的建议!

0 个答案:

没有答案