La prueba anova falla en los ajustes de lme creados con fórmula pegada

A menudo especifico el argumento de fórmula para modelar funciones de ajuste como lm o lme pegando juntas las partes que necesito, como en la respuesta de @DWin a esta pregunta: Comprender lm y environment .

En la práctica esto se ve así:

 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")) 

Sin embargo, con lme del paquete nlme , la comparación de dos modelos construidos de la misma manera que usa anova no funciona, porque anova.lme analiza el argumento de la fórmula guardada para asegurarse de que los modelos encajan en la misma respuesta y el argumento de la fórmula guardada es simplemente como as.formula(f) . El error es:

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

Esto es lo que debe hacer el comando anova (volver a montar los modelos para que funcione):

 > 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 

¿Alguna sugerencia?

La respuesta de Ben funciona, pero do.call proporciona la solución más general que deseaba.

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

Funciona porque (de manera predeterminada) los argumentos en args = se evalúan antes de pasarse a lme.

Aquí hay un truco que parece funcionar:

 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 } 

pero no me gusta para nada Me gustaría mucho ver una respuesta más basada en principios a esta pregunta, porque me encuentro con este tipo de problema todo el tiempo cuando trato de extender el paquete bbmle .