在merMod对象的bootstrap_parameters/model中使用“snow”并行操作(R)

3
我一直在使用R中的parameters包中的bootstrap_parameters函数来处理由glmmTMB生成的广义线性混合模型。这些模型在未开启并行处理(parallel="no")时可以正常工作,在我的旧Mac上开启“multicore”方式的并行处理也能正常工作。现在我正在一台新的Windows电脑上工作,需要使用parallel="snow"来进行并行处理,但是我遇到了以下错误:
system.time(b <- bootstrap_parameters(m1, iterations = 10, parallel = "snow", n_cpus = 6)) Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 1 In addition: Warning message: In lme4::bootMer(model, boot_function, nsim = iterations, verbose = FALSE, : some bootstrap runs failed (10/10) Timing stopped at: 0.89 0.3 7.11
如果我选择n_cpus=1,则函数可以正常工作;如果我将bootstrap_parameters或bootstrap_model应用于lm对象(其中基础代码使用boot::boot),它也可以正常工作。我已经将问题缩小到了bootMer(lme4)。我怀疑使用clusterExport导出的数据集落入了与聚类bootMer函数所查找的环境不同的环境中。以下是一个可重复的示例。
library(glmmTMB)
library(parameters)
library(parallel)
library(lme4)

m1 <- glmmTMB(count ~ mined + (1|site), zi=~mined,
              family=poisson, data=Salamanders)
summary(m1)

cl <- makeCluster(6)
clusterEvalQ(cl, library("lme4"))
clusterExport(cl, varlist = c("Salamanders"))

system.time(b <- bootstrap_parameters(m1, iterations = 10, parallel = "snow", n_cpus = 6))

stopCluster(cl)

有没有解决这个问题的想法?

这很可能是一个bug,但它会很棘手,因为它似乎并没有直接影响bootMer:例如,bootMer(m1, FUN = \(x)fixef(x)$cond, nsim =5, cl = cl)对我来说是有效的。 - Ben Bolker
嗨Ben, 谢谢你回复我。我运行了你的bootMer代码,它可以正常工作,但是当我添加了参数parallel = "snow"时,它就出问题了。我认为bootMer可能有一个bug。 system.time(c <- bootMer(m1, FUN = \(x)fixef(x)$cond, nsim =24, ncpus = 6, cl = cl, parallel = "snow"))
user system elapsed 0.09 0.02 0.14 警告信息: In bootMer(m1, FUN = function(x) fixef(x)$cond, nsim = 24, ncpus = 6, : some bootstrap runs failed (24/24)
- plants-22
1个回答

0
你需要执行clusterEvalQ(cl, library("glmmTMB"))。来自https://github.com/glmmTMB/glmmTMB/issues/843

这个问题基本上通过文档修补解决了(我们需要明确地执行clusterEvalQ(cl, library("glmmTMB")))。唯一的问题是我们是否能够让用户更容易地操作。这里有两个问题:(1)当用户自己设置集群而不是在bootMer中完成时,无论如何都需要更明确的clusterEvalQ/clusterExport操作;(2)如果bootMer正在设置集群(而不是用户设置并传递给bootMer),它会在内部执行parallel::clusterExport(cl, varlist=getNamespaceExports("lme4")),但我们不希望它对glmmTMB也做同样的操作...

例如,以下所有操作都有效:

library(glmmTMB)
library(parameters)
library(parallel)
library(lme4)

m1 <- glmmTMB(count ~ mined + (1|site), zi=~mined,
              family=poisson, data=Salamanders)
summary(m1)

par_cores <- max(1, floor(detectCores()/2))
par_cluster <- makeCluster(rep("localhost", par_cores), outfile = "log.txt")

clusterEvalQ(par_cluster, library("lme4"))
clusterExport(par_cluster, varlist = c("Salamanders"))

system.time(b <- bootstrap_parameters(m1, iterations = 10, cluster = par_cluster))

system.time(b2 <- bootMer(m1,
                          FUN = function(x)fixef(x)$cond,
                          nsim = 10, cl = par_cluster))
stopCluster(par_cluster)

我遇到了同样的问题,但不幸的是你的建议没有帮助。我尝试过clusterEvalQ(cl, library("glmmTMB"))clusterEvalQ(cl, library(glmmTMB))clusterEvalQ(cl, {library(lme4); library(glmmTMB)}),但它们都不起作用。OP已经正确地缩小了问题范围,即parallel = "snow"ncpus > 1是问题所在。值得重新打开这个问题吗?注意:我创建集群的步骤略有不同:par_cores <- max(1, floor(detectCores()/2)) par_cluster <- makeCluster(rep("localhost", par_cores), outfile = "log.txt")其中par_cluster对应于cl - Karthik Thrikkadeeri
你是在使用 bootstrap_model 还是 bootMer?当你使用 clusterEvalQ 时,第一个参数是不是用的 par_cluster 而不是 cl - Ben Bolker
请查看修改。如果这些对您没有帮助,请发布一个新的问题(链接到此问题)。 - Ben Bolker
谢谢,Ben,但这对我没有起作用。我在这里发了一个新问题。 - Karthik Thrikkadeeri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接