cassionAnalyse de données

Leçon 4 sur 8

Unité · Quand personne n'a randomisé

Un meilleur équilibre, six écoles en moins

L'appariement ramène le déséquilibre initial de 3,35 points à 1,41 et donne une estimation de −0,71 au lieu de −0,96. Il y parvient en écartant six des quinze écoles du programme — les six aux scores initiaux les plus élevés — si bien que la réponse porte désormais sur d'autres écoles que la question.

PythonR180 minCritères d'évaluation du CAD de l'OCDEDéfinitions d'indicateurs de l'UNICEF

L’appariement, en un paragraphe

Trouvez, pour chaque unité traitée, une unité non traitée qui lui ressemble ; ne comparez que les paires. Tout le reste de la méthode est un choix sur « qui lui ressemble » et sur ce qu’il faut faire quand aucune telle unité n’existe.

L’attrait est de rendre la comparaison explicite. Le coût est que la seconde moitié de cette phrase — que les paires — change la population dont parle la réponse, et elle le fait discrètement.

Appariez les écoles

import pandas as pd
import numpy as np

treated = schools[schools["feeding_programme"]].sort_values("baseline")
control = schools[~schools["feeding_programme"]].sort_values("baseline")

used, pairs = set(), []
for _, c in control.iterrows():
    available = treated[~treated["school_id"].isin(used)]
    nearest = (available["baseline"] - c["baseline"]).abs().idxmin()
    used.add(treated.loc[nearest, "school_id"])
    pairs.append({"control": c["school_id"],
                  "treated": treated.loc[nearest, "school_id"],
                  "base_c": c["baseline"], "base_t": treated.loc[nearest, "baseline"],
                  "gain_c": c["gain"], "gain_t": treated.loc[nearest, "gain"]})

matched = pd.DataFrame(pairs)
print(f"{len(matched)} pairs from {len(treated)} treated and {len(control)} control")
library(MatchIt)

m <- matchit(feeding_programme ~ baseline, data = schools,
             method = "nearest", ratio = 1)
summary(m)

Neuf paires à partir de quinze écoles traitées et neuf témoins. L’appariement un pour un sans remise ne peut produire au plus qu’autant de paires que le plus petit groupe a d’unités, si bien que six écoles traitées n’ont pas de partenaire et quittent l’analyse.

Avant appariement Après
Écoles traitées 15 9
Écoles témoins 9 9
Écart initial +3,35 pts +1,41 pt
Estimation −0,96 pt −0,71 pt
Erreur-type 1,29 1,22

L’équilibre s’est amélioré et l’estimation a à peine bougé, ce qui est le résultat qu’on espère : cela dit que les différences de différences n’étaient pas portées par l’écart initial.

Quelles six écoles sont parties, et pourquoi cela compte

dropped = treated[~treated["school_id"].isin(used)]
print(dropped[["school_id", "baseline", "gain"]].round(4))
print(f"dropped mean baseline: {dropped['baseline'].mean():.4f}")
print(f"kept mean baseline:    {matched['base_t'].mean():.4f}")
# Which units matching threw away is the first table to print, not the last.

Les six écoles écartées sont les six aux plus hauts scores initiaux de littératie — de 53,9 % à 65,5 %, contre une moyenne de 55,8 % pour les écoles traitées appariées. Elles ont été écartées parce que le groupe témoin ne contient aucune école ayant obtenu un score aussi élevé : il n’y a rien à quoi les comparer.

Ce n’est pas un défaut de l’appariement ; c’est l’appariement qui vous dit quelque chose de vrai. Les neuf écoles témoins ne peuvent pas parler pour les écoles du programme les plus performantes, parce qu’aucune école témoin de ce niveau n’existe.

Mais cela change l’affirmation. L’estimation appariée répond à « parmi les écoles dont la littératie initiale est inférieure à environ 60 %, qu’a fait le programme ? » — et c’est une question plus étroite que celle que le rapport se proposait de traiter.

Ce que « lui ressemble » devrait signifier

Apparier sur une seule variable est une simplification pédagogique. En pratique le choix se fait entre trois approches.

Approche Apparier sur À employer quand
Exacte Des valeurs identiques de quelques variables catégorielles Peu de covariables, grands échantillons
Plus proche voisin sur un score de propension La probabilité prédite d’être traité Beaucoup de covariables
Exacte grossière Des valeurs regroupées en classes Vous voulez un niveau d’équilibre garanti
import statsmodels.formula.api as smf

ps = smf.logit("feeding_programme ~ baseline + size + district",
               data=schools).fit(disp=0)
