В lmer
функции lme4
in in 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
людей отбирают. Например, предмет 309
включен для базовой линии + девять наблюдений, поэтому он получает четыре 1
и так далее. Вторая часть, несомненно, является фактическим измерением: 0
для исходного уровня, 1
для первого дня лишения сна и т. Д.
Но каковы действительные и и соответствующие им или , в зависимости от того , что уместно?X i Z i = ( J T i ∗ X T i ) ⊤ Z i = ( J T i ⊗ X T i ) ⊤
Здесь есть возможность,
Проблема в том, что это не транспонирование, как, по- lmer
видимому, требует функция, и все еще неясно, каковы правила для создания .
источник
mkZt()
(поиск здесь ) это хорошее начало?Ответы:
309
330
371
nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10
f <- gl(3,10)
Ji<-t(as(f,Class="sparseMatrix"))
Построение матрицы может быть оказана помощь при использовании функции в качестве ссылки:Икся
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")
Поскольку нам понадобится транспонирование, а объект
Xi
не является матрицей, егоt(Xi)
можно построить так:t_Xi <- rbind(c(rep(1,30)),c(rep(0:9,3)))
Zi<-t(KhatriRao(t_Ji,t_Xi))
:Это соответствует уравнению (6) в оригинальной статье :
И чтобы увидеть это, мы можем вместо этого поиграть с усеченными и , представив, что вместо 9 измерений и базовой линии (0), есть только 1 измерение (и базовая линия). Полученные матрицы будут:JTя ИксTя
А также
b <- getME(fm1,"b")
Если мы добавим эти значения к фиксированным эффектам вызова,
fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)
мы получим перехваты:и склоны:
значения в соответствии с:
as.matrix(Zi)%*%b
.источник