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 + 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
可以使用以下公式计算这些值::
>>> 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%--如果我们采用这个水平,我们可以得出结论,我们观察到的不平衡在统计上是显著的;鲸鱼更喜欢大西洋,而鲨鱼更喜欢印度洋。