Leçon 6 sur 8
Unité · Juger une enquête
L'intervalle qui chevauche deux phases IPC
La MAG vaut 14,9 %, au sommet de la phase 3 de l'IPC. L'intervalle ajusté du plan va de 11,1 % à 18,7 %, ce qui couvre les phases 3 et 4 — et l'enquête ne peut pas dire dans laquelle se trouve la population.
Le nombre pour lequel l’enquête existe
Tout ce qui précède était préparatoire. L’enquête a été financée pour répondre à une question — quelle est l’ampleur de la malnutrition aiguë — et cette leçon produit la réponse sous la forme qu’elle doit prendre : une prévalence, un intervalle et une phase.
L’estimation, avec le plan
Une enquête SMART est une enquête en grappes. Le cours sur les enquêtes a établi ce que cela implique ; ici cela arrive avec un seuil attaché.
import numpy as np
import pandas as pd
analysable = smart[smart["whz"].between(-5, 5)].copy()
analysable["gam"] = (analysable["whz"] < -2) | (analysable["oedema"] == True)
analysable["sam"] = (analysable["whz"] < -3) | (analysable["oedema"] == True)
def cluster_prevalence(df, column, cluster="cluster"):
n = len(df)
p = df[column].mean()
totals = df.groupby(cluster)[column].agg(["sum", "size"])
residual = totals["sum"] - p * totals["size"]
m = len(totals)
variance = m / (m - 1) * (residual**2).sum() / n**2
se = np.sqrt(variance)
srs = p * (1 - p) / n
return {"p": p, "se": se, "deff": variance / srs, "clusters": m, "n": n}
for column in ["gam", "sam"]:
r = cluster_prevalence(analysable, column)
t = 2.045 # t(0.975, 29 df)
print(f"{column.upper()}: {r['p']:.1%} 95% CI {r['p'] - t * r['se']:.1%} to "
f"{r['p'] + t * r['se']:.1%} deff {r['deff']:.2f} n {r['n']}")
library(survey)
design <- svydesign(ids = ~cluster, weights = NULL, data = analysable)
svyciprop(~I(whz < -2 | oedema), design, method = "logit")
svymean(~I(whz < -2 | oedema), design, deff = TRUE)
| Estimation | IC 95 % | Effet de plan | n | |
|---|---|---|---|---|
| MAG | 14,9 % | 11,1 – 18,7 % | 2,29 | 852 |
| MAS | 3,8 % | 2,3 – 5,2 % | 1,20 | 852 |
Deux points à retenir de ce tableau avant de lire la phase.
L’effet de plan vaut 2,29 pour la MAG et 1,20 pour la MAS. Deux indicateurs, une enquête, deux effets de plan — car la malnutrition se regroupe géographiquement et la malnutrition sévère, plus rare, se regroupe de façon moins détectable. Les 852 enfants de l’enquête en valent environ 372 indépendants pour la MAG.
L’intervalle naïf serait de 12,5 à 17,3 %. Ignorer les grappes rétrécit l’intervalle de 37 %, et la section suivante dit ce que ce rétrécissement aurait coûté.
Les phases IPC
L’IPC classe la prévalence de malnutrition aiguë en cinq phases, et ce sont elles qui transforment un pourcentage en décision.
| Phase | MAG par poids-pour-taille |
|---|---|
| 1 — Acceptable | sous 5 % |
| 2 — Alerte | 5 à 9,9 % |
| 3 — Sérieuse | 10 à 14,9 % |
| 4 — Critique | 15 à 29,9 % |
| 5 — Extrêmement critique | 30 % et plus |
def ipc_phase(gam):
for threshold, phase in [(0.05, 1), (0.10, 2), (0.15, 3), (0.30, 4)]:
if gam < threshold:
return phase
return 5
r = cluster_prevalence(analysable, "gam")
t = 2.045
low, high = r["p"] - t * r["se"], r["p"] + t * r["se"]
print(f"point estimate: phase {ipc_phase(r['p'])}")
print(f"interval spans: phase {ipc_phase(low)} to phase {ipc_phase(high)}")
c(point = 0.149, low = 0.111, high = 0.187)
L’estimation ponctuelle vaut 14,9 %, soit la phase 3 — à un dixième de point près.
L’intervalle va de 11,1 % à 18,7 %, ce qui couvre les phases 3 et 4.
Ce que cela veut dire, dit franchement
C’est le moment vers lequel tout le cours tendait, et l’énoncé honnête est inconfortable.
La malnutrition aiguë globale est estimée à 14,9 % (IC 95 % 11,1-18,7). L’estimation ponctuelle relève de la phase 3 de l’IPC (Sérieuse). L’intervalle de confiance couvre les phases 3 et 4 (Critique), si bien que cette enquête ne permet pas de déterminer dans quelle phase se trouve la population.
Trois choses que fait cette phrase.
Elle refuse d’arrondir jusqu’au seuil. 14,9 % rapporté « environ 15 % » a pris une décision de classification par arrondi, et la différence entre phase 3 et phase 4 est une différence de réponse.
Elle énonce l’intervalle avant la phase. Un lecteur qui voit « phase 3 » d’abord ne la révisera pas en arrivant à l’intervalle.
Elle dit que l’enquête ne peut pas trancher. C’est le verdict à trois branches sur lequel insistait le cours sur les enquêtes, et ici la troisième branche est la bonne.
Ce qui se serait passé sans l’effet de plan
srs_se = np.sqrt(r["p"] * (1 - r["p"]) / r["n"])
print(f"naive interval: {r['p'] - 1.96 * srs_se:.1%} to {r['p'] + 1.96 * srs_se:.1%}")
p <- 0.149; n <- 852
c(p - 1.96 * sqrt(p * (1 - p) / n), p + 1.96 * sqrt(p * (1 - p) / n))
12,5 % à 17,3 %. Toujours à cheval sur les deux phases — donc sur cette enquête l’effet de plan ne change pas le verdict, et le dire vaut autant qu’un constat.
Mais voyez à quel point c’est passé près. Si l’estimation avait valu 13,5 %, l’intervalle naïf serait resté dans la phase 3 et l’intervalle ajusté du plan serait entré en phase 4. La mise en grappes décide de la classification dès que l’estimation est à environ deux points d’un seuil, ce qui, dans ce secteur, est le cas la plupart du temps.
Lisez-le avec le rapport de plausibilité
La leçon précédente a trouvé quatre contrôles échoués, et deux d’entre eux poussent dans un sens connu.
- L’écart-type gonflé (1,22) fait monter la MAG. Une distribution plus large place davantage d’enfants au-delà d’un seuil fixe.
- Les mesures basses de l’équipe 3 font monter la MAG. Ses grappes donnent 22,3 % contre 9,2 à 16,2 % pour les autres, et elle apporte un quart de l’échantillon.
L’estimation a donc plus de chances d’être trop haute que trop basse, ce qui pousse la valeur vraie vers la moitié basse de l’intervalle — vers la phase 3 plutôt que la phase 4.
without_team3 = analysable[analysable["team"] != 3]
r3 = cluster_prevalence(without_team3, "gam")
print(f"excluding team 3: {r3['p']:.1%} on n={r3['n']}, "
f"{r3['clusters']} clusters")
analysable |> filter(team != 3) |> summarise(gam = mean(gam), n = n())
Rapportez la sensibilité, ne la substituez pas. Le chiffre principal reste l’estimation sur échantillon complet ; l’exclusion figure à côté comme indice sur le sens. Écarter en silence un quart d’une enquête parce qu’il donne une réponse gênante est précisément ce que tout ce module existe pour prévenir.
Le bloc de rapportage complet
Global acute malnutrition (weight-for-height z < -2 or oedema)
14.9% 95% CI 11.1-18.7 n = 852 design effect 2.29 30 clusters
IPC Phase 3 by point estimate; interval spans Phase 3 and Phase 4.
Severe acute malnutrition (z < -3 or oedema)
3.8% 95% CI 2.3-5.2 n = 852 design effect 1.20
Plausibility: 4 of 6 SMART checks failed (SD 1.22, digit preference in one team,
age heaping 24%, team bias -0.42 to -1.09). Two of the four push the estimate
upward. Excluding the affected team gives 12.6% on 628 children.
Analysable denominator: 852 of 930 measured. 66 had no computable z-score
(32 missing weight or age, 30 outside the reference range, 4 heights in metres,
recoverable) and 12 were flagged by the WHO bounds.
Douze lignes. Elles portent l’estimation, son intervalle, son plan, sa classification, ses biais connus et son dénominateur, et il ne reste rien qu’un relecteur puisse demander sans que le bloc y réponde.
La suite
L’enquête dit quelle est la situation. L’unité suivante demande ce que le programme en a fait — la performance PCIMA au regard des standards Sphere, et le dénominateur qui déplace le taux de guérison de neuf points.