scipy.stats.

wilcoxon#

scipy.stats.wilcoxon(x, y=None, zero_method='wilcox', correction=False, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[Quelle]#

Berechnet den Wilcoxon-Vorzeichen-Rang-Test.

Der Wilcoxon-Vorzeichen-Rang-Test prüft die Nullhypothese, dass zwei verwandte gepaarte Stichproben aus derselben Verteilung stammen. Insbesondere prüft er, ob die Verteilung der Differenzen x - y symmetrisch um Null ist. Es handelt sich um eine nichtparametrische Version des gepaarten T-Tests.

Parameter:
xarray_like

Entweder die erste Messreihe (in diesem Fall ist y die zweite Messreihe) oder die Differenzen zwischen zwei Messreihen (in diesem Fall ist y nicht anzugeben.) Muss eindimensional sein.

yarray_like, optional

Entweder die zweite Messreihe (wenn x die erste Messreihe ist) oder nicht angegeben (wenn x die Differenzen zwischen zwei Messreihen ist.) Muss eindimensional sein.

Warnung

Wenn y angegeben ist, berechnet wilcoxon die Teststatistik basierend auf den Rängen der absoluten Werte von d = x - y. Rundungsfehler bei der Subtraktion können dazu führen, dass Elemente von d unterschiedliche Ränge erhalten, auch wenn sie bei exakter Arithmetik gleich wären. Anstatt x und y separat zu übergeben, sollten Sie die Differenz x - y berechnen, bei Bedarf runden, um sicherzustellen, dass nur wirklich eindeutige Elemente numerisch unterscheidbar sind, und das Ergebnis als x übergeben, während y auf dem Standardwert (None) bleibt.

zero_method{„wilcox“, „pratt“, „zsplit“}, optional

Es gibt verschiedene Konventionen für den Umgang mit Paaren von Beobachtungen mit gleichen Werten („Null-Differenzen“ oder „Nullen“).

  • „wilcox“: Verwirft alle Null-Differenzen (Standard); siehe [4].

  • „pratt“: Berücksichtigt Null-Differenzen im Rangbildungsprozess, verwirft aber die Ränge der Nullen (konservativer); siehe [3]. In diesem Fall wird die Normalapproximation wie in [5] angepasst.

  • „zsplit“: Berücksichtigt Null-Differenzen im Rangbildungsprozess und teilt den Null-Rang zwischen positiven und negativen.

correctionbool, optional

Wenn True, wird eine Stetigkeitskorrektur angewendet, indem die Wilcoxon-Rangstatistik um 0,5 in Richtung des Mittelwerts angepasst wird, wenn die z-Statistik berechnet wird und eine Normalapproximation verwendet wird. Standard ist False.

alternative{„two-sided“, „greater“, „less“}, optional

Definiert die Alternativhypothese. Standard ist „two-sided“. Im Folgenden repräsentiert d die Differenz zwischen den gepaarten Stichproben: d = x - y, wenn sowohl x als auch y angegeben sind, oder d = x andernfalls.

  • „two-sided“: Die zugrundeliegende Verteilung von d ist nicht symmetrisch um Null.

  • „less“: Die zugrundeliegende Verteilung von d ist stochastisch kleiner als eine Verteilung, die symmetrisch um Null ist.

  • „greater“: Die zugrundeliegende Verteilung von d ist stochastisch größer als eine Verteilung, die symmetrisch um Null ist.

method{„auto“, „exact“, „asymptotic“} oder PermutationMethod Instanz, optional

Methode zur Berechnung des p-Wertes, siehe Hinweise. Standard ist „auto“.

axisint oder None, Standard: 0

Wenn es sich um eine ganze Zahl handelt, ist dies die Achse des Eingabearrays, entlang der die Statistik berechnet wird. Die Statistik jedes Achsen-Slices (z. B. Zeile) der Eingabe erscheint dann in einem entsprechenden Element der Ausgabe. Wenn None, wird die Eingabe vor der Berechnung der Statistik geglättet.

nan_policy{‘propagate’, ‘omit’, ‘raise’}

Definiert, wie Eingabe-NaNs behandelt werden.

  • propagate: Wenn ein NaN in der Achsen-Slice (z. B. Zeile) vorhanden ist, entlang der die Statistik berechnet wird, wird der entsprechende Eintrag der Ausgabe NaN sein.

  • omit: NaNs werden bei der Berechnung weggelassen. Wenn im Achsen-Slice, entlang dem die Statistik berechnet wird, nicht genügend Daten verbleiben, wird der entsprechende Eintrag der Ausgabe NaN sein.

  • raise: Wenn ein NaN vorhanden ist, wird ein ValueError ausgelöst.

keepdimsbool, Standard: False

Wenn dies auf True gesetzt ist, bleiben die reduzierten Achsen im Ergebnis als Dimensionen mit der Größe eins erhalten. Mit dieser Option wird das Ergebnis korrekt gegen das Eingabearray gestreut (broadcasted).

Rückgabe:
Ein Objekt mit den folgenden Attributen.
statisticarray_like

Wenn alternative „two-sided“ ist, die Summe der Ränge der Differenzen über oder unter Null, je nachdem, welche kleiner ist. Andernfalls die Summe der Ränge der Differenzen über Null.

pvaluearray_like

Der p-Wert für den Test, abhängig von alternative und method.

zstatisticarray_like

Wenn method = 'asymptotic', ist dies die normalisierte z-Statistik

z = (T - mn - d) / se

wobei T die statistic wie oben definiert ist, mn der Mittelwert der Verteilung unter der Nullhypothese ist, d eine Stetigkeitskorrektur ist und se der Standardfehler ist. Wenn method != 'asymptotic', ist dieses Attribut nicht verfügbar.

Siehe auch

kruskal, mannwhitneyu

Hinweise

Im Folgenden repräsentiert d die Differenz zwischen den gepaarten Stichproben: d = x - y, wenn sowohl x als auch y angegeben sind, oder d = x andernfalls. Angenommen, alle Elemente von d sind unabhängige und identisch verteilte Beobachtungen, und alle sind verschieden und ungleich Null.

  • Wenn len(d) ausreichend groß ist, ist die Nullverteilung der normalisierten Teststatistik (zstatistic oben) annähernd normal, und method = 'asymptotic' kann zur Berechnung des p-Wertes verwendet werden.

  • Wenn len(d) klein ist, ist die Normalapproximation möglicherweise nicht genau, und method='exact' wird bevorzugt (auf Kosten zusätzlicher Ausführungszeit).

  • Der Standardwert method='auto' wählt zwischen den beiden: method='exact' wird verwendet, wenn len(d) <= 50, und method='asymptotic' wird andernfalls verwendet.

Das Vorhandensein von „Bindungen“ (d.h. nicht alle Elemente von d sind eindeutig) oder „Nullen“ (d.h. Elemente von d sind Null) verändert die Nullverteilung der Teststatistik, und method='exact' berechnet nicht mehr den exakten p-Wert. Wenn method='asymptotic', wird die z-Statistik zur genaueren Vergleich mit der Standardnormalverteilung angepasst, aber auch hier ist für endliche Stichprobengrößen die Standardnormalverteilung nur eine Annäherung an die tatsächliche Nullverteilung der z-Statistik. Für solche Situationen akzeptiert der Parameter method auch Instanzen von PermutationMethod. In diesem Fall wird der p-Wert mithilfe von permutation_test mit den angegebenen Konfigurationsoptionen und anderen geeigneten Einstellungen berechnet.

Das Vorhandensein von Bindungen und Nullen beeinflusst die Auflösung von method='auto' entsprechend: Exhaustive Permutationen werden durchgeführt, wenn len(d) <= 13, andernfalls wird die asymptotische Methode verwendet. Beachten Sie, dass die asymptotische Methode auch für len(d) > 14 möglicherweise nicht sehr genau ist; die Schwelle wurde als Kompromiss zwischen Ausführungszeit und Genauigkeit unter der Bedingung gewählt, dass die Ergebnisse deterministisch sein müssen. Erwägen Sie die manuelle Angabe einer Instanz von PermutationMethod und die Wahl des Parameters n_resamples, um Zeitbeschränkungen und Genauigkeitsanforderungen auszubalancieren.

Bitte beachten Sie auch, dass im Ausnahmefall, dass alle Elemente von d Null sind, der p-Wert, der auf der Normalapproximation basiert, nicht berechnet werden kann (NaN), wenn zero_method='wilcox' oder zero_method='pratt'.

Seit SciPy 1.9 werden np.matrix-Eingaben (für neuen Code nicht empfohlen) vor der Berechnung in np.ndarray konvertiert. In diesem Fall ist die Ausgabe eine Skalar- oder np.ndarray mit geeigneter Form anstelle eines 2D-np.matrix. Ebenso werden, während maskierte Elemente von Masked Arrays ignoriert werden, die Ausgabe eine Skalar- oder np.ndarray anstelle eines Masked Arrays mit mask=False sein.

Referenzen

[2]

Conover, W.J., Practical Nonparametric Statistics, 1971.

[3]

Pratt, J.W., Remarks on Zeros and Ties in the Wilcoxon Signed Rank Procedures, Journal of the American Statistical Association, Vol. 54, 1959, pp. 655-667. DOI:10.1080/01621459.1959.10501526

[4] (1,2)

Wilcoxon, F., Individual Comparisons by Ranking Methods, Biometrics Bulletin, Vol. 1, 1945, pp. 80-83. DOI:10.2307/3001968

[5]

Cureton, E.E., The Normal Approximation to the Signed-Rank Sampling Distribution When Zero Differences are Present, Journal of the American Statistical Association, Vol. 62, 1967, pp. 1068-1069. DOI:10.1080/01621459.1967.10500917

Beispiele

In [4] werden die Höhenunterschiede zwischen kreuz- und selbstbestäubten Maispflanzen wie folgt angegeben:

>>> d = [6, 8, 14, 16, 23, 24, 28, 29, 41, -48, 49, 56, 60, -67, 75]

Kreuzbestäubte Pflanzen scheinen höher zu sein. Um die Nullhypothese zu testen, dass kein Höhenunterschied besteht, können wir den zweiseitigen Test anwenden

>>> from scipy.stats import wilcoxon
>>> res = wilcoxon(d)
>>> res.statistic, res.pvalue
(24.0, 0.041259765625)

Daher würden wir die Nullhypothese bei einem Konfidenzniveau von 5% ablehnen und schlussfolgern, dass es einen Höhenunterschied zwischen den Gruppen gibt. Um zu bestätigen, dass der Median der Differenzen als positiv angenommen werden kann, verwenden wir

>>> res = wilcoxon(d, alternative='greater')
>>> res.statistic, res.pvalue
(96.0, 0.0206298828125)

Dies zeigt, dass die Nullhypothese, dass der Median negativ ist, bei einem Konfidenzniveau von 5% zugunsten der Alternative, dass der Median größer als Null ist, abgelehnt werden kann. Die obigen p-Werte sind exakt. Die Verwendung der Normalapproximation ergibt sehr ähnliche Werte

>>> res = wilcoxon(d, method='asymptotic')
>>> res.statistic, res.pvalue
(24.0, 0.04088813291185591)

Beachten Sie, dass sich die Statistik im einseitigen Fall auf 96 geändert hat (die Summe der Ränge der positiven Differenzen), während sie im zweiseitigen Fall 24 ist (das Minimum der Summe der Ränge über und unter Null).

Im obigen Beispiel werden die Höhenunterschiede zwischen gepaarten Pflanzen direkt an wilcoxon übergeben. Alternativ akzeptiert wilcoxon zwei Stichproben gleicher Länge, berechnet die Differenzen zwischen gepaarten Elementen und führt dann den Test durch. Betrachten Sie die Stichproben x und y

>>> import numpy as np
>>> x = np.array([0.5, 0.825, 0.375, 0.5])
>>> y = np.array([0.525, 0.775, 0.325, 0.55])
>>> res = wilcoxon(x, y, alternative='greater')
>>> res
WilcoxonResult(statistic=5.0, pvalue=0.5625)

Beachten Sie, dass der Test bei manueller Berechnung der Differenzen andere Ergebnisse liefern würde

>>> d = [-0.025, 0.05, 0.05, -0.05]
>>> ref = wilcoxon(d, alternative='greater')
>>> ref
WilcoxonResult(statistic=6.0, pvalue=0.5)

Der wesentliche Unterschied liegt am Rundungsfehler in den Ergebnissen von x-y

>>> d - (x-y)
array([2.08166817e-17, 6.93889390e-17, 1.38777878e-17, 4.16333634e-17])

Obwohl wir erwartet hätten, dass alle Elemente von (x-y)[1:] den gleichen Betrag 0.05 haben, haben sie in der Praxis leicht unterschiedliche Beträge und erhalten daher im Test unterschiedliche Ränge. Vor der Durchführung des Tests sollten Sie d berechnen und es bei Bedarf anpassen, um sicherzustellen, dass theoretisch identische Werte nicht numerisch unterscheidbar sind. Zum Beispiel

>>> d2 = np.around(x - y, decimals=3)
>>> wilcoxon(d2, alternative='greater')
WilcoxonResult(statistic=6.0, pvalue=0.5)