社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

EconML:因果机器学习的实现流程

连享会 • 4 天前 • 20 次点击  


👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:连享会:2025社会网络分析·线上
嘉宾:杨张博,西安交通大学
时间:2025 年 7 月 30-31 日
咨询:王老师 18903405450(微信)


温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

作者: 李长生 (贵州大学)
邮箱:2716759269@qq.com


编者按: 本文主要参考下文,特此感谢!Source: EconML User Guide. -HTML-


1. 简介

EconML 是一个基于 Python 的开源库,专注于利用机器学习方法从观测数据(Observational Data)或实验数据(Experimental Data)中估计个体处理效应(Individual Treatment Effect, ITE)。

该库集成了因果推断与机器学习的前沿技术,通过将灵活的机器学习模型嵌入到可解释的因果分析框架中,显著提升了反事实预测的准确性和可靠性,使更多研究者能够便捷地开展因果推断分析。

在上一篇推文中,我们已介绍了如何使用 EconML 实现动态双重机器学习(Dynamic Double Machine Learning, DML)的基本流程。本文将进一步探讨 EconML 的核心功能及其在实际中的应用场景。

参考阅读:李俊奇,2025,Python-EconML 包:快速上手动态双重机器学习,连享会 No.1577.

EconML 由微软研究院 ALICE 团队开发,具备以下主要特点:

EconML 库实现了计量经济学与机器学习交叉领域文献中的前沿技术,这些技术致力于通过基于机器学习的方法解决异质性处理效应的估计问题。这些新型方法在建模效应异质性方面提供了极大的灵活性(通过诸如随机森林、Boosting 方法、Lasso 回归和神经网络等技术实现),同时借鉴了来自因果推断和计量经济学的技术,以保持所学模型的因果解释。

EconML 库流程以及包含的模型如下:

EconML 库估计模型详细对比表,详情点击链接访问:

Estimator
Treatment Type
Requires Instrument
Delivers Conf. Intervals
Linear Treatment
Linear Heterogeneity
Multiple Outcomes
Multiple Treatments
High-Dimensional Features
SieveTSLS
Any
Yes

Yes
Assumed
Yes
Yes

DeepIV
Any
Yes



Yes
Yes

SparseLinearDML
Any

Yes
Yes
Assumed
Yes
Yes
Yes
SparseLinearDRLearner
Categorical

Yes

Projected

Yes
Yes
LinearDML
Any

Yes
Yes
Assumed
Yes
Yes

LinearDRLearner
Categorical

Yes

Projected

Yes

CausalForestDML
Any

Yes
Yes

Yes
Yes
Yes
ForestDRLearner
Categorical

Yes



Yes
Yes
DMLOrthoForest
Any

Yes
Yes


Yes
Yes
DROrthoForest
Categorical

Yes



Yes
Yes
metalearners
Categorical




Yes
Yes
Yes
DRLearner
Categorical





Yes
Yes
DML
Any


Yes
Assumed
Yes
Yes
Yes
NonParamDML
1-d/Binary


Yes

Yes

Yes
OrthoIV
Any
Yes
Yes
Yes
Assumed
Yes
Yes

DMLIV
Any
Yes

Yes
Assumed
Yes
Yes
Yes
NonParamDMLIV
1-d/Binary
Yes

Yes

Yes

Yes
DRIV
1-d/Binary
Yes
Yes
Yes



Yes
LinearDRIV
1-d/Binary
Yes
Yes
Yes
Projected



SparseLinearDRIV
1-d/Binary
Yes
Yes
Yes
Projected


Yes
ForestDRIV
1-d/Binary
Yes
Yes
Yes



Yes
IntentToTreatDRIV
Binary
Yes
Ye
Yes



Yes
LinearIntentToTreatDRIV
Binary
Yes
Yes
Yes
Projected



本文主要展示以下 3 种模型的实现流程:

  • 元学习器(Meta-Learners)的应用
  • 因果森林 (Causal Forests)方法
  • 深度工具变量(Deep IV)技术


2. 元学习器(Meta-Learners)

