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 .
?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 angerufen predict
...
lme4
Paket und geben Sie dann lme4 ::: predict.merMod ein, um die paketspezifische Version anzuzeigen. Die Ausgabe von lmer
wird in einem Objekt der Klasse gespeichert merMod
.
predict
weiß, was zu tun ist, abhängig von der Klasse des Objekts, auf das sie angewendet werden soll. Sie haben angerufen predict.merMod
, Sie haben es einfach nicht gewusst.
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
.