使用 mcmcsamp 函数对方差进行后验模拟

机器算法验证 r 贝叶斯 混合模式
2022-04-06 10:52:13

我想使用 mcmcsamp() 函数获得 lmer() 模型的方差分量的后验模拟。怎么做 ?

例如,下面是 lmer() 拟合的结果:

> fit
Linear mixed model fit by REML
Formula: y ~ 1 + (1 | Part) + (1 | Operator) + (1 | Part:Operator)
   Data: dat
   AIC   BIC logLik deviance REMLdev
 97.55 103.6 -43.78    89.18   87.55
Random effects:
 Groups        Name        Variance Std.Dev.
 Part:Operator (Intercept) 2.25724  1.50241
 Part          (Intercept) 3.30398  1.81769
 Operator      (Intercept) 0.00000  0.00000
 Residual                  0.42305  0.65043
Number of obs: 25, groups: Part:Operator, 15; Part, 5; Operator, 3

现在我运行 mcmcsamp() :

> mm <- mcmcsamp(fit, n=15000) 

我希望剩余方差的模拟存储在“sigma”节点中,但这似乎不符合 lmer() 的结果:

> sigmasims <- mm@sigma[1,-(1:5000)]  # discard first 5000 simulations (burn-in)
> summary(sigmasims)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
 0.8647  1.4960  1.7040  1.7460  1.9480  3.7920 

同样,我希望其他方差分量的模拟存储在“ST”节点中,但我得到了类似的观察结果。

1个回答

简短的(ish)答案是

as.data.frame(mm,type="varcov")

应该以数据框的形式提取固定效应以及随机效应和残差方差的链。

例如:

library(lme4.0) ## I am using the r-forge version
fm2 <- lmer(Reaction ~ Days + (1|Subject) + 
    (0+Days|Subject), sleepstudy)
mm <- mcmcsamp(fm2,1000)
dd <- as.data.frame(mm,type="varcov")
burnin <- 100  ## probably unnecessary
summary(dd[-(1:burnin),])

不幸的是,这个向量没有得到方差分量的有用名称。您可以使用

vnames <- c(names(getME(fm2,"theta")),"sigma^2")
names(dd)[3:5] <- vnames

解决这个问题(而不是在最后一步中对位置进行硬编码,你可以用 做一些事情-1:(length(fixef(fm2)))

这个答案的另一部分是我对mcmcsamp链的行为有一些严重的怀疑/问题,但我会在列表之外对应:关于我的困惑的部分/初步(可能是错误的!)讨论发布在http: //www.math.mcmaster.ca/~bolker/R/misc/mcmcsampex.pdf