Donc, disons que vous lancez une pièce 10 fois et appelez cela 1 "événement". Si vous exécutez 1 000 000 de ces "événements", quelle est la proportion d'événements dont la tête se situe entre 0,4 et 0,6? La probabilité binomiale suggérerait que cela soit d'environ 0,65, mais mon code Mathematica me dit environ 0,24
Voici ma syntaxe:
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
Où est l'incident?
computational-statistics
mathematica
Tim McKnight
la source
la source
Réponses:
L'accident est l'utilisation de strict moins de.
Avec dix lancers, le seul moyen d'obtenir un résultat en proportion de têtes strictement compris entre 0,4 et 0,6 est si vous obtenez exactement 5 têtes. Cela a une probabilité d'environ 0,246 ( ), ce qui correspond à ce que vos simulations (correctement ) donner.(105)(12)10≈0.246
Si vous incluez 0,4 et 0,6 dans vos limites (c'est-à-dire 4, 5 ou 6 têtes en 10 lancers), le résultat a une probabilité d'environ 0,656, tout comme vous vous y attendiez.
Votre première pensée ne devrait pas être un problème avec le générateur de nombres aléatoires. Ce genre de problème aurait été évident dans un paquet très utilisé comme Mathematica bien avant maintenant.
la source
Quelques commentaires sur le code que vous avez écrit:
experiment[n_]
mais ne l' avez jamais utilisé, au lieu de répéter sa définition danstrialheadcount[n_]
.experiment[n_]
pourrait être programmé beaucoup plus efficacement (sans utiliser la commande intégréeBinomialDistribution
) carTotal[RandomInteger[{0,1},n]/n
cela rendrait égalementX
inutile.experiment[n_]
est strictement compris entre 0,4 et 0,6 est plus efficacement réalisé en écrivantLength[Select[Table[experiment[10],{10^6}], 0.4 < # < 0.6 &]]
.Mais, pour la question elle-même, comme le souligne Glen_b, la distribution binomiale est discrète. Sur 10 lancers de pièces avec têtes observées, la probabilité que la proportion d'échantillon de têtes soit strictement comprise entre 0,4 et 0,6 est en fait juste le cas ; c'est-à-dire, Alors que si vous calculez la probabilité que la proportion d'échantillon soit comprise entre 0,4 et 0,6 inclus , ce serait Par conséquent, il vous suffit de modifier votre code pour utiliserx p^=x/10 x=5 Pr[4≤X≤6]=6 ∑ x=4 ( 10
0.4 <= # <= 0.6
au lieu. Mais bien sûr, on pourrait aussi écrireCette commande est environ 9,6 fois plus rapide que votre code d'origine. J'imagine que quelqu'un encore plus compétent que moi à Mathematica pourrait accélérer encore plus.
la source
Total@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]
. Je soupçonneCounts[]
qu'étant une fonction intégrée, elle est hautement optimisée par rapport à celleSelect[]
qui doit fonctionner avec des prédicats arbitraires.Faire des expériences de probabilité dans Mathematica
Mathematica offre un cadre très confortable pour travailler avec les probabilités et les distributions et - bien que le problème principal des limites appropriées ait été résolu - je voudrais utiliser cette question pour le rendre plus clair et peut-être utile comme référence.
Rendons simplement les expériences reproductibles et définissons quelques options de complot à notre goût:
Travailler avec des distributions paramétriques
Nous pouvons maintenant définir la distribution asymptotique pour un événement qui est la proportion de têtes en lancers d'une pièce (juste):nπ n
Ce qui nous donne l'intrigue de la distribution discrète des proportions:
Nous pouvons utiliser la distribution immédiatement pour calculer les probabilités pour et :Pr[Pr[0.4≤π≤0.6|π∼B(10,12)] Pr[0.4<π<0.6|π∼B(10,12)]
Faire des expériences de Monte Carlo
Nous pouvons utiliser la distribution d'un événement pour en échantillonner à plusieurs reprises (Monte Carlo).
La comparaison avec la distribution théorique / asymptotique montre que tout correspond à peu près:
la source