Extender la paradoja del cumpleaños a más de 2 personas.

29

En la tradicional paradoja del cumpleaños, la pregunta es "cuáles son las posibilidades de que dos o más personas en un grupo de personas compartan un cumpleaños". Estoy atrapado en un problema que es una extensión de esto.n

En lugar de saber la probabilidad de que dos personas compartan un cumpleaños, necesito extender la pregunta para saber cuál es la probabilidad de que o más personas compartan un cumpleaños. Con puede hacer esto calculando la probabilidad de que no haya dos personas compartiendo un cumpleaños y restando eso de , pero no creo que pueda extender esta lógica a números mayores de .xx=21x

Para complicar aún más esto, también necesito una solución que funcione para números muy grandes para (millones) (miles).nx

Simon Andrews
fuente
1
Supongo que es un problema de bioinformática
csgillespie
3
En realidad es un problema de bioinformática, pero como se reduce al mismo concepto que la paradoja del cumpleaños, ¡pensé que guardaría los detalles irrelevantes!
Simon Andrews
44
Normalmente estaría de acuerdo con usted, pero en este caso los detalles pueden ser importantes, ya que podría haber un paquete de bioconductores que haga lo que le pida.
csgillespie
Si realmente quiere saber, es un problema de búsqueda de patrones en el que estoy tratando de estimar con precisión la probabilidad de un determinado nivel de enriquecimiento de una subsecuencia dentro de un conjunto de secuencias más grandes. Por lo tanto, tengo un conjunto de subsecuencias con recuentos asociados y sé cuántas subsecuencias observé y cuántas secuencias teóricamente observables están disponibles. Si vi una secuencia particular 10 veces de cada 10,000 observaciones, necesito saber qué tan probable fue que haya ocurrido por casualidad.
Simon Andrews
Casi ocho años después, publiqué una respuesta a este problema en stats.stackexchange.com/questions/333471 . El código no funciona para grandes sin embargo, porque se necesita tiempo cuadrática en n . n,n
whuber

Respuestas:

17

Este es un problema de conteo: hay posibles asignaciones de b cumpleaños para n personas. De ellos, que q ( k ; n , b ) sea ​​el número de tareas para las cuales no hay cumpleaños compartido por más de k personas, pero al menos un cumpleaños es compartido por k personas. La probabilidad que buscamos se puede encontrar sumando q ( k ; n , b ) para los valores apropiados de k y multiplicando el resultado por b - n .bnbnq(k;n,b)kkq(k;n,b)kbn

Estos recuentos se pueden encontrar exactamente para valores de menores que varios cientos. Sin embargo, no seguirán ninguna fórmula directa: tenemos que considerar los patrones de las formas en que se pueden asignar los cumpleaños . Ilustraré esto en lugar de proporcionar una demostración general. Sea n = 4 (esta es la situación interesante más pequeña). Las posibilidades son:nn=4

  • Cada persona tiene un cumpleaños único; el código es {4}.
  • Exactamente dos personas comparten un cumpleaños; el código es {2,1}.
  • Dos personas tienen un cumpleaños y las otras dos tienen otro; el código es {0,2}.
  • Tres personas comparten un cumpleaños; el código es {1,0,1}.
  • Cuatro personas comparten un cumpleaños; el código es {0,0,0,1}.

En general, el código es una tupla de recuentos cuyos k th estipula elemento cuántas fechas de nacimiento distintas son compartidos por exactamente k personas. Así, en particular,{a[1],a[2],}kthk

1a[1]+2a[2]+...+ka[k]+=n.

Tenga en cuenta, incluso en este caso simple, que hay dos formas de alcanzar el máximo de dos personas por cumpleaños: una con el código y otra con el código { 2 , 1 } .{0,2}{2,1}

