Resampling und Monte-Carlo-Methoden#

Einleitung#

Resampling und Monte-Carlo-Methoden sind statistische Techniken, die die mathematische Analyse durch viele Berechnungen ersetzen.

Angenommen, Sie und Ihr Bruder Kyle stehen am Straßenrand und trampen auf einer langen und einsamen Straße. Plötzlich erscheint ein glänzender Dämon ... mitten auf der Straße. Und er sagt:

Wenn Sie eine Münze mit der Wahrscheinlichkeit für Kopf \(p=0.5\) genau \(n=100\) Mal werfen, wie groß ist die Wahrscheinlichkeit, dass die Anzahl der Köpfe kleiner oder gleich \(x=45\) ist? Antworten Sie richtig, sonst fresse ich Ihre Seelen.

>>> import math
>>> import numpy as np
>>> p = 0.5  # probability of flipping heads each flip
>>> n = 100  # number of coin flips per trial
>>> x = 45  # we want to know the probability that the number of heads per trial will be less than or equal to this

Ihr Bruder Kyle ist der analytische Typ. Er antwortet:

Mit zunehmender Anzahl von Münzwürfen nähert sich die Verteilung der Anzahl der Köpfe der Normalverteilung mit dem Mittelwert \(\mu = p n\) und der Standardabweichung \(\sigma = \sqrt{n p (1 - p)}\) an, wobei \(p = 0.5\) die Wahrscheinlichkeit für Kopf und \(n=100\) die Anzahl der Würfe ist. Die Wahrscheinlichkeit für \(x=45\) Köpfe kann als die kumulative Verteilungsfunktion \(F(x)\) dieser Normalverteilung approximiert werden. Genauer gesagt:

\[F(x; \mu, \sigma) = \frac{1}{2} \left[ 1 + \mbox{erf} \left( \frac{x-\mu}{\sigma \sqrt{2}} \right) \right]\]
>>> # Kyle's Analytical Approach
>>> mean = p*n
>>> std = math.sqrt(n*p*(1-p))
>>> # CDF of the normal distribution. (Unfortunately, Kyle forgets a continuity correction that would produce a more accurate answer.)
>>> prob = 0.5 * (1 + math.erf((x - mean) / (std * math.sqrt(2))))
>>> print(f"The normal approximation estimates the probability as {prob:.3f}")
The normal approximation estimates the probability as 0.159

Sie sind etwas praktischer veranlagt und entscheiden sich für einen rechnerischen Ansatz (oder genauer gesagt, einen Monte-Carlo-Ansatz): Simulieren Sie einfach viele Münzwurfsequenzen, zählen Sie die Anzahl der Köpfe in jeder Sequenz und schätzen Sie die Wahrscheinlichkeit als den Anteil der Sequenzen, in denen die Zählung 45 nicht überschreitet.

>>> # Your Monte Carlo Approach
>>> N = 100000  # We'll do 100000 trials, each with 100 flips
>>> rng = np.random.default_rng()  # use the "new" Generator interface
>>> simulation = rng.random(size=(n, N)) < p  # False for tails, True for heads
>>> counts = np.sum(simulation, axis=0)  # count the number of heads each trial
>>> prob = np.sum(counts <= x) / N  # estimate the probability as the observed proportion of cases in which the count did not exceed 45
>>> print(f"The Monte Carlo approach estimates the probability as {prob:.3f}")
The Monte Carlo approach estimates the probability as 0.187

Der Dämon antwortet:

Sie liegen beide falsch. Die Wahrscheinlichkeit wird durch die Binomialverteilung gegeben. Genauer gesagt:

\[\sum_{i=0}^{x} {n \choose i} p^i (1-p)^{n-i}\]
>>> # The Demon's Exact Probability
>>> from scipy.stats import binom
>>> prob = binom.cdf(x, n, p)
>>> print(f"The correct answer is approximately {prob}")
The correct answer is approximately 0.18410080866334788

Während Ihre Seele gefressen wird, trösten Sie sich mit dem Wissen, dass Ihr einfacher Monte-Carlo-Ansatz genauer war als Kyles Normalapproximation. Das ist nicht ungewöhnlich: Wenn eine exakte Antwort unbekannt ist, ist oft eine rechnerische Approximation genauer als eine analytische Approximation. Außerdem ist es für Dämonen einfach, Fragen zu erfinden, für die analytische Approximationen (ganz zu schweigen von exakten Antworten) nicht verfügbar sind. In solchen Fällen ist ein rechnerischer Ansatz der einzige Weg.

Tutorials zu Resampling und Monte-Carlo-Methoden#

Obwohl es am besten ist, einen exakten Ansatz zu verwenden, wenn dieser verfügbar ist, kann das Erlernen von rechnerischen Statistiktechniken die Genauigkeit von scipy.stats-Funktionen, die auf analytischen Approximationen beruhen, verbessern, Ihre statistischen Analysemöglichkeiten erheblich erweitern und sogar Ihr Verständnis der Statistik vertiefen. Die folgenden Tutorials helfen Ihnen beim Einstieg in die Resampling- und Monte-Carlo-Methoden in scipy.stats.

  1. Monte-Carlo-Hypothesentests

  2. Permutationstests

    1. Permutationstests für unabhängige Stichproben

    2. Permutationstests für gepaarte Stichproben

    3. Permutationstests für korrelierte Stichproben

  3. The Bootstrap