Comment effectuer une ANOVA mixte 4 x 4 avec des contrastes entre et au sein des sujets en utilisant R?

11

Utilisateur débutant de R aux prises avec une ANOVA de mesures répétées.

J'ai un ensemble de données qui comprend un facteur entre les sujets avec 4 niveaux (codé dans une seule variable appelée «groupes») et un facteur entre les sujets avec 4 niveaux (codé en quatre variables distinctes «DV1», «DV2», «DV3 ',' DV4 ').

J'ai les objectifs suivants:

  1. Exécutez une mesure ANOVA globale répétée.
  2. Comparez les groupes à l'aide de contrastes personnalisés (comme dans une commande LMATRIX dans SPSS).
  3. Comparez différents niveaux de DV à l'aide de contrastes personnalisés (comme dans une commande MMATRIX dans SPSS).
  4. Faites une combinaison de 2) et 3) simultanément, donc je compare seulement certains groupes à certains niveaux du facteur intra-sujets.
  5. Exécutez un ensemble de contrastes qui ne résument PAS à zéro.

Je sais que je peux le faire dans SPSS sans trop de problème, mais je ne peux pas avoir une idée claire de la façon de le faire dans R. J'ai vu comment certaines parties de cela pourraient fonctionner dans différents packages, mais je ne l'ai pas vu jusqu'ici comment cela pourrait fonctionner dans une procédure ou un ensemble de procédures connexes dans R.

aquadhere
la source

Réponses:

18

Un croquis d'une solution (pour une autre voir ci-dessous):

  1. Les données doivent être au format long (c'est-à-dire sur la valeur par ligne) plutôt qu'au format large comme dans SPSS (c'est-à-dire un sujet par ligne), voir le package de remodelage, ou ?reshape. Cela inclut qu'il doit y avoir une variable indiquant l'identifiant du sujet (c'est-à-dire l'ID du sujet).
  2. Tous les facteurs (y compris l'identifiant du sujet) doivent être de classe (exécutez strsur votre bloc de données pour vérifier cela). Si vous ne le faites pas, vos résultats seront erronés.
  3. Si vous souhaitez obtenir des sommes de carrés de type III, définissez les contrastes par défaut pour effectuer le codage:
    options(contrasts=c("contr.sum","contr.poly"))
  4. Spécifiez le modèle souhaité avec à lmepartir du nlmepackage (installez et chargez le package au préalable via install.packages("nlme")et library(nlme)) à l'aide d'une structure de corrélation symétrique compund. Voir la réponse et surtout mon commentaire à la réponse acceptée à cette question. Dans votre cas, cela pourrait être quelque chose comme (si vous aviez fourni des exemples de données, ce qui est fortement recommandé, vous auriez reçu le bon code):
    my.anova <- lme(dv ~ group*within, data = your.df, random = ~1|id, correlation = corCompSymm(form = ~1|id))
  5. Utilisez la anovafonction générique pour obtenir la table anova (voir ?anova.lme):
    anova(my.anova)
    Pour obtenir des sommes de carrés de type III, utilisez la anovacommande avec l'argument typedéfini sur "marginal"(cela ne fonctionne que si les contrastes sont définis sur le codage des effets, voir le point 3):
    anova(my.anova, type = "marginal")
  6. L'objet de type ajusté lmepermet désormais à diverses fonctions d'effectuer des contrastes. La solution la plus flexible (mais plutôt peu pratique) est l' Largument dans un appel à anova.lme(voir à nouveau ?anova.lme).
    D'autres solutions nécessitent également un lmeobjet ajusté comme argument:
    La estimablefonction du paquet gmodels est également très flexible . Ce package offre également la fit.contrastsfonction.
    Le package multcomp permet des contrastes en utilisant l'ajustement d'erreur alpha (mais vous ne pouvez effectuer des contrastes qu'en utilisant l'un de vos facteurs), en utilisant la glhtfonction.
    Une approche nouvelle et prometteuse est le paquet de contraste , cependant, jusqu'à présent, il ne semble pas priver tous les contrastes possibles.

Une solution alternative consiste à utiliser l'ANOVA standard via la combinaison de afexet lsmeanscomme indiqué dans la afex-vignette .

Henrik
la source
(+1) Réponse formidable et très instructive. En attendant la publication du blog ...
chl
?anova.lmene fonctionne pas pour moi et le methods(anova)répertorie comme une fonction non visible.
John
@John Avez-vous déjà chargé nlme? Sinon, exécutez library(nlme), alors cela devrait fonctionner. Si cela ne fonctionne toujours pas, d' install.packages("nlme")abord.
Henrik
ah ... je n'avais pas apparemment, seulement lme4
John
@ Henrick, je peux passer à l'étape 5, mais je ne suis pas en mesure de mettre en place des contrastes comparant des facteurs spécifiques entre sujets à des niveaux spécifiques de facteurs intra-sujet. Toute la documentation en ligne que j'ai vue concerne le test des différences à différents niveaux de facteurs inter-sujets. Avez-vous un exemple de code? Je peux juste attendre le billet de blog si vous allez le couvrir là-bas.
aquadhere du