52  Analyses intersectionnelles MAIHDA

L’analyse intersectionnelle multi-niveaux de l’hétérogénéité individuelle et de la précision discriminante, intersectional multilevel analysis of individual heterogeneity and discriminatory accuracy en anglais, appelée également MAIHDA, intersectional MAIHDA ou I-MAIHDA, est une approche innovante permettant d’étudier les inégalités en matière de santé, de maladie, mais également d’un point de vue psychosocial ou socio-économique. L’I-MAIHDA est une application de l’approche MAIHDA au sens large, qui permet de quantifier les inégalités dans un cadre théorique intersectionnel. Cette approche a gagné en popularité ces dernières années. En 2026, un package dédié, MAIHDA, est en développement actif. Pour une présentation plus générale et un tutoriel méthodologique, la référence est l’article de Clare Evans et ses collaborateurs (Evans et al. 2024), dont la lecture est fortement conseillée.

Le terme MAIHDA désigne l’utilisation de modèles multi-niveaux pour analyser les inégalités entre les différentes couches sociales, construits à partir de tableaux croisés multidimensionnels et multicatégoriels regroupant des identités, des conditions ou d’autres facteurs. Lorsqu’elle est appliquée dans un cadre intersectionnel, cette approche est plus précisément appelée I-MAIHDA et sert à analyser les inégalités en fonction de facteurs tels que le genre, la classe, le statut socio-économique ou la race.

Le terme de strates sociales pour désigner des sous-groupes analytiques, tels que certaines intersections entre genre, origine ethnique et classe sociale, est ici privilégié car il évoque l’adoption provisoire d’étiquettes à des fins d’analyses stratifiées, tout en restant sceptique vis-à-vis du terme groupe et en évitant de conceptualiser ces étiquettes comme monolithiques, immuables ou rigides. Dans le cadre d’une analyse MAIHDA, les inégalités entre strates ne sont pas seulement évaluées en termes de différences entre les moyennes des strates, mais également en déterminant la part de l’hétérogénéité totale du résultat qui se situe au niveau des strates.

52.1 Préparation des données et analyses préalables

Pour ce chapitre, nous allons utiliser le jeu données questionr::fecondite qui correspond à des données simulant une enquête démographique et de santé réalisée en Afrique sub-saharienne. Plus précisément, nous allons fusionner les données de la table femmes et de la table menages (pour récupérer le niveau de niveau de richesse du ménage). Notre indicateur d’intérêt sera le fait d’avoir déjà un réalisé un test de dépistage du VIH (variable test), dans la population des femmes âgées de 15 à 49 ans.

Pour constituer nos strates, nous allons considérer trois dimensions : le niveau d’études, le milieu de résidence et le niveau de richesse du ménage. Lorsque nous allons regarder plus loin les effets intersectionnels, les strates seront construites en croisant ces trois variables. Plus il y a de modalités, plus le nombre de strates sera élevé et plus nous aurons des strates avec très peu d’effectifs. C’est pourquoi nous allons regrouper les niveaux d’éducation secondaire et supérieur car il y a, dans cet échantillon, peu de femmes avec un niveau d’étude supérieur. De même, nous allons recoder les niveaux de richesses en seulement trois modalités.

En termes de préparation des données, nous allons également créer une variable groupe d’âges qui nous servira plus loin de variable d’ajustement et considérer la variable région que nous pourrons introduire comme variable de contexte. Enfin, nous allons supprimer les valeurs manquantes concernant notre variable d’intérêt test.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(labelled)
library(gtsummary)
theme_gtsummary_language("fr", decimal.mark = ",", big.mark = " ")
Setting theme "language: fr"
guideR::theme_gtsummary_bold_labels()

data("fecondite", package = "questionr")

femmes <- 
  femmes |> 
  left_join(menages, by = "id_menage") |> 
  unlabelled() |> 
  mutate(
    groupe_ages = age |>
      cut(
        c(-Inf, 25, 35, Inf),
        right = FALSE,
        include.lowest = TRUE,
        labels = c("15-24 ans", "25-34 ans", "35 et plus")
      ),
    richesse = richesse |>
      fct_recode(
        "riche/très riche" = "très riche",
        "riche/très riche" = "riche",
        "pauvre/très pauvre" = "très pauvre",
        "pauvre/très pauvre" = "pauvre",
      ),
    educ = educ |> 
      fct_recode(
        "secondaire/supérieur" = "secondaire",
        "secondaire/supérieur" = "supérieur",
      )
  ) |> 
  set_variable_labels(
    groupe_ages = "Groupe d'âges"
  ) |> 
  filter(test != "manquant")
Astuce

On peut aisément estimer en amont le nombre et la taille des strates que l’on obtiendra en fonction des variables intersectionnelles retenues, en ayant recours à la fonction MAIHDA::make_strata() permettant de créer des strates (et en supprimant les éventuelles strates vides) et en utilisant la fonction guideR::tbl_strata_info() permettant de réaliser un tableau descriptif de la taille des strates.

femmes |> 
  MAIHDA::make_strata(c("educ", "richesse", "milieu")) |> 
  guideR::tbl_strata_info(type = "exclusive")
Sample size per stratum Number of strata Proportion of strata
< 10 3 16.7%
10-20 2 11.1%
20-30 1 5.6%
30-50 4 22.2%
50-100 1 5.6%
≥ 100 7 38.9%
Total number of strata: 18

Avant de nous lancer dans une analyse intersectionnelle, effectuons déjà une analyse descriptive pour regarder les effets univariables.

femmes |> 
  guideR::plot_proportions(
    test == "oui",
    by = c(educ, richesse, milieu, groupe_ages, region),
    fill = "lightblue",
    flip = TRUE,
    minimal = TRUE,
    overall_label = "Ensemble",
    show_overall_line = TRUE
  )

L’analyse descriptive met en évidence, en analyse univariable, des effets marqués de nos trois variables intersectionnelles, l’accès au dépistage du VIH étant plus élevé pour les femmes éduquées, les femmes plus riches et celles vivant en milieu urbain. De même, nous voyons une influence du contexte avec des variations importantes selon les régions, et des effets d’âges significatifs.

