1 Ziel des WilcoxonTest in R
Der Wilcoxon-Test ist ein nicht parametrischer Mittelwertvergleich bei 2 abhängigen Stichproben. Er verwendet Ränge statt die tatsächlichen Werte und ist das Gegenstück zum t-Test bei abhängigen Stichproben, allerdings hat er nicht solche strengen Voraussetzungen.
2 Voraussetzungen des Wilcoxon-Test in R
- zwei voneinander abhängige Stichproben/Gruppen
- ordinal oder metrisch skalierte y-Variable
- normalverteilte y-Variable innerhalb der Gruppen nicht nötig
3 Nullhypothese
Die Nullhyopthese beim Wilcoxon-Test für abhängige Stichproben geht davon aus, dass gleiche zentrale Tendenzen zu den zwei Zeitpunkten existieren. In Worten, die häufig beim t-Test verwendet werden: in etwa Gleichheit der Mittelwerte zu beiden Zeitpunkten.
Ihr könnt bei diesem Test einseitig und zweiseitig testen. Einseitig heißt lediglich, dass ihr eine konkrete Vermutung habt, dass die zentrale Tendenz der Testvariable (=abhängige Variable) zum einen Zeitpunkte kleiner oder größer ist als zum anderen Zeitpunkt. Standardmäßig wird zweiseitig getestet, das heißt ihr vermutet einen Unterschied, wisst aber nicht, zu welchem Zeitpunkt der größere “Mittelwert” existiert. Ein Beispiel: Ich habe einen Datensatz mit zwei Messzeitpunkten. Zwischen den Messzeitpunkten liegt eine Intervention – der Beginn eines Trainings. Es wurde vor dem Training gezählt, wie viele Liegestütze die Probanden schafften (t0). Nach einem regelmäßigen, z.B. 10-wöchigen Training, wurde erneut gezählt (t10).
Die Nullhypothese ist also: Es gibt keinen Unterschied hinsichtlich der Anzahl an Liegestützen vor und nach dem Training.
Die Alternativhypothese lautet entsprechend: Es gibt einen Unterschied hinsichtlich der Anzahl der Liegestützen vor und nach dem Training. Das können wir sogar konkretisieren, da wir aus Erfahrung wissen, dass ein gezieltes Training typischerweise zu einer Verbesserung der Leistung führt. Die Alternativhypothese kann demzufolge sogar lauten: nach dem 10-wöchigen Training ist die mittlere Anzahl an Liegestützen höher als davor. Dies wäre die einseitige Testung.
4 Durchführung des Wilcoxon-Test in R
4.1 Daten im wide-Format
Hier zeige ich die Berechnung, wenn die Daten im Wide-Format vorliegen. Achtung: Für die anschließende Berechnung der Effektstärke benötigt es eine Umwandlung in das long-Format – dies zeige ich unten für dieses Beispiel.
Proband t0 t10
A 28 42
B 5 10
C 23 26
D 20 30
E 16 24
F 22 28
G 8 12
H 11 15
I 7 9
J 17 23
K 9 24
L 29 39
M 34 56
N 34 51
O 14 24
P 21 28
Q 21 29
4.1.1 Vorarbeiten
Nach dem Einlesen eurer Daten verwendet ihr die Funktion wilcox.test(): Allerdings würde ich vorher eine kurze deskriptive Analyse empfehlen, um einen kleinen Eindruck über die Entwicklung der Werte zu haben. Dazu nutze ich das Paket psych mit der describe()-Funktion sowie einen kleinen Boxplot.
install.packages("psych")
library(psych)
Mit der describe()-Funktion und boxplot()-Funktion kann ich mir nun die Variablen t0 und t10 anschauen.
describe(t0)
describe(t10)
boxplot(data$t0,data$t10)
> describe(data$t0)
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 17 18.76 9.11 20 18.67 11.86 5 34 29 0.16 -1.22 2.21
> describe(data$t10)
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 17 27.65 13.28 26 27 5.93 9 56 47 0.55 -0.52 3.22

