cassionAnalyse de données

Leçon 4 sur 8

Unité · Qui est un cas

Là où les deux critères divergent

468 enfants sévères selon le seul poids-pour-taille, 24 selon le seul PB, 142 selon les deux. Une concordance de 22,4 %, et tout le désaccord tient à l'âge — 31,4 mois contre 14,3.

PythonR150 minNormes OMS de croissance de l'enfantStandards SphèreDéfinitions d'indicateurs de l'UNICEF

La question à laquelle le registre peut répondre

Les deux critères d’admission figurent dans les définitions de cas et les deux s’emploient sur le terrain. Savoir s’ils trouvent les mêmes enfants est une question empirique, et elle exige un registre portant les deux mesures sur le même enfant.

Le registre d’admissions PCIMA a exactement cela — PB et poids-pour-taille à l’admission, pour 1 100 épisodes. Cette leçon est ce qu’il dit.

Calculez les deux sur les mêmes enfants

import pandas as pd

cmam = pd.read_csv("cmam-admissions-2024.v1.csv")
cmam["whz"] = cmam.apply(whz, axis=1)          # from lesson 2

both = cmam[cmam["whz"].notna()].copy()
print(f"{len(both)} of {len(cmam)} admissions have both measurements")

both["sam_whz"] = both["whz"] < -3
both["sam_muac"] = both["muac_admission_mm"] < 115
both <- cmam |> filter(!is.na(whz))

both <- both |>
  mutate(sam_whz = whz < -3,
         sam_muac = muac_admission_mm < 115)

1 028 sur 1 100. Les 72 sans taille sont le défaut de taille manquante des défauts connus du jeu de données, et c’est le premier constat — les deux critères n’ont pas le même dénominateur, même sur un registre unique, car l’un exige deux mesures et l’autre une seule.

Le tableau croisé

table = pd.crosstab(both["sam_muac"], both["sam_whz"],
                    rownames=["SAM by MUAC"], colnames=["SAM by WHZ"])
print(table)
both |> count(sam_muac, sam_whz)
Non sévère par WHZ Sévère par WHZ
Non sévère par PB 394 468
Sévère par PB 24 142

Lisez les deux cellules en gras. 468 enfants sont sévères par le poids-pour-taille et pas par le PB. 24 le sont par le PB et pas par le poids-pour-taille. 142 le sont par les deux.

overlap = table.loc[True, True]
union = table.values.sum() - table.loc[False, False]
print(f"concordance {overlap / union:.1%} of {union} severe by either measure")
both |>
  summarise(overlap = sum(sam_muac & sam_whz),
            union = sum(sam_muac | sam_whz)) |>
  mutate(concordance = overlap / union)

22,4 %. Des enfants que ce registre qualifierait de sévères selon l’une ou l’autre mesure, moins d’un quart le sont selon les deux.

Ce nombre n’est pas un artefact de ce jeu de données. Les comparaisons publiées trouvent des recouvrements de 10 % à 40 % selon la population, et un programme qui n’a pas mesuré le sien en suppose un.

Le désaccord, c’est l’âge

mean_age = pd.Series({
    "MUAC only": both.loc[both["sam_muac"] & ~both["sam_whz"], "age_months"].mean(),
    "WHZ only": both.loc[both["sam_whz"] & ~both["sam_muac"], "age_months"].mean(),
    "Both": both.loc[both["sam_muac"] & both["sam_whz"], "age_months"].mean(),
})
print(mean_age.round(1))
both |>
  mutate(group = case_when(sam_muac & sam_whz ~ "both",
                           sam_muac ~ "muac only",
                           sam_whz ~ "whz only",
                           TRUE ~ "neither")) |>
  summarise(mean_age = mean(age_months), n = n(), .by = group)
Groupe Âge moyen
Sévère par le seul PB 14,3 mois
Sévère par les deux 15,6 mois
Sévère par le seul poids-pour-taille 31,4 mois

Voilà. Les enfants que le PB trouve et que le poids-pour-taille manque ont la moitié de l’âge de ceux que le poids-pour-taille trouve et que le PB manque.

Le mécanisme est simple et ce n’est un défaut d’aucune des deux mesures. Le PB croît avec l’âge : un bras en bonne santé mesure environ 135 mm à six mois et environ 155 mm à cinq ans. Un seuil fixe de 115 mm représente donc un déficit bien plus profond pour un enfant de cinq ans que pour un nourrisson, si bien que le PB devient progressivement plus difficile à franchir à mesure que l’enfant grandit. Le poids-pour-taille n’a aucun terme d’âge et s’applique également sur toute la plage.

