false_discovery_control#
- scipy.stats.false_discovery_control(ps, *, axis=0, method='bh')[源代码][源代码]#
调整p值以控制错误发现率。
错误发现率(FDR)是实际为真的零假设被拒绝的期望比例。如果当 调整后 的 p 值低于指定水平时拒绝零假设,则错误发现率被控制在那个水平。
- 参数:
- 返回:
- ps_adustedarray_like
调整后的 p 值。如果这些值低于指定水平时拒绝原假设,则在该水平上控制了错误发现率。
注释
在多重假设检验中,错误发现控制程序往往比家庭错误率控制程序(例如Bonferroni校正 [1])提供更高的功效。
如果p值对应于独立测试(或具有“正回归依赖性”的测试 [2]),拒绝与Benjamini-Hochberg调整后的p值低于 \(q\) 对应的零假设,可以将错误发现率控制在不超过 \(q m_0 / m\) 的水平,其中 \(m_0\) 是真实零假设的数量,\(m\) 是测试的零假设总数。即使对于依赖性测试,当p值根据更保守的Benjaminini-Yekutieli程序进行调整时,情况也是如此。
此函数生成的调整后的 p 值与 R 函数
p.adjust
和 statsmodels 函数 statsmodels.stats.multitest.multipletests 生成的 p 值相当。对于更高级的多重比较校正方法,请考虑后者。参考文献
[1] (1,2,3,4)Benjamini, Yoav, 和 Yosef Hochberg. “控制错误发现率:一种实用且强大的多重检验方法.” 皇家统计学会杂志: B辑 (方法论) 57.1 (1995): 289-300.
[3]TileStats. FDR - Benjamini-Hochberg 解释 - Youtube. https://www.youtube.com/watch?v=rZKa4tW2NKs.
[4]Neuhaus, Karl-Ludwig 等人。“通过前负荷给药方式改善急性心肌梗死中的溶栓治疗:rt-PA-APSAC 通畅性研究(TAPS)的结果。”《美国心脏病学院杂志》19.5 (1992): 885-891.
示例
我们遵循来自 [1] 的示例。
在心肌梗死中使用重组组织型纤溶酶原激活剂(rt-PA)和茴香酰化纤溶酶原链激酶激活剂(APSAC)进行溶栓已被证明能降低死亡率。[4] 研究了在急性心肌梗死患者中,一种新的前负荷rt-PA给药方案与标准APSAC方案相比的效果,该研究在421名患者中进行了随机多中心试验。
研究中测试了四组假设,最后一组是“开始溶栓治疗后的心脏和其他事件”。可能需要在这组假设中进行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值对应的假设可以被拒绝。根据[R4c2dbc17006a-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 值对应的零假设。拒绝第四个零假设对原始研究尤为重要,因为它导致了结论:新治疗具有“显著较低的住院死亡率”。