false_discovery_control#
- scipy.stats.false_discovery_control(ps, *, axis=0, method='bh')[源代码]#
调整 p 值以控制错误发现率。
错误发现率 (FDR) 是被拒绝的零假设中实际为真的预期比例。如果当调整后的 p 值低于指定水平时拒绝零假设,则错误发现率将控制在该水平。
- 参数:
- 返回:
- ps_adusted类数组
调整后的 p 值。如果这些值低于指定水平时拒绝零假设,则错误发现率将控制在该水平。
注释
在多重假设检验中,错误发现控制程序往往比 familywise 错误率控制程序(例如 Bonferroni 校正 [1])提供更高的功效。
如果 p 值与独立测试(或具有“正回归依赖性”的测试 [2])相对应,则拒绝与低于 \(q\) 的 Benjamini-Hochberg 调整后的 p 值对应的零假设,将错误发现率控制在小于或等于 \(q m_0 / m\) 的水平,其中 \(m_0\) 是真实零假设的数量,\(m\) 是测试的零假设的总数。当根据更保守的 Benjaminini-Yekutieli 程序调整 p 值时,即使对于依赖测试,情况也是如此。
此函数生成的调整后的 p 值与 R 函数
p.adjust
和 statsmodels 函数 statsmodels.stats.multitest.multipletests 生成的 p 值相当。请考虑后者以获得更高级的多重比较校正方法。参考文献
[1] (1,2,3,4,5)Benjamini, Yoav, and Yosef Hochberg. “控制错误发现率:一种实用且强大的多重检验方法。” Journal of the Royal statistical society: series B (Methodological) 57.1 (1995): 289-300。
[2] (1,2)Benjamini, Yoav, and Daniel Yekutieli. “在依赖条件下控制多重检验中的错误发现率。” Annals of statistics (2001): 1165-1188。
[3]TileStats. FDR - Benjamini-Hochberg 解释 - Youtube. https://www.youtube.com/watch?v=rZKa4tW2NKs。
[4]Neuhaus, Karl-Ludwig, et al. “使用前加载阿替普酶改善急性心肌梗死中的溶栓:rt-PA-APSAC 畅通研究 (TAPS) 的结果。” Journal of the American College of Cardiology 19.5 (1992): 885-891。
示例
我们遵循 [1] 中的示例。
已证明在心肌梗死中使用重组组织型纤溶酶原激活剂 (rt-PA) 和茴香酰化纤溶酶原链激酶激活剂 (APSAC) 进行溶栓可降低死亡率。[4] 研究了在 421 名急性心肌梗死患者的随机多中心试验中,新的前加载 rt-PA 给药方案与使用标准 APSAC 方案获得的效果相比的效果。
该研究中测试了四组假设,最后一组是“溶栓治疗开始后的心脏和其他事件”。在这一组假设中可能需要进行 FDR 控制,因为如果前加载治疗仅仅与之前的治疗相当,就得出前加载治疗更好是不恰当的。
此组中 15 个假设对应的 p 值是
>>> ps = [0.0001, 0.0004, 0.0019, 0.0095, 0.0201, 0.0278, 0.0298, 0.0344, ... 0.0459, 0.3240, 0.4262, 0.5719, 0.6528, 0.7590, 1.000]
如果选择的显著性水平为 0.05,我们可能会试图拒绝与前九个 p 值对应的测试的零假设,因为前九个 p 值低于选择的显著性水平。但是,这将忽略“多重性”问题:如果我们未能纠正正在执行多重比较的事实,则我们更有可能错误地拒绝真实的零假设。
解决多重性问题的一种方法是控制家庭式错误率 (FWER),即零假设实际上为真时被拒绝的速率。此类的常见程序是 Bonferroni 校正 [1]。我们首先将 p 值乘以测试的假设数。
>>> import numpy as np >>> np.array(ps) * len(ps) array([1.5000e-03, 6.0000e-03, 2.8500e-02, 1.4250e-01, 3.0150e-01, 4.1700e-01, 4.4700e-01, 5.1600e-01, 6.8850e-01, 4.8600e+00, 6.3930e+00, 8.5785e+00, 9.7920e+00, 1.1385e+01, 1.5000e+01])
为了将 FWER 控制在 5%,我们只拒绝与调整后的 p 值小于 0.05 的假设对应的假设。在这种情况下,只能拒绝与前三个 p 值对应的假设。根据 [1],这三个假设涉及“过敏反应”和“两种不同的出血方面”。
另一种方法是控制错误发现率:被拒绝的零假设中实际为真的预期比例。这种方法的优点是它通常提供更大的功效:在零假设实际上为假时,提高拒绝零假设的速率。为了将错误发现率控制在 5%,我们应用 Benjamini-Hochberg p 值调整。
>>> from scipy import stats >>> stats.false_discovery_control(ps) array([0.0015 , 0.003 , 0.0095 , 0.035625 , 0.0603 , 0.06385714, 0.06385714, 0.0645 , 0.0765 , 0.486 , 0.58118182, 0.714875 , 0.75323077, 0.81321429, 1. ])
现在,前四个调整后的 p 值都低于 0.05,因此我们将拒绝与这四个 p 值对应的零假设。拒绝第四个零假设对原始研究尤为重要,因为它得出了新疗法具有“显著降低的住院死亡率”的结论。