双机器学习

双机器学习(DML)模型 [Chern2016] 适用于当治疗,结果,变量的同时影响治疗和结果的所有的混杂因素都被观察到。令 \(y\) 为结果,\(x\) 为治疗,一个 DML模型解决如下的因果效应估计(CATE估计):

\[\begin{split}y & = F(v) x + g(v, w) + \epsilon \\ x & = h(v, w) + \eta\end{split}\]

其中 \(F(v)\) 是CATE以 \(v\) 为条件。 此外,为了估计 \(F(v)\),我们注意到

\[y - \mathbb{E}[y|w, v] = F(v) (x - \mathbb{E}[x|w, v]) + \epsilon.\]

因此通过首先估计 \(\mathbb{E}[y|w, v]\)\(\mathbb{E}[x|w,v]\)

\[\begin{split}m(v, w) & = \mathbb{E}[y|w, v]\\ h(v, w) & = \mathbb{E}[x|w,v],\end{split}\]

我们能够得到一个新的数据集: \((\tilde{y}, \tilde{x})\) 其中

\[\begin{split}\tilde{y} & = y - m(v, w) \\ \tilde{x} & = x - h(v, w)\end{split}\]

这样 \(\tilde{y}\)\(\tilde{x}\) 之间的关系是线性的

\[\tilde{y} = F(v) \tilde(x) + \epsilon\]

其能够被线性回归模型简单的建模。

另一方面,在现在的版本, \(F(v)\) 采取形式

\[F_{ij}(v) = \sum_k H_{ijk} \rho_k(v).\]

其中 \(H\) 能够被看作一个秩为3的张量且 \(\rho_k\) 是协变量 \(v\) 的函数,比如,最简单的情况 \(\rho(v) = v\) 。因此, 结果 \(y\) 现在能够被表示为

\[\begin{split}y_i & = \sum_j F_{ij}x_j + g(v, w)_j + \epsilon \\ & = \sum_j \sum_k H_{ijk}\rho_k(v)x_j + g(v, w)_j + \epsilon\end{split}\]

在这个意义上,\(\tilde{y}\)\(\tilde{x}\) 之间的线性回归问题现在成为,

\[\tilde{y}_i = \sum_j \sum_k H_{ijk}\rho_k(v) \tilde{x}_j + \epsilon.\]

类结构

class ylearn.estimator_model.double_ml.DoubleML(x_model, y_model, yx_model=None, cf_fold=1, adjustment_transformer=None, covariate_transformer=None, random_state=2022, is_discrete_treatment=False, categories='auto')
参数:
  • x_model (estimator, optional) – 拟合x的机器学习模型。任何这样的模型应该实现 fit()predict`() (也 predict_proba() 如果x是离散的)方法。

  • y_model (estimator, optional) – 为了建模结果训练的机器学习模型。任何合理的y_model应该实现 fit()predict() 方法。

  • yx_model (estimator, optional) – 用于拟合基于x的残差的y的残差的机器学习模型。 当前版本只支持线性回归模型。

  • cf_fold (int, default=1) – 在第一阶段执行交叉拟合的折的数量。

  • adjustment_transformer (transormer, optional, default=None,) – 调整变量的Transformer,其可以被用于生成调整变量的新特征。

  • covariate_transformer (transormer, optional, default=None,) – 协变量的Transformer,其可以被用于生成协变量的新特征。

  • random_state (int, default=2022) –

  • is_discrete_treatment (bool, default=False) – 如果治疗变量是离散的,把这个设为True。

  • categories (str, optional, default='auto') –

fit(data, outcome, treatment, adjustment=None, covariate=None, **kwargs)

拟合DoubleML估计器模型。注意训练一个DML有两个阶段,其中我们在 _fit_1st_stage()_fit_2nd_stage() 中实现它们。

参数:
  • data (pandas.DataFrame) – 训练估计器的训练数据集。

  • outcome (list of str, optional) – 结果的名字。

  • treatment (list of str, optional) – 治疗的名字。

  • adjustment (list of str, optional, default=None) – 保证无混淆的调整集的名字。

  • covariate (list of str, optional, default=None) – 协变量的名字。

返回:

拟合的model

返回类型:

一个DoubleML的实例

estimate(data=None, treat=None, control=None, quantity=None)

用量的类型估计因果效应。

参数:
  • data (pandas.DataFrame, optional, default=None) – 用于估计器估计因果效应的测试数据,注意如果data是None,估计器直接估计训练数据中所有的量。

  • treat (float or numpy.ndarray, optional, default=None) – 在单个离散治疗的情况下,treat应该是所有可能的治疗值之一的int或者str, 其表示预期的治疗值,在有多个离散治疗的情况下,treat应该是一个列表或者ndarray,其中treat[i]表示第i个预期的治疗值。例如, 当有多个离散治疗,array([‘run’, ‘read’])意味着第一个治疗的治疗值是 ‘run’ ,第二个治疗是 ‘read’ 。在连续治疗值的情况下,治疗应该是一个float或者ndarray。

  • quantity (str, optional, default=None) –

    返回的估计结果的选项。量的可能值包括:

    1. ’CATE’ : 估计器将会估计CATE;

    2. ’ATE’ : 估计器将会估计ATE;

    3. None : 估计器将会估计ITE或CITE。

  • control (float or numpy.ndarray, optional, default=None) – 这和treat的情况相似。

返回:

估计的因果效应

返回类型:

ndarray

effect_nji(data=None)

用不同的治疗值计算因果效应。

参数:

data (pandas.DataFrame, optional, default=None) – 用于估计器估计因果效应的测试数据,注意如果data是None,估计器会使用训练数据。

返回:

不同治疗值的因果效应。

返回类型:

ndarray

comp_transormer(x, categories='auto')

把离散的治疗正确转变为独热向量。

参数:
  • x (numpy.ndarray, shape (n, x_d)) – 包含治疗变量信息的数组。

  • categories (str or list, optional, default='auto') –

返回:

转变的独热向量。

返回类型:

numpy.ndarray