【问题标题】:nlme fit : vcov versus summarynlme fit : vcov 与摘要
【发布时间】:2014-05-07 17:02:48
【问题描述】:

我已经使用package nlme 中的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)

【问题讨论】:

  • 如果您提供您的数据集或至少一个有代表性的样本,并展示您用于获得合适的代码,您更有可能获得帮助。
  • 我同意。但是数据集不是我的,我推断任何可能能够回答的人过去都会使用 nlme,因此可以轻松获得 nlme 拟合。由于我指出了一个通常应该与数据无关的问题,因此我希望它不会成为问题。也就是说,如果人们无法在他们自己的示例中确认两个矩阵的不相等性,那将是一个很大的暗示,表明我做错了。但是,如果您认为有帮助,我可以离开并模拟一个数据集。
  • 是的,证明您可以发布的数据存在问题很重要。
  • 已编辑帖子以模拟数据。每次运行代码块时,您都会得到两个标准差/标准误差估计的不同答案。
  • 这更容易重现:library(nlme); example(nlme); all.equal(sqrt(diag(vcov(fm2))),summary(fm2)$tTable[,"Std.Error"])

标签: r nlme


【解决方案1】:

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

adjustSigma:一个可选的逻辑值。如果“真”和估计 用于获取“对象”的方法是最大似然, 残差标准误差乘以 sqrt(nobs/(nobs - npar)),将其转换为类似 REML 的估计。这个论点 仅在将单个拟合对象传递给 功能。默认为“真”。

如果您查看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

我不得不承认我在代码中找到了答案,然后才回过头来发现它在文档中已经完全清楚地说明了......

【讨论】:

  • 太棒了!非常感谢 - 我从没想过要查看摘要文档。也许我因为懒惰而不看代码而感到内疚。我相信我已经接受并赞成您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多