Tengo modelos como este:
require(nlme)
set.seed(123)
n <- 100
k <- 5
cat <- as.factor(rep(1:k, n))
cat_i <- 1:k # intercept per kategorie
x <- rep(1:n, each = k)
sigma <- 0.2
alpha <- 0.001
y <- cat_i[cat] + alpha * x + rnorm(n*k, 0, sigma)
plot(x, y)
m1 <- lm(y ~ x)
summary(m1)
m2 <- lm(y ~ cat + x)
summary(m2)
m3 <- lme(y ~ x, random = ~ 1|cat, na.action = na.omit)
summary(m3)
Ahora estoy tratando de evaluar si el efecto aleatorio debe estar presente en el modelo. Así que comparo los modelos usando AIC o anova, y obtengo el siguiente error:
> AIC(m1, m2, m3)
df AIC
m1 3 1771.4696
m2 7 -209.1825
m3 4 -154.0245
Warning message:
In AIC.default(m1, m2, m3) :
models are not all fitted to the same number of observations
> anova(m2, m3)
Error in anova.lmlist(object, ...) :
models were not all fitted to the same size of dataset
Como puede ver, en ambos casos utilizo el mismo conjunto de datos. He encontrado dos remedios, pero no los considero satisfactorios:
- Agregando
method = "ML"
a la llamada lme () , no estoy seguro si es una buena idea cambiar el método. - Usando en su
lmer()
lugar. Sorprendentemente, esto funciona, a pesar del hecho de que lmer () usa el método REML. Sin embargo, no me gusta esta solución porquelmer()
no muestra los valores p para los coeficientes; en su lugar, me gusta usar los más antiguoslme()
.
¿Tienes alguna idea de si esto es un error o no y cómo podemos solucionarlo?
fuente
m2
m3
REML
method="ML"
Dicho esto, echemos un vistazo debajo del capó:
donde en tu caso puedes ver que:
y obviamente
logLik
está haciendo algo (¿tal vez?) inesperado ... no, no realmente, si miras la documentación delogLik
,?logLik
verás que se declara explícitamente:lo que nos lleva de vuelta a nuestro punto original, deberías estar usando
ML
.Para usar un dicho común en CS: "¡No es un error; es una característica (real)!"
EDITAR : (Solo para abordar su comentario :) Suponga que se ajusta a otro modelo usando
lmer
esta vez:y haces lo siguiente:
Lo que parece una clara discrepancia entre los dos, pero en realidad no es como lo explicó Gavin. Solo para decir lo obvio:
Hay una buena razón por la que esto sucede en términos de metodología, creo.
lme
intenta darle sentido a la regresión LME mientras quelmer
al hacer comparaciones de modelos recurre inmediatamente a sus resultados de ML. Creo que no hay errores en este asuntolme
ylmer
solo diferentes razones detrás de cada paquete.Vea también el comentario de Gavin Simposon sobre una explicación más perspicaz de lo que sucedió
anova()
(lo mismo sucede prácticamente conAIC
)fuente
lmer
usando REML (ver el resumen del modelo) y funciona bien en AIC? Por lo tanto, hay dos posibilidades: 1) el mensaje de error es * una característica , no un error, y el hecho de que funcionelmer
es un error. O 2) el mensaje de error es un error , no una característica.lmer()
no usa REML cuando le pides que haga comparaciones. IIRC incluyeron un poco de azúcar sofisticado,lmer()
por lo que no tuvo que reajustar el modeloML
solo para comparar ajustes cuando deseaREML
en ajustes individuales para obtener las mejores estimaciones de los parámetros de varianza. Mire?lmer
, ejecute el primer ejemplo de LME hasta e incluyendo laanova(fm1, fm2)
llamada. Observe las probabilidades de registro informadas poranova()
y las informadas anteriormente en el resultado impreso. Elanova()
está obteniendo estimaciones de ML para usted.lmer
obtuve ambas cosas al mismo tiempo (usa PLS, por lo que da vueltas estimando solo una a la vez). Olvidé comprobar lo que mencionaste.anova()
es el basado en ML. La AIC informadaAIC()
es la que se basa en REML.