【发布时间】:2018-02-18 21:40:03
【问题描述】:
我正在运行MCMCglmm() 模型的多个链,我正在尝试找到最有效的方法来合成我的输出。
我正在使用mclapply() 运行 4 条链,然后将 4 条链中的每条链与lapply() 组合成一个列表。
这是我清理和组合链的模型和代码。我正在使用这个有用的教程来运行链:https://github.com/tmalsburg/MCMCglmm-intro
型号:
library(parallel)
chains <- mclapply(1:4, function(i) {
MCMCglmm(outcome ~ 1 + pretest + race + satisfaction*race, data = data,
random = ~ provider,
prior = prior.1,
verbose = TRUE,
family = "gaussian",
nitt = 10000,
burnin = 5000,
thin = 10)
}, mc.cores=4)
我的清理工作有点笨拙。有没有办法在固定和随机效果上运行lapply 命令(或者我认为需要的是mapply)以将它们组合到同一个列表和后续数据帧中?最后,我希望有一个数据框,这样我就可以添加/减去后验分布并对其进行汇总统计。
fixed <- lapply(chains, function(m) m$Sol) # Sol = fixed effects
fixed <- do.call(mcmc.list, fixed)
summary(fixed)
random <- lapply(chains, function(m) m$VCV) # VCV = variance
random <- do.call(mcmc.list, random)
summary(random)
fixed_df <- do.call(rbind, Map(data.frame, fixed))
random_df <- do.call(rbind, Map(data.frame, random))
chains_df <- cbind(fixed_df, random_df)
最终,我希望运行一个 lapply() 或 mapply() 并拥有一个固定的随机列表。我相信我可以使用Map(data.frame, fixed.random) 来创建我的数据框。我对 apply 函数的了解是有限的,所以我希望了解更多并将它(不是双关语)应用到我的数据集。
不幸的是,模型输出 MCMC 对象,所以我无法创建确切的结构。这是我能想到的最好的:
list1 <- list(a = rnorm(100, 0, 1), b = rnorm(100, 0, 1))
list2 <- list(a = rnorm(100, 0, 1), b = rnorm(100, 0, 1))
list3 <- list(a = rnorm(100, 0, 1), b = rnorm(100, 0, 1))
list4 <- list(a = rnorm(100, 0, 1), b = rnorm(100, 0, 1))
list5 <- list(d = rnorm(100, 0, 1), e = rnorm(100, 0, 1))
list6 <- list(d = rnorm(100, 0, 1), e = rnorm(100, 0, 1))
list7 <- list(d = rnorm(100, 0, 1), e = rnorm(100, 0, 1))
list8 <- list(d = rnorm(100, 0, 1), e = rnorm(100, 0, 1))
fixed <- list(list1, list2, list3, list4)
random <- list(list5, list6, list7, list8)
【问题讨论】:
-
什么是mcm.list?请提供reproducible example的数据样本。
-
mcmc.list 是一个代表同一链并行运行的函数......我无法创建输出,因为它是一个 MCMC 对象。我可以试试非 MCMC 对象。
-
基本上是在寻找类似
lapply(chains, function(m) c(m$Sol, m$VCV))的东西,但这是不对的。 -
阅读mcmc.list docs,看来处理必须分开。您可以使您的代码干燥以避免重复。
-
谢谢,冻糕。 DRY-er 是什么意思?
标签: r apply lapply mcmc mapply