il test anova fallisce su lme fit creati con la formula incollata

lme spesso l’argomento formula per modellare funzioni di adattamento come lm o lme incollando insieme le parti di cui ho bisogno, come nella risposta di @ DWin a questa domanda: Comprensione lm e ambiente .

In pratica questo assomiglia a questo:

 library(nlme) set.seed(5) ns <- 5; ni <- 5; N <- ns*ni d <- data.frame(y=rnorm(N), x1=rnorm(N), x2=factor(rep(1:ni, each=ns)), id=factor(rep(1:ns, ni))) getm <- function(xs) { f <- paste("y ~", paste(xs, collapse="+")) lme(as.formula(f), random=~1|id, data=d, method="ML") } m1 <- getm("x1") m2 <- getm(c("x1", "x2")) 

Tuttavia, con lme dal pacchetto nlme , il confronto tra due modelli costruiti nel modo in cui si utilizza anova non funziona, perché anova.lme esamina l’argomento della formula salvata per garantire che i modelli fossero in forma sulla stessa risposta e l’argomento della formula salvata è semplicemente as.formula(f) . L’errore è:

 > anova(m1, m2) Error in inherits(object, "formula") : object 'f' not found 

Ecco cosa dovrebbe fare il comando anova (rimontare i modelli in modo che funzioni):

 > m1  m2  anova(m1, m2) Model df AIC BIC logLik Test L.Ratio p-value m1 1 4 76.83117 81.70667 -34.41558 m2 2 8 72.69195 82.44295 -28.34597 1 vs 2 12.13922 0.0163 

Eventuali suggerimenti?

La risposta di Ben funziona, ma do.call fornisce la soluzione più generale che desiderava.

 getm <- function(xs) { f <- as.formula(paste("y ~", paste(xs, collapse="+"))) do.call("lme", args = list(f, random=~1|id, data=d, method="ML")) } 

Funziona perché (per impostazione predefinita) gli argomenti in args = vengono valutati prima di essere passati a lme.

Ecco un trucco che sembra funzionare:

 getm <- function(xs) { f <- paste("y ~", paste(xs, collapse="+")) m <- lme(as.formula(f), random=~1|id, data=d, method="ML") m$call$fixed <- eval(m$call$fixed) m } 

ma non mi piace affatto. Mi piacerebbe molto vedere una risposta di principio a questa domanda, perché mi bbmle in questo tipo di problema tutto il tempo quando cerco di estendere il pacchetto bbmle .