Dans le cadre d’une analyse classique, nous pourrions poursuivre avec une régression logistique binaire multivariable (cf. Chapitre 23).

mod <- glm(
  test ~ educ + richesse + milieu,
  data = femmes,
  family = binomial
)
mod |> ggstats::ggcoef_table(exponentiate = TRUE)

Si l’on observe des effets additifs significatifs du milieu de résidence et du niveau d’éducation, les effets du niveau de richesse disparaissent une fois le modèle ajusté sur les deux autres variables. Cela se confirme en réalisant une Anova et en regardant les contributions des différentes variables (cf. Chapitre 29).

mod |> guideR::tbl_contributions(lang = "fr")
Registered S3 method overwritten by 'car':
  method           from
  na.action.merMod lme4
Déviance Contribution totale
(pseudo-R2 semi-partiel)
Contribution partielle
(pseudo-R2 partiel)
Contribution relative p-valeur
Niveau d'éducation 42,9 1,6% 1,7% 26,5% <0,001
Niveau de vie (quintiles) 1,8 0,1% 0,1% 1,1% 0,4
Milieu de résidence 24,6 0,9% 1,0% 15,2% <0,001
Déviance totale (modèle nul) : 2 635,6
Déviance résiduelle (modèle complet) : 2 473,9
Pseudo R2 de McFadden : 6,1%

On peut déjà noter un pseudo R2 relativement faible (inférieure à 10%), suggérant qu’une part important des variations de recours au dépistage ne sont pas expliquées par nos trois variables. La p-valeur associée aux niveaux de richesse confirme que la variable n’a pas d’effet significatif dans notre modèle multivariable.

Une analyse de dominance (cf. Chapitre 29) permet de nuancer un peu plus ces premiers résultats.

mod |> guideR::tbl_dominance(lang = "fr")
Contribution totale moyenne Contribution relative
Niveau d'éducation 2,5% 40,5%
Niveau de vie (quintiles) 1,3% 20,9%
Milieu de résidence 2,4% 38,6%
Total 6,1% 100,0%
Pseudo R2 de McFadden : 6,1%

En effet, le niveau de richesse est assez fortement corrélé au niveau d’éducation et au milieu de résidence. De fait, si l’analyse de dominance confirme l’importance du niveau d’éducation et du milieu de résidence (autour de 40% de contribution relative), la contribution du niveau de richesse n’est pas négligeable (autour 20%).

52.2 À la recherche des interactions

Il est important de faire la distinction entre le terme interaction dans le cadre théorique de l’intersectionnalité et le terme interaction utilisé en analyse de régression. Dans les modèles de régression, un effet d’interaction (cf. Chapitre 27) rend compte de la mesure dans laquelle deux (ou plusieurs) expositions sociales distinctes se combinent pour créer des schémas d’inégalité dans un résultat qui ne serait pas décrit de manière adéquate en utilisant uniquement des effets additifs (c’est-à-dire des effets principaux). Par exemple, évaluer le risque d’un résultat sanitaire de manière additive en fonction de l’origine migratoire et du genre (par exemple, les effets principaux additifs immigrée et femme) peut ne pas suffire à décrire la prévalence d’un résultat sanitaire particulier chez les personnes immigrées et femmes, ce qui nécessite un terme d’interaction multiplicatif supplémentaire (immigrée × femme).

En termes simples, l’intersectionnalité est un cadre qui nous permet de théoriser et de critiquer les expériences sociales (expositions) à des intersections particulières ainsi que les systèmes d’oppression qui génèrent ces expériences, tandis que les analyses de régression incluant des interactions permettent de saisir les effets de ces expériences sur des résultats spécifiques. Ainsi, l’effet des expositions peut ou non se traduire par des effets d’interaction statistiquement significatifs. L’absence d’effets d’interaction statistiquement significatifs ne dit rien sur la validité de l’intersectionnalité : elle ne prouve ni ne réfute l’existence d’expériences intersectionnelles. En ce sens, il vaut mieux considérer l’intersectionnalité comme un cadre d’analyse.

Ceci étant posé, nous pourrions être tenté de réaliser un modèle de régression classique en y intégrant une interaction de l’ensemble de nos variables intersectionnelles. Or, lorsque l’on croise nos différentes variables intersectionnelles, le nombre de modalités devient très vite important, ici de l’ordre de 3×3×2 soit 18 combinaisons théoriquement possibles, sachant que certaines ne sont peut être pas observées dans les données. Dans ce genre de situation, un modèle GLM classique peut avoir des difficultés à converger, voir ne pas converger du tout.

L’approche MAIHDA adopte une autre stratégie : les strates (la combinaison de nos variables intersectionnelles) sont intégrées sous la forme d’une variable aléatoire d’un modèle mixte. Si, de ce fait, MAIHDA peut gérer beaucoup mieux que d’autres approches le fait d’avoir des strates avec un petit nombre d’observations, cela ne permet pas pour autant d’éviter complètement le problème des petits N. En pratique, cela signifie que l’on cherchera à réduire le nombre de strates avec moins de 10 ou 20 observations, quitte à procéder à des recodages de catégories en amont (par exemple ici recoder le niveau de richesse en trois modalités) et à limiter le nombre de dimensions intersectionnelles inclues dans l’analyse.

52.3 Analyse MAIHDA classique (modèle nul et modèle ajusté)

L’analyse MAIHDA classique, celle présentée dans l’article de Evans et al. (Evans et al. 2024), repose sur deux modèles mixtes. Le premier, dit modèle nul, ne contient qu’un intercept et les différentes strates (interaction des variables intersectionnelles) entrées comme effet aléatoire. Dans notre exemple, son équation est test ~ 1 + (1 | educ:richesse:milieu), avec (1 | educ:richesse:milieu) représentant les effets aléatoires. Le second modèle, dit modèle ajusté, inclut chacune des variables intersectionnelles comme effet fixe tout en conservant les strates intersectionnelles comme effet aléatoire. Son équation dans notre exemple est test ~ educ + richesse + milieu + (1 | educ:richesse:milieu).

