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
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. ** **
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))
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])
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.
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.
** É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) **
** 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.
Recommended Posts