Nur Vorhersagen mit festem Effekt aus einem gemischten Modell für neue Daten in R erhalten

8

Ich möchte Vorhersagen für ein gemischtes Modell (logistisch über glmer) für einen neuen Datensatz erstellen, wobei nur die festen Effekte verwendet werden und die zufälligen Effekte auf 0 gehalten werden. Ich habe jedoch Probleme, die Modellmatrix einzurichten, um sie berechnen zu können.

Da die mer-Klasse keine Vorhersagemethode hat und ich die zufälligen Effekte für Vorhersagen auf den neuen Datensatz weglassen möchte, muss ich eine Modellmatrix für die festen Effekte derselben Struktur erstellen, die im Original verwendet wurde Modell, aber unter Verwendung der neuen Daten. Dann multiplizieren Sie mit den festen Effektkoeffizienten im Modell.

Der Teil mit festen Effekten meiner Modellformel enthält Faktoren und Interaktionsterme zwischen numerischen festen Effekten. Daher ist er etwas komplizierter als nur das Extrahieren der festen Variablen aus der Matrix. zB muss ich sicherstellen, dass die Faktorkontrastexpansion mit dem Original übereinstimmt, die Interaktionsterme ordnungsgemäß aufgelistet sind usw.

Meine Frage lautet also: Was ist der einfachere allgemeine Ansatz zum Erstellen einer neuen Modellmatrix, die die Struktur der ursprünglichen Modellmatrix nachahmt, die beim Erstellen des Modells verwendet wurde?

Ich habe model.matrix (my.model, data = newdata) ausprobiert, aber das scheint die ursprüngliche Modellmatrix zurückzugeben, die nicht auf newdata basiert.

Beispielcode:

library(lme4)

cake2 <- head(cake) # cake2 is "new" data frame for future predictions

# recipe is a fixed effect factor, temp is fixed effect numeric, replicate is random effect
m <- lmer(angle ~ temp + recipe + (1 | replicate), data=cake)
summary(m)

nrow(cake2)         # but new data frame has 6 rows
nrow(cake)          # original data frame has 270 rows

# attempt to make new model matrix using different data frame
mod.mat.cake2 <- model.matrix(m, data=cake2)
nrow(mod.mat.cake2) # 270 rows, same as orig data frame

Ich habe andere Methoden ausprobiert, wie das Extrahieren der Begriffe aus der Formel und das Erstellen einer neuen Formel daraus, aber es schien übermäßig kompliziert und spröde in Bezug auf Handhabungsfaktoren und Interaktionsterme zu sein.

Wie kann ich mod.mat.cake2 zu einer Modellmatrix mit festem Effekt machen, die auf der Formel in m basiert, aber Werte aus cake2 verwendet? Oder gibt es einen einfacheren Weg, um nur Vorhersagen mit festem Effekt von einem früheren Modell zu erhalten?

Jede Hilfe wird geschätzt. Vielen Dank.

Colonel.triq
quelle
Sehr grober, aber einfacher Ansatz: Wenn die Rechenzeit kein wesentlicher Faktor ist (dh Sie müssen dies nicht viele Male tun), können Sie die neuen Daten lm()anpassen, die Modellmatrix aus der Anpassung extrahieren und auf die anwenden Modellkoeffizienten aus der vorherigen Anpassung.
Makro

Antworten:

13

Vielleicht ist das Betrug, aber

fixedformula <- as.formula(lme4.0:::nobars(formula(m))[-2])
model.matrix(fixedformula,newdata=cake2)

Hinweis:

  • Ich verwende lme4.0hier, die die r-Schmiede - Version von „alt“ ist (CRAN) lme4: Sie ersetzen können , lme4für lme4.0den Code oben
  • Die neue (R-Forge / Development) Version von lme4hat eine predictMethode: in diesem Fall

    predict(m,re.form=NA,newdata=cake2)

funktioniert gut ( re.form=NAsetzt alle zufälligen Effekte auf Null, was level=0der alten entspricht predict.lme)

Ben Bolker
quelle
1
Danke Ben. Ich hatte Probleme, die erste Lösung richtig zum Laufen zu bringen. Das Umschalten auf die Dev-Version von lme4 und die Verwendung der Funktion Predict / REform = NA reichen jedoch aus, ohne sich mit den Details der Modellmatrix herumschlagen zu müssen. Es gibt einige Funktionen, die in der Entwicklerversion, die ich in meinem Code verwendet habe, noch nicht implementiert zu sein scheinen (insbesondere kann ich den Zufallseffekt postVars nicht so einfach extrahieren), aber ich möchte lieber Sie können die Vorhersagefunktion verwenden und warten, bis das neue lme4 für die anderen Teile fertig ist.
Colonel.triq
Es mag offensichtlich sein, aber wenn Sie ein (sehr) kleines, in sich geschlossenes Beispiel für das, was Sie tun möchten, das in der Entwicklerversion nicht funktioniert, aufschreiben und an mich senden könnten, wäre das nützlich
Ben Bolker