本文簡要介紹 python 語言中 scipy.stats.fisher_exact
的用法。
用法:
scipy.stats.fisher_exact(table, alternative='two-sided')#
在 2x2 列聯表上執行 Fisher 精確檢驗。
原假設是觀測值背後的總體的真實優勢比為 1,並且觀測值是在以下條件下從這些總體中采樣的:結果表的邊際必須等於觀察表的邊際。返回的統計量是優勢比的無條件最大似然估計,p 值是在零假設下獲得至少與實際觀察到的表格一樣極端的表格的概率。與 Fisher 精確檢驗相關的統計量和兩側 p 值定義還有其他可能的選擇;請參閱注釋以獲取更多信息。
- table: 數組 整數
一個 2x2 列聯表。元素必須是非負整數。
- alternative: {‘雙麵’,‘less’, ‘greater’},可選
定義備擇假設。可以使用以下選項(默認為“雙麵”):
“雙麵”:基礎人群的優勢比不是一
‘less’:基礎人群的優勢比小於 1
‘greater’:基礎人群的優勢比大於 1
有關詳細信息,請參閱注釋。
- res: SignificanceResult
包含屬性的對象:
- 統計 浮點數
這是先驗比值比,而不是後驗估計。
- p值 浮點數
在零假設下獲得至少與實際觀察到的表格一樣極端的表格的概率。
參數 ::
返回 ::
注意:
原假設和 p 值
原假設是觀測值背後的總體的真實優勢比為 1,並且觀測值是在以下條件下從這些總體中隨機采樣的:結果表的邊際必須等於觀察表的邊際。同樣,原假設是輸入表來自帶有參數的超幾何分布(如
hypergeom
中使用的)M = a + b + c + d
、n = a + b
和N = a + c
,其中輸入表是[[a, b], [c, d]]
。此發行版支持max(0, N + n - M) <= x <= min(N, n)
,或者,就輸入表中的值而言,支持min(0, a - d) <= x <= a + min(b, c)
。x
可以解釋為 2x2 表的左上角元素,因此分布中的表具有以下形式:[ x n - x ] [N - x M - (n + N) + x]
例如,如果:
table = [6 2] [1 4]
那麽支持是
2 <= x <= 7
,分布中的表是:[2 6] [3 5] [4 4] [5 3] [6 2] [7 1] [5 0] [4 1] [3 2] [2 3] [1 4] [0 5]
每個表的概率由超幾何分布
hypergeom.pmf(x, M, n, N)
給出。對於此示例,這些是(四舍五入到三位有效數字):x 2 3 4 5 6 7 p 0.0163 0.163 0.408 0.326 0.0816 0.00466
這些可以通過以下方式計算:
>>> import numpy as np >>> from scipy.stats import hypergeom >>> table = np.array([[6, 2], [1, 4]]) >>> M = table.sum() >>> n = table[0].sum() >>> N = table[:, 0].sum() >>> start, end = hypergeom.support(M, n, N) >>> hypergeom.pmf(np.arange(start, end+1), M, n, N) array([0.01631702, 0.16317016, 0.40792541, 0.32634033, 0.08158508, 0.004662 ])
兩側 p 值是在原假設下,隨機表的概率等於或小於輸入表的概率的概率。對於我們的示例,輸入表(其中
x = 6
)的概率為 0.0816。概率不超過此值的 x 值為 2、6 和 7,因此兩側 p 值為0.0163 + 0.0816 + 0.00466 ~= 0.10256
:>>> from scipy.stats import fisher_exact >>> res = fisher_exact(table, alternative='two-sided') >>> res.pvalue 0.10256410256410257
alternative='greater'
的單邊 p 值是隨機表具有x >= a
的概率,在我們的示例中為x >= 6
或0.0816 + 0.00466 ~= 0.08626
:>>> res = fisher_exact(table, alternative='greater') >>> res.pvalue 0.08624708624708627
這相當於計算
x = 5
處分布的生存函數(輸入表中的x
少一個,因為我們想在總和中包含x = 6
的概率):>>> hypergeom.sf(5, M, n, N) 0.08624708624708627
對於
alternative='less'
,單邊 p 值是隨機表具有x <= a
(即我們示例中的x <= 6
)或0.0163 + 0.163 + 0.408 + 0.326 + 0.0816 ~= 0.9949
的概率:>>> res = fisher_exact(table, alternative='less') >>> res.pvalue 0.9953379953379957
這相當於計算
x = 6
處分布的累積分布函數:>>> hypergeom.cdf(6, M, n, N) 0.9953379953379957
賠率
計算出的優勢比與 R 函數
fisher.test
計算出的值不同。此實現返回 “sample” 或 “unconditional” 最大似然估計,而 R 中的fisher.test
使用條件最大似然估計。要計算優勢比的條件最大似然估計,請使用scipy.stats.contingency.odds_ratio
。參考:
[1]Fisher,Ronald A 爵士,“實驗設計:一位女士品茶的數學。” ISBN 978-0-486-41151-4,1935 年。
[2][3]艾瑪·V·洛 (Emma V. Low) 等人“確定乙酰唑胺預防急性高山病的最低有效劑量:係統評價和meta-analysis。”英國醫學雜誌,345,DOI:10.1136/bmj.e6779,2012 年。
例子:
文獻[3]研究了乙酰唑胺預防急性高山病的有效劑量。該研究特別得出結論:
Acetazolamide 250 mg, 500 mg, and 750 mg daily were all efficacious for preventing acute mountain sickness. Acetazolamide 250 mg was the lowest effective dose with available evidence for this indication.
下表總結了實驗結果,其中一些參與者每日服用 250 毫克乙酰唑胺,而其他參與者則服用安慰劑。記錄了急性高山病病例:
Acetazolamide Control/Placebo Acute mountain sickness 7 17 No 15 5
是否有證據表明 250 毫克乙酰唑胺可降低急性高山病的風險?我們首先製定原假設 :
The odds of experiencing acute mountain sickness are the same with the acetazolamide treatment as they are with placebo.
讓我們用費舍爾檢驗來評估這個假設的合理性。
>>> from scipy.stats import fisher_exact >>> res = fisher_exact([[7, 17], [15, 5]], alternative='less') >>> res.statistic 0.13725490196078433 >>> res.pvalue 0.0028841933752349743
使用 5% 的顯著性水平,我們會拒絕原假設,轉而支持備擇假設:“接受乙酰唑胺治療時出現急性高山病的幾率低於使用安慰劑時出現急性高山病的幾率。”
注意
由於 Fisher 精確檢驗的零分布是在行和列之和都固定的假設下形成的,因此當應用於行和不固定的實驗時,檢驗結果是保守的。
在這種情況下,列總和是固定的;每組有 22 名受試者。但在進行實驗之前,急性高山病的病例數量並沒有(也不能)確定。這是一個結果。
Boschloo 的測試不依賴於行總和固定的假設,因此,它在這種情況下提供了更強大的測試。
>>> from scipy.stats import boschloo_exact >>> res = boschloo_exact([[7, 17], [15, 5]], alternative='less') >>> res.statistic 0.0028841933752349743 >>> res.pvalue 0.0015141406667567101
我們驗證 p 值小於
fisher_exact
。
相關用法
- Python SciPy stats.fisk用法及代碼示例
- Python SciPy stats.find_repeats用法及代碼示例
- Python SciPy stats.fit用法及代碼示例
- Python SciPy stats.fatiguelife用法及代碼示例
- Python SciPy stats.friedmanchisquare用法及代碼示例
- Python SciPy stats.false_discovery_control用法及代碼示例
- Python SciPy stats.f_oneway用法及代碼示例
- Python SciPy stats.f用法及代碼示例
- Python SciPy stats.fligner用法及代碼示例
- Python SciPy stats.foldnorm用法及代碼示例
- Python SciPy stats.foldcauchy用法及代碼示例
- Python SciPy stats.anderson用法及代碼示例
- Python SciPy stats.iqr用法及代碼示例
- Python SciPy stats.genpareto用法及代碼示例
- Python SciPy stats.skewnorm用法及代碼示例
- Python SciPy stats.cosine用法及代碼示例
- Python SciPy stats.norminvgauss用法及代碼示例
- Python SciPy stats.directional_stats用法及代碼示例
- Python SciPy stats.invwishart用法及代碼示例
- Python SciPy stats.bartlett用法及代碼示例
- Python SciPy stats.levy_stable用法及代碼示例
- Python SciPy stats.page_trend_test用法及代碼示例
- Python SciPy stats.itemfreq用法及代碼示例
- Python SciPy stats.exponpow用法及代碼示例
- Python SciPy stats.gumbel_l用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.fisher_exact。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。