11  Représentativité et pondération

WarningTravail de vérification en cours

Les résultats présentés ci-dessous sont provisoires et susceptibles de corrections.

Ce chapitre évalue la représentativité de l’échantillon 2025 des observatoires ruraux et propose des stratégies de pondération pour corriger les biais d’échantillonnage. La démarche suit une progression logique en quatre étapes :

  1. Plan de sondage et poids de base — caractériser le dispositif d’échantillonnage et calculer les poids initiaux.
  2. Évaluation de la représentativité — confronter l’échantillon au RGPH-3 (2018) sur un ensemble élargi d’indicateurs.
  3. Méthodes de correction — appliquer successivement post-stratification, calage et estimation pour petits domaines afin de corriger les biais identifiés.
  4. Perspective historique — examiner la dérive du panel (1995–2015) et le cadre de recalibration.

L’analyse repose sur la théorie de l’échantillonnage assistée par modèle (Särndal, Swensson, and Wretman 2003) et sur les méthodes de calibration (Deville and Särndal 1992). Les calculs sont réalisés avec le package survey pour R (Lumley 2010, 2004).

11.1 Plan de sondage et poids de base

11.1.1 Structure de l’échantillon

Les observatoires ruraux reposent sur un plan de sondage à deux degrés dans lequel les hameaux constituent les unités primaires de sondage (UPS) et les ménages les unités secondaires. Au sein de chaque UPS, un tirage systématique est opéré à partir de la liste de dénombrement.

En 2025, après dix ans d’interruption, l’échantillon a été reconstitué via un nouveau dénombrement exhaustif suivi d’un tirage de ménages. Une partie des ménages tirés sont d’anciens ménages du panel, tandis que d’autres sont entièrement nouveaux. Les probabilités d’inclusion varient donc d’un hameau à l’autre, ce qui impose l’utilisation de pondérations pour obtenir des estimations non biaisées (Kish 1965; Lohr 2022).

11.1.2 Taux de sondage par site

Le taux de sondage varie d’un site (fokontany) à l’autre. Pour chaque ménage, le poids de base (ou poids de design) est l’inverse du taux de sondage de son site :

\[w_i = \frac{N_s}{n_s}\]

\(N_s\) est le nombre de ménages dénombrés dans le site \(s\) et \(n_s\) le nombre de ménages enquêtés (Kish 1965). L’appariement entre la liste de dénombrement et les données d’enquête se fait au niveau du fokontany : pour Marovoay, le préfixe du site est extrait du nom composé du hameau ; pour Alaotra, une table de correspondance relie chaque hameau d’enquête à son fokontany de rattachement. Les fokontany d’Analamiranga et de Maritampona, situés dans la commune d’Amparafaravola, sont traités comme un seul site (« Ambatoharanana-Maritampona ») car ils ont été couverts par la même équipe d’enquêteurs.

Code
# Clé normalisée pour l'appariement
normalize_name <- function(x) {
  x |>
    str_to_lower() |>
    stringi::stri_trans_general("Latin-ASCII") |>
    str_squish()
}

# --- Marovoay : agrégation par site (Fokontany) ---
mr_sites <- c("ampijoroa", "bepako", "madiromiongana", "maroala")

denom_mr <- enum_all |>
  filter(Observatory == "Marovoay") |>
  summarise(n_denombrés = sum(`Nbr ménage D`, na.rm = TRUE), .by = Fokontany) |>
  mutate(site_key = normalize_name(Fokontany)) |>
  rename(Site = Fokontany)

enquetes_mr <- res_deb |>
  filter(Observatory == "Marovoay") |>
  mutate(site_key = str_extract(normalize_name(j4),
                                str_c(mr_sites, collapse = "|"))) |>
  count(site_key, name = "n_enquetes")

sampling_mr <- denom_mr |>
  left_join(enquetes_mr, by = "site_key") |>
  mutate(n_enquetes = replace_na(n_enquetes, 0), Observatory = "Marovoay") |>
  select(Observatory, Site, site_key, n_denombrés, n_enquetes)

# --- Alaotra : correspondance j4 (hameau) → Fokontany ---
# Maritampona et Analamiranga = même site (mêmes enquêteurs, commune Amparafaravola)
al_j4_fkt <- tribble(
  ~j4_norm,             ~site_key,
  "ambatoharanana",     "ambatoharanana-maritampona",
  "ambatomanga",        "ambatomanga",
  "ambodivoara",        "ambatoharanana-maritampona",
  "ambohidrony",        "ambohidrony",
  "analamiranga",       "ambatoharanana-maritampona",
  "avaradrano",         "avaradrano",
  "feramanga atsimo",   "feramanga atsimo",
  "mangabe",            "mangabe"
)

denom_al <- enum_all |>
  filter(Observatory == "Alaotra") |>
  mutate(
    site_key = case_when(
      Fokontany %in% c("Analamiranga", "Maritampona") ~
        "ambatoharanana-maritampona",
      TRUE ~ normalize_name(Fokontany)
    ),
    Site = case_when(
      Fokontany %in% c("Analamiranga", "Maritampona") ~
        "Ambatoharanana-Maritampona",
      TRUE ~ Fokontany
    )
  ) |>
  summarise(
    n_denombrés = sum(`Nbr ménage D`, na.rm = TRUE),
    .by = c(Site, site_key)
  )

enquetes_al <- res_deb |>
  filter(Observatory == "Alaotra") |>
  mutate(j4_norm = normalize_name(j4)) |>
  left_join(al_j4_fkt, by = "j4_norm") |>
  count(site_key, name = "n_enquetes")

sampling_al <- denom_al |>
  left_join(enquetes_al, by = "site_key") |>
  mutate(n_enquetes = replace_na(n_enquetes, 0), Observatory = "Alaotra") |>
  select(Observatory, Site, site_key, n_denombrés, n_enquetes)

# --- Tableau combiné ---
sampling <- bind_rows(sampling_al, sampling_mr) |>
  mutate(
    taux_sondage = ifelse(n_denombrés > 0,
                          round(n_enquetes / n_denombrés * 100, 1), NA_real_),
    poids_base = ifelse(n_enquetes > 0, n_denombrés / n_enquetes, NA_real_)
  )

sampling |>
  select(Observatory, Site, n_denombrés, n_enquetes, taux_sondage, poids_base) |>
  arrange(Observatory, Site) |>
  obs_gt() |>
  cols_label(
    Site = "Site (Fokontany)",
    n_denombrés = "Ménages dénombrés",
    n_enquetes = "Ménages enquêtés",
    taux_sondage = "Taux de sondage (%)",
    poids_base = "Poids de base"
  ) |>
  fmt_number(columns = c(taux_sondage, poids_base), decimals = 1) |>
  tab_source_note(
    source_note = md("**Source** : Synthèse Dénombrement OR 2025 & Enquête 2025")
  ) |>
  style_table()
