Analyse de la variance et régression Rappel du cours Les ANOVA (ou analyses de la variance) généralisent le test t de Student aux cas où il y a plus de moyennes à comparer (au lieu de 2 dans le t-test). Dans ce cas là, il n est pas légitime d effectuer plusieurs tests t (par exemple pour 3 moyennes A, B et C, comparer la moyenne A à la moyenne B, puis la B à la C et la A à la C) car les comparaisons ne sont plus indépendantes entre elle (A vs B n est pas indépendant de A vs C, car A est impliqué dans les deux comparaisons). Lorsqu on effectue plusieurs comparaisons non indépendantes, l erreur de type I augmente (la probabilité de rejeter H0 à tort, c est à dire le risque α, est en réalité plus importante que le 5% que l on fixe ordinairement). L ANOVA permet de contourner ce problème en faisant un test global. En situation non paramétrique (c est à dire sur des données ordinales, ou bien sur des données quantitatives absolument pas gaussiennes et non transformables)par exemple en remplaçant x par log(x), il existe un équivalent à l ANOVA : le test de Kruskal-Wallis que nous avons déjà utilisé dans le TD précédent pour la comparaison de 2 moyennes en situation non paramétriques, mais aussi utilisable pour plus de 2 moyennes. Tout comme le test de Student, l ANOVA suppose la normalité de vos échantillons (testée avec la fonction shapiro.test(...)) et avec qqnorm et qqline. En théorie, il faut également que les variances soient égales. On a déjà comparer les variances avec le test f de fisher. On peut aussi utiliser le test de bartlett pour des comparaison multiples de variances (bartlett.test), même si en pratique il existe des variantes du test qui acceptent des variances inégales (au moins pour les ANOVA à un facteur). ANOVA à un facteur Reprenons l'exemple évoqué pendant le cours (cf tableau ci dessous). On étudie 5 milieu de culture de A à E pour favoriser le développement de culture de bactéries. On possède 10 tubes pour chacun des milieux et on compte le nombre de colonies. Quel est le milieu le plus favorable au développement des bactéries? Le tableau ci dessous expose les données issues d'un tableur : A B C D E 10 11 7 12 7 12 18 14 9 6 8 12 10 11 10 10 15 11 10 7 6 13 9 7 7 13 8 10 8 5 9 15 9 13 6 10 16 11 14 7 8 9 7 10 9 9 13 9 11 6 Avant de commencer, veuillez noter que les données sont organisées par variable dans R : ce n est pas intuitif (vous ne noteriez pas vos données comme ça sous Excel) mais les logiciels de statistique
fonctionnent de cette façon. Ainsi, le jeux de données culture contient 2 colonnes, une première colonie qui contient le nombre de colonies par tube et une colonne milieu qui indique le milieu de culture. On a déjà exécuter le chargement d'un fichier externe en indiquant le chemin du document. On peut procéder aussi ainsi : getwd() donne le répertoire courant dans le menu de R, on peut utiliser la commande File /Change Dir et renommer le répertoire courant ou se trouve le fichier culture.csv puis > culture <- read.table("culture.csv", sep=";",header=t) On va d'abord visualiser ces données : > str(culture) > plot(culture$milieu, culture$colonies) Vous noterez que R a reconnu que les données de l abscisse sont du type facteur et dessine des boîtes à moustaches. Nous sommes bien dans une situation d ANOVA à 1 facteur. Tout d abord, il vous faut vérifier les hypothèses de base, c est à dire la normalité et l égalité des variances. Les commandes sont (par exemple) : > attach(culture) > shapiro.test(colonies[1:10]) > shapiro.test(colonies[11:20]) > shapiro.test(colonies[21:30]) > shapiro.test(colonies[31:40]) > shapiro.test(colonies[41:50]) data: Colonies[41:50] W = 0.8789, p-value = 0.1268 La p -value est >> 0.05 : il n'y a pas d'écart significatif à la normalité R> bartlett.test(list(colonies[1:10], Colonies[11:20], Colonies[21:30], Colonies[31:40],Colonies[41:50])) Bartlett test for homogeneity of variances data: list(colonies[1:10], Colonies[11:20], Colonies[21:30], Colonies[31:40], Colonies[41:50]) Bartlett's K-squared = 4.9585, df = 4, p-value = 0.2916 Même résultat, la p -value est >> 0.05 : il n'y a pas d'écart significatif entre les variances. L inconvénient de la notation par variable sous R est qu il faut lui dire que le premier groupe de milieu A va des valeurs 1 à 10, puis que le deuxième va de 11à 20, etc...mais la commande split simplifie la vie. Le test de Bartlett devient, par exemple, > bartlett.test(split(colonies,milieu))
Bartlett test for homogeneity of variances data: split(colonies, Milieu) Bartlett's K-squared = 4.9585, df = 4, p-value = 0.2916 Les conditions étant remplies, on peut donc utiliser l'anova pour ces data et passer notre ANOVA à l aide de la commande suivante : > resultat<-aov(colonies~milieu) Le sigle aov est l abréviation de analysis of variance. Les ANOVA travaillent avec des formules. Ici, la formule dit que l on veut comparer les valeurs de colonies lorsqu elles sont groupées par Milieu. Le résultat de aov n est pas terrible, comme vous pouvez le constater en l affichant : > resultat Call: aov(formula = Colonies ~ Milieu) Terms: Milieu Residuals Sum of Squares 185.72 225.10 Deg. of Freedom 4 45 Residual standard error: 2.236565 Estimated effects may be unbalanced En fait, pour que R donne le résultat de l ANOVA qui est stocké dans resultat, il faut le lui demander à l aide de la fonction summary : > summary(resultat) Df Sum Sq Mean Sq F value Pr(>F) Milieu 4 185.720 46.430 9.2819 1.477e-05 *** Residuals 45 225.100 5.002 --- Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 On retrouve ici le tableau d'analyse de variance Origine de la variance Degré de liberté (df) Somme des carrés des écarts Valeur de F de fisher P value associé Entre colonnes (entre milieu de culture) 4 (k colonnes 1) 185.7 46.43 9.2819 1.477 e-05 Intra colonne ou résiduelle 45 (N observations k) Total 49 225 5 La p value étant plus inférieure à la valeur 0.05, les moyennes entre les 4 milieux de culture sont très différents en moyenne au risque 1.477 e-05 d observer ce résultat d expérience au hasard. Pour connaître parmi ces 5 milieux, lesquels sont les plus propices au développement des bactéries,
il faut maintenant les comparer 2 à 2. La multiplication de tests t de Student au risque alpha de 5 %, (il faut faire ici 10 tests successifs) accroît beaucoup le risque de trouver une différence au hasard entre 2 milieux (le risque alpha augmente). On utilise donc des tests de comparaison de moyenne qui prennent en compte cette dérive. R sait faire le test «honestly significant difference» de Tukey en donnant l intervalle de confiance, ce qui est suffisant pour conclure (si l IC n inclut pas 0, la différence est significative). La syntaxe est la suivante :! TukeyHSD(resultat)! Tukey multiple comparisons of means 95% family-wise confidence level Fit: aov(formula = Colonies ~ Milieu) $Milieu diff lwr upr B-A 3.5 0.6579187 6.3420813 C-A 0.2-2.6420813 3.0420813 D-A 1.0-1.8420813 3.8420813 E-A -2.5-5.3420813 0.3420813 C-B -3.3-6.1420813-0.4579187 D-B -2.5-5.3420813 0.3420813 E-B -6.0-8.8420813-3.1579187 D-C 0.8-2.0420813 3.6420813 E-C -2.7-5.5420813 0.1420813 E-D -3.5-6.3420813-0.6579187 Vous pouvez directement visualisez le résultat du test de Tukey en le donnant à la fonction plot R> plot(tukeyhsd(resultat)) detach(culture) permet de détacher le fichier par défaut Comprenez bien ces résultats? Que concluez vous
Corrélation Le coefficient de corrélation de Pearson (sans unité, entre -1 et 1), permet de rechercher une liaison entre un paramètre Y et X, de mesurer l intensité de cette liaison et d associer un niveau de significativité. Si p < 0.05, il est possible de tracer la droite qui lie y et x selon une régression linéaire. Les données Y et X doivent être distribués normalement, de même variance et les résidus constants. Sinon, on peut utiliser un test non paramétrique, le test des rangs de Spearman. Régression linéaire Modèle (et ses hypothèses) On dispose de deux variables X et Y, et on essaye de prédire les valeurs de Y à partir de celles de X. Pour cela, on suppose que Y s'obtient à partir de X de la manière suivante : Y = a + b * X + bruit où a et b sont des réels (à déterminer) et le bruit suit une distribution gaussienne de moyenne nulle. On mesure la concentration d un médicament dans le sang (X) et dans le cerveau (Y). Les concentrations sont elles corrélées? Tracez la droite de régression si nécessaire. X Y 49 59 30 25 62 50 84 71 28 20 60 69 76 60 16 14 54 75 55 59 96 97 87 50 32 35 40 30 71 43 52 34 80 78 94 71 39 45 37 50
> medic <- read.table("medic.csv", sep=';',header=t) > shapiro.test(medic$x) data: medic$x W = 0.9621, p-value = 0.5865 > shapiro.test(medic$y) data: medic$y W = 0.982, p-value = 0.9573 > qqnorm(medic$x);qqline(medic$x) > qqnorm(medic$y);qqline(medic$y) > cor.test(medic$x,medic$y) Pearson's product-moment correlation data: medic$x and medic$y t = 5.5642, df = 18, p-value = 2.785e-05 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: 0.5441810 0.9155498 sample estimates: cor 0.7952069 Le coefficient de corrélation est 0.79 avec p très faible : les 2 variables sont liés avec une intensité de liaison élevée On peut donc tracer la droite de régression. Créons une fonction dans R > courber <- function (x, y) { + plot(x,y, main=paste("cor =", round(cor(x,y), digits=2))) + abline(lm(y~x), col='red', lwd=3) + }! courber(medic$x, medic$y)!
TD/TP N 5 Dans un service de cancérologie où beaucoup de patients sont en souffrance physique et morale, on décide de mesurer la satisfaction des patients à la fin du séjour par une enquête avec un auto questionnaire. Un score de réponse global de 10 (minimum de satisfaction) à 50 (maximum de satisfaction) est calculé pour chaque patient. L enquête porte sur 90 patients différents. 1/ On se demande si l age intervient dans la réponse au questionnaire de satisfaction. Les patients sont répartis en 3 classes d âge : 20-45, 46-65, plus de 65. Faites une ANOVA pour rechercher s il existe une différence significative selon la classe d âge et laquelle? Les données figurent dans le fichier csv (satisfaction_a) 2/ On possède aussi l age de chaque patient et on peut aussi corréler les données entre age et le score de satisfaction. Etudier la liaison entre les variables. Les données figurent dans le fichier csv (satisfaction_c) Score patient par groupe d age qui sont nommées A, B, C dans le fichier. Patients 20a-45a 46a-65a plus de 65a 1 21 30 22 2 39 26 23 3 34 20 28 4 27 27 25 5 28 23 23 6 25 15 25 7 21 24 21 8 35 39 28 9 28 23 26 10 33 28 36 11 31 18 14 12 36 30 31 13 31 27 29 14 33 31 27 15 33 28 15 16 15 21 12 17 29 23 24 18 35 25 25 19 25 35 24 20 32 28 33 21 33 29 29 22 36 27 27 23 10 15 28 24 40 26 35 25 33 23 20 26 33 30 28 27 21 37 22 28 29 20 24 29 28 28 26 30 30 24 15
> satis_a <- read.table("satisfaction_a.csv", sep=';',header=t) > str(satis_a) `data.frame': 90 obs. of 2 variables: $ Score : int 21 39 34 27 28 25 21 35 28 33... $ GroupeAge: Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1...! plot(satis_a$groupeage,satis_a$score) > shapiro.test(satis_a$score[1:30]);shapiro.test(satis_a$score[31:60]);shapiro.test(satis_a$score[61 :90]) data: satis_a$score[1:30] W = 0.9206, p-value = 0.02775 (on dit que le test est robuste. ) data: satis_a$score[31:60] W = 0.9727, p-value = 0.614 data: satis_a$score[61:90] W = 0.9594, p-value = 0.2983 > resultat<-aov(satis_a$score~satis_a$groupeage) > resultat Call: aov(formula = satis_a$score ~ satis_a$groupeage) Terms: satis_a$groupeage Residuals Sum of Squares 348.467 3189.633 Deg. of Freedom 2 87 Residual standard error: 6.054953 Estimated effects may be unbalanced > summary(resultat) Df Sum Sq Mean Sq F value Pr(>F) satis_a$groupeage 2 348.5 174.2 4.7524 0.01100 * Residuals 87 3189.6 36.7 --- Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 > TukeyHSD(resultat) Tukey multiple comparisons of means 95% family-wise confidence level Fit: aov(formula = satis_a$score ~ satis_a$groupeage) $"satis_a$groupeage" diff lwr upr B-A -3.466667-7.194519 0.2611860
C-A -4.633333-8.361186-0.9054807 C-B -1.166667-4.894519 2.5611860 2/ > satis_c <- read.table("satisfaction_c.csv", sep=';',header=t) > str(satis_c) `data.frame': 90 obs. of 2 variables: $ AGE : int 21 44 30 20 32 34 36 43 40 42... $ SCORE: int 21 39 34 27 28 25 21 35 28 33... > attach(satis_c) > plot(score, AGE) > shapiro.test(score) data: SCORE W = 0.9815, p-value = 0.2277 > shapiro.test(age) data: AGE W = 0.945, p-value = 0.0008286 On ne peut pas utiliser le test de corrélation de pearson, car l age n est pas distribué normalement On utilise le teste des rangs de spearman > cor.test(rank(score), rank(age)) Pearson's product-moment correlation data: rank(score) and rank(age) t = -3.6659, df = 88, p-value = 0.000421 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: -0.5310444-0.1696810 sample estimates: cor -0.363982