- Da wilcox.test() standardmäßig den ungepaarten Test rechnet, muss zwingend noch das Argument paired = TRUE angehängt werden.
- Mit exact = TRUE wird eine exakte Berechnung des p-Wertes durchgeführt. Dies ist immer dann sinnvoll, wenn es wenige Beobachtungen gibt (unter 30, stellenweise liest man auch bereits unter 50 (Benesch (2012) Schlüsselkonzepte zur Statistik, S. 217), manchmal erst unter 25 (Harris, T., & Hardin, J. W. (2013). Exact Wilcoxon signed-rank and Wilcoxon Mann–Whitney ranksum tests. S. 339). Einige Autoren (z.B. Dalgaard (2008), Introductory Statistics with R, S. 106f.) sprechen ebenfalls davon, dass ein exakter Test bei Bindungen (doppelte Ränge) nicht gerechnet werden sollte. Da ich nur 17 Beobachtungen habe, rechne ich einen exakten Test. Hinweis: Die Unterschiede zwischen approximativer und exakter Signifikanz sind meist sehr gering.
- Mit correct = TRUE wird die sog. Kontinuitätskorrektur gerechnet. Eine Kontinuitätskorrektur ist eine Anpassung, die vorgenommen wird, wenn eine diskrete Verteilung durch eine kontinuierliche approximiert wird. Dies ist logischerweise nur dann relevant, wenn eine approximierte Signifikanz gerchnet wird. In meinem Fall trifft es zu.
- Mit conf.int = TRUE wird noch zusätzlich zur Signifikanz das 95%-Konfidenzintervall ausgegeben. Solltet ihr ein anderes KI benötigen, nutzt ihr das Argument conf.level.
- Mit alternative = less oder alternative = greater kann man zusätzlich einseitig testen. Es wird immer die erste mit der zweiten Variable (=Zeitpunkt) verglichen. Daher wird für die Vermutung, dass die erste Variable kleiner als die zweite ist, “less” verwendet. “greater” wird im umgekehrten Falle verwendet. Wir das Argument nicht verwendet, wird automatisch zweiseitig getestet – das ist ohnehin der Regelfall.
4.1.2 Beispielcode in R: zweiseitiger Test
wilcox.test(data$t10,data$t0, paired = TRUE, exact = TRUE, correct = TRUE, conf.int = TRUE)
Die Interpretation der Ergebnisse folgt nach der kurzen Darstellung des Codes für das long-Format.
4.2 Daten im long-Format
Sollten die Daten im long-Format vorliegen, kann auch die wilcox.test()-Funktion verwendet werden.
Proband t v
A t0 28
B t0 5
C t0 23
D t0 20
E t0 16
F t0 22
G t0 8
H t0 11
I t0 7
J t0 17
K t0 9
L t0 29
M t0 34
N t0 34
O t0 14
P t0 21
Q t0 21
A t10 42
B t10 10
C t10 26
D t10 30
E t10 24
F t10 28
G t10 12
H t10 15
I t10 9
J t10 23
K t10 24
L t10 39
M t10 56
N t10 51
O t10 24
P t10 28
Q t10 29
4.2.1 Vorarbeiten
Die Vorarbeiten gestalten sich sehr ähnlich zu oben. Der Vollständigkeit wegen aber der komplette Code:
install.packages("psych")
library(psych)
Mit der describeBy()-Funktion kann ich mir nun die Variablen t0 und t10 anschauen.
describeBy(data_long$v, group=data_long$t)
boxplot(data_long$v~ data_long$t)
> describe(data$t0)
Descriptive statistics by group
group: t0
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 17 18.76 9.11 20 18.67 11.86 5 34 29 0.16 -1.22 2.21
------------------------------------------------------------------------------
group: t10
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 17 27.65 13.28 26 27 5.93 9 56 47 0.55 -0.52 3.22
4.2.2 Beispielcode in R: zweiseitiger Test
Hier ist der Messwert und der Zeitpunkt nun mit einem “~” zu trennen. Der Rest bleibt identisch zu den obigen Ausführungen, ebenso wie das Ergebnis und die jetzt folgende Interpretation.
wilcox.test(data_long$v~data_long$t, paired = TRUE, exact=FALSE, correct=TRUE, conf.int = TRUE)
5 Interpretation des Wilcoxon-Test in R
Das Ergebnis ist unabhängig von der Berechnung nach wide-Format oder long-Format folgendes:
Wilcoxon signed rank test with continuity correction
data: data$t0 and data$t10
V = 0, p-value = 0.0003167
alternative hypothesis: true location shift is not equal to 0
95 percent confidence interval:
-11.99996 -5.99993
sample estimates:
(pseudo)median
-8.000056
Hier ist v.a. der p-Wert von Interesse. Er ist mit 0,0003167 sehr klein und liegt deutlich unter der typischen Verwerfungsgrenze von 0,05. Die Nullhypothese einer Gleichheit der Werte zu den beiden Zeitpunkten kann also verworfen werden. Somit ist die ohnehin schon beobachtete Ungleichheit sehr wahrscheinlich nicht zufällig und das Training hat für eine höhere Leistungsfähigkeit gesorgt.
Achtung: Wenn bereits eine Wirkungsvermutung vor dem Test existiert – die plausible Annahme, dass ein 10-wöchiges Kardiotraining den Ruhepuls senkt, wäre so eine – dann würde man, wie oben schon geschrieben, einseitig testen. Hierzu darf alternative = less geschrieben werden oder alternativ die Asymptotische bzw. Exakte Signifikanz halbiert werden und erneut mit 0,05 verglichen werden. Dass dies passiert ist, sieht man auch am Output.
Wilcoxon signed rank test with continuity correction
data: data$t0 and data$t10
V = 0, p-value = 0.0001584
alternative hypothesis: true location shift is less than 0
95 percent confidence interval:
-Inf -6.000026
sample estimates:
(pseudo)median
-8.000056
6 Ermittlung der Effektstärke des Wilcoxon-Tests
Für die Effektstärkenbeurteilung gibt es keinen Goldstandard, es hat sich aber etabliert den sog. r-Wert zu berichten (Rosenthal, Robert, Rubin (2003). Es existieren meines Wissens nach keine Funktionen zur Effektstärkenberechnung im wide-Format. Demzufolge ist eine Umwandlung in das long-Format vorzunehmen. Hierzu ist das Paket tidyr notwendig und die Funktion gather. Als erstes wird die Datenquelle übergeben (hier: Dataframe mit dem Namen data), dann die Zeitpunktvariable (t), die Variable, welche den Wert enthält (v) sowie mit t0:t10 als Angabe, wie viele Messwerte existieren, die der Zeitpunktvariable jeweils zugeordnet werden.
library(tidyr)
data_long <- gather(data, t, v, t0:t10)
wilcoxonPairedR(x = data_long$v, g = data_long$t)
Mit der wilcoxonPairedR()-Funktion wird letztlich der r-Wert berechnet.
Im Beispiel erhalte ich einen r-Wert von -0,878 . Effektstärken sind immer positiv, somit ist 0,878 einzuordnen. Laut Cohen: Statistical Power Analysis for the Behavioral Sciences (1988), S. 79-81 sind die Effektgrenzen ab 0,1 (schwach), ab 0,3 (mittel) und ab 0,5 (stark).
Im vorliegenden Beispiel ist die Effektstärke mit 0,878 stark. Es handelt sich also um einen starken Effekt hinsichtlich des Unterschiedes des Ruhepulses vor und nach dem 10-wöchigen Training.
7 Literatur
- Rosenthal, Robert, and Donald B. Rubin (2003). r(equivalent): A simple effect size indicator. Psychological Methods 8, no. 4: 492-496.
- Benesch, T. (2012). Schlüsselkonzepte zur Statistik: Die wichtigsten Methoden, Verteilungen, Tests anschaulich erklärt. Springer Spektrum.
- Harris, T., & Hardin, J. W. (2013). Exact Wilcoxon Signed-Rank and Wilcoxon Mann–Whitney Ranksum Tests. The Stata Journal, 13(2), 337–343.
- Dalgaard, P. (2008). Introductory statistics with R. Milton Keynes UK: Lightning Source UK Ltd.
Weitere nützliche Tutorials findest du auf meinem YouTube-Kanal.
8 Videotutorial