使用R计算Venn图的超几何P值

4

你好,我看到有人计算Venn图重叠p值的方法如下。他们使用超几何分布和R语言。当我在R中应用他们的函数时,我无法得到相同的结果。有人能帮我吗?

我在别人的出版物中看到的示例:

从15220个基因中,集合A包含1850+195个基因,集合B包含195+596个基因,重叠了195个基因。他们的p值为2e-26。

他们的方法是:给定总共N个基因,如果基因集A和B分别包含m和n个基因,并且其中k个基因是共同的,则富集的p值通过以下方式计算:

p = Σ (m,i)(N-m,n-i)/(N,n)

对于 ikmin(m,n) 的情况,其中 "(m,i)" 表示二项式形式。

我使用 R 的方式是:

sum(choose(596+195,195:(195+596))*choose(15220-596-195,(1850+195)-195:(195+596)))/choose(15220,1850+195)

结果为 NaN

或者使用:phyper(195,1850+195,15220-1850-195,596+195),结果为 1。

我还参考了链接http://www.pangloss.com/wiki/VennSignificance,但当我在 R 中计算

1 - phyper(448,1000,13800,2872)时,得到的结果是 0,而不是链接中的 1.906314e-81。

我对 R 和统计学完全陌生,抱歉在这里发帖犯了许多错误。


你有这篇论文的链接吗?你确定论文中报告的p值是针对重叠部分还是其他什么东西? - nograpes
是的,论文链接在第3页上,链接为http://www.pnas.org/content/suppl/2007/10/02/0701014104.DC1/01014SuppText.pdf。谢谢。另外,论文链接为http://www.pnas.org/content/104/42/16438.abstract。 - user2700418
1个回答

5
使用包gmp,并将choose替换为chooseZ,我们可以将您的p值实现为:
require(gmp)

enrich_pvalue <- function(N, A, B, k)
{
    m <- A + k
    n <- B + k
    i <- k:min(m,n)

    as.numeric( sum(chooseZ(m,i)*chooseZ(N-m,n-i))/chooseZ(N,n) )
}

结果:

> enrich_pvalue(15220, 1850, 596, 195)
[1] 1.91221e-18

使用你提供的Pangloss链接中的示例(采用你的符号表示),我们得到:

> enrich_pvalue(N=14800, A=1000-448, B=2872-448, k=448)
[1] 7.289388e-81

谢谢你,Ferdinand,你的回答很好,解决了我的问题!作为进一步的问题,你能给我一些关于使用除了“choose”之外的其他命令(如“phyper”)的想法吗?R是否有任何通用设置可以产生更精确的数字结果?我非常感谢你的时间。 - user2700418

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接