元学习器是专门用于二元处理的异质性处理效应估计量,其通过分别建模潜在结果函数 和  实现。为校正处理选择的异质性倾向,两个建模的响应函数  和  在最终处理效应估计中采用不同的加权方案进行整合。具体方法论详见Kunzel et al.(2019)。

EconML SDK 实现了以下元学习器:

  • T-Learner
  • S-Learner
  • X-Learner
  • DomainAdaptation-Learner
  • DoublyRobust-Learner

本部分将在 Synthetic Data 和 Semi-synthetic Data 上对比这五种 CATE 估计模型的性能。

首先导入必需的库:

from econml.metalearners import TLearner, SLearner, XLearner, DomainAdaptationLearner

import numpy as np
from  numpy.random import binomial, multivariate_normal, normal, uniform
from sklearn.ensemble import RandomForestClassifier, GradientBoostingRegressor
import matplotlib.pyplot as plt

%matplotlib inline  # Jupyter Notebook 魔法命令,用于内嵌显示图表

2.1 Example Usage with Synthetic Data

A. 数据生成过程(DGP)

我们采用 Kunzel et al.(2019) 提出的结构化数据生成机制,其模型表述如下:

其中,为观测结果变量, 为二元处理变量,为随机扰动项,为倾向得分函数。

由上述设定可得条件平均处理效应(CATE)的闭式解:

# Define DGP
def generate_data(n, d, controls_outcome, treatment_effect, propensity):
    """Generate population data for given untreated_outcome, treatment_effect and propensity functions.

    Parameters
    ----------
        n (int): population size
        d (int): number of covariates
        controls_outcome (func): untreated outcome conditional on covariates
        treatment_effect (func): treatment effect conditional on covariates
        propensity (func): probability of treatment conditional on covariates
    """

    # Generate covariates
    X = multivariate_normal(np.zeros(d), np.diag(np.ones(d)), n)
    # Generate treatment
    T = np.apply_along_axis(lambda x: binomial(1, propensity(x), 1)[0], 1, X)
    # Calculate outcome
    Y0 = np.apply_along_axis(lambda x: controls_outcome(x), 1, X)
    treat_effect = np.apply_along_axis(lambda x: treatment_effect(x), 1, X)
    Y = Y0 + treat_effect * T
    return (Y, T, X)
# controls outcome, treatment effect, propensity definitions
def generate_controls_outcome(d):
    beta = uniform(-33, d)
    returnlambda x: np.dot(x, beta) + normal(01)
def treatment_effect(x):
    return (1if x[1] > 0.1else0) * 8
def propensity(x):
    return0.8if x[2] > -0.5and x[2] 0.5else0.2



    
# DGP constants and test data
d = 5
n = 1000
n_test = 250
controls_outcome = generate_controls_outcome(d)
X_test = multivariate_normal(np.zeros(d), np.diag(np.ones(d)), n_test)
delta = 6/n_test
X_test[:, 1] = np.arange(-33, delta)
Y, T, X = generate_data(n, d, controls_outcome, treatment_effect, propensity)

B. 模型训练

# Instantiate T learner
models = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=int(n/100))
T_learner = TLearner(models=models)
# Train T_learner
T_learner.fit(Y, T, X=X)
# Estimate treatment effects on test data
T_te = T_learner.effect(X_test)
# Instantiate S learner
overall_model = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=int(n/100))
S_learner = SLearner(overall_model=overall_model)
# Train S_learner
S_learner.fit(Y, T, X=X)
# Estimate treatment effects on test data
S_te = S_learner.effect(X_test)
# Instantiate X learner
models = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=int(n/100))
propensity_model = RandomForestClassifier(n_estimators=100, max_depth=6,
                                                  min_samples_leaf=int(n/100))
X_learner = XLearner(models=models, propensity_model=propensity_model)
# Train X_learner
X_learner.fit(Y, T, X=X)
# Estimate treatment effects on test data
X_te = X_learner.effect(X_test)
# Instantiate Domain Adaptation learner
models = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=int(n/100))
final_models = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=int(n/100))
propensity_model = RandomForestClassifier(n_estimators=100, max_depth=6,
                                                  min_samples_leaf=int(n/100))
DA_learner = DomainAdaptationLearner(models=models,
                                     final_models=final_models,
                                     propensity_model=propensity_model)
