根据您的需求,以下是一个基于Python的动态双重机器学习(Dynamic Double Machine Learning, DDML)分析项目的实现示例。这个项目使用了EconML库中的DynamicDML
估计器,用于分析动态处理效应。
项目目标
使用Python和EconML库实现动态双重机器学习(DDML),以估计随时间变化的处理效应。我们将通过合成数据和简单的观测数据来演示如何使用DDML估计器。
1. 环境准备
首先,确保安装了必要的Python库:
pip install EconML scikit-learn pandas numpy matplotlib seaborn
2. 数据生成
我们将生成一个简单的合成数据集,用于演示DDML的使用。数据生成过程基于马尔可夫决策过程,其中处理效应随时间变化。
import numpy as np
from EconML.panel.dml import DynamicDML
from EconML.tests.dgp import DynamicPanelDGP, add_vlines
import matplotlib.pyplot as plt
# 设置随机种子以确保结果可复现
np.random.seed(123)
# 数据生成参数
n_panels = 500 # 面板单位数量
n_periods = 3 # 时间期数
n_treatments = 2 # 每期的处理变量数量
n_x = 100 # 每期的特征变量总数
s_x = 10 # 控制变量的稀疏度
s_t = 10 # 处理变量的稀疏支撑集大小
# 创建数据生成过程实例
dgp = DynamicPanelDGP(n_periods, n_treatments, n_x).create_instance(
s_x, random_seed=12345
)
# 生成观测数据
Y, T, X, W, groups = dgp.observational_data(n_panels, s_t=s_t, random_seed=12345)
true_effect = dgp.true_effect
3. 使用DynamicDML估计器
接下来,我们将使用DynamicDML
估计器来估计动态处理效应。
from sklearn.linear_model import LassoCV, MultiTaskLassoCV
# 定义DynamicDML估计器
est = DynamicDML(
model_y=LassoCV(cv=3, max_iter=1000), # 用于拟合结果变量Y
model_t=MultiTaskLassoCV(cv=3, max_iter=1000), # 用于拟合处理变量T
cv=3 # 外层交叉验证次数
)
# 训练估计器
est.fit(Y, T, X=None, W=W, groups=groups)
# 输出平均处理效应
print(f"Average effect of default policy: {est.ate():0.2f}")
# 计算目标政策相对于基准政策的效应
baseline_policy = np.zeros((1, n_periods * n_treatments)) # 基准政策:所有时期、所有处理变量均为0
target_policy = np.ones((1, n_periods * n_treatments)) # 目标政策:所有时期、所有处理变量均为1
eff = est.effect(T0=baseline_policy, T1=target_policy)
print(f"Effect of target policy over baseline policy: {eff[0]:0.2f}")
4. 可视化结果
最后,我们将绘制各期处理效应及其置信区间,与真实效应进行对比。
# 获取置信区间
conf_ints = est.intercept__interval(alpha=0.05)
# 绘制处理效应及其置信区间
plt.figure(figsize=(15, 5))
plt.errorbar(
np.arange(n_periods * n_treatments) - 0.04,
est.intercept_,
yerr=(conf_ints[1] - est.intercept_, est.intercept_ - conf_ints[0]),
fmt='o',
label='DynamicDML'
)
plt.errorbar(
np.arange(n_periods * n_treatments),
true_effect.flatten(),
fmt='o',
alpha=0.6,
label='Ground truth'
)
for t in np.arange(1, n_periods):
plt.axvline(x=t * n_treatments - 0.5, linestyle='--', alpha=0.4)
plt.xticks(
[t * n_treatments - 0.5 + n_treatments / 2 for t in range(n_periods)],
[f"$\theta_{{{t}}}$" for t in range(n_periods)]
)
plt.gca().set_xlim([-.5, n_periods * n_treatments - .5])
plt.ylabel("Effect")
plt.legend()
plt.show()
项目总结
通过上述代码,我们成功地使用DynamicDML
估计器估计了动态处理效应,并通过可视化展示了估计结果与真实效应的对比。此项目展示了如何在Python中使用EconML库进行动态双重机器学习分析。
如果您有特定的数据集或更复杂的需求,可以进一步调整模型参数和数据处理逻辑。