Matriks Model untuk Model Efek Campuran

10

Dalam lmerfungsi di lme4dalam Rada panggilan untuk membangun model matriks efek acak, , seperti yang dijelaskan di sini , halaman 7 - 9.Z

Menghitung mensyaratkan KhatriRao dan / atau produk Kronecker dari dua matriks, dan X_i . J i X iZJiXi

Matriks Ji 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 Xi matriks tampaknya bertindak sebagai pemilih pengukuran di tingkat hirarki yang lebih rendah, sehingga kombinasi keduanya "selektor" akan menghasilkan sebuah matriks, Zi 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:

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

Tapi adalah transposnya: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

Ternyata penulis menggunakan database sleepstudydi 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)
        }

masukkan deskripsi gambar di sini

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 1menjadi seleksi individu suka. Misalnya, subjek 309aktif untuk baseline + sembilan pengamatan, sehingga mendapat empat 1dan seterusnya. Bagian kedua jelas merupakan pengukuran aktual: 0untuk baseline, 1untuk hari pertama kurang tidur, dll.

Tapi apa matriks dan aktual dan yang sesuai atau , mana pun Apakah relevan?X i Z i = ( J T iX T i ) Z i = ( J T iX T i ) Ji Xi Zi=(JiTXiT) Zi=(JiTXiT)

Di sini ada kemungkinan,

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

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

Masalahnya adalah bahwa itu bukan ditranskripsikan sebagai lmerfungsi tampaknya untuk memanggil, dan masih tidak jelas apa aturan untuk membuat .Xi

Antoni Parellada
sumber
1
Ini jauh lebih mudah daripada yang Anda lakukan. The matriks sini adalah hanya (transpose dari) produk Kronecker dari matriks identitas dengan matriks desain. Z
Donnie
Terima kasih atas petunjuknya. Saya akan terus berusaha memahami semua sub-indeces dalam kerangka aljabar linier dari fungsi ini. Jika klik di tempat, saya akan melanjutkan dan menjawab pertanyaan saya sendiri, tetapi meskipun saya tahu itu sederhana, korespondensi antara nomenklatur scaffolding matematika dan aplikasi untuk contoh apa pun membingungkan.
Antoni Parellada
1
Sumber lain yang bagus untuk Anda mungkin adalah implementasi lme4pureR mereka , yang mengikuti bersama dengan sketsa di atas dan ditulis seluruhnya dalam R. Mungkin mkZt()(mencarinya di sini ) adalah awal yang baik?
alexforrence

Jawaban:

5
  1. Membuat matriks mencakup menghasilkan 3 level ( , dan ) masing-masing dengan 10 pengamatan atau pengukuran ( ). Mengikuti kode di tautan asli di OP:Ji309330371nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10

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

masukkan deskripsi gambar di sini

  1. Membangun matriks dapat dibantu dengan menggunakan fungsi sebagai referensi: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")

masukkan deskripsi gambar di sini

Karena kita akan membutuhkan transpos, dan objek Xibukan matriks, maka t(Xi)dapat dibangun sebagai:

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

  1. Zi dihitung sebagai :Zi=(JiTXiT)

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

masukkan deskripsi gambar di sini

Ini sesuai dengan persamaan (6) dalam makalah asli :

Zi=(JiTXiT)T=[Ji1TXi1TJi2TXi2TJinTXinT]

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:JiTXiT

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

Dan

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

=[Jsaya1TXsaya1TJsaya2TXsaya2TJsaya3TXsaya3TJsaya4TXsaya4TJsaya5TXsaya5TJsaya6TXsaya6T]

Z i = [ 1 0 0 0=[110000010000001100000100000011000001] . Yang dialihkan dan diperluas akan menghasilkan .Zsaya=[100000110000120000001000001100001200000010000011000012]

  1. Mengekstrak vektor dari koefisien efek acak dapat dilakukan dengan fungsi:b

b <- getME(fm1,"b")

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

Jika kami menambahkan nilai-nilai ini ke efek-tetap panggilan fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)kami mendapatkan intersep:

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

dan lereng:

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

nilai yang konsisten dengan:

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

masukkan deskripsi gambar di sini

  1. Zb dapat dihitung sebagai as.matrix(Zi)%*%b.
Antoni Parellada
sumber