因果推断dowhy之-401(k)资格对净金融资产的影响
0x01. 问题背景
在本案例研究中,我们将使用来自401(k)分析的真实数据来解释如何使用因果库来估计平均治疗效果(ATE)和条件ATE (CATE)。
本案例数据来自真实数据。在20世纪80年代初,美国政府为雇员推出了几种税收递延储蓄选择,以增加个人退休储蓄。一个受欢迎的选择是401(k)计划,该计划允许员工将工资的一部分存入个人账户。考虑到由于个人特征(特别是收入)造成的差异性,这里的目标是了解401(k)资格对净金融资产(即401(k)余额和非401(k)资产的总和)的影响。
由于401(k)计划是由雇主提供的,因此只有提供这些计划的公司的员工才有资格参加。因此,我们正在处理一项非随机研究。有几个因素(如教育程度、储蓄偏好)会影响401(k)计划的资格以及净金融资产。
0x02. 数据
我们考虑的样本来自1991年的收入和项目参与调查。样本由家庭组成,其中参考个人年龄在25-64岁之间,至少有一人受雇,但没有人是自雇的。样本中有9915户的记录。对于每个家庭,记录了44个变量,包括家庭参考人参加401(k)计划的资格(治疗)、净金融资产(结果)和其他协变量,如年龄、收入、家庭规模、教育程度、婚姻状况等。我们特别考虑了16个协变量。部分变量总结如下:
Variable Name | Type | Details |
---|---|---|
e401 | Treatment | eligibility for the 401(k) plan |
net_tfa | Outcome | net financial assets (in USD) |
age | Covariate | Age |
inc | Covariate | income (in USD) |
fsize | Covariate | family size |
educ | Covariate | education (in years) |
male | Covariate | is a male? |
db | Covariate | defined benefit pension |
marr | Covariate | married? |
twoearn | Covariate | two earners |
pira | Covariate | participation in IRA |
hown | Covariate | home owner? |
hval | Covariate | home value (in USD) |
hequity | Covariate | home equity (in USD) |
hmort | Covariate | home mortgage (in USD) |
nohs | Covariate | no high-school? (one-hot encoded) |
hs | Covariate | high-school? (one-hot encoded) |
smcol | Covariate | some-college? (one-hot encoded) |
该数据集可从’ hdm https://rdrr.io/cran/hdm/man/pension.html ’ __ R包中在线公开获得。为了更方便的做实验,经过一系列的实验,将数据下载至本地进行实验。具体如何搞到的数据,参考整理的博客:hdm数据R语言获取教程
0x03. 实验
0x03_1. 读取数据
import pandas as pd
df = pd.read_csv("data/pension.csv")
df.head()
数据结果如下:
ira | a401 | hval | hmort | hequity | nifa | net_nifa | tfa | net_tfa | tfa_he | tw | age | inc | fsize | educ | db | marr | male | twoearn | dum91 | e401 | p401 | pira | nohs | hs | smcol | col | icat | ecat | zhat | net_n401 | hown | i1 | i2 | i3 | i4 | i5 | i6 | i7 | a1 | a2 | a3 | a4 | a5 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 69000 | 60150 | 8850 | 100 | -3300 | 100 | -3300 | 5550 | 53550 | 31 | 28146 | 5 | 12 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 3 | 2 | 0.273178 | -3300 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
1 | 0 | 0 | 78000 | 20000 | 58000 | 61010 | 61010 | 61010 | 61010 | 119010 | 124635 | 52 | 32634 | 5 | 16 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 4 | 4 | 0.386641 | 61010 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
2 | 1800 | 0 | 200000 | 15900 | 184100 | 7549 | 7049 | 9349 | 8849 | 192949 | 192949 | 50 | 52206 | 3 | 11 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 6 | 1 | 0.533650 | 8849 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 0 | 0 | 0 | 2487 | -6013 | 2487 | -6013 | -6013 | -513 | 28 | 45252 | 4 | 15 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 5 | 3 | 0.324319 | -6013 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
4 | 0 | 0 | 300000 | 90000 | 210000 | 10625 | -2375 | 10625 | -2375 | 207625 | 212087 | 42 | 33126 | 3 | 12 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | 2 | 0.602807 | -2375 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
0x03_2. 构建因果图
使用e401作为Treatment,net_tfa作为out_come,其他协变量作为confounder,构建因果图代码如下:
import networkx as nx
import dowhy.gcm as gcmtreatment_var = "e401"
outcome_var = "net_tfa"
covariates = ["age","inc","fsize","educ","male","db","marr","twoearn","pira","hown","hval","hequity","hmort","nohs","hs","smcol"]edges = [(treatment_var, outcome_var)]
edges.extend([(covariate, treatment_var) for covariate in covariates])
edges.extend([(covariate, outcome_var) for covariate in covariates])causal_graph = nx.DiGraph(edges)
gcm.util.plot(causal_graph, figure_size=[20, 20])
效果图如下:
0x03_3. 数据分析
在我们为变量分配因果模型之前,让我们绘制它们的直方图,以了解变量的分布。
import matplotlib.pyplot as pltcols = [treatment_var, outcome_var]
cols.extend(covariates)
plt.figure(figsize=(10,5))
for i, col in enumerate(cols):plt.subplot(3,6,i+1)plt.grid(False)plt.hist(df[col])plt.xlabel(col)
plt.tight_layout()
plt.show()
绘制结果如下
我们观察到,实值变量不遵循众所周知的参数分布,如高斯分布。因此,当这些变量没有父变量时,我们拟合经验分布,这也适用于分类变量。
0x03_4. 数据增加噪声增强鲁棒性
让我们将因果模型分配给变量。对于treatment变量,我们分配了一个带有随机森林分类器的分类器功能因果模型(FCM)。对于outcome变量,我们分配了一个加性噪声模型,其中随机森林回归作为函数和噪声的经验分布。我们将经验分布分配给其他变量,因为它们在因果图中没有父节点。
causal_model = gcm.StructuralCausalModel(causal_graph)
causal_model.set_causal_mechanism(treatment_var, gcm.ClassifierFCM(gcm.ml.create_random_forest_classifier()))
causal_model.set_causal_mechanism(outcome_var, gcm.AdditiveNoiseModel(gcm.ml.create_random_forest_regressor()))
for covariate in covariates:causal_model.set_causal_mechanism(covariate, gcm.EmpiricalDistribution())
为了适合分类器FCM,我们将处理列转换为字符串类型。
df = df.astype({treatment_var: str})
0x03_5. 从数据中拟合因果模型
gcm.fit(causal_model, df)
输出如下:
Fitting causal mechanism of node smcol: 100%|██████████| 18/18 [00:06<00:00, 2.68it/s]
在计算CATE之前,我们首先将家庭划分为收入百分位数的等宽箱(equi-width bins)。这使我们能够研究对不同收入群体的影响。
import numpy as nppercentages = [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]
bin_edges = [0]
bin_edges.extend(np.quantile(df.inc, percentages[1:]).tolist())
bin_edges[-1] += 1 # adding 1 to the last edge as last edge is excluded by np.digitizegroups = [f'{percentages[i]*100:.0f}%-{percentages[i+1]*100:.0f}%' for i in range(len(percentages)-1)]
group_index_to_group_label = dict(zip(range(1, len(bin_edges)+1), groups))
现在我们可以计算CATE了。为此,我们对拟合因果图中的治疗变量进行随机干预,从介入分布中抽取样本,按收入组分组观察,然后计算每个组的治疗效果。
np.random.seed(47)def estimate_cate():samples = gcm.interventional_samples(causal_model,{treatment_var: lambda x: np.random.choice(['0', '1'])},observed_data=df)eligible = samples[treatment_var] == '1'ate = samples[eligible][outcome_var].mean() - samples[~eligible][outcome_var].mean()result = dict(ate = ate)group_indices = np.digitize(samples['inc'], bin_edges)samples['group_index'] = group_indicesfor group_index in group_index_to_group_label:group_samples = samples[samples['group_index'] == group_index]eligible_in_group = group_samples[treatment_var] == '1'cate = group_samples[eligible_in_group][outcome_var].mean() - group_samples[~eligible_in_group][outcome_var].mean()result[group_index_to_group_label[group_index]] = catereturn resultgroup_to_median, group_to_ci = gcm.confidence_intervals(estimate_cate, num_bootstrap_resamples=100)
print(group_to_median)
print(group_to_ci)
输出结果如下:
{'ate': 6519.046476486404, '0%-20%': 3985.972442541254, '20%-40%': 3109.9999288096888, '40%-60%': 5731.625707624532, '60%-80%': 7605.467796966453, '80%-100%': 11995.55917989574}
{'ate': array([4982.99412698, 8339.97497725]), '0%-20%': array([2630.16909916, 5676.94495668]), '20%-40%': array([1252.7312225 , 5215.15452742]), '40%-60%': array([3533.43542901, 8243.86661569]), '60%-80%': array([ 4726.56666574, 10603.23313684]), '80%-100%': array([ 4981.36999637, 19280.14639468])}
如置信区间所示[4982.99, 8339.97]
,401(k)资格对净金融资产的平均处理效果为正。 现在,让我们画出不同收入群体的CATEs,以便清楚地了解情况。
fig = plt.figure(figsize=(8,4))
for x, group in enumerate(groups):ci = group_to_ci[group]plt.plot((x, x), (ci[0], ci[1]), 'ro-', color='orange')
ax = fig.axes[0]
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.xticks(range(len(groups)), groups)
plt.xlabel('Income group')
plt.ylabel('ATE of 401(k) eligibility on net financial assets')
plt.show()
效果如下:
当一个人从低收入群体向高收入群体移动时,这种影响就会增加。这一结果似乎与不同收入群体的资源约束相一致。
因果推断dowhy之-401(k)资格对净金融资产的影响相关推荐
- 因果推断dowhy之-医学案例中的反事实分析
0x01. 背景 在这个例子中,我们知道三个观察变量的因果结构,我们想得到一些反事实的问题,例如"如果我采用了医生的不同建议,会发生什么?" 更具体地说,患有严重眼干症的爱丽丝决定 ...
- Stata新命令:konfound - 因果推断的稳健性检验
吴思锐 (湖南大学),wusirui@hnu.edu.cn 「Source:konfound: Command to quantify robustness of causal inferences」 ...
- 现代统计的思想飞跃,因果推断!
丁鹏 | 作者 雷博文.孔令仁 | 编辑 <数学文化>2021/第 12 卷第 2 期 | 来源 1. 引言 探求事物的原因,是人类永恒的精神活动之一.从古希腊的哲学到中国先秦的诗歌,都充 ...
- 因果推断——现代统计的思想飞跃
来源:数学文化"公众号 编辑:李达 审核:范杰.李祺垣 1 引言 探求事物的原因,是人类永恒的精神活动之一.从古希腊的哲学到中国先秦的诗歌,都充满了对原因的追问和对因果关系的思考.比如,亚里 ...
- 因果推断—现代统计的思想飞跃:过去、现在到未来(伯克利丁鹏博士万字长文)...
来源:专知本文约12400字,建议阅读10+分钟 本文将回顾统计因果推断的历史背景,评述中国因果推断研究的现状,并且大胆推测它未来的发展前景. 转载自<数学文化>2021/第 12 卷第 ...
- 因果推断笔记——因果图建模之微软开源的dowhy(一)
文章目录 1 dowhy介绍 1.1 dowhy的分析流程 2 案例 2.1 数据获取与整理 2.2 如何简单证明变量之间的因果关系 2.3 步骤一:因果图建模 2.4 步骤二:识别 2.5 步骤三: ...
- 干货 | 因果推断在项目价值评估中的应用
作者简介 野生梨,携程算法工程师,关注因果推断在实际工业项目上的探索和应用. 一.背景介绍 我们的日常生活中充斥着各种需要推断原因和结果的问题,比如,吸烟是否会导致肺癌,大学教育是否能够提高收入水平? ...
- 因果推断笔记——python 倾向性匹配PSM实现示例(三)
因果推断笔记-- 相关理论:Rubin Potential.Pearl.倾向性得分.与机器学习异同(二) 因果推断笔记--因果图建模之微软开源的dowhy(一) 文章目录 0 观测数据的估计方法 0. ...
- 因果推断笔记——因果图建模之Uber开源的CausalML(十二)
它提供了一个标准框架,允许用户从实验或观察数据估计条件平均治疗效果(CATE)或个人治疗效果(ITE).本质上,它估计了干预T对具有观察到的特征X的用户结果Y的因果影响,而没有对模型形式有很强的假设. ...
最新文章
- 下载Android源码流程(完整版)
- 计算机社团发展目标,计算机社团工作计划
- HDU 6030 Happy Necklace
- mysql怎么把字符变成数字_mysql将字符转换成数字
- Winform中创建超链接,点击跳转网页
- echarts里面的参数解释_SPMSM控制:传统PI速度环参数的整定
- 域控服务器降级失败,降级域控制器时出错 - Windows Server | Microsoft Docs
- 动态修改php的配置项
- 批处理Bat教程-第一章:前言
- python numpy计算任意底数的对数 log
- OEM造就整个IT产业
- 卡耐基梅隆大学计算机科学,卡耐基梅隆大学之计算机科学系
- 小胡学python【2】
- Bomb Game(翻译)
- Python包pretty_errors
- HoloLens2开发常见问题汇总
- 干货|一文看懂什么是“非标资产”
- 计算机桌面用什么实木板好,几百块打造属于你的专属实木(硬木)电脑桌
- STM32滤波电容个数和大小的确定
- buuctf在线测评web Secret File
热门文章
- 企业财务制度二--会计科目名称和编号(一)1231 低值易耗品(转载)
- 通过C语言解决简易的计算时间差问题
- Java语言:一辆大巴有9排4列的座位,现模拟客车售票过程(1代表“有票”,0代表“无票”)。
- REANA-自动驾驶功能安全开发工具-功能安全ISO26262、预期功能安全(SOTIF)ISO21448、网络信息安全(Cybersecurity)ISO21434
- 完成端口与AcceptEx
- 内存问题检查利器——Purify
- Realm(Java)数据库使用文档(查询Queries)
- 产品的不同阶段,运营应该做什么?这里有答案
- LXC共享目录权限配置
- 真菌和细菌高通量测序引物选择