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

6 投票
1 回答
3778 浏览
提问于 2025-04-16 20:56

在R语言中,我使用phyper函数进行超几何检验,这在生物信息学分析中很常见。不过,我平时用的代码大多是Python,而用rpy2来调用R的函数速度比较慢。所以,我开始寻找其他的替代方案。看起来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,这让我感到困惑。值得注意的是,我在其他数据上测试过这个函数,结果还算正常(精确到小数点后四位,对我来说已经足够了)。

所以,我总结出以下几种可能性:

  1. 我可能使用了不适合的函数(或者参数不对)
  2. scipy可能存在bug

如果是第一种情况,有没有其他可以在Python中替代phyper的函数呢?

补充:正如评论所提到的,这确实是scipy中的一个bug,已经在git主分支上修复了。

1 个回答

10

根据文档,你可以试试:

hypergeom.sf(x,M,n,N,loc=0) : 这是生存函数(1减去累积分布函数,有时候更准确)

另外,我觉得你可能把数值搞混了。

模型是从一个箱子里抽取物品。M 是物品的总数,n 是类型I物品的总数。随机变量(RV)计算的是在从总体中抽取的N个物品中,类型I物品的数量。

所以根据我的理解:x=qM=n+mn=mN=k

所以我会尝试:

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

撰写回答