/
stat-tests-kruskal.qmd
175 lines (120 loc) · 11.5 KB
/
stat-tests-kruskal.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
```{r echo = FALSE}
pacman::p_load(tidyverse, readxl, knitr, kableExtra, Hmisc)
```
# Der Kruskal-Wallis-Test {#sec-kruskal}
*Letzte Änderung am `r format(fs::file_info("stat-tests-kruskal.qmd")$modification_time, '%d. %B %Y um %H:%M:%S')`*
> *"If your experiment needs a statistician, you need a better experiment." --- Ernest Rutherford*
::: callout-note
## 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.
## Genutzte R Pakete
Wir wollen folgende R Pakete in diesem Kapitel nutzen.
```{r echo = TRUE}
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.
## 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.]{.aside}
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.
```{r}
#| message: false
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 @tbl-data-kruskal-1 nochmal dargestellt.
```{r}
#| message: false
#| echo: false
#| tbl-cap: Selektierter Datensatz für den Kruskal-Wallis-Test mit einer nicht-normalverteilten Variable `jump_length` und einem Faktor `animal` mit drei Leveln.
#| label: tbl-data-kruskal-1
fac1_tbl |> kable(align = "c", "pipe")
```
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.
## 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.
## 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 @tbl-kruskal-rank 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}$.
::: column-page
| 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 |
: 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 {#tbl-kruskal-rank}
:::
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_{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.
::: callout-important
## Entscheidung mit der berechneten Teststatistik $F_{\boldsymbol{D}}$
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.
:::
## 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.
```{r}
kruskal.test(jump_length ~ animal, data = fac1_tbl)
```
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.
```{r}
fac1_tbl |> kruskal_effsize(jump_length ~ animal)
```
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.