Das Problem:
Ich habe in anderen Posts gelesen , predict
die für lmer
Modelle mit gemischten Effekten {lme4} in [R] nicht verfügbar sind .
Ich habe versucht, dieses Thema mit einem Spielzeugdatensatz zu untersuchen ...
Hintergrund:
Der Datensatz ist aus dieser Quelle angepasst und als ...
require(gsheet)
data <- read.csv(text =
gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
format ='csv'))
Dies sind die ersten Zeilen und Überschriften:
> head(data)
Subject Auditorium Education Time Emotion Caffeine Recall
1 Jim A HS 0 Negative 95 125.80
2 Jim A HS 0 Neutral 86 123.60
3 Jim A HS 0 Positive 180 204.00
4 Jim A HS 1 Negative 200 95.72
5 Jim A HS 1 Neutral 40 75.80
6 Jim A HS 1 Positive 30 84.56
Wir haben einige wiederholte Beobachtungen ( Time
) einer kontinuierlichen Messung, nämlich die Recall
Rate einiger Wörter, und mehrere erklärende Variablen, einschließlich zufälliger Effekte ( Auditorium
wo der Test stattgefunden hat; Subject
Name); und festen Effekten , wie zum Beispiel Education
, Emotion
(die emotionale Konnotation des Wortes zu erinnern) oder die Caffeine
vor dem Test aufgenommen.
Die Idee ist, dass es leicht ist, sich an hyperkoffeinhaltige verdrahtete Probanden zu erinnern, aber die Fähigkeit nimmt mit der Zeit ab, möglicherweise aufgrund von Müdigkeit. Wörter mit negativer Konnotation sind schwerer zu merken. Bildung hat einen vorhersehbaren Effekt, und sogar das Auditorium spielt eine Rolle (vielleicht war eines lauter oder unangenehmer). Hier sind ein paar Versuchspläne:
Unterschiede in der Recall - Rate in Abhängigkeit von Emotional Tone
, Auditorium
und Education
:
Beim Anpassen von Leitungen in der Datenwolke für den Anruf:
fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)
Ich bekomme diese Handlung:
library(ggplot2)
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
geom_point(size=3) +
geom_line(aes(y = predict(fit1)),size=1)
print(p)
während das folgende Modell:
fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)
Wenn Sie Time
einen Parallelcode einbauen, erhalten Sie eine überraschende Darstellung:
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
geom_point(size=3) +
geom_line(aes(y = predict(fit2)),size=1)
print(p)
Die Frage:
Wie funktioniert die predict
Funktion in diesem lmer
Modell? Offensichtlich berücksichtigt es die Time
Variable, was zu einer viel engeren Anpassung führt, und das Zick-Zack-Verhältnis, das versucht, diese dritte Dimension der Time
Darstellung in der ersten Darstellung anzuzeigen .
Wenn ich anrufe predict(fit2)
bekomme ich 132.45609
für den ersten Eintrag, der dem ersten Punkt entspricht. Hier ist der head
Datensatz mit der Ausgabe von predict(fit2)
als letzte Spalte angehängt:
> data$predict = predict(fit2)
> head(data)
Subject Auditorium Education Time Emotion Caffeine Recall predict
1 Jim A HS 0 Negative 95 125.80 132.45609
2 Jim A HS 0 Neutral 86 123.60 130.55145
3 Jim A HS 0 Positive 180 204.00 150.44439
4 Jim A HS 1 Negative 200 95.72 112.37045
5 Jim A HS 1 Neutral 40 75.80 78.51012
6 Jim A HS 1 Positive 30 84.56 76.39385
Die Koeffizienten für fit2
sind:
$`Time:Subject`
(Intercept) Caffeine
0:Jason 75.03040 0.2116271
0:Jim 94.96442 0.2116271
0:Ron 58.72037 0.2116271
0:Tina 70.81225 0.2116271
0:Victor 86.31101 0.2116271
1:Jason 59.85016 0.2116271
1:Jim 52.65793 0.2116271
1:Ron 57.48987 0.2116271
1:Tina 68.43393 0.2116271
1:Victor 79.18386 0.2116271
2:Jason 43.71483 0.2116271
2:Jim 42.08250 0.2116271
2:Ron 58.44521 0.2116271
2:Tina 44.73748 0.2116271
2:Victor 36.33979 0.2116271
$Subject
(Intercept) Caffeine
Jason 30.40435 0.2116271
Jim 79.30537 0.2116271
Ron 13.06175 0.2116271
Tina 54.12216 0.2116271
Victor 132.69770 0.2116271
Meine beste Wette war ...
> coef(fit2)[[1]][2,1]
[1] 94.96442
> coef(fit2)[[2]][2,1]
[1] 79.30537
> coef(fit2)[[1]][2,2]
[1] 0.2116271
> data$Caffeine[1]
[1] 95
> coef(fit2)[[1]][2,1] + coef(fit2)[[2]][2,1] + coef(fit2)[[1]][2,2] * data$Caffeine[1]
[1] 194.3744
Was ist die Formel, um stattdessen zu bekommen 132.45609
?
EDIT für den schnellen Zugriff ... Die Formel zur Berechnung des vorhergesagten Wertes (entsprechend der akzeptierten Antwort würde auf der ranef(fit2)
Ausgabe basieren :
> ranef(fit2)
$`Time:Subject`
(Intercept)
0:Jason 13.112130
0:Jim 33.046151
0:Ron -3.197895
0:Tina 8.893985
0:Victor 24.392738
1:Jason -2.068105
1:Jim -9.260334
1:Ron -4.428399
1:Tina 6.515667
1:Victor 17.265589
2:Jason -18.203436
2:Jim -19.835771
2:Ron -3.473053
2:Tina -17.180791
2:Victor -25.578477
$Subject
(Intercept)
Jason -31.513915
Jim 17.387103
Ron -48.856516
Tina -7.796104
Victor 70.779432
... für den ersten Einstiegspunkt:
> summary(fit2)$coef[1]
[1] 61.91827 # Overall intercept for Fixed Effects
> ranef(fit2)[[1]][2,]
[1] 33.04615 # Time:Subject random intercept for Jim
> ranef(fit2)[[2]][2,]
[1] 17.3871 # Subject random intercept for Jim
> summary(fit2)$coef[2]
[1] 0.2116271 # Fixed effect slope
> data$Caffeine[1]
[1] 95 # Value of caffeine
summary(fit2)$coef[1] + ranef(fit2)[[1]][2,] + ranef(fit2)[[2]][2,] +
summary(fit2)$coef[2] * data$Caffeine[1]
[1] 132.4561
Der Code für diesen Beitrag ist hier .
quelle
predict
dieses Paket seit Version 1.0-0, veröffentlicht am 01.08.2013, eine Funktion enthält. Siehe die Paketnachrichtenseite in CRAN . Wenn es nicht gegeben hätte, wären Sie nicht in der Lage gewesen, irgendwelche Ergebnisse mit zu bekommenpredict
. Vergessen Sie nicht, dass Sie den R-Code mit lme4 ::: predict.merMod an der R-Eingabeaufforderung sehen können, und untersuchen Sie die Quelle auf zugrunde liegende kompilierte Funktionen im Quellpaket fürlme4
.?predict
auf der [r] Konsole tippe, erhalte ich die grundlegende Vorhersage für {stats} ...predict.merMod
... Wie Sie auf dem OP sehen können, habe ich einfach angerufenpredict
...lme4
Paket und geben Sie dann lme4 ::: predict.merMod ein, um die paketspezifische Version anzuzeigen. Die Ausgabe vonlmer
wird in einem Objekt der Klasse gespeichertmerMod
.predict
weiß, was zu tun ist, abhängig von der Klasse des Objekts, auf das sie angewendet werden soll. Sie haben angerufenpredict.merMod
, Sie haben es einfach nicht gewusst.Antworten:
Die Darstellung von Koeffizienten beim Aufrufen kann leicht zu Verwirrung führen
coef(fit2)
. Schauen Sie sich die Zusammenfassung von fit2 an:Es gibt einen Gesamtabschnitt von 61,92 für das Modell mit einem Koffeinkoeffizienten von 0,212. Für Koffein = 95 prognostizieren Sie also einen durchschnittlichen Rückruf von 82,06.
Anstatt zu verwenden
coef
, verwenden Sieranef
, um die Differenz der einzelnen Zufallseffektabschnitte von den mittleren Abschnitten auf der nächsthöheren Verschachtelungsebene zu ermitteln:Die Werte für Jim zum Zeitpunkt = 0 unterscheiden sich von diesem Durchschnittswert von 82,06 um die Summe seiner
Subject
und seinerTime:Subject
Koeffizienten:was meiner Meinung nach innerhalb des Rundungsfehlers von 132,46 liegt.
Die von zurückgegebenen Intercept-Werte
coef
scheinen den gesamten Intercept zuzüglich des zu repräsentierenSubject
oderTime:Subject
spezifischer Unterschiede , daher ist es schwieriger, mit diesen zu arbeiten. Wenn Sie versuchen würden, die obige Berechnung mit dencoef
Werten durchzuführen, würden Sie den Gesamtabschnitt doppelt zählen.quelle
ranef
R-Code in untersucht habelme4
. Ich habe die Präsentation an einigen Stellen geklärt.lme4
Ausgabe zu interpretieren ist . Die präsentierten Daten schienen eher zur Veranschaulichung zu dienen, als dass sie eine echte Studie darstellten, die analysiert werden sollte.