Comment calculer si le degré de chevauchement entre deux listes est significatif?


9

Si j'ai deux listes A et B, qui sont toutes deux des sous-ensembles d'une liste C beaucoup plus grande, comment puis-je déterminer si le degré de chevauchement de A et B est supérieur à ce que j'attendrais par hasard?

Dois-je simplement sélectionner au hasard des éléments de C de la même longueur que les listes A et B et déterminer ce chevauchement aléatoire, et le faire plusieurs fois pour déterminer un type ou une valeur de p empirique? Existe-t-il une meilleure façon de tester cela?


Vous devriez utiliser la réponse de Colin, mais votre idée de faire une simulation Monte Carlo est également correcte.

Réponses:


9

Si je comprends bien votre question, vous devez utiliser la distribution hypergéométrique . Cette distribution est généralement associée aux modèles d’urnes, c’est-à-dire qu’iln balles dans une urne, y sont peints en rouge et vous dessinez mboules de l'urne. Puis siX est le nombre de balles dans votre échantillon de m qui sont rouges, X a une distribution hyper-géométrique.

Pour votre exemple spécifique, laissez nUNE, nB et nC dénoter la longueur de vos trois listes et laisser nUNEB dénoter le chevauchement entre UNE et B. alors

nUNEBHG(nUNE,nC,nB)

Pour calculer une valeur p, vous pouvez utiliser cette commande R:

#Some example values
n_A = 100;n_B = 200; n_C = 500; n_A_B = 50
1-phyper(n_A_B, n_B, n_C-n_B, n_A)
[1] 0.008626697

Un mot d'avertissement. N'oubliez pas les tests multiples, c'est-à-dire que si vous avez beaucoup de listes A et B , vous devrez ajuster vos valeurs de p avec une correction. Pour l'exemple les corrections FDR ou Bonferroni.


2

La réponse de csgillespie semble correcte, sauf pour une chose: elle donne la probabilité de voir strictement plus de n_A_B dans le chevauchement, P (x> n_A_B), mais je pense que OP veut la pvalue P (x> = n_A_B). Vous pouvez obtenir ce dernier en

n_A = 100;n_B = 200; n_C = 500; n_A_B = 50
phyper(n_A_B - 1, n_A, n_C-n_A, n_B, lower.tail = FALSE) 

+1 pour lower.tail=FALSE. Sinon, de très petites valeurs de p (<1e-16) sont tronquées.
Backlin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.