Le package MAIHDA fournit tout un ensemble de fonctions permettant de réaliser aisément des analyses MAIHDA sous R. Le package guideR, le compagnon de guide-R, fournit plusieurs fonctions permettant de présenter les résultats obtenus sous la forme de tableaux mis en forme et prêts à être publiés.

La fonction MAIHDA::maihda() permet de réaliser une analyse MAIHDA complète en un seul appel. On lui passera l’équation du modèle complet. Elle en déduira les variables composant les strates intersectionnelles et générera automatiquement les différentes strates (et, au besoin, éliminera les strates non observées dans les données). Comme notre variable d’intérêt est binaire, on lui précisera family = "binomial".

m <- MAIHDA::maihda(
  test ~ educ + richesse + milieu + (1 | educ:richesse:milieu),
  data = femmes,
  family = "binomial"
)
Binary outcome 'test' recoded to 0/1: 'non' = 0 (reference), 'oui' = 1 (modeled event). Set the factor levels (or supply a 0/1 outcome) to control which level is the event.

En premier lieu, nous pouvons vérifier la distribution de nos strates en fonction de leur nombre d’observations avec guideR::tbl_strata_info() qui permet de reproduire l’équivalent de la Table de 2 de Evans et al. (Evans et al. 2024).

m |> guideR::tbl_strata_info()
Sample size per stratum Number of strata Proportion of strata
≥ 100 7 38.9%
≥ 50 8 44.4%
≥ 30 12 66.7%
≥ 20 13 72.2%
≥ 10 15 83.3%
< 10 3 16.7%
Total number of strata: 18

Dans notre exemple, nous avons 3/18 strates (soit 17% des strates) avec un effectif inférieur à 10 observations.

Reproduisons le tableau principal des résultats, cf. la table 3 de Evans et al. (Evans et al. 2024), avec guideR::tbl_maihda(). On notera que, par défaut, guideR::tbl_maihda() renvoie des statistiques supplémentaires par rapport à celles présentées par Evans et al.

Evans, Clare R., George Leckie, S. V. Subramanian, Andrew Bell, et Juan Merlo. 2024. « A tutorial for conducting intersectional multilevel analysis of individual heterogeneity and discriminatory accuracy (MAIHDA) ». SSM - Population Health 26 (juin): 101664. https://doi.org/10.1016/j.ssmph.2024.101664.
m |> guideR::tbl_maihda(exponentiate = TRUE)
Caractéristique
Null model
Adjusted model
OR 95% IC p-valeur OR 95% IC p-valeur
(Intercept) 0,73 0,54 – 0,98 0,038 0,67 0,46 – 0,98 0,038
Niveau d'éducation





    aucun



    primaire


1,65 1,27 – 2,14 <0,001
    secondaire/supérieur


2,24 1,67 – 3,02 <0,001
Niveau de vie (quintiles)





    pauvre/très pauvre



    moyen


0,93 0,67 – 1,30 0,7
    riche/très riche


1,10 0,77 – 1,58 0,6
Milieu de résidence





    urbain



    rural


0,50 0,37 – 0,68 <0,001
Summary statistics





Between-stratum variance 0,283

0,008

Variance Partition Coefficient (VPC / adjusted ICC) 7,93%

0,24%

Proportional Change in Variance (PCV)


97,3%

Area Under Receiver Operating Characteristic Curve (AUC) 0,673

0,668

Median Odds Ratio (MOR) 1,66

1,09

Unadjusted ICC (intraclass correlation coefficient) 7,93%

0,21%

Conditional Nakagawa's R2 (fixed + random effects) 7,93%

9,81%

Marginal Nakagawa's R2 (fixed effects only) 0%

9,60%

Abréviations: IC = intervalle de confiance, OR = rapport de cotes
Strata: 18, Observations: 1971, Engine: lme4, Family: binomial

Le premier élément à regarder est le modèle nul et plus précisément le VPC ou Variance Partition Coefficient comme le nomme Evans et al. Cette même métrique également connue sous le nom de ICC ajusté ou adjusted Intraclass Correlation Coefficient (coefficient de corrélation intra-classe ajusté). Il représente la variance entre les strates (between-stratum variance) exprimée en proportion de la variance totale non-expliquée par les effets fixes1.

1 La proportion de la variance totale expliquée par les effets aléatoires correspond à l’ICC non ajusté ou unadjusted ICC qui est également présentée dans le tableau. En l’occurrence, dans ce modèle nul, il n’y a pas d’effet fixe et donc le VPC ou ICC ajusté est égal à l’ICC non ajusté.

Dans notre exemple, près de 8% de la variance totale est expliquée par les effets des strates intersectionnelles (le reste étant expliqué par l’hétérogénéité des individus au sein des strates). D’une certaine manière, nous pouvons mettre cette proportion en regard des 6% du pseudo R2 de notre modèle logistique classique que nous avons calculé en introduction.

La question qui se pose ensuite est de savoir, concernant le VPC, quelle est la part qui est due aux effets additifs des variables intersectionnelles et la part expliquée par les effets d’interactions (i.e. au-delà des effets additifs). Pour cela, nous pouvons nous pencher sur le second modèle, le modèle ajusté.

Cette fois-ci les effets additifs sont capturés par les effets fixes associés à nos trois variables et inclus dans ce second modèle. La part de variance expliquée par les effets fixes correspond au R2 marginal de Nakagawa, ici 9,6%. Le R2 conditionnel correspond quant à lui à la part de variance expliquée à la fois par les effets fixes et les effets aléatoires. La différence entre les deux indique donc la part des variance expliquée par les effets aléatoires et correspond donc à l’ICC non ajusté2. Dans ce modèle ajusté, les effets aléatoires associés aux strates ne capturent plus que les effets d’interactions.

