Comparaisons multiples sur un modèle à effets mixtes

31

J'essaie d'analyser certaines données à l'aide d'un modèle à effets mixtes. Les données que j'ai recueillies représentent le poids de certains jeunes animaux de génotype différent au fil du temps.

J'utilise l'approche proposée ici: https://gribblelab.wordpress.com/2009/03/09/repeated-measures-anova-using-r/

En particulier, j'utilise la solution # 2

J'ai donc quelque chose comme

require(nlme)
model <- lme(weight ~ time * Genotype, random = ~1|Animal/time, 
         data=weights)    
av <- anova(model)

Maintenant, je voudrais avoir plusieurs comparaisons. En utilisant multcompje peux faire:

require(multcomp)
comp.geno <- glht(model, linfct=mcp(Genotype="Tukey"))
print(summary(comp.geno))

Et, bien sûr, je pourrais faire de même avec le temps.

J'ai deux questions:

  1. Comment puis-je utiliser mcppour voir l'interaction entre le temps et le génotype?
  2. Lorsque je cours, glhtje reçois cet avertissement:

    covariate interactions found -- default contrast might be inappropriate

    Qu'est-ce que ça veut dire? Puis-je l'ignorer en toute sécurité? Ou que dois-je faire pour l'éviter?

EDIT: J'ai trouvé ce PDF qui dit:

Comme il est impossible de déterminer automatiquement les paramètres d'intérêt dans ce cas, mcp () dans multcomp générera par défaut des comparaisons uniquement pour les effets principaux, en ignorant les covariables et les interactions . Depuis la version 1.1-2, on peut spécifier de faire la moyenne des termes d'interaction et des covariables en utilisant respectivement les arguments interaction_average = TRUE et covariate_average = TRUE, tandis que les versions antérieures à 1.0-0 font automatiquement la moyenne sur les termes d'interaction. Nous suggérons cependant aux utilisateurs d'écrire manuellement l'ensemble des contrastes qu'ils souhaitent.Il faut le faire en cas de doute sur la mesure des contrastes par défaut, ce qui se produit généralement dans les modèles avec des termes d'interaction d'ordre supérieur. Nous nous référons à Hsu (1996), chapitre ~ 7, et Searle (1971), chapitre ~ 7.3, pour plus de discussions et d'exemples sur cette question.

Je n'ai pas accès à ces livres, mais peut-être que quelqu'un ici en a?

Nico
la source
Jetez un oeil à InvivoStat ( invivostat.co.uk ), il devrait faire le type d'analyse que vous recherchez

Réponses:

29

Si timeet Genotypesont tous deux des prédicteurs catégoriques tels qu'ils semblent être, et que vous souhaitez comparer toutes les paires temps / génotype les unes aux autres, alors vous pouvez simplement créer une variable d'interaction et utiliser les contrastes de Tukey dessus:

weights$TimeGeno <- interaction(weigths$Time, weights$Geno)
model <- lme(weight ~ TimeGeno, random = ~1|Animal/time, data=weights) 
comp.timegeno <- glht(model, linfct=mcp(TimeGeno="Tukey")) 

Si vous êtes intéressé par d'autres contrastes, vous pouvez utiliser le fait que l' linfctargument peut prendre une matrice de coefficients pour les contrastes - de cette façon, vous pouvez configurer exactement les comparaisons que vous souhaitez.

MODIFIER

Les commentaires semblent indiquer que le modèle équipé du TimeGenoprédicteur est différent du modèle d'origine équipé du Time * Genotypeprédicteur. Ce n'est pas le cas , les modèles sont équivalents. La seule différence réside dans le paramétrage des effets fixes, qui est configuré pour faciliter l'utilisation de la glhtfonction.

J'ai utilisé l'un des ensembles de données intégrés (il a Diet au lieu de Genotype) pour démontrer que les deux approches ont la même probabilité, les valeurs prédites, etc.:

