2011-07-06 116 views
4

在R中,我使用phyper函数做生物信息学分析的超几何测试。然而,我使用了很多Python代码,并且在这里使用rpy2非常缓慢。所以,我开始寻找替代品。似乎scipy.stats.hypergeom有类似的东西。在Python中,R的“phyper”函数等价于什么?

目前,我叫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 ,这没什么意义。请注意,我已经在其他数据上测试了这一点,并且我几乎没有问题(精确到小数点后四位,这对我来说已经足够了)。

所以它归结为这些可能性:

  1. 我使用了错误的功能作业(或错误参数)
  2. 有一个在SciPy的

一个错误的情况下, “1”,是否有其他替代phyper,可以在Python中使用?

编辑:正如评论注意到的,这是一个scipy中的错误,在git master中修复。

回答

7

docs,你可以尝试:

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

另外,我觉得你可能值混合起来。

从bin中绘制对象的模型。 M 是对象的总数,n是总数 类型I对象的数量。 RV计数 抽取的N个类型I对象的数量 没有从人口中取代。

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

所以我会尝试:

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

仍然给出了否定的p值,但因为我没有其他的测试是相当的,我不知道如果没有任何副作用,我不知道的。 – Einar

+0

我认为它是一个scipy中的错误: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

相关问题