Dans la lmer
fonction au sein lme4
de R
il y a un appel à la construction d' une matrice de modèle d'effets aléatoires, , comme expliqué ici , pages 7 - 9.
Le calcul de implique les produits de KhatriRao et / ou Kronecker de deux matrices, et . J i X i
La matrice est une bouchée: "Matrice indicatrice d'indices de facteurs de regroupement", mais il semble que ce soit une matrice clairsemée avec un codage fictif pour sélectionner quelle unité (par exemple, les sujets dans les mesures répétitives) correspondant aux niveaux hiérarchiques supérieurs est "activée" pour toute observation. La matrice semble agir comme un sélecteur de mesures au niveau hiérarchique inférieur, de sorte que la combinaison des deux "sélecteurs" produirait une matrice, de la forme illustrée dans l'article via l'exemple suivant:X i Z i
(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
Transposer chacune de ces matrices et effectuer une multiplication de Khatri-Rao:
Mais est la transposition:
(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
Il s'avère que les auteurs utilisent la base sleepstudy
de données lme4
mais ne développent pas vraiment les matrices de conception telles qu'elles s'appliquent à cette étude particulière. J'essaie donc de comprendre comment le code composé dans le document reproduit ci-dessus se traduirait en un sleepstudy
exemple plus significatif .
Pour des raisons de simplicité visuelle, j'ai réduit l'ensemble de données à seulement trois sujets - "309", "330" et "371":
require(lme4)
sleepstudy <- sleepstudy[sleepstudy$Subject %in% c(309, 330, 371), ]
rownames(sleepstudy) <- NULL
Chaque individu présenterait une interception et une pente très différentes si une régression OLS simple était envisagée individuellement, suggérant la nécessité d'un modèle à effets mixtes avec la hiérarchie ou le niveau d'unité supérieur correspondant aux sujets:
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)
}
L'appel de régression à effets mixtes est le suivant:
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
Et la matrice extraite de la fonction donne les résultats suivants:
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
Cela semble vrai, mais si c'est le cas, quelle est l'algèbre linéaire derrière elle? Je comprends que les rangées de 1
sont la sélection d'individus comme. Par exemple, le sujet 309
est activé pour la ligne de base + neuf observations, il obtient donc quatre 1
et ainsi de suite. La deuxième partie est clairement la mesure réelle: 0
pour la ligne de base, 1
pour le premier jour de privation de sommeil, etc.
Mais quelles sont les matrices et réelles et les ou , selon le cas est pertinent?
Voici une possibilité,
Le problème est que ce n'est pas le transposé comme la lmer
fonction semble le demander, et on ne sait toujours pas quelles sont les règles pour créer .
la source
mkZt()
(recherchez-la ici ) est un bon début?Réponses:
309
330
371
nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10
f <- gl(3,10)
Ji<-t(as(f,Class="sparseMatrix"))
La construction de la matrice peut être facilitée en utilisant la fonction comme référence:Xi
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")
Puisque nous aurons besoin de la transposition, et que l'objet
Xi
n'est pas une matrice, let(Xi)
peut être construit comme:t_Xi <- rbind(c(rep(1,30)),c(rep(0:9,3)))
Zi<-t(KhatriRao(t_Ji,t_Xi))
:Cela correspond à l'équation (6) dans le document original :
Et pour voir cela, nous pouvons plutôt jouer avec les et tronquées en imaginant qu'au lieu de 9 mesures et d'une ligne de base (0), il n'y a qu'une seule mesure (et une ligne de base). Les matrices résultantes seraient:JTi XTi
Et
b <- getME(fm1,"b")
Si nous ajoutons ces valeurs aux effets fixes de l'appel,
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
nous obtenons les interceptions:et les pistes:
valeurs cohérentes avec:
as.matrix(Zi)%*%b
.la source