32  Der Kruskal-Wallis-Test

Letzte Änderung am 02. April 2024 um 09:52:43

“If your experiment needs a statistician, you need a better experiment.” — Ernest Rutherford

Was macht der Kruskal-Wallis-Test?

Der Kruskal-Wallis-Test vergleicht die Mediane mehrerer beliebiger Verteilungen miteinander.

Wann nutzen wir den Kruskal-Wallis-Test? Wir nutzen den Kruskal-Wallis-Test wenn wir mehrere Verteilungen miteinander vergleichen wollen. Das ist jetzt sehr abstrakt. Konkret, wenn wir mehrere Gruppen haben und ein nicht normalverteiltes \(y\). Haben wir ein normalverteiltes \(y\) rechnen wir meist eine einfaktorielle ANOVA. Das heißt, der Kruskal-Wallis-Test ist im Prinzip die einfaktorielle ANOVA für nicht-normalverteilte Daten. Die Entscheidung, ob ein \(y\) normal verteilt ist oder nicht kann an dem Boxplot der Daten abgeschätzt werden.

Was ist jetzt der Unterschied zwischen einem Kruskal-Wallis-Test und einer einfaktoriellen ANOVA? Die ANOVA vergleicht die Mittelwerte mehrerer Normalverteilungen, also zum Beispiel die Verteilung der Sprungweiten der Hundeflöhe gegen die Verteilung der Sprungweiten der Katzenflöhe sowie gegen die Verteilung der Sprungweiten von Fuchsflöhen. Dazu nutzt die ANOVA die Abweichungsquadrate von den Mittelwerten. Damit nutze die ANOVAB Parameter einer Verteilung und somit ist der ANOVA ein parametrischer Test.

Der Kruskal-Wallis-Test ist die nicht-parametrische Variante in dem wir die Zahlen in Ränge umwandeln, also sortieren, und mit den Rängen der Zahlen rechnen. Die deskriptiven Maßzahlen wären dann Median, Quantile und Quartile. Das heißt wir vergleichen mit dem Kruskal-Wallis-Test die Mediane mehrer Gruppen miteinander. Wir wollen also wissen, ob sich die Mediane zwischen den Sprungweiten von Hunde-, Katzen- und Fuchsflöhen unterscheiden.

32.1 Genutzte R Pakete

Wir wollen folgende R Pakete in diesem Kapitel nutzen.

pacman::p_load(tidyverse, magrittr, broom, 
               readxl, rstatix)

An der Seite des Kapitels findest du den Link Quellcode anzeigen, über den du Zugang zum gesamten R-Code dieses Kapitels erhältst.

32.2 Daten für den Kruskal-Wallis-Test

Bindungen (eng. ties) in den Daten sind ein Problem und müssen beachtet werden. Das heißt, wenn es gleiche Zahlen in den Gruppen gibt.

Wir wollen uns nun erstmal den einfachsten Fall anschauen mit einem simplen Datensatz. Wir nehmen ein nicht-normalverteiltes \(y\) aus den Datensatz flea_dog_cat_fox.csv und einen Faktor mit mehr als zwei Leveln. Hätten wir nur zwei Level, dann können wir auch einen Wilcoxon-Mann-Whitney-Test rechnen können.

Wir nehmen in diesem Abschnitt an, dass die Sprunglänge jetzt mal nicht normalverteilt ist. Später sind es Boniturnoten, die definitiv nicht normalverteilt sind. Aber mit der Sprunglänge ist das Beispiel einfacher nachzuvollziehen. Darüber hinaus haben wir so keine Bindungen in den Daten. Bindungen (eng. ties) heißt, dass wir die numerisch gleichen Zahlen in beiden Gruppen haben.

Im Folgenden selektieren mit der Funktion select() die beiden Spalten jump_length als \(y\) und die Spalte animal als \(x\). Danach müssen wir noch die Variable animal in einen Faktor mit der Funktion as_factor() umwandeln. Wir nehmen in diesem Beispiel an, dass die Variable jump_length nicht normalverteilt ist.

fac1_tbl <- read_csv2("data/flea_dog_cat_fox.csv") |>
  select(animal, jump_length, grade) |> 
  mutate(animal = as_factor(animal))

Wir erhalten das Objekt fac1_tbl mit dem Datensatz in Tabelle 32.1 nochmal dargestellt.

