29  Contribution des variables et analyse de dominance

Lorsque l’on réalise un modèle multivariable, une des premières questions est de savoir quels sont les variables ayant un effet significatif. Lorsque l’on a des variables catégorielles, qui se traduisent donc par plusieurs termes dans le modèle, nous avons déjà abordé les analyses de variance (ANOVA) ou analyses de déviance pour calculer des p-valeurs globales (cf. Section 23.8).

Mais il serait réducteur de se limiter à la seule significativité de la variable. Il importe de prendre aussi en compte les tailles d’effets et d’estimer le niveau de contribution d’une variable au modèle. À quel point une variable contribue-t-elle à expliquer le phénomène étudié ? Pour cela, on pourra se reposer sur plusieurs métriques cherchant à exprimer la part de variance ou de déviance expliquée par chaque variable. On parle également de décomposition du R2.

29.1 Modèles linéaires et 𝜂2

Revenons sur quelques concepts de base d’un modèle de régression linéaire. La technique de régression utilisée est la méthode des moindres carrés ordinaire (ordinary least squares ou OLS en anglais). Cette méthode consiste à minimiser la somme des carrés des écarts entre chaque point observé et sa prédiction.

Une mesure de qualité (goodness of fir) de la régression linéaire est le coefficient de détermination noté R2. Il représente la proportion de la variance totale expliquée par le modèle. Une manière de le définir est \(R^2=1-(RSS/TSS)\)RSS (residual sum of squares) représente la variance résiduelle du modèle, à savoir la somme des carrés des écarts entre les valeurs observées et les valeurs prédites. De son côté, TSS (total sum of squares) représente la variance totale, c’est-à-dire la variance observée de l’outcome en l’absence d’ajustement. On l’appelle également la variance du modèle nul, puisque c’est la variance obtenue dans un modèle vide ne contenant qu’un intercept (outcome ~ 1).

Prenons un exemple de modèle linéaire. La variance résiduelle (RSS) peut s’obtenir avec la fonction générique stats::deviance(). Le package guideR, le compagnon de guide-R, fournit une fonction guideR::total_deviance() renvoyant la variance totale (TSS). Le package performance fournit une fonction générique performance::r2() pour le calcul du coefficient de détermination.

ml <- lm(
  Petal.Width ~ Petal.Length + Sepal.Width + Sepal.Length + Species,
  data = iris
)

# RSS
rss <- ml |> deviance()
rss
[1] 3.997566
# TSS
tss <- ml |> guideR::total_deviance()
tss
[1] 86.56993
# R2
1 - (rss / tss)
[1] 0.9538227
ml |> performance::r2()
# R2 for Linear Regression
       R2: 0.954
  adj. R2: 0.952

Si vous réaliser un tableau des coefficients avec gtsummary::tbl_regression(), vous pouvez ajouter facilement le R2 en note du tableau avec gtsummary::add_glance_source_note().

library(gtsummary)
theme_gtsummary_language("fr", decimal.mark = ",", big.mark = " ")
guideR::theme_gtsummary_bold_labels()
guideR::theme_gtsummary_prop_n()

ml |> 
  tbl_regression() |> 
  add_glance_source_note(include = r.squared)
Caractéristique Beta 95% IC p-valeur
Petal.Length 0,24 0,15 – 0,34 <0,001
Sepal.Width 0,24 0,15 – 0,34 <0,001
Sepal.Length -0,09 -0,18 – 0,00 0,039
Species


    setosa
    versicolor 0,65 0,40 – 0,89 <0,001
    virginica 1,0 0,72 – 1,4 <0,001
Abréviation: IC = intervalle de confiance
R² = 0,954

Dans notre exemple, nous pouvons donc dire que notre modèle explique 95% de la variance observée.

Voyons voir maintenant si chacune des nos variables a un effet significatif sur le modèle. Pour cela, nous allons réaliser une analyse de variance (Anova) avec la fonction car::Anova(). Cette fonction réalise par défaut une Anova de type II (nous y reviendrons plus tard).

ml |> car::Anova()
Anova Table (Type II tests)

