O problema:
Eu li em outras postagens que predict
não estão disponíveis para lmer
modelos 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 Recall
taxa de algumas palavras e várias variáveis explicativas, incluindo efeitos aleatórios ( Auditorium
onde o teste ocorreu; Subject
nome); e efeitos fixos , tais como Education
, Emotion
(a conotação emocional da palavra para lembrar), ou de Caffeine
ingerida 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:
Diferenças na taxa de recall em função de Emotional Tone
, Auditorium
e Education
:
Ao ajustar linhas na nuvem de dados para a chamada:
fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)
Eu recebo esta trama:
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 Time
e 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)
A questão:
Como a predict
função opera neste lmer
modelo? Evidentemente, está levando em consideração a Time
variável, resultando em um ajuste muito mais apertado, e o zigue-zague que está tentando exibir essa terceira dimensão de Time
retratada no primeiro gráfico.
Se eu ligar predict(fit2)
, recebo 132.45609
a primeira entrada, que corresponde ao primeiro ponto. Aqui está o head
conjunto 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 fit2
sã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 .
fonte
predict
funçã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 resultadopredict
. 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 origemlme4
.?predict
no [r] console, eu recebo prever o básico para {} estatísticas ...predict.merMod
, embora ... Como você pode ver na OP, I chamado simplesmentepredict
...lme4
pacote e digite lme4 ::: predict.merMod para ver a versão específica do pacote. A saída delmer
é armazenada em um objeto de classemerMod
.predict
sabe o que fazer, dependendo da classe do objeto em que é chamada a agir. Você estava ligandopredict.merMod
, você simplesmente não sabia.Respostas:
É fácil ficar confuso com a apresentação de coeficientes quando você liga
coef(fit2)
. Veja o resumo do fit2: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
, useranef
para 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:Os valores de Jim no tempo = 0 diferirão do valor médio de 82,06 pela soma dos coeficientes dele
Subject
e deleTime:Subject
:que acho que está dentro do erro de arredondamento de 132,46.
Os valores de interceptação retornados por
coef
parecem representar a interceptação geral mais as diferenças específicasSubject
ouTime:Subject
, portanto, é mais difícil trabalhar com elas; se você tentasse fazer o cálculo acima com oscoef
valores, contaria duas vezes a interceptação geral.fonte
ranef
a partir do exame de código R nolme4
. Esclarei a apresentação em alguns lugares.lme4
saída. Além disso, os dados apresentados pareciam ser meramente ilustrativos, e não um estudo real a ser analisado.