schools["pscore"] = ps.predict(schools)
print(schools.groupby("feeding_programme")["pscore"].describe()[
    ["min", "mean", "max"]].round(3))
glm(feeding_programme ~ baseline + size + district, data = schools,
    family = binomial())

Un score de propension est un nombre unique résumant de nombreuses covariables, et apparier dessus équivaut à apparier sur toutes à la fois — ce qui le rend utile quand il y a plus de covariables qu’un petit échantillon ne peut en apparier exactement.

Ce n’est pas un moyen d’obtenir plus de données. Le score réduit la dimensionnalité ; il ne crée pas de comparateurs là où il n’y en a pas.

Vérifiez le recouvrement avant d’apparier, pas après

C’est la vérification que l’exercice du cours de régression a découverte à ses dépens sur les deux programmes PCIMA, et elle s’applique ici sans changement.

t = schools[schools["feeding_programme"]]["pscore"]
c = schools[~schools["feeding_programme"]]["pscore"]
print(f"treated range {t.min():.3f}–{t.max():.3f}")
print(f"control range {c.min():.3f}–{c.max():.3f}")
print(f"treated units above the control maximum: {(t > c.max()).sum()}")
# Plot the two propensity score distributions. The tails are the whole story.

Les unités hors de la plage de l’autre groupe n’ont pas de contrefactuel dans les données. L’appariement les écarte, ce qui est honnête ; l’ajustement par régression les garde et extrapole, ce qui ne l’est pas. C’est la vraie différence entre les deux méthodes, et c’est une meilleure raison de préférer l’appariement que n’importe quelle affirmation sur le biais.

Quatre choses à rapporter, toujours

Combien d’unités ont été écartées, et lesquelles. Le premier tableau, non une note de bas de page.

L’équilibre avant et après. Les différences standardisées sur chaque covariable, les deux colonnes, pour qu’un lecteur voie ce que l’appariement a acheté.

Quelle population l’estimation décrit désormais. Une phrase, dans les mots qu’emploie un responsable de programme — « les écoles dont la littératie initiale est sous 60 % », non « la région de support commun ».

L’estimation non appariée également. Si l’appariement a sensiblement changé la réponse, c’est en soi un constat sur le degré auquel la comparaison dépendait des unités qu’il a écartées.

Ce que l’appariement ne peut pas faire

Il ne peut pas corriger un facteur de confusion non mesuré. Deux écoles aux scores initiaux identiques peuvent encore différer par la raison pour laquelle l’une a été sélectionnée. L’appariement équilibre ce sur quoi vous avez apparié et rien d’autre — ce qui est exactement la limite de l’ajustement par régression, atteinte par un autre chemin.

Il ne peut pas créer un groupe témoin. Si les unités non traitées sont systématiquement différentes, l’appariement rapportera un excellent équilibre sur une poignée de paires et gardera le silence sur tous les autres.

Il ne supprime pas le besoin d’un protocole. Appariement plus point de départ font des différences de différences sur un sous-ensemble ; l’appariement seul est une coupe transversale mieux élevée. L’estimation ci-dessus est le premier cas, et combiner les deux est généralement plus solide que l’un ou l’autre.

Rapportez-le en entier

School feeding and literacy, matched difference-in-differences

  Nearest-neighbour matching on baseline literacy, 1:1 without replacement.
  9 matched pairs from 15 treated and 9 control schools.

  6 of 15 programme schools were discarded: SCH05, SCH12, SCH14, SCH15,
  SCH19, SCH21. Their mean baseline literacy is 60.7% against 55.8% for the
  matched treated schools; no control school scored high enough to match
  them.

  Baseline imbalance   +3.35 points before matching, +1.41 after.
  Estimate             -0.71 points, SE 1.22, on 9 pairs.
  Unmatched estimate   -0.96 points, 95% CI -3.48 to +1.56.

  The matched estimate describes schools with baseline literacy below about
  60%. It does not describe the six highest-performing programme schools,
  which have no comparator in this data.

  Matching balances the covariates it was given. It does not address why
  these schools were selected for the programme.

La liste nommée des écoles écartées est ce qui rend ceci rapportable. Un lecteur peut vérifier si les six parties sont les six qui intéressent le plus le programme, et aucune statistique de résumé ne le lui dira.

La suite

L’appariement et les différences de différences bâtissent tous deux un groupe de comparaison à partir d’unités qui n’ont pas été affectées par une règle. La leçon suivante prend le cas inverse — un programme où une règle a tout décidé, nettement, à un nombre — et constate que deux des trois choses qu’exige un tel protocole sont déjà dans les données.

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.