python虽然与R一样都可以做数据分析,但是在计量方面较为薄弱,python更像是干脏活,清洗数据用的。现在慢慢的python也有一些在计量的包,比如causalinference,这个包可以做因果推断分析。

安装

!pip3 install causalinference

Lookinginindexes:https://pypi.tuna.tsinghua.edu.cn/simple

Collectingcausalinference

Downloadinghttps://pypi.tuna.tsinghua.edu.cn/packages/dc/7f/4504b42ef5a1158075954f54d08b95b2d5b2186da0ef9fcbcd0cf31411f2/CausalInference-0.1.3-py3-none-any.whl (51 kB)

[K|████████████████████████████████|51kB81kB/s eta0:00:0101

[?25hInstallingcollected packages:causalinference

Successfullyinstalled causalinference-0.1.3

数据导入

importpandasaspd

df=pd.read_csv('data.csv')

df


数据描述

x1,x2,x3 协变量(控制变量)

y 因变量

istreatment 处置变量D,标注每条数据隶属于treatment或control组。1为treatment, 0为control。

fromcausalinferenceimportCausalModel

Y=df['y'].values

D=df['istreatment'].values

X=df[['x1','x2','x3']].values

#CausalModel参数依次为Y, D, X。其中Y为因变量

causal=CausalModel(Y,D,X)

causal

描述性统计分析

print(causal.summary_stats)

SummaryStatistics

Controls(N_c=2509)Treated(N_t=2491)

VariableMeanS.d.MeanS.d.Raw-diff

--------------------------------------------------------------------------------

Y-1.0121.7424.9783.0685.989

Controls(N_c=2509)Treated(N_t=2491)

VariableMeanS.d.MeanS.d.Nor-diff

--------------------------------------------------------------------------------

X0-0.3430.9400.3360.9610.714

X1-0.3470.9360.3450.9580.730

X2-0.3130.9400.3060.9630.650

causal.summary_stats含有的指标字段名

causal.summary_stats.keys()

dict_keys(['N','K','N_c','N_t','Y_c_mean','Y_t_mean','Y_c_sd','Y_t_sd','rdiff','X_c_mean','X_t_mean','X_c_sd','X_t_sd','ndiff'])

使用OLS估计处置效应

估计处置效应最简单的方法是使用OLS方法,


CausalModel.est_via_ols(adj)

该方法有一个参数adj

adj=0 模型未使用X(协变量)

adj=1 模型使用了D(是否为处置组)和X(协变量)。

adj=2 模型使用了D(是否为处置组)、X(协变量)、D与X的交互

adj默认为2

causal.est_via_ols(adj=2)

print(causal.estimates)

TreatmentEffectEstimates:OLS

Est.S.e.z P>|z|[95%Conf.int.]

--------------------------------------------------------------------------------

ATE3.0170.03488.7400.0002.9503.083

ATC2.0310.04051.1830.0001.9532.108

ATT4.0100.039103.9640.0003.9344.086

参数解读

ATE 平均处置效应(average treatment effect)

ATC 控制组的平均处置效应(average treatment effect for the controls)

ATT 处置组的平均处置效应(average treatment effect for the treated)

你们再试试adj设置为0和1分别运行出什么结果

倾向得分估计

我们估计处置效应时,很希望处置组和控制组很类似。比如研究受教育水平对个人收入的影响,其他变量如家庭背景、年龄、地区等协变量存在差异,我们希望控制组和处置组的之间的协变量平衡性尽可能的好,这样两个组就会很像,当对这两个组的受教育水平进行操作时,两个组的收入差异可以认为是受教育水平带来的。

让两个组很像,这里就用到倾向得分估计。

causal.est_propensity_s()

print(causal.propensity)

EstimatedParametersofPropensityScore

Coef.S.e.z P>|z|[95%Conf.int.]

--------------------------------------------------------------------------------

Intercept0.0050.0350.1450.885-0.0630.073

X10.9990.04124.4950.0000.9191.079

X01.0000.04124.5430.0000.9201.080

X20.9330.04023.1810.0000.8551.012

分层方法估计处置效应

倾向得分估计,让两个组尽量相似,但实际上这个相似值范围有点大。比如假设受教育水平对个人收入的影响,身高、体重等颜值信息(协变量)其实对收入也是有影响的,那么就应该对人群进行分层,不同颜值水平(分组)下受教育水平对个人收入的影响。

分层方法估计CausalModel.stratify_s() 自动选择协变量

causal.stratify_s()

print(causal.strata)

StratificationSummary

PropensityScoreSampleSizeAve.PropensityOutcome

StratumMin.Max.ControlsTreatedControlsTreatedRaw-diff

--------------------------------------------------------------------------------

10.0010.04315350.0240.029-0.049

20.0430.06914880.0560.0590.142

30.0700.118283290.0930.0920.953

40.1190.178268450.1470.1471.154

50.1780.240247650.2080.2101.728

60.2400.3614511740.2990.3002.093

70.3610.4271961170.3930.3952.406

80.4270.4991531590.4650.4642.868

90.4990.53282750.5150.5152.973

100.5320.56865910.5510.5533.259

110.5680.6301141980.6000.6013.456

120.6300.7581804450.6930.6963.918

130.7580.818772360.7870.7894.503

140.8180.876572550.8450.8494.937

150.8760.933232890.9040.9045.171

160.9330.998123000.9570.9636.822

更多详细信息可阅读代码中说明论文,可在项目中下载到的。