En la lmer
función dentro lme4
de R
hay una llamada para la construcción de una matriz de modelo de efectos aleatorios, , como se explica aquí , páginas 7 - 9.
El cálculo de implica productos de KhatriRao y / o Kronecker de dos matrices, y .
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:
(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:
Pero es la transposición de la misma:
(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 sleepstudy
de 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 sleepstudy
ejemplo 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)
}
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 1
ser la selección de individuos como. Por ejemplo, el tema 309
está activado para la línea de base + nueve observaciones, por lo que obtiene cuatro 1
y así sucesivamente. La segunda parte es claramente la medida real: 0
para la línea de base, 1
para el primer día de privación del sueño, etc.
Aquí hay una posibilidad,
lmer
fuente
mkZt()
( búsquela aquí ) es un buen comienzo?Respuestas:
309
330
371
nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10
f <- gl(3,10)
Ji<-t(as(f,Class="sparseMatrix"))
getME
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")
Como necesitaremos la transposición, y el objeto
Xi
no es una matriz,t(Xi)
se puede construir como:t_Xi <- rbind(c(rep(1,30)),c(rep(0:9,3)))
Zi<-t(KhatriRao(t_Ji,t_Xi))
:Esto corresponde a la ecuación (6) en el documento original :
Y
b <- getME(fm1,"b")
Si agregamos estos valores a los efectos fijos de la llamada
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
, obtenemos las intersecciones:y las pistas:
valores consistentes con:
as.matrix(Zi)%*%b
fuente