R Code [zeigen / verbergen]
::p_load(tidyverse, magrittr, broom,
pacman readxl, rstatix)
Letzte Änderung am 21. November 2024 um 21:59:22
“If your experiment needs a statistician, you need a better experiment.” — Ernest Rutherford
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.
Wir wollen folgende R Pakete in diesem Kapitel nutzen.
::p_load(tidyverse, magrittr, broom,
pacman 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.
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.
<- read_csv2("data/flea_dog_cat_fox.csv") |>
fac1_tbl select(animal, jump_length, grade) |>
mutate(animal = as_factor(animal))
Wir erhalten das Objekt fac1_tbl
mit dem Datensatz in Tabelle 33.1 nochmal dargestellt.
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.
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.
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 33.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}\).
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
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_{D} = \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_{D}\) gilt, wenn \(H_{D} \geq U_{\alpha = 5\%}\) wird die Nullhypothese (H\(_0\)) abgelehnt. Da in unserem Fall das \(H_{D}\) 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.
Bei der Entscheidung mit der berechneten Teststatistik \(H_{D}\) gilt, wenn \(H_{D} \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.
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.
|> kruskal_effsize(jump_length ~ animal) fac1_tbl
# A tibble: 1 × 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.