Notes pratiques pour les analyses linéaires sous R - TONIC
Transcription
Notes pratiques pour les analyses linéaires sous R - TONIC
Notes pratiques pour les analyses linéaires sous R Partie I : Généralités Version 1.1 (novembre 2014) Florent Aubry, Inserm/UPS U825, Toulouse Ce document a comme objectif de donner des informations pratiques pour réaliser des analyses statistiques sous R. Ce n’est donc ni un cours de statistiques ni un document de référence et d’aide sur les fonctions citées dans ce document. Les explications ‘statistiques’, quand il y en a, ne sont qu’illustratives. Elles ne peuvent être considérées comme des développements formels mais seulement comme des indications intuitives pour permettre de mieux comprendre le propos. En ce qui concerne l’utilisation des fonctions et la signification de leurs arguments, se reporter à leurs pages d’aide en ligne (help( "nom de la fonction") ou ?nomFonction), aux vignettes associées aux packages et autres documents accessibles en ligne. Pour l’utilisation générale de R, voir mon document ‘Programmer sous R’. Pour des détails sur les modèles linéaires sous R, voir notamment le livre de J. Faraway "Practical Regression and Anova using R" (http://cran.r-project.org/doc/contrib/FarawayPRA.pdf) dont ce document peut être considéré comme un complément en ce qui concerne notamment la programmation des comparaisons planifiées et des tests post-hoc. De nombreuses analyses peuvent être réalisées à partir de l’interface développée par John Fox, R commander. Bien que je ne l’ai pas utilisée pour ce document, je la recommande en pratique et de ne programmer à la console que si l’analyse qu’on désire réaliser n’est pas disponible à partir de cette interface. C’est à l’utilisateur de faire la correspondance entre ce document et les possibilités offertes par cette interface. Cette partie peut paraître ardue à la première lecture car il fait deux hypothèses : 1) une certaine familiarité avec la problématique des statistiques inférentielles ; 2) une bonne connaissance de R. Il convient cependant de la lire une première fois avant d’aborder chapitres concernant la programmation pratique des analyses (régression, (M)AN(C)OVA…) car elle présente les concepts communs à ces autres chapitres qui s’y réfèrent constamment. N. B. : 1) Comme tout document de synthèse, ce document peut contenir des erreurs ou des imprécisions. Si vous en relevez, faites les moi connaître, ainsi que tout commentaire, propositions d'exemples, retours d'expérience, ... Mon adresse électronique est : '\u0066\u006C\u006F\u0072\u0065\u006E\u0074\u002E\u0061\u0075\u0062\u0072\u0079\u 0040\u0069\u006E\u0073\u0065\u0072\u006D\u002E\u0066\u0072' Pour l'obtenir en clair, il suffit d'imprimer cette chaîne de caractères. 2) Ce document présente les fonctions les plus couramment utilisées, c’est-à-dire répondant à une majorité de problèmes. Malgré tout, ces fonctions ne sont pas universelles et doivent utilisées avec discernement. L’objectif de ce document est donc de donner les bases permettant d’utiliser ces fonctions sans trop d’erreurs. Table des matières I - MODÈLES LINÉAIRES..................................................................................................................................... 1 LES MODÈLES.......................................................................................................................................................... 1 Le modèle linéaire de base ............................................................................................................................ 1 Analyse de données de comptage ................................................................................................................. 2 Régression logistique et multinomiale........................................................................................................... 3 Analyse de survie ........................................................................................................................................... 3 Modèle stratifié ............................................................................................................................................. 4 Modèle à effets mixtes .................................................................................................................................. 4 Modèle à mesures répliquées et répétées ..................................................................................................... 4 Prise en compte de mesures multiples ....................................................................................................................... 5 Réplication des mesures ............................................................................................................................................. 5 Répétition des mesures .............................................................................................................................................. 6 Mesures répétées et répliquées ................................................................................................................................. 7 NOTION DE MODÈLE DANS R ..................................................................................................................................... 7 Construction de la partie gauche d’une formule ........................................................................................... 9 Construction générale de la partie droite de la formule ................................................................................ 9 LES PROCÉDURES ................................................................................................................................................... 11 Modèle linéaire et modèle linéaire généralisé ............................................................................................. 11 Fonctions de base ..................................................................................................................................................... 11 Package additionnels ................................................................................................................................................ 12 Quelques règles pour le choix du modèle linéaire ....................................................................................... 13 Packages Zelig et Rcmdr .............................................................................................................................. 14 Mesures répétées et modèle à effets mixtes ............................................................................................... 15 EXPLORATION ET VISUALISATION DES DONNÉES ........................................................................................................... 16 II - CHOIX DE L’APPROCHE .............................................................................................................................. 17 SPÉCIFICATION DU MODÈLE MIXTE ............................................................................................................................ 17 Vérification de l’existence d’un effet aléatoire ............................................................................................ 18 Approche graphique ................................................................................................................................................. 18 Approche basée sur des tests conditionnels ............................................................................................................ 21 Approche statistique ................................................................................................................................................ 21 Spécification du modèle aléatoire ............................................................................................................... 22 COMPARAISON DE MODÈLES.................................................................................................................................... 23 PRÉDICTION ......................................................................................................................................................... 25 II - TESTS D’HYPOTHÈSES ................................................................................................................................ 26 TYPE DE SOMME DE CARRÉS..................................................................................................................................... 26 Définition des types ..................................................................................................................................... 26 Obtention des types de SC ........................................................................................................................... 28 COMPARAISONS PLANIFIÉES ET CONTRASTES ............................................................................................................... 28 Hypothèses complexes................................................................................................................................. 30 Les contrastes de R ...................................................................................................................................... 31 Le contraste ‘traitement’ .......................................................................................................................................... 31 Le contraste ‘somme’ ............................................................................................................................................... 33 Le contraste ‘Helmert’ .............................................................................................................................................. 34 Contraste des différences successives...................................................................................................................... 35 Contraste polynomial ............................................................................................................................................... 37 Construction de contrastes personnalisés ................................................................................................................ 38 Contrastes et matrice du modèle (model matrix / design matrix) ........................................................................... 40 Tester les hypothèses ................................................................................................................................... 44 Significativité de l'analyse......................................................................................................................................... 44 Valeurs des paramètres ............................................................................................................................................ 46 Moyennes et intervalles de confiance ...................................................................................................................... 47 GROUPES NON ÉQUILIBRÉS ET HÉTÉROSCÉDASTICITÉ ..................................................................................................... 50 Procédures de vérification ........................................................................................................................... 50 i Équilibre des groupes ............................................................................................................................................... 50 Homoscédasticité ..................................................................................................................................................... 53 Prise en compte de l’hétéroscédasticité et du non équilibrage des facteurs ............................................... 54 Non équilibrage des groupes .................................................................................................................................... 54 Hétéroscédasticité .................................................................................................................................................... 55 Groupes non équilibrés et hétéroscédasticité .......................................................................................................... 58 III - TESTS POST-HOC ...................................................................................................................................... 59 VÉRIFICATIONS PRÉLIMINAIRES ................................................................................................................................. 60 PUISSANCE DES ANALYSES ....................................................................................................................................... 60 power.t.test ................................................................................................................................................. 62 power.prop.test ........................................................................................................................................... 63 power.anova.test ......................................................................................................................................... 63 EFFETS DES PRÉDICTEURS ........................................................................................................................................ 64 TESTS POST-HOC ................................................................................................................................................... 65 Package agricolae........................................................................................................................................ 66 Package car ................................................................................................................................................. 66 Package Laercio pour aov seulement .......................................................................................................... 66 Package lmerTest ........................................................................................................................................ 67 Package lmtest ............................................................................................................................................ 67 Package lsmeans ......................................................................................................................................... 67 Package moments ....................................................................................................................................... 68 Package multcomp ...................................................................................................................................... 68 Package nortest ........................................................................................................................................... 68 Package stats (cœur de R) ........................................................................................................................... 69 PACKAGE LSMEANS ................................................................................................................................................ 70 PACKAGE MULTCOMP............................................................................................................................................. 74 mcp .............................................................................................................................................................. 75 lsm ............................................................................................................................................................... 75 Matrice explicite .......................................................................................................................................... 76 Construction de la matrice ....................................................................................................................................... 76 Obtention des résultats des tests ............................................................................................................................. 80 Intervalles de confiance et regroupements .............................................................................................................. 80 COMPARAISON DE GLHT ET LSMEANS......................................................................................................................... 81 PRÉCISION FINIE DES MESURES ................................................................................................................................. 81 IV - NOTION DE POINTS INFLUENTS, OUTLIERS ET POINTS ABERRANTS.......................................................... 85 POINTS INFLUENTS................................................................................................................................................. 85 Levier (leverage) .......................................................................................................................................... 85 Résidus standardisés.................................................................................................................................... 85 Résidus studentisés ...................................................................................................................................... 86 DFFITS .......................................................................................................................................................... 86 DFBETA ........................................................................................................................................................ 86 La distance de Cook ..................................................................................................................................... 87 COVRATIO .................................................................................................................................................... 87 Correspondance entre les indices et les fonctions de R ............................................................................... 87 Visualisation des indices .............................................................................................................................. 88 INFLUENCE DANS LES MODÈLES À EFFETS MIXTES .......................................................................................................... 88 DÉTECTION DE LA CORRÉLATION ENTRE PRÉDICTEURS.................................................................................................... 89 ii I - Modèles linéaires Ce chapitre rappelle les principales procédures à utiliser dans les cas courants. Il n’a pas pour objectif d’expliquer les notions statistiques sous-jacentes à ces procédures ni leurs limites, ces points relevant d’un cours de statistique. Notons que ce document ne décrit que les modèles classiques linéaires et linéaires généralisés des statistiques inférentielles basées sur l’approche paramétrique fréquentielle. Il abordera cependant certains points des approches non paramétriques basées sur les techniques de rééchantillonnage de type permutation et bootstrap. Il n’aborde ni les techniques régularisées comme la régression ridge, les régularisations lasso ou elastic net, ni les techniques multivariées de type ACP, PLS, PLS-DA, SEM… régularisées ou non, ni les techniques bayésiennes bien que ces techniques aient un intérêt majeur quand le nombre de variables observées est important par rapport au nombre d’observations et que de ce fait les approches traditionnelles ne sont plus applicables. Sauf mention contraire, toutes les procédures d’analyse mentionnées dans ce chapitre possède les six arguments suivants : formula argument de classe formula1 décrivant le modèle analysé data data.frame (tableau) des données analysées subset les données ; description du sous-ensemble des données à analyser, par défaut, toutes weights vecteur des poids des observations, par défaut, toutes les observations ont le même poids ; na.action fonction indiquant le comportement face à des données absentes (codées NA), ce comportement par défaut n’est pas le même selon les procédures ; contrasts liste nommées des contrastes à appliquer aux facteurs, les noms des membres sont les noms des facteurs, la valeur, le nom de la fonction calculant les contrastes sous forme d’une chaîne de caractères ou d'un symbole ou la matrice des contrastes ; par défaut, les procédures utilisent les contrastes par défaut définis par options( contrasts=...). Les modèles Le modèle linéaire de base La variable dépendante est une variable quantitative continue (analyse monovariée), ce qui correspond à la régression simple, multiple, factorielle ou polynomiale, à l’analyse de variance (Anova) et à l’analyse de covariance (Ancova). 1 Voir notamment mon document ‘Programmer sous R’ pour l’explication des types de données dans R. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 1 Chaque ligne du tableau de données correspond à une observation et les observations sont indépendantes entre elles, gaussiennes de moyenne nulle et, théoriquement, identiquement distribuées, c’est-à-dire que les erreurs de mesure de la variable dépendante ont toutes la même variance. De plus, chaque observation ayant le même ensemble de valeurs des variables indépendantes sont considérées comme différentes occurrences du même phénomène (modèle à effets fixes). La procédure à utiliser dans ce cas est lm. Il faut en effet se méfier de aov qui n’est valable que pour les groupes équilibrés. Notamment dans le cas de l’hétéroscédasticité, on peut utiliser la procédure glm (generalized linear model) en utilisant le modèle d’erreur par défaut (argument family de valeur gaussian) et en donnant comme poids des observations (weights) l’inverse, éventuellement estimée, de la dispersion dans le groupe (cf. chapitre suivant, traitement de l’hétéroscédasticité). Si l’erreur est log-normale, on utilisera alors family=gaussian( link="log"). Pour les autres choix possibles de fonction de lien, se référer à la théorie du modèle linéaire généralisé. Quand les différentes observations ne sont pas indépendantes, les procédures lm et glm ne sont pas adaptées. La procédure gls du package nlme permet de traiter des erreurs liées entre elles au travers d’un prédicteur et/ou des erreurs de matrices de variance/covariance particulières grâce à deux arguments qui font appel à des estimateurs spéciaux, les arguments correlation pour traiter les corrélations à l’intérieur des groupes ou liées à un régresseur et weights. Il faut cependant noter que cette fonction peut être très gourmande en temps de calcul et peut avoir des problèmes de convergence. Elle n’est donc pas recommandée pour la majorité des cas mais devrait être utilisée pour l’un des trois cas suivants : 1) erreurs corrélées entre elles en fonction d’un régresseur (corrélation détectée par un test comme celui de Durbin-Watson) ; 2) corrélations des erreurs à l’intérieur d’un groupe (ou strate ; cf. modèles stratifiés) ; 3) hétéroscédasticité. Analyse de données de comptage Quand la variable dépendante est une variable de comptage (entier positif ou nul), on utilisera la procédure glm avec comme valeur de l’argument family, poisson (éventuellement, quasipoisson quand il y sur-dispersion [overdispersion], c’est-à-dire quand la déviance résiduelle est largement plus grande que le nombre de degrés de liberté2). Ce choix se justifie par le fait qu’on considère que chaque comptage est équiprobable, ce qui conduirait à une loi binomiale si le nombre maximum d’événements était fini. Quand le comptage devient infini, sa forme asymptotique est la loi de Poisson. Dans ce cas, la fonction de lien (argument link de la fonction family, est log (le défaut) ou sqrt. 2 Cette valeur est obtenue par residuals( resultat.glm, type="deviance") ; voir la page d’aide de residuals.glm. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 2 Si on doit analyser des pourcentages à la place de comptage, il est préférable d’utiliser une des transformations classiques des pourcentages (par exemple, la transformation arc sinus) et de revenir au cas normal, même si cela complique l’interprétation des résultats. Régression logistique et multinomiale Quand la variable dépendante est une variable binaire (variable logique ou un facteur à deux niveaux), le but de l’analyse est de déterminer l’influence positive ou négative de chacun des prédicteurs, en considérant l’un des niveaux comme niveau de référence (souvent sujet sain ou état normal). Dans ce cas on utilise une régression logistique (prédicteurs continus) ou assimilée (s’il y a des facteurs). Cette régression peut être effectuée par la procédure glm avec comme valeur du paramètre family, la valeur binomial. La fonction de lien par défaut est le logit. Cependant si on suppose que la variable dépendante est l’image d’une variable continue, on pourra utiliser le probit comme fonction de lien. Quand la variable dépendante est un facteur à plus de deux niveaux, on peut conduire une analyse similaire à celle décrite précédemment. Il existe alors trois procédures possibles : 1. la fonction multinom du package nnet ; 2. la fonction vglm du package VGAM avec comme valeur de l’argument family, multinomial3 ; 3. la fonction polr du package MASS. multinom traite exclusivement des variables dépendantes non ordonnées, polr des variables dépendantes ordonnées et vglm peut traiter les deux types de variables dépendantes (cf. dans le chapitre sur la régression, la section consacrée à la régression logistique et les aides en ligne de ces fonctions). Le niveau considéré par défaut comme niveau de référence diffère selon les procédures, comme diffère aussi la manière d’indiquer un autre niveau de référence que celui par défaut. Voir les pages d’aide en ligne pour plus de détails. La partie gauche de la formule peut être la référence à une colonne de données contenant un facteur ou une matrice à K colonnes (2 dans la cas d’une variable binaire, sinon le nombre de niveaux du facteur). Dans ce cas, le nom de chacune des colonnes est celui du niveau et chaque ligne contient le nombre de cas pour chacun des niveaux et chaque combinaison des prédicteurs. La partie gauche de cette configuration sera alors codée par : cbind( n.1, n.2, …) ~ Analyse de survie Le package survival propose les principales fonctions de base de l’analyse de survie. 3 Hors de cette utilisation, glm et vglm ont des comportements très similaires. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 3 Modèle stratifié Le modèle classique pose que les erreurs sont indépendantes d’une observation à l’autre. Dans la pratique, notamment dans les études neuropsychologiques, ce n’est pas toujours le cas, soit parce que les mesures sont répliquées chez le même sujet (le paradigme est présenté plusieurs fois dans les mêmes conditions), soit répétées chez le même sujet (le paradigme est présenté plusieurs fois en faisant varier certaines conditions), soit parce qu’on considère que l’erreur (ou la dispersion) dépend du niveau d’un facteur indépendamment du sujet (par exemple, pour tenir compte de la fréquence ou la familiarité avec les mots en psycholinguistique). On veut alors modéliser ces configurations pour effectuer des tests plus fiables et plus robustes. Souvent la littérature parle alors de stratification de l’erreur (strata) et le modèle devra inclure cette stratification. Pour plus de détails, voir notamment "Notes on the use of R for psychology experiments and questionnaires", Jonathan Baron, Yuelin Li, accessible à partir du site de R (www.cran-r.org). R offre plusieurs méthodes pour modéliser ce type d'expérience (cf. infra) : 1) utilisation de la procédure aov avec un terme Error() décrivant les strates ; cependant, cette procédure à les mêmes limites que aov en utilisation classique ; 2) utilisation de la procédure gls de nlme avec modélisation de la corrélation à l’intérieur des niveaux du ou des facteurs de groupement (argument correlation) ; 3) utilisation d’un modèle à effets mixtes, soit lme du package nlme, qui inclut aussi un argument correlation, soit lmer du package lme4. Modèle à effets mixtes Les modèles à effets mixtes incluent des effets fixes et des effets aléatoires. L’objectif de ce document n’étant pas de décrire en détail ce type de modèle, je me contenterai de définir succinctement ces deux types d’effet. Les effets fixes sont ceux pour lesquelles les valeurs des paramètres sont fixes pour toute la population tandis que les effets aléatoires sont ceux pour lesquels il existe une relation (interaction) entre la valeur observée et l’observation. On peut définir plusieurs type d’effets aléatoires, ceux dus à la réplication ou à la répétition des mesures, à une hiérarchisation du schéma expérimental… (cf. infra) On utilise notamment un facteur aléatoire quand le nombre réel de niveaux de ce facteur est important et que de ce fait, l'expérience n'inclut qu'un échantillon aléatoire des niveaux. Deux packages assez proches l’un de l’autre (et écrits par les mêmes auteurs) permettant de gérer ce type de modèle : la package nlme et lme4. Modèle à mesures répliquées et répétées Ce type de modèle sera plus amplement détaillé dans le chapitre sur les Manova et Anova à mesures répétées. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 4 Prise en compte de mesures multiples L’hypothèse forte de l’analyse est que toutes les mesures sont faites sur le même individu avec différentes valeurs des prédicteurs. Ceci signifie qu’on considère les sujets comme interchangeables et tous identiques à un sujet idéal. C’est ce qu’on appelle le modèle à effet fixe. Pour améliorer l’estimation, on peut vouloir prendre en compte le fait que l’expérience implique différents individus et répliquer effectivement la mesure sur chacun des individus. De manière similaire, en régression, pour une même valeur d’un régresseur, on peut répliquer la mesure afin d’améliorer la précision de la mesure pour ce point. Cette réplication des mesures est différente de la répétition des mesures, cette dernière étant le fait de mesurer sur chaque sujet, la même grandeur plusieurs fois selon des conditions expérimentales différentes mais qui peuvent être ordonnées, afin d’évaluer la variation de la grandeur en fonction de cet ordre. Dans ce cas, l’ordre joue un rôle majeur alors que dans le cas de la réplication il ne joue aucun rôle car les mesures sont interchangeables. Intuitivement, on peut découper la mesure en trois parties : 1. un bruit de mesure qu’on supposera indépendant d’une mesure à l’autre, centré, généralement gaussien de variance constante (hypothèse sous-jacente aux modèles linéaires) ; 2. un effet propre au sujet qui sera indépendant d’un sujet à l’autre, le même pour toutes les expériences faites sur un sujet donné dans les mêmes conditions et qui pourra être constant ou non au travers des conditions ; la variabilité des paramètres dans la population est la conséquence de cette variabilité entre les individus ; de plus, cet effet sujet peut induire une corrélation entre les mesures faites sur le même sujet comme par exemple en IRM où le bruit sur les images sera constitué d’un bruit lié à l’imageur (bruit lié à l’antenne, à l’électronique de détection...) et un bruit lié au sujet (sa corpulence, son bougé...) ; 3. l’effet recherché propre aux conditions de l’expérience. Ignorer le second point conduit à une surestimation de l’erreur et donc à une perte de puissance du test, que les mesures soient répliquées, répétées (cf. le test de Student apparié) ou les deux à la fois. Cependant, le second point ne peut être pris en compte qu’à condition d’avoir explicitement plusieurs mesures prises sur le même sujet. Nous allons examiner les différentes manières de prendre en compte la réplication des mesures, puis la répétition des mesures sans réplication et enfin les mesures répétées et répliquées. Réplication des mesures L’une des méthodes proposée par certains auteurs est le pooling. Cette approche consiste à remplacer l’ensemble des valeurs prises sur un sujet dans des conditions similaires (mêmes niveaux des variables explicatives qualitatives et mêmes valeurs des variables explicatives quantitatives) par la moyenne de ces mesures. Cette approche peut se justifier dans la mesure où l’analyse est une analyse de la tendance centrale et que moyenner améliore la précision de l’estimation de la moyenne. Cependant, cette approche n’a de sens que : F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 5 1) si les mesures moyennées sont prises sur le même sujet, dans des conditions identiques ; 2) si le sujet n’est pas une des variables explicatives d’intérêt ; 3) s’il n’y a pas d’interactions entre le sujet et les conditions de mesures ; entre autres, il faut que les mesures ne soient pas corrélées entre elles. Le code pour effectuer le pooling peut utiliser la fonction aggregate : df.pool <- aggregate(Y ~ sujet + les predicteurs a pooler, donnees, mean) Dans ce cas, il faut pondérer les observations analysées (argument weights), en leur donnant comme poids le nombre de variables poolées, c’est-à-dire le nombre de mesures entrant dans le calcul de la moyenne. Cependant, ce poids n’est valable que si les variances estimées sont identiques, sinon il est préférable de pondérer les individus par l’inverse des variances. Cependant, il faut toujours se méfier des outliers. lm ne permet pas de prendre en compte l’effet sujet si on n’utilise pas l’approche par pooling. aov permet de gérer ce cas de figure. Il n’y a priori pas de problème pour utiliser cette fonction pour les régressions. Dans le cas des Anova, le résultat est sujet à caution si les groupes ne sont pas équilibrés (cf. la fonction replications) ou s'il existe plus d'une strate. Par exemple, la relation entre les données du même sujet est décrite - pour aov par la fonction Error ajouté à la formule. On écrira alors : aov( Y ~ X + Error( RID), data=donnees) avec RID, le facteur identification des sujets et X, le modèle testé, - pour gls, par correlation=corCompSymm( form=~ 1 | RID), - lme et lmer, cette spécification se fera par la spécification des facteurs aléatoires ; lme permet de coder les corrélations comme gls (argument correlation), tandis que les poids des individus sont codés différemment (comme pour gls dans lme et comme dans lm pour lmer). Répétition des mesures La répétition des mesures est l’action de prendre des mesures sur le sujet en variant les conditions. Il y a donc un appariement puisque le sujet est son propre témoin. Si le prédicteur est quantitatif, cela conduit à une analyse de régression. C’est souvent dans cette catégorie qu’entrent les études longitudinales bien que le prédicteur peut aussi être exprimé sous forme d’un facteur ordonné (par exemple, score avant le traitement, scores à différentes étapes du traitement, score à la fin du traitement, score consolidé un certain temps après le traitement.) Si le processus mesuré est tel qu’il existe un effet d’accumulation, c’està-dire que la mesure au point i est égale à celle au point i-1, augmentée (ou diminuée) d’une certaine quantité, les différentes mesures peuvent être corrélées. Il peut alors être plus avantageux dans ce cas d’utiliser des méthodes plus sophistiquées issues de l’analyse des séries temporelles que les méthodes classiques de régression. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 6 Si les prédicteurs sont des facteurs, on entre alors dans la catégorie des analyses multivariées qui seront abordés dans le chapitre sur les Manova. Cependant, si le facteur est à deux niveaux, on peut utiliser un test de Student apparié. lm permet de spécifier les mesures répétées. Dans ce cas, la partie gauche de la formule est une matrice dont les colonnes représentent les valeurs pour chacune des répétitions : cbind( rep.1, rep.2, …) ~ On utilise donc la même formule que pour une Manova. C’est lors de la création de la table d’Anova des résultats par la fonction anova ou Anova (package car), qu'on spécifie le schéma expérimental (design) intra-sujet. Je reviendrai sur cette spécification dans le chapitre consacré aux Anova à mesures répétées4. aov, gls, lme et lmer utiliseront la même écriture que pour les mesures répliquées. Cf. le paragraphe précédent pour le codage des corrélations et des poids pour lme et lmer. Mesures répétées et répliquées C’est la combinaison des deux types de mesures multiples. On a une corrélation des erreurs due au sujet (appariement comme pour la répétition) et pour chacun des niveaux du facteur ou chacune des valeurs du régresseurs, une erreur systématique du type de celle de la réplication. On a alors deux schémas possibles : 1) l’erreur systématique est interne au sujet, c’est donc un modèle hiérarchique dont la formule d’erreur est du type RID/MESURE ; 2) il existe une erreur systématique lié à la réplication de la mesure indépendante du sujet et l’erreur sera du type RID:MESURE. On peut utiliser les méthodes présentées précédemment. Notion de modèle dans R Le modèle est la représentation théorique du problème posé sous forme d’une relation entre plusieurs variables. Si la relation est linéaire on parle alors de modèle linéaire, si cette relation peut être transformée en une relation linéaire, on parle de modèle linéaire généralisé. Les variables qui interviennent dans le modèle sont de deux natures : 1. les variables acquises, et qu’on veut analyser, prennent selon les cas le nom de variables dépendantes, de variables liées ou de variables mesurées (mesures) ; si on analyse qu’une seule mesure, on parle de statistique monovariée sinon on parle de statistiques multivariées ; 2. les variables connues a priori avant l’acquisition des mesures prennent le nom de variables indépendantes, variables libres, variables explicatives ou prédicteurs (régresseurs si elles sont continues). Si la valeur de ces variables est connue avec une 4 Les pages d’aide sont anova.mlm et Anova.mlm. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 7 erreur, on parlera de variables instrumentales. Ce document ne traite pas des inférences mettant en jeu ce type de variables. Les variables mesurées peuvent être : ̶ numériques : continues de moins l’infini à plus l’infini, ne varier que dans un intervalle donné (par exemple, les pourcentages), de manière discrète (par exemple, des comptages) ; ̶ symboliques : étiquettes qualifiant des classes d’une partition ou symboles exprimant une classification selon un certain ordre (scores) ; ̶ indicatrices d’un événement comme en analyse de survie ; ̶ des dates… Le type d’analyse est fonction du type des variables mesurées. Dans les modèles linéaires généralisés, c’est lui qui déterminera la famille (family) de la distribution à utiliser. Les variables explicatives sont le plus souvent : ̶ numériques, on parle alors souvent de covariables (covariate) ou de régresseurs et dans la majorité des cas, elles sont traitées comme des variables continues ; ̶ symboliques, on parle alors de facteurs (factor) et chaque étiquette est appelé niveau (level) ; les facteurs peuvent être ordonnés ou non. Si on a acquis des données pour tous les niveaux d’un facteur et qu’on s’intéresse aux différences entre mesures en fonction des niveaux, on dira que le facteur est un facteur fixe et que l’analyse est à effets fixes (fixed effect model). Par contre, si on n’utilise qu’une partie (tiré au hasard) des niveaux, on ne peut plus s’intéresser aux différences entre niveaux et on ne peut que simplement estimer la distribution des mesures pour ce facteur. On parle alors de modèle à effets aléatoires (random effect model). Les modèles purement aléatoires sont rarement intéressants et, quand l’expérience implique des facteurs aléatoires, on a souvent aussi des facteurs fixes et/ou des régresseurs. Dans ce cas, on parle de modèle mixtes (mixed effect model). Un exemple typique de facteur aléatoire est l’identité du sujet. Le modèle est décrit par une formule, objet de la classe formula. La formule comporte deux parties séparées par ~ (tilde). La partie gauche fait référence aux variables dépendantes et la partie droite aux variables indépendantes. La formule permet une spécification très souple du schéma de l’analyse car elle peut non seulement faire référence aux variables mais aussi à des transformations de variables ou des combinaisons de variables, par exemple cbind pour spécifier plusieurs variables à analyser, ou des fonctions spéciales comme Surv pour l’analyse de survie. Exemples de formules dans le contexte des modèles linéaires : Y~X Régression de Y sur X, Anova à un facteur X, … Y ~ log( X) Régression de Y sur log( X) log( Y) ~ log( X) + I( X^2) Régression de log( Y) sur log( X) et sur X^2 F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 8 bs( poids, df=5) ~ bs( taille, df=5) Régression du poids sur la taille, tous les deux ajustés par des splines (package splines) de degré 5 ; cbind( Y.1, Y.2) ~ F.1 * F.2 Manova à deux facteurs, F.1 et F.2, des variables Y.1 et Y.2. Notons qu’une formule au sens de R ne fait aucune différence entre une variable numérique et une variable symbolique. Cette distinction ne sera faite que lors de son évaluation dans le contexte de l’analyse. Par exemple, Y ~ X permettant d’analyser la variable Y en fonction des niveaux de X : lm( Y ~ X, data=donnees) est alors interprété selon que la variable X est un facteur ou un régresseur numérique comme : - une Anova testant l’hypothèse que les moyennes des niveaux du facteur X sont identiques ; - une régression de Y sur X. Construction de la partie gauche d’une formule Y une variable dépendante, vecteur de données ; cbind( Y.1, Y.2...) analyse multivariée ; la matrice des variables dépendantes Y.1, Y.2, ... dans une Surv( …) la spécification pour les analyses de survie ; f( Y) avec f une fonction quelconque, par exemple le logarithme. Construction générale de la partie droite de la formule S’il n’y a qu’une variable, on la notera X : Y~X la variable Y est expliquée par la variable X Quand il y a plusieurs variables dépendantes, on note par + le fait qu’on s’intéresse à leurs effets séparément, : le fait qu’on s’intéresse à leur interaction. Exemples : Y ~ X.1 + X.2 n’interagissent pas entre eux ; Y ~ X.1^2 Y est expliqué par les effets de X.1 et de X.2 qui est équivalent à Y ~ X.1 ; Y ~ X.1 + X.2 + X.1:X.2 Y est expliqué par les effets de X.1 et de X.2 et par leur interaction, le : dénotant l’interaction. Le dernier schéma peut être simplifié en utilisant l’opérateur * : Y ~ X.1 * X.2 est équivalent à Y ~ X.1 + X.2 + X.1:X.2 F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 9 À noter que Y ~ (X.1 + X.2)^2 X.2 + X.2 = X.2 ; est équivalent à X.1 * X.2 car X.1:X.1 = X.1 et Y ~ X.1/X.2 est équivalent à Y ~ X.1 + X.1:X.2 X.2 %in% X.1 est équivalent à X.2:X.1. Autres opérateurs généraux utilisables : I( …) les opérateurs +, -, * et ^ à l’intérieur des parenthèses ne seront pas interprétés comme des opérateurs associés aux formules mais des opérateurs numériques ; les variables doivent donc être des variables numériques ; si X est une variable numérique, X^2 est équivalent à X tandis que I( X^2) représente cette variable élevée au carré ; I est donc utile pour les régressions polynomiales ; f( Y) avec f une fonction quelconque, par exemple log ; offset( …) terme à ajouter à une prédicteur linéaire avec un coefficient connu valant 1 au lieu d’estimer le coefficient ; ... Quand le modèle sous-jacent est hiérarchique, il existe un effet principal du facteur de plus haut niveau dans la hiérarchie, puis une interaction entre le facteur immédiatement inférieur et le facteur, puis une interaction triple au niveau suivant. Pour modéliser ce cas de figure on pourra utiliser une construction à partir de l’opérateur /. Exemple : Supposons qu’on ait trois niveaux dans la hiérarchie : PATHOLOGIE, CENTRE, MACHINE et qu’on s’intéresse aux différences entre différentes pathologies, que les données sont acquises dans des centres différents mais qu’un centre ne s’intéresse qu’à une seule pathologie et que chaque centre dispose de plusieurs machines, on pourra écrire : PATHOLOGIE/CENTRE/MACHINE qui est une formule formellement équivalente à PATHOLOGIE + PATHOLOGIE:CENTRE + PATHOLOGIE:CENTRE:MACHINE Cette construction signifie qu’on considère : 1) que par centre, il y a une influence différente de la machine sur la mesure de la pathologie ; 2) qu’il y a un biais de mesure inhérent à chaque centre. Si on considérait que machine et centre ont des effets indépendants sur la mesure, il faudrait écrire : PATHOLOGIE/(CENTRE + MACHINE) F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 10 Dans les analyses statistiques, on suppose par défaut qu’il existe une ordonnée à l’origine non nulle. Il est donc inutile de la noter. Si on veut forcer cette ordonnée à zéro, on peut utiliser l’une des constructions suivantes : i) Y ~ 0 + X.1 * X.2 ii) Y ~ X.1 * X.2 – 1 Il convient d’être prudent dans l’utilisation de cette option car les procédures d’analyse auront des comportements différents selon le type des prédicteurs : − si tous les prédicteurs sont numériques (analyse de régression), l’ordonnée à l’origine sera nulle, c’est-à-dire qu’on pose alors comme contrainte : yˆ(origine )=0 ; − si au moins un des prédicteurs est un facteur, alors les valeurs estimées des niveaux et des interactions pour le premier facteur rencontré le sont par rapport à zéro et le contraste n’a aucun effet (cf. infra). De plus, la qualité de l’ajustement n’est pas la même avec l’ordonnée à l’origine forcée à zéro ou non5, sans que l’on puisse déterminer à l’avance lequel des deux modèles est le meilleur en termes d’ajustement aux données. Cependant un tel choix n’est cohérent que si on est sûr que le modèle testé est basé sur un centrage des mesures (grande moyenne nulle). Exemple : lm.1 <- lm( Y.HOM ~ GROUPE * NIVEAU, v.lm) summary( lm.1) : 2 2 R : 0.143 ; R ajusté : 0,101 ; F( 11, 228) = 3.45 (p = 0,00019) lm.0 <- lm( Y.HOM ~ 0 + GROUPE * NIVEAU, v.lm) summary( lm.0) : 2 2 R : 0.177 ; R ajusté : 0,134 ; F( 12, 228) = 4.09 (p ~ 0) Les procédures Modèle linéaire et modèle linéaire généralisé Le cœur de R propose trois fonctions principales pour traiter du modèle linéaire avec effets fixes. Ce sont les types des données qui conduiront à une analyse de régression, une analyse de type Anova, …. Fonctions de base Deux fonctions traitent du modèle linéaire de base : : ne fonctionne bien que pour les groupes équilibrés avec possibilité de faire une aov analyse par strate, c’est-à-dire supposant des corrélations entre les erreurs ; lm 5 : à préférer le plus souvent à aov. Pour l’explication de cette différence, cf. note 28. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 11 Notons que le comportement de la fonction summary est différent selon la procédure : aov : table d’Anova, l’argument intercept permet d’y inclure ou non l’ordonnée à l’origine ; lm : significativité des paramètres estimés6. Une fonction traite du modèle linéaire généralisé : glm : la famille de modèle est décrite par l’argument family qui décrit la distribution des variables mesurées (cf. supra Notion de modèle dans R) et qui fait référence à une fonction de lien dont l’un des arguments est l’argument link qui décrit la fonction de lien. Si on utilise le lien par défaut, il suffit alors de donner le nom de la fonction de lien. family=gaussian ou gaussian( link="identity") est équivalente à lm, même si la présentation des sorties des fonctions anova et summary diffère ; family=binomial ou binomial( link="logit") pour la régression logistique ; family=binomial( link="probit"), régression probit ; ... Package additionnels Il existe aussi de nombreuses fonctions dans des packages additionnels, par exemple : . package VGAM vgml : qui peut être considéré comme une extension de glm et qui permet de traiter un plus grand de modèles, notamment en proposant un ensemble très étendu de familles de distributions des variables et de contraintes sur ces familles7 (cf. par exemple le paragraphe sur la régression logistique dans le chapitre sur la régression). . package nlme gls : modèle linéaire utilisant l’ajustement par les moindres carrés généralisés permettant de spécifier des pondérations complexes des individus ou des corrélations complexes entre les erreurs ; les calculs peuvent prendre beaucoup de temps selon les spécifications ; gnls : version non linéaire de gls ; lme : modèle linéaire à effets mixtes ; nlme : modèle non linéaire à effets mixtes. . package lme4 lmer : modèle linéaire à effets mixtes ; glmer : modèle linéaire généralisé à effets mixtes (existence d’un argument family comme pour glm et vglm) ; 6 Les paramètres estimés sont ceux calculés par la procédure, c'est-à-dire les valeurs des contrastes pour les facteurs. Il ne faut donc pas confondre ces paramètres avec les valeurs des moyennes des groupes. Le paragraphe sur les comparaisons planifiées reviendra sur cette différence. 7 Par exemple, des variables binomiales ou multinomiales, des comptages (family=poisson), des variables relevant des valeurs extrêmes (Gumbel, Fréchet…), relevant du chi-deux, des distributions de Cauchy, de Rice, de Rayleigh… cf. https://www.stat.auckland.ac.nz/~yee/VGAM/doc/VGAMrefcard.pdf. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 12 nlmer : modèle non linéaire à effets mixtes. . package survival coxph : analyse de survie selon le modèle de Cox. survreg : régression d’un modèle de survie . package MASS polr : régression logistique ou probit ordonnée. . package Zelig Interface unifiée pour de nombreuses analyses. Cf. la documentation. Quelques règles pour le choix du modèle linéaire8 Le choix du modèle dépend des propriétés des données. Il faut donc bien comprendre le rôle de la famille (argument family des modèles linéaires généralisés) et de la fonction de lien (argument link associé à la famille). Les modèles linéaires généralisés traitent d’une large famille de données, celles relevant de la famille dite exponentielle des distributions, famille dont l’élément le plus connue est la distribution normale (gaussienne). Sans entrer dans les détails, ces modèles estiment un coefficient (ou un ensemble de coefficients) θ qui est relié à l’espérance mathématique des variables d’intérêt (ou variables dépendantes) Y. Le lien entre l’ensemble θ et l’espérance mathématique de Y s’appelle la fonction de lien (link). On a alors : E [Y ] = g −1 (θ ) avec g, la fonction de lien. La famille au sens de l’argument family des procédures de R décrit la distribution sousjacente aux paramètres θ. En effet, on peut considérer qu’on a ‘mesuré’ pour chaque sujet j de l’étude une valeur ψj qui est la somme de la valeur théorique de θ pour ce sujet plus un bruit εj indépendant d’un sujet à l’autre et uniformément distribué9. La famille est donc la distribution de ces ψj. Variable d’intérêt Modèle Paramètre Lien canonique Famille Gaussien Y Y Identité Gauss Binaire Pr( Y=1) Odds ratio : Logit Binomial Identité Gauss Pr( Y=1) / Pr( Y=0) Images en niveau de gris en IRM Y Comptage Y Y ou Rice10 Y Log11 Poisson 8 Ce paragraphe n’est pas un développement formel. Il contient des approximations et des raccourcis pour faire comprendre le principe et non pour le justifier théoriquement. 9 Les modèles traités par les modèles linéaires sont tous additifs. 10 Théoriquement le bruit sur les images IRM est ricien (amplitude d’une gaussienne complexe) mais si le rapport signal sur bruit est important on peut l’approximer par une distribution gaussienne. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 13 Revenons sur un cas particulier fréquemment rencontré. Supposons que le modèle physique des données soit exponentiel, c’est-à-dire que : y = exp(− β x) La question est alors de savoir s’il faut traiter les données par un modèle linéaire après transformation logarithmique des données12 ou par un modèle log-normal13. - Dans le premier cas, on analyse : ψ = log( y ) = βˆ x + ε en considérant ε comme une variable gaussienne centrée. On utilisera donc family=gaussian( link="log") puisque l’objectif est d’obtenir : Y = exp(E [ψ ]) () 2 et la variance du paramètre sera alors : var βˆ = σ . On peut aussi utiliser l’écriture : lm( log( Y) ~ X, … - Dans le second cas on considère que y est une variable aléatoire dont la distribution est lognormale (par exemple, résultant du produit d’un grand nombre de variables aléatoires gaussiennes) : 1 log( x ) − µ Pr ( X ≤ x ) = 1 + erf 2 2σ σ. On montre alors que le paramètre et la variance du paramètre sont fonction de µ et de Packages Zelig et Rcmdr Zelig est un package développé par Matt Owen, Kosuke Imai, Gary King et Olivia Lau qui propose une interface unifiée et assez facile d’utilisation pour l’utilisation d’un ensemble de modèles statistiques les plus utilisés, aussi bien classiques que bayésiens. Voir la documentation en ligne (http://cran.r-project.org/web/packages/Zelig/index.html). Rcmdr est un package développé par John Fox qui offre une interface de type WYSIWYG pour de nombreux packages et notamment pour les fonctions les plus utilisées de R comme l’import et l’export de données, les analyses classiques, des tracés classiques… De plus, il fournit les codes R générés par les appels ce qui est une source inépuisable pour apprendre à utiliser R. Enfin, Rcmdr est ouvert et chaque développeur peut y intégrer ses plug-in. Il en existe d’ailleurs déjà un certain nombre dont les noms commence par Rcmdr(point). C’est 11 À rapprocher du fait que si N est le comptage moyen, alors la probabilité de ne compter aucun événement est exp( -N). 12 Je n’aborde pas ici les problèmes que cette transformation peut induire ni l’interprétation des coefficients. 13 Modèle non pris en compte dans les packages cités dans ce document mais la littérature suggère que dans nombreux cas, ce modèle peut être approximé par une modèle linéaire généralisé utilisant comme famille de modèle, le modèle gamma (family=Gamma) avec fonction de lien, la fonction canonique "inverse" ou, comme le suggèrent certains auteurs, la fonction logarithmique. Cependant, comme le modèle gamma est très sensible aux valeurs extrêmes, il est nécessaire de les exclure avant l’analyse. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 14 donc un package très intéressant pour les personnes qui ne veulent pas entrer dans la programmation de R ou qui veulent s’y initier. Mesures répétées et modèle à effets mixtes Un plan à mesures répétées permet de mesurer la réponse d’un sujet en fonction de différentes conditions expérimentales elles-mêmes définies par un plan de mesure mono ou multifactoriel (par exemple, en fonction de la phase d’un traitement dans le cadre d’un suivi thérapeutique ou en fonction du type de chaîne de caractères [e.g., mot, non mot, pseudo-mot] et de sa longueur [e.g., court, long] en psycholinguistique.) Dans un tel plan chaque sujet devient son propre contrôle et cela permet d’éliminer de l’erreur expérimentale, la variabilité due aux différences individuelles. Sous R, le tableau résultat se présente sous forme d’un data.frame : Mesures Identification sujet Description sujet Cdn n° 1 Cdn n° N (variables indépendantes) Sujet 1 Sujet M et la formule d’analyse sera : cbind( cdn.1, …, cdn.N) ~ description.sujet C’est ce tableau dit en format large (wide) qu’on analyse par les procédure standard comme lm. Par contre, cette forme n’est pas adaptée à une analyse utilisant un modèle de regroupement, aussi bien aov que gls ou les procédures basées sur les effets mixtes, lme, lmer et glmer. Il faut donc transforme ce tableau en format dit long : Identification sujet Description sujet Mesure Condition (variables indépendantes) Sujet 1 1 Sujet 1 Sujet 1 N Sujet M 1 Sujet M Sujet M N R propose plusieurs fonctions pour cette transformation dont la fonction reshape qui fait partie du cœur de R et qui permet de passer d’un format à l’autre et réciproquement. Ce changement de format implique : F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 15 1) une modification de formule de l’effet fixe qui devient : mesure ~ description.sujet 2) une spécification du modèle aléatoire pour les procédures à effets mixtes (je traiterai ici ni le cas de aov ni celui de gls, cf. la documentation). Il faut être conscient que les modèles d’appariement sous-jacents aux différentes approches d’analyse des plans avec mesures répétées diffèrent : - pour aov, on spécifie les facteurs pour lesquels il y a corrélation intra-groupe des résidus spécifiés par le terme d’erreur Error( …) ; - pour lm, la procédure est grossièrement de considérer que l’analyse individuelle de chacun des niveaux de répétition génère une v.a. multidimensionnelle dont on estime la distribution conjointe supposée une gaussienne multivariée à partir des analyses individuelles et sur laquelle on effectue des tests asymptotiques d’où les tests de significatifivité de Roy, Pillai, Wilks, Hotelling… et les corrections de Greenhouse-Geisser ou Huyhn-Feldt ; - pour lme et lmer, on considère l’existence d’un effet aléatoire (ordonnée à l’origine, pente) spécifique du niveau de répétition en plus de celui fixe du groupe ; lme permet de plus de spécifier la structure de corrélation à l’intérieur des groupes, cependant cette option est souvent très gourmande en ressources de calcul. En parcourant la littérature, surtout en neuropsychologie et en neurolinguistique, on s’aperçoit que la dernière option est de plus en plus utilisée. Même si elle peut négliger les corrélations intra-groupe - mais la perte de précision est-elle si importante au vu des approximations des autres méthodes ? - elle présente deux avantages majeurs : 1) elle permet de traiter des données incomplètes ; 2) elle permet de traiter des mesures répétées longitudinales, c’est-à-dire dont le facteur de répétition est une variable quantitative (temps, âge…). Nous verrons dans le chapitre suivant comment spécifier le modèle aléatoire. Exploration et visualisation des données Pour terminer ce chapitre, citons le package HH qui permet de d’explorer et de visualiser les données. Pour plus de détails, voir la documentation en ligne. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 16 II - Choix de l’approche Les statistiques inférentielles ont comme objectif principal de permettre d’extrapoler les propriétés d’une population donnée à partir d’un échantillon convenablement choisi de cette population. Les techniques de choix de cet échantillon sont hors du cadre de ce document. Cependant, toutes les procédures inférentielles font deux hypothèses fortes, rarement vérifiées bien que toujours considérées comme l’étant dans l’expérience en cours : 1) les individus constituant l’échantillon sont tirés au hasard avec la même probabilité et indépendamment les uns des autres ; 2) le tirage se fait avec remise, c’est-à-dire qu’un individu peut être présent plus d’une fois dans l’échantillon. Si la population est assez importante, la probabilité d’occurrence du second point est négligeable. Quant au premier point, d’autres types de tirages aléatoires peuvent être envisagés (stratification, grappes…) mais leur traitement sort du cadre de ce document. Indépendamment de la méthode utilisée pour constituer l’échantillon, il est nécessaire de définir le modèle des données, c’est-à-dire les liens qu’on désire investiguer entre les données acquises et des données connues a priori. Cela nécessite de préciser l’objectif réel de l’étude puis de choisir parmi les modèles possibles celui qui correspond au mieux à cet objectif. En effet, l’analyse peut être descriptive, c’est-à-dire ayant comme objectif de donner des informations sur la population ou prédictive, c’est-à-dire ayant comme objectif de déterminer les caractéristiques d’un nouvel individu. Le premier cas est le plus commun dans le type d’expérience que nous menons (par exemple, existe-t-il des différences significatives de temps de réaction pour une tâche donnée entre un groupe témoins et un groupe de sujets atteint d’un handicap donné ?) Cependant, l’étude peut servir aussi à la prédiction comme par exemple l’étalonnage d’un appareil de mesure : à partir d’un certain nombre de mesures dans une plage donnée on veut établir la courbe entre la valeur réelle et la valeur obtenue pour toute la plage. Dans le premier cas, il suffit de trouver le modèle le mieux ajusté aux données en termes d’erreurs d’ajustement et de simplicité. Dans le second cas, le modèle doit minimiser l’erreur de prédiction, d’où l’utilisation de méthodes de rééchantillonnage (resampling) et de validation croisée (cross-validation) qui feront l’objet de la dernière partie de ce document. Spécification du modèle mixte Les procédures estimant des modèles mixtes sont plus complexes que les procédures n’utilisant que des modèles fixes et demandent donc beaucoup plus de ressources de calcul, par exemple certains tests post-hoc sont basés sur des techniques de rééchantillonnage (package lme4). Il convient donc de se demander si l’utilisation de tels modèles se justifie. Nous avons déjà vu leur utilité pour analyser des plans à mesures répétées. De manière générale, on peut se demander comment déterminer qu’il est préférable d’utiliser un modèle F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 17 mixte plutôt qu’un modèle à effets fixes, hors du cas des mesures répétées. Pour répondre à cette interrogation, on peut citer trois approches : - une approche graphique ; - une approche basée sur des tests conditionnels ; - une approche basée sur la comparaisons des modèles. Vérification de l’existence d’un effet aléatoire Approche graphique Cette approche se base sur l’utilisation du package graphique lattice. D’autres packages graphiques comme ggplot2 permettent de réaliser des graphiques plus sophistiqués mais au prix d’une certaine complexité dans la programmation du graphique. L’avantage de lattice est que ses principales fonctions reposent sur deux arguments simples : - une formule comme premier argument, - un argument permettant de définir des groupes (groups) qui joue le même rôle qu’une série d’appel à la fonction points par exemple après un appel à plot. D’autres arguments permettent d’affiner le tracé dont les plus utiles sont panel, auto.key et layout14. La formule a trois composantes. Celle à gauche du tilde représente la variable à tracer. La partie de droite est divisée en deux. La plus à gauche est la covariable ou le facteur en fonction duquel tracer la variable. Les facteurs à droite de la barre, quand ils existent, définissent les sous fenêtres, par exemple | Diag signifiera qu’il y a une sous fenêtre pour chaque niveau de Diag15. Quand le tracé se fait en fonction d’une covariable, il peut être intéressant d’ordonner les données selon cette covariable. Exemple : l’étude porte sur la variation longitudinale de la variable CTH.AV en fonction du diagnostic (S.DIAG). On soupçonne l’existence d’une variation propre au sujet en plus de la variation dépendant du diagnostic. De ce fait, on donne comme formule, celle de l’étude, comme valeur à l’argument groups, le sujet (RID étant son identificateur) et on passe à xyplot une fonction (argument panel16) permettant de superposer aux courbes réelles (fonction panel.superpose), l’ajustement linéaire (fonction panel.lmline) par groupe. Une grande variabilité des pentes fera alors suspecter l’existence d’un effet aléatoire. 14 Ce document n’étant pas un manuel d’utilisation de lattice, je n’entrerai pas dans les détails de cette utilisation. Cette partie droite peut comporter plus d’un facteur. Il y aura alors une sous-fenêtre par combinaison des niveaux. 16 À chacun de s’inspirer de cet exemple pour son propre problème. 15 F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 18 Le code de cette vérification est le suivant17 : xyplot( CTH.AV ~ Age | S.DIAG, donnees[order( donnees$Age),], groups=RID, panel=function( x, y, groups, subscripts, col, type, ...) { panel.superpose( x, y, groups=groups, subscripts=subscripts, col=col, type=type, ...) levs <- as.character( levels( droplevels( groups[subscripts]))) for( nL in 1:length( levs)) { idx <- groups[subscripts] == levs[nL] nLC <- ((nL - 1) %% length( col)) + 1 panel.lmline( x[idx], y[idx], col=col[nLC], type="l", ...) } }, col=ma.palette(), type="p") 60 CONV.]0,1)y 65 70 75 80 85 90 AD 4 3 2 CTH.AV 1 HC sMCI CONV.]1,)y 4 3 2 1 60 65 70 75 80 85 90 60 65 70 75 80 85 90 Age 17 En supposant un suivi longitudinal du sujet identifié par RID. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 19 L’exemple montre une très grande variabilité des ordonnées à l’origine et des pentes dans chacun des groupes de S.DIAG, ce qui justifie l’utilisation de l’effet aléatoire pour traiter ces données Pour plus de lisibilité, on pourra supprimer le tracé des courbes réelles par la fonction panel.superpose. De même, on pourra ne choisir qu’un sous-ensemble (aléatoire) de sujets dans chaque niveau pour avoir moins de droites. Dans le cadre d’une Anova (pas de covariable), on peut utiliser une approche de type ‘boîte à moustaches’: bwplot( VAR ~ RID | S.DIAG, … CONV.]0,1)y AD 4 3 2 CTH.AV 1 HC sMCI CONV.]1,)y 4 3 2 1 CTh.Broca.L CTh.Cing_Ant.L CTh.Broca.R CTh.Cing_Ant.R CTh.Cing_Post.L CTh.Cing_Post.R CTh.Frontal.L CTh.Insula_audit.L CTh.Frontal.R CTh.Insula_audit.R CTh.Mes_Tem.L CTh.Mes_Tem.R CTh.Prefrontal_dorsolat.L CTh.Prefrontal_dorsolat.R CTh.Occ.L CTh.Parietal.L CTh.Occ.R CTh.Parietal.R CTh.PreMotor.L CTh.PreMotor.R CTh.SensMotor.L CTh.SensMotor.R CTh.Temp_Lat.L CTh.Temp_Lat.R CTh.Broca.L CTh.Cing_Ant.L CTh.Broca.R CTh.Cing_Ant.R CTh.Cing_Post.L CTh.Cing_Post.R CTh.Frontal.L CTh.Insula_audit.L CTh.Frontal.R CTh.Insula_audit.R CTh.Mes_Tem.L CTh.Mes_Tem.R CTh.Prefrontal_dorsolat.L CTh.Prefrontal_dorsolat.R CTh.Occ.L CTh.Parietal.L CTh.Occ.R CTh.Parietal.R CTh.PreMotor.L CTh.PreMotor.R CTh.SensMotor.L CTh.SensMotor.R CTh.Temp_Lat.L CTh.Temp_Lat.R CTh.Broca.L CTh.Cing_Ant.L CTh.Broca.R CTh.Cing_Ant.R CTh.Cing_Post.L CTh.Cing_Post.R CTh.Frontal.L CTh.Insula_audit.L CTh.Frontal.R CTh.Insula_audit.R CTh.Mes_Tem.L CTh.Mes_Tem.R CTh.Prefrontal_dorsolat.L CTh.Prefrontal_dorsolat.R CTh.Occ.L CTh.Parietal.L CTh.Occ.R CTh.Parietal.R CTh.PreMotor.L CTh.PreMotor.R CTh.SensMotor.L CTh.SensMotor.R CTh.Temp_Lat.L CTh.Temp_Lat.R Si les distribution de la variable VAR sont assez semblables pour tous les sujets RID du groupe (fixe), alors il n’y a pas lieu de suspecter un effet aléatoire de RID sur l’ordonnée à l’origine. Dans le cas contraire (cf. exemple ci-dessus), si. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 20 Approche basée sur des tests conditionnels Cette approche, utilisable dans le cas d’une régression, est surtout applicable dans le cas d’un modèle de type logit. Cependant, ces approches ne sont valables que dans le cas d’un véritable modèle de type Anova à un facteur à effets mixtes, et que le nombre de niveaux du facteur aléatoire est faible. En ce qui concerne la pente, on vérifiera que la corrélation entre la valeur à tester et le régresseur est identique dans tous les groupes. Ceci se base sur le lien étroit entre corrélation (partielle dans le cas de régressions multiples) et analyse de régression. Pour tester l’égalité entre deux corrélations, on peut se baser sur la transformation de Fisher : z= 1 1+ ρ avec ρ le coefficient de corrélation log 2 1 − ρ qui suit asymptotiquement une loi normale de variance 1 / (N - 3) où N est le nombre de sujets. La différence entre les deux coefficients suivra alors une loi normale de variance : 1 1 + N1 − 3 N 2 − 3 Il sera bien entendu nécessaire d’effectuer une correction de comparaisons multiples. Dans le cas d’une analyse logit, on utilisera le test de Cochran-Mantel-Haenszel (fonction mantelhaen.test) qui vérifie que deux variables nominales sont conditionnellement indépendantes dans chaque strate d’une troisième pourvu qu’il n’y ait pas d’interactions du 3ème ordre. La table de contingence peut se construire par la fonction table (avec première variable, la variable dépendante, comme seconde variable, le facteur fixe et comme troisième facteur, celui suspecté comme étant le facteur aléatoire). Approche statistique Cette approche n’est pas utilisable directement pour le logit. Elle utilise nlme. Dans un premier temps, on fait l’analyse par gls sans introduction du facteur aléatoire, puis on effectue la même analyse par lme en introduisant l’effet aléatoire. On compare les deux résultats par la fonction anova et s’il n’y a pas de différences significatives, l’introduction du facteur aléatoire ne se justifie pas. L’autre solution plus générale est l’utilisation de la log-vraisemblance qui est un test conservateur (c’est-à-dire qui surestime la p.value). Le code est alors (en utilisant lmer, mais il est facile de l’adapter à lme) : lm.res <- lm( formule.fixe, data=donnees) lme.res <- lmer( formule.fixe + (formule.aleatoire), data=donnees, REML=FALSE) log.vr <- -2 * (logLik( lm.res) - logLik( lme.res)) p.value <- pchisq( log.vr, df=1, lower.tail=FALSE) F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 21 On peut aussi utiliser une approchée basée sur la corrélation intraclasse (Intra Class Correlation ou ICC) qui est mesure de la dépendance entre individus. Si ICC est proche de zéro, le modèle mixte ne se justifie pas. Si elle est proche de 1, alors, le modèle mixte se justifie. On commence par créer un modèle nul avec le facteur aléatoire FA, ce qui donne : - en utilisant lmer lme.null <- lmer( Y ~ 1 + ( 1 | FA), data=donnees) puis on calcule les variances estimées : df.var <- as.data.frame( VarCorr( lme.null)) On obtient alors l’ICC par la formule ICC <- df.var[1,"vcov"] / sum( df.var[,"vcov"]) - en utilisant lme lme.null <- lme( Y ~ 1, random= ~ 1 | FA, data=donnees) puis on calcule les variances estimées : df.var <- as.numeric( VarCorr( lme.null)) On obtient alors l’ICC par la formule ICC <- df.var[1] / sum( df.var) Si le modèle est hiérarchique (i.e., effet aléatoire de la forme 1 | G1/G2…), on peut commencer par ne considérer que le niveau le plus élevé (G1). Si l’effet aléatoire est présent, on peut ensuite continuer itérativement pour chaque niveau. Si cet effet aléatoire n’est pas pertinent à un niveau donné, on considérera que ce niveau de la hiérarchie et les suivants ne sont pas pertinents pour l’analyse. S’il y a plusieurs effets aléatoires ( (effet1) + (effet2) + … pour lmer), on répète l’opération pour chaque effet. Spécification du modèle aléatoire Le modèle aléatoire est spécifié par l’argument random pour lme dont la valeur sera une formule ou une liste de formules et pour lmer et glmer, par une série de formules entourées de parenthèses et séparées de modèle fixe et entre elles par des +. Dans nlme, on peut spécifier une liste d’effets aléatoires, cette liste est un autre moyen de spécifier un modèle hiérarchique : list( ~ 1 | F1, ~ 1 | F2, …) est équivalent à ~ 1 | F1 / F2 / … Dans lme4, chacune des formules représente un effet aléatoire non corrélé aux autres. Pour reprendre l’exemple de la psycholinguistique, on fait l’hypothèse que les chaînes de caractères n’ont aucune influence per se mais sont des représentants aléatoires des classes de chaînes auxquelles elles appartiennent. Le codage de leur effet sera selon le codage de lmer/glmer, F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 22 (1 | type) + (1 | longueur) signifie qu’il y a deux effets aléatoires, un pour le type de chaîne de caractères et l’autre pour sa longueur mais que les deux ne sont pas corrélés entre eux (la fonction summary ne donnera donc pas de coefficient de corrélation entre ces deux effets) tandis que : (1 | ~ F.1 - effet aléatoire : (F.1 | facteur.aleatoire):longueur) signifie qu'il existe de plus un effet aléatoire lié à l’interaction des facteurs. Dans certains cas, plus rares, on considère que l’effet aléatoire ne porte que sur l’effet d’un facteur fixe et non sur l’ordonnée à l’origine. On écrira alors : - effet fixe : ~ F.1 - effet aléatoire : (F.1 | facteur.aleatoire) Les exemples ci-dessus ne considèrent que l’effet des facteurs aléatoires sur l’ordonnée à l’origine ou sur l’effet associé à un facteur fixe. Cependant, quand il existe des covariables et que plusieurs valeurs de ces covariables ont été utilisée dans chaque unité de groupement (par exemple, l’âge lors d’une étude longitudinale et l’unité de groupement étant le sujet), on peut aussi considérer qu’il existe une pente propre à chaque sujet en plus de la pente spécifique du groupe. Dans ce cas, la covariable se retrouve généralement dans le modèle fixe (tendance du groupe) et le modèle aléatoire (effet spécifique) : AGE + (AGE | sujet) En réalité, comme toutes les formules de R, le modèle aléatoire nous dit qu’il peut y avoir un effet aléatoire de niveau de base (ordonnée à l’origine) spécifique du sujet et une pente en fonction de l’âge spécifique. De plus, ces deux effets sont corrélés. Malheureusement, une telle formule spécifiant une composante aléatoire associé à un effet fixe pose de gros problèmes de calcul et n’est pas prise en compte actuellement dans les packages lors des tests post-hoc. Il faut alors simplifier le modèle : AGE + (1 | sujet) + (0 + AGE | sujet) qui décorrèle les deux effets. Mais on peut se demander si le gain apporté par le premier modèle justifie vraiment la complexité de son calcul. Note : Dans les nouvelles versions de lme4, on peut écrire (double barre verticale) : AGE + (AGE || sujet) à la place de l’écriture explicite de la décorrélation. Comparaison de modèles Les modèles peuvent être comparés par la fonction anova. La condition nécessaire est que les modèles doivent être monotonement emboîtés, c’est-à-dire que tous les termes d’un modèle F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 23 appartiennent au modèle suivant ou précédent dans la liste des arguments de anova, par exemple, Y ~ X.1 + X.2 est emboîté dans Y ~ X.1 * X.2. Le package lmtest propose la fonction waldtest qui fait la même chose. Il propose en outre un ensemble d’autres tests, encomptest, jtest et coxtest, servant à comparer des modèles non emboités. Se référer à la documentation en ligne pour leur principe, utilisation et interprétation. On peut aussi chercher le modèle qui ajuste au mieux les données par le fonction step ou stepAIC. Pour lm, step se base sur un test impliquant indirectement les coefficients de détermination semi-partiels. stepAIC (MASS) utilise comme critère d’ajustement l’AIC. Le problème est plus compliqué pour les modèles à effets mixtes car on peut vouloir chercher : 1) le modèle aléatoire le meilleur, 2) le modèle fixe le meilleur. Ces deux opérations ne peuvent pas se faire en une seule étape. En effet, la procédure de calcul n’utilise pas les moindres carrés (ordinaires ou pondérés) mais une technique dérivée du maximum de vraisemblance (REML : REstricted Maximum Likelihood). Si cette technique permet de comparer deux modèles aléatoires, elle ne permet pas de comparer les modèles fixes entre eux. Il faut alors imposer l’utilisation du maximum de vraisemblance (ML : Maximum of Likelihood) connu par ailleurs pour biaiser l’estimation des paramètres et donc inutilisable pour l’inférence. Pour la procédure lme de nlme, on donnera la valeur "ML" à l’argument method qui a comme valeur par défaut "REML". Pour lmer de lme4, on donnera la valeur FALSE à l’argument REML. On pourra ensuite utiliser stepAIC. Notons aussi que si on désire chercher à la fois les modèles aléatoire et fixe les meilleurs, il est préférable de commencer par le modèle fixe. Dans VGAM, les modèles peuvent être comparés au sens de la log-vraisemblance par la fonction VGAM::lrtest() Enfin, il existe pour toutes les procédures une fonction update qui permet de recalculer l’ajustement en faisant varier certains paramètres (formule, contrastes, poids des observations…) F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 24 Prédiction La fonction predict18 permet de prédire les valeurs que prendra la variable dépendante en fonction des paramètres du modèle. Elle a donc pour premier argument le modèle, par exemple le résultat de lm ou de glm. Elle possède toujours un second argument nommé newdata qui contient le data.frame des individus dont on doit prédire les valeurs. Ce data.frame contient des objets colonnes du nom des variables indépendantes et chacune de ses lignes correspond à un individu. Si l’argument newdata est absent, la fonction retourne les mêmes valeurs que la fonction fitted quand le type (argument type) à prédire est "response". Toutefois, cette fonction permet de retourner d’autres informations qui dépendent de la classe du modèle (lm ou glm) et des autres arguments. L’autre valeur de l’argument type valable pour tous les modèles est "terms". La fonction renvoie alors les valeurs des coefficients associés à chaque individu. Si le modèle est de la classe lm, l’argument interval permet de préciser le type d’intervalle de confiance de la prédiction qu’on désire. La valeur "none" ne revoie aucun intervalle, la valeur "confidence" revoie l’intervalle de confiance de l’estimation tandis que la valeur "prediction" renvoie l’intervalle de prédiction. Si on désire obtenir l’intervalle de confiance de l’estimation (newdata absent), il faut donc donner à interval la valeur "confidence"). Si on veut prédire de nouvelles valeurs, il faut donner à interval la valeur "prediction". En effet, la valeur "confidence" sous estime l’erreur de prédiction. En effet, la variance de l’erreur de prédiction est égale à la variance de l’erreur d’estimation plus la variance de la population. Pour les modèles de la classe glm, on peut aussi prédire la valeur de la fonction de lien en donnant comme valeur de type à prédire "link". Notes : 1) On peut aussi utiliser directement predict.lm sur des résultats de glm ce qui permet d'obtenir les intervalles de confiance et de prédiction sur la fonction de lien (type="response") ou sur les termes (type="terms"). 2) Si on a utilisé l’argument offset de la fonction d’estimation à la place de la fonction offset dans la formule, predict sur des nouvelles données (newdata), ne prend pas en compte ce décalage. A contrario, si ce décalage est déclarée dans la formule, newdata doit contenir une colonne correspondant à la variable référencée dans la fonction. 18 Dans VGAM, elle s’appelle predictvglm. F.Aubry (Inserm/UPS U825) Notes modèles linéaires sous R - partie 1 (10/2014) 25 II - Tests d’hypothèses Toute analyse se base sur une hypothèse à réfuter, appelée hypothèse nulle (H0). Selon les cas, on considérera que l’hypothèse alternative est la réfutation de l’hypothèse nulle (approche de Fisher) ou on considérera une hypothèse alternative H1, restriction de la réfutation de l’hypothèse nulle (approche de Neyman-Pearson, notamment utilisée dans le cas d’essais cliniques.) L’hypothèse nulle s’exprime souvent par une expression simple comme ‘égalité des valeurs moyennes des différents niveaux du facteur’. La tester correspond à la conjonction de ddl tests, où ddl (≥ 1) est au nombre de degrés de libertés du modèle. Le plus souvent, on base son analyse sur les tests par défaut de la procédure, ce qui peut rendre la lecture des résultats en termes de coefficients estimés assez difficile comme nous le verrons par la suite. On peut aussi vouloir spécifier ses propres tests qui permettent de vérifier des sous-conditions liées au modèle au cas où l’hypothèse nulle est rejetée. On spécifie alors ce qu’on appelle des comparaisons planifiées (planned comparisons). Il ne faut confondre ces tests avec les tests dit post-hoc qui permettent de trouver quels groupes ou valeurs invalident l’hypothèse nulle quand celle-ci est rejetée. - comparaisons planifiées : tests a priori définis avant l’analyse ; - tests post-hoc : tests a posteriori basés sur les résultats de l’analyse. Par défaut, l’hypothèse nulle inclut le test de la nullité de l’ordonnée à l’origine (intercept), la nullité des pentes pour la régression et l’égalité des moyennes des groupes, c’est-à-dire une différence nulle entre les groupes pris deux à deux. On peut définir une hypothèse nulle différente de l’hypothèse par défaut comme, pour les facteurs, l’égalité de la moyenne des groupes à des valeurs données ou, pour les régresseurs, l’égalité des pentes à des valeurs connues. Nous verrons ultérieurement les différentes méthodes permettant de spécifier des hypothèses nulles personnalisées. Type de somme de carrés Les résultats des différentes procédures en termes de significativité des effets, interactions… reposent sur un calcul impliquant le carré de l’erreur commise dans l’estimation des paramètres du modèle. Il existe plusieurs type de calcul de cette erreur, connu sous la nomenclature de ‘somme des carrés de type X’ (Sums of Squares) ou pour abréger ‘SC de type X’. Définition des types Le type I teste l’introduction séquentielle des facteurs, ce qui signifie que l’ordre des termes est important. Ainsi si F.1 et F.2 sont deux facteurs, alors les modèles Y ~ F.1 * F.2 et Y ~ F.2 * F.1 ne donnent pas le même tableau d’Anova mais conduisent à la même significativité totale du modèle (c'est-à-dire, au même nombre de degré de liberté et au même F). 26 Ce type de somme des carrés peut présenter de l’intérêt quand on cherche à connaître l’influence réelle de chacun des prédicteurs, notamment pour sélectionner les variables les plus pertinentes. Le type II teste le poids de chacun des prédicteurs (ou des interactions) en incluant les interactions d’ordre supérieur, c’est-à-dire son poids total dans les données à analyser. L’ordre d’introduction des prédicteurs n’a aucune importance. Donc les modèles Y ~ F.1 * F.2 et Y ~ F.2 * F.1 conduisent au même tableau d’Anova. Le type III teste le poids marginal de chacun des prédicteurs et de chacune des interactions. Il commence par tester le poids de ce qui est commun à tous les prédicteurs, c’est-à-dire l’ordonnée à l’origine (intercept), puis une fois ôtée l’influence de cette ordonnée, celui des interactions par ordre décroissant (du plus élevé à l’ordre 2) et enfin celui de chacun des prédicteurs hors intercept et interactions. Il existe d’autres types (IV, V, VI), mais à ma connaissance, il n’existe pas de fonctions dans R permettant de les calculer. Rappelons que quand les prédicteurs sont indépendants comme dans le cas des groupes équilibrés, le type I et le type II donnent les mêmes résultats, ce qui n’est pas le cas quand les prédicteurs sont corrélés entre eux. Précisons intuitivement la différence entre type II et type III19. Supposons les données construites selon la procédure ci-dessous : moy.F1 <- c( N1.1=12, N1.2=20) moy.F2 <- c( N2.1=0, N2.2=-3) interaction <- data.frame( F1=c( "N1.1", "N1.1", "N1.2", "N1.2"), F2=c( "N2.1", "N2.2", "N2.1", "N2.2"), val=c( -2, 2, 2, -3)) donnees <- data.frame( F1=rep( names( moy.F1), each=10), F2=rep( names( moy.F2), 10), Y=NA, stringsAsFactors=TRUE) for( idx in 1:nrow( donnees)) { f1 <- donnees$F1[idx] f2 <- donnees$F2[idx] donnees$Y[idx] <- moy.F1[f1] + moy.F2[f2] + interaction$val[(interaction$F1 == f1) & (interaction$F2 == f2)] } auxquelles, bien entendu, est ajouté un bruit gaussien i.i.d20. 19 Ce paragraphe n'a pas la prétention d'être une définition formelle mais tente de mieux faire comprendre ce que font ces deux tests. 20 i.i.d. : indépendant et identiquement distribué. 27 La somme des carrés de type II est proche d'un test des différences des moyennes des niveaux de chaque facteur calculées par la fonction aggregate : mean.F1 <- aggregate( Y ~ F1, donnees, mean) mean.F2 <- aggregate( Y ~ F2, donnees, mean) tandis que le test de type III considère plutôt les différences des valeurs moy.F1 et moy.F2. Obtention des types de SC La fonction par défaut anova donne la significativité de chacun des prédicteurs (effet principal pour les facteurs, pente ou coefficients du polynôme pour les régressions) et des interactions du modèle testé en termes de SC de type I. Cette fonction possède des arguments supplémentaires en fonction de l’analyse à laquelle elle s’applique (cf. les pages d’aides de la forme anova.XX où XX est le type d’analyse, par exemple pour lm, anova.lm). La fonction Anova du package car permet d’obtenir les SC de type II ou de type III. Cette fonction a un argument type qui code le type de SC utilisé, en chiffre romain (chaînes de caractères "II" ou "III") ou arabe (2 ou 3). Elle possède en outre un argument white.adjust qui permet de spécifier le type de correction pour l’hétéroscedasticité, ou l’absence de correction qui est l’option par défaut. En cas de doute, je recommande d’utiliser white.adjust=TRUE. Pour aov et lm, elle utilise le test du F. Pour glm, l’argument supplémentaire est le type de test (test.statistic) à qui on doit donner la valeur "F" pour être cohérent avec les autres procédures, sinon elle utilise le type par défaut pour l’analyse. Nous verrons l’utilisation des fonctions anova et Anova pour les analyses multivariées (Man(c)ova) dans les paragraphes dédiés à ces analyses ainsi que l’influence du choix du type de somme des carrés sur l’interprétation des résultats. Comparaisons planifiées et contrastes Les comparaisons planifiées vont déterminer les paramètres estimés par le modèle et dont les valeurs sont données par la fonction coefficients ou coef, et testés (sauf pour aov) par la fonction summary. Pour les facteurs, ces paramètres sont définis par les contrastes calculés entre les niveaux du facteur. 28 Il existe quatre manières de spécifier les contrastes qu’on veut utiliser : − spécification par défaut en modifiant le paramètre constrasts des options générales de la session21 ; − attribution d’un contraste donné à un facteur (une colonne d’un data.frame) par la fonction C ; − modification locale du contraste pour l’analyse en donnant une valeur à l’argument contrasts de la procédure d’analyse ; − indication du contraste dans la formule par la fonction C (exemple, Y ~ C( F.1, helmert)). Je ne recommande pas cette dernière formulation. Notes : - Par défaut, R utilise c( "contr.treatment", "contr.poly") ; on peut connaître les contrastes par défaut pour la session par la commande : getOption( "contrasts"). - L’argument contrasts des analyses est une liste dont les membres sont nommés par le nom du facteur et la valeur est le contraste souhaité soit sous forme de chaîne de caractères qui est le nom d’une fonction dont le premier argument est le nombre de niveaux du facteur ou le vecteur des niveaux, soit sous forme de la matrice des contrastes, par exemple : lm( Y ~ F1 * F2, donnees, contrasts=list( F1=contr.sum, F2="contr.SAS")). - En théorie, la somme des coefficients d’un contraste est nulle et les contrastes doivent être orthogonaux entre eux. Naïvement, on peut se demander pourquoi définir des comparaisons planifiées alors que l’hypothèse à réfuter (hypothèse nulle) est généralement l’égalité des moyennes des différents groupes définis par les niveaux des facteurs, ou la nullité de l’ordonnée à l’origine et celle des pentes ou autres coefficients de régression. En réalité une telle hypothèse nulle se décompose en la conjonction de plusieurs hypothèses. Prenons l’exemple d’un facteur F.1 à quatre niveaux N.1, N.2, N.3 et N.4. L’hypothèse nulle est : µ N .1 = µ N .2 = µ N .3 = µ N .4 . Qui est en réalité la conjonction de trois hypothèses, par exemple : µ N .1 − µ N .2 = 0 ; µ N .2 − µ N .3 = 0 et µ N .3 − µ N .4 = 0 ; toute autre hypothèse étant superflue car se déduisant des précédentes, d’où seulement 3 degrés de liberté. 21 options( contrasts=c( contraste.par.defaut.facteur.non.ordonne, contraste.par.defaut.facteur.ordonne)). Cette commande peut être écrite ‘à la main’ au début de chaque session ou être automatisée en l’insérant dans le fichier .Rprofile ou le script de la fonction .First(). 29 Si on écrit le modèle d’estimation de la mesure y pour le sujet i comme suit : y i = I N .1 (i ) µ N .1 + I N .2 (i ) µ N .2 + I N .3 (i ) µ N .3 + I N .4 (i ) µ N .4 + ε i avec I x (i ) l’indicatrice d’appartenance du sujet i au groupe x (0 s’il n’appartient pas ; 1 s’il appartient) et ε i , le bruit de mesure gaussien, centrée, indépendant de la mesure et i.i.d on voit qu’on peut facilement estimer les moyennes à partir de ce schéma expérimental (design matrix pour SPM, model matrix pour R). Cependant, une telle stratégie (dite modèle sur-paramétré) ne donne aucune indication quant au respect de l’hypothèse nulle. Dans ce but, on réécrit alors le modèle en utilisant l’ensemble des hypothèses testées. Si on note β 0 , l’ordonnée à l’origine, β1 , β 2 et β 3 les trois paramètres à estimer, on a alors : β1 = µ N .1 − µ N .2 β 2 = µ N .2 − µ N .3 . β 3 = µ N .3 − µ N .4 β 0 = (µ N .1 + µ N .2 + µ N .3 + µ N .4 ) / 4 La matrice mat qui définit les valeurs des moyennes en fonction des coefficients et qui exclut β 0 est la matrice des contrastes. Elle permet de calculer les moyennes des niveaux en fonction des coefficients estimés, en ajoutant une première colonne complémentaire correspondant à l’ordonnée à l’origine. Elle vaut : µ N .1 1 β0 µ N .2 1 β1 µ = 1 mat * β . N .3 2 β µ 1 3 N .4 On voit donc qu’il existe une relation d’inversion entre la définition des comparaisons planifiées et la matrice des contrastes. Il suffit de modifier cette matrice pour modifier l’ensemble des N-1 sous-conditions à tester (comparaisons planifiées). Je reviendrai plus loin sur comment déterminer réellement cette matrice. Hypothèses complexes Le paragraphe précédent présente le cas où on veut tester l’égalité de toutes les moyennes et la nullité des pentes, des ordonnées à l’origine et des interactions. Cependant, il arrive qu’on veut tester un modèle plus complexe ou des sous-conditions précises, par exemple que la pente associée à un régresseur est égale à un ou qu’il existe un décalage donné entre deux niveaux d’un facteur (offset). Dans la majorité des cas, ces tests pourront être spécifiés par des comparaisons planifiées plus complexes. R propose différentes solutions pour cela : 1) dans un certain nombre de cas, notamment ceux concernant les coefficients de régression, on peut introduire un membre dans la formule sous la forme d’un offset (fonction offset) dont je développerai l’utilisation ultérieurement ; 30 2) de manière alternative à l’utilisation de la fonction offset, on peut aussi introduire un vecteur de décalage par l’argument offset de la procédure d’analyse (cf. aov, lm, glm). 3) dans les cas simples, il est possible d’utiliser la fonction linearHypothesis (cf. infra, tester les coefficients) ; 4) dans des cas plus complexes, on peut utiliser la fonction glht du package multcomp ou la fonction lsmeans du package lsmeans, packages dont je développerai ultérieurement les utilisations. Les deux premières solutions relèvent des comparaisons planifiées tandis que les deux autres, des tests post-hoc. Quand cela est possible, il est préférable d’utiliser les comparaisons planifiées qui sont plus puissantes que les tests post-hoc. On préférera la première option quand l’offset est défini par une colonne ou une combinaison de colonnes des données numériques et la seconde option dans les autres cas. Par exemple : - test que la pente de régression vaut a (pour plus d’explications, cf. le chapitre ‘régression’) : anova( lm( Y ~ X + offset( a * X), data=donnees)) le coefficient associé à X ne doit pas être significatif ; - facteur F à deux niveaux N.1 et N.2 et on teste que µ N .2 = µ N .1 + decal : vec.decal <- numeric( nrow( donnees)) # vecteur de zéros vec.decal[donnees$F == "N.1"] <- decal lm( Y ~ F, data=donnees, offset=vec.decal) le coefficient associé à F ne doit pas être significatif. Note : L’offset défini selon la première option fait partie du modèle à estimer. Il est donc utilisé lors de la prédiction de (nouvelles) valeurs par la fonction predict. Le data.frame passé par l’argument newdata doit donc comporter une colonne de nom la variable d’offset et correspondant à l’offset. Dans le cas de la seconde option, cet offset est une hypothèse à tester sur le modèle. Il n’appartient pas au modèle et est ignoré par la fonction predict. Par contre, quelque soit le mode de spécification de l’offset, celui-ci est pris en compte dans les tests post-hoc, notamment ceux du package lsmeans. Les contrastes de R Le contraste ‘traitement’ Bien qu’appelé ‘contraste’, cette spécification des hypothèses n’est pas un véritable contraste au sens statistique du terme. Son utilisation impose la nullité de la moyenne du groupe considéré comme étant celui de référence et teste alors la nullité des moyennes des autres groupes par rapport à cette référence. Les coefficients calculés sont donc : - comme ordonnée à l’origine (intercept) la moyenne du groupe de référence, 31 - les différences entre la moyenne de chacun des groupes autre que celui de référence avec celle du groupe de référence. En conséquence : 1) une ligne de la matrice des contrastes est nulle ; 2) l’ordonnée à l’origine est la moyenne du niveau de référence. Fonctions : contr.treatment contr.Treatment Arguments supplémentaires base niveau de référence, par défaut 1er niveau22 Exemple : - lm( formula = Y ~ F1, data = d.f, contrasts = list(F1 = "contr.treatment")) Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.08480 0.07164 -1.184 0.237 F1B 0.04947 0.10251 0.483 0.630 F1C 0.02984 0.10850 0.275 0.783 Residual standard error: 1.063 on 597 degrees of freedom Multiple R-squared: 0.0003958, Adjusted R-squared: -0.002953 F-statistic: 0.1182 on 2 and 597 DF, p-value: 0.8886 - lm( formula = Y ~ F1, data = d.f, contrasts = list(F1 = "contr.Treatment")) Les coefficients estimés sont identiques, seuls leur graphie change (F1[T.B] à la place de F1B et F1[T.C] à la place de F1C). L’intercept donne la valeur de la moyenne pour le niveau A (niveau de base par défaut, cf. argument base) et les deux autres coefficients sont les différences des moyennes des groupes au niveau A : 22 contr.SAS est identique à contr.treatment qui utiliserait comme groupe de référence le dernier groupe. 32 contr.Treatment( c( "A", "B", "C")) [T.B] [T.C] A 0 0 B 1 0 C 0 1 Attention : ce type de ‘contraste’ peut conduire à des erreurs lors de certains tests post-hoc car la matrice du modèle (model matrix) ne sera pas de rang plein puisqu’une des lignes est nulle. Le contraste ‘somme’ Ce contraste calcule des combinaisons linéaires des différences des moyennes des niveaux à la grande moyenne23 : µi = 1 ∑µj N − 1 j ≠i Fonctions : contr.sum contr.Sum Les coefficients estimés sont différents de ceux du contraste ‘traitement’ puisque le mode de calcul diffère mais la significativité globale du modèle est la même. Exemple : - lm( formula = Y ~ F1, data = d.f, contrasts = list(F1 = "contr.sum")) Coefficients: Estimate Std. Error T value Pr(>|t|) (Intercept) -0.05836 0.04365 -1.337 0.182 F11 -0.02644 0.06013 -0.440 0.660 F12 0.02303 0.06081 0.379 0.705 23 Pour un niveau donné, sa différence à la grande moyenne est égale à la somme des différences à la grande moyenne des autres niveaux. 33 Residual standard error: 1.063 on 597 degrees of freedom Multiple R-squared: 0.0003958, Adjusted R-squared: -0.002953 F-statistic: 0.1182 on 2 and 597 DF, p-value: 0.8886 - lm( formula = Y ~ F1, data = d.f, contrasts = list(F1 = "contr.Sum")) Les coefficients estimés sont identiques, seuls leur graphie change (F1[S.1] à la place de F11 et F1[S.2] à la place de S2). L’intercept donne la valeur de la grande moyenne. Le niveau de référence est toujours le dernier, ici C. contr.Sum( c( "A", "B", "C")) [S.A] [S.B] A 1 0 B 0 1 C -1 -1 Le contraste ‘Helmert’ Ce contraste calcule la différence des deux premiers niveaux puis vérifie que la moyenne de chaque niveau supplémentaire est égale à la moyenne des moyennes des niveaux déjà testés. L’ordonnée à l’origine est la grande moyenne : µi = 1 ∑µ j i − 1 j <i Fonctions : contr.helmert contr.Helmert Les coefficients estimés sont différents des précédents puisque le mode de calcul diffère mais la significativité globale du modèle est la même. Exemple : - lm( formula = Y ~ F1, data = d.f, contrasts = list(F1 = "contr.helmert")) 34 Coefficients: Estimate Std. Error T value Pr(>|t|) (Intercept) -0.058362 0.043651 -1.337 0.182 F11 0.024734 0.051253 0.483 0.630 F12 0.001702 0.032090 0.053 0.958 Residual standard error: 1.063 on 597 degrees of freedom Multiple R-squared: 0.0003958, Adjusted R-squared: -0.002953 F-statistic: 0.1182 on 2 and 597 DF, p-value: 0.8886 - lm( formula = Y ~ F1, data = d.f, contrasts = list(F1 = "contr.Helmert")) Les coefficients estimés sont identiques, seuls leur graphie change (F1[H.1] à la place de F11 et F1[H.2] à la place de S2). L’intercept donne la valeur de la grande moyenne. contr.Helmert( c( "A", "B", "C")) [H.1] [H.2] A -1 -1 B 1 -1 C 0 2 Contraste des différences successives Ce contraste calcul la différence entre deux niveaux successifs des facteurs : µ i +1 = µ i . Il est donc intéressant de l’utiliser dans le cadre d’un facteur ordonné, par exemple représentant le degré d’une atteinte pathologique, pour tester la variable à expliquer en fonction de ce degré. Dans ce cas, le test réel est un test unilatéral, par exemple : µ i +1 ≥ µ i . Ce contraste est codé par la fonction contr.sdif du package MASS. Exemple : Soit à vérifier que les moyennes croissent en fonction du niveau du facteur ordonné F. set.seed( 1) 35 lev <- c( "LEV.1", "LEV.2", "LEV.3", "LEV.4", "LEV.5", "LEV.6") moy.th <- c( 0, 1, 1, 2, 2.05, 2.12) nb.sujets <- 20 sigma <- 0.1 d.f <- data.frame( F=rep( lev, each=nb.sujets), Y=rep( moy.th, each=nb.sujets) + rnorm( nb.sujets * length( lev), sd=sigma), stringsAsFactors=TRUE) lm.sum <- lm( Y ~ F, d.f) lm.dif <- lm( Y ~ F, d.f, contrasts=list( F="contr.sdif")) anova( lm.sum) et anova( lm.dif) donnent les mêmes résultats en termes d’ajustement (R2 = 0.987 ; R2ajusté = 0.9867 ; F( 5, 114) = 1762, p < 0,001) comme le font aussi summary( lm.sum) et summary( lm.dif). Par contre, si on compare les tests sur les coefficients estimés par les deux analyses, la première ne donne aucune indication quant aux différences entre niveaux successifs : Estimate Std.-Error t-value Pr(>|t|) (Intercept) 1.372638 0.008203 167.34 <2e-16 F1 -1.353585 0.018342 -73.80 <2e-16 F2 -0.373285 0.018342 -20.35 <2e-16 F3 -0.358758 0.018342 -19.56 <2e-16 F4 0.637536 0.018342 34.76 <2e-16 F5 0.689347 0.018342 37.58 <2e-16 t-value Pr(>|t|) tandis que la seconde analyse : Estimate (Intercept) Std.-Error 1.372638 0.008203 167.337 <2e-16 FLEV.2-LEV.1 0.980300 0.028415 34.499 <2e-16 FLEV.3-LEV.2 0.014527 0.028415 0.511 0.6102 FLEV.4-LEV.3 0.996294 0.028415 35.062 <2e-16 FLEV.5-LEV.4 0.051811 0.028415 1.823 0.0709 FLEV.6-LEV.5 0.069398 0.028415 2.442 0.0161 36 permet de constater que : LEV.2 > LEV.1 (différence significative positive) LEV.3 = LEV.2 (différence positive mais non significative) LEV.4 > LEV.3 (différence significative positive) LEV.5 ≥ LEV.4 (tendance vers une différence positive significative) LEV.6 > LEV.5 (différence significative positive). Ainsi, si l’hypothèse à tester était la croissance de Y en fonction du niveau de F, alors on voit immédiatement que cette hypothèse est vérifiée. Contraste polynomial Le contraste polynomial n’a de sens que pour les facteurs ordonnés, quand on désire faire une analyse de tendance. Chacun des coefficients détermine la tendance linéaire (suffixe .L), quadratique (suffixe .Q), cubique (suffixe .C), d’ordre 4 (suffixe ^4) … Fonction : contr.poly Argument supplémentaire scores permet de définir les poids du contraste. Par défaut scores=1:n où n est le nombre de niveaux du facteur, c’est-à-dire qu’on suppose que les différents niveaux correspondent à des classes équidistantes et de même largeur d’une variable quantitative sous-jacente. Exemple : f.age <- cut( age, seq( 20, 90, by=10), ordered_result=TRUE) contr.age <- contr.poly( levels( f.age)) Si les pas entre les classes ne sont pas identiques, il faut alors modifier les scores. Supposons par exemple le découpage suivant : f.age <- cut( age, c( 20, 30, 40, 60, 70, 100, 120), ordered_result=TRUE) qui correspondent aux pas c( 1, 2, 4, 6, 10, 12)24. Pour que l’estimation des tendances soit valable, il faudra écrire : contr.age2 <- contr.poly( levels( f.age), scores=c( 1, 2, 4, 6, 10, 12)) 24 Pas entre deux valeurs successives, divisé par 10. 37 Sur la figure ci-dessus à gauche, obtenue par le code suivant : plot( contr.age[,1], type="b") # index etant la variable scores du contraste for( j in 1:3) points( contr.age[,j], type="b", col=j) on voit que ce codage ressemble à une régression polynomiale sur la variable quantitative sous-jacente. A contrario, la figure de droite montre le défaut de modélisation si on ne modifie pas les scores (ou le pas entre les classes), le code de couleur étant le même que celui de la figure de gauche. En pointillé, les contrastes ne prenant pas en compte le pas variable entre les classes ; en traits pleins, les contrastes corrigés du pas variable. Les contrastes corrigés sont plus proches de la droite, de la parabole ou de la cubique que les contrastes non corrigés. Construction de contrastes personnalisés Le chapeau de ce chapitre donne des indications sur la manière de construire ses propres contrastes. Je vais la préciser ici. Théoriquement, la somme des coefficients d’un contraste doit être nulle. Cependant, cette contrainte théorique n’est pas toujours respectée comme le montre le contraste ‘treatment’ de R (cf. supra). Si cette condition n’est pas respectée, il est généralement possible d’estimer les paramètres mais certains tests peuvent être impossibles à réaliser (matrice singulière), notamment certains tests post-hoc (cf. infra). La construction de contrastes personnalisés commencent par la définition des comparaisons qu’on veut faire entre moyennes (comparaisons planifiées). Il faut donc décrire les paramètres dépendant du facteur en termes de combinaisons linéaires des moyennes des groupes. 38 Dans l’exemple donné précédemment on a à estimer les différences suivantes : µ 0 N .1 β1 1 − 1 0 µ N .2 β 2 = 0 1 − 1 0 β 0 0 1 − 1 µ N .3 3 µ N .4 La matrice des comparaisons planifiées est donc : mat <- matrix( c( 1, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, -1), ncol=4, byrow=TRUE) La seconde étape permet de calculer la matrice des contrastes à donner comme attribut du facteur (soit par la fonction C, soit par l’argument contrasts de la procédure). Le calcul est simple, il suffit d’inverser la matrice précédente. Cependant, cette matrice n’est pas une matrice carrée, elle n’est donc pas inversible. Il faut alors utiliser la fonction ginv du package MASS. Le code est alors : g.mat <- ginv( mat) dimnames( g.mat) <- list( as.character( levels( donnees$F.1)), c( "{beta.1}", "{beta.2}", "{beta.3}")) 0,25 − 0,5 − 0,25 0,5 0,75 0,25 La matrice des contrastes à utiliser est donc : . − 0,75 − 0,5 − 0,25 0,25 0,5 − 0,25 On remarquera que la somme des coefficients des colonnes sont nulles, conséquence de la nullité de la somme des coefficients des lignes de description des comparaisons. Cependant, on constate qu’on estime 3 paramètres pour quatre moyennes, il y a donc indétermination qui est levée grâce à l’estimation du paramètre β 0 . On peut facilement montrer que si on construit de véritables contrastes (somme nulle des coefficients), ce paramètre est égal à la grande moyenne. On peut normaliser les contrastes, c’est-à-dire imposer la condition que par colonne, la somme des carrés des coefficients valent un par l’instruction suivante : g.mat <- sweep( g.mat, 2, apply( g.mat, 2, function( x) sqrt( sum( x^2))), "/") Cette normalisation ne modifie en rien les tests mais peut rendre les coefficients plus lisibles et interprétables. Notes : 1) La matrice des contrastes et celle des comparaisons planifiées se déduisent l’une de l’autre par inversion (généralisée) ; 39 2) Si un des paramètres est forcé à zéro dans la matrice des comparaisons planifiées, alors la somme des coefficients du ‘contraste’ n’est pas nulle (cf. contr.treatment qui force le premier coefficient à estimer à zéro) ; 3) Si la somme des coefficients du ‘contraste’ n’est pas nulle, alors l’ordonnée à l’origine β 0 n’est plus égale à la grande moyenne ; 4) Théoriquement, le calcul présenté dans ce paragraphe n’est valable que pour les schémas équilibrés ou quasi-équilibrés. Exercices : 1) Soit un facteur F.1 à quatre niveaux N.1, N.2, N.3 et N.4. On veut réaliser les comparaisons planifiées : i) N.2 = N.3 = (N.1 + N.4) / 2 ii) N.2 = (N.1 + N.4) / 3 ; N.3 = 2 * (N.1 + N.4) / 3 iii) N.2 = 2 * N.1 ; N3 = 2 * N.2 ; N4 = 2 * N.3. Déterminer les contrastes découlant de ces comparaisons planifiées. 2) Soit deux facteurs F.1 et F.2, le facteur F.2 étant à deux niveaux N2.1 et N2.2 ; pour chaque niveau de F.1, on désire vérifier que la différence entre les niveaux N2.1 et N2.2 est nulle ; de plus on désire calculer cette différence à partir d’une analyse linéaire. Écrire le code en utilisant lm. 3) Faut-il modifier le code si F.2 possède trois niveaux et qu’on veut vérifier i) l’égalité des moyennes de F.2 dans chaque niveau de F.1 ou ii) le fait que la moyenne du N2.2 est égal à la différence N2.1 - N2.3 ? 4) Vérifier les résultats sur un exemple simulé en utilisant lm et des groupes équilibrés et en programmant un script calculant les moyennes. Contrastes et matrice du modèle (model matrix / design matrix) La construction de la matrice du schéma expérimental (design matrix ou model matrix pour R), traditionnellement notée X, est immédiate, la ligne j de cette matrice correspondant au sujet j prend la valeur de la ligne de la matrice (1, mat) qui correspond à son groupe. Elle est réalisée dans R par la fonction model.matrix. Quand on construit une telle matrice du modèle à analyser (fonction model.matrix), on obtient une matrice ayant autant de lignes que de sujets à analyser et autant de colonnes que de paramètres à estimer. Les noms des colonnes sont les noms des paramètres estimés qu’on retrouve comme noms des lignes du membre coefficients ou tTable (selon la procédure d’analyse) du résultat de summary, ou comme noms des éléments du vecteur retourné par la fonction coef. On peut appliquer cette approche pour calculer les valeurs d’intérêt (pentes, moyennes de groupes…) à partir des coefficients estimés. Dans un premier temps, on crée un ensemble de sujets virtuels, un par combinaison des valeurs des prédicteurs, c’est-à-dire les niveaux des facteurs ou la présence/absence du régresseur. En général, dans les applications qui nous 40 intéressent, il n’y a pas de cellules vides et donc toutes les combinaisons de niveaux sont utilisées et tous les régresseurs numériques sont présent chez tous les ‘sujets’. Cette construction se base sur la fonction expand.grid avec comme liste d’arguments, des arguments nommés : - pour les facteurs, nomDuFacteur=vecteur des noms des niveaux, - pour les régresseurs numériques, nomDuRegresseur=1. Une fois cet ensemble de sujets obtenu, on utilise la fonction model.matrix pour calculer la matrice de transformation. Cette fonction a trois arguments principaux : - formula, le modèle testé ; - data, le data.frame des données, i.e. celui construit précédemment ; - contrasts.arg, qui peut être simplifié en contrasts, qui est la liste nommée des contrastes si on utilise des contrastes autres que ceux par défaut pour la session. Ensuite on multiplie (à gauche), cette matrice par la matrice représentant les valeurs d’intérêt. C’est cette matrice résultat qui sera alors appliquée aux coefficients estimés pour obtenir les valeurs. Il est donc relativement simple, mais quelques fois fastidieux, de construire ses propres matrices pour obtenir les coefficients d’intérêt. Nous verrons dans le paragraphe consacré aux tests post-hoc que deux packages de R (multcomp et lsmeans) proposent des outils permettant de simplifier cette construction dans de nombreux cas. Exemples : Supposons un modèle dans lequel l’ordonnée à l’origine (OO) est à estimer25. Cas 1) Le modèle ne comprend que N facteurs (F.1, …, F.N), ayant respectivement N.1, … N.N niveaux. Notons {B.1}, … {B.N} les ensembles des coefficients à estimer. Posons m1, … mN les matrices des contrastes associés à chacun des facteurs. Les coefficients à estimer auront donc pour noms : (Intercept), {B.1}…, {B.N}, [interactions d’ordre 2 : IB2.12 noms construits par l’instruction paste( rep( {B.1}, N.2 - 1), rep( {B2}, each=N1 - 1), sep=":"), puis B2.13 = {B.1} x {B.3} … B2.23 = {B.2} x {B.3}…], [interactions d’ordre 3 sur le même principe B3.xxx]… On obtient donc l’ordonnée à l’origine (OO), les effets principaux de chacun des facteurs (EP.1, … EP.N), les interactions d’ordre 2, 3… grâce aux formules suivantes : 25 Je laisse en exercice le cas où l’ordonnée à l’origine est forcée à zéro. 41 OO {B.1} … {B.N} B2.12 … B2.[N-1]N B3.123 OO 1 0 0 0 0 0 0 0 EP.1 0 m1 0 0 0 0 0 0 … 0 0 0 0 0 0 0 EP.N 0 0 0 mN 0 0 0 0 I2.12 0 0 0 0 m2 ⊗ m1 0 0 0 0 0 0 0 0 0 0 I2.[N-1]N 0 0 0 0 0 mN ⊗ mN-1 0 I3.123 0 0 0 0 0 0 m3 ⊗ m2 ⊗ m1 0 ⊗ est le symbole du produit de Kronecker, noté %x% par R ou par la fonction kronecker26. Par exemple, supposons deux facteurs NI (4 niveaux) et GR (3 niveaux). Le résultat des combinaisons possibles est donné par : grid <- expand.grid( NI=as.character( levels( tab$NI)), GR=as.character( levels( tab$GR))) NI GR 1 N.1 G.1 2 N.2 G.1 3 N.3 G.1 4 N.4 G.1 5 N.1 G.2 6 N.2 G.2 7 N.3 G.2 8 N.4 G.2 9 N.1 G.3 10 N.2 G.3 11 N.3 G.3 12 N.4 G.3 26 Sans démonstration je rappelle que la matrice de contraste de l’interaction entre deux facteurs F.1 et F.2 est le produit de Kronecker des matrices de contraste des deux facteurs prises dans l’ordre inverse. Pour généraliser : mat.contrF .1:F .2L:F .M = mat.contrF .M % x% (mat.contrF .M −1 % x% (mat.contrF .M −1 L mat.contrF .1 )) 42 Et la matrice du modèle avec interaction par mat <- model.matrix( ~ NI * GR, grid), avec les contrastes contr.sum : (I) NI1 NI2 NI3 GR1 GR2 NI1:GR1 NI2:GR1 NI3:GR1 NI1:GR2 NI2:GR2 NI3:GR2 1 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 1 -1 -1 -1 1 0 -1 -1 -1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 -1 -1 -1 0 1 0 0 0 -1 -1 -1 1 1 0 0 -1 -1 -1 0 0 -1 0 0 1 0 1 0 -1 -1 0 -1 0 0 -1 0 1 0 0 1 -1 -1 0 0 -1 0 0 -1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 On retrouve bien la matrice des contrastes pour NI, répétée pour chaque niveaux de GR, celle de GR (en gras, fond bleu pâle), répétée pour chaque niveau de NI (en gras, fond bleu moyen), puis celles des interactions (fond bleu), dont on peut vérifier qu’elle vaut bien : kronecker( contr.sum( 3), contr.sum( 4)) On peut vérifier que pour un schéma équilibré : all.equal( as.vector( mat %*% coef( lm.tab)), aggregate( Y ~ NI * GR, tab, mean)$Y) De plus, si on pose : res <- aggregate( Y ~ NI * GR, tab, mean) ni <- contr.sum( 4) %*% coef( lm.tab)[2:4] gr <- contr.sum( 3) %*% coef( lm.tab)[5:6] it <- kronecker( contr.sum( 3), contr.sum( 4)) %*% coef( lm.tab)[7:12] res <- transform( res, OO=coef( lm.tab)[1], E.NI=ni, E.GR=rep( gr, each=4), I.NI.GR=it) res <- transform( res, SUM=OO + E.NI + E.GR + I.NI.GR) on peut vérifier que: all.equal( res$Y, res$SUM) Ainsi, pour obtenir les moyennes des groupes correspondant aux niveaux de GR, tous niveaux de NI confondus, il faut moyenner les 4 premières valeurs, puis les quatre suivantes et enfin les quatre dernières. Pour obtenir, les moyennes des groupes correspondant aux niveaux de 43 NI, tous niveaux de GR confondus, il faut moyenner les valeurs 1, 4 et 7 ensemble, puis 2, 5, 8, etc. Cas 2 : existence de covariables (ou régresseurs). model.matrix crée une colonne avec les valeurs du régresseurs ou de ses fonctions, et pour les interactions entre régresseurs et facteurs, la sous-matrice correspondante du facteur ou de l’interaction est multipliée par la valeur du régresseur. Pour obtenir la ou les valeurs des coefficients de régression, on peut utiliser la même approche que pour les facteurs en mettant la valeur 1 dans les colonnes des coefficients de régressions et en utilisant la matrice des contrastes des facteurs ou des interactions pour les interactions. Par exemple, soit un régresseur X et un facteur à 3 niveaux GR. grid <- expand.grid( GR=c( "G.1", "G.2", "G.3"), X=1) GR X 1 G.1 1 2 G.2 1 3 G.3 1 model.matrix( ~ GR * X, grid) (Intercept) GR1 GR2 X GR1:X GR2:X 1 1 0 1 1 0 1 0 1 1 0 1 1 -1 -1 1 -1 -1 Tester les hypothèses Significativité de l'analyse Il ne faut pas confondre le fait qu’une analyse est significative en elle-même et qu’une analyse conclut à des effets significatifs. Une analyse est significative en elle-même si et seulement si le modèle utilisé explique correctement les données, c’est-à-dire si l’ajustement aux données obtenu par le modèle est de bonne qualité. Elle peut conclure à des effets significatifs ou à leur absence. Une analyse non significative en elle-même peut être due à un mauvais choix du modèle, à l'existence de données erronées dans les données à analyser... 44 L’existence d’effets significatifs est déduite des tests statistiques qui ont conduit dans ce cas au rejet de l’hypothèse nulle associée au modèle en fonction d’une part des données sur lesquelles l’hypothèse a été testée et, d’autre part, en fonction du niveau du test. Par exemple, une Anova à un facteur permettra de conclure que les moyennes des groupes définis par les niveaux de ce facteur ne sont pas toutes identiques. Cependant, on peut conclure à l’existence d’effets significatifs alors que l’analyse ne l’est pas en elle-même, c’est-à-dire que ses résultats s’ajustent très mal aux données. Par exemple, une analyse impliquant plusieurs prédicteurs très corrélés entre eux peut conduire à l’existence d’effets significatifs alors que l’analyse ne l’est pas. Il est donc essentiel de tester la significativité de l’analyse et pour cela R propose plusieurs critères. La significativité des effets et interactions associés aux différents prédicteurs est testée par la fonction anova qui donne généralement pour chaque facteur, régresseur et interaction, la somme des carrés en fonction du type de sommes des carrés choisis, le nombre de degrés de liberté, la valeur de la statistique associée (généralement le F) et, généralement, la p value associée à cette statistique : ̶ Le test par défaut pour lm et aov est basé sur la calcul classique du F de Fisher à partir des résidus. ̶ Pour glm, par défaut anova ne donne que les déviances27. Si on désire obtenir le F de Fisher, il faut l'indiquer en donnant la valeur "F" à l'argument test. ̶ Pour les autres procédures se reporter à la documentation. Quand il n'y a pas d'interaction, les différentes sommes des carrés donnent les mêmes résultats et la fonction Anova (package car) n'est pas utile. Quand il y a interaction, ce n'est plus vrai et la comparaison des tables d'Anova avec les différentes sommes des carrés peut apporter des informations supplémentaires sur les données (cf. un des exemples dans le chapitre sur l’Ancova). Attention : pour interpréter correctement les résultats de la fonction anova, se rappeler que celle-ci utilise une somme des carrés de type I. Il existe des indices permettant d'indiquer la qualité de l'ajustement. - Pour la procédure lm, la fonction summary donne le coefficient de détermination ou R , ainsi que le R2 ajusté. Le R2 qui exprime le pourcentage de variance expliquée par le modèle par rapport à la variance des mesures est généralement une fonction croissante du nombre de degrés de liberté du modèle et n'a généralement que peu d'intérêt, sauf quand le R2 est faible (par exemple, inférieur à 0,5), ce qui signifie que le modèle bien que significatif n'explique pas grand-chose. Le R2 ajusté est le R2 corrigé du nombre de degré de liberté : généralement, il passe par un maximum en fonction du nombre de degrés de liberté28 ; c'est donc un meilleur indicateur de la qualité de l'ajustement ; R donne aussi la significativité de l’analyse en termes de F. Le F est en fait la distribution asymptotique du rapport entre la variance expliquée par le modèle (R2) et celle non expliquée corrigé du nombre de degrés de 2 27 La déviance d'un modèle exprime la différence en vraisemblance par rapport à un modèle saturé. Alors que le R2 est obligatoirement positif, le R2 ajusté peut devenir négatif. Cela signifie que l’ajustement est de très mauvaise qualité et que le modèle doit être rejeté. 28 45 liberté de l’analyse (lié au nombre de paramètres à estimer) et des résidus (lié au nombre de sujets dans l’analyse et au nombre de paramètres à estimer)29. - L’AIC (Akaike Information Criterion) donne la vraisemblance du modèle, corrigée du nombre de paramètres à estimer (ou de son équivalent) ; il eut être obtenu par la fonction AIC ; - Le BIC (Bayesian Information Criterion) est assez proche de l’AIC, sauf qu’il tient aussi compte de la taille de l’échantillon (cf. BIC ou extractAIC). - Le maximum de vraisemblance (logLik). - On peut aussi utiliser des méthodes plus complexes soit impliquant un calcul de l’erreur de prédiction et une méthode de validation croisée, soit basé des procédures de rééchantillonnage utilisant le rapport entre la variance expliquée par le modèle et celle non expliquée. Voir le chapitre consacré à ces méthodes pour plus de détails. Quand on utilise l’AIC ou le BIC, le meilleur modèle est celui qui a la plus faible valeur de ce critère. Un AIC ou un BIC très négatif signifie un très bon ajustement, très positif, un ajustement faible. L’AIC favorise l’ajustement du modèle, le BIC sa simplicité. D’après certains auteurs, il est préférable d’utiliser l’AIC car celui possède d’intéressantes propriétés asymptotiques que ne possède pas le BIC. Règle générale : Plus il y a de coefficients à estimer, moins l’estimation est robuste. Valeurs des paramètres La fonction summary donne le résultat de l’estimation de la valeur des paramètres qui sont des combinaisons linéaires des moyennes, c’est-à-dire le résultat des comparaisons planifiées par défaut ou de celles définies par l’utilisateur (pour les facteurs), la pente ou les coefficients des polynômes (régression) ou des combinaisons linéaires de pente ou de coefficients de polynômes en fonction des facteurs (analyse impliquant des facteurs et des régresseurs, appelée Ancova). Elle donne aussi leur significativité. La fonction linearHypothesis permet de tester d’autres hypothèses sur les paramètres estimés par la procédure d’analyse30 comme des différences non nulles (argument rhs), de schéma de mesures répétées (arguments idesign et iterms qui seront présentés dans la chapitre sur les mesures répétées) et de corriger de l’hétéroscédasticité (argument white.adjust). C’est aussi le cas des fonctions proposés par les packages multcomp et lsmeans (cf. les tests posthoc). 29 Il faut noter que summary.lm ne calcule pas le coefficient R2 de la même manière si l’ordonnée à l’origine (intercept) est forcé à zéro dans le modèle (i.e., Y ~ 0 + X ou Y ~ X - 1) ou non. Dans le second cas, la fonction utilise la formulation standard R^2 = 1 - sum( residuals( lm.x)^2) / sum( (y - mean( y))^2) tandis que dans le premier cas le calcul est le suivant : R^2 = 1 - sum( residuals( lm.x)^2) / sum( (y)^2). La raison est qu’on suppose connu le fait que la moyenne de y est nulle (mean( y) = 0) en posant ce modèle sans intercept. 30 Paramètres dont on récupère les valeur par la fonction coef ou leur significativité par summary. Il ne faut pas confondre ces paramètres avec les moyennes des groupes (cf. le paragraphe sur les contrastes et sur les comparaisons planifiées). 46 Exemple : Supposons une mesure Y en fonction d’un facteur NIVEAU à quatre niveaux tel que : 1) les groupes sont équilibrés 2) les variances identiques (homoscédasticité). On veut tester les hypothèses décrites par la matrice mat précédente ainsi que les moyennes estimées par la procédure lm pour chacun des groupes sont identiques à celles estimées par une procédure classique et que les coefficients sont correctement estimés : # lm lm.n <- lm( Y ~ NIVEAU, data=tab, contrasts=list( NIVEAU=g.mat)) summary( lm.n) # Resultat # moy.niv <- aggregate( Y ~ NIVEAU, tab, FUN=mean) # # Test des moyennes estimées linearHypothesis( lm.n, cbind( 1, g.mat), rhs=moy.niv$Y) # # Test des coefficients coef.th <- mat %*% moy.niv$Y linearHypothesis( lm.n, cbind( 0, diag( 3)), rhs=coef.th) # # Ordonnée a l’origine = grande moyenne ? linearHypothesis( lm.n, t( c( 1, 0, 0, 0)), rhs=mean( tab$Y)) Moyennes et intervalles de confiance Si l’analyse estime des coefficients qui sont souvent des combinaisons linéaires des valeurs d’intérêt, on est souvent intéressé par les valeurs des moyennes des groupes, des pentes en fonction des régresseurs et/ou des niveaux des facteurs… et par l’intervalle de confiance de l’estimation de ces valeurs. Ce paragraphe explique comment on calcule ces valeurs à partir des coefficients estimés par l’analyse, celui sur les tests post-hoc (cf. infra) expliquera comment tester des hypothèses a posteriori sur ces valeurs. La fonction coef ayant comme argument le résultat de l’analyse (par exemple de lm) retourne un vecteur des valeurs des paramètres estimés, chacun des éléments du vecteur ayant le nom du paramètre. Les paramètres contenant ":" correspondent à des paramètres d’interactions, les autres noms hors ‘(Intercept)’ étant soit les noms des paramètres estimés par les contrastes pour les facteurs, soit ceux des régresseurs utilisés. 47 Exemple : coef( lm.w) (Intercept) GROUPE1 GROUPE2 NIVEAU1 0.58441480 1.40575868 1.07659534 -0.45949332 1.80398493 NIVEAU3 GROUPE1:NIVEAU1 -1.53420937 0.50662946 NIVEAU2 GROUPE2:NIVEAU1 -0.94446210 GROUPE1:NIVEAU2 GROUPE2:NIVEAU2 -0.10489676 0.42987513 GROUPE1:NIVEAU3 GROUPE2:NIVEAU3 -0.03868165 0.43386437 Posons par la suite, coefficients comme étant la matrice colonne des coefficients estimés et moyennes celles des moyennes qu’on désire obtenir à partir des coefficients. Dans le paragraphe consacré aux contrastes, nous avons vu comment relier les paramètres aux moyennes des groupes liés aux niveaux du facteur. Si mat est la matrice des contrastes, alors : moyennes <- cbind( 1, mat) %*% coefficients Quand il y a M > 1 facteurs, le vecteur des paramètres estimés contient plusieurs segments : 1) la première valeur est l’ordonnée à l’origine (sauf si celle-ci est forcée à zéro), mais je laisse en exercice le traitement de ce cas ; 2) les valeurs 2 à n1, les n1 paramètres associés au premier facteur ; 3) les paramètres associés au second facteur, au troisième… 4) les paramètres associés à l’interaction des 2 premiers facteurs, puis du 1er et du 3ème facteur…, jusqu’à l’interaction M-1ième / Mième facteur ; 5) les paramètres associés aux interactions d’ordre 3 (1, 2 et 3ième facteur, …) … La formule de calcul des moyennes ne change pas par rapport au cas où il n’y a qu’un facteur. La matrice des contrastes se calcule aisément par la procédure suivante : d.f <- expand.grid( nom.facteur.1=as.character( levels( facteur.1)), …, nom.facteur.M=as.character( levels( facteur.M))) mat <- model.matrix( formule, d.f) L’introduction de régresseur n’offre aucune difficulté31. Il suffit de l’ajouter dans expand.grid en lui donnant la valeur 1. Puisque la construction de la matrice se fait par évaluation du modèle (la formule) dans le contexte de la grille, les interactions entre régresseurs et facteurs (c’est-à-dire, l’existence de pentes différentes en fonction des niveaux des facteurs) ou les coefficients liés à une régression polynomiale sont automatiquement prises en compte. 31 Il est évident que dans ce cas, la notion de moyennes des groupes définis par les niveaux des facteurs n’a que peu de sens. On préférera alors d’autres approches. 48 Exemple : On a deux facteurs F.1 et F.2, de deux et trois niveaux et un régresseur T. On écrira alors : d.f <- expand.grid( F.1=c( "N1.1", "N1.2"), F.2=c( "N.2.1", "N2.2", "N2.3"), T=1) Pour obtenir les moyennes de l’analyse : lm( Y ~ F.1 * F.2, data=donnees) on utilisera la matrice des contrastes obtenues par : mat <- model.matrix( ~ F.1 * F.2, d.f) Si on analyse le modèle : lm.data <- lm( Y ~ F.1 + F.2 * T + I( T^2), donnees) on utilisera la matrice des contrastes obtenues par : mat <- model.matrix( ~ F.1 + F.2 * T + I( T^2), d.f) Note : Si le modèle analysé contient des transformations des variables quantitatives du type log( T), sin( T)… ou tout autre fonction mathématiques autres que les puissances, il faudra utiliser le régresseur dans la formule de model.matrix et non le régresseur transformé par la fonction. Les moyennes de lm( Y ~ F.2 * log( T), donnees) seront obtenues par la matrice des contrastes obtenue par : mat <- model.matrix( ~ F.2 * T, d.f) La matrice de variance/covariance des moyennes s’obtient alors par : mat.transform <- cbind( 1, mat) mat.cvar <- mat.transform %*% vcov( lm.data) %*% t( mat.transform) où vcov est la fonction récupérant la matrice de variance/covariance des paramètres estimés. Dans le cas d’analyses impliquant plusieurs facteurs, on utilisera une procédure similaire à celle décrite ici quand on s’intéresse à un facteur particulier sinon, si on est intéressé par les groupes créés par les combinaisons des facteurs ou, quand il y a des covariables, par certaines valeurs de ces covariables, on utilisera la fonction predict ou pour des tests, glht ou lsmeans. Il existe pour lm, une fonction confint qui calcule des intervalles de confiance sur la base du t de Student. Le package MASS propose aussi des implantations de confint valables pour les résultats de glm et de nls (ajustement non linéaire par les moindres carrés). confint existe aussi dans les packages lsmeans et multcomp. Notons que si on s’intéresse à certaines valeurs des régresseurs, on peut appliquer la même démarche en donnant comme argument de expand.grid correspondant aux régresseurs en 49 question, le vecteur des valeurs auxquelles on s’intéresse. L’argument at de la fonction lsmeans donne des résultats similaires quand il n’y a pas de transformation des régressuers. Groupes non équilibrés et hétéroscédasticité Les hypothèses de base des analyses linéaires sont : - des groupes équilibrés, c’est-à-dire de mêmes effectifs ; - des erreurs indépendantes des mesures et entre elles (non corrélées), gaussiennes, centrées et identiquement distribuées, donc que de variances identiques pour tous les groupes (homoscédasticité). Dans les études expérimentales, ces deux conditions sont rarement vérifiées. En effet, même si on prévoit l’équilibrage des groupes, il arrive fréquemment que toutes les données ne soient pas exploitables et que de ce fait, les groupes n’aient pas tous les mêmes effectifs. Ce déséquilibre peut biaiser les résultats, notamment créer des effets ou des interactions inexistantes. De manière identique, les variances peuvent différer entre les groupes (hétéroscédasticité) ce qui peut conduire à des résultats biaisés. Procédures de vérification Équilibre des groupes R propose la fonction replications qui permet de compter le nombre de fois qu’un niveau est répliqué dans un jeu de données, en fonction du modèle. Cette fonction ne permet que de constater que les groupes sont équilibrés, à ce moment elle renvoie un vecteur ou non mais elle ne donne pas une mesure du degré de déséquilibre dans le cas contraire. À ma connaissance, il n’existe pas de procédure reconnue dans la littérature pour tester l’équilibre entre les groupes. Les techniques que je présente ici donnent des solutions approximatives peu puissantes pour l’Anova, donc peu enclines à détecter le déséquilibre entre groupes. Il convient d’être prudent si l’hypothèse d’équilibre est acceptée. Je détaillerai dans le chapitre sur l’Anova les conséquences pratiques de ce déséquilibre et comment prendre en compte son effet. Anova à 1 facteur : L’idée est de vérifier que chacun des groupes du facteur F.1 correspond à la même proportion de l’effectif : prop.test( x=as.vector( table( donnees$F.1)), n=rep( nrow( donnees), nlevels( donnees$F.1)), p=rep( 1 / nlevels( donnees$F.1), nlevels( donnees$F.1))) Cette approche n’est valable que si tous les groupes ont au minimum 5 sujets. Cependant, cette restriction n’a qu’une portée limitée puisque dans ce cas, on a à faire à des petits échantillons et les analyses paramétriques sont à éviter. On peut alors se poser la question de la pertinence de l’analyse si cette condition, dite de Cochran, n’est pas respectée, la littérature ne considérant une Anova comme valide qu’à partir d’une douzaine de sujets par groupe. 50 Anova à 2 facteurs: On peut utiliser la même approche que l’Anova à 1 facteur : prop.test( x=as.vector( table( donnees$F.1, donnees$F.2)), n=rep( nrow( donnees), nlevels(donnees$F.1) * nlevels( donnees$F.2)), p=rep( 1 / (nlevels(donnees$F.1) * nlevels( donnees$F.2)), nlevels(donnees$F.1) * nlevels( donnees$F.2))) Anova à plus de 2 facteurs On utilisera la même approche que pour un facteur, en testant les groupes formés par les interactions d’ordres les plus élevés. Ancova Dans le cadre de l’Ancova, le problème se complique car il faut aussi étudier la distribution des covariables dans chacun des groupes et notamment - leur appariement en moyenne (lm( covariable ~ groupes…), - leur appariement en dispersion (par exemple, le test de Levene : leveneTest). En effet, l’élément discriminant entre groupes peut être principalement le centrage des valeurs des prédicteurs comme le présente l’exemple ci-dessous : set.seed( 4) nb.points <- 10 age <- runif( 2 * nb.points, min=-10, max=10) age.centre <- c( G1=45, G2=55) df.test <- data.frame( GROUPE=rep( c( "G1", "G2"), nb.points), AGE=age + age.centre, pente=NA, offset=0, stringsAsFactors=TRUE) df.test$pente[df.test$GROUPE == "G1"] <- 0.75 df.test$pente[df.test$GROUPE == "G2"] <- 1.25 df.test$offset[df.test$GROUPE == "G1"] <- 24 sig.bruit <- 2 df.test <- transform( df.test, Y=offset + pente * AGE + rnorm( 2 * nb.points, sd=sig.bruit)) plot( Y ~ AGE, subset( df.test, GROUPE == "G1"), xlim=range( df.test$AGE), ylim=range( df.test$Y)) points( Y ~ AGE, subset( df.test, GROUPE == "G2"), col=2) res <- lm( Y ~ GROUPE * AGE, df.test) res2 <- lm( Y ~ AGE, df.test) (anova( res, res2))32 Model1: Y ~ GROUPE * AGE Model2: Y ~ AGE Res.Df 32 RSS Df SumofSq F Pr(>F) Voir le paragraphe sur la comparaison des modèles pour comprendre cette instruction. 51 1 16 65.896 2 18 87.762 -2 -21.866 2.6545 0.101 Donc, les deux modèles sont équivalents bien que l’interaction soit significative : (Anova( res, type=3)) Sum Sq Df F value Pr(>F) (Intercept) 27,675 1 6,720 0,020 GROUPE 21,864 1 5,309 0,035 786,231 1 190,901 0,000 GROUPE:AGE 21,435 1 5,205 0,037 Residuals 65,896 AGE 16 NA NA En effet, si on se limite à la plage de recouvrement des deux groupes (environ (AGE > 45 & AGE < 57)), le tableau d’Anova (type=3) devient : Sum Sq Df F value Pr(>F) (Intercept) 1,692 1 0,297 0,598 GROUPE 5,598 1 0,983 0,345 169,855 1 29,822 0,000 5,687 1 0,999 0,341 AGE GROUPE:AGE Residuals 56,957 10 NA NA Dans cet exemple, il existe un effet non négligeable des valeurs extrêmes puisque les distributions de la covariable ne sont pas appariées entre groupes, problème connu de la régression. On pourrait avoir des problèmes équivalents si la distribution de la covariable n’est appariée qu’en moyenne puisque la distribution la plus dispersée risque d’avoir le plus de poids et de masquer alors les interactions entre facteurs et régresseurs comme le montre l’exemple suivant : 52 set.seed( 4) nb.points <- 20 age <- c( runif( nb.points, min=-3, max=3), runif( nb.points, min=-1, max=1)) age.centre <- c( G1=45, G2=45) df.test <- data.frame( GROUPE=rep( c( "G1", "G2"), each=nb.points), AGE=age + age.centre, pente=NA, offset=0, stringsAsFactors=TRUE) df.test$pente[df.test$GROUPE == "G1"] <- 0.75 df.test$pente[df.test$GROUPE == "G2"] <- 1.25 df.test$offset[df.test$GROUPE == "G1"] <- 22.5 sig.bruit <- 0.4 df.test <- transform( df.test, Y=offset + pente * AGE + rnorm( 2 * nb.points, sd=sig.bruit)) plot( Y ~ AGE, subset( df.test, GROUPE == "G1"), xlim=range( df.test$AGE), ylim=range( df.test$Y)) points( Y ~ AGE, subset( df.test, GROUPE == "G2"), col=2) res <- lm( Y ~ GROUPE * AGE, df.test) res2 <- lm( Y ~ AGE, df.test) (anova( res, res2)) Model1: Y ~ GROUPE * AGE Model2: Y ~ AGE Res.Df RSS 1 36 5.2117 2 38 5.92 Df SumofSq F Pr(>F) -2 -0.70831 2.4463 0.1009 Donc, les deux modèles sont équivalents bien que l’interaction soit significative : (Anova( res, type=3)) Sum Sq Df F value Pr(>F) (Intercept) 2,1706 1 14,9935 < 0,001 GROUPE 0,6952 1 4,8025 0,035 13,2742 1 91,6929 0,000 GROUPE:AGE 0,6924 1 4,7826 0,035 Residuals 5,2117 AGE 36 NA NA Homoscédasticité R propose les tests classiques d’égalité de variance. Parmi ceux-ci on privilégiera les deux tests suivants qui sont considérés comme robustes vis-à-vis de la non normalité des données : - le test de Levene : leveneTest - le test de Fligner : flignerTest. 53 Le test de Fligner n’utilise qu’un facteur. Dans le cas où il y a plusieurs facteurs (par exemple, F.1, F.2…), il faut modifier la formule de la manière suivante : fligner.test( Y ~ as.factor( FACT), data=transform( donnees, FACT= paste( F.1, F.2, …, sep=":"))) Prise en compte de l’hétéroscédasticité et du non équilibrage des facteurs La littérature propose divers moyens pour prendre en compte le déséquilibre entre effectifs des groupes et l’hétéroscédasticité. Ils tiennent en trois propositions principales : 1) utiliser des corrections empiriques a posteriori ; 2) utiliser une méthode des moindres carrés pondérés (argument weights des procédures) ; 3) utiliser des méthodes qui reposent sur le maximum de vraisemblance (ou plutôt la méthode REML, restricted maximum of likelihood) qui permettent de modéliser les variances inter et intra-groupes (cf. fonction gls du package nlme). Non équilibrage des groupes Quand les groupes sont déséquilibrés et que les variances sont homogènes, il est recommandé d’utiliser la somme des carrés de type III pour tester les effets car ils testent une combinaison des paramètres indépendante du nombre d’observations par groupe. Cependant, les contrastes orthogonaux sont difficiles à interpréter en cas d’interactions. Quand il y a au moins deux facteurs et que les groupes ne sont pas équilibrés en effectif mais sont comparables en fréquence (‘proportionnels’), alors l’utilisation classique sans pondération donne des résultats satisfaisants. Quand il y a deux facteurs, on peut alors utiliser un test du khi-2 d’indépendance des facteurs pour tester la proportionnalité. Exemple de schéma avec groupes proportionnels : F.2 F.1 N2.1 N2.2 N1.1 10 20 N1.2 15 30 Dans les autres cas, certains auteurs plaident pour l’utilisation a posteriori de la correction de Satterthwaite-Welch (cf. infra, le chapitre sur l’Anova). 54 Hétéroscédasticité L’hétéroscédasticité modifie les degrés de liberté de l’analyse. Pour tenir compte de ce phénomène, il existe deux approches implantées dans R pour traiter ce cas : 1) une approche utilisant l’approximation de Welch des degrés de liberté ; 2) une approche pondérant les individus en fonction de la variance du groupe auquel ils appartiennent. Dans R, les procédures d’analyse utilisant l’approximation de Welch sont restreintes à deux cas particuliers : - test de Student entre deux groups, procédure t.test ; - Anova à un seul facteur, procédure oneway.test. Ces deux procédures possèdent un argument var.equal pour traiter les cas d’inégalité des variances : On peut aussi corriger a posteriori cette inégalité des variances dans certaines procédures comme linearHypothesis qui possède un argument white.adjust qui permet de prendre en compte l’hétérogénéité des variances entre les groupes. Quand les variances ne sont pas homogènes mais que les groupes sont équilibrés (ou pouvant être assimilés à des groupes équilibrés), une des propositions intéressantes relevant de la seconde approche est de pondérer les individus par la variance du groupe auquel il appartient, ce qui revient plus ou moins à une uniformisation des erreurs pour qu’elles soient toutes de variance unité. Le code pour lm est le suivant : # # La formule contient la ‘somme’ des facteurs utilisés poids <- aggregate( rep( 1, nrow( donnees)) ~ formule, donnees, var) # Par exemple formule ::= F.1 + F.2 s’il y a deux facteurs names( poids)[ncol( poids)] <- "VARIANCE" donnees <- merge( donnees, poids, by=vecteur des noms des facteurs) # lm.res <- lm( formule.d.analyse, data=donnees, weights=donnees$VARIANCE^-1) Les fonctions gls et lme du package nlme propose des méthode plus sophistiquées au travers de la spécification d’un modèle de classe varClasses permettant de programmer ses propres modèles et d’un ensemble prédéfinie de fonction appartenant à cette classe. Par exemple, dans le cas où le modèle contient deux facteurs et qu’on considère que la variance est différente pour chaque combinaison des niveaux, on écrira : gls.res <- gls( Y ~ F * G, data=donnees, weights=varIdent( form=~ 1 | F * G)) Il faut cependant être prudent dans l’utilisation de cette approche utilisant les moindres carrés pondérés car elle fait l’hypothèse que les poids sont connus avec précision, ce qui signifie que si ceux-ci sont estimés à partir d’un faible nombre de valeurs, les poids estimés sont peu 55 fiables et le résultat peut être faussé. De plus certaines estimations des variances sont très sensibles aux outliers. On peut aussi essayer d’estimer ces variances de manière plus fiable en supprimant un certain pourcentage de valeurs extrêmes ou en utilisant des estimateurs de type sandwich (cf. package sandwich). Si on ne connaît pas vraiment la structure de l’erreur, on utilisera alors une méthode itérative connue sous le nom de Iteratively Reweighted Least Square. Voir Faraway pour plus de détails. Cette stratégie d’itération est implantée dans la fonction glm ; pour l’utiliser, on donne comme valeur de départ des poids estimés des sujets l'inverse de la variance des groupes (cf. supra) : glm.res <- glm( formule.d.analyse, data=donnees, weights=donnees$VARIANCE^-1) Exemples utilisant lm : Comparaison des méthodes (fichier : "variance_lm.txt") pour le modèle à variances non homogènes Y.HET ~ GROUPE * NIVEAU ; la variable VAR.EST contient les variances estimées Tracé des interactions Tracé des interactions 6 4 N.2 4 2 2 0 Y Y.HET G.1 G.2 N.4 0 N.1 -2 -2 G.3 N.3 -4 -4 -6 N.1 N.2 N.3 N.4 NIVEAU Barre d'erreurs = écart-type Groupes équilibrés, variances non homogènes G.1 G.2 G.3 GROUPE Barres d'erreur : écart-type Groupes non équilibrés, variances homogènes Notes : 1) La fonction interaction.plot permet de tracer les interactions entre deux facteurs (figures cidessus) mais ne permet de tracer les barres d’erreurs sans lignes de codes supplémentaires. 56 Un fonction du package Hmisc, xYplot (extension du xyplot de lattice) permet de le faire : tab <- read.table( "variance_lm.txt", sep="\t", dec=",", header=TRUE, strings=TRUE) s.tab <- aggregate( Y.HET ~ GROUPE + NIVEAU, tab, FUN=function( x) c( MOY=mean( x), SD=sd( x))) i.tab <- cbind( s.tab[,1:2],as.data.frame( s.tab$Y.HET)) i.tab <- transform( i.tab, LOW=MOY - SD, HIGH=MOY + SD) ylim <- c( min( i.tab$LOW), max( i.tab$HIGH)) xlim <- c( 0.5, 4.5) # La partie droite de la formule devant etre un nombre, il faut convertir les nivaux des facteurs xYplot( Cbind33( MOY, LOW, HIGH) ~ as.integer( NIVEAU), data=i.tab, xlim=xlim, nx=FALSE, ylim=ylim, scales=list( x=list( at=1:4, labels=as.character( levels( i.tab$NIVEAU)))), groups=GROUPE, type="b") 2) On peut désirer estimer les moyennes dans chacun des groupes et l’intervalle de confiance de cette moyenne, ou les moyennes marginales des groupes formés par les niveaux d’un facteur et leur intervalle de confiance. Ce calcul peut être facilement réalisé. Ce point sera abordé dans la paragraphe suivant sur les tests post-hoc. i) table d’Anova (anova( …)) pour les variances non homogènes Sans pondération Df Mean sq. F Avec pondération p Mean sq. F p GROUPE 2 175,42 34,49 < 0,001 36,54 36,54 < 0,001 NIVEAU 3 141,59 27,84 < 0,001 30,21 30,21 < 0,001 GROUPE:NIVEAU 6 5,44 Résidus 5,09 300 1,07 0,381 0,99 0,99 0,433 1,00 En utilisant la pondération, la valeur en moyenne quadratique des résidus vaut bien l’unité comme attendu. ii) summary Par contre, en introduisant la pondération, l’erreur standard sur l’estimation du paramètre est différente pour chaque niveau des facteurs et chaque interaction, contrairement à la configuration sans pondération qui estime la même erreur standard sur tous les niveaux d’un facteur donné et sur tous les niveaux d’une interaction donnée. 33 Notons le C majuscule de Cbind. 57 On pourra comparer les résultats obtenus par la pondération dans lm aux résultats obtenus par une méthode basé sur le maximum de vraisemblance, en l’occurrence la procédure gls du package nlme. Sans pondération Estimate Std. Error t value (Intercept) 0,176 0,128 1,377 GROUPE1 0,809 GROUPE2 Avec pondération Pr(>|t|) Std. Error t value 0,170 0,128 1,377 0,181 4,478 < 0,001 0,172 4,695 < 0,001 0,689 0,181 3,818 0,000 0,183 3,769 0,000 NIVEAU1 -0,086 0,221 -0,390 0,697 0,223 -0,386 0,700 NIVEAU2 1,905 0,221 8,614 < 0,001 0,206 9,234 < 0,001 NIVEAU3 -1,188 0,221 -5,371 < 0,001 0,237 -5,003 < 0,001 GROUPE1:NIVEAU1 -0,120 0,313 -0,383 0,702 0,277 -0,432 0,666 GROUPE2:NIVEAU1 -0,257 0,313 -0,820 0,413 0,342 -0,750 0,454 GROUPE1:NIVEAU2 -0,027 0,313 -0,085 0,932 0,279 -0,095 0,924 GROUPE2:NIVEAU2 -0,144 0,313 -0,459 0,646 0,290 -0,495 0,621 GROUPE1:NIVEAU3 -0,108 0,313 -0,344 0,731 0,340 -0,317 0,752 GROUPE2:NIVEAU3 -0,111 0,313 -0,355 0,723 0,333 -0,333 0,739 R2 0,346 0,361 R2-ajusté 0,322 0,338 F( 11, 300) 14,450 < 0,001 Pr(>|t|) 0,170 15,420 < 0,001 Dans le cas des variances hétérogènes, on peut utiliser trois écritures différentes, les deux premières étant possibles par la présence de la variable VAR.EST : i) gls( Y.HET ~ GROUPE * NIVEAU, data=tab, weights=tab$VAR.EST) ii) gls( Y.HET ~ GROUPE * NIVEAU, data=tab, weights=varFixed( ~ VAR.EST)) iii) gls( Y.HET ~ GROUPE * NIVEAU, data=tab, weights=varIdent( form=~ 1 | GROUPE*NIVEAU)) On obtient les mêmes résultats pour les coefficients que ceux du lm pondéré. Groupes non équilibrés et hétéroscédasticité Si les groupes ne sont pas équilibrés et les variances inégales, le problème se complique. Si le déséquilibre est patent, la solution peut être de revoir le schéma expérimental et si ce n’est pas possible, d’utiliser des procédures spéciales autres que celles basées sur les moindres carrés pondérés (ou non), procédures qui n’entrent pas dans le cadre de ce document. Si le déséquilibre est modéré, on peut privilégier la correction d’hétéroscédasticité. 58 III - Tests post-hoc Les tests post-hoc (en français tests a posteriori) ont des objectifs différents des comparaisons planifiées. Les comparaisons planifiées permettent de tester des hypothèses sur le modèle et sont dérivées des propriétés supposées de ce modèle tandis que les tests post-hoc ne sont appliqués que sur les résultats significatifs d’une analyse, c'est-à-dire en cas de rejet de l'hypothèse nulle. Ces tests ont généralement deux objectifs : 1) identifier les groupes (niveaux de facteur, interactions...) qui sont à l’origine du rejet de l’hypothèse nulle ; par exemple, si cette hypothèse est l’hypothèse classique d’égalité des moyennes, trouver les groupes qui provoquent le rejet ; 2) créer des ensembles à l’intérieur desquels on peut considérer les groupes comme équivalents en moyenne. Exemple: Soit l’analyse suivante donnant comme résultat : lm.n <- lm( Y ~ NIVEAU, data=tab) anova( lm.n) Df Sum Sq Mean Sq F value Pr(>F) NIVEAU 3 17.566 5.8553 12.473 1.059e-07 Residuals 295 138.483 0.4694 Puisque l’hypothèse nulle d’égalité des moyennes est rejetée, la question qui se pose est donc de trouver quels sont les niveaux (groupes) de mêmes moyennes et ceux de moyennes différentes. En testant deux à deux les niveaux, on obtient la table suivante : Estimate Std. Error N.2 - N.1 == 0 2.2635 N.3 - N.1 == 0 -1.0747 N.4 - N.1 == 0 0.6492 N.3 - N.2 == 0 0.5594 tvalue Pr(>|t|) 4.046 <0.001 0.5594 -1.921 0.2214 0.5594 1.160 0.6522 -3.3382 0.5594 -5.967 <0.001 N.4 - N.2 == 0 -1.6143 0.5594 -2.886 0.0219 N.4 - N.3 == 0 1.7239 0.5594 0.0119 3.082 Cette présentation est intéressante mais la découverte des ensembles équivalents en moyenne peut devenir difficile quand le nombre de tests est important (si N est le nombre de niveau, le nombre de tests deux à deux est N * (N – 1) / 2). 59 Une méthode automatique de regroupement proposera trois groupes et les regroupements suivants : N.2 appartient au groupe "c" (moyenne la plus élevée) N.3 appartient au groupe "a" (moyenne la plus basse) N.4 appartient au groupe "b" (moyenne intermédiaire entre celle de N.2 et celle de N.3, mais significativement différente) N.1 peut appartenir au groupe "a" ou au groupe "b". L’examen de la table précédente conduira l’expérimentateur à favorise le regroupent avec N.4 au détriment de celui avec N.3. R propose un certain nombre d’outils pour effectuer ces tests. Il existe aussi les packages multcomp et lsmeans (cf. infra) qui permettent de programmer de manière souple n’importe quel test post-hoc. Avant d’aborder ce point, je vais aborder trois points qui ne font pas partie de ce que la littérature statistique appelle tests post-hoc, mais qui devraient être systématiquement abordés après toute analyse. Vérifications préliminaires Avant de poursuivre l’analyse des résultats, il est nécessaire de procéder à un certain nombre de vérifications préliminaires concernant la pertinence de l’analyse. Elles permettent par exemple de suspecter l’existence de facteurs de confusion cachés pouvant conduire à des résultats paradoxaux (cf. paradoxe de Simpson34.) La majorité de ces vérifications reposent sur des outils graphiques, notamment ceux de l’analyse des résidus, mais aussi sur certains outils de recherche des points influents ou des outliers. Je ne présente pas ici ces outils. Les outils graphiques seront traités dans les chapitres ultérieurs spécifiques des analyses (régression, Anova…) tandis que ceux de recherche des points influents et des outliers seront présentés dans le chapitre suivant. Puissance des analyses La puissance d'un test est la probabilité d'accepter l'hypothèse alternative quand elle est vraie ; la puissance mesure donc le taux de vrais positifs. Si celle-ci est faible, cela signifie que l'analyse ne permet pas de discriminer entre la population négative (hypothèse nulle) et la population positive (hypothèse alternative), c'est-à-dire qu'on peut soupçonner qu’une différence significative entre des moyennes est plus due au caractère aléatoire de l'échantillonnage qu'à l'existence de populations différentes selon le critère testé35. 34 35 Voir l’article sur Wikipedia ou l’exemple publié par Juilius, AS et Mullee, MA BMJ 1994;309:1480. En d’autres termes, cela peut signifier: 1) soit qu’il n’existe sans doute pas plusieurs populations ; 2) soit que le critère testé n’est pas le bon critère discriminant. 60 Quand on teste une hypothèse binaire impliquant soit l'égalité entre les moyennes de deux groupes, soit l'égalité de la moyenne d'un groupe à une valeur donnée, on peut tester soit : 1) l'égalité des moyennes par un test bilatéral (two-sided) ; 2) une différence supérieure à un certain seuil, celui qu'on pose comme étant significatif de l'existence de populations différentes. La puissance de la seconde approche, dite de Neyman Pearson est souvent donnée a priori, ce qui permet de calculer, sous l'hypothèse qu'on connaît (une estimation de) la variance qui doit être la même dans les deux populations, le nombre de sujets par groupe (fonction power.t.test). Dans le cas de la première approche (approche de Fisher), on ne peut que calculer une puissance a posteriori, basée sur les résultats de l'analyse ou sur des considérations sur les populations (moyennes, variances, effectifs). Dans R, ce calcul a posteriori s'effectue aussi à partir de la fonction power.t.test). Si les paramètres testés ne sont pas les moyennes des groupes, mais des proportions, on peut alors utiliser la fonction power.prop.test. Le problème se complique dans le cas où il y a plus de deux groupes et la seule possibilité est de tester l'hypothèse nulle, généralement d'égalité des moyennes. La fonction permettant de calculer la puissance a posteriori de l'analyse s'appelle power.anova.test. Les paragraphes suivants donneront quelques indications sur la manière d'utiliser ces fonctions ou de conduire des calculs équivalents pour obtenir les puissances a posteriori des tests effectués. En réalité, les fonctions citées ci-dessus sont plus générales et permettent non seulement de déterminer les puissances a posteriori, mais aussi de calculer le nombre de sujets par groupes... voir les pages de référence de ces fonctions pour plus de détails. Le calcul se base sur la statistique de test, c'est-à-dire la distribution utilisée pour conclure à un effet significatif ; ce sera le t de Student dans le cas de l'utilisation d'un test t ou le F de Fisher quand il y a plus de deux groupes. Cette démarche est donc applicable à de nombreux tests, soit directement soit en appliquant une méthode de rééchantillonnage (cf. infra pour les méthodes de rééchantillonnage). Dans l’approche de Fisher, on peut procéder comme suit : - puisque le niveau détermine la valeur critique conduisant au rejet de l'hypothèse nulle, on considère que cette valeur critique est la valeur minimale (en valeur absolue si nécessaire) de la statistique de test permettant de discriminer deux populations, celle correspondant à l'hypothèse nulle et celle correspondant à l'hypothèse alternative ; - on détermine la distribution de la statistique de test non plus centrée sur l'hypothèse nulle mais sur la valeur expérimentale de la statistique de test (celle correspondant à la pvalue sous l'hypothèse nulle), ici aussi en valeur absolue si nécessaire ; 61 - sous cette nouvelle distribution, on calcule alors la probabilité que la statistique de test soit supérieure à la valeur critique, cette probabilité est alors la puissance a posteriori du test. Notes : 1) Quand la p-value est significative mais proche du niveau, la puissance de l'analyse est très faible, souvent inférieure à 50%, pouvant même être inférieure à 10% dans certains cas, comme l'a souligné un article dans Nature Neuroscience Reviews36 pour l'imagerie fonctionnelle ; 2) Baisser le niveau du test (prendre par exemple 0,01 au lieu de 0,05) pour éliminer le risque de faux positifs, se fait au détriment de la puissance de l'analyse37 mais peut être la solution ; 3) On peut adapter ce calcul de puissance aux tests unilatéraux (one sided) de différence positive ou nulle, ou négative ou nulle38. power.t.test Les arguments à documenter sont : type qui est le type de test à effectuer : "two.sample" comparaison des moyennes de deux groupes indépendants "paired" comparaison des moyennes de deux groupes appariés "one.sample" comparaison de la moyenne d'un groupe à une valeur. sig.level niveau du test (défaut : 5%) delta différence entre les deux populations différentes sd déviation standard des groupes (défaut : 1) n nombre de sujets par groupe. Cette procédure suppose que les groupes sont équilibrés (même nombre de sujets) et de même écart type. delta est simple à calculer. En effet, si x.1 et x.2 sont les valeurs des deux groupes, ou si x.2 est la valeur à laquelle comparer la moyenne du groupe x.1, on a : "two.sample" delta <- mean( x.1) - mean( x.2) "paired" delta <- mean( x.1 - x.2) "one.sample" delta <- mean( x.1) - x.2 36 Button K.S., Ioannidis J.P., Mokrysz C., Nosek B.A., Flint J., Robinson E.S., Munafò M.R., (2013), Power failure: why small sample size undermines the reliability of neuroscience, Nat Rev Neurosci., 14(5): pp365-376 37 Rappelons qu’une faible puissance de l’analyse signifie que les cas pour lesquels l’hypothèse nulle est rejetée sont très certainement ‘vrais’ ; a contrario, augmenter la puissance du test risque aussi d’augmenter le taux de faux positifs ; c’est le dilemme du compromis entre spécificité et sensibilité de la détection. 38 Attention à la comparaison des p-values entre tests bilatéraux et unilatéraux. Par exemple, supposons une gaussiennes, H00 : m = 0, p < 0,05 ⇒ abs( m) > 1,96 σ ; H0p : m ≥ 0, p < 0,05 ⇒ m < 1,64 σ. 62 Si les variances sont différentes entre les groupes, on peut utiliser comme approximation de l'écart type, l'écart type poolé : sd.approx <- sqrt( ((n.1 - 1) * sd( x.1) + (n.2 - 1) * sd( x.2)) / (n.1 + n.2 - 2)) Dans le cas où on compare deux groupes indépendants, il faut aussi corriger du nombre de degrés de liberté. On peut utiliser pour cela la correction de Satterthwaite-Welch, l'une des plus souvent utilisée. Le nombre corrigé de sujets par groupes sera alors ce nombre de degrés de liberté plus 1 (cf. l'expression du test t) : var.1 <- var( x.1) var.2 <- var( x.2) ddl.corrige <- (var.1 / n.1 + var.2 / n.2)^2 (var.1^2 / (n.1^2 * (n.1 - 1)) + var.2^2 / (n.2^2 * (n.2-1))) n <- ddl.corrige / 2 + 1 power.prop.test Cette fonction fait les hypothèses suivantes : − les groupes sont équilibrés ; − les conditions de Cochran sont respectées, c’est-à-dire que : min( p1, (1 – p1), p2, (1 – p2)) * n >> 5 ce qui permet d’utiliser l’approximation normale. Dans les autres cas, il faut soit utiliser des tests exacts, soit utiliser des méthodes de rééchantillonnage. power.anova.test Cette fonction permet d'obtenir la puissance a posteriori d'une Anova à un facteur quand l'hypothèse nulle est l'égalité des moyennes des groupes. L'hypothèse alternative est alors qu'au moins un des groupes diffère des autres en moyenne. S'il y a plus d'un facteur, on doit alors créer un facteur composite dont les niveaux sont toutes les combinaisons possibles des niveaux des facteurs. S'il s'agit d'une analyse de régression, cette fonction n'est pas utilisable et dans le cas d'une Ancova, elle ignore les régresseurs. Les arguments à documenter sont : groups le nombre de groupes, c'est-à-dire de niveaux du facteur sig.level niveau du test (défaut : 5%) between.var la variance inter-groupes 63 within.var la variance intra-groupe n nombre de sujets par groupe. La fonction considère que l'homoscédasticité est vérifiée et que les groupes sont équilibrés. Une alternative plus générale à cette fonction est d'utiliser les résultats de l'analyse et plus précisément les résultats du test de F sur lequel se base la significativité de l'analyse39. Si on utilise la fonction lm, le résultat de l'application de la fonction summary appliquée à l'analyse contient un champ nommé fstatistic. Il s'agit d'un vecteur nommé dont les trois éléments sont respectivement la valeur (value ou valeur du F), le nombre de degrés de liberté du numérateur (numdf) et celui du dénominateur, donc des résidus, dendf. La valeur critique de rejet de l'hypothèse nulle se calcule par : critic.value <- qf( sig.level, numdf, dendf, lower.tail = FALSE) et la puissance a posteriori qui correspond à la probabilité que la valeur du F soit supérieure à cette valeur critique pour la distribution du F centrée sur le F calculé (value) : puissance.post <- pf( critic.value, numdf, dendf, ncp=value, lower.tail=FALSE) On constate que ce calcul est généralisable à toutes les situations pour lesquelles on connaît la statistique de test. Dans le cas où on fait une analyse à un facteur et que les variances des différents groupes ne sont pas homogènes, on peut aussi estimer le nombre de degrés de liberté par la procédure de Welch. Ceci permet alors d’estimer la puissance a posteriori de l’utilisation de la procédure oneway.test pour conduire l’analyse par la même approche que ci-dessus, avec les paramètres corrigés. Dans ce cas, si res.oneway est le résultat de l’analyse par la procédure oneway.test, on posera : value <- res.oneway$statistic numdf <- res.oneway$parameter[1] dendf <- res.oneway$parameter[2] Effets des prédicteurs Ce problème recouvre en réalité deux questions différentes : 1) parmi les prédicteurs (ou variables indépendantes/explicatives) possibles, trouver ceux qui présentent un intérêt pour l’explication des mesures ; 2) parmi les variables explicatives retenues, estimer l’apport de chacune dans l’explication des mesures. 39 Cette approche se base sur le code de la fonction power.anova.test. 64 La première question relève du choix du modèle. La construction de celui-ci est possible en comparant différents modèles entre eux (cf. les paragraphes sur la comparaison des modèles et sur la significativité de l’analyse). La seconde consiste à tenter d’évaluer l’importance de chacun des prédicteurs dans l’explication des mesures. Dans une régression multiple, cette information peut être obtenue par le coefficient de corrélation semi-partielle (semi-partial correlation ou part correlation) entre le régresseur et la mesure. Ce coefficient de corrélation semi-partielle exprime l’influence linéaire de X.1 sur Y en contrôlant les effets des autres prédicteurs. On peut aussi exprimer cette information à l’aide du coefficient de détermination (R2), ce qui permet de généraliser l’étude de l’influence des prédicteurs aux facteurs. Rappelons que le coefficient de détermination exprime la part de la variance expliquée par le modèle dans la variance totale de la mesure. On peut donc vouloir connaître : 1) la proportion de variance de la mesure uniquement déterminée par le prédicteur, en contrôlant l’influence des autres prédicteurs (coefficient de détermination semi partielle) ; ce coefficient représente la perte en variance expliquée par l’absence du régresseur ; plus le régresseur à d’influence, plus la perte est importante ; on montre que ce coefficient est égal au carré du coefficient de corrélation semi-partielle associé au régresseur dans la cadre du modèle ; 2) la part de variance expliquée par le prédicteur dans la variance non expliquée par les autres prédicteurs (coefficient de détermination partielle) ; ce coefficient représente le rapport entre l’apport en explication de la variance par le régresseur (cf. coefficient de détermination semi partielle) et ce qu’il reste à expliquer en termes de variance dans le modèle sans ce régresseur. La procédure de calcul est simple : # res.lm résultat de l’analyse linéaire (par exemple, de lm) var.y <- var( Y) var.explique <- var( fitted( res.lm)) res.1 <- update( res.lm, . ~ . - X.1) # On calcule le modèle en retirant X.1 var.1 <- var( fitted( res.1)) r.2 <- var.explique / var.y r.2.reduit <- var.1 / var.y coef.determination.semi.partielle <- r.2 - r.2.reduit coef.determination.partielle <- coef.determination.semi.partielle / (1 - r.2.reduit) Tests post-hoc Dans ce paragraphe les procédures implantant les différents tests post-hoc sont succinctement présentées40 ; les paragraphes suivants seront consacrés à des présentations plus approfondies des packages multcomp et lsmeans. 40 Les principes de ces tests, leurs utilisations et leurs performances relèvent des principes généraux des statistiques inférentielles et ne sont pas discutés dans ce document. 65 De nombreux tests post-hoc, dont ceux de multcomp et lsmeans, ne fonctionnent pas ou qu’en partie, avec les résultats de la procédure aov quand celle-ci contient un terme d’erreur Error( …). Par contre, ils fonctionnent alors avec chacun des membres du résultat puisque celui-ci est une liste d’objet de type aov (résultat d’aov sans terme d’erreur) correspondant aux différentes strates testées. Package agricolae Nom du test Description Groupes duncan.test Comparaisons multiples Test de Duncan durbin.test Analyses non paramétriques HSD.test Comparaisons multiples Tukey HSD ? oui LSD.test Comparaisons multiples LSD oui scheffe.test Comparaisons multiples Test de Sheffé oui SNK.test Comparaisons multiples Student-Newman-Keuls oui oui oui waerden.test Analyses non paramétriques cf. kruskal oui waller.test oui Comparaisons multiples Ajustement41 Liens avec HSD oui Package car Nom du test Description Ajustement durbinWatsonTest Autocorrelation des résidus leveneTest Homogénéite des variances bootstrap centrage autour de la moyenne (Levene) centrage autour de la médiane (Brown-Forsythe) outlierTest Test des résidus studentisés Bonferroni Package Laercio pour aov seulement Nom du test Description LDuncan Comparaisons multiples Test de Duncan LScottKnott Comparaisons multiples Test de Scott-Knott LTukey 41 Comparaisons multiples HSD de Tukey ajustement des comparaisons multiples, cf. p.adjust. 66 Package lmerTest Ce package propose un certain nombre de tests concernant les modèles à effets mixtes en compléments des tests offerts par les packages lsmeans et multcomp. Pour cela, l’auteur a reprogrammé certaines fonctions comme lmer, summary, lsmeans et a ajouté certains utilitaires. À noter que lmer et summary donnent les mêmes résultats que les originaux du package lme4 mais modifient les sorties. Package lmtest Nom du test Description bgtest Test de corrélation (des résidus) d’ordre supérieur à 1 coxtest Comparaison de modèles non emboîtés dwtest Test de corrélation des résidus d’ordre 1 encomptest Comparaison de modèles non emboîtés harvtest Test de linéarité jtest Comparaison de modèles non emboîtés waldtest Comparaison de modèles emboîtés Test de Durbin-Watson Test de Harvey et Collier Test de Wald Package lsmeans Nom du test Description Ajustement possible lsmeans lstrends Test des moindres carrés (pentes) pairs Test par paires des résultats des fonctions précédentes summary Résultats complémentaires cld Regroupement en groupes homogènes confint Intervalles de confiance lsmip plot lsm oui Divers tracés Implantation de lsmeans compatible avec glht de multcomp oui 67 Package moments Nom du test Description agostino.test Test d'asymétrie d'une distribution (skewness) Test d'Agostino anscombe.test Test d'aplatissement d'une distribution (kurtosis) Test d'Anscombe-Glynn bonnett.test Test d'aplatissement d'une distribution Test de Bonnette pour l'estimation de Geary jarque.test Test de normalité d'une distribution Test de Jarque-Béra Package multcomp Nom du test Description Ajustement possible cld Regroupements / groupes homogènes coef Coefficients résultats des comparaisons oui confint Intervalles de confiance glht Comparaisons multiples summary Résultats de glht oui oui Toutes les fonctions de ce package utilisent les résultats de la procédure générale glht. De plus, ce package propose de nombreuses fonctions de visualisation (plot). Package nortest Nom du test Description ad.test Test de normalité d'une distribution Test d'Anderson-Darling cvm.test Test de normalité d'une distribution Test Cramer-Von Mises lillie.test Test de normalité d'une distribution Test de de Lillienfors pearson.test Test de normalité d'une distribution Test de Pearson sf.test Test de normalité d'une distribution Test de Shapiro-Francia Ce package ne propose que des tests de normalité. Le test de Pearson est à éviter. Le test de Lillienfors pose quelques problèmes théoriques et certains auteurs conseillent de ne pas l'utiliser, contrairement à d'autres. Les tableaux suivants comparent les différents tests de normalité. Ils donnent la médiane de 20 tirages aléatoires de 20 et de 100 points issus de diverses distributions (en gras, les différences à la distribution normale non significatives). 68 20 points : distribution ad.test cvm.test jarque.test lillie.test pearson.test sf.test shapiro.test cauchy 0,000 0,000 0,000 0,000 0,000 0,000 0,003 chi.2( 10) 0,053 0,069 0,124 0,119 0,205 0,047 0,000 chi.2( 1) 0,000 0,000 0,000 0,000 0,000 0,000 0,000 F( 3, 20) 0,000 0,000 0,000 0,001 0,001 0,000 0,000 F( 6, 40) 0,002 0,004 0,000 0,028 0,030 0,001 0,000 gauss( 0, 1) 0,497 0,488 0,605 0,493 0,639 0,525 0,500 unif( 0, 1) 0,031 0,077 0,214 0,146 0,258 0,031 0,000 cvm.test jarque.test 100 points : distribution ad.test lillie.test pearson.test sf.test shapiro.test cauchy 0,000 0,000 0,000 0,000 0,000 0,000 0,000 chi.2( 10) 0,003 0,011 0,004 0,044 0,141 0,003 0,000 chi.2( 1) 0,000 0,000 0,000 0,000 0,000 0,000 0,000 F( 3, 20) 0,000 0,000 0,000 0,000 0,000 0,000 0,000 F( 6, 40) 0,000 0,000 0,000 0,001 0,000 0,000 0,000 gauss( 0, 1) 0,463 0,474 0,464 0,333 0,639 0,382 0,434 unif( 0, 1) 0,002 0,006 0,048 0,038 0,077 0,004 0,000 Package stats (cœur de R) Nom du test Description ansari.test Test d'échelle entre 2 échantillons Test d'Ansari-Bradley bartlett.test Homogénéité des variances Test de Bartlett binom.test Test de proportions Test binomial exact chisq.test Tableau de contingence Test du khi-deux cor.test Test de corrélation fisher.test Tableau de contingence Test exact de Fisher fligner.test Homogénéite des variances Test de Fligner-Killeen ks.test Adéquation entre distributions test de Kolmogorov-Smirnov mantelhaen.test Tableau de contingence triple Test de Mantel mauchly.test Test de sphéricité Test de Mauchly mcnemar.test Symétrie d’un tableau de contingence Test de McNemar mood.test Test d'échelle (même 'range') Test de Mood pairwise.prop.test Test de proportions appariées 69 poisson.test Comptage (cf. binom.test) Test de Poisson exact prop.test Test de proportions shapiro.test Test de normalité Test de Shapiro et Wilks TukeyHSD Comparaisons multiples Tukey HSD var.test Comparaison de variances F de Fisher Les tests d'homogénéité des variances à préférer sont les tests de Levene (package car) et de Fligner. Les autres sont très sensibles à la non normalité des données. Pour le test de normalité, les tests de Shapiro-Wilks, d'Anderson-Darling, de Cramer-Von Mises (package nortest) ou de Jarque-Bera (package moments) sont à préférer au test de Kolmogorov-Smirnov (cf. package nortest). Package lsmeans Ce package permet d’effectuer de très nombreux tests post-hoc sur les moyennes des moindres carrés (least square means). Il contient deux fonctions principales lsmeans et lstrends. lsmeans et lstrends ne permettent pas de faire que des tests post-hoc limités sur les résultats de aov si le modèle contient la fonction spéciale Error, donc si aov gère les corrélations entre des lignes (données répliquées ou répétées). lsmeans comprend de nombreux arguments et son comportement dépend de ces différents arguments. Je donnerai plus de détails dans les chapitres consacrés à la régression, à l’Anova ou à l’Ancova. Dans ce paragraphe, je donne quelques indications concernant les principaux arguments pour tester directement le résultat d'une analyse linéaire : object : le résultat d’une analyse linéaire (lm, aov, glm, lme, lmer…) ayant au moins un facteur fixe ou le résultat de l'application d'une des fonctions du package comme lstrends ou pairs (cf. l'exemple commenté ci-dessous) ; specs : une formule ou une liste de formules décrivant les tests à effectuer conjointement (cf. infra). On peut citer deux autres arguments qui peuvent être utiles : at : liste nommée, chaque membre est un vecteur de valeurs et a pour nom, le nom d’une covariable du modèle ; lsmeans calcule alors les valeurs estimées pour l’ensemble des valeurs données ; cov.reduce : peut avoir plusieurs formes dont la plus intéressante est une formule ou une liste de formules dont le membre de gauche des formules est une covariable et celui droite, des facteurs ; on utilise cette formulation quand on suppose que les facteurs influe sur la covariable (hétéroscédasticité). Si les covariables sont aussi listées dans at, l’élément de cov.reduce correspondant est ignoré. 70 lsmeans est récursif dans la mesure où il peut avoir comme argument non pas un résultat d’analyse linéaire mais un résultat d’une des fonctions du package, ce qui permet de programmer des tests assez sophistiqués. Ci-dessous je donnerai un exemple de cette possibilité en programmant un test sur le résultat de la fonction pairs. lstrends a trois arguments principaux : model : le résultat d’une analyse linéaire (lm, aov, glm, lme, lmer…) ayant au moins un facteur fixe et un régresseur ; specs : une formule décrivant la configuration à tester ; var : le nom du régresseur testé. summary permet différents tests. Cette fonction a trois arguments intéressants : adjust : méthode d’ajustement des comparaisons multiples ; l’option "auto" choisit l’ajustement en fonction des formules, l’option "tukey" utilise la distribution des intervalles studentisés avec le nombre de moyennes correspondant comme dans le test de Tukey ; level : niveau de l’intervalle de confiance ; infer : qui permet de spécifier si on représente les intervalles de confiance et si on calcule les p-value. cld permet de trouver les groupes homogènes. lsmip permet de tracer des graphiques d’interaction tandis que plot permet différents tracés. Spécification des formules de lsmeans et lstrends : Les tests sur les niveaux des facteurs sont décrits par les formules spécifiées par l’argument specs tandis que ceux impliquant la covariable en interaction avec les facteurs et dont on cherche la tendance dans chaque niveau des facteurs sont décrits par l’argument trend (cf. le chapitre sur l’Ancova) cependant la fonction lstrends permet directement le test des pentes. Chaque formule contient : - une partie gauche, éventuellement absente42, qui représente les tests à effectuer ; par exemple, pairwise ou revpairwise représentent des tests deux à deux (approche de Tukey) et l’absence, le test des moyennes des niveaux définis par la partie droite ; il est aussi possible de définir ses propres tests (cf. la page d’aide de pairwise.lsmc donnant un exemple comment construire la fonction décrivant la matrice de contraste associé au test ; à noter qu’on peut associer à la matrice l’ajustement par défaut grâce à l’attribut "adjust" comme le montre le 42 En son absence, on ne calcule que les moyennes des moindres carrées et selon les paramètres de summary, on teste ces moyennes à la valeur zéro. 71 code de pairwise.lsmc ; dans le chapitre sur les Anova, paragraphe sur les tests post-hoc, je donne un exemple de matrice de contraste ad-hoc.) ; - une partie droite qui définit les termes à comparer et qui comprend deux parties : . une partie à gauche de la barre verticale (|), la seule obligatoire qui définit les termes à tester selon les tests définis par la partie droite ; . une partie à droite de cette barre qui définit les niveaux de regroupement. Notes : - L’ajustement par défaut pour pairwise est Tukey. - Le package propose d’autres contrastes. Voir la page d’aide de pairwise. Exemples de spécification : specs=~ NIVEAU * GROUPE teste les moyennes de toutes les combinaisons specs=pairwise ~ NIVEAU * GROUPE compare aussi ces moyennes deux à deux specs=pairwise ~ NIVEAU | GROUPE pour chacun des niveaux de GROUPE. compare deux à deux les niveaux de NIVEAU Exemple d'utilisation des procédures : Partons des données suivantes : set.seed( 1) moy.F1 <- c( N1.1=12, N1.2=20, N1.3=5) moy.F2 <- c( N2.1=0, N2.2=-3) interaction <- data.frame( F1=c( "N1.1", "N1.1", "N1.2", "N1.2", "N1.3", "N1.3"), F2=c( "N2.1", "N2.2", "N2.1", "N2.2", "N2.1", "N2.2"), val=c( -2, 2, 2, -3, 0, 0)) sample.size <- 60 donnees <- data.frame( F1=sample( names( moy.F1), size=sample.size, replace=TRUE), F2=sample( names( moy.F2), size=sample.size, replace=TRUE), Y.th=NA, stringsAsFactors=TRUE) for( idx in 1:sample.size) { f1 <- donnees$F1[idx] f2 <- donnees$F2[idx] donnees$Y.th[idx] <- moy.F1[f1] + moy.F2[f2] + interaction$val[(interaction$F1 == f1) & (interaction$F2 == f2)] } sd.sample <- 5 donnees$Y <- donnees$Y.th + rnorm( sample.size, sd=sd.sample) 72 pente.F1 <- c( N1.1=1, N1.2=-0.5, N1.3=-1) pente.F2 <- c( N2.1=0, N2.2=-1) interaction.pente <- data.frame( F1=c( "N1.1", "N1.1", "N1.2", "N1.2", "N1.3", "N1.3"), F2=c( "N2.1", "N2.2", "N2.1", "N2.2", "N2.1", "N2.2"), val=c( -0.5, 0.7, 0.7, -0.5, 0, 0)) range.x <- c( -10, 10) donnees$X <- runif( sample.size, min=range.x[1], max=range.x[2]) donnees$Pente <- NA for( idx in 1:sample.size) { f1 <- donnees$F1[idx] f2 <- donnees$F2[idx] donnees$Pente[idx] <- pente.F1[f1] + pente.F2[f2] + interaction.pente$val[(interaction$F1 == f1) & (interaction$F2 == f2)] } donnees <- transform( donnees, MES=Y + Pente * X) auxquelles nous appliquons l'analyse suivante : lm.ancova <- lm( MES ~ X * F1 * F2, donnees) Commençons d'abord par calculer les moyennes des moindres carrés en testant de plus, les différences (contraste pairwise) entre niveaux de F2 au sein de chaque niveau de F1 : print( summary( lsmeans( lm.ancova, specs=pairwise ~ F2 | F1), infer=TRUE)) Si nous comparons les résultats au calcul suivant : print( aggregate( MES ~ F1 + F2, donnees, mean)) nous constatons que les résultat de l’agrégation et ceux de résultant de lsmeans sont assez proches, la différence s'expliquant par la méthode de calcul des moyennes (moyenne sur l'échantillon pour aggregate, moyenne des moindres carrés pour lsmeans.) Maintenant, intéressons nous aux pentes du régresseur. En suivant la procédure de construction explicite (cf. paragraphe correspondant dans celui décrivant multcomp) de la matrice pour tester les résultats d'une analyse, nous pouvons calculer directement les pentes estimées par la procédure suivante : mod.grid <- expand.grid( X=1, F1=as.character( levels( donnees$F1)), F2=as.character( levels( donnees$F2))) mod.mat <- model.matrix( ~ X * F1 * F2, mod.grid) idx.pente <- grep( "^X", colnames( mod.mat)) print( mod.grid$PENTES <- mod.mat[,idx.pente] %*% coefficients( lm.ancova)[idx.pente]) Nous constatons que : print( res <- lstrends( lm.ancova, ~ F2 + F1, var="X")) donne exactement le même résultat, mais la procédure pour y arriver est plus simple et plus facile à comprendre. 73 Maintenant, intéressons-nous à ce qui se passe dans chaque niveau de F1 : print( res <- lstrends( lm.ancova, ~ F2 | F1, var="X")) print( pairs( res, infer=TRUE)) Nous testons bien les différences de pente entre niveaux de F2 dans chaque niveau de F1. On peut aussi se demander si les différences entre les pentes dues aux niveaux de F2 sont identiques dans tous les niveaux de F1. Le test se programmera alors comme suit : print( summary( lsmeans( pairs( res), specs=pairwise ~ F1), infer=TRUE)) La pente moyenne par niveau de F1 vaut : print( moy.pentes <- c( N1.1=0.5 * (mod.grid$PENTES[1] + mod.grid$PENTES[4]), N1.2=0.5 * (mod.grid$PENTES[2] + mod.grid$PENTES[5]), N1.3=0.5 * (mod.grid$PENTES[3] + mod.grid$PENTES[6]))) Les différences de pente moyenne peuvent être testés comme suit : print( summary( lsmeans( res, specs=pairwise ~ F1), infer=TRUE)) En conclusion, on voit que ce package est très puissant et permet de très nombreux tests. Son seul ‘défaut’ dont il faut se souvenir, est qu’il se base sur les moyennes des moindres carrés et non les estimations des moyennes basées sur l’échantillon. Quand le schéma est déséquilibré (groupes n’ayant pas les mêmes effectifs), ces deux moyennes diffèrent. Cela peut être un défaut comme un avantage puisque les moyennes des moindres carrés sont indépendantes des effectifs. Package multcomp La procédure centrale de ce package est glht qui calcule les valeurs à tester. Plusieurs autres procédures permettent de tester les valeurs, de calculer les intervalles de confiance (confint) ou de visualiser les résultats (cld, plot…). On peut comparer l’approche de multcomp (plusieurs procédures en cascade) à celle utilisée pour les procédures d’analyse : une procédure (par exemple, lm) estime le modèle, une autre donne des résultats globaux (anova), une autre un résumé (summary)… glht comprend quatre paramètres principaux dont 2 sont obligatoires : model le modèle (résultat d’analyse) sur lequel on fait des tests post-hoc, linfct la description des tests, rhs (optionnel) si l’hypothèse nulle n’est pas la nullité des paramètres alternative (optionnel) par défaut, test bilatéral, sinon type de test unilatéral. testés, On peut citer un cinquième paramètre vcov quand on veut utiliser une estimation particulière de la matrice de covariance des paramètres, par exemple un estimateur de type sandwich43, 43 Cf. le package sandwich. 74 notamment pour gérer des cas hétéroscédasticité. Ce paramètre fait alors appel à la fonction d’estimation de cette matrice (e.g., vcov=sandwich). Il existe trois manières principales de décrire les tests à effectuer (valeur de l’argument linfct) : 1) utiliser la fonction mcp ; 2) utiliser la fonction lms du package lsmeans ou appeler glht à partir de lsmeans (cf. argument glhargs de lsmeans) ; 3) donner symboliquement ou explicitement la matrice de calcul des tests à test à effectuer à partir des paramètres calculés par la procédure d’analyse. mcp La fonction mcp décrit de manière assez simple les tests à effectuer sur les niveaux des facteurs. Elle ne sait pas prendre en compte les paramètres de régression. Ses arguments sont du type nom.du.facteur=test.sur.les.niveaux. Si elle a plusieurs arguments, elles va générer les comparaisons multiples pour chacun des niveaux des facteurs. Le test sur les niveaux peut être le nom d’une des méthodes préprogrammées (cf. contrMat), par exemple, Tukey pour les comparaisons deux à deux. Elle peut être aussi décrite de manière symbolique par un vecteur de chaînes de caractères exprimant une combinaisons linéaire des niveaux du facteur, ou une matrice explicite. Par exemple : linfct=mcp( NIVEAU="Tukey") linfct=mcp( NIVEAU=c( "N.2 - N.1 = 0", "N.3 - N.1 = 0", "N.4 - N.1 = 0", "N.4 - N.2 = 0", "N.4 - N.3 = 0")) linfct=mcp( NIVEAU=contrMat( type="Tukey")) sont équivalents. Attention : Les auteurs de ce package signale que cette fonction est à utiliser avec précaution dans le cas d’Ancova ou d’Anova ayant deux facteurs ou plus. En effet, comme il est difficile de déterminer avec précision quels sont les paramètres d’intérêt dans le cadre des tests posthoc de type Tukey ou Dunett, seul les différences des effets principaux sont testés sans prendre en compte ni les covariables ni les interactions. lsm La fonction lsm permet des tests plus sophistiqués que mcp. C’est l’interface avec lsmeans, cependant son utilisation n’est pas recommandée. Il est préférable d’utiliser directement lsmeans. 75 Matrice explicite Décrire symboliquement les tests à effectuer (comme le permet aussi la fonction linearHypothesis) peut sembler a priori une solution attrayante. Cependant, comme les tests sont alors fondés sur des combinaisons linéaires des coefficients estimés par la procédure d’analyse (par exemple, lm), il faut connaître la relation qui lie ces paramètres aux moyennes des groupes ou aux autres valeurs comme les pentes ou les effets principaux pour spécifier les tests. De ce fait, il est souvent plus pratique de les spécifier à partir d’un codage explicite de la matrice qui sera plus simple car basé sur les matrices de contrastes utilisées dans l’analyse. Par contre, ce type de codage est facile à réaliser dans le cadre des régressions. C’est la méthode la plus souple qui permet en outre de tester des paramètres de régression. On peut construire la matrice à partir des principes décrits dans le § ‘Contrastes et matrice du modèle’. On peut aussi construire la matrice en deux étapes, la première étant celle reconstruisant les moyennes ou paramètres de régression comme indiqué dans le paragraphe mentionné ci-dessus puis faire le produit entre la matrice des tests et cette matrice. Quand le modèle ne contient que des facteurs, mcp et surtout lsm répondent à la grande majorité des test post-hoc qu'on veut faire. Par contre, la construction de matrices explicites est très souvent nécessaire quand le modèle met en jeu des régresseurs (prédicteurs quantitatifs). Quand les tests portent sur les groupes définis par les niveaux des facteurs, lsmeans permet souvent de programmer les tests à condition de bien choisir les valeurs des régresseurs à passer par l'argument at car ils doivent valoir un après transformation si on régresse sur une fonction de ce régresseur (par exemple si on régresse sur log( x), il faut donner la valeur e à at). Si les tests portent sur les coefficients de régression d’une Ancova, la construction explicite de la matrice est à ma connaissance la seule façon de procéder dans multcomp. Construction de la matrice Il serait fastidieux de donner des règles générales car cette construction diffère d'un cas à l'autre, même si elle suit certaines régularités. Les exemples ci-dessous permettent de comprendre la manière de construire la matrice. Exemples : # NIVEAU et GROUPE sont deux facteurs lm.test <- lm( Y ~ NIVEAU * GROUPE, donnees) grid <- expand.grid( GROUPE=as.character( levels( donnees$GROUPE)), NIVEAU=as.character( levels( donnees$NIVEAU)),) mat <- model.matrix( ~ NIVEAU * GROUPE, grid) rownames( mat) <- paste( grid$NIVEAU, grid$GROUPE, sep=":") 76 # 1) test de chaque moyenne de groupe à zéro On utilise les moyennes estimées : mat %*% coef( lm.test) glht.test <- glht( lm.test, linfct=mat) # 2) comparaison deux à deux de chaque moyenne de groupe Il faut tester deux à deux les moyennes estimées. Les combinaisons linéaires de ces moyennes se construisent grâce à l'approche de Tukey implantée comme une des matrices contrMat du package. v.contr <- rep( 1, nrow( grid)) names( v.contr) <- rownames( mat) K <- contrMat( v.contr, type="Tukey") glht.test <- glht( lm.test, linfct=K %*% mat) # 3) comparaison deux à deux des moyennes des moindres carrés des niveaux de GROUPE Cette moyenne prend en compte l'ordonnée à l'origine, les effets principaux du facteur et les interaction impliquant ce facteur. Par définition, c'est la moyenne de toutes les moyennes de groupes dont le facteur en question est un des déterminants, donc ici sur tous les niveaux de NIVEAU. d.f.contr <- aggregate( mat ~ GROUPE, grid, mean) v.contr <- rep( 1, nlevels( donnees$GROUPE)) names( v.contr) <- as.character( levels( donnees$GROUPE)) K <- contrMat( v.contr, type="Tukey") glht.test <- glht( lm.test, linfct=K %*% as.matrix( d.f.contr[,colnames( mat)])) # 4) comparaison deux à deux des niveaux de NIVEAU pour chacun des niveaux de GROUPE La moyenne du groupe N.{i}:G.{j} est définie par : µN.{i}:G{ j}=OO+ϕN.{i}+ϕG.{ j}+ϕN.{i}:G.{ j} Le calcul des différents ϕ est expliqué dans le § 'Contrastes et matrice du modèle'. En partant de l'équation ci-dessus, on constate alors que les tests doivent porter sur les quantités : τ N.{i}:(G.{ j}−G.{k })=(ϕG.{ j}−ϕG.{k })+(ϕ N.{i}:G.{ j}−ϕN.{i}:G.{k}) Les différences entre les effets principaux du facteur GROUPE se calculent par : diff.gr <- contrMat( c( G.1=1, G.2=1, G.3=1), type="Tukey") %*% contr.sum( 3) 77 Il est plus facile de construire directement la matrice. En effet, partons du data.frame grid et de la matrice du modèle (mat) construits ci-dessus : Groupes de sujets ⇒ Définition des valeurs à tester n° ligne NIVEAU GROUPE 1 N.1 G.1 N.1 G.2 - N.1 G.1 2 N.1 G.2 N.1 G.3 - N.1 G.1 3 N.1 G.3 N.1 G.3 - N.1 G.2 4 N.2 G.1 N.2 G.2 - N.2 G.1 5 N.2 G.2 N.2 G.3 - N.2 G.1 6 N.2 G.3 N.2 G.3 - N.2 G.2 7 N.3 G.1 N.3 G.2 - N.3 G.1 8 N.3 G.2 N.3 G.3 - N.3 G.1 9 N.3 G.3 N.3 G.3 - N.3 G.2 10 N.4 G.1 N.4 G.2 - N.4 G.1 11 N.4 G.2 N.4 G.3 - N.4 G.1 12 N.4 G.3 N.4 G.3 - N.4 G.2 Celles entre les interactions sont légèrement plus compliquées à calculer : inter <- kronecker( contr.sum( 3), contr.sum( 4)) rownames( inter) <- paste( rep( as.character( levels( tab$NIVEAU)), nlevels( tab$GROUPE)), rep( as.character( levels( tab$GROUPE)), each=nlevels( tab$NIVEAU)), sep=":") inter <- inter[rownames( mat),] diff.inter <- kronecker( diag( 4), contrMat( c( 1, 1, 1), "Tukey")) %*% inter La première ligne calcule la matrice des contrastes de l'interaction (cf. 'Contrastes et matrice du modèle'), les deux lignes suivantes réorganisent la matrice pour que les lignes soient dans le même ordre que celles de la matrice du modèle (mat). La matrice inter est de ce fait identique aux colonnes 7 à 12 de la matrice mat puisque ces colonnes correspondent à la matrice de contraste de l'interaction dans le modèle. La quatrième ligne recopie cette matrice pour chaque niveau. On construit enfin la matrice à passer comme argument linfct : K <- matrix( 0, ncol=12, nrow=12, dimnames=list( c( "N.1:G.2-G.1", "N.1:G.3-G.1", "N.1:G.3-G.2", "N.2:G.2-G.1", "N.2:G.3-G.1", "N.2:G.3-G.2", "N.3:G.2-G.1", "N.3:G.3-G.1", "N.3:G.3-G.2", "N.4:G.2-G.1", "N.4:G.3-G.1", "N.4:G.3-G.2"), names( coef( lm.inter)))) K[,5:6] <- rbind( diff.gr, diff.gr, diff.gr, diff.gr) K[,7:12] <- diff.inter 78 Les colonnes 5 et 6 correspondent aux paramètres associés à l'effet principal du facteur GROUPE et les colonnes 7 à 12, aux paramètres de l'interaction. De ce fait, la matrice à utiliser a la valeur suivante44 : Colonnes de la matrice (I) N1 N2 N3 G1 G2 N1:G1 N2:G1 N3:G1 N1:G2 N2:G2 N3:G2 coef 45 0 0 0 0 -1 1 -1 1 0 0 0 0 (I) 0 0 0 0 -2 -1 -1 0 1 0 0 0 N1 0 0 0 0 -1 -2 0 -1 1 0 0 0 N2 0 0 0 0 -1 1 1 1 1 1 0 0 N3 0 0 0 0 -2 -1 1 1 1 0 1 0 %*% G1 0 0 0 0 -1 -2 0 0 0 -1 1 0 G2 0 0 0 0 -1 1 0 0 0 -1 -1 -2 N1:G1 0 0 0 0 -2 -1 -1 0 0 -1 0 -1 N2:G1 0 0 0 0 -1 -2 -1 0 0 0 1 1 N3:G1 0 0 0 0 -1 1 0 1 -1 0 1 -1 N1:G2 0 0 0 0 -2 -1 1 2 1 1 2 1 N2:G2 0 0 0 0 -1 -2 1 1 2 1 1 2 N3:G2 On pourra vérifier qu'on obtient les mêmes valeurs de coefficients à tester grâce à cette matrice : glht.k <- glht( lm.test, linfct=K) qu'en utilisant lsm : glht.l <- glht( lm.inter, linfct=lsm( revpairwise ~ GROUPE | NIVEAU)) # NIVEAU est un facteur, X un régresseur lm.test <- lm( Y ~ NIVEAU * X, donnees, contrasts=list( NIVEAU="contr.sum")) grid <- expand.grid( NIVEAU=as.character( levels( donnees$NIVEAU)), X=1))) mat <- model.matrix( ~ NIVEAU * X, grid) 44 45 Le contraste utilisé est "contr.sum". Pour abréger les noms des paramètres estimés, j'ai noté Ni pour NIVEAUi et Gi pour GROUPi. 79 # 1) pente moyenne nulle C'est le coefficient X glht.test <- glht( lm.test, linfct=matrix( c( 0, 0, 0, 0, 1, 0, 0, 0), nrow=1, dimnames=list( "X", NULL))) # 2) pente nulle pour chacun des niveaux C'est la somme du coefficient X et des coefficients d'interaction entre NIVEAU et X. Cette matrice d'interaction est la matrice des contrastes de NIVEAU k.mat <- cbind( matrix( c( rep( 0, 16), rep( 1, 4), nrow=4, dimnames=list( as.character( levels( donnees$NIVEAU)), NULL)), contr.sum( 4)) glht.test <- glht( lm.test, linfct=k.mat) # 3) comparaison deux à deux des pentes entre niveaux On crée les différences deux à deux entre les pentes par la méthode de Tukey. v.contr <- rep( 1, 4) names( v.contr) <- as.character( levels( donnees$NIVEAU)) K <- contrMat( v.contr, type="Tukey") glht.test <- glht( lm.test, linfct=K %*% k.mat) Obtention des résultats des tests Le résultat des comparaisons est obtenu par la fonction summary dont le premier argument est le résultat de glht et le second argument (de nom test), désigne la méthode de calcul et, éventuellement, la méthode de correction des comparaisons multiples à utiliser. La méthode de correction par défaut "single-step" est basée sur une distribution normale multivariée. Il existe aussi d’autres méthodes spécifiques de multcomp. On peut aussi utiliser les méthodes plus classiques comme celles de Bonferroni, de Holm ou FDR (cf. p.adjust). Intervalles de confiance et regroupements La fonction confint permet de calculer les intervalles de confiance ajustés ou non. La fonction cld permet d'estimer les regroupements possibles, c'est-à-dire qu'elle donne les regroupements des valeurs post-hoc estimées comme n'étant pas significativement différentes. Elle n'est utilisable que si on teste la sortie de glht en utilisant comme valeur de l’argument linfct l’appel de à la fonction mcp avec comme type de test "Tukey" et n’a de sens que s'il existe au moins un test post-hoc significatif46. 46 Dans la version actuelle de multcomp, on peut tromper cld par une astuce à ses risques et périls : - donner "Tukey" comme valeur à l’attribut type de la sortie de glht ; - ajouter un attribut focus avec comme valeur le nom du facteur d’intérêt. 80 Deux fonctions de visualisation plot sont associées à ces deux fonctions précédentes (cf. leurs pages d’aide). Comparaison de glht et lsmeans Les deux procédures donnent des résultats sensiblement équivalents, sauf quand il y a des covariables et, éventuellement, des interactions. Grâce à une utilisation systématique des formules au sens de R, lsmeans m’apparaît comme plus facilement utilisable pour les tests post-hoc sur les (M)AN(C)OVA et a donc ma préférence, sauf pour quelques utilisations très précises comme un test à des valeurs différentes de zéro puisque glht possède un argument rhs permettant de spécifier des valeurs de test autres que zéro ou dans le cadre des régressions que lsmeans ne gère pas (cf. chapitre sur les régressions). Je recommande donc en première intention le package lsmeans que, mais à chacun de faire son choix en fonction de ses préférences personnelles. Précision finie des mesures Dans toutes les analyses statistiques classiques, on fait l’hypothèse que toutes les variables indépendantes sont connues avec précision, donc sans erreur, et que toutes les variables dépendantes ou leurs transformées via la fonction de lien, sont affectées d’un bruit de mesure indépendant de la mesure elle-même (fluctuations statistiques éventuellement corrélées entre elles en fonction de certaines variables indépendantes.) Ces hypothèses sont généralement vérifiées quand il s’agit d’une mesure objective, c’est-à-dire directement liée à la nature des objets analysés mais sont fausses si la mesure est obtenue via un instrument de mesure car tout instrument de mesure a une précision finie. Il existe alors deux causes principales de violation de ces hypothèses : 1) des erreurs d’affichage ou de détection (par exemple, un diagnostic posé avec une certaine marge d’incertitude, l’âge exprimé en année sans tenir compte de la date exacte de naissance ni de celle de l’examen47, poids exprimé en kilogramme...) 2) la sensibilité de l’instrument de mesure qui ne sait apprécier des faibles différences48. La violation de ces hypothèses fait que les erreurs sont corrélées entre elles : dans le premier cas, c’est au travers de la corrélation du terme d’erreur avec certains prédicteurs tandis que dans le second cas, ce sont les mesures (variables dépendantes) qui sont corrélées entre elles. Il faut alors déterminer si cette corrélation risque de perturber gravement l’analyse. On considère habituellement, à juste titre, qu’il n’en est rien en ce qui concerne l’âge ou le poids. 47 Supposons un examen effectué le 1er janvier 2014 sur une personne née le 1er janvier 1974 et une autre sur une personne née le 31 décembre de cette même année, on considérera généralement que toutes deux sont âgées de 40 ans. 48 Par exemple, on dira que telle balance donne le poids en grammes à ± 1 gramme. Donc, les mesures sont souvent entachées d’erreurs car il s’agit souvent d’approximations comme par exemple donner l’âge d’un sujet en nombre entier d’années. L’erreur dépend alors i) du fait qu’on utilise un arrondi (fonction round) ou d’une troncature (fonction trunc). De plus, en ce qui concerne les âges, l’erreur dépendra et du fait qu’on prend comme référence le 1er janvier, le 1er juillet ou le 31 décembre. 81 Le premier type de problème est résolu par ce qu’on appelle la méthode des variables instrumentales et par l’estimation du modèle par une méthode des doubles moindres carrées. C’est un cas particuliers de modèles conjoints (estimation conjointe de deux modèles liés comme en épidémiologie, une étude longitudinale incluant un modèle d’évolution d’un paramètres et un modèle de suivi.) Ce cas de figure sort du cadre de cette note mais il existe dans R un certains nombres de package permettant de traiter ce genre de problème (AER, systemfit, twosls dans Zelig…) Dans le second type de problème, l’expérimentateur peut se trouver confronté à un résultat paradoxal quand le nombre de sujets est suffisamment important, car on peut alors trouver des différences significatives inférieures à la précision de l’instrument de mesure. Ce problème lié à la précision de l’instrument peut être géré relativement simplement de manière empirique en ne considérant pas les différences statistiquement significatives inférieures au pouvoir de résolution de l’instrument de mesure. Cependant, il convient de définir ce qu’on entend par pouvoir de résolution de l’instrument. La résolution du système de mesure est l’erreur faite par ce système sur une mesure ponctuelle ; par exemple 370 grammes ± 1 gramme signifie qu’on estime que la mesure exacte se situe très probablement quelque part entre 369 et 371 grammes. Remarquons immédiatement qu’il n’est pas très cohérent d’exprimer une telle mesure en fractions de l’unité de résolution (par exemple, 370,41 grammes) mais plutôt d’arrondir cette mesure à un multiple de l’unité de résolution. Le pouvoir de résolution sera donc la capacité qu’on a de pouvoir dire avec une bonne certitude que les deux mesures expriment deux valeurs différentes. Pour reprendre l’exemple ci-dessus, on ne peut pas prétendre distinguer entre deux poids de 370 grammes et de 371 grammes puisque les valeurs exactes ont à peu près la même probabilité de se trouver entre 370 et 371 grammes. Le pouvoir de résolution du système est donc au minimum de 2 fois la résolution. Une règle générale est de se donner un facteur compris entre 2 et 3 par analogie avec la distance minimale entre les moyennes de deux gaussiennes afin de les distinguer dans un mélange. Quand la mesure est faite sur un paramètre dont on sait qu’il a une certaine dispersion dans la population étudiée (par exemple, toutes les personnes d’une classe d’âge donnée n’ont pas la même taille mais leur taille se distribue autour d’une valeur moyenne selon une courbe en ‘cloche’ ou distribution gaussienne), on peut utiliser un paramètre de dispersion comme unité de résolution de la mesure, par exemple un multiple de la déviation standard (fonction sd) ou la déviation absolue à la médiane (median absolute deviation, fonction mad). A priori, le pouvoir de résolution peut servir pour déterminer le nombre de sujets nécessaires à l’expérience (cf. chapitre consacré à l’Anova) puisqu’on se donne alors une hypothèse alternative H1 qui est que la différence détectée soit au moins égale au pouvoir de résolution. A posteriori, il sert à estimer dans quelle mesure l’hypothèse nulle peut être réfutée, et si c’est le cas, à estimer le pouvoir réel a posteriori de l’analyse et les différences significatives. Pour cela, on prendra comme valeur critique de rejet de l’hypothèse nulle, la plus grande des valeurs entre le pouvoir de résolution du système et la valeur critique du test lié au niveau choisi (comptage des erreurs de type I). Ainsi, quand on effectue un test post-hoc sur les moyennes des groupes associés aux différents niveaux d’un facteur par un test de type Tukey HSD, c’est-à-dire de comparaisons deux à deux, on peut modifier le niveau du test pour tenir 82 compte du pouvoir de résolution, on ne déclarera comme significatives que les différences supérieures à la résolution données comme significatives par le test post-hoc. Cette règle influera sur la construction de groupes homogènes. La procédure suivante permet de construire ‘à la main’ les groupes homogènes : 1) on crée une matrice logique carrée de dimension le nombre de groupes dont on veut comparer les moyennes, c’est-à-dire le nombre de niveaux testés ; pour faciliter la lecture du résultat, on donne comme nom aux colonnes et aux lignes, les noms des niveaux ; 2) on met à TRUE l’intersection ligne/colonne qui correspond à une différence significative des moyennes des niveaux correspondants, donc - la matrice est symétrique, - sa diagonale est FALSE ; 3) on traite cette matrice par la fonction suivante que j’ai appelé .absorb inspirée du codage des fonction cld de multcomp et de lsmeans ; les colonnes de la matrice résultante représente les groupes homogènes (a, b…) où TRUE signifie que le niveau/ligne correspondant appartient au groupe. .absorb <- function( mat) { if( ncol( mat) > 1) { for( j in seq( 1, ncol( mat) - 1)) { for( k in seq( j + 1, ncol( mat))) { idx.j <- mat[,j] idx.k <- mat[,k] cdn.jk <- idx.j & idx.k if( all( cdn.jk[idx.k])) { mat <- mat[,-k,drop=FALSE] return( .absorb( mat)) } else if( all( cdn.jk[idx.j])) { mat <- mat[,-j,drop=FALSE] return( .absorb( mat)) } } } } colnames( mat) <- letters[1:ncol( mat)] return( mat) } 83 IV - Notion de points influents, outliers et points aberrants49 R propose un certain nombre de procédures pour récupérer les résultats de l’analyse, dont : fitted permet de récupérer les valeurs estimées par le modèle pour chacun des individus ; residuals permet de récupérer les résidus bruts pour chaque individus ; coef retourne les coefficients estimés du modèle ; vcov retourne la matrice de variance/covariance des coefficients du modèle. Points influents D’abord quelques rappels théoriques sur la manière de mesurer l’influence des observations50 : Biais dans l’estimation de l’erreur : Le modèle est Y = XB + E, avec X les valeurs expérimentales des variables indépendantes, éventuellement recodées par les contrastes (ou model matrix), B, la matrice colonne des paramètres à estimer et E l’erreur de variance σ2. La −1 résolution par les moindres carrées donne Bˆ = ( X ' X ) X ' Y et la variance de l’estimateur B̂ −1 −1 des paramètres est s 2ˆ = σ 2 ( X ' X ) . Les résidus valent R = Y − XBˆ = I − X ( X ' X ) X ' Y . ( B ) ( ) Donc leur variance vaut var(R ) = I − X ( X ' X ) X ' σ 2 . Les résidus sous-estiment donc l’erreur de mesure. Levier (leverage) ( −1 ) La matrice H = I − X ( X ' X ) X ' est appelée la matrice ‘chapeau’ (hat matrix). Si les conditions du modèle linéaire sont respectés, c’est une matrice diagonale et les éléments de sa diagonale sont appelés les valeurs du levier ; ce sont les valeurs de contraction de l’erreur par l’analyse. En théorie, si aucune observation n’a d’influence, toutes doivent avoir la même valeur de levier de l’ordre de (k + 1) / N. Un critère empirique est donc de considérer que les valeurs qui ont un levier supérieur à (k + 1) / N sont suspectes. −1 Résidus standardisés Ils sont corrigés du coefficient biaisant l’estimation de l’erreur (levier ; cf. supra) et divisés par leur déviation standard estimée. 49 Parmi les références, on peut citer Velleman, P., Welsch, R., 1981, Efficient computing of regression disgnostics, The American Statistician, 34(4), pp 234-242. 50 N : nombre de sujets ; k : nombre de paramètres à estimer. 85 Donc : rs ,i = ri s r 1 − hii avec sr, la déviation standard estimée des résidus. L’hypothèse nulle est alors qu’ils suivent une loi de Student centrée ; de ce fait les valeurs en valeur absolue supérieures à t α 2N , N −k sont considérées comme des outliers. Résidus studentisés Ils sont assez similaires aux résidus standardisés, à l’exception qu’on estime la déviation standard pour un individu donné à partir de tous les autres individus, excepté l’individu considéré. Donc : rs*,i = ri 51 s r ,(i ) 1 − hii avec sr,(i ), la déviation standard estimée des résidus moins le point i. telle que : s r2,(i ) = r2 1 ( N − 1) s r2 − i (N − 1 − k ) (1 − hii ) L’hypothèse nulle est alors qu’ils suivent une loi de Student centrée ; de ce fait les valeurs en valeur absolue supérieures à t α 2N , N −1− k sont considérées comme des outliers. DFFITS Cet indice mesure de combien une observation influence son évaluation, c’est-à-dire de combien, l’ajout de cette observation modifié l’erreur d’ajustement en unités d’erreur standardisée. Cet indice s’exprime par : DFFITSi = Yˆi − Yˆi ,(i ) s r ,(i ) hii = hii 1 − hii ri s r ,(i ) 1 − hii . Le critère informel considère que les valeur supérieures à 1 sont suspectes pour les petits échantillons et ceux de taille moyenne et, pour les grands échantillons, le seuil empirique vaut k 2 . N DFBETA Cet indice mesure l’influence de l’individu sur chacun des paramètres estimés, y compris l’ordonnée à l’origine ; le DFFITS est donc une sorte de résumé des DFBETA. Il a une interprétation assez similaire puisqu’il mesure la modification de l’erreur d’estimation de 51 (i) en indice signifie le calcul de la valeur mentionnée en supprimant le sujet n° i du calcul. 86 chacun des coefficients quand on ne prend pas en compte l’individu i. Cet indice se calcule à partir de la model matrix : DFBETA j ,(i ) = βˆ j − βˆ j ,(i ) s r ,(i ) c jj ( avec {c jj } = diag ( X ' X ) −1 ) en posant j = 1 pour l’ordonnée à l’origine, 2 pour le premier coefficient… c’est-à-dire les positions dans le vecteur coef( modele). Le critère informel considère que les valeur supérieures à 1 sont suspectes pour les petits échantillons et ceux de taille moyenne et, pour les grands échantillons, le seuil empirique vaut 2 . N La distance de Cook Cette distance mesure l’impact de chacune des observation sur les valeurs ajustées : Di = (Bˆ (i ) ) ( − Bˆ ' ( X ' X ) Bˆ (i ) − Bˆ ks 2 ) = (Yˆ (i ) )( − Yˆ ' Yˆ(i ) − Yˆ ks 2 )=r hii k 1 − hii 2 i . Empiriquement, on peut utiliser le seuil de 4 / (N - k). Plus formellement, en remarquant que l’expression de la distance de Cook ressemble à celle d’une statistique de Fisher quand les conditions d’application des modèles linéaires sont respectés, on peut définir le seuil à partir de la distribution des F comme étant F0.5 ( p, N − p ) . COVRATIO C’est la mesure de l’impact de chaque observation sur la matrice de variance/covariance des coefficients de régression : COVRATIOi = ( ( det s r2,(i ) X (' i ) X (i ) ( det s ( X ′ X ) 2 r −1 ) −1 ) Les valeurs hors de l’intervalle 1± ). 3k peuvent être considérées comme suspectes. N Correspondance entre les indices et les fonctions de R On peut obtenir les différents indices de performance grâce à des fonctions spécifiques qui sont recensées dans la page d’aide influence.measures. Levier hatvalues / hat Résidus normalisés rstandard Résidus standardisés rstudent DFFITS dffits DFBETA dfbeta / dfbetas 87 Distance de Cook cook.distance COVRATIO covratio Visualisation des indices Il existe une fonction plot spécifique qui permet de visualiser un certain nombre d’indices de performance. Cette fonction possède un argument which qui permet d’indiquer quel indice à visualiser : which Étiquette Signification 1 Residuals vs Fitted Résidus en fonction de la valeur ajustée 2 Normal Q-Q Résidus standardisés. Droite de Henry 3 Scale-Location Résidus standardisés (rstandard) 4 Cook's distance Distance de Cook 5 Residuals vs Leverage Résidus standardisés en fonction du levier 6 Cook's distance vs Résidus standardisés égaux en valeurs. leverage/(1-leverage) Si which n’est pas donné, plot visualise les quatre indices 1,2,3 et 5. Par défaut, ils sont visualisés séquentiellement et interactivement. On peut cependant les visualiser dans quatre quadrants d’une fenêtre graphique par la séquence suivante : o.par <- par( mfrow=c( 2, 2)) plot( lm.x, …) par( o.par) # on divise la fenêtre graphique en quatre quadrants # lm.x résultat de la régression par lm # on restitue les paramètres graphiques initiaux On peut aussi écrire ses propres fonctions de visualisation. Influence dans les modèles à effets mixtes Les procédures présentées précédemment sont applicables aux modèles à effets fixes comme ceux utilisés par lm ou glm. Il existe un package spécifique pour détecter les points influents dans les modèles à effets mixtes résultant des procédures du package lme4, le package ME.influence. Se reporter à sa documentation pour plus de détails. 88 Détection de la corrélation entre prédicteurs Le facteur d’inflation de la variance (Variance Inflation Factor ou VIF) : Le VIF estime pour chacun des prédicteurs de combien l’analyse amplifie la variance de la variable dépendante. En théorie, pour que l’analyse soit stable, elle ne devrait pas l’amplifier. Il se base sur la mesure le degré de corrélation de chacune des variables indépendantes avec les autres prédicteurs du modèle : 1 2 1 − R 2j avec R j , le coefficient de détermination multiple quand le prédicteur (variable indépendante) Xj est régressé sur les k - 1 autres variables. Le calcul est simple quand tous les Xm régresseurs sont des variables quantitatives puisqu’il s’agira du R2 du modèle X j ~ m∑ ou ≠j VIF j = plus simplement de la diagonale de l’inverse de la matrice de corrélation des prédicteurs. Quand il y a des facteurs, le calcul est plus complexe. On considère en général qu’un VIF supérieur à une valeur comprise entre 3 et 5 indique des prédicteurs corrélés, donc pouvant biaiser l’analyse. La fonction de R est vif du package car. Détection a priori : Il est possible d’estimer a priori la corrélation entre les prédicteurs en utilisant des indices classiques de corrélation comme ceux listés ci-dessous. - Corrélation entre deux prédicteurs quantitatifs (relation linéaire) : la corrélation de Pearson ; il existe un certain nombre de méthodes plus spécifiques quand il s’agit de régresseurs, elles sont présentées dans le chapitre consacré à la régression ; - Corrélation entre un prédicteur quantitatif et un facteur ordonné ou entre deux facteurs ordonnés (relation monotone) : la corrélation de Spearman ou Kendall ; - Corrélation entre un prédicteur quantitatif et un facteur non ordonné (variance expliquée) : le rapport de corrélation qui mesure le rapport entre la variance intergroupes et la variance totale ; - Corrélation entre deux facteurs non ordonnés (mesure de l’indépendance) : le coefficient de Tchuprov (fonction tchuprov.coef52), la p-value du test de khi2 du tableau de contingence… 52 # # Calcul du coefficient de Tchuprov (relation entre deux facteurs) # # groupe.1 et groupe.2 sont les colonnes du data.frame associées aux facteurs testés # Les deux vecteurs ont la meme longueur, i.e., le nombre de sujets dans l'analyse tchuprov.coef <- function( groupe.1, groupe.2) { tab.gr <- table( groupe.1, groupe.2) tab.ind <- colSums( tab.gr) %o% rowSums( tab.gr) / length( groupe.1) khi <- sum( (tab.gr - tab.ind)^2 / tab.ind) return( khi / (length( groupe.1) * sqrt( (nrow( tab.gr) - 1) * (ncol( tab.gr) - 1)))) } 89 Il faut cependant utiliser ces indices avec prudence quand il y a plus de deux régresseurs puisque ces indices intègrent les relations directes entre les deux régresseurs ainsi que les relations indirectes, c’est-à-dire celles dues aux autres régresseurs (cf. le problème de l’interprétation de la corrélation de Pearson). 90