2 \(ICC_{unadjusted}=R^2_{conditional}-R^2_{marginal}\)

3 Dit autrement, le VPC ou ICC ajusté correspond donc à la variance expliquée par les effets aléatoires (between-stratum variance) divisée par la variance totale moins la variance expliquée par les effets fixes. Exprimé autrement : \(VPC = ICC_{adjusted} = ICC_{unadjusted} / (1 - R^2_{marginal})\).

Si l’on regarde le VPC, il n’est plus que de 0,24%, représentant la part de la variance non expliquée par les effets fixes expliquée par les effets d’interactions3. Le PVC ou Proportional Change in Variance (changement proportionnel de la variance) représente cette diminution du VPC entre les deux modèles : 97% de la variance entre les strates du modèle nul est additive et seulement 3%, dans notre exemple, correspond à des effets d’interaction entre les variables intersectionnelles.

Astuce

La fonction summary() permet d’afficher dans la console de nombreux éléments. Ne pas hésiter à y jeter un œil en complément du tableau retournée par guideR::tbl_maihda().

summary(m)
MAIHDA Model Summary
====================

Null model. Use which = "adjusted" for the adjusted model.

Variance Partition Coefficient (VPC/ICC):
  Estimate: 0.0793

Variance Components:
                 component variance     sd proportion
  Between-stratum (random)   0.2835 0.5324    0.07934
 Within-stratum (residual)   3.2899 1.8138    0.92066
                     Total   3.5734 1.8903    1.00000

Discriminatory accuracy (binomial MAIHDA)
  AUC (C-statistic): 0.673
  Median Odds Ratio: 1.662
  Cases / controls:  768 / 1203
  (AUC is apparent / in-sample: scored on the same rows used to fit the
  model, so it is optimistically biased -- more so with sparse strata. It
  is a descriptive measure, not cross-validated out-of-sample discrimination.)

Fixed Effects (Wald 95% intervals):
        term estimate     se statistic p_value   lower    upper
 (Intercept)  -0.3122 0.1505    -2.075   0.038 -0.6072 -0.01733

Stratum Estimates (first 10):
 stratum stratum_id                                             label
       1          1                             aucun × moyen × rural
       2          2                aucun × pauvre/très pauvre × rural
       3          3             primaire × pauvre/très pauvre × rural
       4          4 secondaire/supérieur × pauvre/très pauvre × rural
       5          5  secondaire/supérieur × riche/très riche × urbain
       6          6                 aucun × riche/très riche × urbain
       7          7                         primaire × moyen × urbain
       8          8              primaire × riche/très riche × urbain
       9          9               primaire × riche/très riche × rural
      10         10                  aucun × riche/très riche × rural
 random_effect     se  lower_95  upper_95
       -0.9068 0.1664 -1.233031 -0.580608
       -0.9065 0.1062 -1.114776 -0.698280
       -0.1387 0.1485 -0.429676  0.152331
        0.2715 0.2602 -0.238406  0.781489
        0.7359 0.1197  0.501193  0.970523
        0.2133 0.1225 -0.026818  0.453440
        0.5123 0.2634 -0.003909  1.028453
        0.2418 0.1508 -0.053783  0.537332
       -0.3087 0.3255 -0.946639  0.329276
       -0.4267 0.2158 -0.849753 -0.003659
  ... and 8 more strata
summary(m, which = "adjusted")
MAIHDA Model Summary
====================

Adjusted model.

Variance Partition Coefficient (VPC/ICC):
  Estimate: 0.0024

Variance Components:
                 component variance      sd proportion
  Between-stratum (random) 0.007772 0.08816   0.002357
 Within-stratum (residual) 3.289868 1.81380   0.997643
                     Total 3.297640 1.81594   1.000000

Discriminatory accuracy (binomial MAIHDA)
  AUC (C-statistic): 0.668
  Median Odds Ratio: 1.088
  Cases / controls:  768 / 1203
  (AUC is apparent / in-sample: scored on the same rows used to fit the
  model, so it is optimistically biased -- more so with sparse strata. It
  is a descriptive measure, not cross-validated out-of-sample discrimination.)

Fixed Effects (Wald 95% intervals):
                     term estimate     se statistic  p_value   lower    upper
              (Intercept) -0.40002 0.1926   -2.0764 0.037856 -0.7776 -0.02243
             educprimaire  0.49959 0.1343    3.7210 0.000198  0.2364  0.76274
 educsecondaire/supérieur  0.80804 0.1512    5.3450 9.04e-08  0.5117  1.10434
            richessemoyen -0.06989 0.1701   -0.4109 0.681117 -0.4032  0.26344
 richesseriche/très riche  0.09646 0.1838    0.5247 0.599762 -0.2638  0.45673
              milieurural -0.69267 0.1546   -4.4792 7.49e-06 -0.9958 -0.38957

Stratum Estimates (first 10):
 stratum stratum_id                                             label
       1          1                             aucun × moyen × rural
       2          2                aucun × pauvre/très pauvre × rural
       3          3             primaire × pauvre/très pauvre × rural
       4          4 secondaire/supérieur × pauvre/très pauvre × rural
       5          5  secondaire/supérieur × riche/très riche × urbain
       6          6                 aucun × riche/très riche × urbain
       7          7                         primaire × moyen × urbain
       8          8              primaire × riche/très riche × urbain
       9          9               primaire × riche/très riche × rural
      10         10                  aucun × riche/très riche × rural
 random_effect      se lower_95 upper_95
      -0.03128 0.07864 -0.18542  0.12285
      -0.06554 0.06796 -0.19874  0.06767
       0.03166 0.07684 -0.11894  0.18226
       0.02634 0.08459 -0.13946  0.19215
      -0.01400 0.07181 -0.15474  0.12675
       0.07104 0.07234 -0.07075  0.21283
       0.02630 0.08462 -0.13955  0.19215
      -0.05870 0.07693 -0.20948  0.09208
      -0.01363 0.08614 -0.18246  0.15521
       0.01992 0.08305 -0.14287  0.18270
  ... and 8 more strata

