在 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,这毫无意义。请注意,我已经在其他数据上对此进行了测试,但几乎没有问题(精确到小数点后第四位,这对我来说已经足够了)。
所以它归结为这些可能性:
- 我在工作中使用了错误的函数(或错误的参数)
- scipy 中有一个错误
如果是“1”,是否有其他可以在 Python 中使用的 phyper
替代品?
编辑:如评论所述,这是 scipy 中的错误,已在 git master 中修复。
最佳答案
来自docs ,你可以试试:
hypergeom.sf(x,M,n,N,loc=0)
: survival function (1-cdf — sometimes more accurate)
此外,我认为您可能混淆了这些值。
Models drawing objects from a bin. M is total number of objects, n is total number of Type I objects. RV counts number of Type I objects in N drawn without replacement from population.
因此,根据我的阅读:x=q
、M=n+m
、n=m
、N=k
。
所以我会尝试:
stats.hypergeom.sf(45,(92+7518),92,1329)
关于python - Python 中 R 的 "phyper"函数有哪些等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594840/