Kruskal-Wallis-Test in R rechnen

von | Zuletzt bearbeitet am: May 8, 2023 | Mittelwertvergleich, R

1 Ziel des Kruskal-Wallist-Tests

Der Kruskal-Wallist-Test prüft drei oder mehr unabhängige Stichproben auf unterschiedliche Mittelwerte. Oder genauer gesagt, dass die Stichproben der gleichen Grundgesamtheit entstammen. Er ist die nicht-parametrische Alternative zur einfaktoriellen ANOVA. Die Nullhypothese des Kruskal-Wallis-Test lautet, dass keine Mittelwertunterschiede (hinsichtlich der Testvariable) existieren bzw. alle Gruppen der gleichen Grundgesamtheit angehören. Demzufolge lautet die Alternativhypothese, dass zwischen den Gruppen Unterschiede existieren. Es ist das Ziel, die Nullhypothese zu verwerfen und die Alternativhypothese anzunehmen. Den Kruskal-Wallis-Test in R kann man mit wenigen Zeilen Code durchgeführt werden. Es gibt auch ein Tutorial in SPSS.

 

2 Voraussetzungen des Kruskal-Wallis-Tests

Es gibt nur zwei zu beachtende Voraussetzungen des Kruskal-Wallis-Tests:

  • mehr als zwei voneinander unabhängige Stichproben/Gruppen
  • mindestens ordinal skalierte y-Variable

 

3 Durchführung des Kruskal-Wallis-Test in R

3.1 Das Beispiel

Im Beispiel prüfe ich drei voneinander unabhängige Trainingsgruppen (untrainiert, nomral und gut trainiert) auf deren mittleren Ruhepuls. Ich vermute dahingehend Unterschiede, dass Probanden der verschiedenen Trainingsgruppen im Mittel unterschiedliche Ruhepulse haben. Das kann man auch gerichtet formulieren: Probanden aus den stärker im Training stehenden Gruppen haben im Mittel einen geringeren Ruhepuls. Der Kruskal-Wallis-Test vermag aber nicht einseitig zu testen, da dies nur bei genau 2 Gruppen (z.B. Mann-Whitney-U-Test) funktioniert.  

 

3.2 Deskriptive Voranalyse

Nach dem Einlesen der Daten kann direkt ein deskriptiver Vergleich durcheführt werden. Dieser ist im Rahmen des Kruskal-Wallis-Tests nicht zwingend notwendig hilft aber beim Schreiben der Ergebnisse. Hierzu nutze ich das sog. “psych”-Paket, was ich mit “install.packages” installiere und mit library(psych) lade. Dann lasse ich mir die deskriptiven Statistiken ausgeben. Das Format ist describeBy(Testvariable, Gruppenvariable).


install.packages("psych")
library(psych)
describeBy(data$Ruhepuls,data$Trainingsgruppe)

Hier erhält man folgenden Output:


Descriptive statistics by group
group: 0
vars n mean  sd   median trimmed mad   min max range skew  kurtosis se
1   13 68    9.6  69     68.64   10.38 50  79  29    -0.42 -1.26    2.66
------------------------------------------------------------------------------
group: 1
vars n mean  sd   median trimmed mad   min max range skew  kurtosis se
1   13 61    9.82 58     60.64   10.38 48  78  30    0.51  -1.17    2.72
------------------------------------------------------------------------------
group: 2
vars n mean  sd   median trimmed mad   min max range skew  kurtosis se
1   13 52.85 9.74 52     52.36   13.34 40 71   31    0.28  -1.21    2.7

 

Hier wird bereits deutlich, dass sich die mit fett markierten Mittelwerte über die Gruppen hinweg unterscheiden. Zwar vergleicht der Kruskal-Wallis-Test keine Mittelwerte an sich, sondern nutzt Ränge, aber dennoch ist es ein guter Anhaltspunkt. Die untrainierte Gruppe hat einen mittleren Ruhepuls von 68, die normal trainierte Gruppe von 61 und die gut trainierte Gruppe von 52,85.  

 

3.3 Kruskal-Wallis-Test rechnen und interpretieren

Hierzu wird die kruskal.test()-Funktion verwendet:


kruskal.test(data$Ruhepuls~data$Trainingsgruppe)

Nach der Ausführung dieser kleinen Codezeile erhält man den interpretierbaren Output:


Kruskal-Wallis rank sum test
data: data$Ruhepuls by data$Trainingsgruppe
Kruskal-Wallis chi-squared = 11.007, df = 2, p-value = 0.004073