Ceci posé, on pourra chercher à savoir quelles sont les strates avec la plus faible ou la plus forte probabilité de vivre l’évènement étudié. Pour cela, on pourra avoir recours à guideR::tbl_strata_predictions(). Par défaut, les 5 strates avec la plus forte prédiction et les 5 strates avec la plus faible prédiction sont affichées. Cela peut être modifié avec l’argument n_strata (utiliser Inf pour tout afficher).

m |> guideR::tbl_strata_predictions()
Rank Niveau d'éducation Niveau de vie (quintiles) Milieu de résidence n Predicted 95% CI
1 secondaire/supérieur riche/très riche urbain 277 60,4% 54,7% – 65,9%
2 secondaire/supérieur moyen rural 12 57,2% 38,2% – 74,3%
3 primaire moyen urbain 44 55,0% 42,2% – 67,2%
4 primaire pauvre/très pauvre urbain 4 49,4% 28,0% – 71,1%
5 secondaire/supérieur pauvre/très pauvre rural 45 49,0% 36,6% – 61,5%
6 primaire riche/très riche urbain 162 48,2% 41,0% – 55,6%
7 aucun riche/très riche urbain 253 47,5% 41,6% – 53,5%
8 aucun pauvre/très pauvre urbain 9 47,4% 28,5% – 67,1%
9 secondaire/supérieur moyen urbain 43 47,2% 34,7% – 60,0%
10 secondaire/supérieur riche/très riche rural 19 42,2% 26,9% – 59,2%
11 primaire pauvre/très pauvre rural 176 38,9% 32,3% – 46,0%
12 aucun moyen urbain 108 38,5% 30,3% – 47,4%
13 primaire moyen rural 41 38,1% 26,4% – 51,3%
14 secondaire/supérieur pauvre/très pauvre urbain 2 37,2% 18,2% – 61,2%
15 primaire riche/très riche rural 26 35,0% 22,1% – 50,4%
16 aucun riche/très riche rural 82 32,3% 23,8% – 42,2%
17 aucun pauvre/très pauvre rural 483 22,8% 19,4% – 26,7%
18 aucun moyen rural 185 22,8% 17,6% – 29,1%

Un graphique de l’ensemble des prédictions par strate peut être obtenu avec guideR::plot_strata_predictions().

m |> guideR::plot_strata_predictions()

On peut aisément ajouter la valeur moyenne des prédictions avec show_mean_line = TRUE et surligner les strates avec des petits effectifs avec highlight_n_below.

m |> 
  guideR::plot_strata_predictions(
    show_mean_line = TRUE,
    highlight_n_below = 20
  )

Il apparaît que les prédictions les plus élevées sont observées en milieu urbain et que les plus faibles sont en milieu rural. Pour une comparaison visuelle des prédictions selon le milieu de résidence, on pourra avoir recours à l’argument by.

m |> guideR::plot_strata_predictions(by = milieu)

Il est possible de diviser le graphique selon une autre variable avec des facettes.

m |> 
  guideR::plot_strata_predictions(by = milieu, sort = FALSE) +
  facet_grid(
    rows = vars(richesse), 
    space = "free_y", 
    scale = "free_y"
  )

Le graphique obtenu avec l’option plot(type = "effect_decomp") permet de visualiser la décomposition entre les effets additifs (représentés en gris) et les effets d’interaction (en orange)4. Dans notre exemple, sans surprise au regard du PVC, les effets d’interaction sont faibles.

4 Ne pas hésiter à consulter l’aide du package MAIHDA pour visualiser les différents graphiques proposés par le package.

m |> plot(type = "effect_decomp")

52.4 Modèles MAIHDA partiellement ajustés

Le recours aux modèles partiellement ajustés vise à quantifier dans quelle mesure les différentes dimensions utilisées pour construire les strates intersectionnelles contribuent à la variance entre les strates observées dans le modèle nul.

Pour cela, on va recalculer, pour chaque variable intersectionnelle, un modèle comprenant cette variable seule en effet fixe et les strates en effet aléatoire5. À chaque fois, on calculera le PCV par rapport au modèle nul. La fonction guideR::tbl_partially_adjusted_maihda() permet de réaliser ces opérations en un seul appel et de présenter l’ensemble des résultats dans un tableau.

5 Un exemple de mise en œuvre présentée dans une vignette du package modelbased sur l’analyse MAIHDA.

m |> 
  guideR::tbl_partially_adjusted_maihda(exponentiate = TRUE)
Caractéristique
Null model
Niveau d’éducation
Niveau de vie (quintiles)
Milieu de résidence
Fully adjusted model
OR 95% IC p-valeur OR 95% IC p-valeur OR 95% IC p-valeur OR 95% IC p-valeur OR 95% IC p-valeur
(Intercept) 0,73 0,54 – 0,98 0,038 0,47 0,34 – 0,67 <0,001 0,63 0,36 – 1,10 0,10 1,03 0,74 – 1,43 0,9 0,67 0,46 – 0,98 0,038
Niveau d'éducation














    aucun










    primaire


1,68 1,00 – 2,82 0,049





1,65 1,27 – 2,14 <0,001
    secondaire/supérieur


2,48 1,43 – 4,31 0,001





2,24 1,67 – 3,02 <0,001
Niveau de vie (quintiles)














    pauvre/très pauvre










    moyen





1,18 0,57 – 2,46 0,7


0,93 0,67 – 1,30 0,7
    riche/très riche





1,28 0,62 – 2,66 0,5


1,10 0,77 – 1,58 0,6
Milieu de résidence














    urbain










    rural








0,50 0,32 – 0,79 0,003 0,50 0,37 – 0,68 <0,001
Summary statistics














Between-stratum variance 0,283

0,132

0,262

0,142

0,008

Variance Partition Coefficient (VPC / adjusted ICC) 7,93%

3,84%

7,38%

4,13%

0,24%

Proportional Change in Variance (PCV)


53,6%

