1、DDML双重机器学习模型回顾
基本符号说明:
我们采用以下符号:
( Y ):表示结果变量(因变量)。 ( X ):表示混杂变量(控制变量),这些变量可能影响因变量和处理变量。 ( Z ):表示工具变量。 ( D ):表示感兴趣的处理变量(自变量)。
1. 部分线性模型 (Partial Linear Model) [partial]
模型公式:
#关键内容:
目标:估计因果参数 ( a ) ,同时灵活地控制 ( X ) 的非线性影响。 解释: ( a ):感兴趣的因果效应参数。 ( g(X) ):控制变量 ( X ) 的非线性函数,用机器学习方法进行估计。 ( U ) 和 ( V ):噪声项,分别影响 ( Y ) 和 ( D )。 灵活性: ddml
工具支持多个处理变量 ( D ),这些变量可以是二元变量(如是否接受干预)或连续变量(如治疗剂量)。
2. 交互模型 (Interactive Model) [interactive]
模型公式:
关键内容:
目标:放宽部分线性模型中 ( X ) 和 ( D ) 可分离的假设。 解释: 在交互模型中,控制变量 ( X ) 和处理变量 ( D ) 可以共同影响 ( Y )。 ( D ):假定为二元处理变量(例如是否接受治疗或干预)。 关注点:感兴趣的是:
平均处理效应(ATE,Average Treatment Effect)。 对接受治疗者的平均处理效应(ATT,Average Treatment Effect on the Treated)。
3. 部分线性工具变量模型 (Partial Linear IV Model) [iv]
模型公式:
关键内容:
目标:通过工具变量 ( Z ) 校正处理变量 ( D ) 的偏误,估计因果参数 ( a )。 解释: **工具变量 ( Z )**:用于解决内生性问题(即 ( D ) 和误差项 ( U ) 相关的情况)。 灵活控制:允许 ( X ) 是高维变量,并通过非线性函数 ( g(X) ) 控制其影响。 适用场景:当因果推断中存在内生性问题时,这种模型非常有用。
4. 灵活工具变量模型 (Flexible IV Model) [fiv]
模型公式:
关键内容:
目标:与部分线性模型类似,估计因果参数 ( a )。 解释: 灵活工具变量模型允许对最优工具变量(optimal instruments)进行近似,从而提升效率。 ( m(Z) ):工具变量 ( Z ) 的函数,捕获 ( Z ) 对处理变量 ( D ) 的影响。 ( g(X) ):非线性函数,捕获控制变量 ( X ) 的复杂影响。 假设:此模型比部分线性工具变量模型需要更强的独立性假设。 优势:更适合处理高维工具变量或复杂数据结构。
5. 交互式工具变量模型 (Interactive IV Model) [interactiveiv]
模型公式:
关键内容:
目标:灵活控制高维变量 ( X ),同时估计局部平均处理效应(LATE,Local Average Treatment Effect)。 解释: 工具变量 ( Z ) 和处理变量 ( D ):均为二元变量。 允许工具变量 ( Z )、控制变量 ( X ) 和处理变量 ( D ) 之间存在复杂的交互关系。 应用场景:当数据中控制变量与工具变量存在复杂交互作用时,使用此模型可以更好地估计因果效应。
总结:
这部分介绍了几种支持的模型以及它们的具体公式和应用场景:
部分线性模型:通过灵活控制变量 ( X ) 来估计因果效应。 交互模型:允许 ( X ) 和 ( D ) 共同作用。 部分线性工具变量模型:引入工具变量 ( Z ) 来校正内生性问题。 灵活工具变量模型:增强对工具变量的估计能力。 交互式工具变量模型:处理工具变量、控制变量和处理变量之间的复杂交互。
2、DDML 算法 (DDML Algorithm)
算法步骤:
DDML 估计器分为两个阶段:
**交叉拟合 (Cross-fitting)**:估计条件期望函数。 **第二阶段估计 (Second Stage Estimation)**:基于 Neyman 正交得分(Neyman orthogonal scores)进行因果参数估计。
Chernozhukov 等人 (2018) 的研究:
证明了交叉拟合允许我们利用广泛的机器学习算法(如随机森林、梯度提升等)进行因果推断。 交叉拟合的关键在于确保第一阶段估计误差和第二阶段回归残差之间的独立性。
部分线性模型 (Partially Linear Model) 示例:
假设我们有如下模型:
在条件正交性 (conditional orthogonality) 假设下,我们可以将参数 表示为:
其中:
:处理变量 的条件期望。 :结果变量 的条件期望。
交叉拟合 (Cross-Fitting)
交叉拟合用于估计条件期望函数:
DDML 通过交叉拟合估计 和 ,然后使用这些估计值计算 DDML 的因果效应 。
步骤:
样本划分:
将数据随机分为 个大小相等的子集(folds),记为 。
每个子集的估计:
对于每个子集 ,我们仅使用不在第 个子集中的观测值(即 )来估计条件期望函数 和 。 得到估计值 和 ,分别表示在 子集中估计的结果。
预测:
对于 子集中的每个观测值 ,使用 和 作为条件期望的预测值。
重复过程:
对所有 个子集重复上述过程,最终完成所有样本的交叉拟合。
DDML 参数估计公式
通过交叉拟合估计值计算因果参数 :
其中:
:表示第 个观测值所属的子集(fold)。 :在子集 中估计的 值。 :在子集 中估计的 值。
公式解释:
分子:计算 和 的交互残差部分。 分母:计算处理变量 的残差平方和,用于标准化。
算法核心思想
交叉拟合:
在 折交叉验证的每一折中,仅使用训练数据(不包含当前子集的样本)来估计条件期望。 确保估计值的“独立性”,防止因果估计的偏差。
正交性:
Neyman 正交性确保参数估计对高维数据具有稳健性,减小误差。
机器学习工具的使用:
使用随机森林、梯度提升等灵活的机器学习方法估计 和 。
总结
DDML 的算法基于两大核心步骤:交叉拟合和正交估计。它允许我们在因果推断中使用机器学习算法的灵活性,同时确保估计的准确性和稳健性。通过公式计算可以得出最终因果参数 ,并适用于部分线性模型等多个场景。
3、安装指南 (Installation)
1. 使用 SSC 安装
您可以从 SSC (Stata’s Statistical Software Components) 官方服务器安装 ddml
:
ssc install ddml, replace
说明: 以上命令会从 Stata 的官方 SSC 仓库安装最新版本的 ddml
。如果已安装旧版本, replace
参数将替换为最新版本。
2. 使用 GitHub 安装
我们倾向于更频繁地更新 GitHub 版本,建议直接从 GitHub 获取最新版本。安装方法如下:
net install ddml, ///
from(https://raw.githubusercontent.com/aahrens1/ddml/master) ///
replace
说明: 该命令会从 GitHub 的主分支安装最新版本。 replace
参数会自动覆盖旧版本。
3. 安装旧版本
如果需要安装某个特定的旧版本(例如 v1.2
),可以使用以下命令:
net install ddml, ///
from(https://raw.githubusercontent.com/aahrens1/ddml/v1.2) ///
replace
说明: 替换 from()
中的链接为对应的旧版本路径即可。旧版本可能适用于某些特定的兼容性需求。
4. 定期检查更新
请定期检查 ddml
的更新,以获取最新的功能和修复版本。建议:
查看 GitHub 仓库中的最新发布。 或使用上述命令重新安装最新版本。
4、 设置 Stata 的 Python 集成 (Setting up Stata's Python Integration)
pystacked
需要以下环境和工具:
Stata 16 或更高版本。 Python 安装:Python 版本需要 3.8 或更高。 scikit-learn:版本需为 0.24 或更高。 如果计划使用 ddml
,也需要安装 Python。
StataCorp 提供了三篇博客,详细说明了如何设置 Stata 的 Python 集成:链接 1、链接 2、链接 3。以下是步骤的简要概述:
1. 安装 Python
有以下三种方式来安装 Python:
使用 Anaconda:
这是最简单的方法,Anaconda 是一个包含主要 Python 包的发行版,同时附带包管理器和编辑器。 下载 Anaconda 并按照提示安装。
直接安装 Python:
如果更喜欢标准的 Python 安装,可以从 Python 官方网站 下载并安装。
设置单独的 Python 环境(可选):
如果您已经有一个较新的 Python 版本,可以为 Stata 设置一个单独的 Python 环境。这对于不同项目使用不同的库时会很有用。 详细说明如何设置 Python 环境。
2. 设置 Python 集成
步骤:
查找 Python 安装路径:
在 Stata 中运行以下命令来查找系统中的 Python 安装:
python search
注意:您的系统可能有多个 Python 安装(例如 MacOS 自带的旧版 Python),而 Stata 不一定能找到所有安装。
将 Stata 与 Python 链接:使用以下命令将 Stata 与特定的 Python 安装链接:
python set exec <pyexecutable>, permanently
<pyexecutable>
是 Python 可执行文件的路径,例如:MacOS: /usr/local/bin/python3
Windows: C:\Program Files\Python38\python.exe
其他: C:\Users\<user>\AppData\Local\Programs\Python\Python38\python.exe
检查链接是否成功:
在 Stata 中运行以下命令:
- 输出示例如下:
```
Python Settings
set python_exec /usr/bin/python3
set python_userpath
Python system information
initialized no
version 3.8.9
architecture 64-bit
启动 Python 会话:
在 Stata 中输入 python
来启动 Python,会话中可以直接运行 Python 代码。输入 end
返回 Stata 环境:
. python
>>> print('hello')
hello
>>> end
3. 管理 Python 包
安装 scikit-learn:
pystacked
需要 scikit-learn
(简称 sklearn
)。可以通过以下方式检查是否已安装:
python which sklearn
如果未找到 sklearn
,可能是因为:
Stata 链接了错误的 Python 安装。 尚未安装 scikit-learn
。
安装方式:
使用 Anaconda:
如果您使用 Anaconda, scikit-learn
会被自动安装。您可以通过 Anaconda 的包管理器更新 scikit-learn
,或在终端中运行以下命令:
使用 pip 安装:
如果未使用 Anaconda,可以使用 pip
安装:
<Python path> -m pip install -U scikit-learn
或直接在 Stata 中运行以下命令:
shell <Python path> -m pip install -U scikit-learn
<Python path>
是您与 Stata 链接的 Python 安装路径。如果想使用默认 Python 安装,可将
<Python path>
替换为python3
(MacOS)或py
(Windows)。
4. 测试安装是否成功
测试 Stata 的 Python 集成:
运行以下测试代码,检查 Stata 是否正确集成 Python:
clear all
use http://www.stata-press.com/data/r16/iris
python:
from sfi import Data
import numpy as np
from sklearn.svm import SVC
# Use the sfi Data class to pull data from Stata variables into Python
X = np.array(Data.get("seplen sepwid petlen petwid"))
y = np.array(Data.get("iris"))
# Use the data to train C-Support Vector Classifier
svc_clf = SVC(gamma='auto')
svc_clf.fit(X, y)
end
测试 pystacked:
运行以下代码,测试 pystacked
是否正常运行:
clear all
use https://statalasso.github.io/dta/cal_housing.dta, clear
set seed 42
gen train=runiform()
replace train=train<.75
set seed 42
pystacked medh longi-medi if train