我使用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)
答案 0 :(得分:4)
这是由于偏差修正术语;它记录在?summary.lme
中。
adjustSigma:可选的逻辑值。如果'TRUE'和估计 用于获得'对象'的方法是最大可能性, 剩余标准误差乘以sqrt(nobs /(nobs - npar)),将其转换为类似REML的估计。这个论点 仅在将单个拟合物体传递给的时使用 功能。默认为“TRUE”。
如果您查看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
我必须承认我在代码中找到了答案,然后回过头来看看它在文档中已经完全清楚地说明了......