并行循环多个列表 lme4

Parallel looping over multiple lists lme4

我正在尝试 运行 多个变量的多级模型。我有两个变量列表——结果和响应。我遇到的困难是将 lapply 命令并行设置为 运行 列表的每个元素。因此列表的第一个元素 "outcome" 运行 与列表的第一个元素 "response" 同时存在。然后对于列表的第二个元素"outcome",调用列表的第二个元素"response"。

我已经能够组合 2 个 lapply 命令,但这给了我结果和响应列表中每个元素的每个组合,这并不理想。我可以手动提取我想要的元素,但还有另一种方法可以实现吗?

#Define random intercept
random_intercepts <- "(1|clusters)"

#For each of the 4 outcome variables, define the response variables
water_imp_vars <- c("fish_factor", "num_childrenunder5", "quintile_nowashnomat_fac")
less5_vars <- c("fish_factor", "num_hh_members", "num_childrenunder5")
san_imp_vars <- c("fish_factor", "num_hh_members", "num_childrenunder5", "quintile_nowashnomat_fac")
housing_imp_vars <- c("fish_factor","num_hh_members", "num_childrenunder5", "quintile_nowashnomat_fac")

#Combine all repsonse variables into 1 list
all_response <- list(water_imp_vars, less5_vars, san_imp_vars, housing_imp_vars)

#List of outcomes 
outcomes <- c("water_imp", "less_than_5", "san_imp", "housing_imp")


all_models <- lapply(setNames(outcomes, outcomes), function(var) {
  lapply(all_response, function(var2) {
    fixed <- paste0(var2, collapse= "+")
    formula <- as.formula(paste(var, "~", fixed, "+", random_intercepts))
    glmer(formula, hr_analysis_dataset, family='binomial', nAGQ = 0)
  })
})

这是 all_models 变量的一些输出。

$water_imp
$water_imp[[1]]
water_imp ~ fish_factor + num_childrenunder5 + quintile_nowashnomat_fac + 
    (1 | clusters)
<environment: 0x0000000017ecdd58>

$water_imp[[2]]
water_imp ~ fish_factor + num_hh_members + num_childrenunder5 + 
    (1 | clusters)
<environment: 0x0000000017ed1858>

$water_imp[[3]]
water_imp ~ fish_factor + num_hh_members + num_childrenunder5 + 
    quintile_nowashnomat_fac + (1 | clusters)
<environment: 0x0000000017ed5f20>

$water_imp[[4]]
water_imp ~ fish_factor + num_hh_members + num_childrenunder5 + 
    quintile_nowashnomat_fac + (1 | clusters)
<environment: 0x0000000017ed86a0>

我只对第一个结果变量的第一个组合感兴趣 --

water_imp ~ fish_factor + num_childrenunder5 + quintile_nowashnomat_fac + 
    (1 | clusters)

然后对于第二个结果变量,我对第二个组合感兴趣

less_than_5 ~ fish_factor + num_hh_members + num_childrenunder5 + 
    (1 | clusters)

虽然提取正确组合的工作量不大,但我还计划 运行 对多个国家/地区进行此分析,因此一旦添加额外级别,此问题将继续增长。

非常感谢任何帮助

如果我没理解错的话,你想要四个模型并运行它们并行?公式部分很简单:

results <- lapply(1:4, function(i){
  fixed <- paste0(unlist(all_response[i]), collapse= " + ")
  formula <- as.formula(paste(outcomes[i], "~", fixed, "+", random_intercepts))
  print(formula)
  glmer(formula, hr_analysis_dataset, family='binomial', nAGQ = 0)
})

但这些不会 运行 并行。为此,您需要使用并行 lapply 函数,例如:

library(parallel)
# Calculate the number of cores
no_cores <- detectCores() - 1

# Initiate cluster
cl <- makeCluster(no_cores, type="FORK")

results <- parLapply(cl, 1:4, function(i){
  fixed <- paste0(unlist(all_response[i]), collapse= " + ")
  formula <- as.formula(paste(outcomes[i], "~", fixed, "+", random_intercepts))
  print(formula)
  glmer(formula, hr_analysis_dataset, family='binomial', nAGQ = 0)
})

stopCluster(cl)

请注意,这仅适用于可以使用 FORK 的基于 linux 的系统。否则,如果在 windows 上,则必须使用 PSOCK。有关 R 中并行 lapply 的更详细概述,请参阅 here