by_age = both.assign(
    band=pd.cut(both["age_months"], [5, 12, 24, 36, 60],
                labels=["6-11", "12-23", "24-35", "36-59"])
).groupby("band")[["sam_muac", "sam_whz"]].mean()
print((by_age * 100).round(1))
both |>
  mutate(band = cut(age_months, c(5, 12, 24, 36, 60),
                    labels = c("6-11", "12-23", "24-35", "36-59"))) |>
  summarise(across(c(sam_muac, sam_whz), mean), .by = band)

Exécutez-le et les deux courbes se croisent. Le PB identifie davantage les plus jeunes ; le poids-pour-taille davantage les plus âgés. Un programme admettant sur le seul PB fait tourner une charge de cas plus jeune qu’un programme admettant sur le seul poids-pour-taille, et c’est un fait clinique sur qui est traité, non un détail de mesure.

Lequel a raison ?

Aucun, et la question est la mauvaise. Ce à quoi chacun sert diffère.

  • Le PB prédit la mortalité au moins aussi bien, et mieux dans plusieurs études. Si le but de l’admission est de traiter les enfants les plus susceptibles de mourir, c’est un argument fort.
  • Le poids-pour-taille est le standard des enquêtes, et les seuils IPC comme les comparaisons internationales reposent sur lui. Si le but est de classer une population, c’est décisif.
  • Le PB est opérationnellement praticable au niveau communautaire. Le poids-pour-taille ne l’est pas.

La réponse du secteur est d’employer les deux, d’admettre sur l’un ou l’autre, et de décharger sur celui qui a servi à l’admission. Ce qui est cliniquement sensé et crée le problème analytique pour lequel cette leçon existe.

Ce que cela implique pour vos chiffres

Quatre conséquences, et chacune est une question qui vous sera posée.

La charge de cas dépend du critère. Admettre sur l’un ou l’autre donne ici une charge de 634 enfants sévères ; sur le seul PB, 166 ; sur le seul poids-pour-taille, 610. Ce ne sont pas des estimations de la même quantité.

La prévalence n’est pas comparable entre mesures. Une MAG par le PB et une MAG par le poids-pour-taille sont deux indicateurs différents. La leçon 6 montre ce que cela produit quand un chiffre est lu face au seuil de 15 %.

La sortie doit employer le critère d’admission. Un enfant admis sur le PB et déchargé sur le poids-pour-taille peut sortir avant guérison, ou être gardé bien après. Le protocole PCIMA est explicite et les registres, régulièrement, ne le sont pas.

Un programme qui change de critère casse sa propre série. Une charge de cas qui monte de 40 % au changement de protocole est une rupture de définition, et la règle du cours sur la conception d’indicateurs à propos du versionnement s’applique exactement.

for name, mask in [("either", both["sam_muac"] | both["sam_whz"]),
                   ("muac only", both["sam_muac"]),
                   ("whz only", both["sam_whz"])]:
    print(f"{name:10} caseload {mask.sum():>4}")
both |> summarise(either = sum(sam_muac | sam_whz),
                  muac = sum(sam_muac), whz = sum(sam_whz))

Rapportez toujours la paire

Severe acute malnutrition, admissions 2024, n = 1,028 with both measurements

  By MUAC (<115 mm)                166
  By weight-for-height (z < -3)    610
  By either                        634
  By both                          142    (22.4% of those severe by either)

  Children severe by MUAC alone average 14.3 months; by weight-for-height alone,
  31.4 months. The two criteria identify overlapping but substantially different
  caseloads, and the difference is age.

Six lignes. Elles devancent la question, nomment le mécanisme, et empêchent quelqu’un de comparer une charge fondée sur le PB à une charge fondée sur le poids-pour-taille comme si l’écart était une évolution nutritionnelle.

La suite

Vous savez classer des enfants et vous savez de quoi la classification dépend. L’unité suivante se demande si l’enquête ayant produit les mesures est croyable — le rapport de plausibilité SMART, où l’écart-type de 1,22 de la leçon 2 est enfin lu.

Animer cette leçon

La leçon en diaporama, la prose étant reléguée dans les notes du présentateur plutôt que projetée. Produit à partir de cette page, dont il ne peut donc pas s'écarter.

Lancer le diaporamaLire les diapositives

Le PDF ne requiert aucun logiciel et se projette depuis n'importe quel poste. Le fichier PowerPoint est fait pour être modifié : appliquez la charte de votre organisation, retirez une section pour une séance plus courte, ou fusionnez deux leçons en atelier.