quantile_test#
- scipy.stats.quantile_test(x, *, q=0, p=0.5, alternative='two-sided')[Quelle]#
Führt einen Quantiltest durch und berechnet ein Konfidenzintervall für das Quantil.
Diese Funktion testet die Nullhypothese, dass q der Wert des Quantils mit der Wahrscheinlichkeit p der zugrunde liegenden Population der Stichprobe x ist. Zum Beispiel wird mit den Standardparametern getestet, dass der Median der zugrunde liegenden Population von x Null ist. Die Funktion gibt ein Objekt zurück, das die Teststatistik, einen p-Wert und eine Methode zur Berechnung des Konfidenzintervalls um das Quantil enthält.
- Parameter:
- xarray_like
Eine eindimensionale Stichprobe.
- qfloat, Standard: 0
Der hypothetische Wert des Quantils.
- pfloat, Standard: 0.5
Die Wahrscheinlichkeit, die mit dem Quantil verbunden ist; d.h. der Anteil der Population, der kleiner als q ist, beträgt p. Muss strikt zwischen 0 und 1 liegen.
- alternative{‘zweiseitig’, ‘kleiner’, ‘größer’}, optional
Definiert die alternative Hypothese. Die folgenden Optionen sind verfügbar (Standard ist ‚two-sided‘)
„two-sided“: Das Quantil, das mit der Wahrscheinlichkeit p verbunden ist, ist nicht q.
„less“: Das Quantil, das mit der Wahrscheinlichkeit p verbunden ist, ist kleiner als q.
„greater“: Das Quantil, das mit der Wahrscheinlichkeit p verbunden ist, ist größer als q.
- Rückgabe:
- resultQuantileTestResult
Ein Objekt mit den folgenden Attributen
- statisticfloat
Eine von zwei Teststatistiken, die im Quantiltest verwendet werden können. Die erste Teststatistik,
T1, ist der Anteil der Stichproben in x, die kleiner oder gleich dem hypothetischen Quantil q sind. Die zweite Teststatistik,T2, ist der Anteil der Stichproben in x, die strikt kleiner als das hypothetische Quantil q sind.Wenn
alternative = 'greater', wirdT1zur Berechnung des p-Werts verwendet undstatisticwird aufT1gesetzt.Wenn
alternative = 'less', wirdT2zur Berechnung des p-Werts verwendet undstatisticwird aufT2gesetzt.Wenn
alternative = 'two-sided', werden sowohlT1als auchT2berücksichtigt, und diejenige, die zu dem kleinsten p-Wert führt, wird verwendet.- statistic_typeint
Entweder 1 oder 2, abhängig davon, welche von
T1oderT2zur Berechnung des p-Werts verwendet wurde.- pvaluefloat
Der p-Wert, der mit der angegebenen Alternative verbunden ist.
Das Objekt hat auch die folgende Methode
- confidence_interval(confidence_level=0.95)
Berechnet ein Konfidenzintervall für das Populationsquantil, das mit der Wahrscheinlichkeit p verbunden ist. Das Konfidenzintervall wird in einem
namedtuplemit den Feldern low und high zurückgegeben. Werte sind nan, wenn nicht genügend Beobachtungen vorhanden sind, um das Konfidenzintervall bei gewünschtem Konfidenzlevel zu berechnen.
Hinweise
Dieser Test und seine Methode zur Berechnung von Konfidenzintervallen sind nichtparametrisch. Sie sind gültig, wenn und nur wenn die Beobachtungen i.i.d. sind.
Die Implementierung des Tests folgt Conover [1]. Es werden zwei Teststatistiken berücksichtigt.
T1: Die Anzahl der Beobachtungen in x, die kleiner oder gleich q sind.T1 = (x <= q).sum()T2: Die Anzahl der Beobachtungen in x, die strikt kleiner als q sind.T2 = (x < q).sum()Die Verwendung von zwei Teststatistiken ist notwendig, um die Möglichkeit zu berücksichtigen, dass x aus einer diskreten oder gemischten Verteilung generiert wurde.
Die Nullhypothese für den Test lautet
H0: Das \(p^{\mathrm{th}}\)-Quantil der Population ist q.
und die Nullverteilung für jede Teststatistik ist \(\mathrm{binom}\left(n, p\right)\). Wenn
alternative='less', lautet die AlternativhypotheseH1: Das \(p^{\mathrm{th}}\)-Quantil der Population ist kleiner als q.
und der p-Wert ist die Wahrscheinlichkeit, dass die binomiale Zufallsvariable
\[Y \sim \mathrm{binom}\left(n, p\right)\]größer oder gleich dem beobachteten Wert
T2ist.Wenn
alternative='greater', lautet die AlternativhypotheseH1: Das \(p^{\mathrm{th}}\)-Quantil der Population ist größer als q
und der p-Wert ist die Wahrscheinlichkeit, dass die binomiale Zufallsvariable Y kleiner oder gleich dem beobachteten Wert
T1ist.Wenn
alternative='two-sided', lautet die AlternativhypotheseH1: q ist nicht das \(p^{\mathrm{th}}\)-Quantil der Population.
und der p-Wert ist das Doppelte des kleineren der p-Werte für die Fälle
'less'und'greater'. Beide dieser p-Werte können für dieselben Daten 0,5 überschreiten, daher wird der Wert auf das Intervall \([0, 1]\) gekürzt.Der Ansatz für Konfidenzintervalle wird Thompson [2] zugeschrieben und später als anwendbar auf beliebige Mengen von i.i.d. Stichproben erwiesen [3]. Die Berechnung basiert auf der Beobachtung, dass die Wahrscheinlichkeit, dass ein Quantil \(q\) größer ist als jede Beobachtung \(x_m (1\leq m \leq N)\), berechnet werden kann als
\[\mathbb{P}(x_m \leq q) = 1 - \sum_{k=0}^{m-1} \binom{N}{k} q^k(1-q)^{N-k}\]Standardmäßig werden Konfidenzintervalle für ein Konfidenzniveau von 95% berechnet. Eine übliche Interpretation von 95%-Konfidenzintervallen ist, dass, wenn i.i.d. Stichproben wiederholt aus derselben Population gezogen und jedes Mal Konfidenzintervalle gebildet werden, das Konfidenzintervall den wahren Wert des angegebenen Quantils in ungefähr 95% der Versuche enthalten wird.
Eine ähnliche Funktion ist im R-Paket QuantileNPCI verfügbar [4]. Die Grundlage ist dieselbe, aber es berechnet die Grenzen des Konfidenzintervalls durch Interpolation zwischen den Stichprobenwerten, während diese Funktion nur Stichprobenwerte als Grenzen verwendet. Daher gibt
quantile_test.confidence_intervalkonservativere Intervalle zurück (d.h. größere).Dieselbe Berechnung von Konfidenzintervallen für Quantile ist im Paket confintr enthalten [5].
Zweiseitige Konfidenzintervalle sind nicht garantiert optimal; d.h. es kann ein engeres Intervall geben, das den interessierenden Quantil mit einer Wahrscheinlichkeit größer als das Konfidenzniveau enthält. Ohne weitere Annahmen über die Stichproben (z.B. die Art der zugrunde liegenden Verteilung) sind die einseitigen Intervalle optimal eng.
Referenzen
[1]Conover. Practical Nonparametric Statistics, 3rd Ed. 1999.
[2]W. R. Thompson, „On Confidence Ranges for the Median and Other Expectation Distributions for Populations of Unknown Distribution Form,“ The Annals of Mathematical Statistics, vol. 7, no. 3, pp. 122-128, 1936, Accessed: Sep. 18, 2019. [Online]. Available: https://www.jstor.org/stable/2957563.
[3]H. A. David und H. N. Nagaraja, „Order Statistics in Nonparametric Inference“ in Order Statistics, John Wiley & Sons, Ltd, 2005, pp. 159-170. Available: https://onlinelibrary.wiley.com/doi/10.1002/0471722162.ch7.
[4]N. Hutson, A. Hutson, L. Yan, „QuantileNPCI: Nonparametric Confidence Intervals for Quantiles,“ R package, https://cran.r-project.org/package=QuantileNPCI
[5]M. Mayer, „confintr: Confidence Intervals,“ R package, https://cran.r-project.org/package=confintr
Beispiele
Angenommen, wir möchten die Nullhypothese testen, dass der Median einer Population gleich 0,5 ist. Wir wählen ein Konfidenzniveau von 99 %; das heißt, wir verwerfen die Nullhypothese zugunsten der Alternative, wenn der p-Wert kleiner als 0,01 ist.
Beim Testen von Zufallsvariablen aus der Standardgleichverteilung, deren Median 0,5 beträgt, erwarten wir, dass die Daten die meiste Zeit mit der Nullhypothese übereinstimmen.
>>> import numpy as np >>> from scipy import stats >>> rng = np.random.default_rng() >>> rvs = stats.uniform.rvs(size=100, random_state=rng) >>> stats.quantile_test(rvs, q=0.5, p=0.5) QuantileTestResult(statistic=45, statistic_type=1, pvalue=0.36820161732669576)
Wie erwartet liegt der p-Wert nicht unter unserem Schwellenwert von 0,01, sodass wir die Nullhypothese nicht verwerfen können.
Beim Testen von Daten aus der Standard-*Normalverteilung*, deren Median 0 ist, würden wir erwarten, dass die Nullhypothese verworfen wird.
>>> rvs = stats.norm.rvs(size=100, random_state=rng) >>> stats.quantile_test(rvs, q=0.5, p=0.5) QuantileTestResult(statistic=67, statistic_type=2, pvalue=0.0008737198369123724)
Tatsächlich ist der p-Wert niedriger als unser Schwellenwert von 0,01, sodass wir die Nullhypothese zugunsten der Standardalternative „two-sided“ verwerfen: Der Median der Population ist *nicht* gleich 0,5.
Angenommen, wir würden jedoch die Nullhypothese gegen die einseitige Alternative testen, dass der Median der Population *größer* als 0,5 ist. Da der Median der Standardnormalverteilung kleiner als 0,5 ist, würden wir nicht erwarten, dass die Nullhypothese verworfen wird.
>>> stats.quantile_test(rvs, q=0.5, p=0.5, alternative='greater') QuantileTestResult(statistic=67, statistic_type=1, pvalue=0.9997956114162866)
Wen wundert es, dass wir bei einem p-Wert größer als unserem Schwellenwert die Nullhypothese zugunsten der gewählten Alternative nicht verwerfen würden.
Der Quantiltest kann für jedes Quantil verwendet werden, nicht nur für den Median. Zum Beispiel können wir testen, ob das dritte Quartil der zugrunde liegenden Verteilung der Stichprobe größer als 0,6 ist.
>>> rvs = stats.uniform.rvs(size=100, random_state=rng) >>> stats.quantile_test(rvs, q=0.6, p=0.75, alternative='greater') QuantileTestResult(statistic=64, statistic_type=1, pvalue=0.00940696592998271)
Der p-Wert ist niedriger als der Schwellenwert. Wir verwerfen die Nullhypothese zugunsten der Alternative: Das dritte Quartil der zugrunde liegenden Verteilung unserer Stichprobe ist größer als 0,6.
quantile_testkann auch Konfidenzintervalle für jedes Quantil berechnen.>>> rvs = stats.norm.rvs(size=100, random_state=rng) >>> res = stats.quantile_test(rvs, q=0.6, p=0.75) >>> ci = res.confidence_interval(confidence_level=0.95) >>> ci ConfidenceInterval(low=0.284491604437432, high=0.8912531024914844)
Beim Testen einer einseitigen Alternative enthält das Konfidenzintervall alle Beobachtungen, sodass, wenn sie als q übergeben werden, der p-Wert des Tests größer als 0,05 wäre und daher die Nullhypothese nicht verworfen würde. Zum Beispiel
>>> rvs.sort() >>> q, p, alpha = 0.6, 0.75, 0.95 >>> res = stats.quantile_test(rvs, q=q, p=p, alternative='less') >>> ci = res.confidence_interval(confidence_level=alpha) >>> for x in rvs[rvs <= ci.high]: ... res = stats.quantile_test(rvs, q=x, p=p, alternative='less') ... assert res.pvalue > 1-alpha >>> for x in rvs[rvs > ci.high]: ... res = stats.quantile_test(rvs, q=x, p=p, alternative='less') ... assert res.pvalue < 1-alpha
Auch wenn ein 95%-Konfidenzintervall wiederholt für Zufallsstichproben generiert wird, wird das Konfidenzintervall den wahren Quantilwert in ungefähr 95% der Wiederholungen enthalten.
>>> dist = stats.rayleigh() # our "unknown" distribution >>> p = 0.2 >>> true_stat = dist.ppf(p) # the true value of the statistic >>> n_trials = 1000 >>> quantile_ci_contains_true_stat = 0 >>> for i in range(n_trials): ... data = dist.rvs(size=100, random_state=rng) ... res = stats.quantile_test(data, p=p) ... ci = res.confidence_interval(0.95) ... if ci[0] < true_stat < ci[1]: ... quantile_ci_contains_true_stat += 1 >>> quantile_ci_contains_true_stat >= 950 True
Dies funktioniert mit jeder Verteilung und jedem Quantil, solange die Stichproben i.i.d. sind.