import pandas as pd
from causalinference import CausalModel第9章のPythonコード
第9章 マッチング法
モジュールのインポート
Rによるデータ演習
wagedata = pd.read_csv('wage_training.csv')
wagedata.head()| wagea | D | years | wageb | educ | female | |
|---|---|---|---|---|---|---|
| 0 | 19 | 1 | 4 | 18 | 17 | 1 |
| 1 | 27 | 0 | 22 | 27 | 13 | 0 |
| 2 | 20 | 1 | 2 | 18 | 15 | 1 |
| 3 | 36 | 1 | 14 | 34 | 14 | 1 |
| 4 | 28 | 0 | 6 | 28 | 15 | 1 |
mydata = wagedata[['D', 'wagea']].groupby('D').mean().transpose()
mydata.assign(mean_diff = mydata[1] - mydata[0]) # トリートメントグループとコントロールグループの平均値の差| D | 0 | 1 | mean_diff |
|---|---|---|---|
| wagea | 26.846975 | 25.718487 | -1.128488 |
wagedata[['D', 'years', 'wageb']].corr() # 相関係数| D | years | wageb | |
|---|---|---|---|
| D | 1.000000 | -0.190821 | -0.183918 |
| years | -0.190821 | 1.000000 | 0.777174 |
| wageb | -0.183918 | 0.777174 | 1.000000 |
# 標準化ユークリッド距離によるマッチング
Y = wagedata['wagea'].to_numpy()
D = wagedata['D'].to_numpy()
X = wagedata[['years', 'wageb']].to_numpy()
result = CausalModel(Y, D, X)
result.est_via_matching(weights = 'inv', matches = 1)
print(result.estimates)
Treatment Effect Estimates: Matching
Est. S.e. z P>|z| [95% Conf. int.]
--------------------------------------------------------------------------------
ATE 0.927 0.062 14.873 0.000 0.805 1.049
ATC 0.876 0.070 12.582 0.000 0.740 1.012
ATT 1.047 0.069 15.141 0.000 0.912 1.183
# 傾向スコアマッチング
result.est_propensity()
ps = result.propensity._data['pscore']
result2 = CausalModel(Y, D, ps)
result2.est_via_matching(matches = 1)
print(result2.estimates)
Treatment Effect Estimates: Matching
Est. S.e. z P>|z| [95% Conf. int.]
--------------------------------------------------------------------------------
ATE 0.772 0.198 3.893 0.000 0.383 1.161
ATC 0.842 0.229 3.681 0.000 0.394 1.290
ATT 0.609 0.205 2.965 0.003 0.206 1.011