Les transformations logarithmiques sont souvent recommandées pour les données asymétriques, telles que les mesures monétaires ou certaines mesures biologiques et démographiques. La transformation logarithmique des données a généralement pour effet d’étaler les amas de données et de rassembler les données étalées. Par exemple, vous trouverez ci-dessous un histogramme des superficies des 50 États américains. Il est biaisé vers la droite en raison de l’Alaska, de la Californie, du Texas et de quelques autres.
hist(state.area)
Après une transformation logarithmique, remarquez que l’histogramme est plus ou moins symétrique. Nous avons rapproché les grands états et espacé les petits états.
hist(log(state.area))
Pourquoi faire cela ? Une des raisons est de rendre les données plus « normales », ou symétriques. Si nous effectuons une analyse statistique qui suppose la normalité, une transformation logarithmique pourrait nous aider à répondre à cette hypothèse. Une autre raison est de respecter l’hypothèse de variance constante dans le contexte de la modélisation linéaire. Une autre raison encore est d’aider à rendre une relation non linéaire plus linéaire. Mais s’il est facile de mettre en œuvre une transformation logarithmique, cela peut compliquer l’interprétation. Disons que nous ajustons un modèle linéaire avec une variable dépendante transformée en logarithme. Comment interpréter les coefficients ? Que se passe-t-il si nous avons des variables dépendantes et indépendantes transformées en logarithme ? C’est le sujet de cet article.
D’abord, nous fournirons une recette d’interprétation pour ceux qui veulent juste une aide rapide. Ensuite, nous creuserons un peu plus ce que nous disons de notre modèle lorsque nous transformons nos données en logarithme.
Règles d’interprétation
OK, vous avez effectué une régression/adaptation d’un modèle linéaire et certaines de vos variables sont log-transformées.
- Seule la variable dépendante/réponse est log-transformée. Exponentiez le coefficient, soustrayez un de ce nombre et multipliez par 100. Cela donne le pourcentage d’augmentation (ou de diminution) de la réponse pour chaque augmentation d’une unité de la variable indépendante. Exemple : le coefficient est de 0,198. (exp(0,198) – 1) * 100 = 21,9. Pour chaque augmentation d’une unité de la variable indépendante, notre variable dépendante augmente d’environ 22%.
- Seule la ou les variables indépendantes/prédicteurs sont log-transformées. Divisez le coefficient par 100. Cela nous indique qu’une augmentation de 1% de la variable indépendante augmente (ou diminue) la variable dépendante de (coefficient/100) unités. Exemple : le coefficient est de 0,198. 0.198/100 = 0.00198. Pour chaque augmentation de 1% de la variable indépendante, notre variable dépendante augmente d’environ 0,002. Pour une augmentation de x pour cent, multipliez le coefficient par log(1,x). Exemple : Pour chaque augmentation de 10 % de la variable indépendante, notre variable dépendante augmente d’environ 0,198 * log(1,10) = 0,02.
- La variable dépendante/réponse et la ou les variables indépendantes/prédicteurs sont toutes deux transformées en logarithme. Interprétez le coefficient comme le pourcentage d’augmentation de la variable dépendante pour chaque augmentation de 1% de la variable indépendante. Exemple : le coefficient est de 0,198. Pour chaque augmentation de 1% de la variable indépendante, notre variable dépendante augmente d’environ 0,20%. Pour obtenir le pourcentage d’augmentation x, calculez 1,x à la puissance du coefficient, soustrayez 1 et multipliez par 100. Exemple : Pour chaque augmentation de 20 % de la variable indépendante, notre variable dépendante augmente d’environ (1,20 0,198 – 1) * 100 = 3,7 %.
Ce que les transformations logarithmiques signifient vraiment pour vos modèles
Il est agréable de savoir comment interpréter correctement les coefficients pour les données transformées en logarithme, mais il est important de savoir ce que votre modèle implique exactement lorsqu’il inclut des données transformées en logarithme. Pour mieux comprendre, utilisons R pour simuler certaines données qui nécessiteront des transformations logarithmiques pour une analyse correcte. Nous resterons simples avec une variable indépendante et des erreurs normalement distribuées. Nous allons d’abord examiner une variable dépendante transformée en logarithme.
x <- seq(0.1,5,length.out = 100)set.seed(1)e <- rnorm(100, mean = 0, sd = 0.2)
La première ligne génère une séquence de 100 valeurs de 0,1 à 5 et l’affecte à x. La ligne suivante fixe la graine du générateur de nombres aléatoires à 1. Si vous faites de même, vous obtiendrez les mêmes données générées aléatoirement que nous avons obtenues lorsque vous exécutez la ligne suivante. Le code rnorm(100, mean = 0, sd = 0.2)
génère 100 valeurs à partir d’une distribution normale avec une moyenne de 0 et un écart-type de 0,2. Ce sera notre « erreur ». C’est l’une des hypothèses de la régression linéaire simple : nos données peuvent être modélisées par une ligne droite, mais elles seront décalées d’une certaine quantité aléatoire que nous supposons provenir d’une distribution normale avec une moyenne de 0 et un certain écart-type. Nous attribuons notre erreur à e.
Nous sommes maintenant prêts à créer notre variable dépendante transformée en logarithme. Nous choisissons un intercept (1,2) et une pente (0,2), que nous multiplions par x, puis nous ajoutons notre erreur aléatoire, e. Enfin, nous exponentialisons.
y <- exp(1.2 + 0.2 * x + e)
Pour voir pourquoi nous exponentions, remarquez ce qui suit :
$$\text{log}(y) = \beta_0 + \beta_1x$
$$\text{exp}(\text{log}(y)) = \text{exp}(\beta_0 + \beta_1x)$$
$y = \text{exp}(\beta_0 + \beta_1x)$$
Donc une variable dépendante transformée en logarithme implique notre modèle linéaire simple.implique que notre modèle linéaire simple a été exponentialisé. Rappelez-vous de la règle du produit des exposants que nous pouvons réécrire la dernière ligne ci-dessus comme
$$y = \text{exp}(\beta_0) \text{exp}(\beta_1x)$$
Cela implique en outre que notre variable indépendante a une relation multiplicative avec notre variable dépendante au lieu de la relation additive habituelle. D’où la nécessité d’exprimer en pourcentage l’effet d’une variation d’une unité de x sur y.
Si nous ajustons le bon modèle aux données, remarquez que nous faisons un assez bon travail pour récupérer les vraies valeurs des paramètres que nous avons utilisés pour générer les données.
lm1 <- lm(log(y) ~ x)summary(lm1)Call:lm(formula = log(y) ~ x)Residuals: Min 1Q Median 3Q Max -0.4680 -0.1212 0.0031 0.1170 0.4595 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.22643 0.03693 33.20 <2e-16 ***x 0.19818 0.01264 15.68 <2e-16 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.1805 on 98 degrees of freedomMultiple R-squared: 0.7151,Adjusted R-squared: 0.7122 F-statistic: 246 on 1 and 98 DF, p-value: < 2.2e-16
L’ordonnée à l’origine estimée de 1,226 est proche de la vraie valeur de 1,2. La pente estimée de 0,198 est très proche de la vraie valeur de 0,2. Enfin l’erreur standard résiduelle estimée de 0,1805 n’est pas trop éloignée de la vraie valeur de 0,2.
Rappelons que pour interpréter la valeur de la pente, nous devons l’exponentialiser.
exp(coef(lm1)) x 1.219179
Cela veut dire que chaque augmentation d’une unité de x est multipliée par environ 1,22. Ou en d’autres termes, pour chaque augmentation d’une unité de x, y augmente d’environ 22%. Pour obtenir 22%, soustrayez 1 et multipliez par 100.
(exp(coef(lm1)) - 1) * 100 x 21.91786
Et si nous ajustons juste y au lieu de log(y) ? Comment pourrions-nous savoir que nous devrions envisager une transformation logarithmique ? Le simple fait de regarder les coefficients ne va pas vous dire grand chose.
lm2 <- lm(y ~ x)summary(lm2)Call:lm(formula = y ~ x)Residuals: Min 1Q Median 3Q Max -2.3868 -0.6886 -0.1060 0.5298 3.3383 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 3.00947 0.23643 12.73 <2e-16 ***x 1.16277 0.08089 14.38 <2e-16 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 1.156 on 98 degrees of freedomMultiple R-squared: 0.6783,Adjusted R-squared: 0.675 F-statistic: 206.6 on 1 and 98 DF, p-value: < 2.2e-16
Sûr, puisque nous avons généré les données, nous pouvons voir que les coefficients sont très loin et que l’erreur standard résiduelle est beaucoup trop élevée. Mais dans la vie réelle, vous ne le saurez pas ! C’est pourquoi nous faisons des diagnostics de régression. Une hypothèse clé à vérifier est la variance constante des erreurs. Nous pouvons le faire à l’aide d’un graphique échelle-localisation. Voici le tracé pour le modèle que nous venons d’exécuter sans transformer logiquement y.
plot(lm2, which = 3) # 3 = Scale-Location plot
Notez que les résidus normalisés ont une tendance à la hausse. C’est un signe que l’hypothèse de variance constante a été violée. Comparez ce tracé au même tracé pour le modèle correct.
plot(lm1, which = 3)
La ligne de tendance est régulière et les résidus sont uniformément dispersés.
Cela signifie-t-il que vous devez toujours transformer en logarithme votre variable dépendante si vous soupçonnez que l’hypothèse de variance constante a été violée ? Pas nécessairement. La variance non constante peut être due à d’autres mauvaises spécifications de votre modèle. Réfléchissez également à ce que signifie la modélisation d’une variable dépendante transformée en logarithme. Cela signifie qu’elle a une relation multiplicative avec les prédicteurs. Cela vous semble-t-il juste ? Utilisez votre jugement et votre expertise en la matière.
Envisageons maintenant des données avec une variable prédicteur indépendante transformée en logarithme. Ceci est plus facile à générer. Nous transformons simplement x en logarithme.
y <- 1.2 + 0.2*log(x) + e
Encore une fois, nous ajustons d’abord le modèle correct et nous remarquons qu’il fait un excellent travail pour récupérer les vraies valeurs que nous avons utilisées pour générer les données :
lm3 <- lm(y ~ log(x))summary(lm3)Call:lm(formula = y ~ log(x))Residuals: Min 1Q Median 3Q Max -0.46492 -0.12063 0.00112 0.11661 0.45864 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.22192 0.02308 52.938 < 2e-16 ***log(x) 0.19979 0.02119 9.427 2.12e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.1806 on 98 degrees of freedomMultiple R-squared: 0.4756,Adjusted R-squared: 0.4702 F-statistic: 88.87 on 1 and 98 DF, p-value: 2.121e-15
Pour interpréter le coefficient de pente, nous le divisons par 100.
coef(lm3)/100 log(x) 0.001997892
Cela nous indique qu’une augmentation de 1% de x augmente la variable dépendante d’environ 0,002. Pourquoi cela nous indique-t-il cela ? Faisons quelques calculs. Nous calculons ci-dessous la variation de y lors du passage de x de 1 à 1,01 (c’est-à-dire une augmentation de 1%).
$$(\beta_0 + \beta_1\text{log}1.01) – (\beta_0 + \beta_1\text{log}1)$$
$$\beta_1\text{log}1.01 – \beta_1\text{log}1$
$$\beta_1(\text{log}1.01 – \text{log}1)$$
$\beta_1\text{log}\frac{1.01}{1} = \beta_1\text{log}1.01$
Le résultat est la multiplication du coefficient de pente par log(1.01), qui est approximativement égal à 0.01, ou \(\frac{1}{100}\). D’où l’interprétation selon laquelle une augmentation de 1% de x augmente la variable dépendante du coefficient/100.
Encore une fois, ajustons le mauvais modèle en omettant de spécifier une transformation logarithmique pour x dans la syntaxe du modèle.
lm4 <- lm(y ~ x)
La visualisation d’un résumé du modèle révélera que les estimations des coefficients sont bien éloignées des vraies valeurs. Mais en pratique, nous ne connaissons jamais les vraies valeurs. Une fois encore, des diagnostics sont de mise pour évaluer l’adéquation du modèle. Un diagnostic utile dans ce cas est un diagramme résiduel partiel qui peut révéler des écarts par rapport à la linéarité. Rappelons que les modèles linéaires supposent que les prédicteurs sont additifs et ont une relation linéaire avec la variable de réponse. Le paquetage car fournit la fonction crPlot qui permet de créer rapidement des graphiques de résidus partiels. Il suffit de lui donner l’objet modèle et de spécifier pour quelle variable vous souhaitez créer le tracé des résidus partiels.
library(car)crPlot(lm4, variable = "x")
La ligne droite représente la relation spécifiée entre x et y. La ligne courbe est une ligne de tendance lisse qui résume la relation observée entre x et y. Nous pouvons dire que la relation observée est non linéaire. Comparez ce tracé au tracé résiduel partiel pour le bon modèle.
crPlot(lm3, variable = "log(x)")
Les lignes lisses et ajustées sont juste au-dessus l’une de l’autre révélant aucun écart sérieux de la linéarité.
Cela ne signifie pas que si vous voyez des écarts par rapport à la linéarité, vous devez immédiatement supposer qu’une transformation logarithmique est la seule et unique solution ! La relation non linéaire peut être complexe et ne pas s’expliquer aussi facilement avec une simple transformation. Mais une transformation logarithmique peut être adaptée dans de tels cas et certainement quelque chose à considérer.
Enfin, considérons des données où les variables dépendantes et indépendantes sont toutes deux transformées en logarithme.
y <- exp(1.2 + 0.2 * log(x) + e)
Regardez attentivement le code ci-dessus. La relation entre x et y est maintenant à la fois multiplicative et non linéaire !
Comme d’habitude, nous pouvons ajuster le modèle correct et remarquer qu’il fait un travail fantastique pour récupérer les vraies valeurs que nous avons utilisées pour générer les données :
lm5 <- lm(log(y)~ log(x))summary(lm5)Call:lm(formula = log(y) ~ log(x))Residuals: Min 1Q Median 3Q Max -0.46492 -0.12063 0.00112 0.11661 0.45864 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.22192 0.02308 52.938 < 2e-16 ***log(x) 0.19979 0.02119 9.427 2.12e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.1806 on 98 degrees of freedomMultiple R-squared: 0.4756,Adjusted R-squared: 0.4702 F-statistic: 88.87 on 1 and 98 DF, p-value: 2.121e-15
Interprétez le coefficient x comme le pourcentage d’augmentation de y pour chaque augmentation de 1% de x. Dans ce cas, c’est environ une augmentation de 0,2 % de y pour chaque augmentation de 1 % de x.
L’ajustement du mauvais modèle produit une fois de plus des estimations de coefficient et d’erreur standard résiduelle qui sont follement hors cible.
lm6 <- lm(y ~ x)summary(lm6)
Les tracés Scale-Location et Partial-Residual fournissent des preuves que quelque chose ne va pas avec notre modèle. Le tracé Scale-Location montre une ligne de tendance incurvée et le tracé Partial-Residual montre des lignes linéaires et lisses qui ne correspondent pas.
plot(lm6, which = 3)
crPlot(lm6, variable = "x")
Comment saurions-nous dans la vraie vie que le bon modèle nécessite des variables indépendantes et dépendantes transformées en logarithme ? Nous ne le saurions pas. Nous pourrions avoir une intuition basée sur des tracés de diagnostic et une expérience de modélisation. Ou nous pourrions avoir une certaine expertise en la matière sur le processus que nous modélisons et avoir de bonnes raisons de penser que la relation est multiplicative et non linéaire.
J’espère que vous avez maintenant une meilleure maîtrise non seulement de la façon d’interpréter les variables transformées en logarithme dans un modèle linéaire, mais aussi de ce que les variables transformées en logarithme signifient pour votre modèle.
Pour toute question ou clarification concernant cet article, contactez le StatLab de la bibliothèque de l’UVA : [email protected]
Voir la collection complète des articles du StatLab de la bibliothèque de l’UVA.
Clay Ford
Consultant en recherche statistique
Bibliothèque de l’Université de Virginie
17 août 2018
.