Response: Petal.Width
             Sum Sq  Df F value    Pr(>F)    
Petal.Length 0.6827   1 24.5906 1.969e-06 ***
Sepal.Width  0.7140   1 25.7207 1.196e-06 ***
Sepal.Length 0.1206   1  4.3448   0.03889 *  
Species      1.3827   2 24.9043 5.143e-10 ***
Residuals    3.9976 144                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pour chaque variable, on calcule un modèle sans cette variable et l’on compare la variance expliquée. Par exemple, si l’on calcul le modèle Petal.Width ~ Sepal.Width + Sepal.Length + Species, c’est-à-dire le même modèle mais sans la variable Petal.Length, alors la variance résiduelle obtenue serait supérieure de 0,6827 à la variance résiduelle de notre modèle complet. Cette quantité, que l’on peut noter SSpred ou somme des carrés associée à ce prédicteur, représente la quantité de variance expliquée par la variable Petal.Length, une fois les autres variables d’ajustement du modèle prises en compte.

On peut alors exprimer la contribution de cette variable de plusieurs manières. Une première métrique, appelée 𝜂2 (eta-squared) consiste à rapporter cette quantité de variance à la variance totale (Keppel 1991; Olejnik et Algina 2003) : \(\eta^2=SS_{pred}/TSS\). Elle exprime la contribution de la variable comme une proportion de la variance totale. On peut parler de contribution totale.

Keppel, Geoffrey. 1991. Design and analysis: a researcher’s handbook. 3. ed. Prentice-Hall.

Une métrique alternative, 𝜂p2 ou partial eta-squared, représente la variance expliquée par la variable comme une proportion de la variance non expliquée par les autres variables du modèle : \(\eta_p^2=SS_{pred}/(RSS+SS_{pred})\). Ici, la variance expliquée par les autres variables du modèles est mise de côté. Nous parlerons alors de contribution partielle.

Enfin, il est possible de calculer une contribution relative en rapportant la variance expliquée par la variable sur la variance expliquée par l’ensemble du modèle : \(SS_{pred} / (TSS - RSS)\). Cela représente la contribution de la variable au R2.

Le package guideR propose une fonction guideR::tbl_contributions() calculant ces différentes formes de contributions et les affichant dans un tableau mis en forme.

ml |> guideR::tbl_contributions(decimals = 2)
Sum of Squares Total contribution (η2) Partial contribution (ηp2) Relative contribution p-value
Petal.Length 0.68 0.79% 14.59% 0.83% <0,001
Sepal.Width 0.71 0.82% 15.15% 0.86% <0,001
Sepal.Length 0.12 0.14% 2.93% 0.15% 0,039
Species 1.38 1.60% 25.70% 1.67% <0,001
Total sum of squares (TSS): 86.6
Residual sum of squares (RSS): 4.0
R2: 95.4%
Mise en garde

Il est à noter que plusieurs auteurs mentionnent que le 𝜂2 est un indicateur biaisé et que cela est problématique lorsque le nombre d’observations est limité (en pratique lorsque n est inférieur à 50 ou à 10-20 participants par condition). Plusieurs auteurs recommandent d’utiliser alors d’autres métriques comme le ⍵2 (omega squared) [Olejnik et Algina (2003); @kroes2025] ou encore 𝜀2 (epsilon squared) (Carroll et Nordholm 1975). On pourra se référer à la vignette dédiée du package {effectsize}.

Carroll, Robert M., et Lena A. Nordholm. 1975. « Sampling Characteristics of Kelley’s ε and Hays’ ω ». Educational and Psychological Measurement 35 (3): 541‑54. https://doi.org/10.1177/001316447503500304.
Olejnik, Stephen, et James Algina. 2003. « Generalized Eta and Omega Squared Statistics: Measures of Effect Size for Some Common Research Designs. » Psychological Methods 8 (4): 434‑47. https://doi.org/10.1037/1082-989X.8.4.434.

29.2 GLMs et R2 semi-partiels