Table 11.1: Taux de sondage par site (fokontany)
Site (Fokontany) Ménages dénombrés Ménages enquêtés Taux de sondage (%) Poids de base
Alaotra
Ambatoharanana-Maritampona 413 135 32.7 3.1
Ambatomanga 764 68 8.9 11.2
Ambohidrony 639 52 8.1 12.3
Avaradrano 346 90 26.0 3.8
Feramanga Atsimo 543 89 16.4 6.1
Mangabe 400 73 18.2 5.5
Marovoay
Ampijoroa 699 143 20.5 4.9
Bepako 575 123 21.4 4.7
Madiromiongana 598 137 22.9 4.4
Maroala 634 116 18.3 5.5
Source : Synthèse Dénombrement OR 2025 & Enquête 2025
Source : Enquête auprès des OR 2025
Code
sampling |>
  filter(!is.na(taux_sondage)) |>
  make_bar_obs(
    x = Site,
    y = taux_sondage,
    title = "Taux de sondage par site",
    y_label = "Taux de sondage (%)",
    show_pct = FALSE
  )
Figure 11.1: Distribution des taux de sondage par site et observatoire

11.1.3 Estimations pondérées vs. non pondérées

Nous construisons un objet svydesign en spécifiant les sites (fokontany) comme strates. Dans la mesure où les sites sont exhaustivement couverts (il ne s’agit pas d’un tirage d’UPS parmi un ensemble plus large), chaque fokontany est traité comme une strate avec un tirage à un seul degré.

L’écart entre les estimations pondérées et non pondérées indique dans quelle mesure les taux de sondage inégaux affectent les statistiques descriptives. Un écart faible suggère un plan approximativement auto-pondéré ; un écart important justifie l’usage systématique des poids.

Code
# Taille du ménage
hh_size <- res_m_a |>
  count(j0, j5, Observatory, name = "taille")

deb_w2 <- deb_w |>
  left_join(hh_size |> select(j0, j5, taille), by = c("j0", "j5"))

design_or2 <- svydesign(
  ids = ~1,
  strata = ~site_key,
  weights = ~poids_base,
  data = deb_w2,
  nest = TRUE
)

# Non pondéré
np <- deb_w2 |>
  summarise(
    Moyenne = mean(taille, na.rm = TRUE),
    ET = sd(taille, na.rm = TRUE),
    .by = Observatory
  ) |>
  mutate(Type = "Non pondéré")

# Pondéré
pond_al <- svymean(~taille,
                   subset(design_or2, Observatory == "Alaotra"),
                   na.rm = TRUE)
pond_mr <- svymean(~taille,
                   subset(design_or2, Observatory == "Marovoay"),
                   na.rm = TRUE)

p <- tibble(
  Observatory = c("Alaotra", "Marovoay"),
  Moyenne = c(coef(pond_al), coef(pond_mr)),
  ET = c(SE(pond_al), SE(pond_mr)),
  Type = "Pondéré"
)

bind_rows(np, p) |>
  pivot_wider(names_from = Type, values_from = c(Moyenne, ET),
              names_glue = "{Type}_{.value}") |>
  gt() |>
  cols_label(
    Observatory = "Observatoire",
    `Non pondéré_Moyenne` = "Moyenne",
    `Non pondéré_ET` = "ET / ES",
    `Pondéré_Moyenne` = "Moyenne",
    `Pondéré_ET` = "ET / ES"
  ) |>
  tab_spanner(label = "Non pondéré", columns = starts_with("Non")) |>
  tab_spanner(label = "Pondéré", columns = starts_with("Pond")) |>
  fmt_number(decimals = 2) |>
  tab_source_note(
    source_note = md("ET = écart-type (non pondéré) ; ES = erreur standard (pondéré)")
  ) |>
  style_table()
Table 11.2: Taille moyenne des ménages : estimation non pondérée vs. pondérée
Observatoire
Non pondéré
Pondéré
Moyenne ET / ES Moyenne ET / ES
Alaotra 3.90 1.65 3.90 0.08
Marovoay 4.43 2.20 4.45 0.10
ET = écart-type (non pondéré) ; ES = erreur standard (pondéré)
Source : Enquête auprès des OR 2025

11.2 Évaluation de la représentativité

Pour évaluer la représentativité externe de l’échantillon, nous le confrontons aux données du 3e Recensement Général de la Population et de l’Habitation (RGPH-3) de 2018 (INSTAT 2020). Le RGPH-3 fournit un échantillon de 10 % des ménages et résidents au niveau national. Nous comparons sur un ensemble élargi d’indicateurs — démographie, scolarisation, alphabétisation, situation matrimoniale et habitat — afin d’identifier d’éventuels biais de couverture de l’échantillon OR.

NotePérimètre et limites de la comparaison

Trois réserves sont nécessaires :

  1. Écart temporel : sept années séparent le RGPH (2018) de l’enquête (2025). Les structures démographiques ont pu évoluer, notamment du fait des migrations, de la transition démographique et des chocs climatiques récurrents.

  2. Maille géographique : le RGPH-3 ne descend pas au niveau du fokontany. Nous comparons au niveau des communes couvertes par les observatoires (4 communes pour Alaotra, 3 pour Marovoay), en ne retenant que le milieu rural (MILIEU = 2). Les observatoires couvrent des hameaux spécifiques au sein de ces communes ; les profils démographiques de l’ensemble de la commune peuvent différer de ceux des sites enquêtés.

  3. Nature de la source : le RGPH est un recensement de droit (population résidente habituelle) alors que l’enquête OR interroge les ménages présents au moment de l’enquête.

Ces comparaisons doivent donc être lues comme des ordres de grandeur, non comme des tests formels de représentativité.

11.2.1 Indicateurs démographiques de base

Code
comparison <- or_hh_size |>
  left_join(rgph_hh_size, by = "Observatory") |>
  left_join(or_fem_cm, by = "Observatory") |>
  left_join(rgph_fem_cm, by = "Observatory") |>
  left_join(or_age_cm, by = "Observatory") |>
  left_join(rgph_age_cm, by = "Observatory") |>
  left_join(or_sex_ratio, by = "Observatory") |>
  left_join(rgph_sex_ratio, by = "Observatory")

