首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中操作mcmc.list对象

在R中操作mcmc.list对象
EN

Stack Overflow用户
提问于 2015-11-15 15:54:23
回答 2查看 4.3K关注 0票数 6

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

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

但是,我还没有弄清楚如何将foldD_samples的后置绘图转化为数据帧。任何帮助都很感激。

下面是mcmc.list的结构:

代码语言:javascript
复制
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"

干杯,雅各布

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-15 20:09:55

由于它是一个list结构,您可以使用这些方法中的任何一个将矩阵绑定到一起。

代码语言:javascript
复制
do.call(rbind.data.frame, foldD_samples)

代码语言:javascript
复制
rbindlist(lapply(foldD_samples, as.data.frame)) # thanks to BenBolker

A mwe

代码语言:javascript
复制
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)
票数 6
EN

Stack Overflow用户

发布于 2017-07-16 15:54:01

user20650给出的答案肯定会奏效,但它可能会非常慢。还请注意,在撰写本文时,rbind_list()代替了bind_rows()。

我为自己的目的编写的东西将mcmc.list转换为“长格式”data.frame。在我的机器上,它比上述方法快4-7倍,并增加了两列:一列用于链号,另一列用于步长编号。

代码语言:javascript
复制
parameter_names <- varnames(mcmc_list)
saved_steps <- as.integer(row.names(mcmc_list[[1]]))
out <- data.frame("chain" = factor(rep(1 : length(mcmc_list), each = length(saved_steps))),
                  "step" = rep(saved_steps, length(mcmc_list)) )
for (param in parameter_names) {
    out[param] <- NA
}
for (a_chain in 1 : length(mcmc_list)) {
    out[out$chain == a_chain, parameter_names ] <- as.data.frame(mcmc_list[[a_chain]])
}
return(out)

使用一个包含3条链的mcmc.list对象,共计50,000行,rbind_list/do.callMethod: 0.71秒平均运行时间--我的方法:0.12秒

编辑:进一步阅读库"coda“中的代码表明,as.matrix()要快得多。

代码语言:javascript
复制
parameter_names <- varnames(mcmc_list)
saved_steps <- as.integer(row.names(mcmc_list[[1]]))
out <- data.frame("chain" = factor(rep(1 : length(mcmc_list), each = length(saved_steps))),
                  "step" = rep(saved_steps, length(mcmc_list)) )
out <- cbind(out, as.data.frame(as.matrix(chain_samples)))

占用超过0.03秒的时间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33721649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档