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)

Dec 15 2020

Formunun çıktısını almak lme4::lmeristediğim karma modellerin bir listesi var , bu yüzden varanovaanova(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_listadlandırılmamış gibi aynı sonuç . Github'da da sordum (https://github.com/lme4/lme4/issues/612), ancak kullanmak do.callbu 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, fm2ile 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

2 Roland Dec 15 2020 at 18:50

anova.merModmodel 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, callher 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.