R 更有效地将列表组合到数据帧中
我正在运行一个R 更有效地将列表组合到数据帧中,r,apply,lapply,mcmc,mapply,R,Apply,Lapply,Mcmc,Mapply,我正在运行一个MCMCglmm()模型的多个链,并试图找到最有效的方法来综合我的输出 我正在使用mclappy()运行4条链,然后使用lappy()将4条链中的每一条组合成一个列表 这是我的模型和代码,用于清理和组合链。我正在使用此有用的教程来运行链: 型号: library(parallel) chains <- mclapply(1:4, function(i) { MCMCglmm(outcome ~ 1 + pretest + race + satisfaction*race,
MCMCglmm()
模型的多个链,并试图找到最有效的方法来综合我的输出
我正在使用mclappy()
运行4条链,然后使用lappy()
将4条链中的每一条组合成一个列表
这是我的模型和代码,用于清理和组合链。我正在使用此有用的教程来运行链:
型号:
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)
最终,我希望运行一个lappy()
或mappy()
,并拥有一个固定的随机列表。我相信我可以使用映射(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)
list1以下方法可以吗
假设您的four\u mcmc
是类“MCMCglmm”
(chain1
,chain2
,等等)的模型列表,extract
是您希望从链中读取的元素列表(在您的例子中是固定的(“Sol”
)和随机项(“VCV”
)
然后,您只需将此函数应用于链列表:
## Applying get.element for each elements to extract on each chain
all_elements <- lapply(four_mcmc, function(mcmc, extract) get.elements(extract, mcmc), extract)
哪个更优雅,但便携性可能更低。什么是mcm.list?请提供数据示例。mcmc.list是一个表示同一链并行运行的函数。。。我无法创建输出,因为它是MCMC对象。我可以尝试一个非MCMC对象。基本上是寻找类似于lappy(链,函数(m)c(m$Sol,m$VCV))
的东西,但这是不对的。读取时,似乎处理必须是分开的。你可以让你的代码更干燥以避免重复。谢谢,冻糕。你说的干巴巴是什么意思?
## The list of mcmcs
four_mcmc <- list(chain1, chain2, chain3, chain4)
## Which elements to extract from the MCMCs
extract <- c("VCV", "Sol")
## Extracting some specific elements from a chain
get.elements <- function(extract, mcmc) {
## Extracting the element
mcmc_elements <- sapply(extract, function(extract) mcmc[which(names(mcmc) == extract)])
}
## Extracting the VCV and Sol from one chain
str(get.elements(extract, chain1))
## Applying get.element for each elements to extract on each chain
all_elements <- lapply(four_mcmc, function(mcmc, extract) get.elements(extract, mcmc), extract)
## Fixed terms table
fixed_terms <- as.data.frame(lapply(all_elements, function(X) X[[1]]))
## Random terms table
random_terms <- as.data.frame(lapply(all_elements, function(X) X[[2]]))
as.data.frame(lapply(chains, function(m) cbind(m$Sol, m$VCV)))