在 R 中操作 mcmc.list 对象
Manipulating mcmc.list object in R
我使用通过 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
结构,您可以使用这些方法中的任何一种将矩阵绑定在一起。
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)
user20650 给出的答案肯定可以,但可能会很慢。另请注意,在撰写本文时,不推荐使用 rbind_list() 来代替 bind_rows()。
我为自己的目的而写的东西将 mcmc.list 转换为 "long format" data.frame。在我的机器上,它比上述方法快 4-7 倍,并添加了两列:一列用于链号,一列用于步数。
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.调用方法:平均耗时 0.71 秒
我的方法:平均耗时 0.12 秒
编辑:进一步阅读库 "coda" 中的代码表明 as.matrix() 快得多。
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 秒。
我使用通过 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
结构,您可以使用这些方法中的任何一种将矩阵绑定在一起。
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)
user20650 给出的答案肯定可以,但可能会很慢。另请注意,在撰写本文时,不推荐使用 rbind_list() 来代替 bind_rows()。
我为自己的目的而写的东西将 mcmc.list 转换为 "long format" data.frame。在我的机器上,它比上述方法快 4-7 倍,并添加了两列:一列用于链号,一列用于步数。
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.调用方法:平均耗时 0.71 秒 我的方法:平均耗时 0.12 秒
编辑:进一步阅读库 "coda" 中的代码表明 as.matrix() 快得多。
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 秒。