Predict () Função para modelos de efeitos mistos anteriores

27

O problema:

Eu li em outras postagens que predictnão estão disponíveis para lmermodelos de efeitos mistos {lme4} no [R].

Tentei explorar esse assunto com um conjunto de dados de brinquedos ...

Fundo:

O conjunto de dados é adaptado desta fonte e está disponível como ...

require(gsheet)
data <- read.csv(text = 
     gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
        format ='csv'))

Estas são as primeiras linhas e cabeçalhos:

> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall
1     Jim          A        HS    0 Negative       95 125.80
2     Jim          A        HS    0  Neutral       86 123.60
3     Jim          A        HS    0 Positive      180 204.00
4     Jim          A        HS    1 Negative      200  95.72
5     Jim          A        HS    1  Neutral       40  75.80
6     Jim          A        HS    1 Positive       30  84.56

Temos algumas observações repetidas ( Time) de uma medição contínua, ou seja, a Recalltaxa de algumas palavras e várias variáveis ​​explicativas, incluindo efeitos aleatórios ( Auditoriumonde o teste ocorreu; Subjectnome); e efeitos fixos , tais como Education, Emotion(a conotação emocional da palavra para lembrar), ou mgs.de Caffeineingerida antes do ensaio.

A idéia é que é fácil lembrar de assuntos com fio hiper-cafeinado, mas a capacidade diminui com o tempo, talvez devido ao cansaço. Palavras com conotação negativa são mais difíceis de lembrar. A educação tem um efeito previsível, e até o auditório tem um papel (talvez um seja mais barulhento ou menos confortável). Aqui estão algumas parcelas exploratórias:


insira a descrição da imagem aqui

Diferenças na taxa de recall em função de Emotional Tone, Auditoriume Education:

insira a descrição da imagem aqui


Ao ajustar linhas na nuvem de dados para a chamada:

fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)

Eu recebo esta trama:

com o código a seguir (observe a chamada para <code> prever (ajuste1) </code>):

library(ggplot2)
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit1)),size=1) 
print(p)

enquanto o seguinte modelo:

fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)

incorporar Timee um código paralelo obtém uma trama surpreendente:

p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit2)),size=1) 
print(p)

insira a descrição da imagem aqui


A questão:

Como a predictfunção opera neste lmermodelo? Evidentemente, está levando em consideração a Timevariável, resultando em um ajuste muito mais apertado, e o zigue-zague que está tentando exibir essa terceira dimensão de Timeretratada no primeiro gráfico.

Se eu ligar predict(fit2), recebo 132.45609a primeira entrada, que corresponde ao primeiro ponto. Aqui está o headconjunto de dados com a saída de predict(fit2)anexada como a última coluna:

> data$predict = predict(fit2)
> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall   predict
1     Jim          A        HS    0 Negative       95 125.80 132.45609
2     Jim          A        HS    0  Neutral       86 123.60 130.55145
3     Jim          A        HS    0 Positive      180 204.00 150.44439
4     Jim          A        HS    1 Negative      200  95.72 112.37045
5     Jim          A        HS    1  Neutral       40  75.80  78.51012
6     Jim          A        HS    1 Positive       30  84.56  76.39385

Os coeficientes para fit2são:

$`Time:Subject`
         (Intercept)  Caffeine
0:Jason     75.03040 0.2116271
0:Jim       94.96442 0.2116271
0:Ron       58.72037 0.2116271
0:Tina      70.81225 0.2116271
0:Victor    86.31101 0.2116271
1:Jason     59.85016 0.2116271
1:Jim       52.65793 0.2116271
1:Ron       57.48987 0.2116271
1:Tina      68.43393 0.2116271
1:Victor    79.18386 0.2116271
2:Jason     43.71483 0.2116271
2:Jim       42.08250 0.2116271
2:Ron       58.44521 0.2116271
2:Tina      44.73748 0.2116271
2:Victor    36.33979 0.2116271

$Subject
       (Intercept)  Caffeine
Jason     30.40435 0.2116271
Jim       79.30537 0.2116271
Ron       13.06175 0.2116271
Tina      54.12216 0.2116271
Victor   132.69770 0.2116271

Minha melhor aposta foi ...

> coef(fit2)[[1]][2,1]
[1] 94.96442
> coef(fit2)[[2]][2,1]
[1] 79.30537
> coef(fit2)[[1]][2,2]
[1] 0.2116271
> data$Caffeine[1]
[1] 95
> coef(fit2)[[1]][2,1] + coef(fit2)[[2]][2,1] + coef(fit2)[[1]][2,2] * data$Caffeine[1]
[1] 194.3744

Qual é a fórmula para obter 132.45609?


