Передать именованный список моделей в anova.merMod - PullRequest
0 голосов
/ 18 октября 2018

Я хочу иметь возможность передавать именованный список моделей (объекты merMod) в anova () и сохранять имена моделей в выходных данных.Это особенно полезно в контексте использования mclapply () для более эффективной параллельной работы группы медленных моделей, таких как glmers.Лучшее, что я придумаю, - это использование do.call в де-именованной версии списка моделей, но это не идеально, потому что у меня могут быть модели, скажем, «mod12», «mod17» и «mod16».и эти имена моделей переводятся в «MODEL1», «MODEL2» и «MODEL3» в выходных данных.(Это может показаться тривиальным при рассмотрении одного пакета, но в течение длительного сеанса моделирования с десятками моделей это верный рецепт путаницы.)

Обратите внимание, что это не та проблема, что и Создание и вызов линейных моделей из списка , потому что я не пытаюсь сравнивать пары моделей по спискам.Это также более сложно, чем Использование lapply в списке моделей , потому что я использую anova () не унарным способом.

Вот минимальное представление:

library(lme4)

formList <- c(mod12 = angle ~ recipe + temp + (1|recipe:replicate),
              mod17 = angle ~ recipe + temperature + (1|recipe:replicate),
              mod16 = angle ~ recipe * temperature + (1|recipe:replicate))
modList <- lapply(formList, FUN=lmer, data=cake)

# Fails because modList is named so it's interpreted as arg-name:arg pairs
do.call(anova, modList)

# Suboptimal because model names aren't preserved
do.call(anova, unname(modList))

# Fails because object isn't merMod (or some other class covered by methods("anova"))
do.call(anova, list(object=modList[1], ...=modList[-1], model.names=names(modList)))

Второй do.call возвращает это:

Data: ..1
Models:
MODEL1: angle ~ recipe + temp + (1 | recipe:replicate)
MODEL2: angle ~ recipe + temperature + (1 | recipe:replicate)
MODEL3: angle ~ recipe * temperature + (1 | recipe:replicate)
       Df    AIC    BIC  logLik deviance   Chisq Chi Df Pr(>Chisq)
MODEL1  6 1708.2 1729.8 -848.08   1696.2                          
MODEL2 10 1709.6 1745.6 -844.79   1689.6  6.5755      4     0.1601
MODEL3 20 1719.0 1791.0 -839.53   1679.0 10.5304     10     0.3953

В идеале вывод должен выглядеть следующим образом:

Data: ..1
Models:
mod12: angle ~ recipe + temp + (1 | recipe:replicate)
mod17: angle ~ recipe + temperature + (1 | recipe:replicate)
mod16: angle ~ recipe * temperature + (1 | recipe:replicate)
      Df    AIC    BIC  logLik deviance   Chisq Chi Df Pr(>Chisq)
mod12  6 1708.2 1729.8 -848.08   1696.2                          
mod17 10 1709.6 1745.6 -844.79   1689.6  6.5755      4     0.1601
mod16 20 1719.0 1791.0 -839.53   1679.0 10.5304     10     0.3953

Как мне это сделать?Я более чем доволен уродливой оболочкой вокруг anova (), если это означает, что я получаю более понятный вывод.

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете передать список символов следующим образом:

with(modList,
     do.call(anova, 
             lapply(names(modList), as.name)))
#refitting model(s) with ML (instead of REML)
#Data: ..1
#Models:
#mod12: angle ~ recipe + temp + (1 | recipe:replicate)
#mod17: angle ~ recipe + temperature + (1 | recipe:replicate)
#mod16: angle ~ recipe * temperature + (1 | recipe:replicate)
#      Df    AIC    BIC  logLik deviance   Chisq Chi Df Pr(>Chisq)
#mod12  6 1708.2 1729.8 -848.08   1696.2                          
#mod17 10 1709.6 1745.6 -844.79   1689.6  6.5755      4     0.1601
#mod16 20 1719.0 1791.0 -839.53   1679.0 10.5304     10     0.3953
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...