У lmer
функції всередині lme4
в R
є виклик для побудови матричної моделі випадкових ефектів , як пояснено тут , на сторінках 7 - 9.
Обчислення тягне за собою продукти ХатріРао та / або Кронекера з двох матриць, та .
Матриця є виразною: "Показникова матриця групування факторних індексів", але, здається, це розріджена матриця з фіктивним кодуванням, щоб вибрати, яку одиницю (наприклад, суб'єкти в повторних вимірюваннях), що відповідають вищим ієрархічним рівням, "включено" для будь-якого спостереження. матриця , здається, діє як селектор вимірювань в нижньому ієрархічному рівні, так що поєднання обох «селектор» дасть матрицю, від форми , показаної на папері з допомогою наступного прикладу:
(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
Транспонування кожної з цих матриць та виконання множення Хатрі-Рао:
Але є його транспозитом:
(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
Виявляється, автори використовують базу даних sleepstudy
у lme4
, але не дуже детально розробляють матриці дизайну, оскільки вони застосовуються до цього конкретного дослідження. Тому я намагаюся зрозуміти, як складений код у відтвореному вище документі перетворюється на більш змістовний sleepstudy
приклад.
Для візуальної простоти я скоротив набір даних лише до трьох предметів - "309", "330" і "371":
require(lme4)
sleepstudy <- sleepstudy[sleepstudy$Subject %in% c(309, 330, 371), ]
rownames(sleepstudy) <- NULL
Кожна людина проявлятиме дуже різний перехват і нахил, якщо просту регресію OLS розглядати індивідуально, що говорить про необхідність моделі змішаного ефекту з вищою ієрархією або рівнем одиниці, що відповідає суб'єктам:
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)
}
Виклик регресії змішаного ефекту:
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
А матриця, витягнута з функції, дає наступне:
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
Це здається правильним, але якщо воно є, то за якою лінійною алгеброю? Я розумію, що рядки 1
's - це вибір людей. Наприклад, тема 309
включена для базової лінії + дев'ять спостережень, тому вона отримує чотири 1
і так далі. Друга частина явно є фактичним вимірюванням: 0
для базового рівня, 1
для першого дня позбавлення сну тощо.
Ось така можливість,
lmer
mkZt()
(шукайте її тут ) вдалий початок?