Il generatore di numeri casuali di Mathematica si discosta dalla probabilità binomiale?


9

Quindi, supponiamo di lanciare una moneta 10 volte e chiamare 1 "evento". Se corri, 1.000.000 di questi "eventi", qual è la proporzione di eventi che hanno una testa compresa tra 0,4 e 0,6? La probabilità binomiale suggerirebbe che questo sia circa 0,65, ma il mio codice Mathematica mi dice circa 0,24

Ecco la mia sintassi:

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

Dov'è l'incidente?


3
forse questo sarebbe più adatto a matematica stackexchange matematica.stackexchange.com
Jeromy Anglim

1
@JeromyAnglim In questo caso sospetto che il problema sia probabilmente con il ragionamento piuttosto che strettamente con la codifica.
Glen_b -Restate Monica

@Glen_b Immagino che la cosa principale sia che ci sia una buona risposta da qualche parte su Internet, che sembra aver fornito. :-)
Jeromy Anglim,

Risposte:


19

L'incidente è l'uso di meno severo di.

Con dieci tiri, l'unico modo per ottenere un risultato di proporzione di teste strettamente compreso tra 0,4 e 0,6 è se ottieni esattamente 5 teste. Ciò ha una probabilità di circa 0,246 ( ), che riguarda le tue simulazioni (correttamente ) dare.(105)(12)100.246

Se includi 0,4 e 0,6 nei tuoi limiti (ovvero 4, 5 o 6 teste in 10 lanci) il risultato ha una probabilità di circa 0,656, proprio come previsto.

Il tuo primo pensiero non dovrebbe essere un problema con il generatore di numeri casuali. Questo tipo di problema sarebbe stato evidente in un pacchetto molto usato come Mathematica molto prima.


Ironia della sorte, @TimMcKnight ha dimostrato la probabilità binomiale per noi.
Simon Kuang,

8

Alcuni commenti sul codice che hai scritto:

  • L'hai definito experiment[n_]ma non l' hai mai usato, ripetendo invece la sua definizione in trialheadcount[n_].
  • experiment[n_]potrebbe essere programmato in modo molto più efficiente (senza utilizzare il comando integrato BinomialDistribution) in quanto Total[RandomInteger[{0,1},n]/nciò renderebbe Xsuperfluo.
  • Il conteggio del numero di casi in cui experiment[n_]è strettamente compreso tra 0,4 e 0,6 viene realizzato in modo più efficiente scrivendo Length[Select[Table[experiment[10],{10^6}], 0.4 < # < 0.6 &]].

Ma, per la domanda vera e propria, come sottolinea Glen_b, la distribuzione binomiale è discreta. Su 10 lanci di monete con teste osservate, la probabilità che la proporzione campionaria di teste sia strettamente tra 0,4 e 0,6 è in realtà solo il caso ; vale a dire, Considerando che, se si calcolasse la probabilità che la proporzione del campione sia compresa tra 0,4 e 0,6 compresi , sarebbe Pertanto, è necessario solo modificare il codice da utilizzarexp^=x/10x=5

Pr[X=5]=(105)(0.5)5(10.5)50.246094.
Pr[4X6]=x=46(10x)(0.5)x(10.5)10x=67210240.65625.
0.4 <= # <= 0.6anziché. Ma ovviamente potremmo anche scrivere
Length[Select[RandomVariate[BinomialDistribution[10,1/2],{10^6}], 4 <= # <= 6 &]]

Questo comando è circa 9,6 volte più veloce del codice originale. Immagino che qualcuno ancora più esperto di me in Mathematica possa accelerarlo ulteriormente.


2
Puoi velocizzare il tuo codice di un altro fattore 10 usando Total@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]. Ho il sospetto che Counts[], essendo una funzione integrata, sia altamente ottimizzata rispetto a Select[], che deve lavorare con predicati arbitrari.
David Zhang,

1

Fare esperimenti di probabilità in Mathematica

Mathematica offre un framework molto comodo per lavorare con le probabilità e le distribuzioni e - mentre è stata affrontata la questione principale dei limiti appropriati - Vorrei usare questa domanda per renderlo più chiaro e forse utile come riferimento.

Rendiamo semplicemente gli esperimenti ripetibili e definiamo alcune opzioni di trama per soddisfare i nostri gusti:

SeedRandom["Repeatable_151115"];
$PlotTheme = "Detailed";
SetOptions[Plot, Filling -> Axis];
SetOptions[DiscretePlot, ExtentSize -> Scaled[0.5], PlotMarkers -> "Point"];

Lavorare con le distribuzioni parametriche

Ora possiamo definire la distribuzione asintotica per un evento che è la proporzione di teste in tiri di una moneta (equa):πn

distProportionTenCoinThrows = With[
    {
        n = 10, (* number of coin throws *)
        p = 1/2 (* fair coin probability of head*)
    },
    (* derive the distribution for the proportion of heads *)
    TransformedDistribution[
        x/n,
        x \[Distributed] BinomialDistribution[ n, p ]
    ];

With[
    {
        pr = PlotRange -> {{0, 1}, {0, 0.25}}
    },
    theoreticalPlot = DiscretePlot[
        Evaluate @ PDF[ distProportionTenCoinThrows, p ],
        {p, 0, 1, 0.1},
        pr
    ];
    (* show plot with colored range *)
    Show @ {
        theoreticalPlot,
        DiscretePlot[
            Evaluate @ PDF[ distProportionTenCoinThrows, p ],
            {p, 0.4, 0.6, 0.1},
            pr,
            FillingStyle -> Red,
            PlotLegends -> None
        ]
    }
]

Il che ci dà la trama della distribuzione discreta delle proporzioni: TheoreticalDistributionPlot

Possiamo usare immediatamente la distribuzione per calcolare le probabilità per e :Pr[0.4π0.6|πB(10,12)]Pr[0.4<π<0.6|πB(10,12)]

{
    Probability[ 0.4 <= p <= 0.6, p \[Distributed] distProportionTenCoinThrows ],
    Probability[ 0.4 < p < 0.6, p \[Distributed] distProportionTenCoinThrows ]
} // N

{0.65625, 0.246094}

Fare esperimenti Monte Carlo

Possiamo usare la distribuzione per un evento per campionarlo ripetutamente (Monte Carlo).

distProportionsOneMillionCoinThrows = With[
    {
        sampleSize = 1000000
    },
    EmpiricalDistribution[
        RandomVariate[
            distProportionTenCoinThrows,
            sampleSize
        ]
    ]
];

empiricalPlot = 
    DiscretePlot[
        Evaluate@PDF[ distProportionsOneMillionCoinThrows, p ],
        {p, 0, 1, 0.1}, 
        PlotRange -> {{0, 1}, {0, 0.25}} , 
        ExtentSize -> None, 
        PlotLegends -> None, 
        PlotStyle -> Red
    ]
]

EmpirialDistributionPlot

Il confronto con la distribuzione teorica / asintotica mostra che tutto si adatta praticamente a:

Show @ {
   theoreticalPlot,
   empiricalPlot
}

ComparingDistributions


Puoi trovare un post simile con maggiori informazioni di base su Mathematica su Mathematica SE .
Scritto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.