# Train DA_learner
DA_learner.fit(Y, T, X=X)
# Estimate treatment effects on test data
DA_te = DA_learner.effect(X_test)
# Instantiate Doubly Robust Learner
from econml.dr import DRLearner
outcome_model = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=int(n/100))
pseudo_treatment_model = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=int(n/100))
propensity_model = RandomForestClassifier(n_estimators=100, max_depth=6,
                                                  min_samples_leaf=int(n/100))

DR_learner = DRLearner(model_regression=outcome_model, model_propensity=propensity_model,
                       model_final=pseudo_treatment_model, cv=5)
# Train DR_learner
DR_learner.fit(Y, T, X=X)
# Estimate treatment effects on test data
DR_te = DR_learner.effect(X_test)

C. 结果对比

### Comparison plot of the different learners
plt.figure(figsize=(75))
plt.plot(X_test[:, 1], np.apply_along_axis(treatment_effect, 1, X_test), color='black', ls='--', label='Baseline')
plt.scatter(X_test[:, 1], T_te, label="T-learner")
plt.scatter(X_test[:, 1], S_te, label="S-learner")
plt.scatter(X_test[:, 1], DA_te, label="DA-learner")
plt.scatter(X_test[:, 1], X_te, label="X-learner")
plt.scatter(X_test[:, 1], DR_te, label="DR-learner")
plt.xlabel('$x_1$')
plt.ylabel('Treatment Effect')
plt.legend()
plt.show()
# Visualization of bias distribution
expected_te = np.apply_along_axis(treatment_effect, 1, X_test)
plt.violinplot([np.abs(T_te - expected_te),
                np.abs(S_te - expected_te),
                np.abs(DA_te - expected_te),
                np.abs(X_te - expected_te),
                np.abs(DR_te - expected_te)
               ], showmeans=True)
plt.ylabel("Bias distribution")
plt.xticks([12345], ['T-learner''S-learner''DA-learner''X-learner''DR-learner'])
plt.show()

该图证实了当存在模型误设和异质处理效应时,双重稳健元学习器相比传统方法具有显著优势。

2.2 半合成数据示例

本节将演示如何在半合成数据(Semi-synthetic Data)上应用元学习器,并对比不同模型的性能。半合成数据结合了真实世界的协变量和处理分配(如 IHDP 数据集),但结果变量由已知函数生成,便于评估模型的估计准确性。

A. 数据生成过程(DGP)

采用 Hill (2011) 提出的 Response Surface B 方法,基于 IHDP(婴儿健康与发展计划)数据集生成半合成数据。该数据集原为随机对照试验(RCT),但通过移除部分处理组样本(如非白人母亲婴儿),人为引入选择偏差,模拟观测研究环境。数据生成方程如下:

其中   为协变量, 为常数矩阵, 为校准常数, 为误差项。

首先导入数据:

from econml.data.dgps import ihdp_surface_B
Y, T, X, expected_te = ihdp_surface_B()

B. 模型训练

分别拟合 T-learner、S-learner、X-learner、Domain Adaptation Learner 和 Doubly Robust Learner:

# T-learner
T_learner.fit(Y, T, X=X)
T_te = T_learner.effect(X)

# S-learner
S_learner.fit(Y, T, X=X)
S_te = S_learner.effect(X)

# X-learner
X_learner.fit(Y, T, X=X)
X_te = X_learner.effect(X)

# Domain adaptation learner
DA_learner.fit(Y, T, X=X)
DA_te = DA_learner.effect(X)

# Doubly robust learner
DR_learner.fit(Y, T, X=X)
DR_te = DR_learner.effect(X)

C. 结果对比

绘制各模型的偏差分布图,直观比较不同方法的估计误差:

plt.violinplot([np.abs(T_te - expected_te),
                np.abs(S_te - expected_te),
                np.abs(DA_te - expected_te),
                np.abs(X_te - expected_te),
                np.abs(DR_te - expected_te)
               ], showmeans=True)
plt.ylabel("Bias distribution")
plt.xticks([12345], ['T-learner''S-learner''DA-learner''X-learner''DR-learner'])
plt.show()

结果显示,双重稳健元学习器(DR-learner)在存在模型误设和异质性处理效应时,表现出更低的估计偏差和更高的稳健性。


