未观察到的混杂因素的敏感性分析

张开发
2026/4/8 8:50:32 15 分钟阅读

分享文章

未观察到的混杂因素的敏感性分析
原文towardsdatascience.com/sensitivity-analysis-for-unobserved-confounding-465970a969e0?sourcecollection_archive---------10-----------------------#2024-02-13如何在观察性研究中了解那些无法知晓的事物https://medium.com/uguryi?sourcepost_page---byline--465970a969e0--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--465970a969e0-------------------------------- Ugur Yildirim·发表于 Towards Data Science ·阅读时间 10 分钟·2024 年 2 月 13 日–大纲引言问题设置2.1. 因果图2.2. 有无Z的模型 2.3. 作为混杂因素的Z的强度敏感性分析3.1. 目标3.2. 稳健性值PySensemakr结论致谢参考文献1. 引言未观察到的混杂因素即遗漏变量偏倚是观察性研究中的一个著名问题。在大多数观察性研究中除非我们能合理假设治疗分配在某些方面是随机的如同自然实验一样否则我们永远无法真正确定我们在模型中控制了所有可能的混杂因素。因此如果我们未能控制住一个重要的混杂因素我们的模型估计值可能会严重偏倚——而我们甚至不知道因为未观察到的混杂因素嗯确实是未观察到的鉴于这个问题评估我们的估计值对潜在未观察到的混杂因素的敏感性非常重要。换句话说问问自己一个问题是有帮助的如果未观察到的混杂因素足够大我们的估计值会发生剧烈变化例如治疗效应不再具有统计显著性吗未观察到的混杂因素的敏感性分析是一个活跃的研究领域解决这个问题有几种方法。在本文中我将介绍一种基于部分R²概念的简单线性方法[1]这种方法广泛适用于大多数情况。2. 问题设置2.1. 因果图假设我们有四个变量Y: 结果D: 治疗X: 观察到的混杂因素Z: 未观察到的混杂变量这是许多观察性研究中的常见情境研究人员希望在控制可能的治疗—结果混杂变量后了解所关注的治疗是否对结果产生影响。在我们的假设情境中这些变量之间的关系是X和Z都影响D和Y但D对Y没有影响。换句话说我们描述的是一个真实治疗效应为零的情景。正如下一部分将明确指出的敏感性分析的目的是能够推理出这个治疗效应尽管我们通常无法访问Z因为它是未观察到的。图 1 展示了我们的设定。图 1问题设定https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bfd5d56edce6e7152043c61de6fe28f6.png2.2. 带Z和不带Z的模型为了展示未观察到的Z可能造成的问题我根据上述问题设定模拟了一些数据。你可以参考这个笔记本查看模拟的详细信息。由于Z在现实生活中无法观察到我们通常能拟合到数据的唯一模型是Y~DX。让我们看看如果我们运行这个回归结果会是什么。根据这些结果似乎D对Y的每单位变化有统计显著效应 0.2686p0.001但我们知道这不符合事实因为我们生成数据的方式是没有D效应的。现在让我们看看当我们同时控制Z时D估计值会发生什么变化。在现实生活中当然我们无法进行这个额外的回归因为Z是未观察到的但我们的模拟设置允许我们窥探真正的数据生成过程。正如预期的那样控制Z后D效应被正确移除估计值收缩至零并且我们得到的p值在0.05 的显著性水平下不再显著p0.059。2.3.Z作为混杂变量的强度到目前为止我们已经确认Z足够强大能够消除虚假的D效应因为在我们控制Z之后统计上显著的D效应消失了。我们尚未讨论的是Z作为混杂变量的具体强度。为此我们将利用一个有用的统计学概念叫做部分R²它量化了一个给定的兴趣变量能够解释的变异量的比例这些变异量是模型中现有变量无法解释的。换句话说部分R²告诉我们该变量的额外解释力超出了模型中已包含的其他变量。形式上它可以定义如下https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/841f01ffb074c5bbcd67165995585666.png其中RSS_reduced是不包含感兴趣变量的模型的残差平方和而RSS_full是包含感兴趣变量的模型的残差平方和。在我们的案例中感兴趣的变量是Z我们想知道Z能解释Y和D中的变异性有多少是现有变量无法解释的。更准确地说我们关注的是以下两个部分R²值https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ac6d3bca9e64679028bcb56422a4b6fc.png其中 (1) 量化了Y中无法通过D和X已经解释的部分能够被Z解释的方差比例因此简化模型为 Y~DX完整模型为 Y~DXZ(2) 量化了D中无法通过X已经解释的部分能够被Z解释的方差比例因此简化模型为 D~X完整模型为 D~XZ。现在让我们看看Z在我们的数据中与D和Y的关联程度具体是通过部分R²来衡量。结果表明Z解释了Y中 16% 的变异性这是D和X无法解释的部分这就是上面提到的部分R²方程 #1并且解释了D中 20% 的变异性这是X无法解释的部分这就是上面提到的部分R²方程 #2。3. 敏感性分析3.1. 目标正如我们在前一节中讨论的未观察到的混杂因素在真实研究环境中构成问题正是因为和我们的模拟设置不同Z无法被观察到。换句话说我们只能使用模型Y~DX而无法知道如果能运行模型Y~DXZ我们的结果会是什么样子。那么我们能做什么呢直观地说一个合理的敏感性分析方法应该能够告诉我们如果数据中存在类似于Z的变量它将使我们的结果失效。记住Z解释了Y中 16% 的变异性以及D中 20% 的变异性这些是现有变量无法解释的部分。因此我们期望敏感性分析能够告诉我们一个假设的、类似Z强度的混杂因素将足以消除统计上显著的D效应。但是如何计算未观察到的混杂因素的强度应该落在这个 16% 到 20% 范围内而且我们根本无法接触到它呢这时就需要引入稳健性值。3.2. 稳健性值稳健性值RV正式化了我们上面提到的概念即确定一个假设的未观察到的混杂因素的必要强度足以使我们的结果失效。稳健性值的实用性在于我们只需要我们的可观察模型Y~DX而不需要不可观察的模型Y~DXZ就能够计算出它。正式地我们可以将其写为如下形式来量化需要多强的未观察到的混杂因素才能改变我们观察到的处理效应的统计显著性如果符号太复杂跟不上可以记住这个关键点RV 是衡量混杂因素强度的度量足以改变我们的结果https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a792c163556de1c4ad40364b6a2578b2.png图片由作者提供方程式基于[1]参见第 49–52 页其中是我们选择的显著性水平通常设置为 0.05 或 5%q决定了我们关心的显著性减少的百分比q**100%通常设置为 1因为我们通常关心能够将统计显著性减少 1100%100%的混杂因素从而使其不再具有统计显著性t_betahat_treat是我们从模型Y~DX中观察到的* t*-值在这种情况下为 8.389可以从上面的回归结果中看到df是我们的自由度在这种情况下为 1000–3997因为我们模拟了 1000 个样本并且正在估计包括截距在内的 3 个参数并且t_alpha,df-1是与给定和df-1*如果设置为 0.05则为 1.96相关的t-值临界值。我们现在可以使用仅观察到的模型Y~DXres_ydx在我们自己的数据中计算 RV 了。我们的 RV18%恰好落在我们为YZ|D,X*16%和*DZ|X20%计算的部分R²值范围内这并非偶然。这里 RV 告诉我们的是即使没有 Z 的明确知识我们仍然可以推理出任何未观察到的混杂因素平均需要至少 18%的强度才能在部分R²尺度上对处理和结果都产生影响从而使得我们原本显著的结果不再显著。RV 之所以不是 16%或 20%而是落在中间18%是因为它被设计为一个单一的数字总结了与结果和处理相关的混杂因素的必要强度因此 18%是合情合理的考虑到我们对数据的了解。你可以这样理解由于该方法在计算 RV 时没有实际访问 16%和 20%的数字它尽力通过将 18%分配给两个部分的R²值Y~Z|D,X和D~Z|X来量化混杂因素的强度这一点与实际情况相差不大实际上也很好地总结了混杂因素的强度。当然在现实生活中我们不会有Z变量来再次检查我们的 RV 是否正确但看到这两个结果的对齐至少可以让你对这个方法有一些信心。最后一旦我们计算出 RV我们应该考虑一个如此强度的未观察到的混杂因素是否合理。在我们的例子中答案是“是的”因为我们可以访问数据生成过程但对于你的特定实际应用假设存在如此强的混杂因素可能是不合理的。对你来说这是好消息因为没有现实中未观察到的混杂因素可以极大地改变你的结果。4. PySensemakr上述敏感性分析技术已经以 PySensemakr 这个 Python 包的形式实现了且具备了所有的功能也有 R、Stata 和 Shiny App 版本。例如要获得与我们在前一部分手动计算的完全相同的结果我们只需运行以下代码块。请注意“Robustness Value, q 1 alpha 0.05” 的值为 0.184这正是我们之前计算的结果。除了用于统计显著性的 RV软件包还提供了用于将系数估计值收缩至 0 所需的 RV。毫不奇怪为了实现这一点未观察到的混杂因素需要更大0.233 与 0.184。该软件包还提供了两个部分R²值的轮廓图这可以直观地显示治疗和结果可能的混杂程度对敏感性的影响在这种情况下看到满足红色虚线的 x/y 轴值对包括 0.18/0.18 和 0.20/0.16 是不足为奇的。你甚至可以将基准值添加到轮廓图中作为混杂因素可能程度的代理。在我们的例子中由于我们只有一个观察到的协变量X我们可以将基准值设置为与该观察到的协变量强度相当的 0.25x、0.5x 和 1x。由此得到的图表告诉我们一个强度仅为X一半的混杂因素应该足以使我们统计显著的结果无效因为“0.5x X”值恰好位于红色虚线处。最后我想指出尽管本示例中的模拟数据使用了一个连续的处理变量但在实践中该方法适用于任何类型的处理变量包括二元处理。另一方面结果变量在技术上需要是连续型的因为我们处在 OLS 框架中。然而即使结果是二元的只要我们通过 OLS 建模这称为 LPM [2]该方法仍然可以使用。5. 结论我们的效应估计可能由于未观察到的混杂因素而产生偏差这是观察性研究中的常见风险。尽管存在这一潜在风险观察性研究仍然是数据科学中一项至关重要的工具因为在许多情况下随机化实验是不可行的。因此了解如何通过进行敏感性分析来解决未观察到的混杂因素问题以查看我们的估计在潜在混杂因素下的鲁棒性是非常重要的。本文讨论的 Cinelli 和 Hazlett 提出的鲁棒值方法是一种简单直观的敏感性分析方法基于熟悉的线性模型框架。如果你有兴趣深入了解该方法我强烈推荐阅读原始论文以及包文档在其中你可以了解该方法的许多有趣应用如“极端情景”分析。还有许多其他针对未观察到的混杂因素的敏感性分析方法我在此简要提及其中一些供有兴趣深入学习该主题的读者参考。一个多功能的技术是 VanderWeele 和 Ding 开发的 E 值它将问题表述为风险比 [3]在 R 中实现的版本 这里。另一种技术是 Veitch 和 Zaveri 基于部分R²和倾向评分概念开发的 Austen 图 [4]在 Python 中实现的版本 这里还有一种最近的办法是 Chernozhukov 等人提出的 [5]在 Python 中实现的版本 这里。6. 致谢我想感谢 Chad Hazlett 解答我关于如何在二项结果中使用该方法的问题并感谢 Xinyi Zhang 对本文提供了大量有价值的反馈。除非另有注明文中的所有图片均由作者提供。7. 参考文献[1] C. Cinelli 和 C. Hazlett 理解敏感性扩展遗漏变量偏差2019《皇家统计学会学报》[2] J. Murray线性概率模型Murray 的个人网站[3] T. VanderWeele 和 P. Ding观察性研究中的敏感性分析引入 E 值2017《内科学年鉴》[4] V. Veitch 和 A. Zaveri 敏感性与灵敏度分析对未观察到的混杂因素引起的偏差的简单事后分析 2020NeurIPS[5] V. Chernozhukov, C. Cinelli, W. Newey, A. Sharma, 和 V. Syrgkanis 简而言之因果机器学习中的遗漏变量偏差 2022NBER

更多文章