Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 更有效地将列表组合到数据帧中_R_Apply_Lapply_Mcmc_Mapply - Fatal编程技术网

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)))