Dans le cadre des modèles linéaires généralisés (generalized linear models ou GLM), comme la régression logistique binaire ou le modèle de Poisson, l’ajustement du modèle ne repose pas sur la méthode des moindres carrés (OLS), mais est obtenu par maximisation de la vraisemblance. Dès lors, on ne dispose pas d’une somme des carrés et le R2 ne peut être calculé. Mais une mesure alternative est le pseudo R2 de McFadden (McFadden 1974), aussi appelé likelihood ratio index. Il peut être exprimé à partir de la déviance, qui est une transformation de la vraisemblance et représente le manque d’adéquation du modèle. Conceptuellement, la déviance peut être vue comme un analogue, au cas GLM, de la variance du modèle linéaire. Ainsi, le peudo R2 de McFadden1 peut s’écrire comme \(R^2_{McF}=1-D_r/D_t\)Dt représente la déviance totale, c’est-à-dire la déviance du modèle nul, et Dr représente la déviance résiduelle, soit celle du modèle complet et représente donc la déviance non expliquée par le modèle. Ainsi, le pseudo-R2 représente la part de variance expliquée par le modèle2.

McFadden, Daniel. 1974. Conditional logit analysis of qualitative choice behaviour. Édité par P Zarembka. Academic Press. https://eml.berkeley.edu/reprints/mcfadden/zarembka.pdf.

1 Il existe d’autres pseudo-R2 pour les modèles GLM, comme celui de Cox and Snell (1989), de Nagekkerke (1991), d’Estrella (1998) ou encore celui de Tjur (2009) spécifiquement pour les modèles logistiques binaires.

2 Pour un modèle logistique, les valeurs du pseudo-R2 sont souvent inférieures à celles observées dans les modèles linéaires. Pour une régression logistique binaire, il est très rare que le R2 soit supérieur à 50% et, en pratique, on considère qu’une valeur entre 20 et 40% est correcte.

Reprenons, pour exemple, le modèle logistique que nous avons déjà abordé dans d’autres chapitres.

library(tidyverse)
library(labelled)

data(hdv2003, package = "questionr")

d <-
  hdv2003 |> 
  mutate(
    sexe = sexe |> fct_relevel("Femme"),
    groupe_ages = age |>
      cut(
        c(18, 25, 45, 65, 99),
        right = FALSE,
        include.lowest = TRUE,
        labels = c("18-24 ans", "25-44 ans",
                   "45-64 ans", "65 ans et plus")
      ),
    etudes = nivetud |> 
      fct_recode(
        "Primaire" = "N'a jamais fait d'etudes",
        "Primaire" = "A arrete ses etudes, avant la derniere annee d'etudes primaires",
        "Primaire" = "Derniere annee d'etudes primaires",
        "Secondaire" = "1er cycle",
        "Secondaire" = "2eme cycle",
        "Technique / Professionnel" = "Enseignement technique ou professionnel court",
        "Technique / Professionnel" = "Enseignement technique ou professionnel long",
        "Supérieur" = "Enseignement superieur y compris technique superieur"
    ) |> 
    fct_na_value_to_level("Non documenté")  
  ) |> 
  set_variable_labels(
    sport = "Pratique un sport ?",
    sexe = "Sexe",
    groupe_ages = "Groupe d'âges",
    etudes = "Niveau d'études",
    heures.tv = "Heures de télévision / jour"
  )

mod <- glm(
  sport ~ sexe + groupe_ages + etudes + heures.tv,
  family = binomial,
  data = d
)
mod |> performance::r2_mcfadden()
# R2 for Generalized Linear Regression
       R2: 0.153
  adj. R2: 0.152

De la même manière, l’Anova (analyse de variance) a été étendue aux modèles GLM et correspond alors à une analyse de déviance.

mod |> car::Anova()
Analysis of Deviance Table (Type II tests)

Response: sport
            LR Chisq Df Pr(>Chisq)    
sexe          15.987  1  6.378e-05 ***
groupe_ages   50.218  3  7.179e-11 ***
etudes       123.852  4  < 2.2e-16 ***
heures.tv     13.588  1  0.0002276 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

