如何使用SciPy的Fisher精确检验获取预期数组?

1 投票
1 回答
3054 浏览
提问于 2025-04-19 03:08

SciPy这个工具可以让你进行卡方检验和费舍尔精确检验。

卡方检验的结果会给出一个预期的数组,而费舍尔精确检验则不会。

比如:

from scipy import stats
import numpy as np
obs = np.array(
    [[1100,6848],
    [11860,75292]])
stats.chi2_contingency(obs)

返回结果是:

(0.31240019935827701,
 0.57621104841277448,
 1L,
 array([[  1083.13438486,   6864.86561514],
        [ 11876.86561514,  75275.13438486]]))

而:

from scipy import stats
oddsratio, pvalue = stats.fisher_exact([[1100,6848],
[11860,75292]])
print pvalue, oddsratio

返回结果是:

0.561533439157 1.01974850672

文档里没有提到这个问题,我在网上也找不到相关的信息。请问有没有可能实现这个功能呢?谢谢!

1 个回答

2

费舍尔精确检验(http://en.wikipedia.org/wiki/Fisher%27s_exact_test)不需要计算一个期望的数组。这就是为什么fisher_exact()这个函数不会返回这个数组。

如果你需要期望的数组,它和chi2_contingency返回的结果是一样的。如果你想在不调用chi2_contingency的情况下计算它,可以使用scipy.stats.contingency.expected_freq。比如:

In [40]: obs
Out[40]: 
array([[ 1100,  6848],
       [11860, 75292]])

In [41]: from scipy.stats.contingency import expected_freq

In [42]: expected_freq(obs)
Out[42]: 
array([[  1083.13438486,   6864.86561514],
       [ 11876.86561514,  75275.13438486]])

撰写回答