Ich habe solche Modelle:
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)
Jetzt versuche ich zu beurteilen, ob der zufällige Effekt im Modell vorhanden sein sollte. Ich vergleiche die Modelle mit AIC oder Anova und erhalte folgende Fehlermeldung:
> 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
Wie Sie sehen können, verwende ich in beiden Fällen denselben Datensatz. Ich habe zwei Mittel gefunden, aber ich halte sie nicht für befriedigend:
- Hinzufügen
method = "ML"
zum Aufruf von lme () - nicht sicher, ob es sinnvoll ist, die Methode zu ändern. - Verwenden Sie
lmer()
stattdessen. Überraschenderweise funktioniert dies, obwohl lmer () die REML-Methode verwendet. Diese Lösung gefällt mirlmer()
jedoch nicht, da die p-Werte für Koeffizienten nicht angezeigtlme()
werden. Stattdessen verwende ich gerne ältere .
Haben Sie eine Idee, ob dies ein Fehler ist oder nicht und wie können wir das umgehen?
quelle
m2
m3
REML
method="ML"
Nachdem wir das gesagt haben, schauen wir unter die Haube:
Wo in Ihrem Fall können Sie das sehen:
und macht offensichtlich
logLik
etwas (vielleicht?) Unerwartetes ...? nein, nicht wirklich, wenn Sie sich die Dokumentation von ansehenlogLik
,?logLik
werden Sie sehen, dass es ausdrücklich angegeben ist:Das bringt uns zurück zu unserem ursprünglichen Punkt, den Sie verwenden sollten
ML
.Um ein allgemeines Sprichwort in CS zu verwenden: "Es ist kein Fehler, es ist eine (echte) Funktion!"
BEARBEITEN : (Nur um Ihren Kommentar anzusprechen :) Angenommen, Sie passen in
lmer
dieser Zeit zu einem anderen Modell :und du machst folgendes:
Das scheint eine klare Diskrepanz zwischen den beiden zu sein, aber es ist wirklich nicht so, wie Gavin es erklärt hat. Nur um das Offensichtliche zu sagen:
Es gibt einen guten Grund, warum dies in Bezug auf die Methodik geschieht, denke ich.
lme
versucht, die LME-Regression für Sie zu verstehen, während sielmer
bei Modellvergleichen sofort auf die ML-Ergebnisse zurückgreift. Ich denke, es gibt keine Fehler in dieser Angelegenheitlme
undlmer
nur unterschiedliche Gründe für jedes Paket.Siehe auch Gavin Simposons Kommentar zu einer aufschlussreicheren Erklärung dessen, was vor sich ging
anova()
(das gleiche passiert praktisch mitAIC
)quelle
lmer
REML verwendet wird (siehe Modellzusammenfassung) und in AIC einwandfrei funktioniert? Es gibt also zwei Möglichkeiten: 1) Die Fehlermeldung ist * eine Funktion , kein Fehler, und die Tatsache, dass sie funktioniert,lmer
ist ein Fehler. Oder 2) die Fehlermeldung ist ein Fehler , keine Funktion.lmer()
nicht , wenn Sie darum bitten, Vergleiche anzustellen. IIRC enthielt etwas ausgefallenen Zucker,lmer()
sodass Sie das Modell nicht umrüsten mussten, umML
nur die Anpassungen zu vergleichen, wenn SieREML
einzelne Anpassungen wünschen , um die besten Schätzungen der Varianzparameter zu erhalten. Schauen Sie sich?lmer
das erste LME Beispiel bis zu und einschließlich dem Laufanova(fm1, fm2)
Anruf. Sehen Sie sich die vonanova()
und früher in der Druckausgabe gemeldeten Protokollwahrscheinlichkeiten an . Dasanova()
bekommt ML-Schätzungen für Sie.lmer
beide gleichzeitig erhalten wurden (es verwendet PLS, so dass immer nur einer geschätzt wird). Ich habe vergessen zu überprüfen, was Sie erwähnt haben.anova()
der ist auf Basis von ML. Der gerade gemeldete AICAIC()
basiert auf REML.