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

nUNEB∼HG(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.