Matrices de modèles pour les modèles à effets mixtes

10

Dans la lmerfonction au sein lme4de Ril y a un appel à la construction d' une matrice de modèle d'effets aléatoires, , comme expliqué ici , pages 7 - 9.Z

Le calcul de implique les produits de KhatriRao et / ou Kronecker de deux matrices, et . J i X iZJiXi

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 iJiXiZi

(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:

[11......11......11][111111111111]=[11....11......11....11......11....11]

Mais est la transposition:Zi

(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 sleepstudyde données lme4mais 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 sleepstudyexemple 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)
        }

entrez la description de l'image ici

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 1sont la sélection d'individus comme. Par exemple, le sujet 309est activé pour la ligne de base + neuf observations, il obtient donc quatre 1et ainsi de suite. La deuxième partie est clairement la mesure réelle: 0pour la ligne de base, 1pour le premier jour de privation de sommeil, etc.

Mais quelles sont les matrices et réelles et les ou , selon le cas est pertinent?Ji Xi Zi=(JiTXiT) Zi=(JiTXiT)

Voici une possibilité,

[1111111111..............................1111111111.............................1111111111][11111111110123456789]=

[1111111111....................0123456789.............................1111111111...................0123456789..............................1111111111...................0123456789]

Le problème est que ce n'est pas le transposé comme la lmerfonction semble le demander, et on ne sait toujours pas quelles sont les règles pour créer .Xi

Antoni Parellada
la source
1
C'est beaucoup plus facile que vous ne le pensez. La matrice ici est simplement la (transposition de) le produit Kronecker d'une matrice d'identité avec la matrice de conception. Z
Donnie
Merci pour votre indice. Je continuerai de travailler à donner un sens à tous les sous-indices dans le squelette d'algèbre linéaire de cette fonction. S'il clique, j'irai de l'avant et répondrai à ma propre question, mais bien que je sache que c'est simple et profond, la correspondance entre la nomenclature des échafaudages mathématiques et l'application à n'importe quel exemple prête à confusion.
Antoni Parellada
1
Une autre bonne ressource pour vous pourrait être leur implémentation lme4pureR , qui suit avec la vignette ci-dessus et est entièrement écrite en R. Peut-être mkZt()(recherchez-la ici ) est un bon début?
alexforrence

Réponses:

5
  1. La création de la matrice implique la production de 3 niveaux ( , et ) chacun avec 10 observations ou mesures ( ). En suivant le code dans le lien d'origine dans l'OP:Ji309330371nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10

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

entrez la description de l'image ici

  1. La construction de la matrice peut être facilitée en utilisant la fonction comme référence:XigetME

    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")

entrez la description de l'image ici

Puisque nous aurons besoin de la transposition, et que l'objet Xin'est pas une matrice, le t(Xi)peut être construit comme:

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

  1. Zi est calculé comme :Zi=(JiTXiT)

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

entrez la description de l'image ici

Cela correspond à l'équation (6) dans le document original :

Zi=(JiTXiT)T=[Ji1TXi1TJi2TXi2TJinTXinT]

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:JiTXiT

JiT=[110000001100000011] et .XiT=[111111010101]

Et

JiTXiT=[(100)(10)(100)(11)(010)(10)(010)(11)(001)(10)(001)(11)]

=[Ji1TXi1TJi2TXi2TJi3TXi3TJi4TXi4TJi5TXi5TJi6TXi6T]

=[110000010000001100000100000011000001] . Laquelle transposée et étendue donnerait .Zi=[100000110000120000001000001100001200000010000011000012]

  1. Extraire le vecteur des coefficients d'effets aléatoires peut se faire avec la fonction:b

b <- getME(fm1,"b")

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

Si nous ajoutons ces valeurs aux effets fixes de l'appel, fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)nous obtenons les interceptions:

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

et les pistes:

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

valeurs cohérentes avec:

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

entrez la description de l'image ici

  1. Zb peut être calculé comme as.matrix(Zi)%*%b.
Antoni Parellada
la source