La première partie vise à présenter les caractéristiques distinctives des méthodes de régression à travers un exemple fictif récurrent : l’examen de la relation entre le poids corporel et l’activité physique régulière. Le cours se déroule en trois phases :
L’échantillon de données utilisé a été entièrement simulé à l’aide des fonctions rbinom() et rnorm() de R (taper ?rbinom ou ?rnorm dans R pour en savoir plus). Ces fonctions font appel à un générateur de nombres pseudo-aléatoires qu’il est possible d’initialiser avec la fonction set.seed() (lien pour en savoir plus sur la génération de nombres aléatoires sous R).
# Initialisation du générateur de nombres pseudo-aléatoires de R
set.seed(1)
# Taille de l'échantillon simulé
n <- 100
# Simulation des variables
femme <- rbinom(n, 1, 0.5)
sport <- femme*rbinom(n, 1, 0.65) + (1-femme)*rbinom(n,1,0.45)
taille <- (1-femme)*rnorm(n,177,8) + femme*rnorm(n,165,8)
imc <- sport*rnorm(n,22,1) + (1-sport)*rnorm(n,26,1)
poids <- imc*(taille/100)**2
regime <- (imc > 23 + rnorm(n,0,2.5))*1
l.poids <- regime*(poids + rnorm(n,2,2)) + (1-regime)*(poids + rnorm(n,0,2))
# Arrondi pour les variables numériques
taille <- round(taille,0)
poids <- round(poids,0)
l.poids <- round(l.poids,0)
# Affichage des 10 premiers individus
data.frame(poids,taille,sport)[1:10,]
## poids taille sport
## 1 88 181 0
## 2 79 177 0
## 3 61 164 1
## 4 65 163 0
## 5 67 165 0
## 6 69 174 1
## 7 44 146 1
## 8 63 170 1
## 9 71 168 0
## 10 80 192 1
Étant donné le lien substantiel entre la taille et le poids des individus, notre objectif est de prendre en compte l’effet de la taille lors de l’analyse de la relation entre le poids et l’activité physique régulière.
Ainsi, nous amorçons notre étude en examinant la relation entre le poids et la taille. Étant toutes deux des variables quantitatives, nous pouvons représenter leur association à travers un nuage de points et synthétiser cette relation en utilisant le coefficient de corrélation linéaire de Pearson.
# Construction du nuage de points
plot(taille,poids,xlab="Taille en cm",ylab="Poids en kg")
# Ajout d'un titre général
title(main="Relation entre le poids et la taille des individus")
# Calcul du coefficient de corrélation avec la fonction cor()
cor(taille,poids)
## [1] 0.8645734
On peut également estimer le modèle de régression linéaire simple suivant:
L’équation de régression simple (\(m1\)) est représentée par :
\[ poids_i = \beta_0 + \beta_1 \times taille_i + \epsilon_i \]
où :
Pour ce faire, on utilise la fonction lm(): on l’utilise pour effectuer l’estimation puis on stocke ses résultats dans un objet (m1 dans l’exemple) ; la fonction summary permet ensuite d’afficher une synthèse de ces résultats.
# Estimation du modèle m1 et affectation à l'objet m1
m1 <- lm(poids ~ taille)
# Résumé du modèle m1
summary(m1)
##
## Call:
## lm(formula = poids ~ taille)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.204 -5.020 1.726 4.492 16.837
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -107.16662 10.46301 -10.24 <2e-16 ***
## taille 1.04095 0.06112 17.03 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.483 on 98 degrees of freedom
## Multiple R-squared: 0.7475, Adjusted R-squared: 0.7449
## F-statistic: 290.1 on 1 and 98 DF, p-value: < 2.2e-16
En moyenne dans l’échantillon, une taille supérieure de 1 cm est
associée à un poids supérieur de 1,04 kg. Les valeurs prédites par le
modèle sont stockées dans l’objet m1 et accessibles via
l’entrée fitted.value.
# Récupération et affichage des valeurs prédites par m1
predict1 <- round(m1$fitted.values,2)
data.frame(poids,taille,sport,predict1)[1:10,]
## poids taille sport predict1
## 1 88 181 0 81.24
## 2 79 177 0 77.08
## 3 61 164 1 63.55
## 4 65 163 0 62.51
## 5 67 165 0 64.59
## 6 69 174 1 73.96
## 7 44 146 1 44.81
## 8 63 170 1 69.79
## 9 71 168 0 67.71
## 10 80 192 1 92.70
On peut également récupérer la valeur des coefficients de m1 pour tracer la droite correspondant à ces valeurs prédites :
# Construction du nuage de points
plot(taille,poids,xlab="Taille en cm",ylab="Poids en kg")
# Récupération des valeurs des coefficients avec la fonction (coef())
m1beta0 <- coef(m1)[1]
m1beta1 <- coef(m1)[2]
# Ajout d'une droite d'équation y = m1beta0 + m1beta1 * x
abline(a = m1beta0, b = m1beta1)
# Ajout d'un titre général
title(main="Représentation graphique de la prédiction du modèle 1")
Lorsque l’on compare la moyenne du poids des individus en fonction de leur pratique ou non d’une activité physique régulière, la distinction se manifeste clairement, avec une différence de poids notable de -18 kg pour ceux qui s’adonnent à une activité physique régulière.
# Exemple de création d'un data.frame avec les moyennes
df <- data.frame(
sport = c(0, 1),
poids = as.numeric(by(poids, sport, mean)),
taille = as.numeric(by(taille, sport, mean))
)
# Affichage du data.frame
print(df)
## sport poids taille
## 1 0 78.76364 174.2364
## 2 1 60.84444 166.7556
Cependant, étant donné que les individus pratiquant une activité physique régulière sont en moyenne plus petits que ceux qui n’en pratiquent pas (avec une différence de -8 cm), il est probable que la force de cette relation serait atténuée si nous prenions en compte la taille.
Pour explorer davantage cette dynamique, nous pouvons retourner au graphique initial et différencier les individus en fonction de leur pratique ou non d’une activité physique régulière.
# Construction du nuage de points
plot(taille,poids,pch=sport,xlab="Taille en cm",ylab="Poids en kg")
# Ajout de la légende
legend("topleft",legend=c("Pas d'activité physique régulière","Activité physique régulière"),pch=c(0,1))
# Ajout d'un titre général
title(main="Poids, taille et activité physique des individus")
Cette représentation semble indiquer l’idée que l’activité physique régulière est associée, à taille égale, à un poids moindre. Pour approfondir cette analyse, on met en oeuvre un modèle de régression multiple :
L’équation de régression multiple (\(m2\)) est représentée par :
\[ poids_i = \beta_0 + \beta_1 \times taille_i + \beta_2 \times sport_i + \epsilon_i \]
où :
# Estimation du modèle m2
m2 <- lm(poids ~ taille + sport)
# Résumé du modèle m2
summary(m2)
##
## Call:
## lm(formula = poids ~ taille + sport)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.1134 -2.4723 -0.5312 2.4404 13.1832
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -69.48486 6.24333 -11.13 <2e-16 ***
## taille 0.85085 0.03573 23.82 <2e-16 ***
## sport -11.55417 0.76182 -15.17 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.549 on 97 degrees of freedom
## Multiple R-squared: 0.9251, Adjusted R-squared: 0.9236
## F-statistic: 599 on 2 and 97 DF, p-value: < 2.2e-16
L’estimation du coefficient \(\beta_2\) suggère que la pratique régulière d’une activité physique est associée à un poids moyen environ 11,6 kg inférieur. Cette valeur est inférieure aux 18 kg indiqués par les statistiques univariées, en raison de l’influence de la taille sur la relation entre l’activité physique régulière et le poids. En effet, dans l’échantillon, les personnes pratiquant une activité physique régulière sont en moyenne plus petites de 8 cm que celles qui ne le font pas.
Une approche supplémentaire consiste à calculer les valeurs prédites par le modèle et à les intégrer graphiquement pour une meilleure compréhension.
predict2 <- round(m2$fitted.values,2)
data.frame(poids,taille,sport,predict1,predict2)[1:10,]
## poids taille sport predict1 predict2
## 1 88 181 0 81.24 84.52
## 2 79 177 0 77.08 81.12
## 3 61 164 1 63.55 58.50
## 4 65 163 0 62.51 69.20
## 5 67 165 0 64.59 70.90
## 6 69 174 1 73.96 67.01
## 7 44 146 1 44.81 43.18
## 8 63 170 1 69.79 63.60
## 9 71 168 0 67.71 73.46
## 10 80 192 1 92.70 82.32
Le modèle étant de meilleure qualité que le précédent, les valeurs prédites sont en général plus proches des valeurs effectives.
# Construction du nuage de points
plot(taille,poids,pch=sport,xlab="Taille en cm",ylab="Poids en kg")
# Ajout des droites représentant la prédiction du modèle m2
abline(a = coef(m2)[1], b = coef(m2)[2])
abline(a = coef(m2)[1] + coef(m2)[3], b = coef(m2)[2],lty=2)
# Ajout d'une légende mixte
legend("topleft",legend=c("Pas d'activité physique régulière","Activité physique régulière"),pch=c(0,1),lty=c(1,2))
# Ajout d'un titre général
title(main="Représentation graphique de la prédiction du modèle 2")
Au-delà de la valeur des coefficients, il est possible d’interpréter la significativité des coefficients à l’aide de leur p-valeur ou d’un intervalle de confiance.
On cherche enfin à mesurer la relation entre poids et régimes amaigrissants, en contrôlant par la taille et par l’activité physique régulière. Le modèle de régression multiple que l’on estime est donc le suivant :
L’équation de régression multiple (\(m3\)) est représentée par :
\[ poidsi = \beta_0 + \beta_1 \times taillei + \beta_2 \times sporti + \beta_3 \times regimei + \epsilon_i \]
où :
m3 <- lm(poids ~ taille + sport + regime)
summary(m3)
##
## Call:
## lm(formula = poids ~ taille + sport + regime)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.3520 -2.5752 -0.3603 2.3478 12.8767
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -70.15622 6.09121 -11.518 <2e-16 ***
## taille 0.84487 0.03491 24.204 <2e-16 ***
## sport -10.56913 0.84272 -12.542 <2e-16 ***
## regime 2.04703 0.82824 2.472 0.0152 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.459 on 96 degrees of freedom
## Multiple R-squared: 0.9296, Adjusted R-squared: 0.9274
## F-statistic: 422.4 on 3 and 96 DF, p-value: < 2.2e-16
Le coefficient associé au fait d’avoir suivi un régime amaigrissant au cours des 12 derniers mois est estimé à 2,05. En d’autres termes, en moyenne, les individus ayant suivi un régime amaigrissant au cours de cette période pèsent 2,05 kg de plus que ceux qui n’ont pas suivi de régime.
Une observation intrigante émerge lorsque l’on interroge les personnes affirmant avoir suivi un régime amaigrissant au cours des 12 derniers mois. Bien que ces personnes déclarent avoir perdu du poids, cette déclaration est contredite par la comparaison des poids moyens au moment de l’enquête et un an auparavant, mesurée par (la variable ‘l.poids’) :
data.frame(
regime=c("Pas de régime amaigrissant","Régime amaigrissant")
, l.poids=as.numeric(by(l.poids,regime,mean))
, poids=as.numeric(by(poids,regime,mean))
, delta=as.numeric(by(poids,regime,mean)-by(l.poids,regime,mean))
)
## regime l.poids poids delta
## 1 Pas de régime amaigrissant 63.07692 63.43590 0.3589744
## 2 Régime amaigrissant 76.80328 75.34426 -1.4590164
Ce phénomène met en lumière le mécanisme de causalité inverse, comme expliqué dans le cours : bien que les personnes ayant suivi un régime amaigrissant individuellement déclarent avoir perdu du poids, le coefficient estimé par la régression est globalement positif. Cela s’explique par le fait que, par ailleurs, les personnes en surpoids ont une probabilité plus élevée de suivre de tels régimes.
Cette situation souligne la pertinence de l’expression “corrélation n’est pas causalité”. Le modèle de régression ne révèle que des associations statistiques, et non des relations de cause à effet. Pour évaluer l’efficacité des régimes en contournant ce type d’endogénéité, une approche possible consiste à utiliser des données de panel, comprenant des observations répétées dans le temps. Cela permet de mieux tenir compte des variations individuelles au fil du temps et de mieux isoler les effets causaux des régimes alimentaires.