Trong lmer
hàm bên lme4
trong R
có một lời kêu gọi xây dựng ma trận mô hình các hiệu ứng ngẫu nhiên, , như được giải thích ở đây , trang 7-9.
Tính đòi hỏi các sản phẩm KhatriRao và / hoặc Kronecker của hai ma trận, và .
Ma trận là một câu cửa miệng: "Ma trận chỉ số của các chỉ số yếu tố nhóm", nhưng nó dường như là một ma trận thưa thớt với mã hóa giả để chọn đơn vị nào (ví dụ, các đối tượng trong các phép đo lặp đi lặp lại) tương ứng với các mức phân cấp cao hơn là "bật" cho bất kỳ quan sát. Các ma trận dường như đóng vai trò như một chọn của các phép đo ở mức độ thứ bậc thấp hơn, do đó sự kết hợp của cả hai "selectors" sẽ mang lại một ma trận, của mẫu minh họa trong bài báo thông qua các ví dụ sau:
(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
Chuyển đổi từng ma trận này và thực hiện phép nhân Khatri-Rao:
Nhưng là hoán vị của nó:
(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
Nó chỉ ra rằng các tác giả sử dụng cơ sở dữ liệu sleepstudy
trong lme4
, nhưng không thực sự xây dựng các ma trận thiết kế khi họ áp dụng cho nghiên cứu cụ thể này. Vì vậy, tôi đang cố gắng hiểu làm thế nào mã tạo thành trong bài báo được sao chép ở trên sẽ chuyển thành sleepstudy
ví dụ có ý nghĩa hơn .
Để đơn giản trực quan, tôi đã giảm tập dữ liệu xuống chỉ còn ba đối tượng - "309", "330" và "371":
require(lme4)
sleepstudy <- sleepstudy[sleepstudy$Subject %in% c(309, 330, 371), ]
rownames(sleepstudy) <- NULL
Mỗi cá nhân sẽ thể hiện một giao thoa và độ dốc rất khác nhau nên xem xét hồi quy OLS đơn giản, cho thấy sự cần thiết của một mô hình hiệu ứng hỗn hợp với hệ thống phân cấp hoặc đơn vị cao hơn tương ứng với các đối tượng:
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)
}
Cuộc gọi hồi quy hiệu ứng hỗn hợp là:
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
Và ma trận trích xuất từ hàm mang lại kết quả như sau:
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
Điều này có vẻ đúng, nhưng nếu có, đại số tuyến tính đằng sau nó là gì? Tôi hiểu các hàng của 1
sự lựa chọn của các cá nhân như thế nào. Chẳng hạn, chủ đề 309
được bật cho đường cơ sở + chín quan sát, do đó, nó nhận được bốn 1
và nhiều hơn nữa. Phần thứ hai rõ ràng là phép đo thực tế: 0
cho đường cơ sở, 1
cho ngày đầu tiên thiếu ngủ, v.v.
Đây là một khả năng,
lmer
mkZt()
(tìm kiếm nó ở đây ) là một khởi đầu tốt?