首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用R计算venn图超几何p值

用R计算venn图超几何p值
EN

Stack Overflow用户
提问于 2013-08-20 16:18:30
回答 1查看 5.6K关注 0票数 3

嗨,我看到有人计算venn图重叠p值,如下例所示。它们使用超几何分布和R,当我在R中应用它们的函数时,我不能得到相同的结果。有人能帮我吗?

我在别人的出版物上看到的样本:

从15220个基因中,A组为1850+195基因,B组为195+596基因,重叠基因为195个。它们的p值为2e-26。

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

代码语言:javascript
复制
p = Σ (m,i)(N-m,n-i)/(N,n)

对于i,从kmin(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,但是当我计算

1 - phyper(448,1000,13800,2872)在R,我得到了0,而不是1.906314e-81的链接。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-20 18:48:15

使用包gmp,并将choose替换为chooseZ,我们可以将p值实现为:

代码语言:javascript
复制
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) )
}

结果:

代码语言:javascript
复制
> enrich_pvalue(15220, 1850, 596, 195)
[1] 1.91221e-18

使用pangloss链接中的示例(用符号表示),我们得到:

代码语言:javascript
复制
> enrich_pvalue(N=14800, A=1000-448, B=2872-448, k=448)
[1] 7.289388e-81
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18340123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档