Matryce modelowe dla modeli efektów mieszanych

10

W lmerfunkcji w lme4w Ristnieje wezwanie do skonstruowania matrycy modelu efektów przypadkowych, Z , jak opisano tutaj , na stronach 7 - 9.

Obliczanie obejmuje produkty KhatriRao i / lub Kronecker dwóch matryc, i . J i X iZJiXi

Macierz to kęs: „Macierz wskaźników wskaźników współczynnika grupowania”, ale wydaje się, że jest to rzadka macierz z fałszywym kodowaniem do wyboru, która jednostka (na przykład podmioty w powtarzalnych pomiarach) odpowiadająca wyższym poziomom hierarchicznym jest „włączona” dla każda obserwacja. matrycy wydaje się działać jako selektor pomiarów na niższy poziom hierarchiczny, tak że „połączenie obu przełączników” dawałyby macierzy formy przedstawionej na papier za pomocą następującego przykładu: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

Transponowanie każdej z tych macierzy i wykonanie mnożenia Khatri-Rao:

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

Ale to transpozycja: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

Okazuje się, że autorzy korzystają z bazy danych sleepstudyw lme4, ale tak naprawdę nie rozwijają matryc projektowych, ponieważ odnoszą się one do tego konkretnego badania. Staram się więc zrozumieć, w jaki sposób skompilowany kod w powyższym artykule przełożyłby się na bardziej znaczący sleepstudyprzykład.

Dla uproszczenia wizualnego ograniczyłem zestaw danych do zaledwie trzech tematów - „309”, „330” i „371”:

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

Każda osoba wykazywałaby zupełnie inne przechwytywanie i nachylenie, gdyby prosta regresja OLS była rozpatrywana indywidualnie, co sugeruje potrzebę modelu mieszanego z wyższą hierarchią lub poziomem jednostek odpowiadającym badanym:

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

wprowadź opis zdjęcia tutaj

Wywołanie regresji z efektem mieszanym to:

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

A macierz wyodrębniona z funkcji daje następujące:

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

Wydaje się to słuszne, ale jeśli tak, to czym jest algebra liniowa? Rozumiem, że wiersze 1to wybór osób takich jak. Na przykład, temat 309jest włączony dla linii bazowej + dziewięć obserwacji, więc dostaje cztery 1i tak dalej. Druga część jest wyraźnie faktycznym pomiarem: 0dla wartości początkowej, 1pierwszego dnia pozbawienia snu itp.

Ale jakie są rzeczywiste i oraz odpowiadające im lub , cokolwiek jest istotny?X i Z i = ( J T iX T i ) Z i = (Ji Xi Zi=(JiTXiT) Zi=(JiTXiT)

Oto możliwość

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

[1111111111....................012)3)456789.............................1111111111...................012)3)456789..............................1111111111...................012)3)456789]

Problem polega na tym, że nie jest to transponowana, jak się lmerwydaje, funkcja wymaga i nadal nie jest jasne, jakie reguły mają tworzyć .Xja

Antoni Parellada
źródło
1
Jest to o wiele łatwiejsze niż się wydaje. matrycy tutaj jest po prostu (transpozycją) produkt Kronecker z matrycy identyczny z matrycy projektu. Z
Donnie
Dziękuję za podpowiedź. Nadal będę pracować nad zrozumieniem wszystkich sub-indków w liniowym szkielecie algebry tej funkcji. Jeśli zatrzaśnie się na miejscu, odpowiem na własne pytanie, ale choć wiem, że jest to bardzo proste, zgodność między nomenklaturą rusztowań matematycznych a stosowaniem do jakiegokolwiek przykładu jest myląca.
Antoni Parellada,
1
Innym dobrym zasobem dla Ciebie może być ich implementacja lme4pureR , która następuje wraz z powyższą winietą i jest napisana w całości w R. Może mkZt()(poszukaj tutaj ) to dobry początek?
alexforrence

Odpowiedzi:

5
  1. Tworzenie matrycy wymaga wytwarzania 3 (poziom , i ) każdy z 10 pomiarów i obserwacji ( ). Zgodnie z kodem w oryginalnym linku w PO:jotja309330371nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10

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

wprowadź opis zdjęcia tutaj

  1. Budowanie macierzy można wspomóc za pomocą funkcji jako odniesienia:XjagetME

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

wprowadź opis zdjęcia tutaj

Ponieważ potrzebujemy transpozycji, a obiekt Xinie jest macierzą, t(Xi)można go zbudować jako:

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

  1. Zja oblicza się jako :Zja=(jotjaT.XjaT.)

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

wprowadź opis zdjęcia tutaj

Odpowiada to równaniu (6) w oryginalnej pracy :

Zja=(jotjaT.XjaT.)T.=[jotja1T.Xja1T.jotja2)T.Xja2)T.jotjanT.XjanT.]

Aby to zobaczyć, możemy zamiast tego bawić się obciętymi i , wyobrażając sobie, że zamiast 9 pomiarów i linii bazowej (0), jest tylko 1 pomiar (i linia bazowa). Otrzymane macierze to:jotjaT.XjaT.

X T i = [ 1 1 1 1 1 1 0 1 0 1 0 1 ]jotjaT.=[110000001100000011] i .XjaT.=[111111010101]

I

jotjaT.XjaT.=[(100)(10)(100)(11)(010)(10)(010)(11)(001)(10)(001)(11)]

=[jotja1T.Xja1T.jotja2)T.Xja2)T.jotja3)T.Xja3)T.jotja4T.Xja4T.jotja5T.Xja5T.jotja6T.Xja6T.]

=[110000010000001100000100000011000001] . Które transponowane i rozszerzone spowodują, że .Zja=[10000011000012)00000010000011000012)00000010000011000012)]

  1. Wyodrębnienie wektora współczynników efektów losowych można wykonać za pomocą funkcji:b

b <- getME(fm1,"b")

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

Jeśli dodamy te wartości do stałych efektów wywołania fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy), otrzymamy przechwyty:

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

i stoki:

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

wartości zgodne z:

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

wprowadź opis zdjęcia tutaj

  1. Zb można obliczyć jako as.matrix(Zi)%*%b.
Antoni Parellada
źródło