comparison |>
  gt() |>
  cols_label(
    Observatory = "Observatoire",
    Moyenne_OR = "OR 2025",
    Moyenne_RGPH = "RGPH 2018",
    Pct_fem_CM_OR = "OR 2025",
    Pct_fem_CM_RGPH = "RGPH 2018",
    Age_CM_OR = "OR 2025",
    Age_CM_RGPH = "RGPH 2018",
    Pct_femmes_OR = "OR 2025",
    Pct_femmes_RGPH = "RGPH 2018"
  ) |>
  tab_spanner(label = "Taille moy. ménage",
              columns = c(Moyenne_OR, Moyenne_RGPH)) |>
  tab_spanner(label = "% femmes CM",
              columns = c(Pct_fem_CM_OR, Pct_fem_CM_RGPH)) |>
  tab_spanner(label = "Âge moyen CM",
              columns = c(Age_CM_OR, Age_CM_RGPH)) |>
  tab_spanner(label = "% femmes (ensemble)",
              columns = c(Pct_femmes_OR, Pct_femmes_RGPH)) |>
  fmt_number(columns = c(Moyenne_OR, Moyenne_RGPH, Age_CM_OR, Age_CM_RGPH),
             decimals = 1) |>
  fmt_number(columns = c(Pct_fem_CM_OR, Pct_fem_CM_RGPH,
                         Pct_femmes_OR, Pct_femmes_RGPH),
             decimals = 1, pattern = "{x} %") |>
  tab_source_note(source_note = md(
    "**Sources** : Enquête OR 2025 ; RGPH-3 2018 (INSTAT), échantillon 10 %.<br>
    RGPH filtré sur le milieu rural des communes couvertes par les observatoires."
  )) |>
  style_table()
Table 11.3: Comparaison OR 2025 vs. RGPH 2018 — Indicateurs démographiques (milieu rural)
Observatoire
Taille moy. ménage
% femmes CM
Âge moyen CM
% femmes (ensemble)
OR 2025 RGPH 2018 OR 2025 RGPH 2018 OR 2025 RGPH 2018 OR 2025 RGPH 2018
Alaotra 3.9 4.2 21.7 % 21.1 % 45.4 42.6 50.1 % 50.5 %
Marovoay 4.4 4.3 22.0 % 26.6 % 46.1 41.2 50.5 % 50.4 %
Sources : Enquête OR 2025 ; RGPH-3 2018 (INSTAT), échantillon 10 %.
RGPH filtré sur le milieu rural des communes couvertes par les observatoires.
Source : Enquête auprès des OR 2025

11.2.2 Indicateurs socio-économiques complémentaires

Au-delà de la démographie de base, le RGPH et l’enquête OR partagent plusieurs dimensions socio-économiques : alphabétisation, scolarisation, situation matrimoniale du chef de ménage, et caractéristiques de l’habitat. L’examen de ces indicateurs permet de préciser dans quelles dimensions l’échantillon est (ou n’est pas) représentatif.

Code
# Build comparison table via row-binding (avoids c() length issues across
# different knitr/format contexts).
get_row <- function(label, or_df, or_col, rgph_df, rgph_col) {
  safe_val <- function(df, obs, col) {
    if (!col %in% names(df)) return(NA_real_)
    v <- df[[col]][df$Observatory == obs]
    if (length(v) == 0) NA_real_ else as.double(v[1L])
  }
  tibble(
    Indicateur   = label,
    Alaotra_OR   = safe_val(or_df,   "Alaotra",  or_col),
    Alaotra_RGPH = safe_val(rgph_df, "Alaotra",  rgph_col),
    Marovoay_OR  = safe_val(or_df,   "Marovoay", or_col),
    Marovoay_RGPH = safe_val(rgph_df, "Marovoay", rgph_col)
  )
}

ext_comp <- bind_rows(
  get_row("Alphabétisation (≥15 ans, %)",
          or_lit, "pct_lit_OR", rgph_lit, "pct_lit_RGPH"),
  get_row("Jamais scolarisé (≥6 ans, %)",
          or_educ, "pct_jamais_OR", rgph_educ, "pct_jamais_RGPH"),
  get_row("CM marié(e)/en union (%)",
          or_marital, "OR_marie", rgph_marital, "RGPH_marie"),
  get_row("CM veuf/divorcé (%)",
          or_marital, "OR_veuf_div", rgph_marital, "RGPH_veuf_div"),
  get_row("Murs en dur (%)",
          or_wall, "OR_Dur", rgph_wall, "RGPH_Dur"),
  get_row("Murs en terre/pisé (%)",
          or_wall, "OR_Terre/pisé", rgph_wall, "RGPH_Terre/pisé"),
  get_row("Eau améliorée (%)",
          or_water, "OR_Amélioré", rgph_water, "RGPH_Amélioré")
)

ext_comp |>
  gt() |>
  safe_cols_label(
    Indicateur = "Indicateur",
    Alaotra_OR = "OR 2025", Alaotra_RGPH = "RGPH 2018",
    Marovoay_OR = "OR 2025", Marovoay_RGPH = "RGPH 2018"
  ) |>
  safe_tab_spanner(label = "Alaotra", columns = starts_with("Alaotra")) |>
  safe_tab_spanner(label = "Marovoay", columns = starts_with("Marovoay")) |>
  fmt_number(columns = -Indicateur, decimals = 1) |>
  tab_source_note(source_note = md(
    "**Sources** : Enquête OR 2025 ; RGPH-3 2018 (INSTAT), échantillon 10 %, milieu rural.<br>
    Alphabétisation : sait lire et écrire en malgache (RGPH) ; sait lire (OR, y compris « avec effort »).<br>
    Situation matrimoniale harmonisée (marié + union libre + polygame = marié/union).<br>
    Eau améliorée : robinet, borne fontaine, puits protégé, forage, source (définition JMP/OMS).<br>
    Murs : « dur » = parpaing, pierre, brique cuite."
  )) |>
  style_table()
Table 11.4: Indicateurs socio-économiques complémentaires — OR 2025 vs. RGPH 2018
Indicateur
Alaotra
Marovoay
OR 2025 RGPH 2018 OR 2025 RGPH 2018
Alphabétisation (≥15 ans, %) 91.0 89.9 79.4 68.6
Jamais scolarisé (≥6 ans, %) 6.7 8.9 16.6 29.0
CM marié(e)/en union (%) 73.3 77.7 72.9 72.4
CM veuf/divorcé (%) 24.4 17.6 25.8 23.0
Murs en dur (%) 18.7 43.0 7.2 8.6
Murs en terre/pisé (%) 81.3 55.2 42.6 56.1
Eau améliorée (%) 60.3 61.5 30.3 27.2
Sources : Enquête OR 2025 ; RGPH-3 2018 (INSTAT), échantillon 10 %, milieu rural.
Alphabétisation : sait lire et écrire en malgache (RGPH) ; sait lire (OR, y compris « avec effort »).
Situation matrimoniale harmonisée (marié + union libre + polygame = marié/union).
Eau améliorée : robinet, borne fontaine, puits protégé, forage, source (définition JMP/OMS).
Murs : « dur » = parpaing, pierre, brique cuite.
Source : Enquête auprès des OR 2025