3. 因果森林(Causal Forests)

因果森林(Wager & Athey, 2018)是一种基于随机森林的灵活方法,用于估计异质性处理效应(CATE)。econml.grf 模块为 Python 提供了高性能的广义随机森林(GRF)实现,兼容 R 版 grf 包,支持以下模型:

  • 因果森林(CausalForest):用于估计连续或多值离散处理变量下的 CATE,无未观测混杂假设。
  • 工具变量森林(CausalIVForest):适用于存在未观测混杂且可获得工具变量的场景。
  • 回归森林(RegressionForest):增强版的回归森林,支持置信区间估计。

这些模型均遵循 scikit-learn 的 fit/predict API,支持不确定性量化和置信区间计算(基于 Bootstrap-of-Little-Bags 方法,详见 Athey et al., 2019)。

在 EconML SDK 中,常用的 CATE 估计模型包括:

  • econml.dml.CausalForestDML:结合双重机器学习(DML)与因果森林,先对处理和结果变量残差化,再在残差上应用因果森林。
  • econml.dr.ForestDRLearner:在第一阶段获得的双稳健目标值上,使用回归森林作为最终估计器。

此外,econml.grf.MultiOutputGRF 支持多结果变量场景,为每个目标结果独立拟合森林模型。

因果森林支持两种分裂准则:

  • criterion='het':广义随机森林中的异质性分裂准则,专注于发现处理效应的异质性。
  • criterion='mse':均方误差分裂准则,惩罚高方差分裂。

下面演示如何导入相关库:

from econml.grf import CausalForest
from econml.dml import CausalForestDML
import numpy as np
import scipy.special
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

3.1 生成模拟数据

本节将通过模拟数据演示因果森林(Causal Forest)的基本用法。我们设定真实的处理效应函数 true_te(X):当第一个特征  时,处理效应等于  ,否则为 0。这样可以清晰检验模型对异质性处理效应的识别能力。

np.random.seed(123)
n_samples = 2000
n_features = 10
n_treatments = 1
def true_te(X):
    return np.hstack([(X[:, [0]] > 0) * X[:, [0]],
                       np.ones((X.shape[0], n_treatments - 1)) * np.arange(1, n_treatments).reshape(1-1)])
X = np.random.normal(01, size=(n_samples, n_features))
T = np.random.normal(01, size=(n_samples, n_treatments))
for t in range(n_treatments):
    T[:, t] = np.random.binomial(1, scipy.special.expit(X[:, 0]))
y = np.sum(true_te(X) * T, axis=1, keepdims=True) + np.random.normal(0.5, size=(n_samples, 1))
X_test = X[:min(100, n_samples)].copy()
X_test[:, 0] = np.linspace(np.percentile(X[:, 0], 1), np.percentile(X[:, 0], 99), min(100, n_samples))

3.2 模型拟合

使用 econml.grf.CausalForest 拟合上述数据。该模型支持异质性分裂准则( criterion='het'),能够有效捕捉处理效应的变化。

est = CausalForest(criterion='het', n_estimators=400, min_samples_leaf=5, max_depth=None,
                   min_var_fraction_leaf=None, min_var_leaf_on_val=True,
                   min_impurity_decrease = 0.0, max_samples=0.45, min_balancedness_tol=.45,
                   warm_start=False, inference=True, fit_intercept=True, subforest_size=4,
                   honest=True, verbose=0, n_jobs=-1, random_state=1235)
est.fit(X, T, y)

3.3 结果展示

下图展示了因果森林模型预测的处理效应(蓝色线条)与真实处理效应(橙色线条)的对比。阴影区域为置信区间。可以看到,模型能够较好地还原真实的异质性处理效应。

point, lb, ub = est.predict(X_test, interval=True, alpha=0.01)
point = est.predict(X_test)
for t in range(n_treatments):
    plt.plot(X_test[:, 0], point[:, t])
    if est.inference:
        plt.fill_between(X_test[:, 0], lb[:, t], ub[:, t], alpha=.4)
    plt.plot(X_test[:, 0], true_te(X_test)[:, t])
plt.show()

