¿Cómo calculo si el grado de superposición entre dos listas es significativo?

9

Si tengo dos listas A y B, las cuales son subconjuntos de una lista C mucho más grande, ¿cómo puedo determinar si el grado de superposición de A y B es mayor de lo que esperaría por casualidad?

¿Debería seleccionar aleatoriamente elementos de C de la misma longitud que las listas A y B y determinar esa superposición aleatoria, y hacer esto muchas veces para determinar algún tipo de valor p empírico? ¿Hay una mejor manera de probar esto?

Estofado
fuente
Debería usar la respuesta de Colin, pero su idea de hacer la simulación de Monte Carlo también es correcta.

Respuestas:

9

Si entiendo su pregunta correctamente, debe usar la distribución hipergeométrica . Esta distribución generalmente se asocia con los modelos de urna, es decir, hay bolas en una urna, están pintadas de rojo, y usted saca bolas de la urna. Entonces, si es el número de bolas en su muestra de que son rojas, tiene una distribución hipergeométrica.nymXmX

Para su ejemplo específico, dejar que , y denotan las longitudes de sus tres listas y dejar que denota la coincidencia entre y . EntoncesnAnBnCnABAB

nABHG(nA,nC,nB)

Para calcular un valor p, puede usar este comando 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

Palabra de precaución. Recuerde múltiples pruebas, es decir, si tiene muchas listas A y B , entonces necesitará ajustar sus valores p con una corrección. Por ejemplo, las correcciones FDR o Bonferroni.

csgillespie
fuente
2

La respuesta de csgillespie parece correcta, excepto por una cosa: da la probabilidad de ver estrictamente más de n_A_B en la superposición, P (x> n_A_B), pero creo que OP quiere el valor P (x> = n_A_B). Podrías obtener este último por

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) 
leda
fuente
+1 para lower.tail=FALSE. De lo contrario, los valores p muy pequeños (<1e-16) se truncan.
Backlin