> # extract a subset of a built-in dataset for the example
> data(BodyWeight)
> ex <- as.data.frame(subset(BodyWeight, Time %in% c(1, 22, 44)))
> ex$Time <- factor(ex$Time)
> 
> #create interaction variable
> ex$TimeDiet <- interaction(ex$Time, ex$Diet)
    > 
    > model1 <- lme(weight ~ Time * Diet, random = ~1|Rat/Time,  data=ex)    
    > model2 <- lme(weight ~ TimeDiet, random = ~1|Rat/Time, data=ex)    
    > 
    > # the degrees of freedom, AIC, BIC, log-likelihood are all the same 
    > anova(model1, model2)
           Model df      AIC      BIC    logLik
    model1     1 12 367.4266 387.3893 -171.7133
    model2     2 12 367.4266 387.3893 -171.7133
    Warning message:
    In anova.lme(model1, model2) :
      fitted objects with different fixed effects. REML comparisons are not meaningful.
    > 
    > # the second model collapses the main and interaction effects of the first model
    > anova(model1)
                numDF denDF   F-value p-value
    (Intercept)     1    26 1719.5059  <.0001
    Time            2    26   28.9986  <.0001
    Diet            2    13   85.3659  <.0001
    Time:Diet       4    26    1.7610  0.1671
    > anova(model2)
                numDF denDF   F-value p-value
    (Intercept)     1    24 1719.5059  <.0001
    TimeDiet        8    24   29.4716  <.0001
    > 
    > # they give the same predicted values
    > newdata <- expand.grid(Time=levels(ex$Time), Diet=levels(ex$Diet))
    > newdata$TimeDiet <- interaction(newdata$Time, newdata$Diet)
> newdata$pred1 <- predict(model1, newdata=newdata, level=0)
    > newdata$pred2 <- predict(model2, newdata=newdata, level=0)
> newdata
  Time Diet TimeDiet   pred1   pred2
1    1    1      1.1 250.625 250.625
2   22    1     22.1 261.875 261.875
3   44    1     44.1 267.250 267.250
4    1    2      1.2 453.750 453.750
5   22    2     22.2 475.000 475.000
6   44    2     44.2 488.750 488.750
7    1    3      1.3 508.750 508.750
8   22    3     22.3 518.250 518.250
9   44    3     44.3 530.000 530.000

La seule différence est que quelles hypothèses sont faciles à tester. Par exemple, dans le premier modèle, il est facile de tester si les deux prédicteurs interagissent, dans le second modèle, il n'y a pas de test explicite pour cela. En revanche, l'effet conjoint des deux prédicteurs est facile à tester dans le deuxième modèle, mais pas dans le premier. Les autres hypothèses sont testables, c'est juste plus de travail pour les mettre en place.

Aniko
la source
3
glhtutilise les degrés de liberté donnés dans le modèle lme. Je ne suis pas sûr que ces degrés de liberté soient appropriés ...?
Stéphane Laurent
2
Je suis également curieux de savoir comment cela peut être fait au mieux. Cette approche, cependant, donne des effets à partir d'un modèle différent - celui qui ne teste essentiellement qu'une interaction. Le deuxième modèle ne comprend pas du tout les deux principaux effets potentiels. Cela ne semble pas être une méthode appropriée pour vérifier les effets dans le premier modèle.
Marcus Morrisey
@Aniko, je pensais combiner 2 variables catégorielles en une comme vous venez de le faire, mais j'ai hésité car une seule des variables est dans le sujet, l'autre est entre. Pouvez-vous confirmer que cela ne fonctionne pas? J'ai remarqué que dans l'exemple que vous gardez, Animal/timequi n'est plus un des facteurs. Est- understandce vraiment ça?
toto_tico
@toto_tico, j'ai édité la réponse pour montrer que le deuxième modèle est équivalent au premier.
Aniko
3
@toto_tico, je vous ai donné un exemple reproductible. Pourquoi n'essayez-vous pas de all.equal(resid(model1), resid(model2))voir qu'ils sont les mêmes avant de deviner le contraire? Seul le paramétrage des effets fixes est différent. TimeDietn'est pas un terme d'interaction pure, et il n'est pas équivalent à Time:Diet, mais plutôt à Time + Diet + Time:Diet.
Aniko