À partir des écarts de déviance (Dpred) associés à chaque variable (colonne LR Chisq dans le tableau précédent), nous pouvons calculer un équivalent du 𝜂2 : le pseudo-R2 semi-partiel (semi-partial pseudo-R2), égal à \(D_{pred}/D_t\) et représentant la contribution totale de la variable exprimée en proportion de la déviance totale.

De même, on peut calculer le pseudo-R2 partiel (partial pseudo-R2), égal à \(D_{pred} / (D_r+D_{pred})\), représentant la contribution partielle de la variable, à savoir la proportion de déviance uniquement expliquée par cette variable, les autres effets étant contrôlés.

Enfin, une contribution relative, exprimée en proportion de la déviance expliquée par l’ensemble du modèle, peut être calculée comme \(D_{pred}/(D_t-D_r)\).

Une fois encore, ces différentes métriques peuvent être calculées et affichées avec la fonction guideR::tbl_contributions().

mod |> guideR::tbl_contributions()
Deviance Total contribution
(semi-partial pseudo-R2)
Partial contribution
(partial pseudo-R2)
Relative contribution p-value
Sexe 16.0 0.6% 0.7% 4.0% <0,001
Groupe d'âges 50.2 1.9% 2.2% 12.6% <0,001
Niveau d'études 123.9 4.7% 5.3% 31.1% <0,001
Heures de télévision / jour 13.6 0.5% 0.6% 3.4% <0,001
Total deviance (null model): 2 609.2
Residual deviance (full model): 2 210.4
McFadden pseudo R2: 15.3%

29.3 Les différents types d’Anova

Dans le chapitre sur la régression logistique binaire, nous avions brièvement abordé dans un encadré les différents types d’Anova3 (cf. Section 23.8).

3 Pour une explication sur ces différents types, on pourra se référer (en anglais) à https://mcfromnz.wordpress.com/2011/03/02/anova-type-iiiiii-ss-explained/.

Jusqu’à présent, dans ce chapitre, nous avons utilisé des Anova de type II qui sont calculés avec la fonction car::Anova(). Pour une Anova de type II, on part du modèle complet et on va ensuite calculer, pour chaque prédicteur, un modèle avec l’ensemble des variables du modèle sauf ce dernier (comme lors de la première étape d’une sélection descendante pas à pas). On obtient alors la part de variance expliquée par ce prédicteur lorsqu’il est ajouté à la toute dernière étape du modèle. De fait, l’ordre dans lequel les prédicteurs sont indiqués dans le modèle n’a ici pas d’importance puisque tous les prédicteurs sont traités de manière équivalente. Cependant, la somme des déviances expliquées par chaque prédicteur, lorsqu’il est ajouté à la toute fin, n’est pas égale à la déviance expliquée totale. Jetons un œil à notre exemple en rajoutant une ligne Total.

mod |> 
  guideR::tbl_contributions(type = "II") |> 
  gt::grand_summary_rows(
    columns = gt::any_of(c("Total", "Relative")),
    fns = Total ~ sum(.),
    fmt = ~ gt::fmt_percent(., decimals = 1)
  )
Deviance Total contribution
(semi-partial pseudo-R2)
Partial contribution
(partial pseudo-R2)
Relative contribution p-value
Sexe 16.0 0.6% 0.7% 4.0% <0,001
Groupe d'âges 50.2 1.9% 2.2% 12.6% <0,001
Niveau d'études 123.9 4.7% 5.3% 31.1% <0,001
Heures de télévision / jour 13.6 0.5% 0.6% 3.4% <0,001
Total 7.8% 51.1%
Total deviance (null model): 2 609.2
Residual deviance (full model): 2 210.4
McFadden pseudo R2: 15.3%

La somme des pseudo-R2 semi-partiels est de 7,8% alors que le pseudo R2 de McFadden est de 15,3%. Cela est lié au fait qu’il y a toujours une forme de corrélation entre les prédicteurs (ils ne sont pas parfaitement indépendants). Ainsi, en l’absence d’un autre prédicteur, une variable va pouvoir contribuer de manière plus importante au modèle.

Une alternative est la réalisation d’une Anova de type I avec la fonction stats::anova(). Dans ce type d’analyse, on part du modèle vide puis chaque variable est ajoutée séquentiellement au modèle. Reprenons notre exemple.

