我使用了通过rjags调用的JAGS来生成mcmc.list对象foldD_samples,其中包含大量随机节点(> 800个节点)的跟踪监视器。

现在,我想使用R来计算这些节点的相当复杂的,标量值的函数,并将输出写入mcmc对象,以便我可以使用coda总结后验并运行收敛诊断。

但是,我还无法弄清楚如何从foldD_samples提取后验数据到数据帧中。任何帮助,不胜感激。

这是mcmc.list的结构:

str(foldD_samples)
List of 3
 $ : mcmc [1:5000, 1:821] -0.667 -0.197 -0.302 -0.204 -0.394 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:821] "beta0" "beta1" "beta2" "dtau" ...
  ..- attr(*, "mcpar")= num [1:3] 4100 504000 100
 $ : mcmc [1:5000, 1:821] -0.686 -0.385 -0.53 -0.457 -0.519 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:821] "beta0" "beta1" "beta2" "dtau" ...
  ..- attr(*, "mcpar")= num [1:3] 4100 504000 100
 $ : mcmc [1:5000, 1:821] -0.492 -0.679 -0.299 -0.429 -0.421 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:821] "beta0" "beta1" "beta2" "dtau" ...
  ..- attr(*, "mcpar")= num [1:3] 4100 504000 100
 - attr(*, "class")= chr "mcmc.list"

干杯,
雅各布

最佳答案

由于它是list结构,因此可以使用这两种方法之一将矩阵绑定(bind)在一起。

do.call(rbind.data.frame, foldD_samples)

或者
rbindlist(lapply(foldD_samples, as.data.frame)) # thanks to BenBolker

威力
library(rjags)
library(coda)
library(data.table)

mod <- textConnection("model {
  A ~ dnorm(0, 1)
  B ~ dnorm(0, 1)
}")

# evaluate
mod <- jags.model(mod, n.chains = 4, n.adapt = 50000)
pos <- coda.samples(mod,  c("A", "B"),  10000)

out <- do.call(rbind.data.frame, pos)
out2 <- rbindlist(lapply(pos, as.data.frame))
all.equal(out, out2, check.attributes=FALSE)

关于r - 在R中操作mcmc.list对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33721649/

10-10 23:33