Matrizes de modelo para modelos de efeitos mistos

10

Na lmerfunção dentro lme4de Rhá uma chamada para a construção de uma matriz modelo de efeitos aleatórios, Z , como explicado aqui , páginas 7 - 9.

O cálculo de Z envolve produtos KhatriRao e / ou Kronecker de duas matrizes, JEu e XEu .

A matriz de JEu é um bocado: "matriz Indicador de agrupamento de índices factor", mas isto parece ser uma matriz esparso com o manequim de codificação para seleccionar qual a unidade (por exemplo, pessoas com medidas repetidas) correspondentes aos níveis hierárquicos superiores são "em" para qualquer observação. O XEu matriz parece agir como um selector de medições do nível hierárquico mais baixo, de modo que a combinação de ambos os selectores "" iria produzir uma matriz, ZEu da forma ilustrada no papel por meio de exemplo, a seguinte:

(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

Transpondo cada uma dessas matrizes e realizando uma multiplicação de Khatri-Rao:

[1 11 1......1 11 1......1 11 1][1 11 11 11 11 11 1-1 11 1-1 11 1-1 11 1]=[1 11 1....-1 11 1......1 11 1....-1 11 1......1 11 1....-1 11 1]

Mas é a transposição do mesmo:ZEu

(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

Acontece que os autores fazem uso de banco de dados sleepstudyem lme4, mas realmente não elaborar sobre as matrizes de design que se aplicam a este estudo particular. Então, estou tentando entender como o código inventado no artigo reproduzido acima se traduziria no sleepstudyexemplo mais significativo .

Por simplicidade visual, reduzi o conjunto de dados para apenas três assuntos - "309", "330" e "371":

require(lme4)
sleepstudy <- sleepstudy[sleepstudy$Subject %in% c(309, 330, 371), ]
rownames(sleepstudy) <- NULL

Cada indivíduo exibirá uma interceptação e inclinação muito diferentes, caso uma regressão OLS simples seja considerada individualmente, sugerindo a necessidade de um modelo de efeito misto com a hierarquia mais alta ou o nível de unidade correspondente aos sujeitos:

    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)
        }

insira a descrição da imagem aqui

A chamada de regressão de efeito misto é:

fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy)

E a matriz extraída da função produz o seguinte:

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

Parece correto, mas se for, qual é a álgebra linear por trás disso? Eu entendo as linhas de 1ser a seleção de indivíduos como. Por exemplo, o assunto 309está ativado para a linha de base + nove observações, então obtém quatro 1e assim por diante. A segunda parte é claramente a medida real: 0para a linha de base, 1para o primeiro dia de privação de sono, etc.

Mas quais são os reais JEu XEu ZEu=(JEuTXEuT) ZEu=(JEuTXEuT)

Aqui está uma possibilidade,

[1 11 11 11 11 11 11 11 11 11 1..............................1 11 11 11 11 11 11 11 11 11 1.............................1 11 11 11 11 11 11 11 11 11 1][1 11 11 11 11 11 11 11 11 11 10 01 123456789]=

[1 11 11 11 11 11 11 11 11 11 1....................0 01 123456789.............................1 11 11 11 11 11 11 11 11 11 1...................0 01 123456789..............................1 11 11 11 11 11 11 11 11 11 1...................0 01 123456789]

lmerXEu

Antoni Parellada
fonte
11
Z
Obrigado pela sua dica. Continuarei trabalhando para entender todas as sub-indeces no esqueleto de álgebra linear dessa função. Se clicar no lugar, seguirei em frente e responderei minha própria pergunta, mas, embora eu saiba que seja profundamente simples, a correspondência entre a nomenclatura do andaime matemático e a aplicação para qualquer exemplo é confusa.
Antoni Parellada
11
Outro bom recurso para você pode ser a implementação do lme4pureR , que segue a vinheta acima e está escrita inteiramente em R. Talvez mkZt()(procure aqui ) seja um bom começo?
11118 alexforrence

Respostas:

5
  1. JEu309330371nrow(sleepstudy[sleepstudy$Subject==309,]) [1] 10

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

insira a descrição da imagem aqui

  1. XEugetME

    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")

insira a descrição da imagem aqui

Como precisaremos da transposição e o objeto Xinão é uma matriz, ele t(Xi)pode ser construído como:

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

  1. ZEuZEu=(JEuTXEuT)

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

insira a descrição da imagem aqui

Isso corresponde à equação (6) no artigo original :

ZEu=(JEuTXEuT)T=[JEu1 1TXEu1 1TJEu2TXEu2TJEunTXEunT]

JEuTXEuT

JEuT=[1 11 10 00 00 00 00 00 01 11 10 00 00 00 00 00 01 11 1]XEuT=[1 11 11 11 11 11 10 01 10 01 10 01 1]

E

JEuTXEuT=[(1 10 00 0)(1 10 0)(1 10 00 0)(1 11 1)(0 01 10 0)(1 10 0)(0 01 10 0)(1 11 1)(0 00 01 1)(1 10 0)(0 00 01 1)(1 11 1)]

=[JEu1 1TXEu1 1TJEu2TXEu2TJEu3TXEu3TJEu4TXEu4TJEu5TXEu5TJEu6TXEu6T]

=[1 11 10 00 00 00 00 01 10 00 00 00 00 00 01 11 10 00 00 00 00 01 10 00 00 00 00 00 01 11 10 00 00 00 00 01 1]ZEu=[1 10 00 00 00 00 01 11 10 00 00 00 01 120 00 00 00 00 00 01 10 00 00 00 00 01 11 10 00 00 00 01 120 00 00 00 00 00 01 10 00 00 00 00 01 11 10 00 00 00 01 12]

  1. b

b <- getME(fm1,"b")

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

Se adicionarmos esses valores aos efeitos fixos da chamada fm1<-lmer(Reaction~Days+(Days|Subject), sleepstudy), obteremos as interceptações:

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

e as encostas:

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

valores consistentes com:

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

insira a descrição da imagem aqui

  1. Zbas.matrix(Zi)%*%b
Antoni Parellada
fonte