Matrices de modelos para modelos de efectos mixtos

10

En la lmerfunción dentro lme4de Rhay una llamada para la construcción de una matriz de modelo de efectos aleatorios, , como se explica aquí , páginas 7 - 9.Z

El cálculo de implica productos de KhatriRao y / o Kronecker de dos matrices, y . ZJyoXyo

La matriz es un bocado: "matriz indicadora de índices de factores de agrupación", pero parece ser una matriz dispersa con codificación ficticia para seleccionar qué unidad (por ejemplo, sujetos en mediciones repetitivas) correspondientes a niveles jerárquicos superiores están "activados" para cualquier observación La matriz parece actuar como un selector de medidas en el nivel jerárquico inferior, de modo que la combinación de ambos "selectores" produciría una matriz, de la forma ilustrada en el documento a través del siguiente ejemplo:JyoXyoZyo

(f<-gl(3,2))

[1] 1 1 2 2 3 3
Levels: 1 2 3

(Ji<-t(as(f,Class="sparseMatrix")))

6 x 3 sparse Matrix of class "dgCMatrix"
     1 2 3
[1,] 1 . .
[2,] 1 . .
[3,] . 1 .
[4,] . 1 .
[5,] . . 1
[6,] . . 1

(Xi<-cbind(1,rep.int(c(-1,1),3L)))
     [,1] [,2]
[1,]    1   -1
[2,]    1    1
[3,]    1   -1
[4,]    1    1
[5,]    1   -1
[6,]    1    1

Transponiendo cada una de estas matrices y realizando una multiplicación Khatri-Rao:

[11......11......11][111111-11-11-11]=[11....-11......11....-11......11....-11]

Pero es la transposición de la misma:Zyo

(Zi<-t(KhatriRao(t(Ji),t(Xi))))

6 x 6 sparse Matrix of class "dgCMatrix"

[1,] 1 -1 .  . .  .
[2,] 1  1 .  . .  .
[3,] .  . 1 -1 .  .
[4,] .  . 1  1 .  .
[5,] .  . .  . 1 -1
[6,] .  . .  . 1  1

Resulta que los autores hacen uso de la base sleepstudyde datos lme4, pero en realidad no detallan las matrices de diseño que se aplican a este estudio en particular. Así que estoy tratando de entender cómo el código inventado en el documento reproducido anteriormente se traduciría en el sleepstudyejemplo más significativo .

Por simplicidad visual, he reducido el conjunto de datos a solo tres temas: "309", "330" y "371":

require(lme4)
sleepstudy <- sleepstudy[sleepstudy$Subject %in% c(309, 330, 371), ]
rownames(sleepstudy) <- NULL

Cada individuo exhibiría una intersección y pendiente muy diferentes si se considerara una regresión OLS simple individualmente, lo que sugiere la necesidad de un modelo de efectos mixtos con la jerarquía más alta o el nivel de unidad correspondiente a los sujetos:

    par(bg = 'peachpuff')
    plot(1,type="n", xlim=c(0, 12), ylim=c(200, 360),
             xlab='Days', ylab='Reaction')
    for (i in sleepstudy$Subject){
            fit<-lm(Reaction ~ Days, sleepstudy[sleepstudy$Subject==i,])
            lines(predict(fit), col=i, lwd=3)
            text(x=11, y=predict(fit, data.frame(Days=9)), cex=0.6,labels=i)
        }

ingrese la descripción de la imagen aquí

La llamada de regresión de efectos mixtos es:

fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)

Y la matriz extraída de la función produce lo siguiente:

parsedFormula<-lFormula(formula= Reaction~Days+(Days|Subject),data= sleepstudy)
parsedFormula$reTrms

$Ztlist
$Ztlist$`Days | Subject`
6 x 12 sparse Matrix of class "dgCMatrix"

309 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . .
309 0 1 2 3 4 5 6 7 8 9 . . . . . . . . . . . . . . . . . . . .
330 . . . . . . . . . . 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . .
330 . . . . . . . . . . 0 1 2 3 4 5 6 7 8 9 . . . . . . . . . .
371 . . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 1 1 1 1 1
371 . . . . . . . . . . . . . . . . . . . . 0 1 2 3 4 5 6 7 8 9

