[PYTHON] Prise en compte du score de propension et de la précision de l'estimation des effets

Résumé de l'article

J'étais un peu inquiet en étudiant le score de propension qui apparaît dans le domaine du raisonnement causal, alors j'ai expérimenté. Ce qui m'intéressait, c'était de combien et comment je devais me préoccuper du «calcul du score de propension». Cette fois, j'ai créé intentionnellement des données biaisées

  1. Lors de l'utilisation du score de propension réel
  2. Lorsque le score de propension est calculé à l'aide du même modèle que la génération de l'ensemble de données (régression logistique)
  3. En mettant l'accent sur l'exactitude de la prédiction de la présence ou de l'absence d'intervention (LightGBM)

J'ai comparé la précision de l'estimation des effets de trois manières. Dans cet article, «effet» signifie «ATE (effet moyen du traitement)».

** Je suis ravi que ce soit mon premier message, mais je vous serais reconnaissant si vous pouviez me faire savoir si vous avez des problèmes. ** **

Préparer un ensemble de données biaisé

Déterminez la probabilité (= score de propension réelle) d'intervention $ z \ in \ {0, 1 \} $ dans le même modèle que la régression logistique basée sur la caractéristique $ x_0, x_1, x_2 $. L'effet réel de $ z $ est de 1,3 pour le texte, et la cible de l'effet est calculée par la combinaison linéaire de $ x_0, x_1, x_2, z $ et du terme d'erreur. Le coefficient de la connexion linéaire est également déterminé par le texte.

dataset.py


import numpy as np
import pandas as pd

# sample size
n = 10000

# features
np.random.seed(0)
x_0 = np.random.randn(n)

np.random.seed(1)
x_1 = np.random.randn(n)

np.random.seed(2)
x_2 = np.random.randn(n)

# treatment
z = np.zeros_like(x_0)
true_P_score = np.zeros_like(x_0)

# true effect of z
effect = 1.3

for i in range(n):
    # those who have high value of x_0, x_1 and x_2 tend to be z = 1.
    true_P_score[i] = 1 / (1 + np.exp(- x_0[i] - x_1[i] - x_2[i]))

    if np.random.rand(1) < true_P_score[i]:
        z[i] = 1
    else:
        z[i] = 0
        
# error
np.random.seed(3)
error = 0.01 * np.random.randn(n)

# generate target y
target = 2*x_0 + 3*x_1 + 1.5*x_2 + effect*z + error

# make dataframe
data = pd.DataFrame({'x_0': x_0,
                     'x_1': x_1,
                     'x_2': x_2,
                     'z': z,
                     'target': target,
                     'true_P_score': true_P_score})

Pour le moment, si vous vérifiez combien de biais est affecté lorsque vous supposez un échantillonnage aléatoire, vous pouvez voir que cela semble être une estimation assez large.

Effet véritable: 1,3 Effet apparent: 5,5

confirm_bias.py


# confirm the bias
print("the true effect of z = ", effect)
print('the pseudo effect of z = ',
      np.mean(data[data.z == 1].target) - np.mean(data[data.z == 0].target))

IPW utilisant le score de propension

Estimons l'effet par IPW (estimation pondérée par probabilité inverse) avec le score de propension comme poids. En principe, le score de propension est $ P $, le poids $ Z_i / P_i $ pour l'échantillon $ i $ avec $ z = 1 $, et le poids $ (1-Z_i) pour l'échantillon $ i $ avec $ z = 0 $. Multipliez / (1-P_i) $ pour calculer la valeur attendue de chaque cible de $ z = 1, 0 $, et la différence est l'effet estimé.

Cependant, ici je veux que la librairie fasse le t-test, donc si je pense un peu, je mets le poids $ [Z_i / P_i + (1-Z_i) / (1-P_i)] $ sur tous les échantillons, $ z $ Vous pouvez voir que nous devrions considérer la ** régression linéaire simple pondérée ** de $ target $ by.

