Modellmatrizen für Modelle mit gemischten Effekten

10

In der lmerFunktion in lme4in Rgibt es einen Aufruf zum Erstellen einer Modellmatrix von Zufallseffekten , wie hier auf den Seiten 7 bis 9 erläutert .Z

Die Berechnung von beinhaltet KhatriRao- und / oder Kronecker-Produkte aus zwei Matrizen, J_i und X_i . ZJiXi

Die Matrix Ji ist ein Schluck: "Indikatormatrix der Gruppierungsfaktorindizes", aber es scheint eine spärliche Matrix mit Dummy-Codierung zu sein, um auszuwählen, für welche Einheit (z. B. Probanden in sich wiederholenden Messungen), die höheren Hierarchieebenen entsprechen, "Ein" ist jede Beobachtung. Die Xi Matrix scheint als Selektor für Messungen in der unteren Hierarchieebene zu fungieren, so dass die Kombination beider "Selektoren" eine Matrix Zi der in der Veröffentlichung dargestellten Form anhand des folgenden Beispiels ergeben würde:

(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

Transponieren jeder dieser Matrizen und Durchführen einer Khatri-Rao-Multiplikation:

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

Aber ist die Transponierte davon: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

Es stellt sich heraus, dass die Autoren die Datenbank sleepstudyin verwenden lme4, die Entwurfsmatrizen jedoch nicht wirklich näher erläutern, da sie für diese bestimmte Studie gelten. Ich versuche zu verstehen, wie sich der erfundene Code in dem oben wiedergegebenen Papier in ein aussagekräftigeres sleepstudyBeispiel übersetzen lässt.

Der Einfachheit halber habe ich den Datensatz auf nur drei Themen reduziert - "309", "330" und "371":

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

Jedes Individuum würde einen sehr unterschiedlichen Achsenabschnitt und eine ganz andere Steigung aufweisen, sollte eine einfache OLS-Regression einzeln betrachtet werden, was darauf hindeutet, dass ein Modell mit gemischten Effekten erforderlich ist, wobei die höhere Hierarchie oder Einheitenebene den Subjekten entspricht:

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

Geben Sie hier die Bildbeschreibung ein

Der Regressionsaufruf mit gemischten Effekten lautet:

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

Und die aus der Funktion extrahierte Matrix ergibt Folgendes:

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

Dies scheint richtig zu sein, aber wenn ja, welche lineare Algebra steckt dahinter? Ich verstehe, dass die Reihen von 1's die Auswahl von Individuen mögen. Zum Beispiel ist das Subjekt 309für die Grundlinie + neun Beobachtungen eingeschaltet, also erhält es vier 1und so weiter. Der zweite Teil ist eindeutig die tatsächliche Messung: 0für den Ausgangswert, 1für den ersten Tag des Schlafentzugs usw.

Aber was sind die tatsächlichen und Matrizen und die entsprechenden oder , je nachdem , was auch immer ist relevant?Ji Xi Zi=(JiTXiT) Zi=(JiTXiT)

Hier ist eine Möglichkeit,

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

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

Das Problem ist, dass es nicht das Transponierte ist, wie es die lmerFunktion zu fordern scheint, und immer noch unklar ist, welche Regeln zum Erstellen von .Xi

Antoni Parellada
quelle
1
Das ist viel einfacher, als Sie es sich vorstellen. Die Matrix ist hier einfach das Kronecker-Produkt einer Identitätsmatrix mit der Entwurfsmatrix. Z
Donnie
Vielen Dank für Ihren Hinweis. Ich werde weiter daran arbeiten, alle Unterunabhängigkeiten im linearen Algebra-Skelett dieser Funktion zu verstehen. Wenn es einrastet, werde ich meine eigene Frage beantworten, aber obwohl ich weiß, dass es sehr einfach ist, ist die Entsprechung zwischen der mathematischen Gerüstnomenklatur und der Anwendung auf ein Beispiel verwirrend.
Antoni Parellada
1
Eine weitere gute Ressource für Sie sein könnten ihre lme4pureR Implementierung, die zusammen mit der oben Vignette folgt und geschrieben wird vollständig in R. Vielleicht mkZt()(danach sucht hier ) ist ein guter Anfang?
Alexforrence

Antworten:

5
  1. Die Schaffung Matrix bringt 3 Ebenen Herstellung ( , und ) , die jeweils mit 10 Beobachtungen oder Messungen ( ). Folgen Sie dem Code im ursprünglichen Link im OP:Ji309330371nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10

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

Geben Sie hier die Bildbeschreibung ein

  1. Das der Matrix kann mithilfe der Funktion als Referenz unterstützt werden: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")

Geben Sie hier die Bildbeschreibung ein

Da wir die Transponierung benötigen und das Objekt Xikeine Matrix ist, t(Xi)kann das wie folgt erstellt werden:

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

  1. Zi wird berechnet als :Zi=(JiTXiT)

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

Geben Sie hier die Bildbeschreibung ein

Dies entspricht die Gleichung (6) in dem Originalpapier :

Zi=(JiTXiT)T=[Ji1TXi1TJi2TXi2TJinTXinT]

Und um dies zu sehen, können wir stattdessen mit abgeschnittenen und Matrizen spielen, indem wir uns vorstellen, dass es anstelle von 9 Messungen und einer Basislinie (0) nur 1 Messung (und eine Basislinie) gibt. Die resultierenden Matrizen wären:JiTXiT

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

Und

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

=[Ji1TXi1TJi2TXi2TJi3TXi3TJi4TXi4TJi5TXi5TJi6TXi6T]

=[110000010000001100000100000011000001] . Welche transponiert und erweitert würde zu .Zi=[100000110000120000001000001100001200000010000011000012]

  1. Das Extrahieren des Vektors von Zufallseffektkoeffizienten kann mit der folgenden Funktion erfolgen:b

b <- getME(fm1,"b")

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

Wenn wir diese Werte zu den festen Effekten des Aufrufs hinzufügen, erhalten fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)wir die Abschnitte:

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

und die Pisten:

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

Werte im Einklang mit:

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

Geben Sie hier die Bildbeschreibung ein

  1. Zb kann berechnet werden als as.matrix(Zi)%*%b.
Antoni Parellada
quelle