在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”,是否可以在Python中使用phyper
的其他替代方法?
答案 0 :(得分:7)
从docs,您可以尝试:
hypergeom.sf(x,M,n,N,loc=0)
: 生存功能(1-cdf - 有时 更准确)
另外,我认为你可能会混淆价值。
模型从bin中绘制对象。中号 是对象的总数,n是总数 Type I对象的数量。 RV计数 N中绘制的I类对象的数量 没有人口替代。
因此,通过我的阅读:x=q
,M=n+m
,n=m
,N=k
。
所以我会尝试:
stats.hypergeom.sf(45,(92+7518),92,1329)