基于模拟的敏感性分析#
这种驳斥方法不返回 p 值。相反,它提供了一个敏感性测试,以评估如果在 identify_effect 中使用的识别假设无效时,估计值会如何快速变化。具体来说,它检查了对违反后门假设的敏感性:即所有共同原因都被观察到。
为了做到这一点,它创建了一个新的数据集,其中在处理变量和结果变量之间增加了一个共同原因。为了捕获共同原因的影响,该方法将共同原因对处理变量和结果变量的影响强度作为输入。基于这些共同原因影响的输入,它改变处理变量和结果变量的值,然后重新运行估计器。希望是新的估计值不会因未观测到的共同原因的微小影响而发生剧烈变化,这表明对任何未观测到的混淆因素具有鲁棒性。
解释此过程的另一种等效方法是假设输入数据中已经存在未观测到的混淆因素。对处理变量和结果变量值的改变消除了原始数据中存在的任何未观测到的共同原因的影响。然后,在修改后的数据上重新运行估计器,从而提供正确的识别估计值,我们希望新估计值与原始估计值之间的差异不会太大,前提是未观测到的共同原因的影响有一个边界值。
领域知识的重要性:此测试需要领域知识来设置未观测到的混淆因素影响的合理输入值。我们首先展示混淆因素对处理变量和结果变量影响的单个值的结果。
>>> res_unobserved=model.refute_estimate(identified_estimand, estimate, method_name="add_unobserved_common_cause",
>>> confounders_effect_on_treatment="binary_flip", confounders_effect_on_outcome="linear",
>>> effect_strength_on_treatment=0.01, effect_strength_on_outcome=0.02)
>>> print(res_unobserved)
随着未观测到的混淆因素的影响增加,检查其趋势通常更有用。为此,我们可以提供一个假设的混淆因素影响的数组。输出是在不同未观测到的混淆因素下估计效应值的 (最小值, 最大值) 范围。
>>> res_unobserved_range=model.refute_estimate(identified_estimand, estimate, method_name="add_unobserved_common_cause",
>>> confounders_effect_on_treatment="binary_flip", confounders_effect_on_outcome="linear",
>>> effect_strength_on_treatment=np.array([0.001, 0.005, 0.01, 0.02]), effect_strength_on_outcome=0.01)
>>> print(res_unobserved_range)
上图显示了随着假设的混淆因素对处理变量的影响增加,估计值如何降低。通过领域知识,我们可能知道混淆因素对处理变量的最大合理影响。由于我们看到该效应没有低于零,我们可以安全地得出结论,处理变量 v0 的因果效应是正的。
我们也可以改变混淆因素对处理变量和结果变量的影响。我们得到一个热力图。a
>>> res_unobserved_range=model.refute_estimate(identified_estimand, estimate, method_name="add_unobserved_common_cause",
>>> confounders_effect_on_treatment="binary_flip", confounders_effect_on_outcome="linear",
>>> effect_strength_on_treatment=[0.001, 0.005, 0.01, 0.02],
>>> effect_strength_on_outcome=[0.001, 0.005, 0.01,0.02])
>>> print(res_unobserved_range)
自动推断效应强度参数#
最后,DoWhy 支持自动选择效应强度参数。这基于一个假设,即未观测到的混淆因素对处理变量或结果变量的影响不会强于任何已观测到的混淆因素。也就是说,我们至少收集了最相关的混淆因素的数据。如果是这样,我们可以通过已观测到的混淆因素的效应强度来限制 effect_strength_on_treatment 和 effect_strength_on_outcome 的范围。还有一个额外的可选参数,表示未观测到的混淆因素的效应强度应该与最高已观测到的混淆因素一样高,还是其一部分。您可以使用可选的 effect_fraction_on_treatment 和 effect_fraction_on_outcome 参数来设置它。默认情况下,这两个参数为 1。
>>> res_unobserved_auto = model.refute_estimate(identified_estimand, estimate, method_name="add_unobserved_common_cause",
>>> confounders_effect_on_treatment="binary_flip", confounders_effect_on_outcome="linear")
>>> print(res_unobserved_auto)