scipy.stats.

false_discovery_control#

scipy.stats.false_discovery_control(ps, *, axis=0, method='bh')[原始碼]#

調整 p 值以控制偽發現率。

偽發現率 (FDR) 是被拒絕的虛無假設中,實際上為真的預期比例。如果在調整後 p 值降至指定水準以下時拒絕虛無假設,則偽發現率將被控制在該水準。

參數:
ps一維類陣列 (1D array_like)

要調整的 p 值。元素必須是介於 0 和 1 之間的實數。

axisint

執行調整的軸。調整會沿著每個軸切片獨立執行。如果 axis 為 None,則在執行調整之前,ps 會被展平 (raveled)。

method{‘bh’, ‘by’}

要應用的偽發現率控制程序:'bh' 用於 Benjamini-Hochberg [1] (公式 1),'by' 用於 Benjaminini-Yekutieli [2] (定理 1.3)。後者更保守,但即使 p 值不是來自獨立檢定,也保證能控制 FDR。

回傳:
ps_adjusted類陣列 (array_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 產生的值相當。對於更進階的多重比較校正方法,請考慮後者。

參考文獻

[1] (1,2,3,4,5)

Benjamini, Yoav, 和 Yosef Hochberg。「控制偽發現率:一種實用且強大的多重檢定方法。」 皇家統計學會雜誌:B 系列 (方法論) 57.1 (1995): 289-300。

[2] (1,2)

Benjamini, Yoav, 和 Daniel Yekutieli。「在依賴性下控制多重檢定中的偽發現率。」 統計年鑑 (2001): 1165-1188。

[3]

TileStats。FDR - Benjamini-Hochberg 解釋 - Youtube。https://www.youtube.com/watch?v=rZKa4tW2NKs

[4]

Neuhaus, Karl-Ludwig 等人。「以前負荷投與 alteplase 改善急性心肌梗塞的血栓溶解:rt-PA-APSAC 通暢性研究 (TAPS) 的結果。」 美國心臟病學院雜誌 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 值相對應的虛無假設。拒絕第四個虛無假設對於原始研究尤為重要,因為它導致得出新療法具有「顯著降低的住院死亡率」的結論。