Mam takie modele:
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)
Teraz próbuję ocenić, czy efekt losowy powinien być obecny w modelu. Porównuję więc modele za pomocą AIC lub anova i otrzymuję następujący błąd:
> 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
Jak widać, w obu przypadkach korzystam z tego samego zestawu danych. Znalazłem dwa lekarstwa, ale nie uważam ich za zadowalające:
- Dodanie
method = "ML"
do wywołania lme () - nie jestem pewien, czy warto zmienić metodę. - Używanie
lmer()
zamiast. O dziwo, działa to pomimo faktu, że lmer () używa metody REML. Jednak nie podoba mi się to rozwiązanie, ponieważlmer()
nie pokazuje wartości p dla współczynników -lme()
zamiast tego wolę używać starszych .
Czy masz pojęcie, czy to błąd, czy nie i jak możemy to obejść?
źródło
To jest zdecydowanie szczególne. Pierwsza myśl: gdy porównujemy modele, w których modele mają różne struktury efektów stałych (ML jak y . (Pomnoży tok , gdzie k X= 0 ) To ciekawe, że działa,
m2
im3
na przykład), najlepiej dla nasREML
się zmienimethod="ML"
co sprawia, że uważam, że to nie błąd. Wygląda na to, że wymusza „dobrą praktykę”.Powiedziawszy to, spójrzmy pod maską:
gdzie w twoim przypadku możesz zobaczyć, że:
i oczywiście
logLik
robi coś (może?) nieoczekiwanego ...? nie, nie bardzo, jeśli spojrzysz na dokumentacjęlogLik
,?logLik
zobaczysz, że jest to wyraźnie określone:co przywraca nas do pierwotnego punktu, którego powinieneś używać
ML
.Aby użyć wspólnego powiedzenia w CS: „To nie jest błąd; to (prawdziwa) funkcja!”
EDYCJA : (tylko w celu skomentowania komentarza :) Załóżmy, że pasujesz do innego modelu, używając
lmer
tego czasu:i wykonujesz następujące czynności:
Co wydaje się wyraźną rozbieżnością między nimi, ale tak naprawdę nie jest tak, jak wyjaśnił Gavin. Wystarczy powiedzieć oczywiste:
Myślę, że istnieje dobry powód, dla którego dzieje się tak pod względem metodologii.
lme
stara się zrozumieć dla ciebie regresję LME, podczaslmer
gdy podczas porównywania modeli natychmiast wraca do wyników ML. Myślę, że nie ma żadnych błędów w tej sprawielme
ilmer
po prostu inne uzasadnienia dla każdego pakietu.Zobacz także komentarz Gavina Simposona na bardziej wnikliwe wyjaśnienie tego, co się działo
anova()
(To samo dzieje się praktycznie zAIC
)źródło
lmer
używa REML (zobacz podsumowanie modelu) i działa dobrze w AIC? Istnieją więc dwie możliwości: 1) komunikat o błędzie jest * funkcją , a nie błędem, a fakt, że działa,lmer
jest błędem. Lub 2) komunikat o błędzie jest błędem , a nie funkcją.lmer()
nie używa REML, gdy pytasz go o porównanie. IIRC zawierały trochę fantazyjnego cukru,lmer()
więc nie trzeba było modernizować modelu,ML
aby porównać dopasowania tylko wtedy, gdy chceszREML
uzyskać indywidualne dopasowania, aby uzyskać najlepsze oszacowanie parametrów wariancji. Popatrz?lmer
, uruchom pierwszy przykład LME doanova(fm1, fm2)
połączenia włącznie . Spójrz na prawdopodobieństwa dziennika zgłoszone przezanova()
i zgłoszone wcześniej na wydruku.anova()
Jest coraz ML szacuje dla Ciebie.lmer
dostałem oba jednocześnie (używa PLS, więc szacuje tylko jeden na raz). Zapomniałem sprawdzić, co wspomniałeś.anova()
jest jeden oparty na ML. Zgłoszony AICAIC()
jest właśnie oparty na REML.