La régression logistique est un genre de régression permettant de prédire le comportement d’une variable qualitative en fonction de plusieurs variables qualitatives ou quantitatives. La régression logistique permet d’effectuer un raisonnement dit “toutes choses étant égales par ailleurs”, elle a pour but d’isoler les effets des variables explicatives sur une variable a expliquer.
“Parler de techniques « toutes choses égales par ailleurs » fait appel à l’idée que si un phénomène social est dû à plusieurs causes, il peut être intéressant de voir l’effet propre de chacune des causes, indépendamment des autres.[…] [S]i le fait d’avoir un fort niveau d’étude encourage à la lecture, et si l’on sait que les femmes lisent plus que les hommes : comme les deux aspects vont ensemble, on souhaite avoir une méthode qui neutralise l’effet de sexe pour isoler l’effet de niveau d’étude (et inversement qui neutralise l’effet de niveau d’étude pour avoir l’effet de sexe).”1
Nous allons voir ici comment l’employer pour modéliser le comportement d’une variable binaire c’est à dire, une variable qualitative à deux modalités : une variable pour laquelle il n’existe que deux réponses possibles, comme par exemple, dans un questionnaire une question demandant si les répondants font du sport ou non.
Pour la régression linéaire simple on a modélisé les données avec une équation du type \(y = ax + b\) :
Pour la régression logistique on va calculer une équation de type \(y = ax_1 + bx_2 + cx_3\) :
En reprenant l’enquête employée dans le tutoriel sur la régression logistique de Jospeh Larmarrange, nous allons étudier la pratique d’un sport au regard de de l’âge, du sexe, du niveau d’étude, de la pratique religieuse et du nombre moyen d’heures passées à regarder la télévision par jour. En d’autres termes nous allons chercher à savoir ce qui, toute chose égale par ailleurs, explique le mieux la pratique d’un sport.
Dans notre exemple, “pratique un sport” est donc la variable a expliquer et l’âge, le sexe, le niveau d’étude, la pratique religieuse et le fait de regarder la TV sont les variables explicatives.
Nous allons donc employer une base de données extraite de l’enquête histoire de vie réalisée par l’INSEE en 2003. Le fichier contient 2000 individus et 6 variables. Vous pouvez le télécharger en cliquant ici.
On a importé les données et on les a mis dans un objet nommé d2.
str(d2)
## 'data.frame': 2000 obs. of 6 variables:
## $ sport : Factor w/ 2 levels "Non","Oui": 1 2 2 2 1 2 1 1 1 2 ...
## $ sexe : Factor w/ 2 levels "Homme","Femme": 2 2 1 1 2 2 2 1 2 1 ...
## $ grpage : Factor w/ 4 levels "[16,25)","[25,45)",..: 2 1 3 2 4 2 3 3 1 2 ...
## $ etud : Factor w/ 4 levels "Primaire","Secondaire",..: 4 NA 1 4 1 3 1 3 NA 3 ...
## $ relig : Factor w/ 6 levels "Pratiquant regulier",..: 4 4 4 3 1 4 3 4 3 2 ...
## $ heures.tv: num 0 1 0 2 3 2 2.9 1 2 2 ...
Voyons maintenant les première lignes de la base grâce à la commande
head()
.
sport | sexe | grpage | etud | relig | heures.tv |
---|---|---|---|---|---|
Non | Femme | [25,45) | Supérieur | Ni croyance ni appartenance | 0 |
Oui | Femme | [16,25) | NA | Ni croyance ni appartenance | 1 |
Oui | Homme | [45,65) | Primaire | Ni croyance ni appartenance | 0 |
Oui | Homme | [25,45) | Supérieur | Appartenance sans pratique | 2 |
Non | Femme | [65,99] | Primaire | Pratiquant regulier | 3 |
Oui | Femme | [25,45) | Technique/Professionnel | Ni croyance ni appartenance | 2 |
Le premier répondant ne pratique pas de sport, est une femme, a entre 25 et 45 ans, a fait des étude dans le supérieur, n’a pas de croyances religieuses et ne regarde pas la télévision. Le deuxième fait du sport, est une femme qui a entre 16 et 25 ans, on ne connaît pas sont niveau d’étude, elle n’a pas de croyances religieuses et regarde la télévision une heure en moyenne par jour. Et ainsi de suite…
Voyons maintenant les tri à plats, c’est à dire un résumé de chacune des variables :
summary(d2)
## sport sexe grpage etud
## Non:1277 Homme: 899 [16,25):169 Primaire :466
## Oui: 723 Femme:1101 [25,45):706 Secondaire :387
## [45,65):745 Technique/Professionnel:594
## [65,99]:380 Supérieur :441
## NA's :112
##
##
## relig heures.tv
## Pratiquant regulier :266 Min. : 0.000
## Pratiquant occasionnel :442 1st Qu.: 1.000
## Appartenance sans pratique :760 Median : 2.000
## Ni croyance ni appartenance:399 Mean : 2.247
## Rejet : 93 3rd Qu.: 3.000
## NSP ou NVPR : 40 Max. :12.000
## NA's :5
Sur les 2000 individus 1277 ne pratique pas de sport et 723 en font, 899 sont des hommes le reste sont des femmes, 169 ont entre 16 et 25 ans au moment de l’enquête, etc.
Représentons chaque variables pas un graphique grâce aux commandes
pie()
, barplot()
et hist()
Maintenant que nous avons regardé rapidement les données nous allons chercher à savoir quelles sont celles influençant la pratique d’un sport.
Pour réaliser la regression logistique nous allons employer la
commande glm()
et mettre le résultat du calcul dans un
objet que l’on nomme reg
.
reg <- glm(sport ~ sexe + grpage + etud + relig + heures.tv, data = d2, family = binomial(logit))
Dans la commande glm()
on indique la formule
sport ~ sexe + grpage + etud + relig + heures.tv
qui
signifie : explique la variable “sport” en fonction des variables
“sexe”, “age”, “étude”, “religion”, et “télévision”. La variable sport
est la variable a expliquer et les autres variables figurant dans la
formaule sont les variables explicatives.
On indique ensuite sur quelles données on applique le calcul
data = d2
et on lui indique qu’il s’agit d’une régression
logistique binomial(logit)
.
Le résultat du calcul se trouve dans l’objet reg
que
l’on peut consulter grâce à la commande summary()
summary(reg)
##
## Call:
## glm(formula = sport ~ sexe + grpage + etud + relig + heures.tv,
## family = binomial(logit), data = d2)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.687 -0.888 -0.512 1.036 2.418
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.365890 0.354593 -1.032 0.302138
## sexeFemme -0.370927 0.109143 -3.399 0.000677 ***
## grpage[25,45) -0.415192 0.251623 -1.650 0.098932 .
## grpage[45,65) -1.089470 0.257836 -4.225 2.38e-05 ***
## grpage[65,99] -1.374148 0.290661 -4.728 2.27e-06 ***
## etudSecondaire 0.943494 0.197497 4.777 1.78e-06 ***
## etudTechnique/Professionnel 1.055889 0.190103 5.554 2.79e-08 ***
## etudSupérieur 1.883470 0.195351 9.641 < 2e-16 ***
## religPratiquant occasionnel -0.100080 0.194664 -0.514 0.607173
## religAppartenance sans pratique -0.003265 0.179760 -0.018 0.985507
## religNi croyance ni appartenance -0.254390 0.200616 -1.268 0.204783
## religRejet -0.335427 0.296010 -1.133 0.257146
## religNSP ou NVPR 0.008889 0.410482 0.022 0.982724
## heures.tv -0.125536 0.034565 -3.632 0.000281 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2407.2 on 1882 degrees of freedom
## Residual deviance: 2087.0 on 1869 degrees of freedom
## (117 observations deleted due to missingness)
## AIC: 2115
##
## Number of Fisher Scoring iterations: 4
On peut reconnaître ici le même genre de résultat que pour la
régression linéaire. Ce qui nous intéresse en premier lieu ce sont les
coefficients de régression. On les affiches grâce à la commande
coef()
appliquée sur l’objet dans lequel figure la
régression (‘reg’ dans notre exemple), mais ils ne sont pas
interpretables en l’état il faut leur appliquer la fonction
exponentielle ainsi.
exp(coef(reg))
## (Intercept) sexeFemme
## 0.6935791 0.6900941
## grpage[25,45) grpage[45,65)
## 0.6602135 0.3363947
## grpage[65,99] etudSecondaire
## 0.2530550 2.5689412
## etudTechnique/Professionnel etudSupérieur
## 2.8745284 6.5762829
## religPratiquant occasionnel religAppartenance sans pratique
## 0.9047655 0.9967400
## religNi croyance ni appartenance religRejet
## 0.7753891 0.7150330
## religNSP ou NVPR heures.tv
## 1.0089282 0.8820239
R affiche chaques modalités figurant dans la formule avec une valeur :
sexefemme
: 0,69grpage[25-45)
: 0,66grpage[45,65)
: 0,33Ces valeures sont appellées des Odds ratio, pour les interpréter il faut estimer si ils sont plus petit ou plus grand que \(1\) :
On voit ici que la modalité etudSupérieur
a un
coefficient égal a 6,57. On va interpréter cette valeur en disant :
“Toutes choses égales par ailleurs, les répondants faisant
des études supérieur ont 6,5 fois plus de chances des faire du sport que
les autres”. On peut aussi dire “Dans l’échantillon faire
des études supérieur multiplie par 6,5 les chances de faire du
sport”.
Pour la modalité grpage[45-65)
, qui représente la classe
d’âge 45-65 ans on voit que l’Odd ratio est égal à 0,25. Comme
multiplier par 0,25 revient à multiplier par 1/4 ce qui est la même
chose que diviser par 4, on va donc l’interpréter ainsi : “le fait
d’appartenir à la classe d’âge 45-65 ans divise par 4 les chances de
faire du sport”.
Ces interprétations constituent l’objectif principale de la régression linéaire.
Afin de rendre cette interprétation plus robuste nous devons consulter les intervalles de confiance des coefficients, ce qui correspond globalement à une marge d’erreurs donné pour chaque coefficient. On les affiches ainsi :
exp(confint(reg))
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) 0.3455859 1.3900306
## sexeFemme 0.5569178 0.8544113
## grpage[25,45) 0.4017418 1.0802956
## grpage[45,65) 0.2021701 0.5569551
## grpage[65,99] 0.1424857 0.4461755
## etudSecondaire 1.7526049 3.8061107
## etudTechnique/Professionnel 1.9924733 4.2031165
## etudSupérieur 4.5133661 9.7174768
## religPratiquant occasionnel 0.6185059 1.3276229
## religAppartenance sans pratique 0.7021228 1.4216262
## religNi croyance ni appartenance 0.5236403 1.1504813
## religRejet 0.3974974 1.2715124
## religNSP ou NVPR 0.4395959 2.2191447
## heures.tv 0.8235449 0.9431143
Pour reprendre l’exemple des répondants ayant un niveau d’étude dans le supérieur on a vu qu’ils ont 6,5 fois plus de chances que les autres de faire du sport et l’intervalle de confiance est de 4,5 à 9,1. On pourrait donc aussi interpréter en disant qu’ils ont au moins 4,5 fois plus de chances de faire au sport et au plus 9 fois plus de chances.
Il est aussi utile d’identifier les variables explicatives ayant peu
d’importance dans le modèle, celles qui ont peu d’influence sur la
variable à expliquer. La méthode consiste à reproduire la régression
plusieurs fois en enlevant chaque variable une fois, la commande
permettant de le faire automatiquement est step()
.
reg2 <- step(reg)
## Start: AIC=2115.03
## sport ~ sexe + grpage + etud + relig + heures.tv
##
## Df Deviance AIC
## - relig 5 2091.3 2109.3
## <none> 2087.0 2115.0
## - sexe 1 2098.6 2124.6
## - heures.tv 1 2100.8 2126.8
## - grpage 3 2139.2 2161.2
## - etud 3 2198.6 2220.6
##
## Step: AIC=2109.33
## sport ~ sexe + grpage + etud + heures.tv
##
## Df Deviance AIC
## <none> 2091.3 2109.3
## - sexe 1 2102.0 2118.0
## - heures.tv 1 2105.0 2121.0
## - grpage 3 2141.5 2153.5
## - etud 3 2203.0 2215.0
La commande test plusieurs modèles en enlevant une variable à chaque
étape. Le colonne AIC
permet de choisir quelle régression est la plus efficace, il s’agit
d’une mesure de la qualité d’un modèle statistique. C’est la valeur de
ce critère la plus petite qui indique le meilleurs modèle, dans notre
cas il s’agit de la suppression de “relig” qui lorsqu’elle n’appairait
pas dans le modèle minimise le critère AIC (2109,3), la variable qui
représente les pratiques religieuses a donc peu d’effet sur notre
modèle, il n’est pas nécessaire qu’elle soit prise en compte pour
expliquer la pratique sportive. On créer ainsi une nouvelle régression
plus efficace que l’on peut consulter avec la commande
summary()
:
summary(reg2)
##
## Call:
## glm(formula = sport ~ sexe + grpage + etud + heures.tv, family = binomial(logit),
## data = d2)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.6328 -0.8989 -0.5020 1.0420 2.3826
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.4936 0.3219 -1.533 0.125227
## sexeFemme -0.3511 0.1076 -3.263 0.001100 **
## grpage[25,45) -0.3894 0.2500 -1.557 0.119358
## grpage[45,65) -1.0383 0.2548 -4.075 4.61e-05 ***
## grpage[65,99] -1.3099 0.2868 -4.568 4.93e-06 ***
## etudSecondaire 0.9240 0.1969 4.693 2.69e-06 ***
## etudTechnique/Professionnel 1.0353 0.1891 5.476 4.36e-08 ***
## etudSupérieur 1.8715 0.1946 9.620 < 2e-16 ***
## heures.tv -0.1247 0.0344 -3.625 0.000289 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2407.2 on 1882 degrees of freedom
## Residual deviance: 2091.3 on 1874 degrees of freedom
## (117 observations deleted due to missingness)
## AIC: 2109.3
##
## Number of Fisher Scoring iterations: 4
Pour finir, différentes bibliothèques de fonction existent permettant de représenter graphiquement la régression logistique.
Dans le package forestmodel
la commande du même nom
représente les Odds ratio et les p-value associées.
library(forestmodel)
## Loading required package: ggplot2
forest_model(reg)
Il existe aussi la possibilité de représenter le comportement de chaque variable explicatives sur la variable a expliquer.
library(effects)
plot(allEffects(reg))
Pour réaliser une régression logistique, il est nécessaire d’avoir un nombre suffisant de données : au moins 10 fois plus d’individus que de modalités de variables explicatives.
Voir en vidéo le cours de Joseph Larmarrange datant de 2021 : https://www.youtube.com/watch?v=-bdMv2aAqUY ou bien la page de tutoriel : https://larmarange.github.io/analyse-R/regression-logistique.html#pr%C3%A9paration-des-donn%C3%A9es
La page Wikipédia : Régression logistique. (2022). In Wikipédia. https://fr.wikipedia.org/w/index.php?title=R%C3%A9gression_logistique&oldid=196346123
Cibois, P. (2014). Les techniques d’analyse « toutes choses égales par ailleurs ». In Les méthodes d’analyse d’enquêtes. ENS Éditions. http://books.openedition.org/enseditions/1463↩︎
Comment savoir si les Odds ratio sont éloignés de 1 ?
Pour savoir si un odd ratio diffère significativement de 1, on regarde la colonne
Pr(>|z|)
obtenue avecsummary()
.On voit que les modalités s’éloignant le plus de 1 sont celles qui, dans la colonnes
Pr(>|z|)
ont une p-value plus petite que 0,05 % (indiquées par***
) : sexeFemme, grpage[45,65), grpage[65,99], les trois modalitésetud
, et la variablesheures.tv
.On peut tout afficher ainsi :