Funzione predict () per modelli di effetti misti lmer


27

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.mgs.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:


inserisci qui la descrizione dell'immagine

Differenze nella frequenza di richiamo in funzione di Emotional Tone, Auditoriume Education:

inserisci qui la descrizione dell'immagine


Quando si adattano le linee sul cloud di dati per la chiamata:

fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)

Ricevo questa trama:

con il seguente codice (nota la chiamata per <code> predict (fit1) </code>):

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)

inserisci qui la descrizione dell'immagine


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 .


3
Si noti che esiste una 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 risultati predict. 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 per lme4.
EdM,

1
Grazie, vedo che c'è la funzionalità con gli effetti casuali ignorati o inclusi. Sai dove posso trovare come viene calcolato? Se scrivo ?predictsulla console [r], ottengo il pronostico di base per {stats} ...
Antoni Parellada,

@EdM ... sì, questa è una novità per me ... Grazie. Non avevo chiamato predict.merMod, però ... Come puoi vedere dall'OP, ho chiamato semplicemente predict...
Antoni Parellada

1
Carica il lme4pacchetto, quindi digita lme4 ::: predict.merMod per visualizzare la versione specifica del pacchetto. L'output di lmerviene archiviato in un oggetto di classe merMod.
EdM

4
Una delle bellezze di R è che una funzione come predictsa cosa fare in base alla classe dell'oggetto su cui è chiamata ad agire. Stavi chiamando predict.merMod, semplicemente non lo sapevi.
EdM,

Risposte:


25

È facile confondersi con la presentazione dei coefficienti quando si chiama coef(fit2). Guarda il riassunto di fit2:

> summary(fit2)
Linear mixed model fit by REML ['lmerMod']
Formula: Recall ~ (1 | Subject/Time) + Caffeine
   Data: data
REML criterion at convergence: 444.5

Scaled residuals: 
 Min       1Q   Median       3Q      Max 
-1.88657 -0.46382 -0.06054  0.31430  2.16244 

Random effects:
 Groups       Name        Variance Std.Dev.
 Time:Subject (Intercept)  558.4   23.63   
 Subject      (Intercept) 2458.0   49.58   
 Residual                  675.0   25.98   
Number of obs: 45, groups:  Time:Subject, 15; Subject, 5

Fixed effects:
Estimate Std. Error t value
(Intercept) 61.91827   25.04930   2.472
Caffeine     0.21163    0.07439   2.845

Correlation of Fixed Effects:
 (Intr)
Caffeine -0.365

Vi è un'intercetta complessiva di 61,92 per il modello, con un coefficiente di caffeina di 0,212. Quindi per caffeina = 95 prevedi un richiamo medio di 82.06.

Invece di usare coef, usa ranefper ottenere la differenza di ogni intercetta per effetto casuale dall'intercettazione media al successivo livello superiore di annidamento:

> 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

I valori per Jim al tempo = 0 sarà diverso da quello valore medio di 82.06 per la somma di entrambi i suoi Subject e suoi Time:Subjectcoefficienti:

82.06+17.39+33.04=132.49

che penso sia nell'arrotondamento dell'errore di 132,46.

I valori di intercettazione restituiti coefsembrano rappresentare l'intercettazione generale più le differenze specifiche Subjecto Time:Subject, quindi è più difficile lavorare con quelli; se si provasse a fare il calcolo sopra con i coefvalori si dovrebbe contare due volte l'intercetta generale.


Grazie! Questo è stato eccezionale! Non credo che abbia senso lasciarlo aperto ... Questa è la risposta, no?
Antoni Parellada,

Ho avuto il suggerimento di ranefesaminare il codice R in lme4. Ho chiarito la presentazione in un paio di posti.
EdM,

(+1) Nota: gli effetti casuali temporali nidificati nella persona sembrano in qualche modo strani.
Michael M,

@MichaelM: Sì, i dati presentati sembrano essere un disegno incrociato (Time x Subject) anziché un disegno nidificato, ma questo è il modo in cui l'OP ha sollevato la questione di come interpretare l' lme4output. Inoltre, i dati presentati sembravano essere a scopo illustrativo piuttosto che essere un vero studio da analizzare.
EdM,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.