如上图所示,因果森林能够准确刻画处理效应随特征变化的异质性,验证了其在复杂因果推断场景下的有效性。

3.4 因果树可视化

因果森林模型本质上是多棵因果树的集成。我们可以对其中一棵树进行可视化,直观展示模型如何基于协变量进行分裂、划分同质子群,并在叶节点输出局部平均处理效应(LATE)估计。

plt.figure(figsize=(2010))
plot_tree(est[0], impurity=True, max_depth=3)
plt.show()

如上图所示,因果树通过对协变量的最优分裂,逐步将样本划分为处理效应同质的子群体。每个叶节点给出该子群体的局部平均处理效应估计,有助于理解模型的分裂逻辑和异质性来源。

3.5 变量重要性可视化

变量重要性反映了各特征在因果森林分裂和处理效应估计中的贡献。通过可视化特征重要性分数,可以识别哪些变量对异质性处理效应的解释最为关键。

plt.figure(figsize=(15,5))
plt.plot(est.feature_importances(max_depth=4, depth_decay_exponent=2.0))
plt.xlabel('Feature Index')
plt.ylabel('Importance Score')
plt.title('Causal Forest Feature Importances')
plt.show()

从图中可以看出,特征  的重要性远高于其他变量,这与数据生成机制(真实处理效应仅依赖 )完全一致。其余特征的重要性接近于零,说明它们对处理效应的解释作用有限。

3.6 SHAP 值可视化

SHAP(SHapley Additive exPlanations)值为模型输出提供了局部可解释性,揭示每个特征对单一样本处理效应预测的具体贡献。通过 beeswarm 图,可以全面展示特征对模型预测的影响分布。

import shap
explainer = shap.Explainer(est, shap.maskers.Independent(X, max_samples=100))
shap_values = explainer(X[:200])
shap.plots.beeswarm(shap_values)

图中纵轴为特征(按重要性降序排列),横轴为 SHAP 值(即特征对处理效应预测的贡献)。颜色表示特征取值的高低。可以看到,Feature 0()对模型输出的影响最大,且高取值时贡献为正,低取值时贡献为负,这与数据生成机制完全吻合。其他特征的 SHAP 值分布接近于零,进一步验证了模型的可解释性和变量选择的有效性。

通过上述多维可视化分析,用户不仅可以获得因果森林的预测结果,还能深入理解模型的决策依据和变量驱动机制,从而提升因果推断的透明度与信任度。


4. 深度工具变量(Deep IV)

Deep IV 是一种结合深度神经网络与工具变量两阶段因果效应估计的方法,详见 Hartford et al. (2017) 及 EconML 官方指南。在 EconML SDK 中,Deep IV 基于 Keras 框架实现,适用于复杂的非线性、异质性因果效应建模。

Deep IV 估计流程分为两步:

  1. 第一阶段:利用混合密度网络(Mixture Density Network, MDN)建模处理变量  在给定协变量  和工具变量  下的条件分布 
  2. 第二阶段:用神经网络建模响应变量   关于  和  的关系,进而估计  的条件期望 

这种方法允许在  受  强烈影响且  满足工具变量假设(仅通过  影响 )的场景下,灵活估计  对  的因果效应。

首先导入所需库:

from econml.iv.nnet import DeepIV
import keras
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

后续内容将详细演示 Deep IV 在合成数据上的建模流程,包括数据生成、神经网络结构定义、模型拟合与效果评估。

4.1 数据生成过程

为演示 Deep IV 方法,这里构建一个合成数据集,设定协变量 X、工具变量 Z、处理变量 T 满足如下分布关系:

n = 5000

# 初始化外生变量:正态分布误差项、均匀分布协变量和工具变量
e = np.random.normal(size=(n,))
x = np.random.uniform(low=0.0, high=10.0, size=(n,))
z = np.random.uniform(low=0.0, high=10.0, size=(n,))

# 生成处理变量
t = np.sqrt((x+2) * z) + e

# 展示 t 的边际分布
plt.hist(t)
plt.xlabel("t")
plt.show()