Tabelle 32.1— Selektierter Datensatz für den Kruskal-Wallis-Test mit einer nicht-normalverteilten Variable jump_length und einem Faktor animal mit drei Leveln.
animal jump_length grade
dog 5.7 8
dog 8.9 8
dog 11.8 6
dog 5.6 8
dog 9.1 7
dog 8.2 7
dog 7.6 9
cat 3.2 7
cat 2.2 5
cat 5.4 7
cat 4.1 6
cat 4.3 6
cat 7.9 6
cat 6.1 5
fox 7.7 5
fox 8.1 4
fox 9.1 4
fox 9.7 5
fox 10.6 4
fox 8.6 4
fox 10.3 3

Wir bauen daher mit den beiden Variablen mit dem Objekt fac1_tbl folgendes Modell für später:

\[ jump\_length \sim animal \]

Bevor wir jetzt das Modell verwenden, müssen wir uns nochmal überlegen, welchen Schluß wir eigentlich über die Nullhypothese machen. Wie immer können wir nur die Nullhypothese ablehnen. Daher überlegen wir uns im Folgenden wie die Nullhypothese in dem Kruskal-Wallis-Test aussieht. Dann bilden wir anhand der Nullhypothese noch die Alternativehypothese.

32.3 Hypothesen für den Kruskal-Wallis-Test

Der Kruskal-Wallis-Test betrachtet die Mediane und Ränge um einen Unterschied nachzuweisen. Daher haben wir in der Nullhypothese als Gleichheitshypothese. In unserem Beispiel lautet die Nullhypothese, dass die Mediane jedes Levels des Faktors animal gleich sind.

\[ H_0: \; \widetilde{y}_{cat} = \widetilde{y}_{dog} = \widetilde{y}_{fox} \]

Die Alternative lautet, dass sich mindestens ein paarweiser Vergleich in den Medianen unterschiedet. Hierbei ist das mindestens ein Vergleich wichtig. Es können sich alle Mediane unterschieden oder eben nur ein Paar. Wenn ein Kruskal-Wallis-Test die \(H_0\) ablehnt, also ein signifikantes Ergebnis liefert, dann wissen wir nicht, welche Mediane sich unterscheiden.

\[ \begin{aligned} H_A: &\; \widetilde{y}_{cat} \ne \widetilde{y}_{dog}\\ \phantom{H_A:} &\; \widetilde{y}_{cat} \ne \widetilde{y}_{fox}\\ \phantom{H_A:} &\; \widetilde{y}_{dog} \ne \widetilde{y}_{fox}\\ \phantom{H_A:} &\; \mbox{für mindestens ein Paar} \end{aligned} \]

Wir schauen uns jetzt einmal den Kruskal-Wallis-Test theoretisch an bevor wir uns mit der Anwendung des Kruskal-Wallis-Test in R beschäftigen.

32.4 Kruskal-Wallis-Test theoretisch

Der Kruskal-Wallis-Test berechnet die H Teststatistik auf den Rängend der Daten. Es gibt genau soviele Ränge wie es Beobachtungen im Datensatz gibt. Wir haben \(n = 21\) Beobachtungen in unseren Daten zu der Sprungweite in [cm] von den Hunde-, Katzen- und Fuchsflöhen. Somit müssen wir auch einundzwanzig Ränge vergeben.

Die Tabelle 32.2 zeigt das Vorgehen der Rangvergabe. Wir sortieren als erstes das \(y\) aufsteigend. In unserem Fall ist das \(y\) die Sprunglänge. Dann vergeben wir die Ränge jweiles zugehörig zu der Position der Sprunglänge und der Tierart. Abschließend addieren wir die Rangsummmen für cat, dog und fox zu den Rangsummen \(R_{cat}\), \(R_{dog}\) und \(R_{fox}\).

Tabelle 32.2— Datentablle absteigend sortiert nach der Sprunglänge in [cm]. Die Level cat, dog und fox haben jeweils die entsprechenden Ränge zugeordnet bekommen und die Rangsummen wurden berechnet
Rank animal jump_length Ränge “cat” Ränge “dog” Ränge “fox”
1 cat 2.2 1
2 cat 3.2 2
3 cat 4.1 3
4 cat 4.3 4
5 cat 5.4 5
6 dog 5.6 6
7 dog 5.7 7
8 cat 6.1 8
9 dog 7.6 9
10 fox 7.7 10
11 cat 7.9 11
12 fox 8.1 12
13 dog 8.2 13
14 fox 8.6 14
15 dog 8.9 15
16 dog 9.1 16
17 fox 9.1 17
18 fox 9.7 18
19 fox 10.3 19
20 fox 10.6 20
21 dog 11.8 21
Rangsummen \(R_{cat} = 34\) \(R_{dog} = 87\) \(R_{fox} = 110\)
Gruppengröße 7 7 7

