scipy.stats.

monte_carlo_test#

scipy.stats.monte_carlo_test(data, rvs, statistic, *, vectorized=None, n_resamples=9999, batch=None, alternative='two-sided', axis=0)[Quelle]#

Führt einen Monte-Carlo-Hypothesentest durch.

data enthält eine Stichprobe oder eine Sequenz von einer oder mehreren Stichproben. rvs gibt die Verteilung(en) der Stichprobe(n) in data unter der Nullhypothese an. Der Wert von statistic für die gegebene data wird mit einer Monte-Carlo-Nullverteilung verglichen: dem Wert der Statistik für jede der n_resamples durch Verwendung von rvs erzeugten Stichprobenmengen. Dies ergibt den p-Wert, die Wahrscheinlichkeit, einen so extremen Wert der Teststatistik unter der Nullhypothese zu beobachten.

Parameter:
dataarray-ähnlich oder Sequenz von array-ähnlich

Ein Array oder eine Sequenz von Arrays mit Beobachtungen.

rvsaufrufbar oder Tupel von aufrufbaren

Eine aufrufbare oder Sequenz von aufrufbaren, die Zufallsvariaten unter der Nullhypothese erzeugt. Jedes Element von rvs muss ein aufrufbares Objekt sein, das das Schlüsselwortargument size akzeptiert (z. B. rvs(size=(m, n))) und eine N-dimensionale Stichprobe dieser Form zurückgibt. Wenn rvs eine Sequenz ist, muss die Anzahl der aufrufbaren Elemente in rvs mit der Anzahl der Stichproben in data übereinstimmen, d. h. len(rvs) == len(data). Wenn rvs ein einzelnes aufrufbares Objekt ist, wird data als einzelne Stichprobe behandelt.

statisticaufrufbar

Statistik, für die der p-Wert des Hypothesentests berechnet werden soll. statistic muss ein aufrufbares Objekt sein, das eine Stichprobe akzeptiert (z. B. statistic(sample)) oder len(rvs) separate Stichproben (z. B. statistic(samples1, sample2) wenn rvs zwei aufrufbare Elemente enthält und data zwei Stichproben enthält) und die resultierende Statistik zurückgibt. Wenn vectorized auf True gesetzt ist, muss statistic auch ein Schlüsselwortargument axis akzeptieren und vektorisiert sein, um die Statistik entlang der bereitgestellten axis der Stichproben in data zu berechnen.

vectorizedbool, optional

Wenn vectorized auf False gesetzt ist, wird statistic nicht das Schlüsselwortargument axis übergeben und es wird erwartet, dass die Statistik nur für 1D-Stichproben berechnet wird. Wenn True, wird statistic das Schlüsselwortargument axis übergeben und es wird erwartet, dass die Statistik entlang von axis berechnet wird, wenn ND-Stichprobenarrays übergeben werden. Wenn None (Standard), wird vectorized auf True gesetzt, wenn axis ein Parameter von statistic ist. Die Verwendung einer vektorisierten Statistik reduziert typischerweise die Rechenzeit.

n_resamplesint, Standard: 9999

Anzahl der Stichproben, die von jedem der aufrufbaren Elemente von rvs gezogen werden. Äquivalent dazu ist die Anzahl der Statistikwerte unter der Nullhypothese, die als Monte-Carlo-Nullverteilung verwendet werden.

batchint, optional

Die Anzahl der Monte-Carlo-Stichproben, die in jedem Aufruf von statistic verarbeitet werden. Der Speicherverbrauch beträgt O( batch * sample.size[axis] ). Standard ist None, in diesem Fall ist batch gleich n_resamples.

alternative{‘two-sided’, ‘less’, ‘greater’}

Die alternative Hypothese, für die der p-Wert berechnet wird. Für jede Alternative ist der p-Wert wie folgt definiert.

  • 'greater' : der Prozentsatz der Nullverteilung, der größer oder gleich dem beobachteten Wert der Teststatistik ist.

  • 'less' : der Prozentsatz der Nullverteilung, der kleiner oder gleich dem beobachteten Wert der Teststatistik ist.

  • 'two-sided' : das Doppelte des kleineren der obigen p-Werte.

axisint, Standard: 0

Die Achse von data (oder jeder Stichprobe innerhalb von data), über die die Statistik berechnet werden soll.

Rückgabe:
resMonteCarloTestResult

Ein Objekt mit den Attributen

statisticfloat oder ndarray

Der Teststatistik des beobachteten data.

pvaluefloat oder ndarray

Der p-Wert für die gegebene Alternative.

