I have a list of mixed models output of lme4::lmer
which I want to pass to anova
which has the form anova(object, ...)
, so I do
models_list <- list("lmm1" = lmm1, "lmm2" = lmm2, "lmm3" = lmm3, "lmm4" = lmm4, "lmm5" = lmm5)
do.call(anova, c(models_list[[1]], models_list[-1]))
Warning in anova.merMod(new("lmerMod", resp = new("lmerResp", .xData = <environment>), :
failed to find model names, assigning generic names
I get the result, but with the generic names remarked by the warning, so the same result as if models_list
was not named. I asked also on github (https://github.com/lme4/lme4/issues/612), but using do.call
seems that I won't be able to solve this issue. Is there some other way?
Reproducible example
library(lme4)
fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
fm2 <- lmer(Reaction ~ Days + (Days || Subject), sleepstudy)
anova(fm1,fm2)
refitting model(s) with ML (instead of REML)
Data: sleepstudy
Models:
fm2: Reaction ~ Days + ((1 | Subject) + (0 + Days | Subject))
fm1: Reaction ~ Days + (Days | Subject)
npar AIC BIC logLik deviance Chisq Df Pr(>Chisq)
fm2 5 1762.0 1778.0 -876.00 1752.0
fm1 6 1763.9 1783.1 -875.97 1751.9 0.0639 1 0.8004
# so I can see fm2 and fm2, to which model corresponds each line, but
models_list <- list("fm1" = fm1, "fm2" = fm2)
do.call(anova, c(lmaux[[1]], lmaux[-1]))
Warning in anova.merMod(new("lmerMod", resp = new("lmerResp", .xData = <environment>), :
failed to find model names, assigning generic names
refitting model(s) with ML (instead of REML)
Data: sleepstudy
Models:
MODEL2: Reaction ~ Days + ((1 | Subject) + (0 + Days | Subject))
MODEL1: Reaction ~ Days + (Days | Subject)
npar AIC BIC logLik deviance Chisq Df Pr(>Chisq)
MODEL2 5 1762.0 1778.0 -876.00 1752.0
MODEL1 6 1763.9 1783.1 -875.97 1751.9 0.0639 1 0.8004
so the model names fm1
, fm2
were replaced with MODEL2
, MODEL1
;
this is a problem if the model names are given by changing (possibly non-consecutive) numbers.
I have checked possible questions of which these would be a kind of duplicate, as
- How to pass a list to a function in R?
- Pass partial list of arguments to do.call()
- How to pass extra argument to the function argument of do.call in R
but have not found any satisfactory answer.
Thank you!
anova.merMod
uses non-standard evaluation (NSE) to get the model names. As is often the case, NSE is more trouble than it's worth. Here is a solution:The solution creates a call. That is done with the
call
function as usual. However, here we need to pass the (quoted) arguments as a list usingdo.call
. We then evaluate this call within the list of models.I would try to avoid having this in production code because it's quite complex and therefore difficult to maintain.