嗨,我看到有人计算维恩图重叠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)
i
从k
到min(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和统计数据完全不熟悉,抱歉在这里发布了很多错误。
答案 0 :(得分:3)
使用包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