Il problema:
Ho letto in altri post che predict
non è disponibile per i lmer
modelli di effetti misti {lme4} in [R].
Ho provato ad esplorare questo argomento con un set di dati giocattolo ...
Sfondo:
Il set di dati è adattato da questa fonte e disponibile come ...
require(gsheet)
data <- read.csv(text =
gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
format ='csv'))
Queste sono le prime righe e intestazioni:
> 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
Abbiamo alcune osservazioni ripetute ( Time
) di una misurazione continua, vale a dire la Recall
frequenza di alcune parole, e diverse variabili esplicative, inclusi effetti casuali ( Auditorium
dove si è svolto il test; Subject
nome); e effetti fissi , come ad esempio Education
, Emotion
(la connotazione emotiva della parola da ricordare), o di ingerito prima della prova.Caffeine
L'idea è che è facile da ricordare per i soggetti cablati iper-caffeinati, ma l'abilità diminuisce nel tempo, forse a causa della stanchezza. Le parole con connotazione negativa sono più difficili da ricordare. L'istruzione ha un effetto prevedibile e persino l'auditorium ha un ruolo (forse uno era più rumoroso o meno confortevole). Ecco un paio di trame esplorative:
Differenze nella frequenza di richiamo in funzione di Emotional Tone
, Auditorium
e Education
:
Quando si adattano le linee sul cloud di dati per la chiamata:
fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)
Ricevo questa trama:
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)
mentre il seguente modello:
fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)
incorporando Time
e un codice parallelo ottiene una trama sorprendente:
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
geom_point(size=3) +
geom_line(aes(y = predict(fit2)),size=1)
print(p)
La domanda:
Come funziona la predict
funzione in questo lmer
modello? Evidentemente sta prendendo in considerazione la Time
variabile, risultando in un adattamento molto più stretto, e lo zig-zagging che sta cercando di mostrare questa terza dimensione di Time
ritratta nel primo diagramma.
Se chiamo predict(fit2)
ottengo 132.45609
la prima voce, che corrisponde al primo punto. Ecco head
il set di dati con l'output di predict(fit2)
attaccato come ultima colonna:
> 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
I coefficienti per fit2
sono:
$`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
La mia scommessa migliore era ...
> 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
Qual è la formula da ottenere invece 132.45609
?
EDIT per un accesso rapido ... La formula per calcolare il valore previsto (in base alla risposta accettata si baserebbe ranef(fit2)
sull'output:
> 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
... per il primo punto di ingresso:
> 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
Il codice per questo post è qui .
?predict
sulla console [r], ottengo il pronostico di base per {stats} ...
predict.merMod
, però ... Come puoi vedere dall'OP, ho chiamato semplicemente predict
...
lme4
pacchetto, quindi digita lme4 ::: predict.merMod per visualizzare la versione specifica del pacchetto. L'output di lmer
viene archiviato in un oggetto di classe merMod
.
predict
sa cosa fare in base alla classe dell'oggetto su cui è chiamata ad agire. Stavi chiamando predict.merMod
, semplicemente non lo sapevi.
predict
funzione in questo pacchetto dalla versione 1.0-0, rilasciata il 2013-08-01. Vedi la pagina delle notizie sul pacchetto in CRAN . Se non ci fosse stato, non saresti stato in grado di ottenere risultatipredict
. Non dimenticare che puoi vedere il codice R con lme4 ::: predict.merMod al prompt dei comandi R e ispezionare l'origine per eventuali funzioni compilate sottostanti nel pacchetto sorgente perlme4
.