我在尝试使用一些内置并行化运行lme4::allFit()
时遇到了一个令人困惑的错误。我拟合了一个初始模型m0
,它使用更大的数据帧ckDF
(n = 265,623 行(来模拟逻辑框架中对许多分类和连续预测变量的二元响应,并随机截距一年。
我有兴趣确定不同的优化器是否产生不同的结果,遵循我在网上找到的一些建议(例如,通过@BenBolker这里(。我的数据相当大,通常需要 ~20 分钟才能运行,所以我希望使用allFit()
的parallel
和ncpus
参数来加快速度。这是我的相关代码:
require(lme4)
require(parallel)
m0 <- glmer(returned ~ 1 + barge + site + barge:site +
(run + rearType + basin)^2 +
(tdg + temp + holdingTime)^2 +
(1|year),
data = ckDF, family = 'binomial',
control = glmerControl(optimizer='bobyqa',
optCtrl = list(maxfun = 1e5)))
af1 <- allFit(m0, parallel = 'multicore', ncpus = detectCores())
执行此操作后,我遇到以下错误:
检查远程错误(val(中的错误: 7个节点产生错误;第一个错误:没有适用于"isGLMM"的方法应用于类"list"的对象
有什么想法吗?在我看来,当它构造一堆节点时,不知何故其中一些节点不会导入lme4
包,因此无法识别isGLMM()
;但我不知道allFit()
为什么要这样做,因为它来自lme4()
.我尝试查看引擎盖并更改我自己的allFit()
包的功能,但遇到了其他错误。
任何帮助将不胜感激。R 版本: 3.6.1;lme4 版本: 1.1-21;平台: 视窗 10 64 位
感谢 @user20650 & @Ben Bolker 在上面的评论中提供的提示——它有效,我能够让allFit()
按预期运行,通过确保我在函数调用中使用parallel = "snow"
,因为我在 Windows 中运行。只需在此处发布编辑后的代码,供其他发现有用的人使用:
require(lme4); require(snow)
# Define initial model (switched to defaults here)
m0 <- glmer(returned ~ 1 + barge + site + barge:site +
(run + rearType + basin)^2 +
(tdg + temp + holdingTime)^2 +
(1|year),
data = ckDF, family = 'binomial')
# Set up cluster for running allFit()
optCls <- makeCluster(detectCores()-1, type = "SOCK")
clusterEvalQ(optCls,library("lme4"))
clusterExport(optCls, "ckDF")
# Use allFit() to look at differences in optimizers
system.time(af1 <- allFit(m0, parallel = 'snow',
ncpus = detectCores()-1, cl=optCls))
stopCluster(optCls)
最终在我的机器上使用 40 个内核需要 ~11 分钟。