当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.fisher_exact用法及代码示例


本文简要介绍 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 + 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 >= 60.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]

“费舍尔精确测试”,https://en.wikipedia.org/wiki/Fisher’s_exact_test

[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

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.fisher_exact。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。