R'deki bir işlevin (özellikle "anova") nokta ("…") bağımsız değişkenine adlandırılmış bir liste nasıl iletilir? ("do.call" için alternatifler)
Formunun çıktısını almak lme4::lmer
istediğim karma modellerin bir listesi var , bu yüzden varanova
anova(object, ...)
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
Sonucu alıyorum, ancak uyarıda belirtilen jenerik isimlerle, yani models_list
adlandırılmamış gibi aynı sonuç . Github'da da sordum (https://github.com/lme4/lme4/issues/612), ancak kullanmak do.call
bu sorunu çözemeyeceğim gibi görünüyor. Başka bir yolu var mı?
Tekrarlanabilir örnek
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
model isimleri nedenle fm1
, fm2
ile ikame edilmiştir MODEL2
, MODEL1
; Model adları sayıları değiştirerek (muhtemelen ardışık olmayan) veriliyorsa bu bir sorundur.
Bunların bir tür kopyası olabilecek olası soruları kontrol ettim.
- R'deki bir işleve bir liste nasıl aktarılır?
- Do.call () için argümanların kısmi listesini iletin
- R'deki do.call işlev bağımsız değişkenine fazladan bağımsız değişken nasıl iletilir
ancak tatmin edici bir cevap bulamadım.
Teşekkür ederim!
Yanıtlar
anova.merMod
model adlarını almak için standart dışı değerlendirme (NSE) kullanır. Çoğu zaman olduğu gibi, NSE değerinden daha fazla sorundur. İşte bir çözüm:
eval(
do.call(
call,
c(list("anova"),
lapply(names(models_list), as.symbol)),
quote = TRUE),
models_list)
#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
Çözüm bir çağrı yaratır. Bu, call
her zamanki gibi işlevle yapılır . Bununla birlikte, burada (alıntılanan) argümanları kullanarak bir liste olarak iletmemiz gerekir do.call
. Daha sonra bu çağrıyı modeller listesi içerisinde değerlendiriyoruz.
Bunun üretim kodunda olmasını önlemeye çalışırdım çünkü oldukça karmaşık ve bu nedenle bakımı zor.