Hier ist eigentlich nur ein Wert wirklich interessant: der p-Wert findet sich unter Pr(>F) und ist hier 0,004073. Das ist deutlich kleiner als 0,05 und somit kann die Nullhypothese von Gleichheit der Mittelwerte über die Gruppen hinweg verworfen werden bzw. der Ursprung der Gruppen aus derselben Grundgesamtheit kann verworfen werden. Das berichtet man mit H(2) = 11,007, p < 0,001.

Die entscheidende Frage ist nun, zwischen welchen der drei Trainingsgruppen ein Unterschied existiert. Es ist denkbar, dass nur zwischen zwei Gruppen ein Unterschied existiert oder zwischen allen 3. Hierzu braucht es eine post-hoc-Analyse.  

 

3.4 Post-hoc-Analyse: paarweise Gruppenvergleiche

Diese führt man mittels paarweisen Wilcoxon-Tests (“pairwise.wilcox.test()“) oder paarweisen Dunn’s Tests (“dunn_test()”) durch. Vorzugweise wird der Dunn’s Test als post-Hoc-Test, weil er bei Bindungen nicht so konservativ in der Entscheidung ist (vgl. Dunn (1964), S. 249) verwendet.
Zusätzlich muss hierbei der p-Wert angepasst werden, da das mehrfache Testen auf dieselbe Stichprobe zu einem erhöhten Alphafehler führt. Dies hat wiederum zur Folge, dass die Wahrscheinlichkeit einen Fehler 1. Art zu begehen, steigt. Ultimativ könnte das dazu führen, dass man die Nullhypothese fälschlicherweise ablehnt, also Unterschiede unterstellt, die nicht existieren. Aber keine Angst, R hat eine eingebaute Funktion namens p.adjust() bzw. p.adjust.method().

Es gibt jeweils verschiedene Argumente. Zumeist wählt man die konservativste “bonferroni”. Wird kein Argument übergeben, wird nach der etwas weniger strengen Holm-Methode korrigiert. Weitere Informationen zur Adjustierung des p-Wertes gibt es hier. Der Code zum paarweisen Vergleich sowie dem Anpassen des p-Wertes ist folgender:


pairwise.wilcox.test(data$Ruhepuls,data$Trainingsgruppe, p.adjust="bonferroni")

# bzw. für den Dunn's Test:

library(rstatix)
dunn_test(Ruhepuls~Trainingsgruppe, data=data, p.adjust.method = "bonferroni")
Mann-Whitney-Wilcoxon-Ergebnisse

Als Ergebnis erhält man jeweils eine kleine Übersichtstabelle, die im Falle des Mann-Whitney-Wilcoxon-Tests nur p-Werte enthält. Diese sind adjustiert nach Bonferroni, wie am letzten Argument der letzten Zeile zu erkennen ist.

Sollten Bindungen (=gleiche Ränge bzw. Werte) existieren, kann die Berechnung der exakten Signifikanz nicht vorgenommen werden. Mit dem Argument “exact = FALSE” kann die approximative Signifikanz angefordert werden. Bei Stichprobengrößen über 50 kann diese bedenkenlos gewählt werden. Lediglich bei kleinen Stichprobengrößen (< 30) sollte die exakte Signifikanz angefordert werden.

Wie bereits erwähnt sind aber gerade bei ordinalskalierten Variablen mit zunehmenden Gruppengrößen Bindungen sehr wahrscheinlich und damit potenziell eine Verzerrung der p-Werte möglich. Deshalb empefiehlt sich eher die Rechnung von Dunn’s Tests mit den unten stehenden Ergebnissen.


Pairwise comparisons using Wilcoxon rank sum test
data: data$Ruhepuls and data$Trainingsgruppe
  0       1
1 0.3003  -
2 0.0052  0.1824
P value adjustment method: bonferroni

 

In der obigen Tabelle kann man folgendes erkennen:

  • Der Unterschied zwischen der Gruppe 0 und der Gruppe 1 weist eine adjustierte Signifikanz von p = 0,3003 aus. Für diese beiden Gruppen kann die Nullhypothese keines Unterschiedes demzufolge nicht abgelehnt werden.
  • Für den Unterschied zwischen Gruppe 1 und Gruppe 2 ist die adjustierte Signifikanz p = 0,1824. Auch hier kann die Nullhypothese keines Unterschiedes nicht verworfen werden.
  • Für den Unterschied zwischen Gruppe 0 und Gruppe 2 ist allerdings eine adjustierte Signifikanz von p = 0,0052 zu erkennen. Die Nullhypothese keines Unterschiedes wird zugunsten der Alternativhypothese eines Unterschiedes verworfen. Der Unterschied ist statistisch signifikant.

