cassionAnalyse de données

Retour à la leçonLeçon 3 sur 8Qui est un cas

Les définitions de cas, et la clause que tout le monde oublie

Le même diaporama que les téléchargements, rendu sous forme de page. Lancez le diaporama pour le présenter en plein écran — les flèches ou un clic avancent d'une diapositive, Échap quitte.

Diapositives · PDFDiapositives · PowerPoint

  1. Diapositive 1 / 20

    Ce que couvre cette leçon

    • Les définitions
    • L'implémentation fausse
    • L'implémentation juste
    • Vérifiez que les parties totalisent le tout
    • Les définitions par le PB, sur le registre
    • Ce qu'une définition ne dit pas
    • La suite
    Notes du présentateur
    Malnutrition aiguë sévère, modérée et globale, les seuils dont le secteur a convenu, et la clause des œdèmes qui rend fausse toute implémentation en « décompte sous le seuil ».
  2. Diapositive 2 / 20

    Les définitions

    TermeScore z poids-taillePBŒdèmes
    MAS — malnutrition aiguë sévèresous -3sous 115 mmprésents
    MAM — malnutrition aiguë modérée-3 à moins de -2115 à moins de 125 mm—
    MAG — malnutrition aiguë globalesous -2sous 125 mmprésents
    Notes du présentateur
    Trois termes, et ils s'emboîtent.
  3. Diapositive 3 / 20

    Les définitions

    • La MAG est la MAS plus la MAM — Ce n'est pas une affection distincte, c'est la charge totale de malnutrition aiguë, et…
    • Chaque ligne est à elle seule une définition complète — Un enfant est en MAS par le poids-pour-taille, ou par le PB,…
    • La colonne des œdèmes est un OU, non un ET — Un enfant présentant des œdèmes bilatéraux prenant le godet est sévère…
    Notes du présentateur
    La MAG est la MAS plus la MAM. Ce n'est pas une affection distincte, c'est la charge totale de malnutrition aiguë, et c'est le chiffre auquel se réfèrent les phases IPC et le seuil d'urgence de 15 %. Deux points structurels avant tout code. Chaque ligne est à elle seule une définition complète. Un enfant est en MAS par le poids-pour-taille, ou par le PB, ou par les œdèmes — les critères sont des alternatives, non des exigences cumulatives. La leçon 4 porte entièrement sur l'ampleur du désaccord entre les deux premiers. La colonne des œdèmes est un OU, non un ET. Un enfant présentant des œdèmes bilatéraux prenant le godet est sévère quoi que disent ses mesures. Cette clause est un terme d'une expression booléenne, et c'est le terme le plus souvent omis.
  4. Diapositive 4 / 20

    L'implémentation fausse — En Python

    # WRONG: the definition everybody writes first
    sam_wrong = (smart["whz"] < -3).sum()
  5. Diapositive 5 / 20

    L'implémentation fausse — En R

    # WRONG
    sum(smart$whz < -3, na.rm = TRUE)
    Notes du présentateur
    Elle est fausse de deux façons à la fois. Elle écarte les enfants œdémateux, et le na.rm ou une comparaison propageant les valeurs nulles écarte silencieusement les enfants sans score z — si bien que le numérateur et le dénominateur diffèrent tous deux de ce que le libellé prétend.
  6. Diapositive 6 / 20

    L'implémentation juste — En Python

    import pandas as pd
    
    analysable = smart[smart["whz"].between(-5, 5)].copy()
    oedema = analysable["oedema"] == True
    
    analysable["sam"] = (analysable["whz"] < -3) | oedema
    analysable["mam"] = (analysable["whz"].between(-3, -2, inclusive="left")) & ~oedema
    analysable["gam"] = analysable["sam"] | analysable["mam"]
    
    n = len(analysable)
    for label in ["sam", "mam", "gam"]:
        print(f"{label.upper():4} {analysable[label].sum():>4} / {n}  "
              f"{analysable[label].mean():.1%}")
  7. Diapositive 7 / 20

    L'implémentation juste — En R

    analysable <- smart |> filter(between(whz, -5, 5))
    
    analysable <- analysable |>
      mutate(sam = whz < -3 | oedema,
             mam = whz >= -3 & whz < -2 & !oedema,
             gam = sam | mam)
    
    analysable |> summarise(across(c(sam, mam, gam), list(n = sum, rate = mean)), n = n())
  8. Diapositive 8 / 20

    L'implémentation juste

    • La MAM exclut explicitement les œdèmes — Un enfant œdémateux dont le score z tombe dans la bande modérée est sévère et…
    • Les bornes sont semi-ouvertes — -3 <= z < -2
    • Le dénominateur est énoncé — 852, non 930 — la différence est faite des enfants sans score z calculable et de ceux hors…
    Notes du présentateur
    852 enfants analysables : MAG 14,9 %, MAS 3,8 %. Trois détails de ce code portent le résultat. La MAM exclut explicitement les œdèmes. Un enfant œdémateux dont le score z tombe dans la bande modérée est sévère et non modéré, et sans le & ~oedema il serait compté dans les deux — si bien que MAS plus MAM dépasserait la MAG. Les bornes sont semi-ouvertes. -3 <= z < -2. Un enfant exactement à -3,0 est sévère. Se tromper ici déplace une poignée d'enfants et c'est le genre de point sur lequel deux analystes découvrent leur désaccord au pire moment. Le dénominateur est énoncé. 852, non 930 — la différence est faite des enfants sans score z calculable et de ceux hors des bornes de signalement, et la leçon 2 exigeait de rapporter ces trois groupes séparément.
  9. Diapositive 9 / 20

    Vérifiez que les parties totalisent le tout — En Python

    assert (analysable["sam"] & analysable["mam"]).sum() == 0, "a child is both"
    assert analysable["gam"].sum() == analysable["sam"].sum() + analysable["mam"].sum()
  10. Diapositive 10 / 20

    Vérifiez que les parties totalisent le tout — En R

    stopifnot(sum(analysable$sam & analysable$mam) == 0,
              sum(analysable$gam) == sum(analysable$sam) + sum(analysable$mam))
    Notes du présentateur
    Deux assertions, et elles attrapent l'erreur des œdèmes, celle des bornes et toute modification future qui casserait l'emboîtement. Exécutez-les à chaque fois.
  11. Diapositive 11 / 20

    Les définitions par le PB, sur le registre — En Python

    muac = pd.read_csv("muac-screening-artibonite-2024.v1.csv")
    measured = muac[muac["muac_mm"].notna()].copy()
    oed = measured["oedema"] == True
    
    measured["sam"] = (measured["muac_mm"] < 115) | oed
    measured["gam"] = (measured["muac_mm"] < 125) | oed
    
    print(f"n = {len(measured):,}  GAM {measured['gam'].mean():.1%}  "
          f"SAM {measured['sam'].mean():.1%}")
    Notes du présentateur
    Le registre de dépistage a le PB et les œdèmes, sans poids ni taille, si bien qu'il ne soutient que les définitions fondées sur le PB.
  12. Diapositive 12 / 20

    Les définitions par le PB, sur le registre — En R

    muac |>
      filter(!is.na(muac_mm)) |>
      summarise(n = n(),
                gam = mean(muac_mm < 125 | oedema),
                sam = mean(muac_mm < 115 | oedema))
  13. Diapositive 13 / 20

    Les définitions par le PB, sur le registre

    • Nommez la mesure dans l'indicateur — gam_muac_percent et gam_whz_percent sont deux indicateurs différents que l'on…
    Notes du présentateur
    Nommez la mesure dans l'indicateur. gam_muac_percent et gam_whz_percent sont deux indicateurs différents que l'on appelle tous deux « MAG », et la règle du cours sur la conception d'indicateurs consistant à mettre la mesure dans le nom n'est pas ici du pédantisme — la leçon suivante montre les deux en désaccord sur les trois quarts des cas sévères.
  14. Diapositive 14 / 20

    Ce qu'une définition ne dit pas

    • L'âge — Les définitions s'appliquent aux enfants de 6 à 59 mois
    Notes du présentateur
    Trois choses que la définition de cas laisse délibérément de côté, et que quelqu'un supposera. L'âge. Les définitions s'appliquent aux enfants de 6 à 59 mois. En dessous de six mois, les normes et les définitions diffèrent ; au-dessus de 59 mois, elles ne s'appliquent pas. Vérifiez la plage d'âge avant de classer.
  15. Diapositive 15 / 20

    Ce qu'une définition ne dit pas — En Python

    out_of_scope = ~analysable["age_months"].between(6, 59)
    print(f"{out_of_scope.sum()} children outside 6-59 months")
  16. Diapositive 16 / 20

    Ce qu'une définition ne dit pas — En R

    sum(!between(analysable$age_months, 6, 59), na.rm = TRUE)
  17. Diapositive 17 / 20

    Ce qu'une définition ne dit pas

    • L'admission — Une définition de cas dit qui est malnutri
    • La gravité à l'intérieur du sévère — Une MAS avec complications exige des soins hospitaliers ; sans complications,…
    Notes du présentateur
    L'admission. Une définition de cas dit qui est malnutri. Savoir s'il est admis dépend du protocole du programme, qui peut employer un critère, les deux, ou le PB pour le dépistage communautaire et le poids-pour-taille au site. Le champ admission_criterion du registre enregistre ce que le site a saisi, non tout ce que l'enfant remplissait. La gravité à l'intérieur du sévère. Une MAS avec complications exige des soins hospitaliers ; sans complications, ambulatoires. La définition ne les distingue pas, et le test de l'appétit et les signes cliniques qui le font ne figurent pas dans un jeu de données anthropométrique.
  18. Diapositive 18 / 20

    Ce qu'une définition ne dit pas

    Une définition de cas est une règle de classification, non une décision thérapeutique. Confondre les deux produit une charge de cas qui ne correspond aux admissions d'aucun programme et une discussion que les données ne peuvent pas trancher.
  19. Diapositive 19 / 20

    La suite

    • Vous savez classer un enfant par l'une ou l'autre mesure.
    Notes du présentateur
    Vous savez classer un enfant par l'une ou l'autre mesure. La leçon suivante place les deux mesures sur les mêmes enfants et constate qu'elles divergent sur les trois quarts des cas sévères — et que ce désaccord a une cause qui tient en un nombre.
  20. Diapositive 20 / 20

    La suite

    Lire la leçon complète, avec le code exécutable Retour à la leçon