La comparaison élargie confirme que l’échantillon OR reproduit raisonnablement les structures de la population RGPH pour la plupart des indicateurs, avec quelques écarts notables :

  • Alphabétisation : l’échantillon OR affiche des taux d’alphabétisation plus élevés que le RGPH, en particulier à Marovoay. L’écart s’explique en partie par le progrès de la scolarisation entre 2018 et 2025, et en partie par la définition plus inclusive retenue dans l’OR (« sait lire, même avec effort »).
  • Scolarisation : le pourcentage de personnes n’ayant jamais fréquenté l’école est nettement plus faible dans l’OR, ce qui va dans le même sens.
  • Situation matrimoniale : les proportions de CM veufs/divorcés sont plus élevées dans l’OR, signe possible d’un biais de sélection (les ménages stables, dirigés par des personnes plus âgées, sont plus facilement enquêtés).
  • Habitat : des écarts importants apparaissent sur les matériaux de construction (murs en dur, terre/pisé), reflet possible de la couverture géographique différente entre les sites OR et l’ensemble des communes RGPH. L’accès à l’eau améliorée est plus élevé dans l’OR que dans le RGPH, possiblement en raison d’améliorations intervenues entre 2018 et 2025.

11.2.3 Pyramides des âges

Code
# Pyramide OR
or_pyramid <- res_m_a |>
  filter(!is.na(m5), !is.na(m4)) |>
  mutate(
    Tranche = cut(m5, breaks = c(seq(0, 80, 5), Inf),
                  right = FALSE,
                  labels = c(paste(seq(0, 75, 5), seq(4, 79, 5), sep = "-"), "80+")),
    Sexe = if_else(m4 == 1, "Homme", "Femme"),
    Source = "OR 2025"
  ) |>
  count(Observatory, Tranche, Sexe, Source) |>
  mutate(pct = n / sum(n) * 100, .by = c(Observatory, Source))

# Pyramide RGPH
rgph_pyramid <- rgph_res_or |>
  mutate(age = as.numeric(P08), sexe = as.numeric(P05)) |>
  filter(!is.na(age), !is.na(sexe)) |>
  mutate(
    Tranche = cut(age, breaks = c(seq(0, 80, 5), Inf),
                  right = FALSE,
                  labels = c(paste(seq(0, 75, 5), seq(4, 79, 5), sep = "-"), "80+")),
    Sexe = if_else(sexe == 1, "Homme", "Femme"),
    Source = "RGPH 2018"
  ) |>
  count(Observatory, Tranche, Sexe, Source) |>
  mutate(pct = n / sum(n) * 100, .by = c(Observatory, Source))

# Combinaison
pyramid_combined <- bind_rows(or_pyramid, rgph_pyramid) |>
  mutate(pct = if_else(Sexe == "Homme", -pct, pct))

ggplot(pyramid_combined, aes(x = Tranche, y = pct)) +
  # OR 2025 : barres pleines
  geom_col(
    data = \(d) filter(d, Source == "OR 2025"),
    aes(fill = Sexe), position = "identity", color = NA
  ) +
  # RGPH 2018 : contours noirs
  geom_col(
    data = \(d) filter(d, Source == "RGPH 2018"),
    position = "identity",
    fill = NA, color = "black", linewidth = 0.6
  ) +
  coord_flip() +
  facet_wrap(~Observatory) +
  scale_fill_manual(values = c("Homme" = "#4E79A7", "Femme" = "#E15759"),
                    name = "OR 2025") +
  labs(title = "Comparaison des pyramides des âges",
       subtitle = "Barres pleines : OR 2025 — Contours noirs : RGPH 2018",
       x = NULL, y = "% de la population") +
  theme_ror() +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(color = "grey40"),
        strip.text = element_text(face = "bold"))
Figure 11.2: Pyramides des âges comparées : OR 2025 vs. RGPH 2018 (milieu rural)

11.2.4 Détail communal

Le tableau ci-dessous présente les caractéristiques démographiques des communes couvertes par les observatoires, d’après le RGPH-3 (échantillon 10 %, milieu rural uniquement) et l’enquête OR 2025. Seules les communes comprenant au moins un site enquêté sont affichées ; la commune d’Amparafaravola (site Ambatoharanana-Maritampona) ne figure pas dans les données rurales du RGPH.

Code
codes_communes <- read.csv(
  "data/RGPH_2018_Madagascar/data/codes_communes_mg.csv"
)

# --- Correspondance site → commune (depuis le dénombrement nettoyé) ---
site_commune_map <- enum_all |>
  mutate(
    site_key = case_when(
      Observatory == "Alaotra" &
        Fokontany %in% c("Analamiranga", "Maritampona") ~
        "ambatoharanana-maritampona",
      TRUE ~ normalize_name(Fokontany)
    )
  ) |>
  filter(!is.na(Commune)) |>
  distinct(site_key, Commune, Observatory)

# --- Crosswalk commune OR → RGPH (gestion des casses et orthographes) ---
commune_xwalk_tbl <- tribble(
  ~Commune,            ~Commune_RGPH,
  "Ambohiboromanga",   "AMBOHIBOROMANGA",
  "Morarano Chrome",   "MORARANO CHROME",
  "Ilafy",             "ILAFY",
  "Feramanga Nord",    "FERAMANGE NORD",
  "Amparafaravola",    NA_character_,
  "Tsararano",         "TSARARANO",
  "Ankazomborona",     "ANKAZOMBORONA",
  "Antanimasaka",      "ANTANIMASAKA"
)

# --- RGPH stats par commune ---
commune_rgph <- rgph_res_or |>
  left_join(
    codes_communes |> rename(COMMUNES = CODECOM, Commune_RGPH = COMMUNEARRONDISSEMENT),
    by = "COMMUNES"
  ) |>
  summarise(
    Rés_RGPH = n(),
    Mén_RGPH = n_distinct(IDMEN),
    Taille_RGPH = round(n() / n_distinct(IDMEN), 1),
    Fem_RGPH = round(mean(as.numeric(P05) == 2, na.rm = TRUE) * 100, 1),
    Âge_RGPH = round(mean(as.numeric(P08), na.rm = TRUE), 1),
    .by = c(Observatory, COMMUNES, Commune_RGPH)
  ) |>
  arrange(Observatory, COMMUNES)

