Параллельное зацикливание на нескольких списках lme4 - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь запустить многоуровневые модели по ряду переменных. У меня есть два списка переменных - результат и ответ. С чем я сталкиваюсь, так это с установкой команды lapply для параллельного запуска каждого элемента списка. Таким образом, первый элемент списка «результат» запускается одновременно с первым элементом списка «ответ». Затем для второго элемента списка «результат» вызывается второй элемент списка «ответ».

Мне удалось объединить 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)

Хотя для получения правильной комбинации не так много работы, я также планирую провести этот анализ для ряда стран, поэтому эта проблема будет продолжать расти после добавления дополнительных уровней.

Любая помощь будет очень ценится

1 Ответ

1 голос
/ 24 октября 2019

Если я правильно понимаю, вы хотите четыре модели и запускать их параллельно? Часть формулы проста:

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)

Обратите внимание, что это относится только к системам на основе Linux, которые могут использовать FORK. В противном случае, если на Windows, вы должны использовать PSOCK. см. здесь для более подробного обзора параллельной задержки в R.

...