Podemos contar directamente el número de posibles asignaciones de cumpleaños correspondientes a cualquier código dado. Este número es producto de tres términos. Uno es un coeficiente multinomial; cuenta el número de formas de dividir personas en un [ 1 ] grupos de 1 , un [ 2 ] grupos de 2 , y así sucesivamente. ¡Debido a que la secuencia de grupos no importa, tenemos que dividir este coeficiente multinomial por un [ 1 ] ! a [ 2 ] ! na[1]1a[2]2a[1]!a[2]!; su recíproco es el segundo término. Finalmente, alinee los grupos y asígneles un cumpleaños a cada uno: hay candidatos para el primer grupo, b - 1 para el segundo, y así sucesivamente. Estos valores tienen que multiplicarse juntos, formando el tercer término. Es igual al "producto factorial" b ( a [ 1 ] + a [ 2 ] + ) donde b ( m ) significa b ( b - 1 ) ( b - m + 1bb1b(a[1]+a[2]+)b(m) .b(b1)(bm+1)

Hay una recursión obvia y bastante simple que relaciona el recuento de un patrón con el recuento del patrón { a [ 1 ] , ... , a [ k - 1 ] } . Esto permite el cálculo rápido de los recuentos para valores modestos de n . Específicamente, una [ k ] representa una [ k ] fecha de nacimiento compartida exactamente por k{a[1],,a[k]}{a[1],,a[k1]}na[k]a[k]kpersonas cada uno. Después de esto grupos de k personas han sido extraídos de las n personas, que se pueden hacer en x maneras distintas (por ejemplo), queda por contar el número de maneras de lograr el patrón { un [ 1 ] , ... , a [ k - 1 ] } entre las personas restantes. Multiplicar esto por x da la recursividad.a[k]knx{a[1],,a[k1]}x

Dudo que haya una fórmula de forma cerrada para , que se obtiene sumando los recuentos de todas las particiones de n cuyo término máximo es igual a k . Permítanme ofrecer algunos ejemplos:q(k;n,b)nk

Con (cinco cumpleaños posibles) yn = 4 (cuatro personas), obtenemosb=5n=4

q(1)=q(1;4,5)=120q(2)=360+60=420q(3)=80q(4)=5.

De ahí, por ejemplo, la posibilidad de que tres o más personas de cada cuatro compartan el mismo "cumpleaños" (de posibles fechas) es igual a ( 80 + 5 ) / 625 = 0.136 .5(80+5)/625=0.136

Como otro ejemplo, tomar y n = 23 . Estos son los valores de q ( k ; 23 , 365 ) para la k más pequeña (solo para seis sig figs):b=365n=23q(k;23,365)k

k=1:0.49270k=2:0.494592k=3:0.0125308k=4:0.000172844k=5:1.80449E6k=6:1.48722E8k=7:9.92255E11k=8:5.45195E13.

Usando esta técnica, podemos calcular fácilmente que hay aproximadamente un 50% de posibilidades de (al menos) una colisión de cumpleaños a tres bandas entre 87 personas, una probabilidad del 50% de una colisión a cuatro bandas entre 187 y una probabilidad del 50% de Una colisión de cinco vías entre 310 personas. Ese último cálculo comienza a tomar unos segundos (en Mathematica, de todos modos) porque el número de particiones a considerar comienza a aumentar. Para sustancialmente mayor necesitamos una aproximación.n

Se obtiene una aproximación por medio de la distribución de Poisson con expectativa , porque podemos ver una asignación de cumpleaños que surge de b variables Poisson casi (pero no del todo) independientes, cada una con expectativa n / b : la variable para cualquier cumpleaños posible dado describe cuántas de las n personas tienen ese cumpleaños. Por lo tanto, la distribución del máximo es aproximadamente F ( k ) b donde F es el CDF de Poisson. Este no es un argumento riguroso, así que hagamos una pequeña prueba. La aproximación para n = 23 , bn/bbn/bnF(k)bFn=23 dab=365

k=1:0.498783k=2:0.496803k=3:0.014187k=4:0.000225115.

Al comparar con lo anterior, puede ver que las probabilidades relativas pueden ser pobres cuando son pequeñas, pero las probabilidades absolutas se aproximan razonablemente a aproximadamente 0.5%. Las pruebas con un amplio rango de y b sugieren que la aproximación generalmente es tan buena.nb

Para concluir, consideremos la pregunta original: tome (el número de observaciones) yb = 1n=10,000 (el número de posibles "estructuras", aproximadamente). La distribución aproximada para el número máximo de "cumpleaños compartidos" esb=1000000

k=1:0k=2:0.8475+k=3:0.1520+k=4:0.0004+k>4:<1E6.

(Este es un cálculo rápido). Claramente, observar una estructura 10 veces de cada 10,000 sería muy significativo. Debido a que y b son grandes, espero que la aproximación funcione bastante bien aquí.nb

Por cierto, como Shane insinuó, las simulaciones pueden proporcionar comprobaciones útiles. Se crea una simulación de Mathematica con una función como

simulate[n_, b_] := Max[Last[Transpose[Tally[RandomInteger[{0, b - 1}, n]]]]];

que luego se itera y resume, como en este ejemplo que ejecuta 10,000 iteraciones de , b = 1n=10000 caso:b=1000000

Tally[Table[simulate[10000, 1000000], {n, 1, 10000}]] // TableForm

Su salida es

2 8503

3 1493

4 4

Estas frecuencias coinciden estrechamente con las predichas por la aproximación de Poisson.

whuber
fuente
Qué respuesta tan fantástica, muchas gracias @whuber.
JKnight
"Hay una recurrencia obvia y bastante simple" - ¿Es decir?
Kodiólogo
1
@Kodiologist inserté una breve descripción de la idea.
whuber
+1 pero ¿en qué parte de la pregunta original viste que n = 10000 yb = 1mln? Parece que el OP pregunta acerca de n = 1mln yk = 10000, con b sin especificar (presumiblemente b = 365). No es que importe en este momento :)
ameba dice Reinstate Monica
1
@amoeba Después de todo este tiempo (seis años, 1600 respuestas y leyendo detenidamente decenas de miles de publicaciones) no puedo recordar, pero lo más probable es que haya malinterpretado la última línea. En mi defensa, tenga en cuenta que si lo leemos literalmente, la respuesta es inmediata (al aplicar una versión del Principio de casillero): es seguro que entre = millones de personas habrá al menos un cumpleaños que se compartirá entre al menos x = miles de ellos! nx
whuber
2

