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