乐于分享
好东西不私藏

R软件 DDML 专题:401(k)养老金对储蓄的影响

R软件 DDML 专题:401(k)养老金对储蓄的影响

DDML-R专题:401(k)养老金对储蓄的影响

数据来源

本案例数据来源于美国1991年收入与项目参与调查(Survey of Income and Program Participation, SIPP),经DoubleML官方预处理后可通过fetch_401k()函数获取。

该数据最早在以下研究中被分析:

  • Chernozhukov et al. (2018): "Double/debiased machine learning for treatment and structural parameters", The Econometrics Journal, 21: C1-C68.
  • Chernozhukov et al. (2020): 论文补充材料中提供了原始数据处理方法。

研究背景

401(k)计划是由雇主赞助的养老金账户。本研究旨在估计401(k) eligibility和参与对家庭累积资产的因果效应。 由于养老金参与是家庭自我选择的结果(存在储蓄偏好差异),直接比较参与者与非参与者会产生选择偏差,导致估计结果向上偏误。

识别策略

我们利用401(k) eligibility(是否有资格参与)作为处理变量。根据Chernozhukov等人的论证,在控制收入等协变量后,eligibility可以视为外生随机分配。

数据说明

变量
说明
net_tfa
净资产(IRA余额 + 401(k)余额 + 支票账户 + 储蓄债券 + 其他计息账户 + 股票 + 共同基金 - 非抵押债务)
e401
是否有资格参与401(k)计划(1=是,0=否)
p401
是否参与401(k)计划(1=是,0=否)
age
年龄
inc
收入
educ
受教育年限
fsize
家庭规模
marr
婚姻状况(1=已婚)
twoearn
双收入家庭(1=是)
db
是否参与固定收益养老金计划
pira
是否参与IRA计划
hown
是否拥有房产

分析代码

0、加载包

library(DoubleML)library(mlr3)library(mlr3learners)library(data.table)library(ggplot2)lgr::get_logger("mlr3")$set_threshold("warn")

1. 数据加载与探索

data = fetch_401k(return_type = "data.table")print(dim(data))  # 数据维度print(names(data))  # 变量名

2. 创建数据对象

dml_data = DoubleMLData$new(  data,  y_col = "net_tfa",  d_cols = "e401",  x_cols = c("age""inc""educ""fsize""marr","twoearn""db""pira""hown"))

3. 定义多个学习器(用于比较)

learners_rf = list(  ml_l = lrn("regr.ranger", num.trees = 500, max.depth = 7,            min.node.size = 3),  ml_m = lrn("classif.ranger", num.trees = 500, max.depth = 5,            min.node.size = 7))learners_lasso = list(  ml_l = lrn("regr.cv_glmnet", s = "lambda.min"),  ml_m = lrn("classif.cv_glmnet", s = "lambda.min"))learners_xgb = list(  ml_l = lrn("regr.xgboost", objective = "reg:squarederror",            eta = 0.1, nrounds = 50),  ml_m = lrn("classif.xgboost", objective = "binary:logistic",            eta = 0.1, nrounds = 50))

4. 估计并比较不同学习器

results = list()# 随机森林set.seed(123)dml_rf = DoubleMLPLR$new(dml_data,                           ml_l = learners_rf$ml_l,                          ml_m = learners_rf$ml_m)dml_rf$fit()results$rf = list(coef = dml_rf$coef, se = dml_rf$se)# Lassoset.seed(123)dml_lasso = DoubleMLPLR$new(dml_data,                             ml_l = learners_lasso$ml_l,                             ml_m = learners_lasso$ml_m)dml_lasso$fit()results$lasso = list(coef = dml_lasso$coef, se = dml_lasso$se)# XGBoostset.seed(123)dml_xgb = DoubleMLPLR$new(dml_data,                           ml_l = learners_xgb$ml_l,                           ml_m = learners_xgb$ml_m)dml_xgb$fit()results$xgb = list(coef = dml_xgb$coef, se = dml_xgb$se)

5. 汇总结果

cat("\n========== 估计结果汇总 ==========\n")cat("学习器      估计值      标准误\n")cat("随机森林  ", results$rf$coef"  ", results$rf$se"\n")cat("Lasso     ", results$lasso$coef"  ", results$lasso$se"\n")cat("XGBoost   ", results$xgb$coef"  ", results$xgb$se"\n")

6. 置信区间 - 使用 $confint() 方法

# 6. 置信区间 - 使用 $confint() 方法cat("\n========== 95%置信区间 ==========\n")dml_rf$confint()dml_lasso$confint()dml_xgb$confint()

得到以下结果:

结果解读

得到以下结果:

学习器
估计值
标准误
95% CI
随机森林
9,199
1,299
[6,654, 11,745]
Lasso
6,028
1,463
[3,161, 8,895]
XGBoost
9,003
1,399
[6,262, 11,744]

所有三种学习方法都得到类似的估计结果,表明估计对机器学习方法的设定是稳健的。 401(k) eligibility使家庭净资产平均增加约9,000美元。

2026年Stata暑假班
Claude助力双重机器学习&因果推断应用
2017-2026年
Stata课程,已持续开设10年