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

时间:2011-07-06 10:20:46

标签: python statistics

在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中有一个错误
  3. 如果是“1”,是否可以在Python中使用phyper的其他替代方法?

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

1 个答案:

答案 0 :(得分:7)

docs,您可以尝试:

  

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

另外,我认为你可能会混淆价值。

  

模型从bin中绘制对象。中号   是对象的总数,n是总数   Type I对象的数量。 RV计数   N中绘制的I类对象的数量   没有人口替代。

因此,通过我的阅读:x=qM=n+mn=mN=k

所以我会尝试:

stats.hypergeom.sf(45,(92+7518),92,1329)