# --- OR stats par commune ---
or_commune_hh <- res_m_a |>
  count(j5, Observatory, name = "taille") |>
  left_join(
    res_deb |>
      mutate(
        j4_norm = normalize_name(j4),
        site_key = case_when(
          Observatory == "Marovoay" ~
            str_extract(j4_norm, str_c(mr_sites, collapse = "|")),
          Observatory == "Alaotra" ~
            al_j4_fkt$site_key[match(j4_norm, al_j4_fkt$j4_norm)]
        )
      ) |>
      select(j5, site_key),
    by = "j5"
  ) |>
  left_join(site_commune_map |> select(site_key, Commune), by = "site_key")

commune_or <- or_commune_hh |>
  filter(!is.na(Commune)) |>
  summarise(
    Mén_OR = n_distinct(j5),
    Taille_OR = round(mean(taille), 1),
    .by = c(Observatory, Commune)
  )

or_commune_indiv <- res_m_a |>
  left_join(
    res_deb |>
      mutate(
        j4_norm = normalize_name(j4),
        site_key = case_when(
          Observatory == "Marovoay" ~
            str_extract(j4_norm, str_c(mr_sites, collapse = "|")),
          Observatory == "Alaotra" ~
            al_j4_fkt$site_key[match(j4_norm, al_j4_fkt$j4_norm)]
        )
      ) |>
      select(j5, site_key),
    by = "j5"
  ) |>
  left_join(site_commune_map |> select(site_key, Commune), by = "site_key") |>
  filter(!is.na(Commune))

commune_or2 <- or_commune_indiv |>
  summarise(
    Rés_OR = n(),
    Fem_OR = round(mean(m4 == 2, na.rm = TRUE) * 100, 1),
    Âge_OR = round(mean(m5, na.rm = TRUE), 1),
    .by = c(Observatory, Commune)
  )

commune_or_full <- commune_or |>
  left_join(commune_or2, by = c("Observatory", "Commune")) |>
  left_join(commune_xwalk_tbl, by = "Commune")

# --- Tableau combiné via crosswalk ---
commune_stats <- commune_rgph |>
  full_join(
    commune_or_full,
    by = c("Observatory", "Commune_RGPH")
  ) |>
  mutate(Commune = coalesce(Commune, Commune_RGPH)) |>
  filter(!is.na(Commune_RGPH) | !is.na(Mén_OR))

