Python中与R的“phyper”函数等效的函数是什么?

6
在R中,我使用phyper函数进行生物信息学分析的超几何检验。然而,我使用了大量Python代码,并且在这里使用rpy2非常缓慢。因此,我开始寻找替代方案。似乎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,这意义不大。请注意,我已在其他数据上进行了测试,并且几乎没有问题(精度相同,最多为第4位小数,这对我来说足够了)。
因此,它归结为以下可能性:
1. 我正在使用错误的功能(或错误的参数) 2. Scipy中存在错误
如果是“1”,是否有其他可用于Python的phyper替代品?
编辑:正如评论所指出的,这是Scipy中的错误,在git主分支中已经修复。
1个回答

9
文档中,您可以尝试以下内容:

hypergeom.sf(x,M,n,N,loc=0): 生存函数(1-cdf - 有时更准确)

此外,我认为您的值可能混淆了。

从箱中绘制对象。 M是对象的总数,n是类型I对象的总数。 RV计算不重复地从人口中抽取N个对象中的类型I对象的数量。

因此,根据我的理解:x=qM=n+mn=mN=k
所以我会尝试:
stats.hypergeom.sf(45,(92+7518),92,1329)

仍然给出负的p值,但由于我进行的其他测试是可比较的,我想知道是否存在我不知道的任何副作用。 - Einar
我认为这是scipy中的一个bug:http://biostar.stackexchange.com/questions/9746/which-way-to-calculate-cumulative-hypergeometric-distribution-is-more-accurate - James
1
@Einar 看起来这个问题最近已经被解决了:http://projects.scipy.org/scipy/ticket/1218 请尝试更新您的scipy安装。 - James
注意到这个提交,我正在从git主分支构建以查看问题是否已解决。编辑:确实,在主分支中已经解决了。 - Einar
我也将此设置为正确的问题,因为实际上我在调用sf时也犯了一个错误,所以现在我已经完全解决了这个问题。谢谢。 - Einar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接