Régression linéaire avec R
Transcription
Régression linéaire avec R
Régression linéaire avec R avec l’utilisation de ggplot2 N ICOLAS J UNG disp 500 70 10 2 5 mpg 30 21 janvier 2015 1 wt 2 Table des matières 1 Introduction 1.1 À propos du package ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Analyse liminaire du jeu de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Régression linéaire simple 2.1 Écriture du modèle . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Estimation des cœfficients . . . . . . . . . . . . . . . . . . . . . 2.3 Hypothèses relatives au modèle linéaire simple . . . . . . . . . . 2.3.1 Vérification de la condition de linéarité . . . . . . . . . . 2.3.2 Les variables sont mesurées sans erreur . . . . . . . . . . 2.3.3 Tester les hypothèses implicites . . . . . . . . . . . . . . 2.4 Ajustement de la droite de régression et tests . . . . . . . . . . . . 2.5 Prédiction en régression linéaire . . . . . . . . . . . . . . . . . . 2.6 Diagnostics de la régression linéaire . . . . . . . . . . . . . . . . 2.6.1 Graphiques permettant de valider la normalité des résidus 2.6.2 Graphe des résidus studentisés . . . . . . . . . . . . . . . 2.6.3 Leviers . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6.4 Distance de Cook . . . . . . . . . . . . . . . . . . . . . . 2.6.5 Diagnostic final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 14 15 15 22 22 24 27 27 27 28 30 30 33 La régression linéaire multiple 3.1 Hypothèses relatives au modèle linéaire multiple . . . . . . . . . 3.1.1 L’hypothèse de relation linéaire . . . . . . . . . . . . . . 3.1.2 L’hypothèse de non corrélation des variables explicatives . 3.1.3 Vérification des autres hypothèses . . . . . . . . . . . . . 3.2 Estimation des cœfficients . . . . . . . . . . . . . . . . . . . . . 3.3 Test dans la régression linéaire multiple . . . . . . . . . . . . . . 3.3.1 Les tests t pour chaque paramètre . . . . . . . . . . . . . 3.3.2 La fonction anova appliquée à un objet de type lm . . . 3.4 Utilisation de la fonction anova sans utiliser de deuxième modèle 3.5 Intervalles de confiance . . . . . . . . . . . . . . . . . . . . . . . 3.6 Valeurs ajustées . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7 Prédiction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8 Diagnostics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.1 Diagnostic de colinéarité . . . . . . . . . . . . . . . . . . 3.8.2 Tableau récapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 36 36 37 39 39 40 40 41 43 44 44 45 46 46 46 Sélection de modèle 4.1 Les critères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Procédure de sélection de modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Recherche exhaustive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 49 50 50 3 4 3 5 5 9 4.3 5 Procédure forward, backward et stepwise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Quand les hypothèses ne sont pas respectées... 5.1 Quand la variable explicative est mesurée avec une erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 55 4 Chapitre 1 Introduction L’objectif de ce cours est de permettre à des utilisateurs non familiers des formules mathématiques et autres théorèmes d’utiliser le logiciel R dans le cadre de la régression linéaire. La réalisation d’une régression linéaire est d’apparence très simple, puisqu’elle ne nécessite que la commande lm pour la réaliser et la commande summary pour visualiser les résultats. Néanmoins, cette simplicité ne résiste pas à une analyse rigoureuse. Comme nous allons le voir, la régression linéaire nécessite la validité de plusieurs hypothèses sans lesquelles toute interprétation que nous pourrions faire à partir des résultats serait erronée. Vous trouverez dans ce cours plusieurs exemples didactiques qui vous permettront d’affiner votre compréhension et votre intuition. Aussi, nous avons privilégié l’étude de la régression linéaire à travers un exemple, lequel pourra être pris en modèle pour vos analyses futures. Par ailleurs, vous trouverez à la fin une courte bibliographie dans laquelle vous trouverez des informations supplémentaires. Dans le cadre de ce cours, nous allons utiliser plusieurs fonctions qui appartiennent à des librairies (ou encore packages) qui ne sont pas initialement installés dans R. Nous rappelons que l’installation d’un package se fait par la commande : install.packages("nom du package") (ne pas oublier les guillemets dans cette commande !). Une fois le package installé, il faudra le charger dans la mémoire de R, ce qui se fait par la commande library ou require. Si cette dernière retourne une erreur stipulant : “Erreur dans require(“nom”) : aucun package nommé ‘nom’ n’est trouvé” c’est que le package en question n’est pas encore installé. Afin de vous aider, nous mettons à votre disposition, en annexe, l’ensemble des librairies qui ne sont pas installées de base. De plus, nous vous proposons avant l’utilisation de ce cours d’utiliser la commande suivante, qui va installer et charger tous les packages nécessaires : source("http://www-irma.u-strasbg.fr/˜njung/Packages.R") Dans ce cours, vous trouverez le code pour tous les résultats et tous les graphiques présentés. Chacune des lignes de code est reproductible. Notez cependant que la fonction xtable permet simplement d’avoir un meilleur rendu en Latex (logiciel avec lequel est construit ce document) et doit être ignorée. Par ailleurs, ce cours ne prétend pas fournir une initiation à l’utilisation du logiciel R, et nous proposons au lecteur la lecture des premiers chapitres du livre de Frédéric Bertrand et Myriam Maumy-Bertrand [1]. 1.1 À propos du package ggplot2 Le package ggplot2 est le package qui va nous servir à faire les graphiques pour ce cours. Les graphiques issus de ce package ont un meilleur rendu : meilleure gestion de l’espace, des couleurs, légende insérée automatiquement... De plus, il est possible d’ajouter une grande variété d’informations sur le graphique, comme des courbes lissées, des boı̂tes à moustaches... La seule difficulté dans l’utilisation de ce package réside dans la syntaxe, légèrement différente que pour les 5 fonctions graphiques de bases ; cependant, nous n’utiliserons pas ici toutes les possibilités offertes par ce package, et nous nous contenterons, dans la plupart des cas, d’utiliser la fonction qplot qui fonctionne essentiellement comme la fonction basique plot. Pour cette fonctions, deux options sont nécessaires : la variable pour l’abscisse, et la variable pour l’ordonnée. Attention : impossible de fournir à cette fonction une matrice avec deux colonnes ! Il est fortement recommandé d’avoir toutes les variables utiles dans un data.frame, en utilisant ensuite l’option data dans la fonction qplot. Regardons ce que nous pouvons faire grâce à ce package sur un jeu de données bien connu : le jeu de données iris. Commençons par tracer longueur des petales en fonction de leur largueur. data(iris) #petit aperçu head(iris) ## ## ## ## ## ## ## 1 2 3 4 5 6 Sepal.Length Sepal.Width Petal.Length Petal.Width Species 5.1 3.5 1.4 0.2 setosa 4.9 3.0 1.4 0.2 setosa 4.7 3.2 1.3 0.2 setosa 4.6 3.1 1.5 0.2 setosa 5.0 3.6 1.4 0.2 setosa 5.4 3.9 1.7 0.4 setosa require(ggplot2) #la fonction plot basique plot(iris$Petal.Length,iris$Petal.Width) #la fonction qplot de ggplot2 qplot(Petal.Length,Petal.Width,data=iris) Si nous voulions colorer chaque point en fonction de son espèce avec la fonction basique plot, il faudrait créer un vecteur comprenant les couleurs de chaque point. Avec qplot, cela se fait de manière naturelle : qplot(Petal.Length,Petal.Width,data=iris,colour=Species) De plus, vous remarquerez qu’une légende est apparue automatiquement. Mieux encore : qplot(Petal.Length,Petal.Width,data=iris,colour=Species,size=Sepal.Length+Sepal.Width) Vous remarquerez que la taille des points est fonction de la longueur plus la largueur du sépale ; une nouvelle légende est apparue automatiquement. Sans efforts supplémentaires, nous pouvons maintenant ajouter sur le graphique des droites de régression (ce que nous allons voir en détails dans la suite) : qplot(Petal.Length,Petal.Width,data=iris,colour=Species,size=Sepal.Length+Sepal.Width)+geom Nous terminerons par l’exemple suivant : qplot(Species,Petal.Width,data=iris,geom=c("boxplot", "jitter")) Un argument utile de cette fonction est geom qui permet de choisir la manière dont les données sont traitées : point permet d’avoir des points, line permet de tracer la ligne entre les points, smooth permet de rajouter une courbe lissée. 6 2.5 ● 2.5 ● ● ● ●● ● ● ● ● ● ● 2.0 ●●●● ● ●● ● ● ● ● ●● ● ● ● ● ● ● ● 1.5 ● ● ● ●● 1.0 ● ● ●● ● ● ● ●●● ●●● ●●● ● ● ●●●●●●● ● ●● ● ● ● ● ● ● ●● ●●●●● ●● ● ● ● ● ● Petal.Width 1.5 ● ●● ● ●● ● ● ● ● ● ● ●●● ●●● ● ●●● ● ● ●●●● ● ● ● ● ● 1.0 iris$Petal.Width 2.0 ● ● ● ●● ●● ● ● ● ● ●●●● ● ●●●● ● ● ● ● ● ●●●● ●● ● ●●●● ● ● ● ●● ● ● ● ●● 0.5 ● ● ● ● ●●● ● 0.5 ● ●●● ● ● ●●● ● ● ●● ● ● ●● ●● ●● ●● ● ● ●●● ●● ● 1 2 3 4 5 6 ● 7 ● ●●●●●● ● ●● 0.0 2 iris$Petal.Length 4 6 Petal.Length (a) Utilisation de la fonction plot (b) Utilisation de la fonction qplot F IGURE 1.1 – Différences entre plot et qplot Une fois le graphique initial établi, il est possible de rajouter un grand nombre d’éléments sur le graphique. La syntaxe est la suivante qplot(...) + element1(...) + element2(...) + .... Dans les éléments, qui sont chacun des fonctions, nous avons (principalement) : – xlab et ylab : titre des axes – geom fonc avec fonc pouvant être line pour rajouter une ligne, point pour rajouter un point, text pour rajouter du texte... Nous n’irons pas plus loin dans l’explication de ce package, et pensons qu’avec ces notions de base, ainsi que la lecture du document, le lecteur sera à même de produire, en s’inspirant de ce qui a été fait ici, ses propres graphiques. 7 2.5 ● ● ● ● ● ● ●● ● ● ● ●● ● ● ●● ● ● ● ●●● ●●● Species ● ● setosa ● versicolor ● virginica ●●●●●●● ●● ● ● ● ● ●●● ● ●●●● 1.5 ● ● ● ● ● setosa ● versicolor ● virginica ● Sepal.Length + Sepal.Width ● 7 ● 8 ●● ● ● ● ●● ● 1.0 ●● ●● ●●● ●●●●●●● ● ● ●● 1.0 Species ● ●● ● ● ●●● ● ●● ●● ● ● ● ● ● ●● ● ● ● 1.5 ● ●● ●●● ● 2.0 ● ● Petal.Width ● ● ● ●●●●● ● ● ● ● ●● ● ● ●●●● ●● Petal.Width ● ● ●●●● 2.0 ● ●● ● ● ●●●● ●●● 2.5 ●● ● ●●●● ● ● ● ● ● 9 ●● ● 10 ● 11 ● ● 0.5 ● ●●● ●●● ● ●●● ● ●● ● ●● ● ●● ● ●●●●●● ● ● 0.5 ● ● ●● ●● ●● ● ●● ●● ● ● ●● ● ●● ● 0.0 ●● ● ● 0.0 2 4 6 2 4 Petal.Length 6 Petal.Length (a) Couleurs en fonction de l’espèce (b) Taille des points en fonction de la dimensions des sépales F IGURE 1.2 – Ajout d’informations ● ●● ● ● ●●●● ●●● 2.5 ●● ● ●● ● ● ● ● ●● ● ●●● ● ●●●● Petal.Width 1.5 ● ●● ●●● ●● ● ● ● ● ● ● ● ● ● Species ● ● ● ● setosa ● versicolor ● virginica 7 ● 8 ● ● ● ●● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 1.0 ● ● ● ● ● ● ● ● ● ● ● ●● ●● ● ● ● ●● 1.5 ● 9 ●● ● ● ● ● ● Sepal.Length + Sepal.Width ●● ● ● ● 1.0 ● 2.0 ● ●●●●●●● ● ● ● ● ● ●● ● ●● ●● ● ● ● ● ●●●●● ●●● ● ● ● ● ● ● ● ●● ● ●● 2.0 ● ●● ● ● ● Petal.Width 2.5 ●● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ●● ● ● ● ● 10 ● 11 ● ● ● 0.5 ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ●●● ●●●● ● ● ●● ● ● ● ● ●● ● ● ● ● ● ●● ● ●● ● ●● ●● ●● ● ●● ●● ● ● ●● ● ● 0.5 ● ●●● ● ●● ● ● ● 0.0 ● ● ● ● ●● ● ● ● ● 0.0 2 4 6 setosa Petal.Length versicolor virginica Species (a) Droites de régression pour chacun des groupes (b) Autre possibilité : boı̂tes à moustaches F IGURE 1.3 – Autres possibilités. 8 1.2 Analyse liminaire du jeu de données Nous allons travailler sur le jeu de données bodyfat issu du package mboost. Pour ce faire, nous entrons les lignes de commande suivantes : require(xtable) data("bodyfat", package="TH.data") La commande data permet simplement de charger le jeu de données dans la mémoire de R. En réalité, de la même manière que l’ouverture de R n’entraı̂ne pas le chargement de tous les packages disponibles, le chargement d’un package par la commande library n’entraı̂ne pas le chargement de tous les jeux de données contenus dans le package. Face à un nouveau jeu de données, il est utile d’obtenir quelques informations élémentaires telles que : le nombre d’individus N , le nombre de variables P , la nature de chacune des variables... Les fonctions nrow, ncol et summary permettent de répondre à ces questions : N<-nrow(bodyfat) print(N) #Nombre d'individus ## [1] 71 P<-ncol(bodyfat) print(P) #Nombre de variables ## [1] 10 summary(bodyfat) ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## age Min. :19.00 1st Qu.:42.00 Median :56.00 Mean :50.86 3rd Qu.:62.00 Max. :67.00 elbowbreadth Min. :5.200 1st Qu.:6.200 Median :6.500 Mean :6.508 3rd Qu.:6.900 Max. :7.400 anthro3c Min. :2.050 1st Qu.:3.480 Median :3.990 Mean :3.886 3rd Qu.:4.345 Max. :4.620 DEXfat Min. :11.21 1st Qu.:22.32 Median :29.63 Mean :30.78 3rd Qu.:39.33 Max. :62.02 kneebreadth Min. : 7.200 1st Qu.: 8.600 Median : 9.200 Mean : 9.301 3rd Qu.: 9.800 Max. :11.800 anthro4 Min. :3.180 1st Qu.:5.040 Median :5.530 Mean :5.398 3rd Qu.:5.840 Max. :6.370 waistcirc Min. : 65.00 1st Qu.: 78.50 Median : 85.00 Mean : 87.38 3rd Qu.: 99.75 Max. :117.00 anthro3a Min. :2.400 1st Qu.:3.540 Median :3.970 Mean :3.869 3rd Qu.:4.155 Max. :4.680 hipcirc Min. : 88.00 1st Qu.: 96.75 Median :103.00 Mean :105.28 3rd Qu.:111.15 Max. :132.00 anthro3b Min. :2.580 1st Qu.:4.060 Median :4.390 Mean :4.291 3rd Qu.:4.660 Max. :5.010 Dans le cadre de cette introduction aux modèles linéaires avec R, nous ne retiendrons que les 6 premières variables de ce jeu de données : 9 donnees<-bodyfat[,1:6] rownames(donnees)<-paste("ind",1:71) Notons que la sélection d’une sous-sélection de variables dans un data.frame peut aussi se faire en sélectionnant les variables par leur nom. Ainsi, bodyfat[,c("age","DEXfat")] permet de sélectionner les deux premières variables. Afin de visualiser graphiquement le jeu de données, nous utiliserons la fonction ggpairs du package GGally. La figure obtenue (Figure 1.4) représente un diagramme de double projection (biplot graphic, en anglais) pour chaque couple de variable (scatterplot, en anglais). Des informations supplémentaires, comme une estimation de la distribution de chaque variable et une estimation de la distribution bivariée de chaque couple de variables peuvent être ajoutées sur le graphique. Notons que la fonction basique de R, pairs permet d’obtenir un résultat équivalent. require(GGally) ggpairs(donnees, diag=list(continuous="density"), upper=list(continuous="density"), lower=list(continuous="smooth"), axisLabels='show') À ce stade, plusieurs remarques peuvent être formulées : – Le jeu de données contient majoritairement des individus plutôt âgés. En effet, la médiane est de 56 ans (voir résultat de fonction summary) et la distribution des âges est très asymétrique avec un mode aux alentours de 60 ans. – Certaines variables de ce jeu de données semblent présenter une corrélation linéaire très forte (par exemple la variable DEXfat et la variable waistcirc). Dans la prochaine partie, nous allons étudier l’influence du tour de taille (variable waistcirc) sur la mesure de la graisse corporelle (variable DEXfat). Ce choix est naturel au vu de la remarque précédente. 10 60 age 50 40 30 DEXfat 60 50 40 30 20 10 waistcirc 110 100 90 80 70 130 hipcirc 120 110 100 kneebreadth elbowbreadth 90 7.5 7.0 6.5 6.0 5.5 12 11 10 9 8 7 ● ● ● ● ● ● ● ●● ● ● ● ● ●●● ●● ● ● ● ● ● ●● ●●● ● ● ● ● ●● ● ● ● ● ●● ● ●● ●● ● ●●● ● ● ● ●●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ●● ● ●●● ● ● ● ● ● ● ●● ●● ●● ●● ● ● ● ● ● ● ● ● ●●● ●● ●● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ●● ● ● ●● ● ● ●●● ● ●● ● ● ●● ● ● ● ● ●● ●● ● ●● ● ● ● ●●● ● ● ● ● ● ● ● ● ●● ● ●● ● ● ● ● ● ●●● ● ● ● ● ● ●● ●●●● ● ●● ●● ● ● ● ● ● ● ● ●● ● ● ●● ● ●●● ● ● ●● ●● ●● ● ● ● ● ● ● ●● ●●● ● ● ●● ● ● ●●● ● ● ● ● ●● ● ● ● ● ●● ● ● ● ● ● ● ●●● ● ●●● ●● ●●● ● ● ●● ●●● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●● ●● ● ● ●● ●● ●● ●● ● ● ●● ● ● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ●● ● ● ●● ● ●● ●● ● ●● ● ● ●●● ● ● ●● ●● ●● ● ● ●●● ●● ●● ● ● ● ● ●●●● ● ● ● ● ● ●● ● ● ● ●● ● ●● ● ● ●● ● ●● ● ● ● ●●● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●● ● ● ● ● ● ●● ●● ● ● ● ●● ● ● ● ●●● ● ● ● ● ● ●● ●● ● ● ● ● ●●● ● ●● ●●● ● ● ●● ● ● ● ●● ● ●● ● ● ● ●● ● ●● ● ●● ● ● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ●● ● ● ●● ● ●● ● ●● ● ● ● ●●● ● ● ● ● ● ● ●● ●● ●●● ● ● ● ●● ● ● ● ● ● ● ●● ●● ● ● ●● ●● ●● ●● ●● ● ●● ● ● ● ● ●● ● ● ●●● ● ●●● ● ● ● ● ● ●● ● ●● ● ● ● ●● ● ● ● ● ●● ● ●● ● ●● ● ●● ●● ● ●●● ●●● ● ● ● ● ●● ●● ● ● ●● ● ● ●● ●●●● ● ●●●●● ●● ● ● ● ● ● ●● ●● ● ● ●● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ●●● ● ●● ●●● ●● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ●● ● ●● ● ●● ● ●● ● ●● ● ● ● ●● ●● ● ● ● ● ● ●● ● ● ●●● ●●● ● ●● ● ● ●● ● ● ●● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ●● ●●● ● ● ●● ● ● ●● ●● ●● ● ● ● ● ●●●● ● ● ● ●● ● ● ●● ● ● ●●● ● ●● ●●●● ●●● ● ● ● ● ●● ● ● ● ● ●● ● ●●● ● ●● ●● ●● ●●●● ●● ●● ● ●●● ●●●● ● ●● ● ●● ● ● ● ●●● ●● ●●●● ●● ● ● ● ●● ●● ● ● ● 20 30 age 40 50 60 10 20DEXfat 30 40 50 60 70waistcirc 80 90100110 90 100110120130 5.5 6.0 6.5 7.0 7.5 7kneebreadth 8 9 10 11 12 hipcirc elbowbreadth F IGURE 1.4 – Présentation graphique du jeu de données (scatterplot) 11 12 Chapitre 2 Régression linéaire simple Le but de la régression linéaire simple permet d’étudier est de trouver la meilleure relation affine entre deux variables. Les deux variables ne jouent pas ici un rôle symétrique. Nous avons d’une part la variable explicative, qui peut également être appelée variable exogène, et d’autre part une variable à expliquer, ou encore variable réponse ou variable endogène. La régression linéaire se donne alors pour but d’expliquer les variations de la variable réponse par les variations de la variable explicative. Une fois la meilleure relation affine trouvée, il sera possible de tester l’importance du lien entre les deux variables, et de prédire une valeur plausible de la variable réponse en fonction d’une nouvelle observation de la variable explicative. Nous verrons également que la régression linéaire simple est assujettie à des hypothèses qu’il s’agira de vérifier et de valider. 2.1 Écriture du modèle Tout d’abord, formalisons notre problème dans un cadre statistique. Nous définissons les variables suivantes : – soit y = (y1 , ..., yN )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable DEXfat pour chacun des individus : c’est la variable réponse, également nommée variable endogène ou variable à expliquer, – soit xwaist = (xwaist,1 , ..., xwaist,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable waistcirc pour chacun des individus : c’est la variable explicative ou variable exogène, – soient β0 et βwaist deux paramètres réels inconnus. Dans l’idéal, nous voudrions trouver une relation strictement affine de la forme : y = β0 + βwaist xwaist . (2.1) Si la relation décrite par l’équation (2.1) était vérifiée, elle impliquerait que le diagramme de double projection entre les variables réponse et explicative consiste en une droite parfaite. La relation entre les deux variables serait alors entièrement déterministe, et la connaissance de la valeur de la variable explicative permettrait de connaı̂tre avec exactitude la valeur de la valeur réponse. Si ce genre de relation déterministe existe (il suffit de penser au lien entre le périmètre d’un cercle et son rayon), la grande majorité des phénomènes observés contiennent une part stochastique. Nous représentons ces deux variables sur un tel graphique (Figure 2.1). require(ggplot2) qplot(donnees$waistcirc,donnees$DEXfat, xlab="Tour de taille", ylab="Mesure de graisse corporelle", geom = c("point", "smooth","line"), method="loess") 13 ● ● 60 ● Mesure de graisse corporelle ● ● ● ● ●● ●● 40 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● 20 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 70 80 90 100 110 Tour de taille F IGURE 2.1 – Mesure de masse corporelle en fonction du tour de taille Notez que la fonction qplot permet de rajouter sur le graphique des informations supplémentaires comme une courbe lissée. Nous constatons que les points semblent s’allonger grossièrement autour d’une droite. En revanche, il n’existe aucune droite (ou, autrement dit, aucun couple (β0 , βwaist )) telle que tous les points appartiennent à cette droite. Le modèle proposé dans l’équation (2.1) n’est donc pas le bon. Pour corriger le modèle précédent, nous allons être obligés de considérer que les données que nous observons contiennent un bruit, une erreur d’ajustement. Notons donc ε = (ε1 , ..., εN )0 le vecteur de longueur N = 71 qui contient les erreurs aléatoires de moyenne nulle (ou écarts à la droite de régression), et posons le modèle classique de régression linéaire à une variable : y = β0 + βwaist xwaist + ε. 2.2 (2.2) Estimation des cœfficients Il faut distinguer deux étapes dans la réalisation d’une régression linéaire ; la première étape consiste à estimer les cœfficients du modèle 2.2 tandis que la seconde étape consiste à effectueur des tests sur ces cœfficients. L’estimation des paramètres peut se faire sans aucune hypothèse statistique ; c’est un procédé purement algébrique. Pour cela nous devons définir une fonction d’erreur, notée erreur ici, qui va permettre de déterminer la qualité de l’adéquation des données à la droite de régression. Ensuite, il suffit de choisir les paramètres qui permettent de minimiser cette fonction. Dans notre cas, nous chercherons à minimiser : erreur(β0 , βwaist ) = N X (yn − β0 − βwaist xwaist,n )2 . n=1 Autrement dit, cette fonction correspond la somme des erreurs au carré de la distance entre les données et leurs projections orthogonales sur la droite de régression. Pourquoi utiliser la somme des erreurs au carré plutôt que la somme des valeurs absolues des erreurs ? Pour des raisons essentiellement calculatoires et pour des propriétés intéressantes sur les lois des estimateurs. Notez cependant qu’il existe une version de la régresion linéaire avec la fonction valeur absolue intervenant dans la fonction erreur : il s’agit de la régression robuste. Nous ne détaillons pas ici les calculs des paramètres. 14 2.3 Hypothèses relatives au modèle linéaire simple Plusieurs hypothèses sont nécessaires afin d’obtenir de bonnes propriétés des estimateurs (β̂0 , β̂1 ) des paramètres du modèle (estimateurs des paramètres sans biais et de variance minimale, par exemple). Nous distinguons deux types d’hypothèses : celles que nous appellerons explicites portent sur les termes d’erreur, et celles que nous appellerons implicites sont directement liées à l’équation du modèle (équation (2.2)). Les hypothèses explicites, c’est-à-dire celles qui portent sur les termes d’erreur εi , sont au nombre de trois : – Ils sont de variance constante, notée σ 2 , c’est l’hypothèse d’homoscédasticité : en particulier, les erreurs ne sont pas dépendantes de la variable exogène xwaist . – Ils suivent une loi normale de moyenne nulle et de variance σ 2 . – Ils sont indépendants. À ces hypothèses sur le terme d’erreur, nous devons ajouter deux hypothèses supplémentaires, qui sont implicites au modèle : – La relation entre la variable exogène xwaist et la variable endogène y est linéaire. En particulier, il faudra se méfier des relations non-linéaires (relation quadratique, exponentielle ou logarithmique par exemple) et des ruptures de pentes. Nous préciserons ce dernier point dans le paragraphe concerné. – La variable exogène xwaist est mesurée sans erreur. En effet, le modèle décrit dans l’équation (2.2) suppose que la variable xwaist est fixe. Dans la conception originelle du modèle linéaire, la variable y est également supposée être mesurée sans erreur car le terme aléatoire ne représente que le défaut d’ajustement. La première étape de notre travail consiste maintenant à tester ces hypothèses. 2.3.1 Vérification de la condition de linéarité Nous présentons trois façons de tester la linéarité de la relation entre les deux variables. Le test de corrélation linéaire La première chose à faire ici est de tracer la variable réponse en fonction de la variable explicative, si cela n’a pas encore été fait (Figure 2.1). La corrélation linéaire peut être calculée grâce à la fonction cor : cor(donnees$waistcirc,donnees$DEXfat) ## [1] 0.8986535 Nous rappelons que la corrélation linéaire varie entre -1 et 1. Lorsque la corrélation vaut 1, elle indique une corrélation positive parfaite entre les données ; les données sont alors parfaitement alignées le long d’une droite dont le cœfficient directeur est positif. Lorsqu’elle vaut -1, elle indique une corrélation négative parfaite entre les données ; ces dernières sont alors parfaitement alignées le long d’une droite dont le cœfficient directeur est négatif. Attention : si les variables dont nous calculons la corrélation sont indépendantes les unes par rapport aux autres, alors le cœfficient de corrélation linéaire vaudra 0. En revanche, la réciproque n’est pas vraie. Regardons l’exemple suivant : #cette commande vous permettra d'obtenir exactement les mêmes résultats set.seed(1) exemple<-rnorm(1000,0,1) cor(exemple,exempleˆ2) ## [1] -0.02948134 15 La corrélation quadratique entre le vecteur exemple et son carré est parfaite ; cependant, la corrélation linéaire entre les deux vecteurs est proche de zéro. Dans la Figure 2.2, nous avons représenté le vecteur exemple2 en fonction du vecteur exemple et nous avons ajouté la droite de régression linéaire : qplot(exemple,exempleˆ2, xlab="exemple", ylab="exempleˆ2", geom=("point"))+ geom_smooth(method='lm') L’hypothèse de linéarité est essentielle, et le défaut de linéarité peut conduire à une interprétation erronée des résultats obtenus. Il est possible de tester si la corrélation observée est significativement différente de 0 ou non. Plus précisément, voici les hypothèses du test : H0 : la corrélation linéaire entre les deux variables est nulle contre H1 : la corrélation linéaire entre les deux variables est différente de zéro. Ce test repose sur la bi-normalité des données. Attention : la bi-normalité est une condition plus forte que la normalité de la première variable combinée à la normalité de la deuxième variable. Pour tester la bi-normalité, nous allons faire appel à la fonction mshapiro.test du package mvnormtest qui effectue le test de Shapiro-Wilk multidimensionnel. Comme pour le test unidimensionnel, l’hypothèse nulle de ce test est la multinormalité des données tandis que l’hypothèse alternative est la non-multinormalité : H0 : Le couple de vecteurs suit une loi binormale contre H1 : Le couple de vecteurs ne suit pas une loi binormale Avec R, nous pouvons donc effectuer ce test de la manière suivante : #Si le package n'est pas encore installé #install.packages("mvnormtest") require(mvnormtest) mshapiro.test(rbind(donnees$waistcirc,donnees$DEXfat)) ## ## Shapiro-Wilk normality test ## ## data: Z ## W = 0.9527, p-value = 0.009369 La p-valeur étant inférieure au seuil α = 0.05, nous rejetons l’hypothèse nulle et acceptons l’hypothèse alternative de non bi-normalité. En conséquence, nous ne pouvons pas faire le test sur le cœfficient de corrélation. Si la p-valeur avait été supérieure au seuil α = 0.05 nous aurions pu analyser la p-valeur retournée par la fonction cor.test de R, qui permet de 16 15 ● ● 6 10 ● ● ● ● exemple^2 ● ● ● y 4 ● ● ● ● ● 5 0 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ●● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● −2 0 2 ● ● ●● ● ● 2 ●● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ● ●● 0 4 ●● ●● ● ● ●● ● ● ●● ● ● ● ● ● ● ●● ● ● ● ● ● ● 0 exemple ● 2 4 6 x F IGURE 2.2 – Une corrélation nulle n’implique pas qu’il n’y ait aucun lien entre les variables. F IGURE 2.3 – Les données ne suivent pas une loi binormale mais l’hypothèse de linéarité est vérifiée ! tester la significativité du cœfficient de corrélation. Le fait que les données ne suivent pas une loi bi-normale ne présume en rien de la linéarité des données, comme le montre l’exemple suivant, dans lequel nous simulons un modèle linéaire dont la variable explicative est générée grâce à une distribution exponentielle : set.seed(123) #Nous simulons une varaiable explicative x<-rexp(90) #Nous simulons un vecteur d'erreur erreur<-rnorm(90,0,10ˆ-2) #La variable réponse est la somme des deux y<-x+erreur #Nous réprésentons graphiquement le lien entre les deux variables qplot(x,y) #Nous effectuons le test de bi-normalité mshapiro.test(rbind(x,y)) ## ## Shapiro-Wilk normality test ## ## data: Z ## W = 0.7539, p-value = 5.635e-11 Test de linéarité basé sur l’anova 17 Ce paragraphe peut être sauté en première lecture Le test de bi-normalité nous ayant conduit à une impasse, et les données étant visiblement alignées, nous allons employer une autre stratégie. Pour la mettre en œuvre, nous devons d’abord discrétiser la variable réponse waistcirc. La discrétisation d’une variable continue est le processus qui permet regrouper ses valeurs en un petit nombre fini de valeurs (c’est-à-dire, grossièrement, faire des paquets). Nous choisissons de faire 5 catégories comme suit : require(arules) #L'option frequency permet de faire des groupes d'effectifs semblables #Nous faisons 5 groupes waist_fact<- discretize(donnees$waistcirc,method="frequency",5) waist_fact<-as.numeric(waist_fact) nb_levels<-5 #Cette boucle permet d'assigner à chaque observation la moyenne #des observations du groupe qui la contient for(i in 1:nb_levels){ indice<-which(i==waist_fact) waist_fact[indice]<-round(mean(donnees$waistcirc[indice])) } #Nous pouvons enfin tracer une voı̂te à moustache qplot(as.factor(waist_fact),donnees$DEXfat)+ geom_boxplot(outlier.colour = "green",notch=TRUE, fill = "purple", colour = "#3366FF") ## notch went outside hinges. Try setting notch=FALSE. ## notch went outside hinges. Try setting notch=FALSE. Nous avons créé une nouvelle variable, waist fact qui comporte 5 classes. Chaque classe est représentée par la valeur moyenne des individus qui la composent. En considérant la nouvelle variable tantôt comme un facteur, tantôt comme un vecteur quantitatif, nous allons pouvoir tester la linéarité. Nous avons représenté la variable réponse en fonction de la nouvelle variable waist fact dans la Figure 2.4 Dans ce cas (c’est-à-dire quand nous avons plusieurs observations pour chaque niveau de la variable réponse), la régression linéaire peut être vue comme une simplification de l’analyse de la variance. En effet, dans l’analyse de la variance, chaque niveau possède son propre paramètre. Dans la régression, les niveaux sont paramétrés par une droite ; ils ont donc moins de liberté. Procédons maintenant l’analyse de variance et l’analyse de la variance de la régression linéaire : anov<-aov(donnees$DEXfat˜as.factor(waist_fact)) xtable(anova(anov)) as.factor(waist fact) Residuals Df 4 66 Sum Sq 6616.00 1919.99 18 Mean Sq 1654.00 29.09 F value 56.86 Pr(>F) 0.0000 ● ● 60 donnees$DEXfat 50 ● 40 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 30 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 20 ● ● ● ● ● ● ● ● ● ● 10 70 79 86 98 110 as.factor(waist_fact) F IGURE 2.4 – Discrétisation de la variable explicative. droite<-lm(donnees$DEXfat˜waist_fact) xtable(anova(droite)) waist fact Residuals Df 1 69 Sum Sq 6613.81 1922.18 Mean Sq 6613.81 27.86 F value 237.41 Pr(>F) 0.0000 Les deux tableaux obtenus se ressemblent beaucoup, mais reflètent deux analyses bien différentes. La première analyse est l’analyse de la variance classique, où la variable waist fact est considérée comme un facteur comprenant 5 niveaux. Le nombre de degrés de liberté associé au facteur est 5 − 1 = 4. La deuxième analyse où waist fact est considérée comme quantitative. C’est l’analyse de la variance de la régression. Le nombre de degré de liberté correspondant à la variable explicative est 1. Les deux tableaux montrent que l’anova a un meilleur pouvoir explicatif que la régression. La somme des carrés liée au facteur est plus grande dans le cas de l’anova que de la régression. La Figure 2.5 vous aidera à comprendre ce que nous venons d’écrire : qplot(waist_fact,donnees$DEXfat)+ geom_abline(intercept=coef(droite)[1],slope=coef(droite)[2])+ geom_point(aes(x=c(70,79,86,98,110), y=unlist(lapply(split(donnees$DEXfat,as.factor(waist_fact)),mean)), color="red"),lwd=6,alpha=0.8)+ geom_point(aes(x=c(70,79,86,98,110), y=sort(unique(round(fitted(droite),2))),color="green"),lwd=6,alpha=0.8)+ scale_colour_discrete(name ="", labels=c("Regression", "ANOVA")) 19 ● ● 60 donnees$DEXfat 50 ● ● ● ● ● ● ● ● ● ● ● ● ● ● 40 ● ● ● ● ● ● ● Regression ● ● ANOVA ● ● ● ● 30 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 20 ● ● ● ● ● ● ● ● ● ● 10 70 80 90 100 110 waist_fact F IGURE 2.5 – Anova contre régression : les points de la régression sont parfaitement alignés tandis que ceux pour l’anova n’ont aucune contrainte. La question que nous nous posons est alors la suivante : faisons-nous une grande erreur en supposant que les points sont alignés ? Dans ce cas, la proximité entre les points de la régression et ceux de l’anova semble indiquer que l’erreur faite est négligeable (et donc, il est légitime de décrire la relation comme une relation linéaire). Écrivons maintenant l’égalité de la somme des carrés pour l’analyse de la variance. Nous avons : SCT = SCf + SCR , où SCT est la somme des carrés totale, SCf est la somme des carrés du facteur (ou encore, somme des carrés intergroupes) et SCR est la somme des carrés résiduelles (ou encore, somme des carrés intra-groupes). La quantité SCf contient en réalité deux éléments distincts : elle contient la variabilité liée à la régression linéaire, et la variabilité qui n’est pas liée à la régression linéaire SCl et que nous appelons variabilité non-linéaire SCnl . Nous pouvons alors réécrire l’égalité de la somme des carrés : SCT = SCl + SCnl + SCR . Nous aboutissons au tableau de l’analyse de la variance suivant : linéaire non-linéaire résiduelle totale SC 6614 2 1920 8536 ddl 1 3 66 70 Les p-valeurs ont été obtenues par la commande : 1-pf(228,1,66) ## [1] 0 1-pf(0.03,3,66) ## [1] 0.9929393 20 CM 6614 0.67 29 Fobs 228 0.03 p-valeur 0 0.99 Pour pouvoir les interpréter, il faut vérifier les conditions fondamentales de l’ANOVA : bartlett.test(residuals(anov),as.factor(waist_fact)) ## ## Bartlett test of homogeneity of variances ## ## data: residuals(anov) and as.factor(waist_fact) ## Bartlett's K-squared = 8.8038, df = 4, p-value = 0.06619 shapiro.test(residuals(anov)) ## ## Shapiro-Wilk normality test ## ## data: residuals(anov) ## W = 0.9818, p-value = 0.3921 Les deux p-valeurs étant plus grandes que 0.05, nous décidons de garder les hypothèses nulles des deux tests que sont la normalité des résidus et l’homoscédasticité. Nous pouvons maintenant interpréter le tableau de l’anova que nous venons d’établir. Les deux p-valeurs correspondent aux deux tests suivants (donnés dans l’ordre du tableau) : H0 : il n’existe pas de relation linéaire, contre H1 : il existe une relation linéaire. et le deuxième test : H0 : le modèle s’écrit β0 + βwaist xwaist ou il n’existe pas de relation non-linéaire, contre H1 : le modèle ne s’écrit pas β0 + βwaist xwaist ou encore il existe une relation non-linéaire. La p-valeur du premier test est 0, et nous rejetons donc l’hypothèse nulle et décidons qu’il existe une partie linéaire. Par ailleurs, la p-valeur du deuxième test est de 0.99, nous gardons donc l’hypothèse nulle, et décidons que le modèle s’écrit uniquement sous la forme d’une droite affine. Nous pouvons donc, au vu de ces deux tests, décider de la linéarité des données. Le test de Rainbow Le test de Rainbow permet également de tester la linéarité des données. L’idée de ce test est de comparer la pente de régression restreintes aux observations ayant un faible levier (voir la partie sur les diagnostics pour une définition) et la pente calculée à partir de l’ensemble des observations. Ce test s’écrit de la façon suivante : H0 : La relation est linéaire contre 21 H1 : La relation n’est pas linéaire Il est fourni par le package lmtest : require(lmtest) raintest(lm(DEXfat˜waistcirc,data=donnees)) ## ## Rainbow test ## ## data: lm(DEXfat ˜ waistcirc, data = donnees) ## Rain = 0.6452, df1 = 36, df2 = 33, p-value = 0.8998 La p-valeur étant supérieure à 0.05, nous décidons de ne pas rejeter l’hypothèse nulle, et donc, nous décidons de garder l’hypothèse de linéarité de données. Nous pouvons donc poursuivre notre analyse. 2.3.2 Les variables sont mesurées sans erreur Il n’existe pas de manière simple de tester si les variables sont mesurées sans erreur. Cependant, nous vérifierons dans la partie concernant les diagnostics de la régression si certains points ne jouent pas un rôle trop important dans la régression. Ce qu’il faut savoir, c’est que la présence d’erreurs de mesure conduit généralement à une sous-estimation du lien de linéarité. Nous allons mesurer ce lien de linéarité grâce à la corrélation linéaire. x_sans_bruit<-rnorm(100,0,2) x_bruite_1<-x_sans_bruit+rnorm(100,0,0.5) x_bruite_2<-x_sans_bruit+rnorm(100,0,1) x_bruite_3<-x_sans_bruit+rnorm(100,0,1.5) erreur<-rnorm(100,0,0.1) y<-x_sans_bruit+erreur cor(y, x_sans_bruit) ## [1] 0.9984656 cor(y, x_bruite_1) ## [1] 0.9630603 cor(y, x_bruite_2) ## [1] 0.8788355 cor(y, x_bruite_3) ## [1] 0.8211501 La corrélation diminue lorsque le niveau du bruit (ici, représenté par l’écart type de la loi normale qui augmente) augmente. 2.3.3 Tester les hypothèses explicites Les hypothèses implicites, comme nous l’avons vu, portent sur les termes d’erreur. Pour ce faire, nous devons d’abord récupérer dans R le vecteur des résidus. Le vecteur des résidus n’est pas une réalisation directe du vecteur d’erreur. Cependant, il s’y rapporte, et faute de mieux, c’est sur lui que nous travaillerons. 22 droite<-lm(DEXfat˜waistcirc,data=donnees) residus<-residuals(droite) En R, lm est la fonction qui permet d’ajuster un modèle linéaire. La fonction residuals permet de récupérer les valeurs résiduelles, c’est-à-dire : res ˆ i = yi − yˆi , où yˆi = β̂0 + β̂1 xwaist,i est la valeur ajustée de yi . Indépendance L’indépendance des résidus doit être, à ce stade, diagnostiquée en fonction des connaissances que nous avons sur le jeu de données. Dans notre cas, nous la supposerons vérifiée. L’analyse des résidus dans la partie des diagnostics pourra nous fournir quelques indications supplémentaires. Cependant, si une forme de dépendance est soupçonnée dans les données, certains tests spécifiques peuvent être mis en place. En particulier, si l’on soupçonne une auto-corrélation des erreurs (ce qui peut arriver si les données sont mesurées temporellement), il existe le test de Breusch-Godfrey, qui peut être réalisé à partir de la commande bgtest du package lmtest. Normalité Nous effectuons le test de Shapiro-Wilk, dont l’hypothèse nulle est la normalité des données et l’hypothèse alternative la non-normalité des données : shapiro.test(residus) ## ## Shapiro-Wilk normality test ## ## data: residus ## W = 0.9712, p-value = 0.1016 La p-valeur de ce test étant plus grande que 0.05, nous décidons de ne pas rejeter l’hypothèse nulle, et de fait, de décider que les résidus suivent bien une loi normale. Ce choix est fait avec un risque de seconde espèce que nous ne calculerons pas ici. Homogénéité des variances L’homogénéité des variances peut être testée grâce au test de Breusch-Pagan. Il a pour hypothèse nulle l’homoscédasticité et pour hypothèse alternative l’hétéroscédasticité : H0 : les résidus ont tous la même variance σ 2 contre H1 : Les résidus n’ont pas tous la même variance σ 2 Nous utilisons la fonction bptest du package lmtest. 23 require(lmtest) bptest(droite) ## ## studentized Breusch-Pagan test for homoscedasticity ## ## data: droite ## BP = 3.1948, df = 1, p-value = 0.07387 La p-valeur étant supérieure à 0.05, nous décidons de garder l’hypothèse nulle d’homoscédasticité. Un autre test équivalent est le test de White, utilisable par la fonction white.test du package bstats ; les hypothèses nulle et alternative sont les mêmes que pour le test de Breusch-Pagan : #require(bstats) white.test(droite) ## ## White test for constant variance ## ## data: ## White = 3.721, df = 2, p-value = 0.1556 La p-valeur étant supérieure à 0.05, nous parvenons à la même conclusion et gardons l’hypothèse d’homoscédasticité. Cependant la partie des diagnostics nous permettra également de vérifier cette hypothèse. 2.4 Ajustement de la droite de régression et tests Comme nous l’avons déjà vu, pour appliquer la régression linéaire nous devons faire : droite<-lm(DEXfat˜waistcirc,data=donnees) La fonction summary permet d’avoir toutes les informations essentielles sur la régression : summary(droite) ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## Call: lm(formula = DEXfat ˜ waistcirc, data = donnees) Residuals: Min 1Q -12.5677 -3.6386 Median -0.3711 3Q 2.8719 Max 17.7140 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -31.03158 3.67831 -8.436 3.18e-12 *** waistcirc 0.70740 0.04157 17.017 < 2e-16 *** --Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 4.879 on 69 degrees of freedom Multiple R-squared: 0.8076,Adjusted R-squared: 0.8048 F-statistic: 289.6 on 1 and 69 DF, p-value: < 2.2e-16 24 Analysons la sortie. Dans la partie cœfficient, nous trouvons deux lignes : l’intercept, qui correspond à notre β0 et waistcirc qui correspond au cœfficient de la variable explicative βwaist . La première colonne, estimate, donne les estimations ponctuelles pour les estimateurs β̂0 et β̂waist de β0 et βwaist . Nous pouvons les retrouver grâce à la fonction coef : coef(droite) ## (Intercept) ## -31.0315836 waistcirc 0.7073954 La colonne Std. Error donne l’écart-type pour chacun des estimateurs. Les colonnes suivantes correspondent alors aux deux tests de Student (test t) suivant : H 0 : β0 = 0 contre H1 : β0 6= 0 et : H0 : βwaist = 0 contre H1 : βwaist 6= 0 La colonne t value donne la statistique de test, tandis que la colonne Pr(>|t|) donne la p-valeur associée. Nous trouvons ensuite dans l’ordre : – Une estimation de σ, obtenue par la formule suivante : sqrt(sum(residusˆ2)/69) ## [1] 4.878985 – Le R2 (et sa version ajustée) qui représente la proportion de variabilité expliquée par le modèle, – La statistique F de l’analyse de la variance de la régression, elle permet de tester la significativité globale du modèle. Elle peut également être obtenue de la manière suivante : xtable(anova(droite)) waistcirc Residuals Df 1 69 Sum Sq 6893.47 1642.51 Mean Sq 6893.47 23.80 F value 289.59 Pr(>F) 0.0000 Comme nous avons vérifié les conditions d’application de la régression linéaire, nous pouvons analyser les p-valeurs retournées par l’appel de la fonction summary. Le test qui nous intéresse particulièrement est le test qui a pour hypothèse nulle la nullité du paramètre βwaist . La p-valeur pour ce test étant inférieure à 0.05, nous rejetons l’hypothèse nulle et acceptons l’hypothèse alternative βwaist 6= 0. La variable waistcirc a donc un effet linéaire significatif sur la variable DEXfat. Nous pouvons obtenir des intervalles de confiance pour les deux paramètres (une manière équivalente de faire un test est de regarder si 0 appartient ou non à l’intervalle de confiance donné) : 25 confint(droite) ## 2.5 % 97.5 % ## (Intercept) -38.3696199 -23.6935473 ## waistcirc 0.6244669 0.7903239 De la même manière, nous pouvons obtenir les valeurs ajustées yˆi ainsi que les intervalles de confiance correspondants : pred<-predict(droite,interval="confidence") xtable(head(pred)) fit 39.71 39.35 36.88 19.90 32.28 28.04 ind 1 ind 2 ind 3 ind 4 ind 5 ind 6 lwr 38.15 37.82 35.52 18.18 31.11 26.84 upr 41.27 40.89 38.24 21.62 33.45 29.24 Maintenant, nous pouvons mettre toutes ces informations sur un graphique (Figure 2.6) obtenu par la commande suivante : qplot(donnees$waistcirc,donnees$DEXfat)+ geom_abline(intercept=coef(droite)[1],slope=coef(droite)[2],color="red")+ geom_point(aes(x=donnees$waistcirc,y=fitted(droite)),col="red",lwd=4)+ geom_ribbon(aes(ymin=pred[,2],ymax=pred[,3]),alpha=0.3,fill="green") ● ● 60 ● 50 ●● ● ● donnees$DEXfat ● ● ● ●● ● ●● ● ●●● ●● ● ●● ●● ● ● ●● 40 ● ● ● ● ● ● 30 ● ● ● ● ●● ● ● ● 20 ● ● ● ●● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ●●● ● ● ●● ● ● ●● ●● ● ● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● 10 70 80 90 100 110 donnees$waistcirc F IGURE 2.6 – La droite de régression, avec son intervalle de confiance, et les valeurs ajustées. 26 2.5 Prédiction en régression linéaire Supposons maintenant que nous disposions de nouveaux individus pour lesquels nous aurions mesuré leur tour de taille. Créons artificiellement un tel vecteur : waist_nouv<-c(72.1,90.4,100,111.3) Nous aimerions savoir, compte tenu de l’analyse de régression linéaire faite précédemment, quelles sont les valeurs probables que peuvent prendre les mesures de graisse corporelle pour ces individus. Cela peut être fait grâce à la fonction predict avec l’argument newdata. Par ailleurs, l’argument interval permet d’obtenir intervalle de prédiction : predict(droite,newdata=data.frame(waistcirc=waist_nouv), interval="prediction") ## ## ## ## ## 1 2 3 4 fit 19.97162 32.91696 39.70795 47.70152 lwr 10.08841 23.11215 29.85065 37.70125 upr 29.85484 42.72177 49.56526 57.70180 Pour fonctionner, l’argument newdata doit être un data.frame dont le nom de colonne est exactement le même nom de colonne que la variable explicative. 2.6 Diagnostics de la régression linéaire Vous avez sans doute noté que la plupart des tests servant à vérifier les conditions d’application du modèle ont conduit à la non-réjection de l’hypothèse nulle. Les décisions que nous avons alors prises ont alors été faites avec un risque de seconde espèce que nous ne connaissons pas. Par conséquent, il n’est pas inutile d’effectuer quelques vérifications supplémentaires. De plus les diagnostics vont nous permettre de détecter des observations aberrantes, et ainsi, attirer notre attention sur de possibles problèmes dans le jeu de données. C’est donc une étape indispensable. 2.6.1 Graphiques permettant de valider la normalité des résidus Deux graphiques peuvent être utilisés afin d’attester de la normalité des résidus. Il s’agit de la droite de Henri et de l’histogramme. Nous les avons tracés en Figure 2.7. #Si vous ne voulez pas utiliser ggplot2, il suffit de faire : #qqnorm(residus) #qqplot(residus) #Droite de Henri (qqplot en anglais) qqres<-qqnorm(residus,plot.it=FALSE) p1<-qplot(qqres[[1]],qqres[[2]])+geom_smooth(method="lm")+ xlab("Quantiles théoriques")+ ylab("Résidus") #Pour trouver le point eloigne de la droite which.max(qqres[[1]]) ## [1] 41 27 #Histogramme p2<-ggplot(data=NULL,aes(x=residus))+ geom_histogram(aes(y = ..density..,fill=..density..),binwidth=3)+ geom_density()+ scale_fill_gradient("density", low = "green", high = "red")+ ylab("Densité") #On trace les deux graphiques ensemble require(gridExtra) grid.arrange(p1,p2,nrow=1,ncol=2) La droite de Henri doit représenter, si les données suivent une loi normale, des points alignés le long d’une droite. L’histogramme doit quant à lui présenter une loi symétrique sous forme de cloche. Nous avons rajouté dans la Figure 2.7 une estimation de la densité pour vous aider dans l’interprétation. En remplaçant le vecteur residus par un vecteur contenant des valeurs simulées de différentes lois, vous pouvez voir des ”mauvais cas” (Figure 2.8). Nous donnons ici l’exemple avec la loi exponentielle : #vous pouvez remplacer la fonction rexp par #n'importe quelle autre loi non gaussienne vec_sim<-rexp(N) #Diagramme quantile quantile qqres<-qqnorm(vec_sim,plot.it=FALSE) p1<-qplot(qqres[[1]],qqres[[2]])+geom_smooth(method="lm")+ xlab("Quantiles théoriques")+ ylab("vec_sim") #Histogramme p2<-ggplot(data=NULL,aes(x=vec_sim))+ geom_histogram(aes(y = ..density..,fill=..density..),binwidth=1)+ geom_density()+ scale_fill_gradient("density", low = "green", high = "red")+ ylab("Densité") #On trace les deux graphiques ensemble grid.arrange(p1,p2,nrow=1,ncol=2) 2.6.2 Graphe des résidus studentisés Nous allons dans ce paragraphe étudier le graphique des résidus studentisés. Les résidus, même sous l’hypothèse d’homoscédasticité des erreurs, n’ont pas la même variance ; ils ne sont donc pas directement comparables. Les résidus studentisés permettent de répondre à cette problématique. Ils sont obtenus de la manière suivante : require(MASS) residus_stud<-studres(droite) Nous traçons alors le graphique des résidus studentisés en fonction des valeurs ajustées (Figure 2.9) : 28 ● 0.6 ● ●● 4 0.075 ● ● 0.4 ● 10 ●● ● density 0.6 0.5 0.4 0.3 0.2 0.1 0.0 ● ● ● ● Densité Résidus ●● ● ● ●●● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●●● 0.06 0.04 0.02 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ●●●● ● ●●● ● 0 density 0.08 0.050 2 0.00 0 Densité vec_sim ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●●●●● ●●● ● ●●● 0.2 0.025 ● 0.0 −10 −2 −1 0 1 Quantiles théoriques 2 0.0 2.5 5.0 vec_sim 0.000 ● −2 −1 0 1 Quantiles théoriques 2 −10 0 10 20 residus F IGURE 2.8 – Droite de henri et histogramme pour un vecteur dont les éléments ont été simulés suivant une loi exponentielle. La droite de Henri ne présente pas de points alignés tandis que l’histogramme ne présente pas une distribution symétrique. F IGURE 2.7 – Droite de henri et histogramme sur notre jeu de données. qplot(fitted(droite),residus_stud)+ geom_abline(intercept=2,slope=0,color="red",lwd=1.5)+ geom_abline(intercept=-2,slope=0,color="red",lwd=1.5)+ geom_text(aes(label=ifelse((abs(residus_stud)>2), paste(names(residus_stud), "\n", round(residus_stud,1)),"")), hjust=1.1) D’abord, nous pouvons considérer que les observations dont les résidus studentisés sont supérieurs à 2 en valeur absolue sont suspectes. Dans notre cas nous en avons trois. Nous y reviendrons plus tard. Une chose importante est d’étudier la forme du nuage de points, afin de détecter des problèmes de non-linéarité ou d’hétérogénéité des variances. Par ailleurs, il est conseillé de faire le même graphique en prenant pour abscisse les valeurs de la variable explicative (Firgure 2.10) : qplot(donnees$waistcirc,residus_stud)+ geom_abline(intercept=2,slope=0,color="red",lwd=1.5)+ geom_abline(intercept=-2,slope=0,color="red",lwd=1.5)+ geom_text(aes(label=ifelse((abs(residus_stud)>2), paste(names(residus_stud), "\n", round(residus_stud,1)),"")), hjust=1.1) Pour comparaison, nous produisons les cas les plus classiques dans la Figure 2.11, et dont le code est ci-dessous : require(gridExtra) gr1<-qplot(1:50,rnorm(50)) gr2<-qplot(1:50,(1:50)*rnorm(50)) gr3<-qplot(1:50,sqrt((1:50))*rnorm(50)) gr4<-qplot(1:50,cos((1:50)*pi/25)+rnorm(50)) grid.arrange(gr1,gr2,gr3,gr4,ncol=2) Dans notre cas, nous pouvons suspecter un léger problème d’hététoscédascité. 29 ind 41 ● 4.1 4 ind 48 ● 2.3 2 ind 41 ● 4.1 4 ind 48 ● 2.3 2 ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●● ● ●● ● 0 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● −2 ● ● −2 ind 55 ● −2.7 20 30 ind 55 ● −2.7 40 50 70 80 fitted(droite) 90 100 110 donnees$waistcirc F IGURE 2.9 – Résidus studentisés contre valeurs ajustées. 2.6.3 ● ●● ● ● ● ● ● ●● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● residus_stud residus_stud ● ● ● ● F IGURE 2.10 – Résidus studentisés contre variable explicative. Leviers Nous allons calculer ce que nous appelons les leviers. Ces valeurs sont liées à la distance qui sépare l’observation de la variable explicative avec la moyenne des observations. Plus une observation a un levier important, et plus elle est susceptible de modifier significativement la droite de régression. Il faut les comparer avec la valeur 4/N , avec N le nombre d’observations. Dans notre cas la valeur de référence est : 4/71. hv<-hatvalues(droite) indice<-1:71 qplot(indice,hv)+ geom_abline(intercept=0.057,slope=0,col="red",lwd=1.4)+ geom_text(aes(label=ifelse((hv>0.057 &indice!=48), paste(names(hv), "\n", round(hv,2)),"")), hjust=+1.1)+ geom_text(aes(label=ifelse((hv>0.057 &indice==48), paste(names(hv), "\n", round(hv,2)),"")), hjust=-0.1) La Figure 2.12 indique la présence de cinq individus qui dépassent le seuil et qui sont donc potentiellement influentes du fait de leur éloignement de la moyenne des variables explicatives. 2.6.4 Distance de Cook La distance de Cook permet de prendre en compte l’éloignement par rapport à la moyenne des variables explicatives et l’éloignement par rapport à la droite de régression. Cette distance permet donc de mesurer l’influence d’une observation sur la droite de régression. Les observations dont la distance de Cook est supérieure à 4/N doivent retenir notre attention. Avant de calculer la distance de Cook, voici un exemple de ce que nous cherchons à éviter (Figure 2.13) : x<-rnorm(20) y<-x+rnorm(20,0,0.1) x[20]<-4 y[20]<-1 30 ● 2 ● 100 ● ● ● ● ● ● ● ● ● ● rnorm(50) ● ● ● 0 ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● −1 ● ● ● ●● ● ● ● ● ● 50 ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●● ●●● ● ● ● ● ● ● 0 ● ● ● ● ● ● ● ● ● ● ● ● ● ●● −2 (1:50) * rnorm(50) 1 ● −50 ● ● 0 10 20 ● ● 30 40 50 0 10 20 1:50 30 40 50 1:50 4 ● cos((1:50) * pi/25) + rnorm(50) ● ● sqrt((1:50)) * rnorm(50) ● ● ● 10 ● ● ● 0 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●● ● ● ● ● ● ●● ● ● ● ● −10 ● ● 2 ● ● 10 20 30 40 50 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 10 ● ● ● ● ● −2 0 1:50 ● ● ● ●● 0 ● ● ● ● ● ● ● ● ● 0 ● ● ● ● ● ● 20 30 40 50 1:50 F IGURE 2.11 – Différents cas pour le graphique des résidus. En haut à droite, c’est la situation ”normale”. Les deux graphiques suivants présentent un cas d’hétéroscédasticité, plus marqué en haut à droite qu’en bas à gauche. Cela se caractérise par des formes d’entonnoir ou de diabolo, par exemple. Le dernier graphique présente un cas de non linéarité. qplot(x,y)+geom_smooth(method="lm",aes(fill="avec"))+ geom_smooth(method="lm",aes(x=x[-20],y=y[-20],fill="sans"))+ scale_fill_discrete(name ="") Nous pouvons maintenant calculer la distance de Cook pour notre exemple et représenter les valeurs sur un graphique (Figure 2.14) : cd<-cooks.distance(droite) qplot(indice,cd)+ geom_abline(intercept=0.057,slope=0,col="red",lwd=1.4)+ geom_text(aes(label=ifelse((cd>0.057 ), paste(names(cd), "\n", round(cd,2)),"")), hjust=+1.1) 31 3 0.08 ind 18 ● 0.08 ind 45 ● 0.08 ind 47 ind 48 ●● 0.07 0.07 2 0.06 ind 46 ● 0.06 ● ● ● ● ● 1 ● hv y avec ●● ● 0.04 sans ● ●● ● ● ● ● ● ● ● ●● ● ● 0 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0.02 ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● −1 ● ● ● ● ● ●● ● ● ●● −1 0 20 40 0 1 2 3 4 x 60 indice F IGURE 2.13 – Une situation qu’il faut éviter. Sur le graphique, les deux droites de régression, avec et sans le point aberrant. F IGURE 2.12 – Détection des observations avec un fort levier. 0.3 ind 41 ● 0.29 ● ● 60 50 0.2 ind 48 ● 0.18 cd DEXfat 40 30 0.1 ind 45 ● 0.06● ● ind 14 ● 0.06 20 ● ● ● ● 0.0 ● ●●●●● ● ● ● ● ● ● ●●● ●● ● ● ●● ● ● ●● ●● ● ● ● ● ●●●● ● ● ●● ● ●● ● ● ● ●●●● ● ● ● ●●● ● ● ● ● ● ● 10 0 20 40 60 ●● ● ● ● ● ●● ● ● ●● ● ● ● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ●● ●● ● ● ●● ● ●● ●● ●● ● ●● ● ● ● ●● ● ● ● ● ●● ● ● ● ● ● ●● ● 70 indice 80 90 100 ● Cook ou stud.res ● Cook ou stud.res et hi ● normal ● hi 110 waistcirc F IGURE 2.14 – Distance de Cook. F IGURE 2.15 – Diagnostic final. 32 2.6.5 Diagnostic final Nous construisons un graphique permettant de visualiser tous les points repérés lors de l’étape de diagnostic (Figure 2.15). type<-matrix("normal",71,2) type[c(14,41,45,48,55),1]<- "Cook or stud.res" type[,2]<-rep("",71) type[c(18,45,46,47,48),2]<- "hi" qplot(data=donnees,waistcirc,DEXfat,geom="line")+ geom_point(aes(color=paste(type[,1],type[,2],sep=" ")),lwd=6)+ geom_smooth(method="lm")+ scale_colour_discrete(name ="", labels=c("Cook ou stud.res", "Cook ou stud.res et hi","normal","hi")) 33 34 Chapitre 3 La régression linéaire multiple La régression linéaire multiple est une généralisation de la régression linéaire simple dans laquelle plusieurs variables explicatives entrent dans le modèle. Pour résumer cette partie, nous pouvons dire que les concepts vus dans la partie précédente ne changent pas, exceptés pour les deux points suivants : – aux hypothèses du modèle linéaire simple, il faudra ajouter l’hypothèse implicite suivante : la collinéarité entre les variables explicatives n’est pas ”trop” importante, – les possibilités de tests sont plus importantes : ainsi nous pourrons tester la nullité d’un cœfficient, de l’ensemble des cœfficients, ou d’une combinaison linéaire de ces derniers. Poursuivant notre exemple, nous allons inclure dans un modèle de régression linéaire multiple l’ensemble des variables contenues dans notre jeu de données. Pour rappel : xtable(head(donnees)) ind 1 ind 2 ind 3 ind 4 ind 5 ind 6 age 57.00 65.00 59.00 58.00 60.00 61.00 DEXfat 41.68 43.29 35.41 22.79 36.42 24.13 waistcirc 100.00 99.50 96.00 72.00 89.50 83.50 hipcirc 112.00 116.50 108.50 96.50 100.50 97.00 elbowbreadth 7.10 6.50 6.20 6.10 7.10 6.50 kneebreadth 9.40 8.90 8.90 9.20 10.00 8.80 Nous définissons les variables suivantes : – soit y = (y1 , ..., yN )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable DEXfat pour chacun des individus : c’est la variable réponse, également nommée variable endogène ou variable à expliquer, – soit xwaist = (xwaist,1 , ..., xwaist,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable waistcirc pour chacun des individus : c’est une variable explicative ou variable exogène, – soit xage = (xage,1 , ..., xage,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable age pour chacun des individus : c’est une variable explicative ou variable exogène, – soit xhip = (xhip,1 , ..., xhip,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable hipcirc pour chacun des individus : c’est une variable explicative ou variable exogène, – soit xelbow = (xelbow,1 , ..., xelbow,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable elbowbreadth pour chacun des individus : c’est une variable explicative ou variable exogène, – soit xknee = (xknee,1 , ..., xknee,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable kneebreadth pour chacun des individus : c’est une variable explicative ou variable exogène, – soient β0 et βwaist , βage , βhip , βelbow , βknee six paramètres réels inconnus. 35 Notons alors ε = (ε1 , ..., εN )0 le vecteur de longueur N = 71 qui contient les erreurs aléatoires de moyenne nulle (ou écarts à la droite de régression), et posons le modèle classique de régression linéaire multiple : y = β0 + βwaist xwaist + βage xage + βhip xhip + βelbow xelbow + βknee xknee + ε. 3.1 (3.1) Hypothèses relatives au modèle linéaire multiple Plusieurs hypothèses sont nécessaires afin d’obtenir de bonnes propriétés des estimateurs des paramètres du modèle (estimateurs des paramètres sans biais et de variance minimale, par exemple). Comme pour le modèle linéaire simple, nous distinguons deux types d’hypothèses : celles que nous appellerons explicites portent sur les termes d’erreur, et celles que nous appellerons implicites sont directement liées à l’équation du modèle. Les hypothèses explicites, c’est-à-dire celles qui portent sur les termes d’erreur εi , sont au nombre de trois : – Ils sont de variance constante, notée σ 2 , c’est l’hypothèse d’homoscédasticité : en particulier, les erreurs ne sont pas dépendantes des variables exogènes. – Ils suivent une loi normale de moyenne nulle et de variance σ 2 . – Ils sont indépendants. À ces hypothèses sur le terme d’erreur, nous devons ajouter trois hypothèses supplémentaires, qui sont implicites au modèle : – La relation entre les variables exogènes et la variable endogène y est linéaire ; de plus, les effets des variables exogènes sont additifs. – Les variables exogènes sont mesurées sans erreur. Dans la conception originelle du modèle linéaire, la variable y est également supposée être mesurée sans erreur car le terme aléatoire ne représente que le défaut d’ajustement. – Les variables exogènes ne présente pas de forte colinéarité entre elles. La première étape de notre travail consiste maintenant à tester ces hypothèses. Comme nous ne souhaitons pas répéter ce qui a été vu dans la partie sur la régression linéaire simple, nous nous contenterons d’évoquer les points suivants : la linéarité et la liaison entre les variables exogènes. 3.1.1 L’hypothèse de relation linéaire Nous voulons d’abord rendre attentif le lecteur au fait suivant : le modèle linéaire multiple que nous avons spécifié n’implique pas la linéarité de la variable réponse en fonction de chaque variable. Un simple petit exemple suffit à s’en convaincre (Figure 3.1) : set.seed(1234) x1<-rnorm(50) x2<-rexp(50) y<-x1+2*x2+rnorm(50,0,0.5) p1<-qplot(x1,y) p2<-qplot(x2,y) p3<-qplot(x1+2*x2,y) grid.arrange(p1,p2,p3) En réalité, quand nous avons P variables, nous nous trouvons dans un espace de dimension P + 1. Les observations s’allongent selon un sous-espace de dimension P , également appelé hyperplan. Prenons, pour commencer, l’exemple de la régression linéaire simple. Nous avons alors une variable explicative, et par conséquent, nous sommes dans un espace de dimension 2, c’est-à-dire le plan. Les observations s’alignent selon un sous-espace de dimension 2-1=1, c’est-à-dire une 36 ● 5.0 ● ● ● ● ●●● ● ● y ● ● ● 2.5 ● ● ●● ● 0.0 ● ●● ● ● ● ● ● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● −2.5 ● −2 −1 0 1 y 2 x1 8 ● 5.0 ● ● y 2.5 0.0 ●● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● −2.5 ● ● ● ● ● ● ● ● ● ● ● ●●● ●● ● ● ● ● ● ● ● ● ● 0 1 2 3 x2 x1 2 ● 5.0 ● ● ● ● y ● 0.0 ● ● ●● ● ● ● ●● ● ● ● ●●● ● ● ● ● ● ● ●● ●● ● ● ● ● ● ● ● x2 -2 ●● 2.5 −2.5 ● ● -2 ● 0.005 ● ●●● 4 ● 0.0 2.5 F IGURE 3.2 – Dans la régression linéaire à deux variables, les observations s’allongent selon un plan. x1 + 2 * x2 F IGURE 3.1 – La linéarité dans la régression multiple ne peut pas se regarder variable par variable. droite. C’est bien ce que nous connaissions. Dans le cas où nous avons deux variables explicatives, nous sommes globalement dans un espace de dimension 3, et les observations s’allongent selon un espace de dimension 3-1=2, c’est-à-dire un plan (Figure 3.2). Comme dans la régression linéaire simple, il est possible d’effectuer le test de Rainbow : #Voir section suivante pour une explication de la spécification #du modèle. Le "." signifie : toutes les variables. raintest(lm(DEXfat˜.,data=donnees)) ## ## Rainbow test ## ## data: lm(DEXfat ˜ ., data = donnees) ## Rain = 0.5848, df1 = 36, df2 = 29, p-value = 0.9366 La p-valeur de ce test étant au-dessus de 0.05, nous ne pouvons pas rejeter l’hypothèse nulle de linéarité. Nous supposons donc que cette dernière est satisfaite. De plus, l’étape de diagnostic permettra de vérifier plus en détail que cette condition n’est pas violée. 3.1.2 L’hypothèse de non corrélation des variables explicatives Ce qu’il faut savoir, c’est que plus les variables explicatives sont corrélées, et plus les résultats de la régression seront difficilement interprétables. En particulier, il faut être attentif aux deux phénomènes suivants : – l’intervalle de confiance pour les cœfficients de la régression augmente avec la corrélation. Il est donc de plus en plus difficile de mettre en évidence un effet des variables explicatives. – le signe des variables explicatives peut être inversé. Ainsi, deux variables corrélées positivement peuvent produire deux cœfficients de régression de signe opposé. 37 Pour mettre en évidence ces deux points, il peut être utile d’observer ce qu’il se passe sur un petit exemple. Dans ce dernier, nous allons générer des données issues d’une loi normale bivariée, dans laquelle nous ferons évoluer la matrice de variance covariance. Cette dernière sera de la forme : 1 a a 1 Plus le cœfficient a sera proche de 1, et plus nos données simulées seront corrélées (en moyenne). #Permet d'obtenir des résultats reproductibles set.seed(12345) #Le vecteur val contient les valeurs de a utilisées pour la #matrice de variance-covariance val<-c(0.99,0.97,0.9,0.5,0) #Resultat : contient les étendues des intervalles de confiance #Resultat : 0 si signes opposés, 1 sinon resultat<-matrix(500,100,5) resultat2<-matrix(500,100,5) for(i in 1:5){ a<-val[i] for(j in 1:100){ #Ceci est une manière simple de généré des données corrélées #selon une loi normale bivariée C1<-chol(matrix(c(1,a,a,1),2,2)) x<-t(C1%*%matrix(rnorm(10,0,1),2,5)) #x contient les deux variables x1 et x2 #y=x1+x2+bruit y<- apply(x,1,sum)+rnorm(5,0,0.5) #calcul de l'étendue moyenne pour les deux paramètres beta_1 et beta_2 resultat[j,i]<-mean(abs(confint((lm(y˜x)))[2:3,2]-confint((lm(y˜x)))[2:3,1])) #signe égaux ? resultat2[j,i]<-sum(coef(lm(y˜x))[2]*coef(lm(y˜x))[3]>0) } } p1<-qplot(as.factor(rep(val,each=100)),c(resultat))+ geom_boxplot(outlier.colour = "green",notch=TRUE, fill = "purple", colour = "#3366FF")+ xlab("correlation")+ ylab("amplitude de l'intervalle de confiance") p2<-qplot(val,apply(resultat2,2,mean),geom=c("line","point"))+ xlab("correlation")+ ylab("proportion de signes cohérents") grid.arrange(p1,p2,ncol=2) Nous ne saurons trop conseiller de faire une figure similaire à celle de notre Figure 1.4 afin de détecter par avance d’éventuels problèmes de corrélation et de regarder la matrice de corrélation : 38 100 ● ● ● ● 0.9 ● ● 50 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0 0.5 0.9 0.97 ● 25 ● ● ● 0 proportion de signes cohérents amplitude de l'intervalle de confiance 75 ● 0.8 0.7 ● ● 0.99 0.00 0.25 correlation 0.50 0.75 1.00 correlation F IGURE 3.3 – À gauche : l’étendue augmente avec la corrélation des deux variables explicatives. À droite : la proportion de signe cohérent diminue avec l’augmentation de la corrélation. xtable(cor(donnees[,-2])) age waistcirc hipcirc elbowbreadth kneebreadth age 1.00 0.24 0.18 -0.07 0.13 waistcirc 0.24 1.00 0.87 0.40 0.73 hipcirc 0.18 0.87 1.00 0.33 0.76 elbowbreadth -0.07 0.40 0.33 1.00 0.46 kneebreadth 0.13 0.73 0.76 0.46 1.00 Attention cependant : cela ne saurait être suffisant ! En effet, quand nous construisons la matrice de corrélation, nous regardons les dépendances linéaires deux par deux. Cependant, la structure de corrélation peut être plus complexe et prendre en compte plus de deux variables dans le même temps. L’étape de diagnostics nous permettra de vérifier si la corrélation des variables explicatives ne pose pas un problème trop important. 3.1.3 Vérification des autres hypothèses Pour la vérification des autres modèles, nous invitons le lecteur à se référer à la partie de vérification des hypothèses de la régression linéaire simple 3.2 Estimation des cœfficients Comme pour le modèle linéaire simple, la fonction R nous permettant d’ajuster un modèle de régression linéaire multiple est la fonction lm. De manière idéale, toutes les variables - réponse et variables explicatives - sont contenues dans un data.frame, comme dans notre exemple. Nous voyons ici toutes les façons de procéder : #Nous conseillons au lecteur de regarder le résultat pour #chacun de ces modèles à l'aide de la fonction summary 39 #Le "." signifie : toutes les variables exceptée la variable réponse modele1<-lm(DEXfat˜.,data=donnees) #Le signe "-" avant une variable permet de la retirer du modèle modele1<-lm(DEXfat˜.-waistcirc,data=donnees) #Le signe ":" permet de rajouter une interaction modele1<-lm(DEXfat˜.+waistcirc:age,data=donnees) #La formule "a*b" est un raccourci pour "a+b+a*b" modele1<-lm(DEXfat˜waistcirc*age,data=donnees) #Pour retirer l'intercept du modèle retirer la variable "1" #Note : ne pas faire cette opération sans raison modele1<-lm(DEXfat˜waistcirc*age-1,data=donnees) #La fonction I() indique qu'il faut considérer les symboles #arithmétique comme tels. Ainsi : I(x*x) signifie x au carré modele1<-lm(DEXfat˜I(waistcircˆ2)+age,data=donnees) #La fonction offset() permet d'imposer la valeur d'un #coefficient de la régression #N.B.: dans ce cas, la variable n'est logiquement plus dans #le tableau des résultats. modele1<-lm(DEXfat˜offset(5*waistcirc)+age,data=donnees) Dans notre cas, nous commençons par ajuster un modèle sur l’ensemble des variables explicatives de notre modèle : modele1<-lm(DEXfat˜.,data=donnees) coef(modele1) ## (Intercept) ## -59.57319910 ## kneebreadth ## 1.65380650 3.3 age 0.06381438 waistcirc 0.32043969 hipcirc elbowbreadth 0.43395490 -0.30117257 Test dans la régression linéaire multiple La régression linéaire multiple - en comparaison avec la régression linéaire simple - offre un éventail beaucoup plus important. La difficulté est alors de bien comprendre les différences entre ces tests. D’avance, nous souhaitons préciser qu’il existe deux familles de tests, chacune possédant ses propres spécificités : les tests t (pour Student) et les tests F (pour Fisher). L’idée générale est la suivante : les tests t testent la nullité d’un paramètre ou d’une combinaison de paramètres tandis que les tests F testent la prévalence d’un modèle sur un autre. Dans un certain sens, nous pourrions être enclins à dire que les tests F sont plus précis que les test t. Dans la suite, nous prendrons soin de préciser le type de test qui est utilisé. 3.3.1 Les tests t pour chaque paramètre Les tests t pour chaque paramètre ont pour hypothèse nulle la nullité du paramètre considéré et pour hypothèse alternative la non-nullité de ce paramètre. La fonction summary permet d’obtenir les p-valeurs de ces tests : modele1<-lm(DEXfat˜.,data=donnees) xtable(summary(modele1)) Dans notre cas, nous décidons de la non-nullité des paramètres waistcirc et hipcirc. 40 (Intercept) age waistcirc hipcirc elbowbreadth kneebreadth 3.3.2 Estimate -59.5732 0.0638 0.3204 0.4340 -0.3012 1.6538 Std. Error 8.4536 0.0374 0.0737 0.0957 1.2173 0.8623 t value -7.05 1.71 4.35 4.54 -0.25 1.92 Pr(>|t|) 0.0000 0.0928 0.0000 0.0000 0.8054 0.0595 La fonction anova appliquée à un objet de type lm La fonction anova permet d’effectuer des tests F, par comparaison de deux modèles emboı̂tés. Le terme ”emboı̂té” signifie que toutes les variables du plus petit des modèles sont contenues dans le plus grand des modèles. La façon de comparer deux modèles emboı̂tés est la suivante : anova(modele1,modele2). Supposons que le modèle 1 soit emboı̂té dans le modèle 2. De manière général, le test qui est alors fait peut s’interpréter de la façon suivante : H0 : Le pouvoir explicatif du modèle 2 est égal au pouvoir explicatif du modèle 1 contre H1 : Le pouvoir explicatif du modèle 2 est différent du pouvoir explicatif du modèle 1 ce qui peut aussi s’écrire en terme de résidus : H0 : Les résidus des deux modèles sont égaux contre H1 : les résidus des deux modèles sont différents. Si nous voulons effectuer le test suivant : H0 : tous les β sont nuls contre H1 : il existe un β qui n’est pas nul nous voulons comparer le modèle complet avec le modèle contenant simplement l’intercept. Ce test permet de valider la significativité globale du modèle (test qui est également fourni dans les informations retournées par summary) : modele0<-lm(DEXfat˜1,data=donnees) xtable(anova(modele0,modele1)) 1 2 Res.Df 70 65 RSS 8535.98 1033.79 Df Sum of Sq F Pr(>F) 5 7502.20 94.34 0.0000 La p-valeur étant proche de zéro, nous rejetons l’hypothèse nulle de nullité de tous les paramètres et décidons qu’e notre modèle, globalement, explique les variations de la variable réponse’il existe au moins un paramètre de notre modèle qui 41 n’est pas nul. Cette décision est faite avec un risque α = 5%. Une telle comparaison entre deux modèles permet d’effectuer bon nombre de tests supplémentaires. Commençons par tester la nullité d’un ensemble de paramètres. Le test que nous allons faire est le suivant : est-ce que l’ajout des variables age, elbowbreadth et kneebreadth permet significativement de mieux expliquer la variable réponse que le modèle contenant simplement les variables waistcirc et hipcirc ? Autrement dit, nous testons, conditionnellement au fait que les variables waistcirc et hipcirc sont déjà dans le modèle : H0 : βage = βelbow = βknee = 0 contre H1 : Au moins un des cœfficient est non-nul. modele2<-lm(DEXfat˜waistcirc+hipcirc,data=donnees) xtable(anova(modele2,modele1)) 1 2 Res.Df 68 65 RSS 1138.98 1033.79 Df Sum of Sq F Pr(>F) 3 105.19 2.20 0.0959 La p-valeur étant supérieure à zéro, nous sommes contraints (avec un risque de seconde espèce) de décider que le modèle réduit est suffisant pour expliquer la variable réponse, autrement dit : βage = βelbow = βknee = 0. Nous pourrions maintenant nous demander si βwaist = βhip , dans le modèle ne contenant que les deux variables xwaist et xhip . Pour cela, il suffit de faire : modele2bis<-lm(DEXfat˜I(waistcirc+hipcirc),data=donnees) xtable(anova(modele2bis,modele2)) 1 2 Res.Df 69 68 RSS 1150.07 1138.98 Df Sum of Sq F Pr(>F) 1 11.09 0.66 0.4186 Nous rappelons que la fonction I() permet de considérer le signe + comme un signe arithmétique et non comme le symbole permettant d’rajouter une variable dans le modèle. Dans le modèle modele2, chacune des variables a son cœfficient de régression tandis que dans le modèle modele2bis nous forçons les deux variables à avoir le même cœfficient de régression. Le test nous permet de montrer que le modèle sans contrainte n’explique pas significativement mieux la variable réponse que le modèle où la contrainte d’égalité des cœfficients est appliquée. Nous décidons donc que βwaistcirc = βhipcirc (avec un risque inconnu de seconde espèce). Notre modèle s’écrit donc maintenant : y = β0 + βwaist−hip (xwaist + xhip ) + ε Autrement dit, nous sommes en présence d’un modèle linéaire simple. Supposons maintenant qu’il est admis dans la littérature que ce modèle est le bon, et que βwaist−hip = 0.4. Comment pouvons-nous tester ce modèle ? 42 modele2tri<-lm(DEXfat˜offset(0.4*I(waistcirc+hipcirc)),data=donnees) xtable(anova(modele2tri,modele2bis)) 1 2 Res.Df 70 69 RSS 1172.63 1150.07 Df Sum of Sq F Pr(>F) 1 22.56 1.35 0.2487 Nous rappelons que la fonction offset() permet d’imposer la valeur d’un cœfficient de régression. La p-valeur étant au-dessus de 0.05, nous ne pouvons pas rejeter l’hypothèse nulle d’équivalence entre les deux modèles et décidons que nos résultats sont cohérents avec la littérature dans laquelle βwaist−hip = 0.4. 3.4 Utilisation de la fonction anova sans utiliser de deuxième modèle Appliquons la fonction anova à notre modèle complet, écrit de deux façons différentes, en inversant la variable age et la variable kneebreadth : modele1<-lm(DEXfat˜age+waistcirc+hipcirc+elbowbreadth+kneebreadth,data=donnees) modele1bis<-lm(DEXfat˜kneebreadth+waistcirc+hipcirc+elbowbreadth+age,data=donnees) Nous laissons le lecteur vérifier que la fonction summary, appliquée à chacun de ces deux modèles, retourne le même résultat à l’ordre des lignes près. En revanche, regardons si cette propriété est conservée par la fonction anova : xtable(anova(modele1)) age waistcirc hipcirc elbowbreadth kneebreadth Residuals Df 1 1 1 1 1 65 Sum Sq 627.15 6295.45 519.21 1.89 58.50 1033.79 Mean Sq 627.15 6295.45 519.21 1.89 58.50 15.90 F value 39.43 395.83 32.65 0.12 3.68 Pr(>F) 0.0000 0.0000 0.0000 0.7312 0.0595 Df 1 1 1 1 1 65 Sum Sq 5035.41 2082.68 332.85 4.97 46.30 1033.79 Mean Sq 5035.41 2082.68 332.85 4.97 46.30 15.90 F value 316.60 130.95 20.93 0.31 2.91 Pr(>F) 0.0000 0.0000 0.0000 0.5780 0.0928 xtable(anova(modele1bis)) kneebreadth waistcirc hipcirc elbowbreadth age Residuals Les résultats, sont, comme vous pouvez le constater, totalement différents. La significativité des variables age et kneebreadth change selon la position dans le modèle (ici, première ou dernière). En réalité, la fonction anova appliquée à un seul modèle ajoute les variables les unes après les autres. Elle compare alors à chaque fois deux modèles : si nous sommes à la ligne i, la fonction compare le modèle contenant les variables 1 à i − 1 avec le modèle contenant les variables 1 à i (de la même manière que dans le paragraphe précédent). L’ordre dans lequel nous plaçons les variables dans le modèle est donc primordial. 43 3.5 Intervalles de confiance Comme dans la régression linéaire simple, les intervalles de confiance univariés s’obtiennent de la manière suivante : xtable(confint(modele1)) (Intercept) age waistcirc hipcirc elbowbreadth kneebreadth 2.5 % -76.46 -0.01 0.17 0.24 -2.73 -0.07 97.5 % -42.69 0.14 0.47 0.62 2.13 3.38 En général, les variables explicatives ne sont pas indépendantes les unes des autres, et la variation d’un cœfficient donne une indication sur la variation des autres cœfficients. Il est possible de créer une ellipse de confiance pour un couple de deux paramètres (Figure 3.4) : #Le deuxième argument est le choix des variables #les variables sont données dans l'ordre donné par summary #Attention : la premiere variable est toujours l'intercept ! require(ellipse) E<-ellipse(modele1,c(3,4)) qplot(E[,1],E[,2],geom="path")+ geom_point(aes(x=0,y=0),lwd=5,colour="red")+ geom_point(aes(x=coef(modele1)[3],y=coef(modele1)[4]),lwd=5,colour="green")+ geom_vline(aes(xintercept=c(0.17321558,0.4676638)))+ geom_hline(aes(yintercept=c(0.24291126, 0.6249985)))+ xlab("waistcirc")+ ylab("hipcirc") 3.6 Valeurs ajustées La syntaxe est identique à la régression linéaire simple : #Pour avoir les valeurs ajustées : Fit<-fitted(modele1) #Avec les intervalles de confiance : Pred<-predict(modele1,interval="confidence") xtable(Pred[1:4,]) ind 1 ind 2 ind 3 ind 4 fit 38.12 39.78 34.89 22.45 lwr 36.14 37.37 33.08 20.44 44 upr 40.09 42.18 36.70 24.47 0.6 ● hipcirc 0.4 0.2 0.0 ● 0.0 0.1 0.2 0.3 0.4 0.5 waistcirc F IGURE 3.4 – Les barres verticales représentent l’intervalle de confiance uni-varié pour la variable waistcirc. Les barres horizontales représentent l’intervalle de confiance uni-varié pour la variable hipcirc. L’ellipse représente l’intervalle de confiance bi-varié pour les deux variables. Le point vert représente l’estimation ponctuelle. Le point rouge est l’origine du repère ; comme il n’est pas inclus dans l’ellipse, les deux cœfficients ne sont pas simultanément nuls. 3.7 Prédiction Pour faire une prédiction à partir d’une ou plusieurs nouvelles observations, il suffit de créer un data.frame contenant exactement les mêmes noms de colonnes que le jeu de données initial, excepté cependant la variable qui a été choisie pour variable explicative. Il suffit alors de procéder de la même manière que dans le cas de la régression linéaire simple : #Création d'un nouveau jeu de données age<-c(50,60) waistcirc<-c(82,80) hipcirc<-c(101,100) elbowbreadth<-c(6.6,7.1) kneebreadth<-c(8.8,7.8) new<-data.frame(age,waistcirc,hipcirc,elbowbreadth,kneebreadth) print(new) ## age waistcirc hipcirc elbowbreadth kneebreadth ## 1 50 82 101 6.6 8.8 ## 2 60 80 100 7.1 7.8 predict(modele1,new,interval="prediction") ## fit lwr upr ## 1 26.28878 18.23514 34.34242 ## 2 24.04769 15.42540 32.66999 45 3.8 Diagnostics Dans cette partie, nous verrons les diagnostics pour la régression linéaire multiple. Ce que nous avons vu dans la partie sur la régression linéaire simple reste valide, même si les bornes auxquelles nous comparerons les différentes statistiques de diagnostic dépendent souvent du nombre de paramètres. Ces bornes vous seront données dans la suite, sous la forme d’un tableau récapitulatif. Nous insisterons cependant sur la nouveauté de cette partie, à savoir les diagnostics concernant la corrélation linéaire des variables. 3.8.1 Diagnostic de colinéarité La colinéarité laisse nos estimateurs de régression linéaire sans biais (pourvu que les autres conditions du modèle soient vérifiées) mais impacte largement la variance des estimateurs, et donc, l’intervalle de confiance. Pour diagnostiquer ce genre de problème, trois considérations sont à prendre en compte : – la corrélation deux à deux (ce que nous avions déjà indiqué), – le conditionnement de la matrice. Le conditionnement de la matrice est une notion d’analyse numérique. Plus la matrice des prédicteurs contient de la corrélation linéaire, et plus les calculs numériques deviennent instables, et de petites variations peuvent entraı̂ner d’importants changements dans le résultat. Nous verrons comment le calculer. – nous regarderons également le critère VIF, pour variance inflation factor. Nous verrons comment l’interpréter. La corrélation linéaire deux par deux a déjà été traitée et nous ne reviendrons pas dessus. Le conditionnement se définit comme la racine carrée de la valeur absolue du rapport entre la plus grande et la plus petite valeur propre de la transposée de la matrice d’expérience multipliée par elle-même. mat_exp<-model.matrix(modele1)[,-1] valeur_propre<-eigen(t(mat_exp)%*%mat_exp)$values sqrt(max(valeur_propre)/min(valeur_propre)) ## [1] 328.3236 Généralement, cette valeur doit être comparée à 30. Dans notre cas, le conditionnement indique des problèmes importants de corrélation linéaire. La racine carrée des critères VIF peut être considérée comme suit : si une variable a pour racine carrée de son VIF a, alors l’estimateur correspondant a un écart-type a fois plus élevé que dans le cas où le modèle ne contiendrait aucune corrélation. Une variable dont la racine carrée du VIF est supérieure à 2 indique un problème de colinéarité. sqrt(vif.lm(modele1)[[1]][1]) ## ## ## ## ## ## age waistcirc hipcirc elbowbreadth kneebreadth 3.8.2 VIF 1.049524 2.169547 2.215661 1.165325 1.652883 Tableau récapitulatif Dans ce tableau, nous notons N le nombre d’observations, et P le nombre de variables. 46 explication fonction package critère résidus studentisés les résidus studentisés doivent être tracés contre la variable réponse et contre chacune des variables explicatives du modèle pour détecter d’éventuels problèmes de non linéarité ou d’hétéroscédasticité. La valeur seuil permet de distinguer des observations anormales. studres MASS 2 normalité des résidus la décision de la normalité par un test de Shapiro-Wilk se fait avec une erreur de seconde espèce inconnue. Il peut alors être utile de vérifier graphiquement cette hypothèse par le diagramme quantilequantile et un histogramme qqnorm qqplot aucun aucun leviers les leviers permettent de détecter les observations qui vont potentiellement influer sur la régression. Elle est déterminée par la distance entre l’observation concernée et le barycentre de toutes les observations. hatvalues aucun 2P/N distance de Cook La distance de Cook permet de quantifier l’impact sur la régression d’une observation cooks.distance aucun 4/N VIF le critère VIF permet de mesurer l’impact de la corrélation linéaire sur la régression vif car 4 conditionnement Le conditionnement permet de savoir si le système linéaire est stable voir par. prec. aucun 30 47 48 Chapitre 4 Sélection de modèle Nous avons vu dans le chapitre précédent que nous pouvions comparer deux modèles emboı̂tés. Cela n’est pourtant pas toujours suffisant. Par exemple, si nous voulons répondre à la question : quel est le meilleur modèle contenant une seule variable ? nous ne pouvons pas utiliser ce genre de test. Les statisticiens, voulant lever cette limitation, ont cherché une nouvelle manière de précéder. Dans ce que nous allons présenter dans ce chapitre, nous allons introduire différents critères qui vont permettre de choisir le (ou un des) meilleur modèle. Moralement, tous ces critères tendent à trouver le modèle comprenant le moins de variables possibles tout en expliquant suffisament la variable explicative. 4.1 Les critères description meilleur modèle R2 ajusté C’est une variante du R2 . Ce dernier a le défaut majeur d’augmenter méchaniquement avec le nombre de variables. Le plus proche de 1. AIC Crtière général s’appliquant à tout modèle estimé par maximum de vraisemblance (ce qui est notre cas). Le plus faible. Préférez la version corrigée quand le nombre de variable excède 30. Le le plus faible. Retient moins de variables que l’AIC. Le le plus faible. Équivalent à l’AIC Le plus proche de P +1 (nombre de variables dont l’intercept), en restant inférieur. AIC corrigé BIC CP de Mallow 49 4.2 Procédure de sélection de modèle Quand nous disposons de P variables dans un jeu de données, nous avons 2P modèles possibles. En effet, la première variable peut être présente ou absente du modèle, pareil pour la suivante... Quand P = 10, nous parvenons déjà à 1024 modèles possibles, et l’augmentation du nombre de modèles en fonction du nombre de variables est exponentiellement. Une recherche exhaustive parmi tous les modèles n’est alors plus possible. Cependant, dans notre cas, nous avons 25 = 32 modèles possibles. Ce nombre est suffisament faible pour envisager une recherche exhaustive. 4.2.1 Recherche exhaustive La recherche exhaustive se fait grâce à au package leaps. require(leaps) rech<-regsubsets(DEXfat˜.,data=donnees) summary(rech) ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## Subset selection object Call: regsubsets.formula(DEXfat ˜ ., data = 5 Variables (and intercept) Forced in Forced out age FALSE FALSE waistcirc FALSE FALSE hipcirc FALSE FALSE elbowbreadth FALSE FALSE kneebreadth FALSE FALSE 1 subsets of each size up to 5 Selection Algorithm: exhaustive age waistcirc hipcirc elbowbreadth 1 ( 1 ) " " " " "*" " " 2 ( 1 ) " " "*" "*" " " 3 ( 1 ) " " "*" "*" " " 4 ( 1 ) "*" "*" "*" " " 5 ( 1 ) "*" "*" "*" "* " donnees) kneebreadth " " " " " *" " *" "* " qplot(1:5+1,summary(rech)$cp)+ geom_line()+ geom_abline(aes(intercept=0,slope=1),col="red")+ xlab("Nombre de paramètres")+ ylab("Cp de Mallow") 50 ● Cp de Mallow 30 20 10 ● ● ● ● 2 3 4 5 6 Nombre de paramètres La première partie du retour de summary donne les variables que nous avons décider systématiquement d’exclure ou d’inclure dans le modèle. Nous n’avons pas fait de tel choix. Le tableau du bas donne le meilleur modèle avec une variable, puis le meilleur modèle avec deux variables(plus l’intercept)... Les variables sélectionnées pour chaque modèle sot accompagnées d’une étoile. Comment choisir le nombre de modèle optimal ? Nous allons utiliser le critère du CP de Mallow. Nous représentons dans la Figure 4.1 l’évolution de ce crtière en fonction du nombre de paramètres dans le modèle (=nombre de variables retenues + l’intercept). Nous traçons également la première bissectrice. Le meilleur modèle est le modèle à 4 variables (5-1), puisque le point correspondant est proche de la première bissectrice tout en étant en-dessous. 51 ● Cp de Mallow 30 20 10 ● ● ● ● 2 3 4 5 6 Nombre de paramètres F IGURE 4.1 – Choix du nombre de variables dans le modèle grâce au critère CP de Mallow 4.3 Procédure forward, backward et stepwise Dans tous les cas, il faut se choisir un critère de sélection. Par convenance, nous choisissons d’expliquer chacune de ces procédures grâce au critère AIC. Procédure forward : Nous commençons avec le modèle qui contient uniquement l’intercept. Á l’étape suivante, nous construisons P nouveaux modèles, chacun contenant l’intercept plus une variable. Nous disposons alors de P + 1 modèles (celui avec l’intercept seul, et les P autres). Si le modèle avec le plus faible AIC est le modèle contenant juste l’intercept, nous gardons ce dernier modèle et la procédure s’arrête. Sinon, la variable permettant d’obtenir l’AIC le plus faible est introduite. Nous construisons P − 1 modèles, contenant chacun l’intercept, la variable précédemment sélectionnée et une des P − 1 variables restantes. Nous disposons donc de P modèles (un modèle à une variable et P − 1 modèles à deux variables). Si le modèle à une variable donne l’AIC le plus faible, la procédure s’arrête et nous gardons le modèle à une variable. Sinon, nous choisissons le meilleur modèle à deux variables et tentons d’inclure une troisième variable... L’arrêt de la procédure se fait soit parce que l’ajout d’une nouvelle variable ne permet plus de faire diminuer le critère AIC, soit parce que toutes les variables ont été incluses dans le modèle. Nous effectuons cette procédure sur notre jeu de données : modele0<-lm(DEXfat˜1,data=donnees) sm1<-step(modele0,direction="forward",scope=˜.+hipcirc+age+elbowbreadth+kneebreadth+waistci ## ## ## ## ## ## ## ## ## ## ## Start: AIC=342.04 DEXfat ˜ 1 + hipcirc + waistcirc + kneebreadth + elbowbreadth + age <none> Df Sum of Sq 1 6947.8 1 6893.5 1 5035.4 1 1067.1 1 627.1 RSS 1588.2 1642.5 3500.6 7468.9 7908.8 8536.0 AIC 224.64 227.03 280.76 334.56 338.63 342.04 52 ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## Step: AIC=224.64 DEXfat ˜ hipcirc + waistcirc + kneebreadth + age <none> + elbowbreadth Df Sum of Sq RSS AIC 1 449.20 1139.0 203.04 1 139.99 1448.2 220.09 1 103.33 1484.8 221.87 1588.2 224.64 1 26.71 1561.5 225.44 Step: AIC=203.04 DEXfat ˜ hipcirc + waistcirc + kneebreadth + age <none> + elbowbreadth Df Sum of Sq RSS AIC 1 53.924 1085.0 201.60 1 44.804 1094.2 202.19 1139.0 203.04 1 0.013 1139.0 205.04 Step: AIC=201.6 DEXfat ˜ hipcirc + waistcirc + kneebreadth + age <none> + elbowbreadth Df Sum of Sq RSS AIC 1 50.295 1034.8 200.23 1085.0 201.60 1 4.972 1080.1 203.27 Step: AIC=200.23 DEXfat ˜ hipcirc + waistcirc + kneebreadth + age Df Sum of Sq <none> + elbowbreadth 1 RSS AIC 1034.8 200.23 0.97352 1033.8 202.16 La sortie présente à chaque étape l’ensemble des modèles possibles. Nous partons du modèle contenant simplement l’intercept. L’AIC étant minimum par l’ajout de la variable hipcirc celle-ci est ajoutée au modèle. Á la dernière étape, la variable elbowbreadth, dernière à ne pas être dans le modèle, ne permet pas d’améliorer le critère AIC. Toutes les variables, mise à part la variable elbowbreadth sont donc retenues dans le modèle. Procédure backward : Cette procédure est dans le même esprit que la procédure forward, sauf que nous partons du modèle complet et qu’à chaque étape nous essayons de retirer une variable du modèle. Nous effectuons cette procédure sur notre jeu de données : modele1<-lm(DEXfat˜.,data=donnees) sm1<-step(modele1,direction="backward") ## ## ## ## ## ## Start: AIC=202.16 DEXfat ˜ age + waistcirc + hipcirc + elbowbreadth + kneebreadth - elbowbreadth <none> Df Sum of Sq RSS AIC 1 0.97 1034.8 200.23 1033.8 202.16 53 ## ## ## ## ## ## ## ## ## ## ## ## ## ## - age kneebreadth waistcirc hipcirc 1 1 1 1 46.30 58.50 300.52 327.31 1080.1 1092.3 1334.3 1361.1 203.27 204.07 218.28 219.69 Step: AIC=200.23 DEXfat ˜ age + waistcirc + hipcirc + kneebreadth Df Sum of Sq <none> - age - kneebreadth - waistcirc - hipcirc 1 1 1 1 50.30 59.42 306.73 341.39 RSS 1034.8 1085.0 1094.2 1341.5 1376.2 AIC 200.23 201.60 202.19 216.66 218.47 La première variable retirée est elbowbreadth puis la précédure s’arrête. Cela nous conduit donc au même modèle qu’avec la précédure forward. Procédure stepwise : Cette procédure est dans le même esprit que la procédure backward et forward, sauf que nous partons du modèle complet et qu’à chaque étape nous essayons soit de retirer une variable qui est dans le modèle, soit d’insérer une variable qui n’est plus dans le modèle. Nous effectuons cette procédure sur notre jeu de données : modele1<-lm(DEXfat˜.,data=donnees) sm1<-step(modele1,direction="both") ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## Start: AIC=202.16 DEXfat ˜ age + waistcirc + hipcirc + elbowbreadth + kneebreadth - elbowbreadth <none> - age - kneebreadth - waistcirc - hipcirc Df Sum of Sq RSS 1 0.97 1034.8 1033.8 1 46.30 1080.1 1 58.50 1092.3 1 300.52 1334.3 1 327.31 1361.1 AIC 200.23 202.16 203.27 204.07 218.28 219.69 Step: AIC=200.23 DEXfat ˜ age + waistcirc + hipcirc + kneebreadth Df Sum of Sq <none> - age + elbowbreadth - kneebreadth - waistcirc - hipcirc 1 1 1 1 1 50.30 0.97 59.42 306.73 341.39 RSS 1034.8 1085.0 1033.8 1094.2 1341.5 1376.2 AIC 200.23 201.60 202.16 202.19 216.66 218.47 La première variable retirée est elbowbreadth puis la précédure s’arrête. Cela nous conduit donc au même modèle qu’avec la précédure forward et backward. 54 Chapitre 5 Quand les hypothèses ne sont pas respectées... Nous l’avons écrit à maintes reprises : impossible d’interpréter les tests d’une régression linéaire quand les hypothèses qu’elles soient implicites ou explicites - sont violées. Cependant, si la violation d’une ou plusieurs hypothèses demande un travail statistique plus conséquent, il n’y a rien d’insurmontable ! Nous allons voir point par point quelles sont les solutions les plus couramment utilisées pour pallier la non-véracité de chacune des hypothèses. 5.1 Quand la variable explicative est mesurée avec une erreur Nous l’avons dit dans le paragraphe concerné, si la variable explicative est mesurée avec une erreur, nous allons sousestimer l’effet de la relation linéaire. Nous supposerons dans ce paragraphe que nous connaissons la variance σδ2 des erreurs de mesure. Celle-ci peut être estimée par une étude pilote, où plusieurs mesures de la même observations seraient faites. Dans notre cas, cela consisterait à faire mesurer le tour de taille d’un de nos sujets par différentes personnes. Dans le cas où nous pouvons supposer que l’erreur de mesure est indépendante de la mesure (dans notre cas, il s’agit par exemple de vérifier que nous ne commettons pas d’erreur plus importante sur la mesure du tour de taille en fonction des personnes pour lesquelles nous mesurons cette variable), deux cas se présentent : – la variance de la variable explicative est très supérieure à la variance des erreurs de mesure : nous pouvons ne pas prendre en compte les erreurs de mesure, – dans le cas contraire, nous allons utiliser l’algorithme SIMEX qui permet de corriger la valeur de βwaist . Dans notre cas, la variance du vecteur de la variable explicative est de 197. Nous allons supposer, pour l’exemple, supposer que la variance des erreurs est de 20. L’idée de l’algorithme SIMEX est de rajouter du bruit à la variable explicative et de mesurer son influence sur le coefficient de régression. Il suffit ensuite de modéliser l’évolution du coefficient de régression en fonction de la variance du bruit par une fonction linéaire et prédire la valeur qu’aurait ce coefficient si la variance du bruit était nulle (voir Figure 5.1). Voici l’algorithme, détaillé, et annoté : set.seed(123) #Etape 1 : décision de la variance du bruit qui va être ajoutée variance_seq<-seq(5,30,5) #Etape 2 : pour chaque variance, le coefficient beta va etre estimé mille fois variance<- rep(variance_seq,each=1000) nn<-length(variance) pentes<- rep(0,nn) for(i in 1:nn){ pentes[i]<-lm(DEXfat˜I(waistcirc+rnorm(N,0,sqrt(variance[i]))),data=donnees)$coef[2] } 55 #Etape 3 : le vecteur des betas est composé du beta originel, et de la moyenne #pour chacune des mille observations de beta pour chaque niveau de variance betas<-c(droite$coef[2],colMeans(matrix(pentes,nrow=1000))) #Etape 4 : ne pas oublier d'ajouter la variance des erreurs variance<-c(0,seq(5,30,5))+20 #Etape 5 : Nous estimons la liaison entre variance des erreurs #et betas par un modèle linéaire : droite2<-lm(betas˜variance) qplot(variance,betas,xlim=c(0,50), ylim=c(0.60,0.8))+ geom_abline(aes(intercept=coef(droite2)[1],slope=coef(droite2)[2]))+ geom_point(aes(x=0,y=coef(droite2)[1],colour="red"),lwd=6)+ scale_colour_discrete(name ="",labels="prediction") 0.80 ● betas 0.75 ● 0.70 ● prediction ● ● ● 0.65 ● ● ● 0.60 0 10 20 30 40 50 variance F IGURE 5.1 – Evolution du coefficient de régression en fonction de la variance du bruit.. 56 Bibliographie [1] Frédéric Bertrand and Myriam Maumy-Bertrand. Initiation à la statistique avec R. Dunod, 2010. [2] Samprit Chatterjee and Ali S Hadi. Regression analysis by example. John Wiley & Sons, 2013. [3] Pierre Dagnelie. Statistique théorique et appliquée, volume 2. De Boeck Université, 1998. [4] Julian J Faraway. Extending the linear model with R : generalized linear, mixed effects and nonparametric regression models. CRC press, 2004. [5] Julian J Faraway. Linear models with R. CRC press, 2004. 57