mod |> 
  guideR::tbl_contributions(type = "I") |> 
  gt::grand_summary_rows(
    columns = gt::any_of(c("Total", "Relative")),
    fns = Total ~ sum(.),
    fmt = ~ gt::fmt_percent(., decimals = 1)
  )
Deviance Total contribution
(semi-partial pseudo-R2)
Partial contribution
(partial pseudo-R2)
Relative contribution p-value
Sexe 16.2 0.6% 0.7% 4.1% <0,001
Groupe d'âges 216.3 8.3% 8.9% 54.2% <0,001
Niveau d'études 152.7 5.9% 6.5% 38.3% <0,001
Heures de télévision / jour 13.6 0.5% 0.6% 3.4% <0,001
Total 15.3% 100.0%
Total deviance (null model): 2 609.2
Residual deviance (full model): 2 210.4
McFadden pseudo R2: 15.3%

On a tout d’abord considéré un modèle avec seulement la variable sexe et son pseudo R2 semi-partiel est de 0,6%, représentant sa contribution brute, i.e. univariable, c’est-à-dire en l’absence d’autres variables dans le modèle. Puis un second modèle avec les variables sexe et groupe d’âges est considéré. Le pseudo R2 semi-partiel de 8,3% correspond donc à l’apport du groupe d’âges par rapport au modèle ne contenant que le sexe. Et ainsi de suite. Le pseudo R2 semi-partiel de 5,9% associé au niveau d’étude correspond donc à l’apport de cette variable par rapport à un modèle ne contenant que le sexe et le groupe d’âges. Ici, la somme des pseudo R2 semi-partiels est de facto égale au pseudo R2 total. Mais les valeurs obtenues sont fortement dépendantes de l’ordre dans lequel on introduit les différentes variables comme le montre l’exemple suivant.

glm(
  sport ~ heures.tv + etudes + groupe_ages + sexe,
  family = binomial,
  data = d
) |> 
  guideR::tbl_contributions(type = "I") |> 
  gt::grand_summary_rows(
    columns = gt::any_of(c("Total", "Relative")),
    fns = Total ~ sum(.),
    fmt = ~ gt::fmt_percent(., decimals = 1)
  )
Deviance Total contribution
(semi-partial pseudo-R2)
Partial contribution
(partial pseudo-R2)
Relative contribution p-value
Heures de télévision / jour 66.9 2.6% 2.9% 16.8% <0,001
Niveau d'études 269.7 10.3% 10.9% 67.6% <0,001
Groupe d'âges 46.2 1.8% 2.0% 11.6% <0,001
Sexe 16.0 0.6% 0.7% 4.0% <0,001
Total 15.3% 100.0%
Total deviance (null model): 2 609.2
Residual deviance (full model): 2 210.4
McFadden pseudo R2: 15.3%

Voyez comment le pseudo R2 semi-partiel associé au groupe d’âges est ici très différent (1,8% vs 8,3%).

Une solution possible à cette problématique est l’analyse de dominance que nous allons aborder dans la section suivante. Mais juste avant, abordons les autres options proposées par guideR::tbl_contributions().

Tout d’abord, il y a l’Anova de type III que nous avons abordé dans le chapitre sur les interactions (cf. Section 27.4). En l’absence d’interaction, le type II est recommandé car plus robuste. Par contre, en présence d’interaction, il est préférable d’avoir recours au type III qui traite les interactions de manière un peu différente des types II. Le type III teste les effets principaux en maintenant les niveaux des autres facteurs constants. En d’autres termes, il compare les moyennes d’un facteur en fixant les autres facteurs à leurs niveaux respectifs, plutôt que de les moyenner sur l’ensemble de leurs combinaisons. Attention cependant : pour utiliser un type III, il est préférable que les variables catégorielles soient codés avec des contrastes orthogonaux, autrement dit des contrastes de type somme ou de type Helmert (voir le chapitre Chapitre 26 dédié aux contrastes).

Voici un exemple :