Siempre es posible resolver este problema con una solución monte-carlo, aunque eso está lejos de ser el más eficiente. Aquí hay un ejemplo simple del problema de 2 personas en R (de una presentación que hice el año pasado ; usé esto como un ejemplo de código ineficiente), que podría ajustarse fácilmente para dar cuenta de más de 2:

birthday.paradox <- function(n.people, n.trials) {
    matches <- 0
    for (trial in 1:n.trials) {
        birthdays <- cbind(as.matrix(1:365), rep(0, 365))
        for (person in 1:n.people) {
            day <- sample(1:365, 1, replace = TRUE)
            if (birthdays[birthdays[, 1] == day, 2] == 1) {
                matches <- matches + 1
                break
            }
            birthdays[birthdays[, 1] == day, 2] <- 1
        }
        birthdays <- NULL
    }
    print(paste("Probability of birthday matches = ", matches/n.trials))
}
Shane
fuente
No estoy seguro de si la solución de tipos múltiples funcionará aquí.
Creo que la generalización solo funciona para 2 o más personas que comparten un cumpleaños, solo que puedes tener diferentes subclases de personas.
Simon Andrews
1

Este es un intento de una solución general. Puede haber algunos errores, ¡así que úselo con precaución!

Primero alguna notación:

sea ​​la probabilidad de que x o más personas compartan un cumpleaños entre n personas,P(x,n)xn

sea ​​la probabilidad de queexactamente y personas compartan un cumpleaños entre n personas.P(y|n) yn

Notas:

  1. El abuso de la notación como Se está utilizando de dos maneras diferentes.P(.)

  2. Por definición, no puede tomar el valor de 1 ya que no tiene ningún sentido e y = 0 puede interpretarse en el sentido de que nadie comparte un cumpleaños común.yy

Entonces la probabilidad requerida viene dada por:

P(x,n)=1P(0|n)P(2|n)P(3|n)....P(x1|n)

Ahora,

P(y|n)=(ny)(365365)y k=1k=ny(1k365)

y

y(ny) ways.

Step 2: Since they share a birthday it can be any of the 365 days in a year. So, we basically have 365 choices which gives us (365365)y.

Step 3: The remaining ny people should not share a birthday with the first y people or with each other. This reasoning gives us k=1k=ny(1k365).

You can check that for x = 2 the above collapses to the standard birthday paradox solution.


fuente
Will this solution suffer from the curse of dimensionality? If instead of n=365, n=10^6 is this solution still feasible?
csgillespie
Some approximations may have to be used to deal with high dimensions. Perhaps, use Stirling's approximation for factorials in the binomial coefficient. To deal with the product terms you could take logs and compute the sums instead of the products and then take the anti-log of the sum.
There are also several other forms of approximations possible using for example the Taylor series expansion for the exponential function. See the wiki page for these approximations: en.wikipedia.org/wiki/Birthday_problem#Approximations
Suppose y=2, n=4, and there are just two birthdays. Your formula, adapted by replacing 365 by 2, seems to say the probability that exactly 2 people share a birthday is Comb(4,2)*(2/2)^2*(1-1/2)*(1-2/2) = 0. (In fact, it's easy to see--by brute force enumeration if you like--that the probabilities that 2, 3, or 4 people share a "birthday" are 6/16, 8/16, and 2/16, respectively.) Indeed, whenever n-y >= 365, your formula yields 0, whereas as n gets large and y is fixed the probability should increase to a non-zero maximum before n reaches 365*y and then decrease, but never down to 0.
whuber
Why you are replacing 365 by n? The probability that 2 people share a birthday is computed as: 1 - Prob(they have unique birthday). Prob(that they have unique birthday) = (364/365). The logic is as follows: Pick a person. This person can have any day of the 365 days as a birthday. The second person can then only have a birthday on one of the remaining 364 days. Thus, the prob that they have a unique birthday is 364/365. I am not sure how you are calculating 6/16.