J'ai des modèles comme celui-ci:
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)
J'essaie maintenant d'évaluer si l'effet aléatoire doit être présent dans le modèle. Je compare donc les modèles en utilisant AIC ou anova, et j'obtiens l'erreur suivante:
> 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
Comme vous pouvez le voir, dans les deux cas, j'utilise le même ensemble de données. J'ai trouvé deux remèdes, mais je ne les considère pas satisfaisants:
- Ajout
method = "ML"
à l'appel lme () - je ne sais pas si c'est une bonne idée de changer la méthode. - Utiliser à la
lmer()
place. Étonnamment, cela fonctionne, malgré le fait que lmer () utilise la méthode REML. Cependant, je n'aime pas cette solution car lelmer()
ne montre pas les valeurs de p pour les coefficients - j'aime utiliser plus ancien à lalme()
place.
Avez-vous une idée s'il s'agit d'un bug ou non et comment pouvons-nous contourner cela?
la source
m2
m3
REML
method="ML"
Cela dit, regardons sous le capot:
où dans votre cas, vous pouvez voir que:
et fait évidemment
logLik
quelque chose (peut-être?) inattendu ...? non, pas vraiment, si vous regardez la documentationlogLik
,?logLik
vous verrez il est dit explicitement:ce qui nous ramène à notre point d'origine, vous devriez utiliser
ML
.Pour utiliser un dicton courant dans CS: "Ce n'est pas un bug; c'est une (vraie) fonctionnalité!"
EDIT : (Juste pour répondre à votre commentaire :) Supposons que vous montiez un autre modèle en utilisant
lmer
cette fois:et vous procédez comme suit:
Ce qui semble être une nette différence entre les deux, mais ce n'est vraiment pas comme l'explique Gavin. Juste pour dire l'évidence:
Il y a une bonne raison pour laquelle cela se produit en termes de méthodologie, je pense.
lme
essaie de donner un sens à la régression LME pour vous tandis quelmer
lorsque vous faites des comparaisons de modèles, cela revient immédiatement à ses résultats ML. Je pense qu'il n'y a pas de bugs à ce sujet danslme
etlmer
juste des raisons différentes derrière chaque paquet.Voir aussi le commentaire de Gavin Simposon sur une explication plus perspicace de ce qui s'est passé
anova()
(la même chose se produit pratiquement avecAIC
)la source
lmer
utilise REML (voir le résumé du modèle) et fonctionne bien en AIC? Il y a donc deux possibilités: 1) le message d'erreur est * une fonctionnalité , pas un bug, et le fait que cela fonctionnelmer
est un bug. Ou 2) le message d'erreur est un bug , pas une fonctionnalité.lmer()
n'utilise pas REML lorsque vous lui demandez de faire des comparaisons. IIRC, ils ont inclus du sucre fantaisielmer()
afin que vous n'ayez pas à réaménager le modèle avecML
juste pour comparer les ajustements lorsque vous le souhaitezREML
sur les ajustements individuels pour obtenir les meilleures estimations des paramètres de variance. Regardez?lmer
, exécutez le premier exemple LME jusqu'à l'anova(fm1, fm2)
appel inclus . Examinez les probabilités logarithmiques rapportées paranova()
et celles rapportées précédemment dans la sortie imprimée. Leanova()
obtient des estimations de ML pour vous.lmer
a les deux en même temps (il utilise PLS donc il ne fait que n'en estimer qu'un à la fois). J'ai oublié de vérifier ce que vous avez mentionné.anova()
est celui basé sur ML. L'AIC rapportéAIC()
est juste celui basé sur REML.