modi <- 
  glm(
    sport ~ sexe * groupe_ages + sexe * heures.tv + etudes,
    family = binomial,
    data = d,
    contrasts = list(
      sexe = contr.sum,
      groupe_ages = contr.sum
    )
  )
modi |> 
  guideR::tbl_contributions(type = "III")
Deviance Total contribution
(semi-partial pseudo-R2)
Partial contribution
(partial pseudo-R2)
Relative contribution p-value
Sexe 3.7 0.1% 0.2% 0.9% 0,053
Groupe d'âges 52.2 2.0% 2.3% 12.6% <0,001
Heures de télévision / jour 11.5 0.4% 0.5% 2.8% <0,001
Niveau d'études 125.2 4.8% 5.4% 30.2% <0,001
Sexe × Groupe d'âges 12.9 0.5% 0.6% 3.1% 0,005
Sexe × Heures de télévision / jour 2.7 0.1% 0.1% 0.7% 0,10
Total deviance (null model): 2 609.2
Residual deviance (full model): 2 194.7
McFadden pseudo R2: 15.9%

La fonction guideR::tbl_contributions() propose enfin deux autres options. La première, intitulée "drop1", repose sur la fonction stats::drop1() qui calcule tous les sous-modèles obtenus en supprimant un seul terme. En l’absence d’interaction, c’est strictement équivalent à une Anova de type II. En présence d’interactions, le traitement des interactions est quelque peu différent. Toutes les variables composants l’interaction sont supprimé et la fonction ne teste pas le fait de retirer l’interaction tout en conservant les termes la composant en entrées simples.

Pour les modèles pondérés (réalisés avec survey::svyglm(), voir le chapitre Chapitre 34), il est recommandé d’utiliser l’option "drop1" plutôt que le type II, l’implémentation de car::Anova() n’étant pas optimale pour ce type de modèles.

modi |> 
  guideR::tbl_contributions(type = "drop1")
Deviance Total contribution
(semi-partial pseudo-R2)
Partial contribution
(partial pseudo-R2)
Relative contribution p-value
Niveau d'études 125.2 4.8% 5.4% 30.2% <0,001
Sexe × Groupe d'âges 12.9 0.5% 0.6% 3.1% 0,005
Sexe × Heures de télévision / jour 2.7 0.1% 0.1% 0.7% 0,10
Total deviance (null model): 2 609.2
Residual deviance (full model): 2 194.7
McFadden pseudo R2: 15.9%

Enfin, la dernière option est "add1" et repose sur la fonction stats::add1(). Cette fois-ci, on part du modèle vide et on teste le fait d’ajouter, à chaque fois, une seule variable au modèle. Nous obtenons donc les contributions brutes ou univariables de chaque prédicteur. Pour ce type précis, seuls les peudo R2 semi-partiels sont retournés. Et, cette fois-ci, leur somme dépasse le peudo R2 global.

mod |> 
  guideR::tbl_contributions(type = "add1", show = "Total") |> 
  gt::grand_summary_rows(
    columns = gt::any_of("Total"),
    fns = Total ~ sum(.),
    fmt = ~ gt::fmt_percent(., decimals = 1)
  )
Deviance Total contribution
(semi-partial pseudo-R2)
p-value
Sexe 16.2 0.6% <0,001
Groupe d'âges 213.2 8.2% <0,001
Niveau d'études 323.7 12.4% <0,001
Heures de télévision / jour 66.9 2.6% <0,001
Total 23.8%
Total deviance (null model): 2 609.2
Residual deviance (full model): 2 210.4
McFadden pseudo R2: 15.3%

29.4 Analyse de dominance

L’analyse de dominance répond à une question fondamentale : quand plusieurs prédicteurs sont corrélés, comment attribuer à chacun sa contribution distincte à l’explication de la variable dépendante ? Chao et al. (Chao et al. 2008) soulignent que cette question est centrale en régression multiple, car les méthodes usuelles (corrélations zéro-ordre, corrélations semi-partielles) ne capturent pas toujours la contribution complète d’un prédicteur.