7,56%

50,1%

97,3%

Area Under Receiver Operating Characteristic Curve (AUC) 0,673

0,670

0,671

0,670

0,668

Median Odds Ratio (MOR) 1,66

1,41

1,63

1,43

1,09

Unadjusted ICC (intraclass correlation coefficient) 7,93%

3,70%

7,35%

3,99%

0,21%

Conditional Nakagawa's R2 (fixed + random effects) 7,93%

7,56%

7,70%

7,35%

9,81%

Marginal Nakagawa's R2 (fixed effects only) 0%

3,86%

0,34%

3,36%

9,60%

Abréviations: IC = intervalle de confiance, OR = rapport de cotes
Strata: 18, Observations: 1971, Engine: lme4, Family: binomial

Nous retrouvons un effet limité du niveau de richesse, afin un PCV entre 7 et 8%, alors que les deux autres dimensions (niveau d’éducation et milieu de résidence) ont des contributions plus importantes avec des PCV de l’ordre de plus de 50%.

52.5 Variables d’ajustement et variables de contexte

Il est possible d’ajouter des variables d’ajustement et des variables de contexte dans le modèle, sachant que les deux ne sont pas traitées de la même manière.

Dans nos données descriptives, nous avons vu que l’âge était également associé significativement au fait d’avoir déjà réaliser un test de dépistage du VIH. Selon notre cadre théorique, nous pourrions éventuellement considérer cette variable comme une variable intersectionnelle et en faire une dimension additionnelle pour la construction des strates. Alternativement, nous pouvons envisager de ne pas l’inclure comme dimension intersectionnelle mais vouloir ajuster notre modèle sur l’âge pour tenir compte du fait que la structure par âges diffère d’une strate à l’autre. Dans ce cas, nous allons simplement ajouter la variable groupe_ages comme effet fixe dans le modèle mais sans le faire apparaître dans les effets aléatoires.

Par ailleurs, nous avons vu également que le taux de dépistage variait fortement d’une région à l’autre. Il pourrait alors être pertinent d’ajouter cette information contextuelle au modèle. Pour cela on utilisera l’argument context de la fonction MAIHDA::maihda(). Cette dernière ajoutera un effet aléatoire séparé sur cette variable de contexte, comme c’est l’usage dans les modèles multi-niveaux.

Calculons notre modèle et regardons les résultats.

mac <- MAIHDA::maihda(
  test ~ groupe_ages + educ + richesse + milieu + 
    (1 | educ:richesse:milieu),
  data = femmes,
  family = "binomial",
  context = "region"
)
Binary outcome 'test' recoded to 0/1: 'non' = 0 (reference), 'oui' = 1 (modeled event). Set the factor levels (or supply a 0/1 outcome) to control which level is the event.
mac
MAIHDA Analysis
===============

Null formula:    test ~ groupe_ages + (1 | stratum) + (1 | region)
Adjusted formula:test ~ groupe_ages + educ + richesse + milieu + (1 | stratum) +      (1 | region)
Engine: lme4 | Family: binomial
Context: region (crossed contextual random intercept in the null and adjusted models)
VPC/ICC (null): 0.0747
Context share (null): 0.0471 (between-region share of unexplained variance)
PCV (null -> adjusted): 0.9585
Between-stratum variance: 0.2798 (null) -> 0.0116 (adjusted)
  ~95.9% of the between-stratum variance is additive (the dimensions' main
  effects); the remainder is the between-stratum variance remaining after the
  additive main effects -- a model-dependent quantity

Discriminatory accuracy (null model):
  AUC: 0.693 | MOR: 1.656 | cases/controls: 768/1203
  Adjusted-model AUC: 0.690
Strata: 18
Intersectional interactions: 0 of 18 strata flagged (95% interval, BH-adjusted)

Use summary() for variance components and plot(type = ...) for figures.
mac |> 
  guideR::tbl_maihda(
    exponentiate = TRUE, 
    global_p = TRUE
  )
Caractéristique
Null model
Adjusted model
OR 95% IC p-valeur OR 95% IC p-valeur
(Intercept) 0,46 0,28 – 0,78 0,004 0,37 0,21 – 0,66 <0,001
Groupe d'âges

<0,001

<0,001
    15-24 ans

    25-34 ans 2,19 1,73 – 2,76
2,25 1,78 – 2,84
    35 et plus 1,33 1,03 – 1,71
1,38 1,07 – 1,77
Niveau d'éducation




<0,001
    aucun



    primaire


1,63 1,23 – 2,17
    secondaire/supérieur


2,42 1,75 – 3,33
Niveau de vie (quintiles)




0,5
    pauvre/très pauvre



    moyen


1,01 0,70 – 1,44
    riche/très riche


1,20 0,81 – 1,76
Milieu de résidence




<0,001
    urbain



    rural


0,55 0,40 – 0,76
Summary statistics





Between-stratum variance 0,280

0,012

Variance Partition Coefficient (VPC / adjusted ICC) 7,47%

0,34%

Proportional Change in Variance (PCV)


95,9%

Context share (between-context component of unexplained variance) 4,71%

4,38%

Area Under Receiver Operating Characteristic Curve (AUC) 0,693

0,690

Median Odds Ratio (MOR) 1,66

1,11

Unadjusted ICC (intraclass correlation coefficient) 11,8%

4,20%

Conditional Nakagawa's R2 (fixed + random effects) 14,7%

15,1%

Marginal Nakagawa's R2 (fixed effects only) 2,90%

10,9%

Abréviations: IC = intervalle de confiance, OR = rapport de cotes
Strata: 18, Observations: 1971, Engine: lme4, Family: binomial, Variable(s) in context: region

Par rapport à notre analyse précédente, le PCVa légèrement diminué indiquant des effets d’interaction un plus élevé. Nous voyons que notre variable d’ajustement (le groupe d’âges) contribue significativement au modèle. Enfin, notre variable de contexte (la région) a un VPC en propre, indiquée sur la ligne context share, de 4,7% dans le modèle nul et de 4,4% dans le modèle ajusté.

