Entonces, digamos que lanzas una moneda 10 veces y llamas a ese 1 "evento". Si ejecuta, 1,000,000 de estos "eventos", ¿cuál es la proporción de eventos que tienen cabezas entre 0.4 y 0.6? La probabilidad binomial sugeriría que esto sea aproximadamente 0.65, pero mi código de Mathematica me dice aproximadamente 0.24
Aquí está mi sintaxis:
In[2]:= X:= RandomInteger[];
In[3]:= experiment[n_]:= Apply[Plus, Table[X, {n}]]/n;
In[4]:= trialheadcount[n_]:= .4 < Apply[Plus, Table[X, {n}]]/n < .6
In[5]:= sample=Table[trialheadcount[10], {1000000}]
In[6]:= Count[sample2,True];
Out[6]:= 245682
¿Dónde está el contratiempo?
computational-statistics
mathematica
Tim McKnight
fuente
fuente
Respuestas:
El contratiempo es el uso de estricto menor que.
Con diez lanzamientos, la única forma de obtener un resultado de proporción de cabezas estrictamente entre 0.4 y 0.6 es si obtiene exactamente 5 caras. Eso tiene una probabilidad de aproximadamente 0.246 ( ), que es sobre cuáles son sus simulaciones (correctamente ) dar.(105)(12)10≈0.246
Si incluye 0.4 y 0.6 en sus límites (es decir, 4, 5 o 6 caras en 10 lanzamientos), el resultado tiene una probabilidad de aproximadamente 0.656, más de lo que esperaba.
Su primer pensamiento no debería ser un problema con el generador de números aleatorios. Ese tipo de problema habría sido obvio en un paquete muy usado como Mathematica mucho antes.
fuente
Algunos comentarios sobre el código que escribiste:
experiment[n_]
pero nunca lo usó, sino que repitió su definición entrialheadcount[n_]
.experiment[n_]
podría programarse de manera mucho más eficiente (sin usar el comando incorporadoBinomialDistribution
) comoTotal[RandomInteger[{0,1},n]/n
y esto también haríaX
innecesario.experiment[n_]
está estrictamente entre 0.4 y 0.6 se logra más eficientemente escribiendoLength[Select[Table[experiment[10],{10^6}], 0.4 < # < 0.6 &]]
.Pero, para la pregunta en sí misma, como señala Glen_b, la distribución binomial es discreta. De cada 10 lanzamientos de monedas con caras observadas, la probabilidad de que la proporción muestral de caras esté estrictamente entre 0.4 y 0.6 es en realidad el caso ; es decir, Mientras que, si calculara la probabilidad de que la proporción de la muestra esté entre 0.4 y 0.6 inclusive , sería Por lo tanto, solo necesita modificar su código para usarx p^=x/10 x=5
0.4 <= # <= 0.6
en lugar. Pero claro, también podríamos escribirEste comando es aproximadamente 9.6 veces más rápido que su código original. Me imagino que alguien aún más competente que yo en Mathematica podría acelerarlo aún más.
fuente
Total@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]
. Sospecho queCounts[]
, al ser una función incorporada, está altamente optimizado en comparación conSelect[]
, que tiene que trabajar con predicados arbitrarios.Haciendo experimentos de probabilidad en Mathematica
Mathematica ofrece un marco muy cómodo para trabajar con probabilidades y distribuciones y, si bien se ha abordado el problema principal de los límites apropiados, me gustaría utilizar esta pregunta para aclarar esto y tal vez sea útil como referencia.
Simplemente hagamos que los experimentos sean repetibles y definamos algunas opciones de trama que se ajusten a nuestro gusto:
Trabajando con distribuciones paramétricas
Ahora podemos definir la distribución asintótica para un evento que es la proporción de caras en tiros de una moneda (regular):π n
Lo que nos da la gráfica de la distribución discreta de proporciones:
Podemos usar la distribución inmediatamente para calcular las probabilidades dePr[0.4≤π≤0.6|π∼B(10,12)] y :Pr[0.4<π<0.6|π∼B(10,12)]
Haciendo experimentos de Monte Carlo
Podemos usar la distribución de un evento para muestrearlo repetidamente (Monte Carlo).
Comparar esto con la distribución teórica / asintótica muestra que todo encaja:
fuente