Die Summe aller Ränge ist \(1+2+3+...+21 = 231\). Wir überprüfen nochmal die Summe der Rangsummen als Gegenprobe \(R_{cat} + R_{dog} + R_{fox} = 231\). Das ist identisch, wir haben keinen Fehler bei der Rangaufteilung und der Summierung gemacht.

Die Formel für die H Statistik sieht wie die U Statistik ein wenig wild aus, aber wir können eigentlich relativ einfach alle Zahlen einsetzen. Dann musst du dich etwas konzentrieren bei der Rechnung.

\[ H = \cfrac{12}{N(N+1)}\sum_{i=1}^k\cfrac{R_i^2}{n_i}-3(N+1) \]

mit

  • \(R_i\) der Rangsummen für jede Gruppe mit insgesamt \(k\) Gruppen
  • \(n_i\) der Fallzahl in jeder Gruppe
  • \(N\) der Gesamtzahl an Beobachtungen also die gesamte Fallzahl

Wir setzen nun die Zahlen ein. Da wir ein balanciertes Design vorliegen haben sind die Fallzahlen \(n_1 = n_2 = n_3 = 7\) gleich.

\[ H_{calc} = \cfrac{12}{21(21+1)}\left(\cfrac{34^2}{7}+\cfrac{87^2}{7}+\cfrac{110^2}{7}\right)-3(21+1) = 11.27 \]

Der kritische Wert für die H Statistik ist \(H_{\alpha = 5\%} = 5.99\). Bei der Entscheidung mit der berechneten Teststatistik \(H_{calc}\) gilt, wenn \(H_{calc} \geq U_{\alpha = 5\%}\) wird die Nullhypothese (H\(_0\)) abgelehnt. Da in unserem Fall das \(H_{calc}\) mit \(11.27\) größer ist als das \(H_{\alpha = 5\%} = 5.99\) können wir die Nullhypothese ablehnen. Wir haben ein signifkianten Unterschied in den Medianen zwischen den beiden Tierarten im Bezug auf die Sprungweite in [cm] von Flöhen.

Entscheidung mit der berechneten Teststatistik \(F_{\boldsymbol{calc}}\)

Bei der Entscheidung mit der berechneten Teststatistik \(H_{calc}\) gilt, wenn \(H_{calc} \geq H_{\alpha = 5\%}\) wird die Nullhypothese (H\(_0\)) abgelehnt.

Achtung – Wir nutzen die Entscheidung mit der Teststatistik nur und ausschließlich in der Klausur. In der praktischen Anwendung hat die Betrachtung der berechneten Teststatistik keine Verwendung mehr.

32.5 Kruskal-Wallis-Test in R

Die Nutzung des Kruskal-Wallis-Test in R ist relativ einfach mit der Funktion kruskal.test(). Wir nutzen die formual Syntax um das Modell zu definieren und können dann schon die Funktion nutzen.

kruskal.test(jump_length ~ animal, data = fac1_tbl) 

    Kruskal-Wallis rank sum test

data:  jump_length by animal
Kruskal-Wallis chi-squared = 11.197, df = 2, p-value = 0.003704

Mit einem p-Wert von \(0.0037\) können wir die Nullhypothese ablehnen, da der p-Wert kleiner ist als das Signifikanzniveau \(\alpha\) von 5%. Wir haben mindestens einen medianen Unterschied zwischen den Sprungweiten der Hunde-, Katzen- und Fuchsflöhen.

Für die Betrachtung der Effektgröße in einem Kruskal-Wallis-Test nutzen wir das R Paket {rstatix} und die darin enthaltende Funktion kruskal_effsize(). Wir berechnen hierbei analog zu einfaktoriellen ANOVA den \(\eta^2\) Wert.

fac1_tbl |> kruskal_effsize(jump_length ~ animal)
# A tibble: 1 x 5
  .y.             n effsize method  magnitude
* <chr>       <int>   <dbl> <chr>   <ord>    
1 jump_length    21   0.511 eta2[H] large    

Das \(\eta^2\) nimmt Werte von 0 bis 1 an und gibt, multipliziert mit 100, den Prozentsatz der Varianz der durch die \(x\) Variable erklärt wird. In unserem Beispiel wird 51.1% der Varianz in de Daten durch den Faktor animal erklärt.