我已经使用nlme()中的package nlme拟合了模型。

现在,我希望在考虑参数不确定性的情况下模拟一些预测间隔。

为此,我需要提取固定效应的方差矩阵。

据我所知,有两种方法可以做到这一点:

vcov(fit)


summary(fit)$varFix

这两个给出相同的矩阵。

但是,如果我检查
diag(vcov(fit))^.5

它与summary(fit)中报告的标准错误不同

我期望这两个相同是错误的吗?

编辑:这是一个代码示例
require(nlme)

f=expression(exp(-a*t))
a=c(.5,1.5)
pts=seq(0,4,by=.1)

sim1=function(t) eval(f,list(a=a[1],t))+rnorm(1)*.1
y1=sapply(pts,sim1)

sim2=function(t) eval(f,list(a=a[2],t))+rnorm(1)*.1
y2=sapply(pts,sim2)

y=c(y1,y2)
t=c(pts,pts)
batch=factor(rep(1:2,82))
d=data.frame(t,y,batch)

nlmeFit=nlme(y~exp(-a*t),
  fixed=a~1,
  random=a~1|batch,
  start=c(a=1),
  data=d
  )

vcov(nlmeFit)
summary(nlmeFit)$varFix
vcov(nlmeFit)^.5
summary(nlmeFit)

最佳答案

这是由于存在偏差校正项;它记录在?summary.lme中。



如果查看nlme:::summary.lme(这也是用于生成nlme对象的摘要的方法,因为它具有c("nlme", "lme")类),您会看到:

...
stdFixed <- sqrt(diag(as.matrix(object$varFix)))
...
if (adjustSigma && object$method == "ML")
    stdFixed <- stdFixed * sqrt(object$dims$N/(object$dims$N -
        length(stdFixed)))

也就是说,标准误差由sqrt(n/(n-p))缩放,其中n是观测值的数量,而p是固定效果参数的数量。让我们检查一下:
 library(nlme)
 fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
             data = Loblolly,
             fixed = Asym + R0 + lrc ~ 1,
             random = Asym ~ 1,
             start = c(Asym = 103, R0 = -8.5, lrc = -3.3))
 summary(fm1)$tTable[,"Std.Error"]
 ##       Asym         R0        lrc
 ## 2.46169512 0.31795045 0.03427017

 nrow(Loblolly) ## 84
 sqrt(diag(vcov(fm1)))*sqrt(84/(84-3))
 ##      Asym         R0        lrc
 ## 2.46169512 0.31795045 0.03427017

我必须承认我在代码中找到了答案,然后才回过头来看看文档中是否清楚地阐明了答案...

10-03 00:18