Dalam lmer
fungsi di lme4
dalam R
ada panggilan untuk membangun model matriks efek acak, , seperti yang dijelaskan di sini , halaman 7 - 9.
Menghitung mensyaratkan KhatriRao dan / atau produk Kronecker dari dua matriks, dan X_i . J i X i
Matriks adalah suap: "Matriks indikator indeks faktor pengelompokan", tetapi tampaknya matriks jarang dengan pengkodean dummy untuk memilih unit mana (misalnya, subjek dalam pengukuran berulang) yang sesuai dengan tingkat hirarki yang lebih tinggi "on" untuk observasi apa pun. The matriks tampaknya bertindak sebagai pemilih pengukuran di tingkat hirarki yang lebih rendah, sehingga kombinasi keduanya "selektor" akan menghasilkan sebuah matriks, dari bentuk digambarkan di koran melalui contoh berikut:
(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
Transposing masing-masing matriks ini, dan melakukan perkalian Khatri-Rao:
Tapi adalah transposnya:
(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
Ternyata penulis menggunakan database sleepstudy
di lme4
, tetapi tidak benar-benar menguraikan matriks desain sebagai mereka berlaku untuk studi tertentu. Jadi saya mencoba memahami bagaimana kode yang dibuat dalam kertas yang direproduksi di atas akan diterjemahkan menjadi contoh yang lebih bermakna sleepstudy
.
Untuk kesederhanaan visual saya telah mengurangi set data menjadi hanya tiga mata pelajaran - "309", "330" dan "371":
require(lme4)
sleepstudy <- sleepstudy[sleepstudy$Subject %in% c(309, 330, 371), ]
rownames(sleepstudy) <- NULL
Setiap individu akan menunjukkan intersep dan kemiringan yang sangat berbeda jika regresi OLS sederhana dipertimbangkan secara individual, menunjukkan perlunya model efek-campuran dengan hierarki yang lebih tinggi atau tingkat unit yang sesuai dengan subjek:
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)
}
Panggilan regresi efek campuran adalah:
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
Dan matriks yang diekstrak dari fungsi menghasilkan yang berikut:
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
Ini kelihatannya benar, tetapi jika ya, apa aljabar linier di belakangnya? Saya mengerti barisan yang 1
menjadi seleksi individu suka. Misalnya, subjek 309
aktif untuk baseline + sembilan pengamatan, sehingga mendapat empat 1
dan seterusnya. Bagian kedua jelas merupakan pengukuran aktual: 0
untuk baseline, 1
untuk hari pertama kurang tidur, dll.
Tapi apa matriks dan aktual dan yang sesuai atau , mana pun Apakah relevan?X i Z i = ( J T i ∗ X T i ) ⊤ Z i = ( J T i ⊗ X T i ) ⊤
Di sini ada kemungkinan,
Masalahnya adalah bahwa itu bukan ditranskripsikan sebagai lmer
fungsi tampaknya untuk memanggil, dan masih tidak jelas apa aturan untuk membuat .
sumber
mkZt()
(mencarinya di sini ) adalah awal yang baik?Jawaban:
309
330
371
nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10
f <- gl(3,10)
Ji<-t(as(f,Class="sparseMatrix"))
Membangun matriks dapat dibantu dengan menggunakan fungsi sebagai referensi:Xsaya
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")
Karena kita akan membutuhkan transpos, dan objek
Xi
bukan matriks, makat(Xi)
dapat dibangun sebagai:t_Xi <- rbind(c(rep(1,30)),c(rep(0:9,3)))
Zi<-t(KhatriRao(t_Ji,t_Xi))
:Ini sesuai dengan persamaan (6) dalam makalah asli :
Dan untuk melihat ini, kita bisa bermain dengan dan terpotong dengan membayangkan bahwa alih-alih 9 pengukuran dan garis dasar (0), hanya ada 1 pengukuran (dan garis dasar). Matriks yang dihasilkan adalah:JTsaya XTsaya
Dan
Z i = [ 1 0 0 0= ⎡⎣⎢100000110000001000001100000010000011⎤⎦⎥ . Yang dialihkan dan diperluas akan menghasilkan .Zsaya= ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢111⋮000⋮000⋮012000000000111000000012000000000111000000012⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
b <- getME(fm1,"b")
Jika kami menambahkan nilai-nilai ini ke efek-tetap panggilan
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
kami mendapatkan intersep:dan lereng:
nilai yang konsisten dengan:
as.matrix(Zi)%*%b
.sumber