在Python中R的"phyper"函数的等价物是什么?

Ein*_*nar 6 python statistics

在R中,我使用该phyper函数进行生物信息学分析的超几何测试.但是我使用了很多Python代码并且在这里使用rpy2非常慢.所以,我开始寻找替代品.似乎scipy.stats.hypergeom有类似的东西.

目前,我这样打电话phyper:

pvalue <- 1-phyper(45, 92, 7518, 1329)
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

但是这会返回-7.3450134863151106e-12,这没什么意义.请注意,我已经对其他数据进行了测试,但我遇到的问题很小(相同的精度直到小数点后4位,这对我来说已经足够了).

所以归结为这些可能性:

  1. 我正在使用错误的功能(或错误的参数)
  2. scipy中有一个bug

在"1"的情况下,是否有其他替代方法phyper可以在Python中使用?

编辑:正如评论所指出的,这是scipy中的一个错误,在git master中修复.

Jam*_*mes 7

文档中,您可以尝试:

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

此外,我认为你可能会混淆价值观.

模型从bin中绘制对象.M是对象的总数,n是I类对象的总数.RV计算N中的I类对象的数量,而不从群体中替换.

因此,我的阅读:x=q,M=n+m,n=m,N=k.

所以我会尝试:

stats.hypergeom.sf(45,(92+7518),92,1329)
Run Code Online (Sandbox Code Playgroud)