2015-12-29 24 views
6

Chcę używać liniowego modelu mieszanego i przewidywać na poziomie populacji (tj. Używać tylko stałych efektów i używać 0 zamiast losowych efektów).lmer: prognozy na poziomie populacji powodują błąd

Przykład model:

require(lme4) 

fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy) 
summary(fm1) 
# values for prediction: 
newx <- seq(min(sleepstudy$Days), max(sleepstudy$Days)) 

Próbowałem kilka metod przewidywania na poziomie populacji, ale wszystkie one nie powiodło się:

pred <- predict(fm1, newdata = data.frame(Days = newx), allow.new.levels = TRUE) 
# Error: couldn't evaluate grouping factor Subject within model frame: try adding grouping factor to data frame explicitly if possible 

pred <- predict(fm1, newdata = data.frame(Days = newx, Subject = NA), allow.new.levels = TRUE) 
# Error: Invalid grouping factor specification, Subject 

pred <- predict(fm1, newdata = data.frame(Days = newx, Subject = as.factor(NA)), allow.new.levels = TRUE) 
# Error: Invalid grouping factor specification, Subject 

Starałem się znaleźć instrukcję dla właściwej metody prognozowania, ale nie wiem jak? Próbowałem spojrzeć na help(package = "lme4"), a najbliższa funkcja, jaką znalazłem, to predict.merMod (chociaż klasa modelu fm1 to lmerMod, a nie merMod). ?predict.merMod brzmi:

allow.new.levels (logiczne) jeśli FALSE (domyślnie), wówczas wszelkie nowe poziomy (lub wartości NA) wykryte w newData wywoła błąd; jeśli TRUE, wówczas przewidywania użyje bezwarunkową wartości (populacja poziomu) dla danych z uprzednio niedostrzegalnych poziomach (lub NAS)

to specjalnie napisane „lub NAS”, ale najwyraźniej nie działa w ten sposób!!

  1. Czy patrzę na stronę pomocy właściwej metody? Jeśli nie, jaka jest właściwa metoda?
  2. Jak wykonać prognozę na poziomie populacji?

Odpowiedz

8

Szukacie re.form:

re.form: Wzór na losowe efekty do przesłanka. Jeśli "NULL", zawiera wszystkie efekty losowe; jeśli 'NA' lub '~ 0', to nie losowe efekty

require(lme4) 
fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy) 
newx <- seq(min(sleepstudy$Days), max(sleepstudy$Days)) 
predict(fm1, newdata=data.frame(Days=newx), re.form=NA) 
##  1  2  3  4  5  6  7  8 
## 251.4051 261.8724 272.3397 282.8070 293.2742 303.7415 314.2088 324.6761 
##  9  10 
## 335.1434 345.6107 

Jak dla innych pytań:

  • merMod jest "super-klasa", który obejmuje zarówno liniową (lmerMod) i uogólnione modele liniowe (glmerMod): zobacz ?"merMod-class"
  • twoje drugie dwie próby prawdopodobnie powinny działać; jednak allow.new.levels został zaprojektowany dla przypadków z okazjonalnymi wartościami NA, nie wszystkie wartości NA ... predict(fm1, newdata = data.frame(Days = newx, Subject = "a"), allow.new.levels = TRUE) działa. Wygląda na to, że kod wykrywa kolumnę all-NA i interpretuje ją jako coś, co poszło nie tak do przodu - może to być naprawione w kodzie, ale nie wydaje się bardzo priorytetowe, ponieważ istnieje re.form.
+1

Dzięki Ben! Prawdopodobnie treść pomocy pomieszała mi: "... aby kontynuować.". Nie jestem native speakerem, proszę, co to znaczy? Prawdopodobnie jest to po prostu angielskie sformułowanie pewnej sytuacji z efektami losowymi? Czy jest tak, że istnieje pewna koncepcja "warunku" w lmer lub samej statystyki? Nie miałem pojęcia, co to oznacza, więc prawdopodobnie przeoczyłem to. – TMS

+2

to terminologia statystyczna (żargon): "warunkowanie na czymś" oznacza uwzględnianie jego wartości przy przewidywaniu. –

+0

Aha, wielki Ben, dzięki za wyjaśnienie! :-) – TMS

Powiązane problemy