J'ai un ensemble de données de mesures répétées déséquilibrées à analyser, et j'ai lu que la façon dont la plupart des progiciels statistiques traitent cela avec l'ANOVA (c'est-à-dire la somme des carrés de type III) est erronée. Par conséquent, je voudrais utiliser un modèle à effets mixtes pour analyser ces données. J'ai beaucoup lu sur les modèles mixtes R
, mais je suis encore très nouveau sur R
les modèles à effets mixtes et je ne suis pas très confiant de bien faire les choses. Notez que je ne peux pas encore me séparer complètement des méthodes "traditionnelles", et j'ai toujours besoin de valeurs et de tests post hoc.
Je voudrais savoir si l'approche suivante a du sens ou si je fais quelque chose d'horriblement mal. Voici mon code:
# load packages
library(lme4)
library(languageR)
library(LMERConvenienceFunctions)
library(coda)
library(pbkrtest)
# import data
my.data <- read.csv("data.csv")
# create separate data frames for each DV & remove NAs
region.data <- na.omit(data.frame(time=my.data$time, subject=my.data$subject, dv=my.data$dv1))
# output summary of data
data.summary <- summary(region.data)
# fit model
# "time" is a factor with three levels ("t1", "t2", "t3")
region.lmer <- lmer(dv ~ time + (1|subject), data=region.data)
# check model assumptions
mcp.fnc(region.lmer)
# remove outliers (over 2.5 standard deviations)
rm.outliers <- romr.fnc(region.lmer, region.data, trim=2.5)
region.data <- rm.outliers$data
region.lmer <- update(region.lmer)
# re-check model assumptions
mcp.fnc(region.lmer)
# compare model to null model
region.lmer.null <- lmer(dv ~ 1 + (1|subject), data=region.data)
region.krtest <- KRmodcomp(region.lmer, region.lmer.null)
# output lmer summary
region.lmer.summary <- summary(region.lmer)
# run post hoc tests
t1.pvals <- pvals.fnc(region.lmer, ndigits=10, withMCMC=TRUE)
region.lmer <- lmer(dv ~ relevel(time,ref="t2") + (1|subject), data=region.data)
t2.pvals <- pvals.fnc(region.lmer, ndigits=10, withMCMC=TRUE)
region.lmer <- lmer(dv ~ relevel(time,ref="t3") + (1|subject), data=region.data)
t3.pvals <- pvals.fnc(region.lmer, ndigits=10, withMCMC=TRUE)
# Get mcmc mean and 50/95% HPD confidence intervals for graphs
# repeated three times and stored in a matrix (not shown here for brevity)
as.numeric(t1.pvals$fixed$MCMCmean)
as.numeric(t1.pvals$fixed$HPD95lower)
as.numeric(t1.pvals$fixed$HPD95upper)
HPDinterval(as.mcmc(t1.pvals$mcmc),prob=0.5)
HPDinterval(as.mcmc(t1.pvals$mcmc),prob=0.5)
Quelques questions spécifiques que j'ai:
- Est-ce une façon valable d'analyser des modèles à effets mixtes? Sinon, que dois-je faire à la place.
- Les tracés de critique produits par mcp.fnc sont-ils assez bons pour vérifier les hypothèses du modèle, ou devrais-je prendre des mesures supplémentaires.
- Je comprends que pour que les modèles mixtes soient valides, les données doivent respecter les hypothèses de normalité et d'homoscédasticité. Comment puis-je juger ce qui est "approximativement normal" et ce qui ne l'est pas en examinant les complots de critiques générés par mcp.fnc? Ai-je simplement besoin de me faire une idée ou est-ce une façon prescrite de faire les choses? Quelle est la robustesse des modèles mixtes par rapport à ces hypothèses?
- J'ai besoin d'évaluer les différences entre les trois points dans le temps pour environ 20 caractéristiques (biomarqueurs) des sujets de mon échantillon. Est-ce que l'ajustement et le test de modèles distincts pour chacun sont acceptables tant que je signale tous les tests entrepris (significatifs ou non), ou ai-je besoin d'une forme de correction pour les comparaisons multiples.
Pour être un peu plus précis en ce qui concerne l'expérience, voici quelques détails supplémentaires. Nous avons suivi un certain nombre de participants longitudinalement pendant qu'ils subissaient un traitement. Nous avons mesuré un certain nombre de biomarqueurs avant le début du traitement et à deux moments dans le temps après. Ce que j'aimerais voir, c'est s'il y a une différence dans ces biomarqueurs entre les trois points dans le temps.
Je base la plupart de ce que je fais ici sur ce tutoriel , mais j'ai apporté quelques modifications en fonction de mes besoins et des choses que j'ai lues. Les modifications que j'ai apportées sont les suivantes:
- relever le facteur "temps" pour obtenir les comparaisons t1-t2, t2-t3 et t1-t3 avec pvals.fnc (à partir du package languageR)
- comparer mon modèle mixte au modèle nul en utilisant un test F approximatif basé sur une approche de Kenward-Roger (en utilisant le package pbkrtest) plutôt qu'un test de rapport de vraisemblance (parce que j'ai lu, que Kenward-Roger est mieux considéré en ce moment)
- Utilisez le package LMERConvenienceFunctions pour vérifier les hypothèses et supprimer les valeurs aberrantes (car j'ai lu que les modèles mixtes sont très sensibles aux valeurs aberrantes)
la source
Réponses:
Votre (vos) question (s) est (sont) un peu "grosse (s)", je vais donc commencer par quelques commentaires généraux et astuces.
Quelques informations de base et packages utiles
Vous devriez probablement jeter un œil à certaines des introductions du didacticiel sur l'utilisation de modèles mixtes, je recommanderais de commencer par Baayen et al (2008) - Baayen est l'auteur de
languageR
. Barr et al (2013) discutent de certains problèmes liés à la structure des effets aléatoires, et Ben Bolker est l'un des développeurs actuels delme4
. Baayen et al est particulièrement bon pour vos questions car ils passent beaucoup de temps à discuter de l'utilisation des tests d'amorçage / permutation (les trucs derrièremcp.fnc
).Littérature
Florian Jaeger a également un tas de choses sur le côté pratique des modèles mixtes sur le blog de son laboratoire .
Il existe également un certain nombre de packages R utiles pour visualiser et tester des modèles mixtes, comme
lmerTest
eteffects
. Leeffects
package est particulièrement agréable car il vous permet de tracer la régression linéaire et les intervalles de confiance en cours.Qualité de l'ajustement et comparaison des modèles
lmerTest
Les meilleures façons de comparer les modèles sont la vraisemblance logarithmique ou les divers critères théoriques de l'information comme AIC et BIC. Pour AIC et BIC, la règle générale est "plus petit vaut mieux", mais il faut y faire attention car ils pénalisent tous les deux pour plus de degrés de liberté du modèle et il n'y a pas de valeur "absolue" bonne ou mauvaise. Pour obtenir un joli résumé des modèles AIC et log-vraisemblance, vous pouvez utiliser laχ2 χ2 p -valeurs pour comparer directement deux modèles. L'inconvénient est qu'il n'est pas immédiatement clair à quel point votre ajustement est bon.
anova()
fonction, qui a été surchargée pour accepter desmer
objets. Veuillez noter que lesummary()
si je ne me trompe pas). Généralement, toutfixef()
.Vous devez également vous assurer qu'aucun de vos effets fixes n'est trop fortement corrélé - la multicolinéarité viole les hypothèses du modèle. Florian Jaeger a écrit un peu à ce sujet , ainsi que quelques solutions possibles.
Comparaisons multiples
Je répondrai un peu plus directement à votre question n ° 4. La réponse est fondamentalement la même que les bonnes pratiques avec l'ANOVA traditionnelle, malheureusement cela semble être un endroit où il y a beaucoup d'incertitude pour la plupart des chercheurs. (C'est la même chose que l'ANOVA traditionnelle car les modèles à effets mixtes linéaires et l'ANOVA sont basés sur le modèle linéaire général, c'est juste que les modèles mixtes ont un terme supplémentaire pour les effets aléatoires.) Si vous supposez que les fenêtres temporelles font un différence et que vous souhaitez comparer les effets du temps, vous devez inclure le temps dans votre modèle. Incidemment, cela vous fournira également un moyen pratique de juger si le temps a fait une différence: y a-t-il un effet principal (fixe) pour le temps? L'inconvénient de suivre cette voie est que votre modèle sera BEAUCOUP plus complexe et le single "super" un modèle avec le temps en tant que paramètre prendra probablement plus de temps à calculer que trois modèles plus petits sans le temps en tant que paramètre. En effet, l'exemple de didacticiel classique pour les modèles mixtes est
sleepstudy
qui utilise le temps comme paramètre.Je ne pouvais pas vraiment dire si les différentes caractéristiques sont censées être des prédicteurs ou des variables dépendantes. S'ils sont censés être des prédicteurs, vous pouvez les jeter tous dans un modèle et voir lequel a le plus grandt -valeur, mais ce modèle serait incroyablement complexe, même si vous n'autorisez pas les interactions et prendrait beaucoup de temps à calculer. Le moyen le plus rapide et potentiellement le plus simple serait de calculer différents modèles pour chaque prédicteur. Je recommanderais d'utiliser une χ2 statistique.)
foreach
boucle pour la paralléliser sur autant de cœurs que vous -lme4
ne fait pas encore ses opérations matricielles en parallèle, vous pouvez donc calculer un modèle différent sur chaque cœur en parallèle. (Voir la courte introduction ici ) Ensuite, vous pouvez comparer l'AIC et le BIC de chaque modèle pour trouver quel prédicteur est le meilleur. (Ils ne sont pas imbriqués dans ce cas, donc vous 'Si vos caractéristiques sont la variable dépendante, vous devrez quand même calculer différents modèles, puis vous pourrez utiliser l'AIC et le BIC pour comparer les résultats.
la source