52.6 Usages avancés

52.6.1 Intervalle de confiance de la PCV

Si vous utilisez engine = "lme4" (l’approche par défaut de MAIHDA), il est possible d’estimer un intervalle de confiance pour le VPC via une approche de type bootstrap. Il suffit de passer bootstrap_vpc = TRUE à guideR::tbl_maihda().

De même, le PCV peut également être estimé par une approche bootstrap avec bootstrap_pcv = TRUE.

Avertissement

ATTENTION : le temps de calcul est particulièrement long (facilement plusieurs heures selon vos données).

On pourra procéder en deux temps en utilisant l’option return_data = TRUE qui permet de lancer le calcul et de récupérer une liste avec les modèles augmentés des informations calculées, puis de passer cette liste directement à guideR::tbl_maihda() sans avoir à recalculer les bootstraps. Il sera ainsi plus facile de personnaliser le tableau final.

l <- 
  m |> 
  guideR::tbl_maihda(
    bootstrap_vpc = TRUE,
    bootstrap_pcv = TRUE
  )
l |> guideR::tbl_maihda(exponentiate = TRUE)

52.6.2 Modèles bayésiens

La méthode MAIHDA intersectionnelle décompose la variation inter-strates en une partie additive (les effets principaux des dimensions intersectionnelles) et une partie d’interaction (l’écart par rapport à l’additivité impliqué par le modèle). Cette conclusion n’est défendable que lorsque chaque strate intersectionnelle est suffisamment peuplée pour permettre l’estimation de son effet. En pratique, ce n’est souvent pas le cas. Le croisement de plusieurs dimensions multiplie le nombre de strates alors que la taille de l’échantillon reste fixe, ce qui entraîne une baisse rapide du nombre de cellules. Il est difficile d’estimer une variance d’interaction à partir de cellules de ce type.

Dans ce type de situation, il peut être pertinent d’utiliser une approche bayésienne via le package brms plutôt qu’un modèle mixte fréquentiste avec lme4. Pour cela, il suffit de lancer MAIHDA::maihda() ou MAIHDA::fit_maihda() avec l’option engine = "brms". Avec ce type de modèle, la distribution a priori régularise les écarts-types inter-strates loin de la limite (afin que l’ajustement ne soit pas singulier) et la distribution a posteriori fournit un intervalle de crédibilité à la place d’un simple nombre. De fait, ce type d’approches permet de générer un intervalle de crédibilité autour du VPC sans avoir à passer par une approche bootstratp. Par contre, pour la PCV, une approche de type bootstrap reste nécessaire.

Nous ne présenterons pas ici d’exemple car le temps de calcul de ce type de modèles est relativement long (plusieurs minutes à plusieurs dizaines de minutes). Pour plus de détails sur ce point, voir la vignette dédiée (en anglais) sur le site de documentation de MAIHDA.

52.6.3 Poids d’enquête

Dans le cadre de données d’enquêtes pondérées avec plan d’échantillonnage complexe (cf. Chapitre 30), il n’existe pas encore d’implémentation des modèles mixtes à effets aléatoires compatibles avec le package survey. Ceci dit, le package WeMix permet le calcul de modèles mixtes avec prise en compte de poids d’enquêtes et le package MAIHDA peut être utilisé avec le package WeMix. Pour cela, on précisera engine = "wemix" et le nom de la variable contenant les poids d’enquête sera précisée avec l’argument sampling_weights.

mp <- MAIHDA::maihda(
  test ~ educ + richesse + milieu + (1 | educ:richesse:milieu),
  data = femmes,
  family = "binomial",
  engine = "wemix",
  sampling_weights = "poids"
)
Binary outcome 'test' recoded to 0/1: 'non' = 0 (reference), 'oui' = 1 (modeled event). Set the factor levels (or supply a 0/1 outcome) to control which level is the event.

La fonction guideR::tbl_maihda() permet d’afficher les résultats6.

6 Les intervalles de confiance et les p-valeurs des effets fixes nécessite une version récente de MAIHDA (≥0.2.1.9000).

mp |> guideR::tbl_maihda(exponentiate = TRUE)
Caractéristique
Null model
Adjusted model
OR 95% IC p-valeur OR 95% IC p-valeur
(Intercept) 0,74 0,52 – 1,03 0,077 0,80 0,39 – 1,64 0,5
Niveau d'éducation





    aucun



    primaire


1,32 0,92 – 1,88 0,13
    secondaire/supérieur


2,23 1,39 – 3,59 <0,001
Niveau de vie (quintiles)





    pauvre/très pauvre



    moyen


0,73 0,40 – 1,34 0,3
    riche/très riche


0,95 0,49 – 1,85 0,9
Milieu de résidence





    urbain



    rural


0,51 0,34 – 0,77 0,001
Summary statistics





Between-stratum variance 0,342

0,043

Variance Partition Coefficient (VPC / adjusted ICC) 9,43%

1,30%

Proportional Change in Variance (PCV)


87,3%

Area Under Receiver Operating Characteristic Curve (AUC) 0,674

0,669

Median Odds Ratio (MOR) 1,75

1,22

Abréviations: IC = intervalle de confiance, OR = rapport de cotes
Strata: 18, Observations: 1971, Engine: wemix, Family: binomial

52.6.4 Décomposition inter-dimensionnelle

Le package MAIHDA propose, en alternative à l’approche classique basée sur deux modèles (modèle nul et modèle ajusté), une approche reposant sur un seul modèle et une décomposition inter-dimensionnelle ou crossed-dimensions decomposition.

Dans cette approche, les effets additifs des variables intersectionnelles sont estimés en introduisant chaque variable intersectionnelle sous la forme d’un effet aléatoire autonome et en ajoutant également un effet aléatoire pour les strates intersectionnelles. Dans notre exemple, le modèle estimé a donc pour équation test ~ 1 + (1 | educ) + (1 | richesse) + (1 | milieu) + (1 | educ:richesse:milieu).

