基于Python的动态双重机器学习(Dynamic Double Machine Learning, DDML)分析项目的实现示例

发布于:2025-07-13 ⋅ 阅读:(12) ⋅ 点赞:(0)

根据您的需求,以下是一个基于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库进行动态双重机器学习分析。

如果您有特定的数据集或更复杂的需求,可以进一步调整模型参数和数据处理逻辑。


网站公告

今日签到

点亮在社区的每一天
去签到