Website-Icon Björn Walther

Wilcoxon-Test für 2 abhängige Stichproben in R rechnen

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.

Voraussetzungen des Wilcoxon-Test in R

https://www.youtube.com/watch?v=4lFyRcXoJB8

Fragen können unter dem verlinkten Video gerne auf YouTube gestellt werden.

 

Nullhypothese

Die Nullhyopthese beim Wilcoxon-Test für abhängige Stichproben geht davon aus, dass 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.  

 

Durchführung des Wilcoxon-Test in R

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

 

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
Hier ist sowohl anhand der Mittelwertes (mean) als auch des Medians erkennbar, dass sich die Werte von z0 zu t10 erhöhen. Ob dies ein signifikanter Unterschied ist, muss jedoch mit wilcox.test() festgestellt werden. Für wilcox.test() sind noch folgende Dinge zu beachten:

 

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.

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

 

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

 

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)

 

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 

 

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 
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.  

 

Literatur

Weitere nützliche Tutorials findest du auf meinem YouTube-Kanal.

 

Die mobile Version verlassen