Leçon 5 sur 8
Unité · Des règles, et des limites
Une discontinuité parfaite avec rien derrière
Tous les enfants à 124 mm ont été orientés et 2 % de ceux à 125 mm l'ont été. L'affectation est aussi nette qu'une règle peut l'être et la densité ne montre aucune manipulation, mais le protocole ne peut pas tourner, faute d'un résultat mesuré chez les enfants non orientés.
Une règle est un protocole
Le protocole de dépistage du PB oriente un enfant vers l’alimentation supplémentaire en dessous de 125 mm et ne fait rien à ce seuil ou au-dessus. Ce seul nombre accomplit ce qu’une évaluation doit d’ordinaire payer : il affecte le traitement sur une variable, à un point connu, sans latitude.
import pandas as pd
import numpy as np
screening = pd.read_csv("muac-screening-artibonite-2024.v1.csv")
screening["referred"] = screening["outcome"] != "no-action"
window = screening[screening["muac_mm"].between(118, 132)]
print(window.groupby("muac_mm")["referred"].agg(["mean", "size"]).round(3))
library(dplyr)
screening |>
filter(between(muac_mm, 118, 132)) |>
summarise(referred = mean(outcome != "no-action"), n = n(), .by = muac_mm)
| PB (mm) | Orientés | n |
|---|---|---|
| 122 | 100,0 % | 44 |
| 123 | 100,0 % | 47 |
| 124 | 100,0 % | 45 |
| 125 | 2,0 % | 51 |
| 126 | 0,0 % | 78 |
| 127 | 0,0 % | 70 |
Un millimètre fait passer la probabilité d’orientation de 1,00 à 0,02. Les enfants à 124 et à 125 mm sont, à tout ce qui compte près, les mêmes enfants — l’erreur de mesure d’un ruban PB est plus grande que l’écart entre eux — et un groupe a été traité tandis que l’autre ne l’a pas été.
C’est ce qu’une donnée de routine produit de plus proche d’une expérience randomisée, et cela arrive gratuitement, parce que le programme allait de toute façon appliquer la règle.
Ce qu’exige une régression sur discontinuité
Trois conditions. Deux sont vérifiables dans ce fichier et la troisième ne l’est pas.
Un : l’affectation doit être réellement nette au seuil. Vérifié ci-dessus. Si la règle était appliquée avec souplesse — disons 60 % d’orientations juste en dessous et 20 % juste au-dessus —, le protocole fonctionne encore mais devient flou, et l’estimation doit être divisée par le saut de probabilité de traitement plutôt que lue directement.
Deux : personne ne doit manipuler la variable de position. Si un dépisteur souhaitant qu’un enfant soit traité enregistre 124 au lieu de 126, les enfants juste en dessous du seuil ne sont plus comparables à ceux juste au-dessus — ce sont ceux que quelqu’un a décidé d’aider.
counts = screening["muac_mm"].value_counts().sort_index()
print(counts.loc[120:130])
below = screening["muac_mm"].between(120, 124).sum()
above = screening["muac_mm"].between(125, 129).sum()
print(f"120-124: {below} 125-129: {above}")
screening["last_digit"] = screening["muac_mm"] % 10
print((screening["last_digit"].value_counts(normalize=True).sort_index() * 100).round(1))
table(screening$muac_mm)[as.character(118:132)]
table(screening$muac_mm %% 10)
Les effectifs montent régulièrement à travers le seuil : 45 à 124, 51 à 125, 78 à 126. Il n’y a pas d’accumulation juste sous 125, et la densité du côté traité est plus faible que du côté non traité, ce qui est l’allure d’une distribution de PB réellement croissante.
Les chiffres terminaux sont plats, de 9,6 % à 10,8 % sur les dix. Pas d’arrondi aux cinq, pas d’évitement du seuil. Le test de préférence de chiffres du cours sur la qualité des données, employé ici à une autre fin : une vérification de manipulation est un test de préférence de chiffres posé à un nombre précis.
Trois : un résultat doit être mesuré des deux côtés. Il ne l’est pas, et cela met fin à l’analyse.
La condition à laquelle ce registre échoue
print(screening.columns.tolist())
print(f"children screened once: {(screening['child_id'].value_counts() == 1).sum()}")
print(f"children screened twice: {(screening['child_id'].value_counts() == 2).sum()}")
names(screening)
table(table(screening$child_id))
Le fichier enregistre une mesure, une orientation, et rien d’autre. 4 194 des 4 206 enfants n’apparaissent qu’une fois. Il n’y a pas de PB de suivi, pas de statut de guérison, pas de second passage de dépistage — donc pour les enfants à 125 mm qui n’ont pas été orientés, aucun résultat n’existe.
Le registre de traitement ne comble pas le vide. cmam-admissions-2024 contient
des résultats pour les seuls enfants traités, et ses identifiants ne se rattachent pas
au fichier de dépistage. Même s’ils le faisaient, il ne porterait que le côté orienté,
c’est-à-dire précisément la moitié qu’un protocole de discontinuité possède déjà.
Une estimation d’impact a besoin du côté non traité. Sans lui, la règle d’affectation la plus nette du secteur ne produit rien.
Ce qu’il aurait fallu
C’est la partie utile de la leçon, parce que c’est une spécification de collecte sur laquelle quelqu’un peut agir.
Une mesure de suivi chez les enfants juste au-dessus du seuil. Pas tous — les enfants entre 125 et 130 mm, remesurés à huit semaines. Quelques centaines d’enfants, une visite de plus, et le protocole devient estimable.
Le même résultat des deux côtés. La guérison est définie différemment pour les enfants traités et non traités, et une comparaison a besoin d’une seule définition appliquée aux deux : le PB à huit semaines, mesuré de la même façon quoi qu’il se soit passé entre-temps.
Assez d’enfants près du seuil. L’estimation emploie une fenêtre, et tout ce qui est en dehors est écarté.
for bandwidth in (2, 3, 5, 10):
band = screening[
screening["muac_mm"].between(125 - bandwidth, 124 + bandwidth)]
print(f"±{bandwidth} mm: {len(band)} children"
f" ({(band['muac_mm'] < 125).sum()} below, "
f"{(band['muac_mm'] >= 125).sum()} above)")
# The bandwidth trade-off, in four lines.
| Fenêtre | Enfants | Sous le seuil | Au-dessus |
|---|---|---|---|
| ±2 mm | 221 | 92 | 129 |
| ±3 mm | 335 | 136 | 199 |
| ±5 mm | 556 | 187 | 369 |
| ±10 mm | 1 210 | 265 | 945 |
Une fenêtre étroite est plus crédible et moins précise. Les enfants à moins de 2 mm du seuil sont presque identiques entre eux ; il y en a 221. Élargissez à 10 mm et vous avez six fois l’échantillon et comparez des enfants qui diffèrent réellement.
Choisissez la fenêtre avant de voir le résultat, et rapportez l’estimation à deux ou trois autres. Un résultat qui n’apparaît qu’à une seule fenêtre est un résultat sur la fenêtre.
Où se cachent les seuils dans les données de programme
Dès qu’on cherche des règles d’éligibilité, ce secteur en regorge.
| Seuil | Programme | Variable de position |
|---|---|---|
| PB < 125 mm | Alimentation supplémentaire | Périmètre brachial |
| PB < 115 mm | Alimentation thérapeutique | Périmètre brachial |
| Score de pauvreté sous un seuil | Transfert monétaire | Test de moyens indirect |
| Phase 3 de l’IPC | Réponse d’urgence | Classification de zone |
| Sous une cible de couverture | Appui aux formations sanitaires | Couverture rapportée |
Chacun est une expérience naturelle que personne n’a conçue, et chacun exige les mêmes trois vérifications. La troisième — un résultat des deux côtés — est celle qui échoue le plus souvent, parce que les programmes mesurent ce qu’ils traitent.
C’est une décision de collecte, non d’analyse. Décider de mesurer un échantillon d’unités inéligibles coûte de l’argent une année où personne ne le demande, et achète trois ans plus tard une évaluation qui serait autrement impossible.
Rapportez-le en entier
Supplementary feeding eligibility: assessment of a regression discontinuity
Assignment: referral to TSFP below MUAC 125 mm.
Sharpness 100% referred at 124 mm (n=45), 2.0% at 125 mm (n=51).
The rule is applied without exception.
Manipulation No pile-up below the cut-off: counts are 45, 51, 78 at 124,
125 and 126 mm. Terminal digits are uniform (9.6-10.8%).
No evidence the running variable was adjusted.
Outcome Not available. The register records screening and referral
only; 4,194 of 4,206 children appear once, and no follow-up
measurement exists on either side of the cut-off.
Conclusion The design is available and cannot be estimated. To make it
estimable, re-measure MUAC at 8 weeks on a sample of children
screened between 125 and 130 mm, using the same definition
applied to referred children. 556 children sit within
+/-5 mm of the cut-off, of whom 369 were not referred.
Une évaluation de protocole qui conclut « non estimable » est un livrable, et celle-ci est plus utile qu’une estimation forcée : elle nomme la mesure manquante, sa taille et son coût.
La suite
Le protocole à seuil a échoué sur des données qui n’existent pas. La leçon suivante porte sur un protocole qui a tourné sur des données qui existent, et pose la question qui aurait dû venir en premier — quelle ampleur d’effet aurait-il jamais pu trouver.