import pandas as pd
from causalinference import CausalModel
第9章のPythonコード
第9章 マッチング法
モジュールのインポート
Rによるデータ演習
= pd.read_csv('wage_training.csv')
wagedata 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 |
= wagedata[['D', 'wagea']].groupby('D').mean().transpose()
mydata = mydata[1] - mydata[0]) # トリートメントグループとコントロールグループの平均値の差 mydata.assign(mean_diff
D | 0 | 1 | mean_diff |
---|---|---|---|
wagea | 26.846975 | 25.718487 | -1.128488 |
'D', 'years', 'wageb']].corr() # 相関係数 wagedata[[
D | years | wageb | |
---|---|---|---|
D | 1.000000 | -0.190821 | -0.183918 |
years | -0.190821 | 1.000000 | 0.777174 |
wageb | -0.183918 | 0.777174 | 1.000000 |
# 標準化ユークリッド距離によるマッチング
= wagedata['wagea'].to_numpy()
Y = wagedata['D'].to_numpy()
D = wagedata[['years', 'wageb']].to_numpy()
X
= CausalModel(Y, D, X)
result
= 'inv', matches = 1)
result.est_via_matching(weights
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()= result.propensity._data['pscore']
ps
= CausalModel(Y, D, ps)
result2
= 1)
result2.est_via_matching(matches
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