Il problema:
Ho letto in altri post che predictnon è disponibile per i lmermodelli 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 Recallfrequenza di alcune parole, e diverse variabili esplicative, inclusi effetti casuali ( Auditoriumdove si è svolto il test; Subjectnome); 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, Auditoriume 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 Timee 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 predictfunzione in questo lmermodello? Evidentemente sta prendendo in considerazione la Timevariabile, risultando in un adattamento molto più stretto, e lo zig-zagging che sta cercando di mostrare questa terza dimensione di Timeritratta nel primo diagramma.
Se chiamo predict(fit2)ottengo 132.45609la prima voce, che corrisponde al primo punto. Ecco headil 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 fit2sono:
$`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 .
?predictsulla console [r], ottengo il pronostico di base per {stats} ...
predict.merMod, però ... Come puoi vedere dall'OP, ho chiamato semplicemente predict...
lme4pacchetto, quindi digita lme4 ::: predict.merMod per visualizzare la versione specifica del pacchetto. L'output di lmerviene archiviato in un oggetto di classe merMod.
predictsa cosa fare in base alla classe dell'oggetto su cui è chiamata ad agire. Stavi chiamando predict.merMod, semplicemente non lo sapevi.




predictfunzione 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.