EDITAR para acesso rápido ... A fórmula para calcular o valor previsto (de acordo com a resposta aceita seria baseada na ranef(fit2)saída:

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477

$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

... para o primeiro ponto de entrada:

> summary(fit2)$coef[1]
[1] 61.91827             # Overall intercept for Fixed Effects 
> ranef(fit2)[[1]][2,]   
[1] 33.04615             # Time:Subject random intercept for Jim
> ranef(fit2)[[2]][2,]
[1] 17.3871              # Subject random intercept for Jim
> summary(fit2)$coef[2]
[1] 0.2116271            # Fixed effect slope
> data$Caffeine[1]
[1] 95                   # Value of caffeine

summary(fit2)$coef[1] + ranef(fit2)[[1]][2,] + ranef(fit2)[[2]][2,] + 
                    summary(fit2)$coef[2] * data$Caffeine[1]
[1] 132.4561

O código para este post está aqui .

Antoni Parellada
fonte
3
Observe que existe uma predictfunção neste pacote desde a versão 1.0-0, lançada em 01/08/2013. Veja a página de notícias do pacote no CRAN . Se não houvesse, você não seria capaz de obter nenhum resultado predict. Não se esqueça de que você pode ver o código R com lme4 ::: predict.merMod no prompt de comando R e inspecionar a fonte quanto a quaisquer funções compiladas subjacentes no pacote de origem lme4.
EdM
11
Obrigado, vejo que existe a funcionalidade com os efeitos aleatórios desconsiderados ou incluídos. Você sabe onde posso encontrar como é calculado? Se eu digitar ?predictno [r] console, eu recebo prever o básico para {} estatísticas ...
Antoni Parellada
@ Edm ... sim, isso é novo para mim ... Obrigado. Eu não tinha chamado predict.merMod, embora ... Como você pode ver na OP, I chamado simplesmente predict...
Antoni Parellada
11
Carregue o lme4pacote e digite lme4 ::: predict.merMod para ver a versão específica do pacote. A saída de lmeré armazenada em um objeto de classe merMod.
EdM
4
Uma das belezas de R é que uma função como predictsabe o que fazer, dependendo da classe do objeto em que é chamada a agir. Você estava ligando predict.merMod, você simplesmente não sabia.
EdM

Respostas:

25

É fácil ficar confuso com a apresentação de coeficientes quando você liga coef(fit2). Veja o resumo do fit2:

> summary(fit2)
Linear mixed model fit by REML ['lmerMod']
Formula: Recall ~ (1 | Subject/Time) + Caffeine
   Data: data
REML criterion at convergence: 444.5

Scaled residuals: 
 Min       1Q   Median       3Q      Max 
-1.88657 -0.46382 -0.06054  0.31430  2.16244 

Random effects:
 Groups       Name        Variance Std.Dev.
 Time:Subject (Intercept)  558.4   23.63   
 Subject      (Intercept) 2458.0   49.58   
 Residual                  675.0   25.98   
Number of obs: 45, groups:  Time:Subject, 15; Subject, 5

Fixed effects:
Estimate Std. Error t value
(Intercept) 61.91827   25.04930   2.472
Caffeine     0.21163    0.07439   2.845

Correlation of Fixed Effects:
 (Intr)
Caffeine -0.365

Existe uma interceptação geral de 61,92 para o modelo, com um coeficiente de cafeína de 0,212. Portanto, para a cafeína = 95, você prevê uma recuperação média de 82,06.

Em vez de usar coef, use ranefpara obter a diferença de cada interceptação de efeito aleatório da interceptação média no próximo nível mais alto de aninhamento:

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477
$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

Os valores de Jim no tempo = 0 diferirão do valor médio de 82,06 pela soma dos coeficientes dele Subject e dele Time:Subject:

82,06+17,39+33.04=132,49

que acho que está dentro do erro de arredondamento de 132,46.

Os valores de interceptação retornados por coefparecem representar a interceptação geral mais as diferenças específicas Subjectou Time:Subject, portanto, é mais difícil trabalhar com elas; se você tentasse fazer o cálculo acima com os coefvalores, contaria duas vezes a interceptação geral.

EdM
fonte
Obrigado! Isto foi excelente! Acho que não faz sentido deixá-lo aberto ... Essa é a resposta, não é?
Antoni Parellada
Eu tenho a dica sobre ranefa partir do exame de código R no lme4. Esclarei a apresentação em alguns lugares.
EdM
(+1) Nota: os efeitos aleatórios temporizados aninhados na pessoa parecem estranhos.
Michael M
@MichaelM: Sim, os dados apresentados parecem ser cruzados (Tempo x Assunto), e não um design aninhado, mas foi assim que o OP levantou a questão de como interpretar a lme4saída. Além disso, os dados apresentados pareciam ser meramente ilustrativos, e não um estudo real a ser analisado.
EdM