Función predic () para modelos de efectos mixtos de lmer

27

El problema:

He leído en otras publicaciones que predictno están disponibles para los lmermodelos de efectos mixtos {lme4} en [R].

Traté de explorar este tema con un conjunto de datos de juguete ...

Fondo:

El conjunto de datos se adapta de esta fuente y está disponible como ...

require(gsheet)
data <- read.csv(text = 
     gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
        format ='csv'))

Estas son las primeras filas y encabezados:

> 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

Tenemos algunas observaciones repetidas ( Time) de una medición continua, a saber, la Recalltasa de algunas palabras y varias variables explicativas, incluidos los efectos aleatorios ( Auditoriumdonde se realizó la prueba; Subjectnombre); y efectos fijos , como Education, Emotion(la connotación emocional de la palabra para recordar), o de ingerido antes de la prueba.mgs.Caffeine

La idea es que es fácil de recordar para los sujetos con cable con hipercafeinado, pero la capacidad disminuye con el tiempo, tal vez debido al cansancio. Las palabras con connotación negativa son más difíciles de recordar. La educación tiene un efecto predecible, e incluso el auditorio juega un papel (quizás uno era más ruidoso o menos cómodo). Aquí hay un par de parcelas exploratorias:


ingrese la descripción de la imagen aquí

Diferencias en la tasa de recuerdo en función de Emotional Tone, Auditoriumy Education:

ingrese la descripción de la imagen aquí


Al ajustar líneas en la nube de datos para la llamada:

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

Me sale esta trama:

con el siguiente código (observe la llamada para <code> predict (fit1) </code> en él):

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)

mientras que el siguiente modelo:

fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)

incorporando Timey un código paralelo obtiene un argumento 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)

ingrese la descripción de la imagen aquí


La pregunta:

¿Cómo funciona la predictfunción en este lmermodelo? Evidentemente, está teniendo en cuenta la Timevariable, lo que resulta en un ajuste mucho más estricto y el zigzag que está tratando de mostrar esta tercera dimensión Timerepresentada en el primer gráfico.

Si llamo predict(fit2)obtengo 132.45609la primera entrada, que corresponde al primer punto. Aquí está el headconjunto de datos con la salida de predict(fit2)adjunto como la última columna:

> 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

Los coeficientes para fit2son:

$`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

Mi mejor apuesta fue ...

> 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

¿Cuál es la fórmula para obtener en su lugar 132.45609?


EDITAR para acceso rápido ... La fórmula para calcular el valor predicho (de acuerdo con la respuesta aceptada se basaría en la ranef(fit2)salida:

> 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

... para el primer punto de entrada:

> 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

El código para esta publicación está aquí .

Antoni Parellada
fuente
3
Tenga en cuenta que ha habido una predictfunción en este paquete desde la Versión 1.0-0, lanzada el 2013-08-01. Vea la página de noticias del paquete en CRAN . Si no hubiera habido, no habría podido obtener ningún resultado predict. No olvide que puede ver el código R con lme4 ::: predic.merMod en el símbolo del sistema R e inspeccionar la fuente para ver si hay funciones compiladas subyacentes en el paquete fuente lme4.
EdM
1
Gracias, veo que existe la funcionalidad con los efectos aleatorios descartados o incluidos. ¿Sabes dónde puedo encontrar cómo se calcula? Si escribo ?predicten la consola [r], obtengo la predicción básica para {stats} ...
Antoni Parellada
@EdM ... sí, esto es nuevo para mí ... Gracias. Sin predict.merModembargo, no había llamado ... Como puede ver en el OP, llamé simplemente predict...
Antoni Parellada
1
Cargue el lme4paquete, luego escriba lme4 ::: predict.merMod para ver la versión específica del paquete. La salida de lmerse almacena en un objeto de clase merMod.
EdM
44
Una de las bellezas de R es que una función como predictsabe qué hacer dependiendo de la clase del objeto sobre el que está llamado a actuar. Estabas llamando predict.merMod, simplemente no lo sabías.
EdM

Respuestas:

25

Es fácil confundirse con la presentación de coeficientes cuando llama coef(fit2). Mira el resumen de 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

Hay una intersección general de 61.92 para el modelo, con un coeficiente de cafeína de 0.212. Entonces, para cafeína = 95, predice un retiro promedio de 82.06.

En lugar de usar coef, use ranefpara obtener la diferencia de cada intersección de efecto aleatorio de la intersección media en el siguiente nivel más alto de anidamiento:

> 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

Los valores para Jim en el tiempo = 0 diferirán de ese valor promedio de 82.06 por la suma de sus coeficientes Subject y los de él Time:Subject:

82.06+17.39+33.04=132.49

que creo que está dentro del error de redondeo de 132.46.

Los valores de intersección devueltos por coefparecen representar la intersección general más las diferencias específicas Subjecto Time:Subjectespecíficas, por lo que es más difícil trabajar con ellas; Si intentara hacer el cálculo anterior con los coefvalores, estaría contando dos veces la intercepción general.

EdM
fuente
¡Gracias! Esto fue excepcional! No creo que tenga sentido dejarlo abierto ... Esta es la respuesta, ¿no?
Antoni Parellada
Obtuve la pista al ranefexaminar el código R en lme4. Aclaré la presentación en un par de lugares.
EdM
(+1) Nota: los efectos aleatorios de tiempo anidados dentro de la persona de alguna manera se ven raros.
Michael M
@MichaelM: Sí, los datos presentados parecen ser cruzados (Tiempo x Asunto) en lugar de un diseño anidado, pero esta es la forma en que el OP planteó la cuestión de cómo interpretar la lme4salida. Además, los datos presentados parecían ser para ilustración y no como un estudio real para analizar.
EdM