ipw.py


from statsmodels.regression.linear_model import WLS # weighted least square
from statsmodels.tools import add_constant

X = add_constant(data['z'])
y = data['target']
weights = data['Z/P'] + data['(1-Z)/(1-P)']
wls = WLS(y, X, weights=weights).fit()
wls.summary()

Cela peut être un slapstick, mais le code suivant peut générer le véritable effet et le résultat de l'estimation.

confirm_effect.py


print("the true effect of z = ", effect)
print("effect of z is estimated as", wls.params[1])

Comparaison de l'estimation des effets par score de propension

Eh bien, le véritable effet est de 1,3 tel que décidé au moment de la génération de l'ensemble de données, mais je l'ai estimé en utilisant plusieurs scores de propension. Si le score de propension existe vraiment dans l'ensemble de données, l'effet estimé est ** sans biais **, il est donc plus précis d'utiliser la probabilité d'intervention utilisée lors de la génération de l'ensemble de données telle qu'elle est comme score de propension. Devrait être.

De plus, comme le modèle de régression logistique est ** le même que le mécanisme de génération de l'ensemble de données **, le score de propension calculé doit être proche de la valeur réelle. Par conséquent, la précision de l'estimation de l'effet est également assez bonne. Devrait. Soit dit en passant, il était d'environ 76% en termes de «précision de prédiction» de l'intervention $ z $. (On ne sait pas si cela s'appelle la prédiction car il n'y a que des données dites d'entraînement.) De plus, le score de propension était d'environ $ \ pm 0,4 $% en moyenne par rapport à la valeur réelle (la moyenne des valeurs absolues des différences, pas le rapport des erreurs). ..

Enfin, j'ai essayé d'améliorer la "précision de prédiction" de l'intervention $ z $ avec LightBGM. La précision de prédiction de l'intervention $ z $ est d'environ 80%. Les paramètres Hyper sont laissés à leurs valeurs par défaut. Le score de propension se situait en moyenne autour de $ \ pm 6 $% de la valeur réelle (la moyenne des valeurs absolues des différences, et non le rapport des erreurs).

Les résultats de l'estimation des effets à l'aide de ces scores de propension sont les suivants.

Effet véritable: 1,3 Résultat estimé en utilisant le score de propension réelle: 1,3345 ... Résultat estimé en utilisant la régression logistique: 1.4002 ... Résultat estimé avec LightGBM: 2,7601 ...

On peut voir que bien que LightGBM ait une précision de prédiction élevée de l'intervention $ z $, il en a estimé considérablement l'effet.

Conclusion

Sans surprise, l'estimation utilisant le score de propension réel était la plus précise. En d'autres termes, je pense que l'important n'est pas ** «l'exactitude de la prédiction de l'intervention $ z $» mais «l'exactitude du score de propension (invérifiable)» **. Mais fondamentalement, vous ne connaissez pas le vrai score de propension. Par conséquent, j'ai pensé que les points suivants devraient être pris en considération lors du calcul du score de propension dans la pratique.

  1. ** Écoutez en détail les critères du décideur sur l'opportunité d'intervenir ou non. **** (= pour créer un modèle le plus proche possible du mécanisme de génération de données) **

  2. ** Intervention Surveiller l'équilibre des covariables en utilisant les différences moyennes standardisées, etc., plutôt que de consacrer beaucoup d'efforts à l'amélioration de la précision de la prédiction de $ z $. ** **   Merci d'avoir lu jusqu'au bout.

Les références

Recommended Posts

Prise en compte du score de propension et de la précision de l'estimation des effets
Avantages et inconvénients de la méthode d'estimation la plus probable
Estimation de l'effet des mesures à l'aide des scores de propension
Concept de raisonnement bayésien (2) ... Estimation bayésienne et distribution de probabilité
Estimation la plus probable de la moyenne et de la variance avec TensorFlow