plt.scatter(z[x 1], t[x 1], label='low X')
plt.scatter(z[(x > 4.5) * (x 5.5)], t[(x > 4.5) * (x 5.5)], label='moderate X')
plt.scatter(z[x > 9], t[x > 9], label='high X')
plt.legend()
plt.xlabel("z")
plt.ylabel("t")
plt.show()

如上图所示,工具变量 Z 与处理变量 T 呈正相关,且 X 的不同取值影响 Z 对 T 的作用强度。高 X 区间内,T 呈现更复杂的分布结构,体现了工具变量的异质性影响。

接下来定义结果变量  Y,其为 T 和 X 的非线性函数,并加入噪声项:

# 结果方程
y = t*t / 10 - x*t / 10 + e

# 可视化 t 与 z 的关系及不同 x 下的真实效应曲线
plt.scatter(t,z, label ='raw data')
tticks = np.arange(-2,12)
yticks2 = tticks*tticks/10 - 0.2 * tticks
yticks5 = tticks*tticks/10 - 0.5 * tticks
yticks8 = tticks*tticks/10 - 0.8 * tticks
plt.plot(tticks,yticks2, 'r--', label = 'truth, x=2')
plt.plot(tticks,yticks5, 'g--', label = 'truth, x=5')
plt.plot(tticks,yticks8, 'y--', label = 'truth, x=8')
plt.xlabel("t")
plt.ylabel("y")
plt.legend()
plt.show()

此处,Y 仅依赖于 T 和  X,不直接受 Z 影响,满足工具变量的排他性假设。数据生成机制确保了内生性问题的存在(误差项同时影响 T 和 Y),并且因果效应在 X 上表现出非线性和异质性特征,为 Deep IV 提供了理想的测试场景。


4.2 定义神经网络模型

使用 Keras Sequential 构建处理模型和结果模型。每个模型包含多层全连接神经网络与 Dropout 层,分别用于建模  和 

```python
treatment_model = keras.Sequential([
    keras.layers.Dense(128, activation='relu', input_shape=(2,)),
    keras.layers.Dropout(0.17),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.17),
    keras.layers.Dense( 32, activation='relu'),
    keras.layers.Dropout(0.17)
])
response_model = keras.Sequential([
    keras.layers.Dense(128, activation='relu', input_shape=(2,)),
    keras.layers.Dropout(0.17),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.17),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dropout(0.17),
    keras.layers.Dense(1)
])

实例化 Deep IV 时,需将模型以 lambda 表达式传入,确保多次调用时权重一致:

```python
```python
keras_fit_options = {
    "epochs": 30,
    "validation_split": 0.1,
    "callbacks": [keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True)]
}

deepIvEst = DeepIV(
    n_components=10,
    m=lambda z, x: treatment_model(keras.layers.concatenate([z, x])),
    h=lambda t, x: response_model(keras.layers.concatenate([t, x])),
    n_samples=1,
    use_upper_bound_loss=False,
    n_gradient_samples=1,
    optimizer='adam',
    first_stage_options=keras_fit_options,
    second_stage_options=keras_fit_options
)

---

### 4.3 模型拟合与效果评估

拟合 Deep IV 模型:

```python
deepIvEst.fit(Y=y, T=t, X=x, Z=z)

生成新数据并对比预测与真实效应:

n_test = 500
for i, x_val in enumerate([258]):
    t = np.linspace(010, num=100)
    y_true = t * t / 10 - x_val * t / 10
    y_pred = deepIvEst.predict(t, np.full_like(t, x_val))
    plt.plot(t, y_true, label=f'true y, x={x_val}', color=f'C{i}')
    plt.plot(t, y_pred, label=f'pred y, x={x_val}', color=f'C{i}', ls='--')
plt.xlabel('t')
plt.ylabel('y')
plt.legend()
plt.show()

如上图所示,Deep IV 能较好地拟合不同 x 区间下的真实效应曲线。尤其在工具变量效力较强的区间,模型预测与真实值高度吻合;而在工具变量较弱的低 x 区间,模型表现略逊,但整体仍能捕捉主要的非线性和异质性特征。这表明 Deep IV 在复杂因果推断任务中的有效性和稳健性。


