Python中R的“phyper”函数的等价物是什么?
在R语言中,我使用phyper
函数进行超几何检验,这在生物信息学分析中很常见。不过,我平时用的代码大多是Python,而用rpy2来调用R的函数速度比较慢。所以,我开始寻找其他的替代方案。看起来scipy.stats.hypergeom
有类似的功能。
目前,我是这样调用phyper
的:
pvalue <- 1-phyper(45, 92, 7518, 1329)
这里的45是我选中的具有特定属性的项目数量,92是所有具有该属性的项目总数,7518是没有该属性的未选中项目数量,而1329是选中的项目总数。
在R中,这样计算的结果是6.92113e-13
。
但用scipy.stats.hypergeom
做同样的事情时,结果却完全不同(注意,这里的数字顺序调换了,因为这个函数接受参数的方式不同):
import scipy.stats as stats
pvalue = 1-stats.hypergeom.cdf(45, 7518, 92. 1329)
print pvalue
结果是-7.3450134863151106e-12,这让我感到困惑。值得注意的是,我在其他数据上测试过这个函数,结果还算正常(精确到小数点后四位,对我来说已经足够了)。
所以,我总结出以下几种可能性:
- 我可能使用了不适合的函数(或者参数不对)
- scipy可能存在bug
如果是第一种情况,有没有其他可以在Python中替代phyper
的函数呢?
补充:正如评论所提到的,这确实是scipy中的一个bug,已经在git主分支上修复了。
1 个回答
10
根据文档,你可以试试:
hypergeom.sf(x,M,n,N,loc=0)
: 这是生存函数(1减去累积分布函数,有时候更准确)
另外,我觉得你可能把数值搞混了。
模型是从一个箱子里抽取物品。M 是物品的总数,n 是类型I物品的总数。随机变量(RV)计算的是在从总体中抽取的N个物品中,类型I物品的数量。
所以根据我的理解:x=q
,M=n+m
,n=m
,N=k
。
所以我会尝试:
stats.hypergeom.sf(45,(92+7518),92,1329)