null_distributionndarray

Die Werte der Teststatistik, die unter der Nullhypothese generiert wurden.

Warnung

Der p-Wert wird berechnet, indem die Elemente der Nullverteilung gezählt werden, die so extrem oder extremer als der beobachtete Wert der Statistik sind. Aufgrund der Verwendung von Gleitkommaarithmetik mit endlicher Genauigkeit geben einige Statistikfunktionen numerisch unterschiedliche Werte zurück, wenn die theoretischen Werte exakt gleich wären. In einigen Fällen könnte dies zu einem großen Fehler im berechneten p-Wert führen. monte_carlo_test schützt dagegen, indem Elemente in der Nullverteilung, die „nahe“ (innerhalb einer relativen Toleranz von dem 100-fachen des Gleitkomma-Epsilon von ungenauen Datentypen) am beobachteten Wert der Teststatistik liegen, als gleich dem beobachteten Wert der Teststatistik betrachtet werden. Dem Benutzer wird jedoch geraten, die Nullverteilung zu überprüfen, um festzustellen, ob diese Vergleichsmethode angemessen ist, und, falls nicht, den p-Wert manuell zu berechnen.

Referenzen

[1]

B. Phipson und G. K. Smyth. „Permutation P-values Should Never Be Zero: Calculating Exact P-values When Permutations Are Randomly Drawn.“ Statistical Applications in Genetics and Molecular Biology 9.1 (2010).

Beispiele

Angenommen, wir möchten testen, ob eine kleine Stichprobe aus einer Normalverteilung gezogen wurde. Wir entscheiden uns, die Schiefe der Stichprobe als Teststatistik zu verwenden, und wir werden einen p-Wert von 0,05 als statistisch signifikant betrachten.

>>> import numpy as np
>>> from scipy import stats
>>> def statistic(x, axis):
...     return stats.skew(x, axis)

Nachdem wir unsere Daten gesammelt haben, berechnen wir den beobachteten Wert der Teststatistik.

>>> rng = np.random.default_rng()
>>> x = stats.skewnorm.rvs(a=1, size=50, random_state=rng)
>>> statistic(x, axis=0)
0.12457412450240658

Um die Wahrscheinlichkeit zu bestimmen, einen solch extremen Wert der Schiefe zufällig zu beobachten, wenn die Stichprobe aus der Normalverteilung gezogen worden wäre, können wir einen Monte-Carlo-Hypothesentest durchführen. Der Test wird viele Stichproben zufällig aus ihrer Normalverteilung ziehen, die Schiefe jeder Stichprobe berechnen und unsere ursprüngliche Schiefe mit dieser Verteilung vergleichen, um einen ungefähren p-Wert zu ermitteln.

>>> from scipy.stats import monte_carlo_test
>>> # because our statistic is vectorized, we pass `vectorized=True`
>>> rvs = lambda size: stats.norm.rvs(size=size, random_state=rng)
>>> res = monte_carlo_test(x, rvs, statistic, vectorized=True)
>>> print(res.statistic)
0.12457412450240658
>>> print(res.pvalue)
0.7012

Die Wahrscheinlichkeit, eine Teststatistik kleiner oder gleich dem beobachteten Wert unter der Nullhypothese zu erhalten, beträgt ~70%. Dies ist größer als unser gewählter Schwellenwert von 5%, daher können wir dies nicht als signifikanten Beweis gegen die Nullhypothese betrachten.

Beachten Sie, dass dieser p-Wert im Wesentlichen dem von scipy.stats.skewtest entspricht, der auf einer asymptotischen Verteilung einer Teststatistik basiert, die auf der Stichprobenschiefe beruht.

>>> stats.skewtest(x).pvalue
0.6892046027110614

Diese asymptotische Annäherung ist für kleine Stichprobengrößen nicht gültig, aber monte_carlo_test kann mit Stichproben beliebiger Größe verwendet werden.

>>> x = stats.skewnorm.rvs(a=1, size=7, random_state=rng)
>>> # stats.skewtest(x) would produce an error due to small sample
>>> res = monte_carlo_test(x, rvs, statistic, vectorized=True)

Die Monte-Carlo-Verteilung der Teststatistik wird für weitere Untersuchungen bereitgestellt.

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ax.hist(res.null_distribution, bins=50)
>>> ax.set_title("Monte Carlo distribution of test statistic")
>>> ax.set_xlabel("Value of Statistic")
>>> ax.set_ylabel("Frequency")
>>> plt.show()
../../_images/scipy-stats-monte_carlo_test-1.png