cassionAnalyse de données

Retour à la leçonLeçon 4 sur 8Des résultats en oui ou non

Trente-huit cas, pas un rapport de cotes

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 / 22

    Ce que couvre cette leçon

    • Reconvertissez le modèle en probabilités
    • Pourquoi un rapport de cotes fait plusieurs différences de risques
    • Un intervalle sur l'effet marginal
    • Multipliez-le par la charge de cas
    • Quatre façons de se tromper
    • Rapportez-le en entier
    • La suite
    Notes du présentateur
    Un seul rapport de cotes de 0,39 produit un écart de 22,7 points là où l'aboutissement est fréquent et de 15,2 points là où il est rare. La probabilité prédite est ce qu'un modèle logistique affirme réellement, et multipliée par la charge de cas elle devient 38 cas qui n'ont pas atteint un service.
  2. Diapositive 2 / 22

    Reconvertissez le modèle en probabilités — En Python

    import pandas as pd
    import numpy as np
    import statsmodels.formula.api as smf
    
    model = smf.logit("completed ~ disability + case_category + age_band + sex"
                      " + service_requested + admin1", data=d).fit(disp=0)
    
    everyone_with = d.assign(disability=1)
    everyone_without = d.assign(disability=0)
    
    p1 = model.predict(everyone_with).mean()
    p0 = model.predict(everyone_without).mean()
    print(f"{p1:.4f} vs {p0:.4f}   average marginal effect {p1 - p0:+.4f}")
    Notes du présentateur
    Un coefficient logistique vit sur l'échelle du log des cotes, où personne ne pense. Le remède tient en une ligne et c'est la même à chaque fois : prédire, et moyenner.
  3. Diapositive 3 / 22

    Reconvertissez le modèle en probabilités — En R

    library(marginaleffects)
    
    avg_comparisons(model, variables = "disability")
  4. Diapositive 4 / 22

    Reconvertissez le modèle en probabilités

    • 26,11 % contre 45,52 %, une différence de −19,41 points
    • Comparez-la à l'écart brut de la leçon précédente : −19,05 points — Le rapport de cotes ajusté est passé de 0,430 à…
    Notes du présentateur
    26,11 % contre 45,52 %, une différence de −19,41 points. C'est l'effet marginal moyen : prendre chaque cas des données, demander au modèle ce qu'il prédit si ce cas signalait un handicap, redemander s'il n'en signalait pas, et moyenner l'écart. C'est la réponse du modèle dans l'unité où la question a été posée. Comparez-la à l'écart brut de la leçon précédente : −19,05 points. Le rapport de cotes ajusté est passé de 0,430 à 0,388 et la différence de risques ajustée n'a presque pas bougé. L'effet marginal moyen est le nombre qui se comporte comme un lecteur attend qu'une estimation ajustée se comporte.
  5. Diapositive 5 / 22

    Pourquoi un rapport de cotes fait plusieurs différences de risques — En Python

    profile = dict(case_category="child-protection", age_band="0-11", sex="f",
                   admin1="Artibonite")
    rows = []
    for service in ["health", "psychosocial", "legal", "livelihood-support"]:
        with_d = pd.DataFrame([{**profile, "service_requested": service, "disability": 1}])
        without = pd.DataFrame([{**profile, "service_requested": service, "disability": 0}])
        rows.append((service, model.predict(without)[0], model.predict(with_d)[0]))
    
    print(pd.DataFrame(rows, columns=["service", "no disability", "disability"]).round(3))
    Notes du présentateur
    C'est la propriété qui rend l'effet marginal nécessaire plutôt que simplement commode.
  6. Diapositive 6 / 22

    Pourquoi un rapport de cotes fait plusieurs différences de risques — En R

    predictions(model, newdata = datagrid(service_requested = unique(d$service_requested),
                                          disability = 0:1))
  7. Diapositive 7 / 22

    Pourquoi un rapport de cotes fait plusieurs différences de risques

    Service demandéSans handicapHandicap signaléÉcart
    Santé69,2 %46,5 %−22,7 pts
    Psychosocial64,5 %41,3 %−23,2 pts
    Juridique41,0 %21,2 %−19,8 pts
    Soutien aux moyens d'existence28,7 %13,5 %−15,2 pts
  8. Diapositive 8 / 22

    Pourquoi un rapport de cotes fait plusieurs différences de risques

    • Le rapport de cotes vaut 0,39 sur chacune de ces lignes — Le modèle a été ajusté avec un seul coefficient de handicap,…
    • Un rapport de cotes constant n'est pas un effet constant — Là où un résultat est déjà fréquent, le même rapport de…
    Notes du présentateur
    Le rapport de cotes vaut 0,39 sur chacune de ces lignes. Le modèle a été ajusté avec un seul coefficient de handicap, donc par construction le rapport de cotes ne varie pas — et la différence de risques varie tout de même de 15,2 à 23,2 points. Un rapport de cotes constant n'est pas un effet constant. Là où un résultat est déjà fréquent, le même rapport de cotes déplace plus de points de pourcentage ; là où il est rare, moins. Donc « l'effet du handicap » n'a pas de réponse unique en probabilité sans dire à quel niveau de base — ce que fait précisément l'effet marginal moyen, en moyennant sur les niveaux que la charge de cas possède réellement.
  9. Diapositive 9 / 22

    Un intervalle sur l'effet marginal — En Python

    # statsmodels: delta method
    margins = model.get_margeff(at="overall")
    print(margins.summary())
    Notes du présentateur
    L'effet marginal est une fonction de tous les coefficients, si bien que son intervalle n'est pas dans le tableau des coefficients. Deux façons de l'obtenir, et la seconde est celle vers laquelle se tourner.
  10. Diapositive 10 / 22

    Un intervalle sur l'effet marginal — En R

    avg_comparisons(model, variables = "disability")   # delta method, with CI
  11. Diapositive 11 / 22

    Un intervalle sur l'effet marginal — En Python

    # bootstrap, when the delta method is awkward or the estimator is custom
    rng = np.random.default_rng(20260729)
    draws = []
    for _ in range(400):
        sample = d.sample(len(d), replace=True, random_state=int(rng.integers(1e9)))
        m = smf.logit(model.model.formula, data=sample).fit(disp=0)
        draws.append(m.predict(sample.assign(disability=1)).mean()
                     - m.predict(sample.assign(disability=0)).mean())
    print(np.percentile(draws, [2.5, 97.5]).round(4))
  12. Diapositive 12 / 22

    Un intervalle sur l'effet marginal — En R

    # 400 resamples is enough for a reportable interval; 2,000 for a published one.
  13. Diapositive 13 / 22

    Un intervalle sur l'effet marginal

    • −19,41 points, IC à 95 % −26,1 à −13,2 — sur 400 rééchantillonnages bootstrap
    • Fixez la graine et dites combien de rééchantillonnages — Un intervalle bootstrap qu'on ne peut pas reproduire n'est pas…
    Notes du présentateur
    −19,41 points, IC à 95 % −26,1 à −13,2 sur 400 rééchantillonnages bootstrap. Fixez la graine et dites combien de rééchantillonnages. Un intervalle bootstrap qu'on ne peut pas reproduire n'est pas un intervalle, et la règle de cette plateforme sur les nombres produits vaut autant pour ceux que produit un modèle que pour ceux que produit un générateur.
  14. Diapositive 14 / 22

    Multipliez-le par la charge de cas — En Python

    n_disability = int((d["disability"] == 1).sum())
    comparator = d[d["disability"] == 0]["completed"].mean()
    observed = d[d["disability"] == 1]["completed"].sum()
    print(f"{n_disability} cases reporting a disability")
    print(f"expected at the comparator rate: {comparator * n_disability:.0f}")
    print(f"observed: {int(observed)}  shortfall: {comparator * n_disability - observed:.0f}")
    Notes du présentateur
    C'est la phrase que lit un responsable de programme, et le cours précédent a établi pourquoi : un effet doit arriver dans l'unité où se prend la décision.
  15. Diapositive 15 / 22

    Multipliez-le par la charge de cas — En R

    # Three lines, and it is the only line of the analysis a manager will quote.
  16. Diapositive 16 / 22

    Multipliez-le par la charge de cas

    • 197 cas signalant un handicap. 90 auraient abouti au taux de comparaison ; 52 l'ont fait. Trente-huit cas de moins
    • Énoncez l'arithmétique, non le seul résultat — Un lecteur qui voit 197 × 45,5 % − 52 peut vérifier ; un lecteur à qui…
    Notes du présentateur
    197 cas signalant un handicap. 90 auraient abouti au taux de comparaison ; 52 l'ont fait. Trente-huit cas de moins. Trente-huit est un nombre sur lequel une équipe de protection peut agir : cela fait environ trois cas par mois, cela nomme une charge de cas plutôt qu'un pourcentage, et cela se compare à ce que coûterait une correction. « RC 0,39 » ne fait rien de tout cela. Énoncez l'arithmétique, non le seul résultat. Un lecteur qui voit 197 × 45,5 % − 52 peut vérifier ; un lecteur à qui l'on donne seulement « 38 cas » doit faire confiance.
  17. Diapositive 17 / 22

    Quatre façons de se tromper

    • Prédire à la moyenne au lieu de moyenner les prédictions — Fixer chaque covariable à sa moyenne et prédire une fois…
    • Rapporter un effet marginal issu d'un modèle avec interaction sans dire où — Si le modèle laisse l'effet du handicap…
    • Prendre le déficit pour un effet — Trente-huit cas est ce à quoi correspond l'écart observé, non ce que rapporterait sa…
    • Extrapoler au-delà des données — Le modèle prédira volontiers une probabilité d'aboutissement pour un cas juridique de…
    Notes du présentateur
    Prédire à la moyenne au lieu de moyenner les prédictions. Fixer chaque covariable à sa moyenne et prédire une fois donne l'effet pour un cas qui n'existe pas — un cas à 0,6 femme et 0,3 juridique. Moyennez plutôt les prédictions sur les cas réels ; c'est ce que font at="overall" et avg_comparisons. Rapporter un effet marginal issu d'un modèle avec interaction sans dire où. Si le modèle laisse l'effet du handicap varier selon le service, la moyenne est une moyenne sur une différence réelle et le tableau des profils est la sortie honnête. Prendre le déficit pour un effet. Trente-huit cas est ce à quoi correspond l'écart observé, non ce que rapporterait sa fermeture. La comparaison reste observationnelle. Extrapoler au-delà des données. Le modèle prédira volontiers une probabilité d'aboutissement pour un cas juridique de 80 ans dans un département où aucun n'a été enregistré. Prédisez sur des profils que les données contiennent, et dites lesquels.
  18. Diapositive 18 / 22

    Rapportez-le en entier — Exemple (suite)

    Referral completion by disability status, adjusted
    
      Logistic model, 1,581 consenting cases with complete covariates.
      Adjusted for case category, age band, sex, service requested, department.
    
      Average marginal effect   -19.4 points   95% CI -26.1 to -13.2
                                               (400 bootstrap resamples, seed 20260729)
      Predicted completion      26.1% with a disability reported
                                45.5% without
    
      Applied to the 197 cases reporting a disability, the gap is 38 cases that
      did not reach a service and would have at the comparator rate.
    
      The gap is not constant: it is 22.7 points for health referrals, where
      completion is common, and 15.2 points for livelihood support, where it is
      not. The odds ratio (0.39) is the same on both.
  19. Diapositive 19 / 22

    Rapportez-le en entier — Exemple (suite)

    
      Observational. Cases were not randomised, and the model adjusts only for
      what the register records.
  20. Diapositive 20 / 22

    Rapportez-le en entier

    • L'avant-dernier paragraphe est celui qui empêche de surappliquer la moyenne — Un nombre unique est ce qui sera cité ;…
    Notes du présentateur
    L'avant-dernier paragraphe est celui qui empêche de surappliquer la moyenne. Un nombre unique est ce qui sera cité ; la phrase qui dit où il vaut et où il ne vaut pas est ce qui garde la citation honnête.
  21. Diapositive 21 / 22

    La suite

    • Chaque covariable jusqu'ici a été choisie parce qu'elle paraissait pertinente.
    Notes du présentateur
    Chaque covariable jusqu'ici a été choisie parce qu'elle paraissait pertinente. La leçon suivante en ajoute une qui est pertinente, défendable et fausse — une variable située sur le chemin causal qui retire 42 % de l'écart tout en améliorant chaque statistique d'ajustement.
  22. Diapositive 22 / 22

    La suite

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