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=(JEuT∗XEuT)⊤ ZEu=(JEuT⊗XEuT)⊤

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


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=(JEuT∗XEuT)⊤

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

insira a descrição da imagem aqui

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

ZEu=(JEuT∗XEuT)T=[JEu1 1T⊗XEu1 1TJEu2T⊗XEu2T⋮JEunT⊗XEunT]

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

JEuT∗XEuT=[(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 1T⊗XEu1 1TJEu2T⊗XEu2TJEu3T⊗XEu3TJEu4T⊗XEu4TJEu5T⊗XEu5TJEu6T⊗XEu6T]

=[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 0⋮0 00 01 10 00 00 00 00 01 11 10 00 00 00 01 120 00 0⋮0 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.