Esto parece correcto, pero si es así, ¿qué es el álgebra lineal detrás de él? Entiendo que las filas de 1ser la selección de individuos como. Por ejemplo, el tema 309está activado para la línea de base + nueve observaciones, por lo que obtiene cuatro 1y así sucesivamente. La segunda parte es claramente la medida real: 0para la línea de base, 1para el primer día de privación del sueño, etc.

Jyo Xyo Zyo=(JyoTXyoT) Zyo=(JyoTXyoT)

Aquí hay una posibilidad,

[1111111111..............................1111111111.............................1111111111][11111111110 01234 45 56 67 789 9]=

[1111111111....................0 01234 45 56 67 789 9.............................1111111111...................0 01234 45 56 67 789 9..............................1111111111...................0 01234 45 56 67 789 9]

lmerXyo

Antoni Parellada
fuente
1
Z
Gracias por tu pista Seguiré trabajando para dar sentido a todas las subdependencias en el esqueleto de álgebra lineal de esta función. Si hace clic en su lugar, continuaré y responderé mi propia pregunta, pero aunque sé que es muy simple, la correspondencia entre la nomenclatura de andamios matemáticos y la aplicación a cualquier ejemplo es confusa.
Antoni Parellada
1
Otro buen recurso para usted podría ser su implementación lme4pureR , que sigue junto con la viñeta anterior y está escrita completamente en R. ¿Quizás mkZt()( búsquela aquí ) es un buen comienzo?
alexforrence

Respuestas:

5
  1. Jyo309330371nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10

f <- gl(3,10) Ji<-t(as(f,Class="sparseMatrix"))

ingrese la descripción de la imagen aquí

  1. XyogetME

    library(lme4) sleepstudy <- sleepstudy[sleepstudy$Subject %in% c(309, 330, 371), ] rownames(sleepstudy) <- NULL fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)

Xi <- getME(fm1,"mmList")

ingrese la descripción de la imagen aquí

Como necesitaremos la transposición, y el objeto Xino es una matriz, t(Xi)se puede construir como:

t_Xi <- rbind(c(rep(1,30)),c(rep(0:9,3)))

  1. ZyoZyo=(JyoTXyoT)

Zi<-t(KhatriRao(t_Ji,t_Xi)):

ingrese la descripción de la imagen aquí

Esto corresponde a la ecuación (6) en el documento original :

Zyo=(JyoTXyoT)T=[Jyo1TXyo1TJyo2TXyo2TJyonorteTXyonorteT]

JyoTXyoT

JyoT=[110 00 00 00 00 00 0110 00 00 00 00 00 011]XyoT=[1111110 010 010 01]

Y

JyoTXyoT=[(10 00 0)(10 0)(10 00 0)(11)(0 010 0)(10 0)(0 010 0)(11)(0 00 01)(10 0)(0 00 01)(11)]

=[Jyo1TXyo1TJyo2TXyo2TJyo3TXyo3TJyo4 4TXyo4 4TJyo5 5TXyo5 5TJyo6 6TXyo6 6T]

=[110 00 00 00 00 010 00 00 00 00 00 0110 00 00 00 00 010 00 00 00 00 00 0110 00 00 00 00 01]Zyo=[10 00 00 00 00 0110 00 00 00 0120 00 00 00 00 00 010 00 00 00 00 0110 00 00 00 0120 00 00 00 00 00 010 00 00 00 00 0110 00 00 00 012]

  1. si

b <- getME(fm1,"b")

[1,] -44.1573839
[2,]  -2.4118590
[3,]  32.8633489
[4,]  -0.3998801
[5,]  11.2940350
[6,]   2.8117392

Si agregamos estos valores a los efectos fijos de la llamada fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy), obtenemos las intersecciones:

205.3016 for 309; 282.3223 for 330; and 260.7530 for 371

y las pistas:

2.407141 for 309; 4.419120 for 330; and 7.630739 for 371

valores consistentes con:

library(lattice)
xyplot(Reaction ~ Days | Subject, groups = Subject, data = sleepstudy, 
       pch=19, lwd=2, type=c('p','r'))

ingrese la descripción de la imagen aquí

  1. Zsias.matrix(Zi)%*%b
Antoni Parellada
fuente