Biostar Beta. Not for public use.
Probability of gene list overlap
15
Entering edit mode
6.2 years ago
Nasir • 160

Is this the correct way to calculate the probability of overlap occurring by chance between two lists of unregulated genes generated from two independent experiments on the same tissue using the same platform?

I am using R phyper.

phyper(q, m, n, k, lower.tail = FALSE, log.p = FALSE)

where:
q=size of overlap-1;
m=number of upregulated genes in experiment #1;
n=(total number of genes on platform-m);
k=number of upregulated genes in experiment #2.

r gene overlap • 13k views
ADD COMMENTlink
2
Entering edit mode

Here is a good post on the stackexchange stats Q&A about hypergeometric for list overlap.

ADD REPLYlink
0
Entering edit mode

yes this is the correct way to do this.

ADD REPLYlink
0
Entering edit mode

Hello,

I just have a similar question: Can I use R phyper in the above way to calculate the probability of overlap occurring by chance between two lists of hit genes identified by two different algorithmsg on the same tissue?

Thank you very much!

ADD REPLYlink
0
Entering edit mode

I think yes, as long as the total number of genes is identical between both tries. Note that the probability is those of two independent random draws ('totally random'), that is maybe not such a good benchmark for a comparison of two algorithms.

ADD REPLYlink
0
Entering edit mode

are the 2 lists from the same cell type?

ADD REPLYlink
3
Entering edit mode
15 months ago
Bergen, Norway

Yes, this seems correct to me. Imagine an urn model with black an white balls in an urn from which balls are drawn without replacement. If the two experiments are independent, you can use either experiment to label the balls in the urn: m = number of white balls in the urn, n the number of black balls. Then repeat the drawing. What is the probability of drawing q or more of the same genes (hence q-1, the distribution includes q only for lower.tail = TRUE) (hence lower.tail = FALSE) white balls (significant in exp. A, gene-set size) in k draws(number of significant genes in experiment B, gene-set size).

ADD COMMENTlink
1
Entering edit mode
15 months ago
brentp 23k
Salt Lake City, UT

I think that is mostly correct except that you probably want 1 - phyper(...).

Examples

The probability of out of ~20K genes (not accounting for -m). Having 10 shared out of 2 random subsets of 100 should be very small.

> 1 - phyper(10, 100, 20000, 100, log.p=F)
[1] 2.582823e-12

The number probability of having only 1 shared should be a bit larger:

> 1 - phyper(1, 100, 20000, 100, log.p=F)
[1] 0.08868589

Also search for hypergeometric here on biostar.

EDIT: you actually need to use:

> phyper(9, 100, 20000 - 100, 100, lower.tail=F)
ADD COMMENTlink
1
Entering edit mode

Michael, thanks! I missed that. :)

ADD REPLYlink
0
Entering edit mode

instead of using 1-phyper you could also set lower.tail=F, that's what OP did, thus this is both correct.

ADD REPLYlink
0
Entering edit mode

Yes, just double checked, both phyper with lower-tail=false and (1-phyper) give same results as Michael mentioned. Thank you all.

ADD REPLYlink
0
Entering edit mode

Hi Brent, I am bit confused, in the querry q=overlap -1 while in your answer you assume 10 shared out of 2 random subsets. You put 10 as it is and does not make q=9?

who is right here?

ADD REPLYlink
1
Entering edit mode
4.3 years ago
Netherlands

If you want to know what the chance is for exactly q+1 number of overlapping genes, you should subtract the the phyper function like this:

phyper(q, m, n, k, lower.tail = F) - phyper(q+1, m, n, k, lower.tail = F)

(with q the number of overlaps -1)

This is because phyper gives the chance for q+1 overlaps OR MORE. So subtracting q+2 will give you the probabability of EXACTLY q+1 overlaps.
I checked it with the following script which prints the probability distribution. The total sum of probabilities is exactly 1 here.

tot = 0
cat('o','p',sep=' ')
for (hits in 0:100){tot = tot + (phyper(q=hits-1,m=100,n=20000-100,k=100, lower.tail=F)-phyper(q=hits,m=100,n=20000-100,k=100, lower.tail=F))
cat(hits,phyper(q=hits-1,m=100,n=20000-100,k=100, lower.tail=F)-phyper(q=hits,m=100,n=20000-100,k=100, lower.tail=F),'\n',sep=' ')}
tot

I thought I'd mention this, because while I was reading this I was under the impression that the original answer asked for the chance for an EXACT number of overlaps.

ADD COMMENTlink

Login before adding your answer.

Similar Posts
Loading Similar Posts
Powered by the version 2.1