Considérez les données de l'étude du sommeil, incluses dans lme4. Bates en parle dans son livre en ligne sur lme4. Dans le chapitre 3, il considère deux modèles pour les données.
M0 : Réaction ∼ 1 + jours + ( 1 | sujet ) + ( 0 + jours | sujet )
et
MA : Réaction ∼ 1 + jours + ( jours | sujet )
L'étude a porté sur 18 sujets, étudiés sur une période de 10 jours sans sommeil. Les temps de réaction ont été calculés au départ et les jours suivants. Il y a un effet clair entre le temps de réaction et la durée de la privation de sommeil. Il existe également des différences significatives entre les sujets. Le modèle A permet la possibilité d'une interaction entre l'interception aléatoire et les effets de pente: imaginons, par exemple, que les personnes ayant de faibles temps de réaction souffrent plus fortement des effets de la privation de sommeil. Cela impliquerait une corrélation positive dans les effets aléatoires.
Dans l'exemple de Bates, il n'y avait aucune corrélation apparente à partir du tracé du réseau et aucune différence significative entre les modèles. Cependant, pour enquêter sur la question posée ci-dessus, j'ai décidé de prendre les valeurs ajustées de l'étude du sommeil, d'augmenter la corrélation et d'examiner les performances des deux modèles.
Comme vous pouvez le voir sur l'image, les longs temps de réaction sont associés à une plus grande perte de performances. La corrélation utilisée pour la simulation était de 0,58
J'ai simulé 1000 échantillons, en utilisant la méthode de simulation dans lme4, sur la base des valeurs ajustées de mes données artificielles. J'ai adapté M0 et Ma à chacun et j'ai regardé les résultats. L'ensemble de données d'origine comportait 180 observations (10 pour chacun des 18 sujets) et les données simulées ont la même structure.
L'essentiel est qu'il y a très peu de différence.
- Les paramètres fixes ont exactement les mêmes valeurs sous les deux modèles.
- Les effets aléatoires sont légèrement différents. Il existe 18 effets aléatoires d'interception et 18 de pente pour chaque échantillon simulé. Pour chaque échantillon, ces effets sont forcés de s'ajouter à 0, ce qui signifie que la différence moyenne entre les deux modèles est (artificiellement) 0. Mais les variances et les covariances diffèrent. La covariance médiane sous MA était de 104, contre 84 sous M0 (valeur réelle, 112). Les variances des pentes et des intersections étaient plus grandes sous M0 que MA, probablement pour obtenir la marge de manœuvre supplémentaire nécessaire en l'absence d'un paramètre de covariance libre.
- La méthode ANOVA pour lmer donne une statistique F pour comparer le modèle Slope à un modèle avec seulement une interception aléatoire (aucun effet dû à la privation de sommeil). De toute évidence, cette valeur était très élevée dans les deux modèles, mais elle était généralement (mais pas toujours) plus élevée sous MA (moyenne 62 vs moyenne de 55).
- La covariance et la variance des effets fixes sont différentes.
- Environ la moitié du temps, il sait que MA est correct. La valeur p médiane pour comparer M0 à MA est de 0,0442. Malgré la présence d'une corrélation significative et de 180 observations équilibrées, le modèle correct ne serait choisi qu'environ la moitié du temps.
- Les valeurs prévues diffèrent sous les deux modèles, mais très légèrement. La différence moyenne entre les prédictions est de 0, avec sd de 2,7. Le sd des valeurs prédites elles-mêmes est de 60,9
Alors pourquoi cela se produit-il? @gung a deviné, raisonnablement, que le fait de ne pas inclure la possibilité d'une corrélation force les effets aléatoires à ne pas être corrélés. Peut-être que cela devrait; mais dans cette implémentation, les effets aléatoires peuvent être corrélés, ce qui signifie que les données sont capables de tirer les paramètres dans la bonne direction, quel que soit le modèle. La fausseté du mauvais modèle apparaît dans la probabilité, c'est pourquoi vous pouvez (parfois) distinguer les deux modèles à ce niveau. Le modèle à effets mixtes ajuste essentiellement les régressions linéaires à chaque sujet, influencées par ce que le modèle pense qu'elles devraient être. Le mauvais modèle force l'ajustement de valeurs moins plausibles que celles obtenues avec le bon modèle. Mais les paramètres, en fin de compte, sont régis par l'ajustement aux données réelles.
Voici mon code quelque peu maladroit. L'idée était d'ajuster les données de l'étude sur le sommeil, puis de créer un ensemble de données simulées avec les mêmes paramètres, mais une plus grande corrélation pour les effets aléatoires. Cet ensemble de données a été alimenté dans simulate.lmer () pour simuler 1000 échantillons, chacun étant ajusté dans les deux sens. Une fois que j'avais apparié des objets ajustés, je pouvais retirer différentes caractéristiques de l'ajustement et les comparer, en utilisant des tests t, ou autre chose.
# Fit a model to the sleep study data, allowing non-zero correlation
fm01 <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=sleepstudy, REML=FALSE)
# Now use this to build a similar data set with a correlation = 0.9
# Here is the covariance function for the random effects
# The variances come from the sleep study. The covariance is chosen to give a larger correlation
sigma.Subjects <- matrix(c(565.5,122,122,32.68),2,2)
# Simulate 18 pairs of random effects
ranef.sim <- mvrnorm(18,mu=c(0,0),Sigma=sigma.Subjects)
# Pull out the pattern of days and subjects.
XXM <- model.frame(fm01)
n <- nrow(XXM) # Sample size
# Add an intercept to the model matrix.
XX.f <- cbind(rep(1,n),XXM[,2])
# Calculate the fixed effects, using the parameters from the sleep study.
yhat <- XX.f %*% fixef(fm01 )
# Simulate a random intercept for each subject
intercept.r <- rep(ranef.sim[,1], each=10)
# Now build the random slopes
slope.r <- XXM[,2]*rep(ranef.sim[,2],each=10)
# Add the slopes to the random intercepts and fixed effects
yhat2 <- yhat+intercept.r+slope.r
# And finally, add some noise, using the variance from the sleep study
y <- yhat2 + rnorm(n,mean=0,sd=sigma(fm01))
# Here is new "sleep study" data, with a stronger correlation.
new.data <- data.frame(Reaction=y,Days=XXM$Days,Subject=XXM$Subject)
# Fit the new data with its correct model
fm.sim <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=new.data, REML=FALSE)
# Have a look at it
xyplot(Reaction ~ Days | Subject, data=new.data, layout=c(6,3), type=c("p","r"))
# Now simulate 1000 new data sets like new.data and fit each one
# using the right model and zero correlation model.
# For each simulation, output a list containing the fit from each and
# the ANOVA comparing them.
n.sim <- 1000
sim.data <- vector(mode="list",)
tempReaction <- simulate(fm.sim, nsim=n.sim)
tempdata <- model.frame(fm.sim)
for (i in 1:n.sim){
tempdata$Reaction <- tempReaction[,i]
output0 <- lmer(Reaction ~ 1 + Days +(1|Subject)+(0+Days|Subject), data = tempdata, REML=FALSE)
output1 <- lmer(Reaction ~ 1 + Days +(Days|Subject), data=tempdata, REML=FALSE)
temp <- anova(output0,output1)
pval <- temp$`Pr(>Chisq)`[2]
sim.data[[i]] <- list(model0=output0,modelA=output1, pvalue=pval)
}