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?
Réponses:
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 m boules 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, laisseznUNE , nB et nC dénoter la longueur de vos trois listes et laisser nA B dénoter le chevauchement entre UNE et B . alors
Pour calculer une valeur p, vous pouvez utiliser cette commande R:
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.
la source
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
la source
lower.tail=FALSE
. Sinon, de très petites valeurs de p (<1e-16) sont tronquées.