Le problème:
J'ai lu dans d'autres articles qui predict
ne sont pas disponibles pour les lmer
modèles d' effets mixtes {lme4} dans [R].
J'ai essayé d'explorer ce sujet avec un jeu de données jouet ...
Contexte:
L'ensemble de données est adapté de cette source et disponible en ...
require(gsheet)
data <- read.csv(text =
gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
format ='csv'))
Ce sont les premières lignes et en-têtes:
> 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
Nous avons quelques observations répétées ( Time
) d'une mesure continue, à savoir le Recall
taux de certains mots, et plusieurs variables explicatives, y compris des effets aléatoires ( Auditorium
où le test a eu lieu; Subject
nom); et les effets fixes , tels que Education
, Emotion
(la connotation émotionnelle du mot à retenir), ou de ingérée avant l'essai.Caffeine
L'idée est qu'il est facile de se souvenir pour les sujets câblés hyper-caféinés, mais la capacité diminue avec le temps, peut-être en raison de la fatigue. Les mots à connotation négative sont plus difficiles à retenir. L'éducation a un effet prévisible, et même l'auditorium joue un rôle (peut-être que l'un était plus bruyant ou moins confortable). Voici quelques parcelles exploratoires:
Les différences dans les taux de rappel en fonction de Emotional Tone
, Auditorium
et Education
:
Lors de l'ajustement des lignes sur le nuage de données pour l'appel:
fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)
Je reçois ce complot:
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)
tandis que le modèle suivant:
fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)
incorporer Time
et un code parallèle obtient une intrigue surprenante:
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
geom_point(size=3) +
geom_line(aes(y = predict(fit2)),size=1)
print(p)
La question:
Comment predict
fonctionne la fonction dans ce lmer
modèle? Évidemment, il prend en compte la Time
variable, ce qui entraîne un ajustement beaucoup plus serré et le zigzag qui essaie d'afficher cette troisième dimension de Time
dépeint dans le premier tracé.
Si j'appelle, predict(fit2)
j'obtiens 132.45609
la première entrée, qui correspond au premier point. Voici head
le jeu de données avec la sortie de predict(fit2)
attaché comme dernière colonne:
> 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
Les coefficients pour fit2
sont:
$`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
Mon meilleur pari était ...
> 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
Quelle est la formule à adopter à la place 132.45609
?
EDIT pour un accès rapide ... La formule pour calculer la valeur prédite (selon la réponse acceptée serait basée sur la ranef(fit2)
sortie:
> 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
... pour le premier point d'entrée:
> 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
Le code de cet article est ici .
?predict
sur la console [r], j'obtiens les prévisions de base pour {stats} ...
predict.merMod
, cependant ... Comme vous pouvez le voir sur l'OP, j'ai simplement appelé predict
...
lme4
package, puis tapez lme4 ::: Predict.merMod pour voir la version spécifique au package. La sortie de lmer
est stockée dans un objet de classe merMod
.
predict
sait quoi faire en fonction de la classe de l'objet sur lequel elle est appelée à agir. Vous appeliez predict.merMod
, vous ne le saviez tout simplement pas.
predict
fonction dans ce package depuis la version 1.0-0, publiée le 2013-08-01. Voir la page des nouvelles du package dans CRAN . S'il n'y en avait pas eu, vous n'auriez pas pu obtenir de résultatspredict
. N'oubliez pas que vous pouvez voir le code R avec lme4 ::: predire.merMod à l'invite de commande R et inspecter la source pour toutes les fonctions compilées sous-jacentes dans le package source pourlme4
.