Matrici modello per modelli a effetti misti


10

Nella lmerfunzione all'interno lme4di Rc'è un invito a costruire una matrice modello di effetti casuali, , come spiegato qui , pagine 7 - 9.Z

Il calcolo di comporta i prodotti KhatriRao e / o Kronecker di due matrici, J_i e X_i . ZJiXi

La matrice è un boccone: " Matrice di indici di fattore di raggruppamento", ma sembra essere una matrice sparsa con codifica fittizia per selezionare quale unità (ad esempio, soggetti in misurazioni ripetitive) corrispondente a livelli gerarchici più alti sono "accesi" per qualsiasi osservazione. La matrice sembra agire come un selettore di misure nel livello gerarchico inferiore, in modo che la combinazione di entrambi i "selettori" produca una matrice, della forma illustrata nel documento attraverso il seguente esempio:JiXiZi

(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

Trasposizione di ciascuna di queste matrici ed esecuzione di una moltiplicazione Khatri-Rao:

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

Ma è la trasposizione:Zio

(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

Si scopre che gli autori fanno uso del database sleepstudyin lme4, ma non elaborano realmente le matrici di progettazione mentre si applicano a questo studio particolare. Quindi sto cercando di capire come il codice inventato nel documento riprodotto sopra si tradurrebbe nell'esempio più significativo sleepstudy.

Per semplicità visiva ho ridotto il set di dati a soli tre soggetti: "309", "330" e "371":

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

Ogni individuo mostrerebbe un'intercettazione e una pendenza molto diverse se una semplice regressione OLS fosse presa in considerazione individualmente, suggerendo la necessità di un modello a effetti misti con la gerarchia o il livello di unità superiore corrispondente ai soggetti:

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

inserisci qui la descrizione dell'immagine

La chiamata di regressione ad effetto misto è:

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

E la matrice estratta dalla funzione produce quanto segue:

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

Sembra giusto, ma se lo è, qual è l'algebra lineare dietro di essa? Capisco le file di 1come la selezione di individui piace. Ad esempio, il soggetto 309è attivo per la linea di base + nove osservazioni, quindi ottiene quattro 1e così via. La seconda parte è chiaramente la misurazione effettiva: 0per il basale, 1per il primo giorno di privazione del sonno, ecc.

Ma quali sono le attuali matrici e e la corrispondente o , a seconda di quale è pertinente?X i Z i = ( J T iX T i ) Z i = ( J TJio Xio Zio=(JioT*XioT) Zio=(JioTXioT)

Ecco una possibilità,

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

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

Il problema è che non è trasposto come lmersembra richiedere la funzione, e non è ancora chiaro quali siano le regole per creare .Xio


1
Questo è molto più facile di quanto tu stia immaginando di essere. La matrice qui è semplicemente il (trasposizione di) il prodotto Kronecker di una matrice di identità con la matrice di progettazione. Z
Donnie,

Grazie per il tuo suggerimento. Continuerò a lavorare sul senso di tutti i sottoindici nello scheletro algebrico lineare di questa funzione. Se scatta in posizione, vado avanti e rispondo alla mia domanda, ma anche se so che è molto semplice, la corrispondenza tra la nomenclatura dei ponteggi matematici e l'applicazione a qualsiasi esempio è confusa.
Antoni Parellada,

1
Un'altra buona risorsa per te potrebbe essere la loro implementazione lme4pureR , che segue la vignetta sopra ed è scritta interamente in R. Forse mkZt()( cercala qui ) è un buon inizio?
alexforrence,

Risposte:


5
  1. Creazione del matrice comporta la produzione di 3 livelli ( , e ) ciascuna con 10 osservazioni o misurazioni ( ). Seguendo il codice nel link originale nell'OP:Jio309330371nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10

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

inserisci qui la descrizione dell'immagine

  1. La costruzione della matrice può essere aiutata usando la funzione come riferimento:XiogetME

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

inserisci qui la descrizione dell'immagine

Poiché avremo bisogno del recepimento e l'oggetto Xinon è una matrice, è t(Xi)possibile creare come:

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

  1. Zio è calcolato come :Zio=(JioT*XioT)

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

inserisci qui la descrizione dell'immagine

Ciò corrisponde all'equazione (6) nel documento originale :

Zio=(JioT*XioT)T=[Jio1TXio1TJio2TXio2TJionTXionT]

E per vedere questo possiamo invece giocare con le troncate e immaginando che invece di 9 misurazioni e una linea di base (0), ci sia solo 1 misura (e una linea di base). Le matrici risultanti sarebbero:JioTXioT

JioT=[110000001100000011] e .XioT=[111111010101]

E

JioT*XioT=[(100)(10)(100)(11)(010)(10)(010)(11)(001)(10)(001)(11)]

=[Jio1TXio1TJio2TXio2TJio3TXio3TJio4TXio4TJio5TXio5TJio6TXio6T]

=[110000010000001100000100000011000001] . Quale trasposto ed esteso comporterebbe .Zio=[100000110000120000001000001100001200000010000011000012]

  1. L'estrazione del vettore di coefficienti di effetti casuali può essere effettuata con la funzione:B

b <- getME(fm1,"b")

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

Se aggiungiamo questi valori agli effetti fissi della chiamata fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)otteniamo le intercettazioni:

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

e le piste:

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

valori coerenti con:

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

inserisci qui la descrizione dell'immagine

  1. ZB può essere calcolato come as.matrix(Zi)%*%b.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.