👇 连享会 · 推文导航 | 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
库估计模型详细对比表,详情点击链接访问:
High-Dimensional Features SieveTSLS
DeepIV
SparseLinearDML
SparseLinearDRLearner
LinearDML
LinearDRLearner
CausalForestDML
ForestDRLearner
DMLOrthoForest
DROrthoForest
metalearners
DRLearner
DML
NonParamDML
OrthoIV
DMLIV
NonParamDMLIV
DRIV
LinearDRIV
SparseLinearDRIV
ForestDRIV
IntentToTreatDRIV
LinearIntentToTreatDRIV
本文主要展示以下 3 种模型的实现流程:
2. 元学习器(Meta-Learners) 元学习器是专门用于 二元处理 的异质性处理效应估计量,其通过分别建模潜在结果函数 和 实现。为校正处理选择的异质性倾向
,两个建模的响应函数 和
在最终处理效应估计中采用不同的加权方案进行整合。具体方法论详见Kunzel et al.(2019)。
EconML SDK 实现了以下元学习器:
本部分将在 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( -3 , 3 , d) return lambda x: np.dot(x, beta) + normal( 0 , 1 ) def treatment_effect (x) : return ( 1 if x[ 1 ] > 0.1 else 0 ) * 8 def propensity (x) : return 0.8 if x[ 2 ] > -0.5 and x[ 2 ] 0.5 else 0.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( -3 , 3 , 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=( 7 , 5 )) 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([ 1 , 2 , 3 , 4 , 5 ], [ '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([ 1 , 2 , 3 , 4 , 5 ], [ '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( 0 , 1 , size=(n_samples, n_features)) T = np.random.normal( 0 , 1 , 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=( 20 , 10 )) 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 估计流程分为两步:
第一阶段 :利用混合密度网络(Mixture Density Network, MDN)建模处理变量 在给定协变量 和工具变量 下的条件分布 。 第二阶段 :用神经网络建模响应变量
关于 和 的关系,进而估计 的条件期望 。
这种方法允许在 受 强烈影响且 满足工具变量假设(仅通过 影响 )的场景下,灵活估计 对 的因果效应。
首先导入所需库:
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([ 2 , 5 , 8 ]): t = np.linspace( 0 , 10 , 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
和 songbl
GIF 动图介绍 搜: 推文、数据分享、期刊论文、重现代码 …… 👉 安装: . ssc install lianxh
. ssc install songbl
👉
使用: . lianxh DID 倍分法
. songbl all
🍏 关于我们 直通车: 👉【 百度一下: 连享会 】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。