Pour le calculer, nous appellerons la fonction MAIHDA::maihda() avec l’option decomposition = "crossed-dimensions". Il nous suffit de définir les strates et le package MAIHDA rajoutera de lui-même les effets aléatoires additifs.

cdd <- MAIHDA::maihda(
  test ~ 1 + (1 | educ:richesse:milieu),
  data = femmes,
  family = "binomial",
  decomposition = "crossed-dimensions"
)
Binary outcome 'test' recoded to 0/1: 'non' = 0 (reference), 'oui' = 1 (modeled event). Set the factor levels (or supply a 0/1 outcome) to control which level is the event.
boundary (singular) fit: see help('isSingular')

Dans notre exemple, nous voyons un message d’avertissement boundary (singular) nous indiquant qu’au moins que la variance d’au moins un des éléments a été estimée à 0, indiquant un problème de convergence et nous alertant sur le fait que l’analyse de variance n’est pas fiable. Regardons de plus prêt les résultats. Comme nous n’avons pas d’effet fixe, nous pouvons nous permettre de masquer les coefficients avec hide_coefficients = TRUE. À noter, en raison de la singularité déjà mentionnée, le R2 ne peut être correctement calculé.

cdd |> guideR::tbl_maihda(hide_coefficients = TRUE)
boundary (singular) fit: see help('isSingular')
Warning: Can't compute random effect variances. Some variance components equal
  zero. Your model may suffer from singularity (see `?lme4::isSingular`
  and `?performance::check_singularity`).
  Decrease the `tolerance` level to force the calculation of random effect
  variances, or impose priors on your random effects parameters (using
  packages like `brms` or `glmmTMB`).
boundary (singular) fit: see help('isSingular')
Warning: Can't compute random effect variances. Some variance components equal
  zero. Your model may suffer from singularity (see `?lme4::isSingular`
  and `?performance::check_singularity`).
  Decrease the `tolerance` level to force the calculation of random effect
  variances, or impose priors on your random effects parameters (using
  packages like `brms` or `glmmTMB`).
Random effect variances not available. Returned R2 does not account for random effects.
Caractéristique Summary statistics
Between-stratum variance 0,312
Variance Partition Coefficient (VPC / adjusted ICC) 8,66%
Additive vs. Intersectional Decomposition (crossed-dimensions)
    Additive (sum of dimension main effects) variance 0,273
    Intersectional interaction variance 0,039
    Total between-strata variance 0,312
    Additive share of between-strata variance 87,5%
    Interaction share of between-strata variance 12,5%
Per-dimension additive variance
    Niveau d'éducation 0,135
    Niveau de vie (quintiles) 0,000
    Milieu de résidence 0,138
Strata: 18, Observations: 1971, Engine: lme4, Family: binomial

De nouveaux éléments apparaissent dans ce tableau. Tout d’abord, la variance expliquée par les variables intersectionnelles (effets additifs et intersectionnels) est de 0,312 correspondant à 8,66% de la variance totale (VPC). Cette variance entre les strates peut se décomposer entre une dimension additive (somme de la variance de chaque variable intersectionnelle prise isolément) de 0,273 (soit 87,5% du VPC) et une dimension intersectionnelle (variance associée à l’effet aléatoire des strates) de 0,039 (soit 12,5%).

La proportion de variance associée aux effets additifs (additive share of between-strata variance) peut être interprétée de manière similaire du PCV de l’approche classique. Cependant, il ne s’agit pas exactement de la même métrique. Elles abordent toutes deux la même question générale, à savoir quelle part de la variance inter-strates est additive, mais en utilisant des estimateurs différents (effets principaux fixes dans les deux modèles contre variances aléatoires des effets principaux d’un seul modèle, qui sont partiellement regroupées). Elles peuvent être similaires sur le plan directionnel, mais ne sont pas nécessairement proches sur le plan numérique ; il ne faut pas considérer l’une comme une validation de l’autre.

Les dimensions avec peu de modalités sont mal identifiées. La variance additive d’une dimension est estimée à partir de ces quelques niveaux. Une dimension binaire (par exemple, une variable sexe) contribue à une variance estimée à partir de seulement deux groupes ; ainsi, lme4 peut estimer une ou plusieurs composantes de variance égales ou proches de zéro (un ajustement singulier comme dans notre exemple). Cela rend instables les parts additives et interactionnelles.

En présence d’ajustement singulier, une possible est d’avoir recours à l’option engine = "brms" qui est moins sensible. Ou se rabattre sur l’approche classique à deux modèles. Enfin, il est possible de considérer un modèle plus simple en supprimant l’une des dimensions des variables intersectionnelles (mais au prix d’un changement de la question de recherche initiale).

cdd2 <- MAIHDA::maihda(
  test ~ 1 + (1 | educ:milieu),
  data = femmes,
  family = "binomial",
  decomposition = "crossed-dimensions"
)
Binary outcome 'test' recoded to 0/1: 'non' = 0 (reference), 'oui' = 1 (modeled event). Set the factor levels (or supply a 0/1 outcome) to control which level is the event.
cdd2 |> guideR::tbl_maihda(hide_coefficients = TRUE)
Caractéristique Summary statistics
Between-stratum variance 0,308
Variance Partition Coefficient (VPC / adjusted ICC) 8,56%
Unadjusted ICC (intraclass correlation coefficient) 8,56%
Conditional Nakagawa's R2 (fixed + random effects) 8,56%
Marginal Nakagawa's R2 (fixed effects only) 0%
Additive vs. Intersectional Decomposition (crossed-dimensions)
    Additive (sum of dimension main effects) variance 0,250
    Intersectional interaction variance 0,058
    Total between-strata variance 0,308
    Additive share of between-strata variance 81,2%
    Interaction share of between-strata variance 18,8%
Per-dimension additive variance
    Niveau d'éducation 0,134
    Milieu de résidence 0,116
Strata: 6, Observations: 1971, Engine: lme4, Family: binomial

52.7 Lectures complémentaires