scipy.stats.

fisher_exact#

scipy.stats.fisher_exact(table, alternative=None, *, method=None)[原始碼]#

對列聯表執行費雪精確檢定。

對於 2x2 表格,虛無假設是觀察值底層族群的真實勝算比為 1,且觀察值是在以下條件下從這些族群中抽樣而來:結果表格的邊際總和必須等於觀察到的表格的邊際總和。統計量是勝算比的無條件最大概似估計,而 p 值是在虛無假設下,獲得至少與實際觀察到的表格一樣極端的表格的機率。

對於其他表格大小,或如果提供 method,則虛無假設是表格的行和列具有固定的總和並且是獨立的;也就是說,該表格是從具有觀察到的邊際總和的 scipy.stats.random_table 分佈中抽樣而來的。統計量是此分佈在 table 處評估的機率質量,而 p 值是表格族群中統計量至少與 table 的統計量一樣極端(小)的百分比。只有一種可用的對立假設:行和列不是獨立的。

還有其他可能的統計量選擇和與費雪精確檢定相關的雙尾 p 值定義;請參閱「註解」以取得更多資訊。

參數:
tablearray_like of ints

列聯表。元素必須是非負整數。

alternative{‘two-sided’, ‘less’, ‘greater’}, optional

定義 2x2 表格的對立假設;對於其他表格大小未使用。以下選項可用(預設為 ‘two-sided’)

  • ‘two-sided’:底層族群的勝算比不為一

  • ‘less’:底層族群的勝算比小於一

  • ‘greater’:底層族群的勝算比大於一

請參閱「註解」以取得更多詳細資訊。

methodResamplingMethod, optional

定義用於計算 p 值的方法。如果 methodPermutationMethod/MonteCarloMethod 的實例,則 p 值是使用 scipy.stats.permutation_test/scipy.stats.monte_carlo_test 以及提供的配置選項和其他適當設定來計算的。請注意,如果 methodMonteCarloMethod 的實例,則 rvs 屬性必須保持未指定;Monte Carlo 樣本始終使用 scipy.stats.random_tablervs 方法繪製。否則,p 值的計算方式如註解中所述。

在 1.15.0 版本中新增。

返回:
resSignificanceResult

包含屬性的物件

statisticfloat

對於具有預設 method 的 2x2 表格,這是勝算比 - 先驗勝算比而不是後驗估計。在所有其他情況下,這是在邊際總和固定的獨立虛無假設下獲得觀察到的表格的機率密度。

pvaluefloat

在虛無假設下,獲得至少與實際觀察到的表格一樣極端的表格的機率。

引發:
ValueError

如果 table 不是二維的或具有負數條目。

另請參閱

chi2_contingency

列聯表中變數獨立性的卡方檢定。當表格中的數字很大時,這可以用作 fisher_exact 的替代方案。

contingency.odds_ratio

計算 2x2 列聯表的勝算比(樣本或條件 MLE)。

barnard_exact

Barnard 精確檢定,對於 2x2 列聯表,它是比費雪精確檢定更強大的替代方案。

boschloo_exact

Boschloo 精確檢定,對於 2x2 列聯表,它是比費雪精確檢定更強大的替代方案。

費雪精確檢定

延伸範例

註解

虛無假設和 p 值

虛無假設是觀察值底層族群的真實勝算比為 1,且觀察值是在以下條件下從這些族群中隨機抽樣而來:結果表格的邊際總和必須等於觀察到的表格的邊際總和。等效地,虛無假設是輸入表格來自超幾何分佈,其參數(如 hypergeom 中所使用的)為 M = a + b + c + dn = a + bN = 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 小 1,因為我們希望將 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 計算的值不同。此實作返回「樣本」或「無條件」最大概似估計,而 R 中的 fisher.test 使用條件最大概似估計。若要計算勝算比的條件最大概似估計,請使用 scipy.stats.contingency.odds_ratio

參考文獻

[1]

Fisher, Sir Ronald A, “The Design of Experiments: Mathematics of a Lady Tasting Tea.” ISBN 978-0-486-41151-4, 1935.

[2]

“Fisher’s exact test”, https://en.wikipedia.org/wiki/Fisher’s_exact_test

範例

>>> from scipy.stats import fisher_exact
>>> res = fisher_exact([[8, 2], [1, 5]])
>>> res.statistic
20.0
>>> res.pvalue
0.034965034965034975

對於形狀不是 (2, 2) 的表格,請為 method 參數提供 scipy.stats.MonteCarloMethodscipy.stats.PermutationMethod 的實例

>>> import numpy as np
>>> from scipy.stats import MonteCarloMethod
>>> rng = np.random.default_rng()
>>> method = MonteCarloMethod(rng=rng)
>>> fisher_exact([[8, 2, 3], [1, 5, 4]], method=method)
SignificanceResult(statistic=np.float64(0.005782), pvalue=np.float64(0.0603))

如需更詳細的範例,請參閱 費雪精確檢定