双鲁棒
双鲁棒方法(参考 [Funk2010] )估计因果效应当治疗是离散的且满足无混淆条件。 训练一个双鲁棒模型由3步组成。
令 \(k\) 为一个int。形成一个对数据 \(\{(X_i, W_i, V_i, Y_i)\}_{i = 1}^n\) 的 \(K\)-fold 随机划分,这样
\[\{(x_i, w_i, v_i, y_i)\}_{i = 1}^n = D_k \cup T_k\]其中 \(D_k\) 表示训练数据且 \(T_k\) 表示测试数据且 \(\cup_{k = 1}^K T_k = \{(X_i, W_i, V_i, Y_i)\}_{i = 1}^n\).
对于每个 \(k\), 训练两个模型 \(f(X, W, V)\) 和 \(g(W, V)\) 在 \(D_k\) 上来分别预测 \(y\) 和 \(x\)。接着估计它们在 \(T_k\) 中的性能, 结果保存为 \(\{(\hat{X}, \hat{Y})\}_k\) 。所有的 \(\{(\hat{X}, \hat{Y})\}_k\) 将被合并来给出新的数据集 \(\{(\hat{X}_i, \hat{Y}_i(X, W, V))\}_{i = 1}^n\) 。
对于任何给定的一对治疗组其中 \(X=x\) 和控制组其中 \(X = x_0\) ,我们构建最终数据集 \(\{(V, \tilde{Y}_x - \tilde{Y}_0)\}\) 其中 \(\tilde{Y}_x\) 被定义为
\[\begin{split}\tilde{Y}_x & = \hat{Y}(X=x, W, V) + \frac{(Y - \hat{Y}(X=x, W, V)) * \mathbb{I}(X=x)}{P[X=x| W, V]} \\ \tilde{Y}_0 & = \hat{Y}(X=x_0, W, V) + \frac{(Y - \hat{Y}(X=x_0, W, V)) * \mathbb{I}(X=x_0)}{P[X=x_0| W, V]}\end{split}\]并在这个数据集上训练最终的机器学习模型 \(h(W, V)\) 来预测因果效应 \(\tau(V)\)
\[\tau(V) = \tilde{Y}_x - \tilde{Y}_0 = h(V).\]接着我们可以直接估计因果效应,通过传入协变量 \(V\) 到模型 \(h(V)\) 。
类结构
- class ylearn.estimator_model.doubly_robust.DoublyRobust(x_model, y_model, yx_model, cf_fold=1, random_state=2022, categories='auto')
- 参数:
x_model (estimator, optional) – 经过训练的机器学习模型,用于对治疗建模。任何合理的x_model应该实现
fit()
和predict_proba()
方法。y_model (estimator, optional) – 经过训练的机器学习模型,用于使用协变量(可能是调整)和治疗对结果建模。任何合理的y_model应该实现
fit()
和predict()
方法。yx_model (estimator, optional) – 经过在双鲁棒方法的最后阶段训练的机器学习模型,用于使用协变量(可能是调整)对因果效应建模。任何合理的yx_model应该实现
fit()
和predict()
方法。cf_fold (int, default=1) – 在第一阶段执行交叉拟合的折的数量。
random_state (int, default=2022) –
categories (str, optional, default='auto') –
- fit(data, outcome, treatment, adjustment=None, covariate=None, treat=None, control=None, combined_treatment=True, **kwargs)
拟合DoublyRobust估计器模型。注意训练一个双鲁棒模型有三个阶段,其中我们在
_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) – 协变量的名字。
treat (int, optional) – 预期治疗组的标签。如果为None,那么
treat
将会被设置为1。 在单个离散治疗的情况下,treat应该是所有可能的治疗值之一的int或者str, 其表示预期的治疗值,在有多个离散治疗的情况下,treat应该是一个列表或者ndarray,其中treat[i]表示第i个预期的治疗值。例如, 当有多个离散治疗,array([‘run’, ‘read’])意味着第一个治疗的治疗值是 ‘run’ ,第二个治疗是 ‘read’ 。control (int, optional) – 预期控制组的标签。这和treat的情况相似。如果是None,那么
control
将会被设置为0。
- 返回:
拟合的DoublyRobust的实例。
- 返回类型:
DoublyRobust的实例
- estimate(data=None, quantity=None, treat=None, all_tr_effects=False)
用量的类型估计因果效应。
- 参数:
data (pandas.DataFrame, optional, default=None) – 测试数据。注意被设置为None,模型会使用训练数据。
quantity (str, optional, default=None) –
返回的估计结果的选项。量的可能值包括:
’CATE’ : 估计器将会估计CATE;
’ATE’ : 估计器将会估计ATE;
None : 估计器将会估计ITE或CITE。
treat (float or numpy.ndarray, optional, default=None) – 在单个离散治疗的情况下,treat应该是所有可能的治疗值之一的int或者str, 其表示预期的治疗值,在有多个离散治疗的情况下,treat应该是一个列表或者ndarray,其中treat[i]表示第i个预期的治疗值。例如, 当有多个离散治疗,array([‘run’, ‘read’])意味着第一个治疗的治疗值是 ‘run’ ,第二个治疗是 ‘read’ 。
all_tr_effects (bool, default=False,) – 如果为True,返回所有的因果效应和所有的
treatments
的值,否则,仅返回 在如果提供了的treat
中的治疗的因果效应。如果treat
没提供,那么治疗的值作为拟合估计器模型的值。
- 返回:
估计的因果效应
- 返回类型:
ndarray
- effect_nji(data=None)
用不同的治疗值计算因果效应。注意这个方法仅将把任何有离散治疗的问题转变为二元治疗。能够使用
_effect_nji_all()
去获得treatment
取treat
所有值时的因果效应。- 返回:
不同治疗值的因果效应。
- 返回类型:
ndarray
- comp_transormer(x, categories='auto')
把离散的治疗正确转变为独热向量。
- 参数:
x (numpy.ndarray, shape (n, x_d)) – 包含治疗变量信息的数组。
categories (str or list, optional, default='auto') –
- 返回:
转变的独热向量。
- 返回类型:
numpy.ndarray