Im Ergebnis kann festgehalten werden, dass nur zwischen Gruppe 0 (untrainiert) und Gruppe 2 (gut trainiert) ein statistisch signifikanter Unterschied hinsichtlich des Ruhepulses existiert. Kontrolliert für die Mehrfachtestung unterscheiden nur sie sich statistisch signifikant voneinander.  

 


Dunn’s Tests Ergebnisse

# A tibble: 3 × 9
  .y.      group1           group2    n1    n2 statistic       p   p.adj p.adj.signif
*                                       
1 Ruhepuls Gut trainiert    Norma…    13    13      1.77 7.61e-2 0.228   ns          
2 Ruhepuls Gut trainiert    Untra…    13    13      3.31 9.17e-4 0.00275 **          
3 Ruhepuls Normal trainiert Untra…    13    13      1.54 1.23e-1 0.370   ns
Hier ist v.a. die vorletzte Spalte interessant, die den adjustierten p-Wert (p.adj) angibt. Qualitativ kommt man in meinem Beispiel ausnahmsweise zum gleichen Schluss wie bei paarweise Mann-Whitney-Wilcoxon-Tests. Die angepassten p-Werte sind aber durchaus unterschiedlich:
Gut trainiert – Normal trainiert: p = 0.228 (p = 0.1824, nach Mann-Whitney-Wilcoxon)
Gut trainiert – Untrainiert: p = 0.00275 (p = 0.0052, nach Mann-Whitney-Wilcoxon)
Normal trainiert – Untrainiert: p = 0.370 (p = 0.3003, nach Mann-Whitney-Wilcoxon).

Im Ergebnis kann auch hier festgehalten werden, dass nur zwischen Gruppe 0 (untrainiert) und Gruppe 2 (Gut trainiert) ein statistisch signifikanter Unterschied hinsichtlich des Ruhepulses existiert. Kontrolliert für die Mehrfachtestung unterscheiden nur sie sich statistisch signifikant voneinander.  

 

3.5 Effektstärke des Kruskal-Wallis-Test

Die Effektstärke Eta² wird von R nicht mit ausgegeben. Eta² ist Teil von f (siehe unten) gibt an, wie stark der gefundene statistisch signifikante Effekt des Kruskal-Wallis-Test ist. Die Formel für Eta² lautet:

    \[  Eta^2 = (H - k + 1) / (n - k) \]

mit H als Chi²-Teststatistik,

k (Anzahl Gruppen) und n (Anzahl Gesamtbeobachtungen). Ohne jetzt über eine komplizierte Formel gehen zu müssen, kann man direkt die Werte von oben einsetzen.


eta_squared <- (11.007 - 3 + 1)/(39 - 3)
eta_squared
Im Ergebnis erhält man hier einen Wert von Eta² = 0,2501944. Diesen Wert muss man schließlich noch mal in folgende Formel einsetzen

    \[  f = \sqrt{\frac{\eta^2}{1-\eta^2}} \]

Das funktioniert ebenfalls mit einfacher Arithmetik in R.

sqrt(0.2501944/(1-0.2501944))
0.5776496
Der f-Wert für den Kruskal-Wallis-Test ist 0,5776496

Sollten keine vergleichbaren Studien oder fachspezfischen Grenzene existieren, kann Cohen: Statistical Power Analysis for the Behavioral Sciences (1988), S. 284-287 zur Einordnung herangezogen werden.

  • Ab 0,1 ist es ein schwacher Effekt,
  • ab 0,25 ein mittlerer und
  • ab 0,4 ein starker Effekt.

Demzufolge ist der mit dem Kruskal-Wallis-Test beobachtete Unterschied ein starker Unterschied, da 0,5776496 über der Grenze zum starken Effekt liegt.

Die Effektstärke des Kruskal-Wallis-Test wird selten berichtet, da die paarweisen Vergleiche/Unterschiede interessanter sind.

 

3.6 Effektstärke der paarweisen Vergleiche

Mit Mann-Whitney-Wilcoxon-Tests

