In der lmer
Funktion in lme4
in R
gibt es einen Aufruf zum Erstellen einer Modellmatrix von Zufallseffekten , wie hier auf den Seiten 7 bis 9 erläutert .
Die Berechnung von beinhaltet KhatriRao- und / oder Kronecker-Produkte aus zwei Matrizen, J_i und X_i .
Die Matrix 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 Matrix scheint als Selektor für Messungen in der unteren Hierarchieebene zu fungieren, so dass die Kombination beider "Selektoren" eine Matrix 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:
Aber ist die Transponierte davon:
(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 sleepstudy
in 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 sleepstudy
Beispiel ü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)
}
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 309
für die Grundlinie + neun Beobachtungen eingeschaltet, also erhält es vier 1
und so weiter. Der zweite Teil ist eindeutig die tatsächliche Messung: 0
für den Ausgangswert, 1
fü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?
Hier ist eine Möglichkeit,
Das Problem ist, dass es nicht das Transponierte ist, wie es die lmer
Funktion zu fordern scheint, und immer noch unklar ist, welche Regeln zum Erstellen von .
quelle
mkZt()
(danach sucht hier ) ist ein guter Anfang?Antworten:
309
330
371
nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10
f <- gl(3,10)
Ji<-t(as(f,Class="sparseMatrix"))
Das der Matrix kann mithilfe der Funktion als Referenz unterstützt werden: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")
Da wir die Transponierung benötigen und das Objekt
Xi
keine Matrix ist,t(Xi)
kann das wie folgt erstellt werden:t_Xi <- rbind(c(rep(1,30)),c(rep(0:9,3)))
Zi<-t(KhatriRao(t_Ji,t_Xi))
::Dies entspricht die Gleichung (6) in dem Originalpapier :
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:JTi XTi
Und
b <- getME(fm1,"b")
Wenn wir diese Werte zu den festen Effekten des Aufrufs hinzufügen, erhalten
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
wir die Abschnitte:und die Pisten:
Werte im Einklang mit:
as.matrix(Zi)%*%b
.quelle