commune_stats |>
  select(Observatory, Commune, Rés_RGPH, Mén_RGPH, Taille_RGPH, Fem_RGPH, Âge_RGPH,
         Rés_OR, Mén_OR, Taille_OR, Fem_OR, Âge_OR) |>
  obs_gt() |>
  cols_label(
    Commune = "Commune",
    Rés_RGPH = "Rés.", Mén_RGPH = "Mén.", Taille_RGPH = "Taille",
    Fem_RGPH = "% fem.", Âge_RGPH = "Âge moy.",
    Rés_OR = "Rés.", Mén_OR = "Mén.", Taille_OR = "Taille",
    Fem_OR = "% fem.", Âge_OR = "Âge moy."
  ) |>
  tab_spanner(label = "RGPH 2018",
              columns = c(Rés_RGPH, Mén_RGPH, Taille_RGPH, Fem_RGPH, Âge_RGPH)) |>
  tab_spanner(label = "OR 2025",
              columns = c(Rés_OR, Mén_OR, Taille_OR, Fem_OR, Âge_OR)) |>
  fmt_number(columns = c(Fem_RGPH, Âge_RGPH, Fem_OR, Âge_OR), decimals = 1) |>
  sub_missing(missing_text = "—") |>
  tab_source_note(
    source_note = md("**Sources** : RGPH-3 2018 (échantillon 10 %, milieu rural) ; Enquête OR 2025.<br>
    Le site d'Ambatoharanana-Maritampona correspond à la commune d'Amparafaravola,<br>
    qui n'apparaît pas dans les données rurales du RGPH.")
  ) |>
  style_table()
Table 11.5: Caractéristiques démographiques par commune — OR 2025 vs. RGPH 2018 (milieu rural)
Commune
RGPH 2018
OR 2025
Rés. Mén. Taille % fem. Âge moy. Rés. Mén. Taille % fem. Âge moy.
Alaotra
Feramanga Nord 1408 341 4.1 50.4 24.2 338 90 3.8 53.0 26.2
Ilafy 1384 340 4.1 52.0 24.4 294 73 4.0 49.5 26.6
Ambohiboromanga 720 174 4.1 50.3 23.6 339 89 3.8 44.5 26.3
Morarano Chrome 4183 979 4.3 50.0 23.3 472 120 3.9 50.2 25.0
Amparafaravola 532 135 3.9 52.1 25.8
Marovoay
Ankazomborona 2931 718 4.1 50.5 23.2 529 137 3.9 48.9 28.1
Tsararano 1094 248 4.4 50.5 22.6 535 123 4.3 54.9 24.3
Antanimasaka 1488 318 4.7 50.1 22.1 1233 259 4.8 49.4 23.4
Sources : RGPH-3 2018 (échantillon 10 %, milieu rural) ; Enquête OR 2025.
Le site d’Ambatoharanana-Maritampona correspond à la commune d’Amparafaravola,
qui n’apparaît pas dans les données rurales du RGPH.
Source : Enquête auprès des OR 2025
Code
knitr::asis_output("
::: {.callout-important}
## Données RGPH non disponibles

Les fichiers SPSS du RGPH 2018 n'ont pas été trouvés dans `data/RGPH_2018_Madagascar/data/`.
La comparaison n'a pas pu être effectuée.
:::
")

11.3 Méthodes de correction

Les comparaisons précédentes montrent que l’échantillon OR reproduit raisonnablement les grandes structures de la population, mais avec des écarts ponctuels (surreprésentation des CM veufs/divorcés, sous-représentation des jeunes non scolarisés, divergences sur l’habitat). Trois familles de méthodes, d’ambition croissante, permettent de corriger ces biais :

  1. Post-stratification — repondérer l’échantillon pour que la distribution d’une variable catégorielle (sexe du CM, classe d’âge) corresponde exactement aux proportions connues dans la population. C’est la correction la plus simple : elle partitionne l’échantillon en strates définies a posteriori, puis ajuste les poids strate par strate.

  2. Calage sur marges (calibration) — généralisation de la post-stratification à plusieurs variables simultanées (sexe × classe d’âge, taille du ménage, etc.). La méthode de Deville and Särndal (1992) ajuste les poids de manière continue en minimisant une distance aux poids initiaux, sous la contrainte que les totaux pondérés de variables auxiliaires reproduisent exactement les marges connues. Avec une seule variable binaire, calage et post-stratification sont algébriquement équivalents ; l’intérêt du calage apparaît avec des contraintes multidimensionnelles.

  3. Estimation pour petits domaines — lorsque l’on souhaite des estimations à une maille fine (commune, fokontany), les effectifs par domaine sont trop faibles pour une estimation directe fiable. Les modèles de type Fay-Herriot (Fay and Herriot 1979) combinent l’information directe de l’échantillon avec des covariables auxiliaires connues pour tous les domaines, « empruntant de la force » aux relations observées entre domaines (Rao and Molina 2015).

11.3.1 Post-stratification par sexe du chef de ménage

Nous illustrons la post-stratification avec le sexe du CM. Les marges — effectifs de CM masculins et féminins — proviennent du RGPH (milieu rural, communes couvertes). Si les strates de post-stratification sont corrélées à la variable d’intérêt, la variance de l’estimateur est réduite (Särndal, Swensson, and Wretman 2003, chap. 7).

Code
# Pondéré simple
w_al <- svymean(~taille, des_al, na.rm = TRUE)
w_mr <- svymean(~taille, des_mr, na.rm = TRUE)

# Post-stratifié
ps_al_est <- svymean(~taille, ps_al, na.rm = TRUE)
ps_mr_est <- svymean(~taille, ps_mr, na.rm = TRUE)

tibble(
  Observatoire = c("Alaotra", "Marovoay"),
  `Moy. pondérée` = c(coef(w_al), coef(w_mr)),
  `ES pondérée` = c(SE(w_al), SE(w_mr)),
  `Moy. post-strat.` = c(coef(ps_al_est), coef(ps_mr_est)),
  `ES post-strat.` = c(SE(ps_al_est), SE(ps_mr_est))
) |>
  gt() |>
  fmt_number(decimals = 3) |>
  tab_spanner(label = "Pondération de base", columns = 2:3) |>
  tab_spanner(label = "Post-stratification (sexe CM)", columns = 4:5) |>
  tab_source_note(
    source_note = md("ES = erreur standard. Post-stratification sur le sexe du CM, marges RGPH-3 2018.")
  ) |>
  style_table()
Table 11.6: Taille moyenne des ménages — comparaison des estimateurs
Observatoire
Pondération de base
Post-stratification (sexe CM)
Moy. pondérée ES pondérée Moy. post-strat. ES post-strat.
Alaotra 3.903 0.083 3.906 0.080
Marovoay 4.450 0.097 4.399 0.094
ES = erreur standard. Post-stratification sur le sexe du CM, marges RGPH-3 2018.
Source : Enquête auprès des OR 2025

La post-stratification modifie très légèrement les estimations ponctuelles et réduit marginalement l’erreur standard. L’impact limité s’explique par le fait que la proportion de femmes CM dans l’échantillon OR est déjà proche de celle du RGPH.

11.3.2 Calage sur marges (calibration)

Nous appliquons le calage linéaire (survey::calibrate()) avec le sexe du CM comme seule variable de calage. La méthode minimise la distance chi-deux entre les poids initiaux et les poids calés, sous la contrainte que le total pondéré de femmes CM corresponde exactement à la marge RGPH.

Code
cal_al_est <- svymean(~taille, cal_al, na.rm = TRUE)
cal_mr_est <- svymean(~taille, cal_mr, na.rm = TRUE)

tibble(
  Observatoire = c("Alaotra", "Marovoay"),
  `Moy. pondérée` = c(coef(w_al), coef(w_mr)),
  `ES pondérée` = c(SE(w_al), SE(w_mr)),
  `Moy. post-strat.` = c(coef(ps_al_est), coef(ps_mr_est)),
  `ES post-strat.` = c(SE(ps_al_est), SE(ps_mr_est)),
  `Moy. calée` = c(coef(cal_al_est), coef(cal_mr_est)),
  `ES calée` = c(SE(cal_al_est), SE(cal_mr_est))
) |>
  gt() |>
  fmt_number(decimals = 3) |>
  tab_spanner(label = "Pondération de base", columns = 2:3) |>
  tab_spanner(label = "Post-stratification", columns = 4:5) |>
  tab_spanner(label = "Calage (sexe CM)", columns = 6:7) |>
  tab_source_note(
    source_note = md("Post-stratification et calage sur le sexe du CM ; marges RGPH-3 2018.<br>
    Avec une seule variable binaire, les deux méthodes produisent des résultats identiques [@deville1992].")
  ) |>
  style_table()
Table 11.7: Comparaison des estimateurs — pondération de base, post-stratification et calage
Observatoire
Pondération de base
Post-stratification
Calage (sexe CM)
Moy. pondérée ES pondérée Moy. post-strat. ES post-strat. Moy. calée ES calée
Alaotra 3.903 0.083 3.906 0.080 3.906 0.080
Marovoay 4.450 0.097 4.399 0.094 4.399 0.094
Post-stratification et calage sur le sexe du CM ; marges RGPH-3 2018.
Avec une seule variable binaire, les deux méthodes produisent des résultats identiques (Deville and Särndal 1992).
Source : Enquête auprès des OR 2025

Comme attendu, calage et post-stratification produisent des résultats identiques avec une seule variable binaire. L’intérêt du calage apparaîtrait avec plusieurs variables simultanées (sexe × classe d’âge du CM, taille du ménage, etc.), permettant de corriger des biais multidimensionnels en un seul ajustement.

11.3.3 Estimation pour petits domaines : modèle de Fay-Herriot

Le modèle de Fay-Herriot (Fay and Herriot 1979) combine les estimations directes au niveau communal avec des covariables auxiliaires issues du RGPH :

\[\hat{y}_i^{FH} = \gamma_i \hat{y}_i^{dir} + (1 - \gamma_i) \mathbf{x}_i' \hat{\boldsymbol{\beta}}\]

\(\gamma_i = \hat{\sigma}_v^2 / (\hat{\sigma}_v^2 + \hat{\psi}_i)\) est le facteur de retrait (shrinkage), \(\hat{\sigma}_v^2\) la variance inter-domaines estimée et \(\hat{\psi}_i\) la variance d’échantillonnage du domaine \(i\).

Code
fh_table <- fh_data |>
  mutate(
    FH_EBLUP = round(as.numeric(fh_result$est$eblup), 2),
    SE_direct = round(sqrt(var_dir), 3),
    SE_FH = round(sqrt(fh_result$mse), 3),
    y_dir = round(y_dir, 2),
    x_taille = round(x_taille, 2)
  )

fh_table |>
  dplyr::select(Observatory, Commune, n_obs, y_dir, SE_direct, x_taille, FH_EBLUP, SE_FH) |>
  obs_gt() |>
  cols_label(
    Commune = "Commune",
    n_obs = "n (OR)",
    y_dir = "Directe",
    SE_direct = "ES dir.",
    x_taille = "RGPH",
    FH_EBLUP = "FH-EBLUP",
    SE_FH = "ES FH"
  ) |>
  tab_spanner(label = "Taille moy. ménage", columns = c(y_dir, SE_direct)) |>
  tab_spanner(label = "Covariable", columns = x_taille) |>
  tab_spanner(label = "Fay-Herriot", columns = c(FH_EBLUP, SE_FH)) |>
  tab_source_note(
    source_note = md("Modèle de Fay-Herriot (REML) ; covariable : taille moyenne des ménages RGPH-3 2018.<br>
    Amparafaravola (entièrement urbaine dans le RGPH) est exclue.")
  ) |>
  style_table()
Table 11.8: Estimation de la taille moyenne des ménages par commune — estimateur direct vs. Fay-Herriot
Commune n (OR)
Taille moy. ménage
Covariable
Fay-Herriot
Directe ES dir. RGPH FH-EBLUP ES FH
Alaotra
Morarano Chrome 120 3.93 0.151 4.27 4.08 0.144
Ilafy 73 4.03 0.223 4.07 3.76 0.122
Feramanga Nord 90 3.76 0.163 4.13 3.85 0.141
Ambohiboromanga 89 3.81 0.156 4.14 3.87 0.145
Marovoay
Antanimasaka 259 4.76 0.146 4.68 4.72 0.189
Ankazomborona 137 3.86 0.148 4.08 3.78 0.156
Tsararano 123 4.35 0.197 4.41 4.30 0.124
Modèle de Fay-Herriot (REML) ; covariable : taille moyenne des ménages RGPH-3 2018.
Amparafaravola (entièrement urbaine dans le RGPH) est exclue.
Source : Enquête auprès des OR 2025
NoteInterprétation du modèle de Fay-Herriot

Le modèle estimé a une variance inter-domaines \(\hat{\sigma}_v^2 = 0\), ce qui signifie que toute la variabilité entre communes est expliquée par la covariable (taille moyenne des ménages RGPH). Le modèle se réduit alors à un estimateur synthétique pur : les estimations FH-EBLUP sont entièrement tirées de la régression, sans composante aléatoire spécifique au domaine.

Ce résultat n’est pas surprenant : avec seulement 7 communes, le nombre de domaines est insuffisant pour estimer une variance inter-domaines de manière fiable. L’intérêt pratique du modèle de Fay-Herriot apparaîtrait avec un nombre plus élevé de petits domaines, par exemple en étendant l’analyse à l’ensemble des communes des districts concernés.

11.3.4 Sources de données auxiliaires

Les méthodes de calage et d’estimation pour petits domaines reposent sur des covariables auxiliaires connues au niveau de la population ou des domaines. Au-delà du RGPH-3, plusieurs sources de données géospatiales ouvertes pourraient enrichir les modèles :

Table 11.9: Sources de données auxiliaires potentielles pour l’estimation sur petits domaines
Source Résolution Variable Pertinence
GHS Population Grid 100 m Densité de population Proxy de l’urbanisation
Meta Data for Good 30 m Densité de population Mise à jour récente
ESA WorldCover 10 m Occupation du sol Part de surface cultivée
VIIRS Nighttime Lights 500 m Luminosité nocturne Proxy de l’activité économique
CHELSA Climate 1 km Précipitations, température Potentiel agro-climatique
SoilGrids 250 m Propriétés des sols Fertilité agricole
MODIS NDVI 250 m Indice de végétation (NDVI) Potentiel agricole annuel
Accessibility Map 1 km Temps de trajet Enclavement

Les données géospatiales sont accessibles via le catalogue OpenLandMap. L’extraction par agrégation zonale des rasters sur les limites des communes des observatoires permettrait de construire des covariables au niveau communal ou infra-communal. En particulier, le NDVI annuel (MODIS) constitue un proxy du potentiel agricole qui varie dans le temps, ce qui le rend complémentaire des données statiques du RGPH pour des analyses longitudinales.

TipRecommandations
  1. Poids de base : les statistiques descriptives de ce rapport ne sont pas pondérées, les taux de sondage étant relativement homogènes au sein de chaque observatoire. Une analyse de sensibilité systématique (comparaison pondéré / non pondéré) est recommandée pour les indicateurs publiés.

  2. Calage : un calage sur la structure par sexe et âge du RGPH 2018, en retenant le milieu rural des districts concernés, améliorerait la représentativité externe. L’écart temporel (2018–2025) est une limite à garder à l’esprit.

  3. Estimation pour petits domaines : si des analyses infra-observatoire (par commune, fokontany ou hameau) sont requises, une modélisation de type Fay-Herriot est préférable à une estimation directe, compte tenu des effectifs réduits.

  4. Prudence dans les comparaisons temporelles : la rupture du panel (2015–2025) et le renouvellement complet de l’échantillon empêchent de distinguer les évolutions démographiques réelles des effets de composition de l’échantillon. Les analyses longitudinales doivent signaler cette limite.

11.4 Dérive du panel et recalibration historique

11.4.1 Structure historique du panel (1995–2015)

Les observatoires ruraux de Marovoay et d’Alaotra ont fonctionné en panel : les mêmes ménages ont été ré-enquêtés chaque année, avec un remplacement progressif des ménages défaillants. Marovoay a été suivi de 1995 à 2014 (sauf 2009 et 2015) ; Alaotra de 1999 à 2014. Après dix ans d’interruption, l’enquête de 2025 a procédé à un renouvellement complet de l’échantillon sur la base d’un nouveau dénombrement.

Code
hist_summary |>
  arrange(year, Observatory) |>
  mutate(
    age_moy_cm = round(age_moy_cm, 1),
    pct_fem_cm = round(pct_fem_cm, 1)
  ) |>
  pivot_wider(
    names_from = Observatory,
    values_from = c(n_hh, age_moy_cm, pct_fem_cm),
    names_glue = "{Observatory}_{.value}"
  ) |>
  rename(Année = year) |>
  gt() |>
  safe_cols_label(
    Alaotra_n_hh = "n", Alaotra_age_moy_cm = "Âge CM", Alaotra_pct_fem_cm = "% fem. CM",
    Marovoay_n_hh = "n", Marovoay_age_moy_cm = "Âge CM", Marovoay_pct_fem_cm = "% fem. CM"
  ) |>
  safe_tab_spanner(label = "Alaotra", columns = starts_with("Alaotra")) |>
  safe_tab_spanner(label = "Marovoay", columns = starts_with("Marovoay")) |>
  fmt_number(columns = ends_with("age_moy_cm"), decimals = 1) |>
  fmt_number(columns = ends_with("pct_fem_cm"), decimals = 1, pattern = "{x} %") |>
  sub_missing(missing_text = "—") |>
  tab_source_note(
    source_note = md("**Source** : Microdonnées ROS 1995–2014, Enquête OR 2025.<br>
    Alaotra n'a pas été enquêté avant 1999. 2005 Marovoay : échantillon réduit (273 ménages).<br>
    2025 : renouvellement complet de l'échantillon après 10 ans d'interruption.")
  ) |>
  style_table()
Table 11.10: Effectifs et caractéristiques des CM par année et observatoire
Année
Marovoay
Alaotra
n Âge CM % fem. CM n Âge CM % fem. CM
1995 500
1996 511 44.0 17.8 %
1997 508 45.3 18.9 %
1998 672 46.1 15.6 %
1999 520 47.5 17.1 % 518 44.6 18.9 %
2000 519 48.0 17.2 % 517 45.5 19.1 %
2001 518 47.7 19.1 % 518 45.2 21.4 %
2002 518 47.5 18.7 % 518 45.6 21.0 %
2003 518 48.0 16.8 % 505 46.7 20.5 %
2004 516 47.5 18.6 % 503 45.9 18.5 %
2005 273 40.7 24.5 % 504 46.6 18.6 %
2006 518 48.0 20.1 % 504 46.2 18.5 %
2007 518 48.2 21.0 % 504 46.2 18.7 %
2008 518 48.3 21.2 % 503 46.2 18.5 %
2010 518 48.5 21.2 % 504 47.0 18.3 %
2011 521 49.3 21.7 % 504 48.4 18.7 %
2012 519 47.6 21.4 % 504 47.8 18.1 %
2013 518 48.1 22.2 % 504 48.2 18.1 %
2014 519 47.8 21.6 % 503 46.9 17.9 %
2025 519 46.1 22.0 % 507 45.4 21.7 %
Source : Microdonnées ROS 1995–2014, Enquête OR 2025.
Alaotra n’a pas été enquêté avant 1999. 2005 Marovoay : échantillon réduit (273 ménages).
2025 : renouvellement complet de l’échantillon après 10 ans d’interruption.
Source : Enquête auprès des OR 2025

11.4.2 Dérive du panel : vieillissement des chefs de ménage

Un panel de ménages vieillit mécaniquement : si les mêmes ménages sont suivis année après année, l’âge moyen du chef de ménage augmente. Ce vieillissement structurel rend l’échantillon progressivement moins représentatif de la population, où de nouveaux ménages (plus jeunes) se forment continuellement.

Code
hist_summary |>
  filter(!is.na(age_moy_cm)) |>
  make_trend_plot(
    y_var = age_moy_cm,
    y_label = "Âge moyen du CM",
    gap_year = 2014,
    title = "Dérive du panel : vieillissement des chefs de ménage"
  ) +
  annotate("rect", xmin = 2014.5, xmax = 2024.5, ymin = -Inf, ymax = Inf,
           fill = "grey90", alpha = 0.5) +
  annotate("text", x = 2019.5, y = 50, label = "Interruption\n(2015–2024)",
           size = 3, color = "grey50")
Figure 11.3: Évolution de l’âge moyen du chef de ménage (1995–2025)

La Figure 11.3 montre que l’âge moyen du chef de ménage a augmenté d’environ 3 ans entre 1999 et 2014, passant de ~45 à ~48 ans pour les deux observatoires. Le renouvellement de 2025 ramène l’âge moyen autour de 45–46 ans, plus proche de la structure de la population.

Le vieillissement du panel a plusieurs conséquences :

  1. Biais de composition : les ménages âgés sont surreprésentés par rapport à la population réelle, qui comprend aussi de jeunes ménages formés depuis le début du suivi.

  2. Attrition sélective : les ménages qui disparaissent du panel (migration, décès, refus) ne sont pas aléatoires — les ménages les plus mobiles (souvent les plus jeunes) sortent plus vite, accentuant le biais vers les âges élevés.

  3. Comparaisons temporelles : une partie des évolutions observées dans les indicateurs entre 1999 et 2014 reflète le vieillissement de la cohorte, et non des changements réels dans la population.

11.4.3 Cadre de recalibration historique

Pour corriger rétrospectivement les biais du panel, une post-stratification annuelle sur les marges démographiques connues est envisageable :

  1. Marges cibles : la distribution par sexe (et éventuellement classe d’âge) des chefs de ménage dans la population de référence.

  2. Source des marges : le RGPH-3 (2018) fournit les marges les plus fiables. Pour les années antérieures à 2018, ces marges peuvent être utilisées avec une interpolation linéaire entre le RGPH-2 (1993) et le RGPH-3 (2018), ou directement avec les marges 2018 en acceptant un biais temporel.

  3. Méthode : pour chaque année \(t\), on calcule des poids de post-stratification \(w_{it}\) tels que la distribution pondérée du sexe du CM dans l’échantillon corresponde aux marges de la population. Les poids de base (issus du dénombrement, quand il est disponible) sont ajustés par le facteur de calage.

  4. Données de dénombrement historiques : les dénombrements de 2007–2008 sont documentés dans un fichier PDF scanné (Dénombrements Alaotra 2007-2008 et Marovoay 2008.pdf). La numérisation de ces données permettrait de calculer des poids de base historiques pour ces années. Pour les autres années, seule la post-stratification sur les marges RGPH est applicable.

WarningLimites de la recalibration historique
  • Absence de dénombrement : pour la plupart des années (hors 2007–2008 et 2025), aucune donnée de dénombrement n’est disponible. Les poids de base ne peuvent pas être calculés ; seule la post-stratification sur des marges externes est possible.

  • Temporalité des marges : les marges du RGPH-3 (2018) ne reflètent pas nécessairement la structure de la population en 1995 ou en 2005. L’utilisation de marges datées introduit un biais dont l’ampleur dépend de la vitesse des changements démographiques.

  • Stabilité des sites : la correspondance entre les hameaux enquêtés et les sites peut varier légèrement d’une année à l’autre (cf. la variabilité des noms de hameaux dans les données historiques). Un nettoyage préalable des identifiants géographiques est nécessaire.

  • 2005 Marovoay : l’échantillon de Marovoay en 2005 ne comprend que 273 ménages (environ la moitié de l’effectif habituel), avec un profil démographique atypique. Cette année nécessite un traitement particulier.