5. 参考文献

  • Künzel, S. R., Sekhon, J. S., Bickel, P. J., & Yu, B. (2019). Metalearners for estimating heterogeneous treatment effects using machine learning. Proceedings of the National Academy of Sciences, 116(10), 4156-4165. Link (rep), PDF, Google.
  • Hill, J. L. (2011). Bayesian Nonparametric Modeling for Causal Inference. Journal of Computational and Graphical Statistics, 20(1), 217–240. Link, PDF, Google.
  • Wager, S., & Athey, S. (2018). Estimation and Inference of Heterogeneous Treatment Effects using Random Forests. Journal of the American Statistical Association, 113(523), 1228–1242. Link, PDF, -PDF2-, Google.
  • Athey, S., Tibshirani, J., & Wager, S. (2019). Generalized random forests. The Annals of Statistics, 47(2). Link, PDF, -PDF2-, Google.
  • Hartford J, Lewis G, Leyton-Brown K, et al. Deep IV: A flexible approach for counterfactual prediction[C]//International Conference on Machine Learning. PMLR, 2017: 1414-1423. -PDF-


6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 机器学习 DML, nocat md ex(IV 专题 课 班 助教 主讲 交互 搜索 预测 连享会)
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • Drukker, 刘迪,2020, Stata Blogs - An introduction to the lasso in Stata (拉索回归简介), 连享会 No.117.
  • 仵荣鑫,2022, 知乎热议:如何学习机器学习, 连享会 No.983.
  • 全禹澄,2021, 机器学习如何用?金融 + 能源经济学文献综述, 连享会 No.670.
  • 关欣,2022, 机器学习在经济学领域的应用前景, 连享会 No.905.
  • 冯乔,2023, Stata 中的堆栈泛化和机器学习-pystacked, 连享会 No.1317.
  • 吕卓阳,2021, MLRtime:如何在 Stata 调用 R 的机器学习包?, 连享会 No.85.
  • 吴欣洋,2025, AI 自动生成研究假设,靠谱吗?流程与挑战, 连享会 No.1588.
  • 吴欣洋,2025, 分享!数百个金融类机器学习仓库:financial-ML, 连享会 No.1613.
  • 张弛,2025, 大语言模型到底是个啥?通俗易懂教程, 连享会 No.1600.
  • 张瑞钰,2021, 知乎热议:纠结 - 计量经济、时间序列和机器学习, 连享会 No.585.
  • 李俊奇,2025, Python-EconML 包:快速上手动态双重机器学习, 连享会 No.1577.
  • 李金桐,2023, 因果推断:双重机器学习-ddml, 连享会 No.1221.
  • 樊嘉诚,2021, Stata:机器学习分类器大全, 连享会 No.505.
  • 浦进博,2024, 合成控制法最新进展!机器学习+SCM!-qcm, 连享会 No.1515.
  • 王卓,2023, Python:从随机实验到双重机器学习, 连享会 No.1204.
  • 王烨文,2025, 新书免费读:CausalMLBook-因果机器学习, 连享会 No.1602.
  • 田原,2020, 支持向量机:Stata 和 Python 实现, 连享会 No.149.
  • 米书颖,2024, 机器学习:大佬建议的标准动作, 连享会 No.1470.
  • 董洁妙,2022, Stata:双重机器学习 - 多维聚类标准误的估计方法-crhdreg, 连享会 No.1036.
  • 赵莹,2022, 知乎热议:机器学习在经济学的应用前景, 连享会 No.938.
  • 连小白,2025, Kaggle-数据科学平台:找数据、搜代码一网打尽, 连享会 No.1586.
  • 连小白,2025, Python 常用包盘点:经济与金融领域的必备工具包, 连享会 No.1568.
  • 马丁,刘梦真,2021, 机器学习:随机森林算法的 Stata 实现, 连享会 No.568.


🍓 课程推荐:连享会:2025暑期班·网络直播
嘉宾:连玉君 (初级+高级) || 张宏亮 (论文班)
时间:2025 年 8 月 4-14 日
咨询:王老师 18903405450(微信)

连享会微信小店上线啦!

Note:扫一扫进入“连享会微信小店”,你想学的课程在这里······

New! Stata 搜索神器:lianxh 和 songblGIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉   使用:
. lianxh DID 倍分法
. songbl all


🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下:连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184273
 
20 次点击