Chao, Yi-Chun E., Yue Zhao, Lawrence L. Kupper, et Leena A. Nylander-French. 2008. « Quantifying the Relative Importance of Predictors in Multiple Linear Regression Analyses for Public Health Studies ». Journal of Occupational and Environmental Hygiene 5 (8): 519‑29. https://doi.org/10.1080/15459620802225481.

L’analyse de dominance repose sur la comparaison des modèles emboîtés (nested models). Pour chaque paire de prédicteurs, on examine dans combien de sous-modèles (combinaisons de prédicteurs) un prédicteur contribue davantage qu’un autre. Un prédicteur domine un autre si sa contribution supplémentaire (augmentation de R2 ou déviance) est systématiquement plus grande, quel que soit l’ensemble des autres prédicteurs présents dans le modèle.

Il est possible de calculer, à partir de ces différents sous-modèle, une contribution moyenne de chaque variable, sous la forme d’un pseudo R2 semi-partiel. L’avantage, c’est que cette fois-ci la somme des contributions est égale au pseudo R2.

Ce type d’analyse peut être gourmand en ressources de calcul car l’ensemble des combinaisons de prédicteurs va être calculé. Avec un GLM classique et un nombre d’observations de quelques milliers, cela ne pose en général pas trop de problème. Par contre, dans le cas d’un modèle plus complexe, le temps de calcul peut vite devenir très important.

Sous R, l’analyse de dominance est disponible via les fonctions dominanceanalysis::dominanceAnalysis(), parameters::dominance_analysis() ou encore domir::domin(). Pour notre part, nous privilégions le package {dominanceanalysis}, dont la mise en œuvre est, en pratique, plus facile. À noter, le package guideR étend le package {dominanceanalysis} afin de couvrir les modèles GLM avec poids d’enquête (survey::svyglm()). Il suffit que le package guideR soit chargé en mémoire. Par ailleurs, il fournit également une fonction guideR::tbl_dominance() qui permet facilement de réaliser une analyse de dominance, d’en extraire les contributions moyennes et de les afficher sous la forme d’un tableau mis en forme.

mod |> guideR::tbl_dominance()
Average total contribution Relative contribution
Sexe 0.6% 4.0%
Groupe d'âges 4.9% 31.2%
Niveau d'études 8.4% 53.8%
Heures de télévision / jour 1.7% 11.0%
Total 15.5% 100.0%
McFadden pseudo R2: 15.5%

Par rapport à l’approche précédente qui reposait sur une Anova de type II, nous obtenons une décomposition plus complète du R2 et les contributions relatives somment à 100%.

Pour une présentation plus complète du package {dominanceanalysis}, on pourra se référer à sa vignette dédiée (en anglais).

Astuce

Pour aller un peu plus loin, on pourra réaliser manuellement une analyse de dominance avec dominanceanalysis::dominanceAnalysis().

da <- mod |> dominanceanalysis::dominanceAnalysis()

La dominance moyenne de chaque prédicteur s’obtient avec dominanceanalysis::averageContribution() et une représentation graphique peut être obtenue avec la fonction générique plot().

da |> dominanceanalysis::averageContribution()

Average Contribution by predictor
       sexe groupe_ages etudes heures.tv
r2.m  0.006       0.049  0.084     0.017
r2.cs 0.007       0.058  0.098     0.021
r2.n  0.007       0.058  0.098     0.021
r2.e  0.008       0.062  0.107     0.022
da |> plot() + ggplot2::expand_limits(y = 0)

L’option plot("conditional") permet de représenter l’évolution de la contribution moyenne des prédicteurs en fonction de la complexité des modèles. Le niveau 0 correspond au cas de figure où le prédicteur est seul dans le modèle, le niveau 1 aux sous-modèles contenant le prédicteur et 1 seule des autres variables, le niveau 2 aux sous-modèles avec le prédicteur et 2 autres variables et enfin le niveau 3 (le dernier ici car nous avons 4 prédicteurs au total dans le modèle complet) au modèle complet.

da |> plot("conditional") + ggplot2::expand_limits(y = 0)

On peut ainsi voir comment la contribution associée à un prédicteur diminue au fur-et-à-mesure que d’autres prédicteurs sont ajoutés au modèle.