2014-05-07 53 views
6

我已经安装了package nlmenlme()模型。nlme fit:vcov与汇总

现在我想模拟一些预测区间,考虑到参数的不确定性。

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

据我所知,这样做有两种方式:

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

你更可能如果您提供您的数据集或至少一个有代表性的样本,并显示您用来找到合适的代码,请获得帮助。 – jlhoward

+0

我同意。但数据集不是我的,我推断任何可能能够回答的人都会在过去使用nlme,因此nlme适合随时可用。既然我指出了一个普遍应该是数据独立的问题,我希望它不会成为一个问题。也就是说,如果人们不能证实他们自己的例子中的两个矩阵的不平等,这将是一个非常大的暗示,我做错了什么。 但是我可以走开并模拟一个数据集,如果你认为这将有所帮助。 –

+1

是的,证明您可以发布数据的问题非常重要。 – jlhoward

回答

4

这是由于偏置校正项;它记录在?summary.lme

adjustSigma:一个可选的逻辑值。如果'TRUE'和用于获得'object'的估计方法具有最大可能性,则残差标准误差乘以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 

我不得不承认,我找到了答案的代码,然后才回头看,这是完全清楚的文件中指出...

+0

太棒了!非常感谢 - 我从来没有想过要查看摘要文档。也许我在懒惰中不看代码。我相信我已经接受并赞成你的回答。 –