Wie eben beschrieben ist die Effektstärke des Kruskal-Wallis-Tests weniger interessant. Die paarweisen Vergleiche und deren Effektstärke sollten im Fokus stehen, um signifikante Unterschiede zwischen jene einordnen zu können. Zum einen kann dies auf Basis von Mann-Whitney-Wilcoxon-Tests und zum anderen auf Basis von Dunn’s Tests erfolgen, was weiter unten gezeigt wird und die vorzuziehende Methode ist.


Hierzu gibt es keine einfache Funktion in R. Vielmehr wird mit dem Konzept des Piping gearbeitet, welches mit dem dplyr-Paket zur Anwendung kommt. Gleichzeitig braucht es das rstatix-Paket zur Verwendung der wilcox_effsize()-Funktion:

library(dplyr)
library(rstatix)
data %>%
wilcox_effsize(Ruhepuls~Trainingsgruppe) %>%
  as.data.frame()
Dies führt im Ergebnis zu folgendem Output:

       .y.   group1  group2    effsize n1 n2 magnitude
1 Ruhepuls        2       1  0.3727555 13 13  moderate
2 Ruhepuls        2       0  0.6190494 13 13     large
3 Ruhepuls        1       0  0.3275328 13 13  moderate
Hier sehen wir die Effektstärken in der Spalte “effsize” für alle drei paarweisen Vergleiche. Da wir nur für den Vergleich zwischen Gruppe 2 und 0 (Gut trainiert vs. untrainiert) eine Signifikanz in den post-hoc-Tests haben, sollte auch nur hier die Effektstärke abgelesen werden. Sie beträgt r = 0.619. Die anderen beiden Effektstärken sollten aufgrund der Nichtsignifikanz des Unterschiedes nicht interpretiert werden – es gibt Fachdisziplinen die hier aber dennoch ein Reporting wünschen.
In der Spalte “magnitude” wird die Größe des Effektes eingeordnet. r = 0.619 wird als großer Effekt eingeordnet.

 

Die Einordnung von “magnitude” oben erfolgt auf Basis von Cohen (1992): A Power Primer, S. 157:
  • Ab 0,1 ist es ein schwacher Effekt,
  • ab 0,3 ein mittlerer und
  • ab 0,5 ein starker Effekt.
Es sollte geprüft werden, ob vergleichbare Studien in der Fachdisziplin existieren, anhand derer eine Einordnung erfolgen kann. Ist dies nicht möglich, können fachdisziplinspezifische Grenzen zur Einordnung verwendet werden. Erst wenn dies auch nicht möglich ist, kann Cohen (1992) herangezogen werden.

 


Mit Dunn’s Tests

d <- dunn_test(Ruhepuls~Trainingsgruppe, data=df, p.adjust.method = "bonferroni")
d$r <- d$statistic/sqrt(d$n1+d$n2)
d
Was zu folgendem führt:

# A tibble: 3 × 10
  .y.      group1     group2    n1    n2 statistic       p   p.adj p.adj.signif     r
                                   
1 Ruhepuls Gut train… Norma…    13    13      1.77 7.61e-2 0.228   ns           0.348
2 Ruhepuls Gut train… Untra…    13    13      3.31 9.17e-4 0.00275 **           0.650
3 Ruhepuls Normal tr… Untra…    13    13      1.54 1.23e-1 0.370   ns           0.302
Zwar sind die Effektstärken ähnlich, aufgrund o.g. Gründe ist aber die Berechnung über Dunn's Tests vorzuziehen. Die Interpretation/Einordnung der errechneten Effektstärke r (letzte Spalte) erfolgt analog mit Vergleichsstudien, fachspezifischen Grenzen oder behelsfweise Cohen (1992), S. 157.

 

4 Videotutorials

 

5 Literatur

  • Cohen, J. (1988): Statistical Power Analysis for the Behavioral Sciences.
  • Cohen, J. (1992): A Power Primer, Psychological Bulletin, 1992, Vol. 112. No. 1, 155-159.
  • vgl. Dunn, O. J. (1964). Multiple comparisons using rank sums. Technometrics, 6(3), 241-252.

 

Hat dir der Beitrag geholfen?

Dann würde ich mich über eine kleine Spende freuen, die es mir erlaubt, weiterhin kostenfreie Inhalte zu veröffentlichen.
Alternativ kannst du über meinen Amazon Affiliate-Link einkaufen – ohne Zusatzkosten.

Vielen Dank und viel Erfolg!

Über mich

Björn Walther

Ein 💚 für Statistik & Datenanalyse

Excel Online-Kurs

YouTube-Kanal

Inhalt