scipy.stats.fisher_exact

scipy.stats.fisher_exact(table, alternative='two-sided')[源代码]

在2x2列联表上执行Fisher精确测试。

参数
table整数的类似数组(ARRAY_LIKE)

2x2列联表。元素必须是非负整数。

alternative{‘双面’,‘少’,‘大’},可选

定义了另一种假设。有以下选项可用(默认为‘双面’):

  • “双面”

  • ‘less’:片面

  • “更大”:片面

有关更多详细信息,请参阅注释。

退货
oddsratio浮动

这是先验的赔率比,而不是后验的估计。

p_value浮动

p值,在假设零假设为真的情况下,获得至少与实际观察到的分布一样极端的分布的概率。

参见

chi2_contingency

列联表中变量独立性的卡方检验。这可以用作替代 fisher_exact 当表中的数字很大时。

barnard_exact

Barnard的精确检验,这是一个比Fisher的2x2列联表的精确检验更有效的替代方法。

boschloo_exact

Boschloo的精确检验,这是一个比Fisher的2x2列联表的精确检验更有效的替代方法。

注意事项

Null hypothesis and p-values

零假设是输入表来自带参数的超几何分布(如中所用 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

可以使用以下公式计算这些值::

>>> 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
>>> oddsr, p = fisher_exact(table, alternative='two-sided')
>>> p
0.10256410256410257

的单侧p值 alternative='greater' 是随机表具有的概率 x >= a ,在我们的示例中是 x >= 6 ,或 0.0816 + 0.00466 ~= 0.08626 ::

>>> oddsr, p = fisher_exact(table, alternative='greater')
>>> p
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 ::

>>> oddsr, p = fisher_exact(table, alternative='less')
>>> p
0.9953379953379957

这相当于在以下位置计算分布的累积分布函数 x = 6

>>> hypergeom.cdf(6, M, n, N)
0.9953379953379957

赔率比

计算的赔率比与R使用的赔率比不同。这种SciPy实现返回(更常见的)“无条件最大似然估计”,而R使用“条件最大似然估计”。

示例

假设我们花几天时间数大西洋和印度洋的鲸鱼和鲨鱼。在大西洋我们发现8条鲸鱼和1条鲨鱼,在印度洋发现2条鲸鱼和5条鲨鱼。那么我们的列联表是:

        Atlantic  Indian
whales     8        2
sharks     1        5

我们使用此表来查找p值:

>>> from scipy.stats import fisher_exact
>>> oddsratio, pvalue = fisher_exact([[8, 2], [1, 5]])
>>> pvalue
0.0349...

我们偶然观察到这个或更不平衡的比率的概率约为3.5%。一个常用的显著性水平是5%--如果我们采用这个水平,我们可以得出结论,我们观察到的不平衡在统计上是显著的;鲸鱼更喜欢大西洋,而鲨鱼更喜欢印度洋。