Несколько раз запустить модель с помощью цикла for, переименовать ее и добавить в список - PullRequest
0 голосов
/ 20 сентября 2018

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

  1. изменить название каждой модели с помощью строки assign(paste0("mod_match_logit", i), mod) и
  2. Затем добавить каждую модель в список с помощью строки list.append(lis, eval(paste0("mod_match_logit", i)))

library(MatchIt)
library(rlist)

lis = list()
for (i in 1:12){
  mod = matchit(f.build("var_1", df_cov), method = "nearest", distance = "logit", data = df_no_na, caliper = caliper_val, ratio = 2)
  assign(paste0("mod_match_logit", i), mod)
  list.append(lis, eval(paste0("mod_match_logit", i)))
  print(i)
}
lis

Однако из этой команды не выводится

Примечание. Я мог бы запустить логистическую регрессию несколько раз вместо алгоритма сопоставления (т. Е. Заменить строку mod = matchit(f.build("var_1", df_cov), method = "nearest", distance = "logit", data = df_no_na, caliper = caliper_val, ratio = 2) с mod = glm(f.build("var_1", df_cov), data = df_no_na). Но в случае glm это статистически неинтересно, поскольку каждый раз будет создаваться одна и та же модель, тогда как модель, созданная с помощью Matchit, будет немного отличаться каждый раз.

1 Ответ

0 голосов
/ 20 сентября 2018

Рассмотрим lapply, похожий на for как цикл, но возвращает объект списка с равной длиной для его ввода здесь 1:12.Нет необходимости инициализировать пустой список и затем заполнять его, использовать assign для сохранения отдельных именованных объектов или пытаться динамически ссылаться на объекты с помощью eval(paste0(...)):

lis <- lapply(1:12, function(i)
              matchit(f.build("var_1", df_cov), method = "nearest", distance = "logit", 
                      data = df_no_na, caliper = caliper_val, ratio = 2)
       )

Даже добавлять имена соответственно:

names(lis) <- paste0("mod_match_logit", 1:12)

lis$mod_match_logit1
lis$mod_match_logit2
lis$mod_match_logit3
...
...