R中的并行BMA

时间:2019-01-18 10:24:37

标签: r parallel-processing bayesian

我正在使用贝叶斯模型平均估计一些模型。我想并行化该过程,所以我尝试:

library(BMA)
library(parallel)

no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)

bma_resp <- function(i) { 

  bma1 <- bicreg(
  x.quest,
  y.quest,
  wt = rep(1, length(y.quest)),
  strict = FALSE,
  OR = 20,
  maxCol = 31,
  drop.factor.levels = FALSE,
  nbest = 70
)
  return(bma1)
}
final <- mclapply(1, bma_resp)

这样做我根本没有结果。我在Ubuntu上使用具有8个内核和64GB RAM的64位R。

谢谢。

1 个答案:

答案 0 :(得分:2)

对于这样的任务,我更喜欢foreach库。您可以像下面这样使用它。由于我没有任何数据,因此我使用文档中的样本数据,尽管由于无法进行迭代,所以总是得到相同的结果。但是您可以轻松检查它是否可以并行运行。

library(foreach)
library(parallel)
library(doParallel)
library(MASS) #just used for the UScrime data from documentation of BMA

data(UScrime)
registerDoParallel(**number of cores you want to use**)

bma_dat <- foreach(i=1:60)%dopar%{
  library(BMA)
  x.quest <- UScrime[,-16]
  y.quest <- UScrime[,16]
  bma1 <- bicreg(
                 x.quest,
                 y.quest,
                 wt = rep(1, length(y.quest)),
                 strict = FALSE,
                 OR = 20,
                 maxCol = 31,
                 drop.factor.levels = FALSE,
                 nbest = 70
                 )
  return(bma1)
}

输出是一个嵌套列表,您可以单独处理

有关更多信息,请查看foreach的documentation

然后对数据(x.quest/y.quest)的不同迭代步骤使用i,然后将循环结束更改为所需的迭代次数。您可以使用length(df)或类似的方法轻松地做到这一点。