Letzte Änderung am 04. June 2025 um 11:38:58

Statisticians, like artists, have the bad habit of falling in love with their models.” — George Box

Stand des Kapitels: Baustelle (seit 06.2025)

Dieses Kapitel wird überarbeitet. Ziel ist es die Nichtparametrik zum Start des Wintersemesters 2025/26 überarbeitet zu haben. Da ich hier direkt im Kapitel arbeite, kann es sein, dass mal die ein oder andere Funktion nicht funktioniert oder aber Teile im Nichts enden. Wird dann repariert.

35.1 Allgemeiner Hintergrund

Der U-Test ist auch unter den Namen Wilcoxon-Mann-Whitney-Test, Mann-Whitney-U-Test oder Wilcoxon-Rangsummentest bekannt.

Wann nutzen wir den Wilcoxon-Mann-Whitney-Test? Wir nutzen den Wilcoxon-Mann-Whitney-Test wenn wir zwei Verteilungen miteinander vergleichen wollen. Das ist jetzt sehr abstrakt. Konrekt, wenn wir zwei Gruppen haben und ein nicht normalverteiltes \(y\). Haben wir ein normalverteiltes \(y\) rechnen wir meist einen t-Test. Wir könnten aber auch einen Wilcoxon-Mann-Whitney-Test rechnen.

Was ist jetzt der Unterschied zwischen einem Wilcoxon-Mann-Whitney-Test und einem t-Test? Der t-Test vergleicht die Mittelwerte zweier Normalverteilungen, also zum Beispiel die Verteilung der Sprungweiten der Hundeflöhe gegen die Verteilung der Sprungweiten der Katzenflöhe. Dazu nutzt der t-Test die Mittelwerte und die Standardabweichung. Beides sind Parameter einer Verteilung und somit ist der t-Test ein parametrischer Test.

Der Wilcoxon-Mann-Whitney-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 Wilcoxon-Mann-Whitney-Test die Mediane. Wir wollen also wissen, ob sich die Mediane zwischen den Sprungweiten von Hunde- und Katzenflöhen unterscheiden.

“foo.” — Jochen Kruppa-Scheetz, meiner bescheidener Meinung nach.

Abbildung 35.1— Left: Number of GFP+ MLL-AF9 cells in peripheral blood of WT and Rag2−/− mice. PB was collected 11 days after transplantation. Data are shown as means ± s.e.m. [n = 6 (male: n = 3, female: n = 3) for each group]. **P < 0.01;two-tailed Mann–Whitney test. Middle/right: Weight and size of spleens collected from WT or Rag2−/− mice 11 days after transplantation. Data are shown as means ± s.e.m. (n = 3 for each group, male). ***P < 0.001, ****P < 0.0001; two-tailed Student’s t test. Quelle: Sugimoto et al. (2023)

Nachdem wir uns die Abbildung 35.1 einmal genauer angeschaut haben, stellt sich die Frage warum wird in der Abbildung ganz links ein Mann-Whitney oder U-Test gerechnet und in den beiden anderen Abbildungen ein Student t-Test? Warum nicht auf alles ein U-Test rechnen? Immerhin würde ja auf das Gewicht und die Größe der Milz (eng. spleen) auch ein U-Test als statistischer Test auch gehen. Wir haben hier unterschiedliche Fallzahlen in den Gruppen. In der linken Abbildung haben wir pro Gruppe sechs Mäuse und in der mittleren sowie rechten Abbidlung nur drei Mäuse pro Gruppe. Macht das einen Unterschied? Ja, für den U-Test macht das einen gewaltigen Unterschied, wie wir gleich einmal sehen werden.

35.2 Das Problem…

35.2.1 …der Gruppengröße

“Statistik fängt erst ab einer Gruppengröße von n gleich sieben überhaupt an.” — Ein anonymer Nichtparametriker

Um das Problem der geringen Gruppengröße zu verstehen, müssen wir erstmal den Zusammenhang zwischen einem signifikanten Ergebnis und der Mittelwertsdifferenz als ein statistsiches Maß für den Effekt verstehen. Je größer der Effekt, desto eher sollte ein Vergleich zwischen zwei Gruppen signifikant unterschiedlich sein. In der folgenden Abbildung habe ich dir einmal den Zusammenhang zwischen der Mittelwerstdifferenz \(\Delta\) und der Signifikanz dargestellt. Wie du siehst überlappen die Verteilungend der beiden Gruppen, wenn die Differenz der Mittelwerte klein ist. Je größer der Unterschied desto größer ist die Mittelwertsdifferenz. Soweit so klar. Damit sollten wir auch kleinere p-Werte erhalten, je größer die Mittelwertsdifferenz wird. Ich habe dir mal beispielhafte p-Werte in der Abbidung ergänzt.

Abbildung 35.2— Darstellung des Zusammenhangs zwischen der Mittelwertsdifferenz und der zu erwartenden Signifikanz aus einem statistischen Tests für einen Zweigruppenvergleich. Die p-Werte sind abgeschätzt. (A) Die Mittelwertsdifferenz ist klein, es ist kein signifikanter Unterschied zu erwarten. Der p-Wert ist groß. (B) Die Mittelwertsdifferenz ist moderat, es ist ein kleiner p-Wert zu erwarten. (C) Die Mittelwertsdifferenz ist groß, damit ist der p-Wert kleiner als \(0.001\) und hoch signifikant. [Zum Vergrößern anklicken]

Wenn wir jetzt den Zusammenhang zwischen der Mittelwertsdifferenz und dem p-Wert verstanden haben, können wir jetzt zum Problem der geringen Fallzahl in den Gruppen kommen. Wenn die Mittelwertsdifferenz ansteigt, dann sollte der p-Wert fallen. Wie du in folgender Abbildung links auch siehst, ist das der Fall. Für alle Kombinationen der Fallzahlen in den beiden Gruppen \(n_1\) und \(n_2\) fallen die p-Werte mit steigendem Effekt. Nur haben die p-Werte ein Plateau unter das sie nicht fallen können. Und bei einer Gruppengröße von 3 und 3 oder 4 und 3 können die p-Werte nicht kleiner als 0.05 werden egal wie groß die Mittelwertsdifferenz wird. Daher können wir mit diesen beiden Fallzahlkombinationen keinen signifkanten Unterschied nachweisen. Das sehen wir auch nochmal in der anderen Abbildung rechts, hier siehst du die minimalen p-Werte. Die p-Werte können in einem U-Test nicht unter gewisse Schranken fallen, abhängig von der Gruppenfallzahl.

Abbildung 35.3— Zusammenhang zwischen der Mittelwertsdifferenz und dem mittleren p-Wert aus einer Simulationsstudie abhängig von der Fallzahl in zwei Gruppen \(n_1\) und \(n_2\). Die graue Linie zeigt das 5% Signifikanzniveau an. (A) Mit steigender Mittelwertsdifferenz fallen die mittleren p-Werte. Die p-Werte erreichen je nach Fallzahlkombination ein Plateau. (B) Kleinst möglicher p-Wert in den Simulationen für jede Fallzahlkombinationen. [Zum Vergrößern anklicken]

Jetzt verstehen wir auch warum Sugimoto et al. (2023) in der Abbildung 35.1 auf einen Student t-Test für die Gruppengröße \(n_1 = 3\) und \(n_2 = 3\) umgeschwenkt ist. Trotz des riesigen Effekts in den Barplots und damit dem Mittelwertsunterschied, wäre ein Mann-Whitney Test nie signifikant geworden. Der p-Werte wäre dann hier auf 10% begrenzt, egal wie groß der eigentliche Effekt ist. Diese harte Grenze kennt der t-Test nicht, deshalb wurde hier dann der t-Test als Ausweg gewählt.

35.2.2 …des Effekts

Was ist der Effekt eines nichtparametrischen Tests? Oder andersherum, wenn wir eine Rangtransformation durchführen, dann verwandeln wir ja alle Zahlen mit einer Einheit in einen einheitslosen Rang. Damit rechnen wir also auf den Rängen des Messwertes. Wenn wir aber nun einheitslose Ränge haben, dann haben wir auch nur einheitslose Rangdifferenzen.

Je mehr Beobachtungen desto mehr Ränge desto größer die Rangdifferenzen.

35.2.3 …der Hypothesen

Mann-Whitney-U-Test: Hypothesen

“A major impetus to reporting medians with WMW test results is likely the major utility of reporting a summary statistic that reflects the same scale as the data being analyzed.” — Divine et al. (2018)

Divine et al. (2018) The Wilcoxon–Mann–Whitney Procedure Fails as a Test of Medians

Hart (2001) Mann-Whitney test is not just a test of medians: differences in spread can be important

Abbildung 35.4— foo [Zum Vergrößern anklicken]

Der p-Werte beantwortet folgende Frage:

“If the groups are sampled from populations with identical distributions, what is the chance that random sampling would result in a sum of ranks as far apart (or more so) as observed in this experiment?” — The Mann-Whitney test doesn’t really compare medians

\(H_0:\) Es ist gleich wahrscheinlich, dass ein zufällig aus der einen Population ausgewählter Wert größer oder kleiner ist als ein zufällig ausgewählter Wert aus der anderen Population

\(H_A:\) Es ist nicht gleich wahrscheinlich, dass ein zufällig aus der einen Population ausgewählter Wert größer oder kleiner ist als ein zufällig ausgewählter Wert aus der anderen Population

\[ H_0: Pr(X<Y) + \cfrac{1}{2} Pr(X = Y) = 0.5 \]

\[ H_A: Pr(X<Y) + \cfrac{1}{2} Pr(X = Y) \neq 0.5 \]

Abbildung 35.5— foo [Zum Vergrößern anklicken]

35.3 Genutzte R Pakete

Wir wollen folgende R Pakete in diesem Kapitel nutzen.

R Code [zeigen / verbergen]
pacman::p_load(tidyverse, magrittr, broom, tidyplots, rstatix,
               readxl, coin, ggpubr, nparcomp,
               conflicted)
conflicts_prefer(rstatix::wilcox_test)

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

35.4 Daten

Unabhängige Messungen

R Code [zeigen / verbergen]
fac1_tbl <- read_excel("data/flea_dog_cat.xlsx") |> 
  select(animal, jump_length) |> 
  mutate(animal = as_factor(animal))
Tabelle 35.1— Tabelle der Sprungweiten in [cm] als Messwert \(y\) von Hunde-, Katzen- und Fuchsflöhen. Der Datensatz ist einfaktoriell, da wir nur einen Faktor vorliegen haben.
tinytable_jzn1xvmm7te5j9oxbw6o
animal jump_length
dog 5.7
dog 8.9
dog 11.8
... ...
cat 4.3
cat 7.9
cat 6.1
Abbildung 35.6— Darstellung der Sprungweiten in [cm] gruppiert nach Hunde- und Katzenflöhen. Die graue Raute stellt den entsprechnenden Mittelwert der Sprungweiten dar. (A) Einfaktorieller Boxplot. (B) Violinplot mit Dotplot. [Zum Vergrößern anklicken]

Abhängige Messungen

R Code [zeigen / verbergen]
paired_tbl <- read_excel("data/flea_dog_cat_repeated.xlsx") 
Tabelle 35.2— Tabelle der Sprunglängen [cm] von fünf Hundeflöhen zu zwei Zeitpunkten. Einmal wurde die Sprungweite mit den hungrigen Flöhen und einmal mit den gleichen satten Flöhen bestimmt.
tinytable_qnyje6o4ubxo3g9m4tw2
id hungrig satt
1 5.2 6.1
2 4.1 5.2
3 3.5 3.9
4 3.2 4.1
5 4.6 5.3
Abbildung 35.7— Dotplot der Sprungweiten [cm] für Hundeflöhe in zwei verschiedenen Ernährungszuständen gemessen an zwei Zeitpunkten. Die Linien verbinden die Messung an dem gleichen Floh.
R Code [zeigen / verbergen]
paired_long_tbl <- paired_tbl |> 
  pivot_longer(cols = hungrig:satt,
               values_to = "jump_length",
               names_to = "trt") 

35.5 Hypothesen

Der Wilcoxon-Mann-Whitney-Test betrachtet die Mediane und Ränge um einen Unterschied nachzuweisen. Daher haben wir die Nullhypothese als Gleichheitshypothese. In unserem Beispiel lautet die Nullhypothese, dass die Mediane der beiden Levels des Faktors animal gleich sind. Wir vergleichen im Wilcoxon-Mann-Whitney-Test nur zwei Gruppen.

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

Die Alternative lautet, dass sich die beiden Gruppen im Median unterscheiden. Wir können uns über die Boxplots oder aber die berechneten Mediane dann den Unterschied bewerten.

\[ H_A: \; \widetilde{y}_{cat} \ne \widetilde{y}_{dog} \]

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

35.6 Der U-Test

35.6.1 … mit unabhängigen Beobachtungen

Der Wilcoxon-Mann-Whitney-Test berechnet die U Teststatistik auf den Rängend der Daten. Es gibt genau soviele Ränge wie es Beobachtungen im Datensatz gibt. Wir haben \(n = 14\) Beobachtungen in unseren Daten zu der Sprungweite in [cm] von den Hunde- und Katzenflöhen. Somit müssen wir auch vierzehn Ränge vergeben.

Die Tabelle 35.3 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 und dog zu den Rangsummen \(R_{cat}\) und \(R_{dog}\).

Tabelle 35.3— Datentablle absteigend sortiert nach der Sprunglänge in [cm]. Die Level cat und dog haben jeweils die entsprechenden Ränge zugeordnet bekommen und die Rangsummen wurden berechnet
Rank animal jump_length Ränge “cat” Ränge “dog”
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 cat 7.9 10
11 dog 8.2 11
12 dog 8.9 12
13 dog 9.1 13
14 dog 11.8 14
Rangsummen \(R_{cat} = 33\) \(R_{dog} = 72\)
Gruppengröße 7 7

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

\[ U_{D} = n_1n_2 + \cfrac{n_1(n_1+1)}{2}-R_1 \]

mit

  • \(R_1\) der größeren der beiden Rangsummen,
  • \(n_1\) die Fallzahl der größeren der beiden Rangsummen
  • \(n_2\) die Fallzahl der kleineren der beiden Rangsummen

Wir setzen nun die Zahlen ein. Da wir ein balanciertes Design vorliegen haben sind die Fallzahlen \(n_1 = n_2 = 7\) gleich. Wir müssen nur schauen, dass wir mit \(R_1\) die passende Rangsumme wählen. In unserem Fall ist \(R_1 = R_{dog} = 72\).

\[ U_{D} = 7 \cdot 7 + \cfrac{7(7+1)}{2}-72 = 5 \]

Der kritische Wert für die U Statistik ist \(U_{\alpha = 5\%} = 8\) für \(n_1 = 7\) und \(n_2 = 7\). Bei der Entscheidung mit der berechneten Teststatistik \(U_{D}\) gilt, wenn \(U_{D} \leq U_{\alpha = 5\%}\) wird die Nullhypothese (H\(_0\)) abgelehnt. Da in unserem Fall das \(U_{D}\) mit \(5\) kleiner ist als das \(U_{\alpha = 5\%} = 8\) 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 grosser Stichprobe, wenn \(n_1 + n_2 > 30\) ist, können wir die U Statistik auch standariseren und damit in den z-Wert transformieren.

\[ z_{D} = \cfrac{U_{D} - \bar{U}}{s_U} = \cfrac{U_{D} - \cfrac{n_1 \cdot n_2}{2}}{\sqrt{\cfrac{n_1 \cdot n_2 (n_1 + n_2 +1)}{12}}} \]

mit

  • \(\bar{U}\) dem Mittelwert der U-Verteilung ohne Unterschied zwischen den Gruppen
  • \(s_U\) Standardfehler des U-Wertes
  • \(n_1\) Stichprobengrösse der Gruppe mit der grösseren Rangsumme
  • \(n_2\) Stichprobengrösse der Gruppe mit der kleineren Rangsumme

Wir setzen dafür ebenfalls die berechnete U Statistik ein und müssen dann wieder konzentriert rechnen.

\[ z_{D} = \cfrac{5 - \cfrac{7 \cdot 7}{2}}{\sqrt{\cfrac{7 \cdot 7 (7 + 7 +1)}{12}}} = \cfrac{-19.5}{7.83} = |-2.46| \]

Der kritische Wert für die z-Statistik ist \(z_{\alpha = 5\%} = 1.96\). Bei der Entscheidung mit der berechneten Teststatistik \(z_{D}\) gilt, wenn \(z_{D} \geq z_{\alpha = 5\%}\) wird die Nullhypothese (H\(_0\)) abgelehnt. Wir haben eine berechnete z Statistik von \(z_{D} = 2.46\). Damit ist \(z_{D}\) größer als \(z_{\alpha = 5\%} = 1.96\) und wir können die Nullhypothese ablehnen. Wir haben einen signifkanten Unterschied zwischen den Medianen der beiden Floharten im Bezug auf die Sprunglänge in [cm].

wilxoc.test()

R Code [zeigen / verbergen]
wilcox.test(jump_length ~ animal, data = fac1_tbl, 
            conf.int = TRUE)

    Wilcoxon rank sum exact test

data:  jump_length by animal
W = 44, p-value = 0.01107
alternative hypothesis: true location shift is not equal to 0
95 percent confidence interval:
 1.0 5.9
sample estimates:
difference in location 
                   3.5 

wilcox_test()

R Code [zeigen / verbergen]
coin::wilcox_test(jump_length ~ animal, data = fac1_tbl, 
                  conf.int = TRUE) 

    Asymptotic Wilcoxon-Mann-Whitney Test

data:  jump_length by animal (dog, cat)
Z = 2.4916, p-value = 0.01272
alternative hypothesis: true mu is not equal to 0
95 percent confidence interval:
 1.2 5.7
sample estimates:
difference in location 
                   3.5 

Wilcoxon Test in R

wilcox_test()

R Code [zeigen / verbergen]
rstatix::wilcox_test(jump_length ~ animal, data = fac1_tbl) |> 
  select(group1, group2, p)
# A tibble: 1 × 3
  group1 group2      p
  <chr>  <chr>   <dbl>
1 dog    cat    0.0111

npar.t.test()

R Code [zeigen / verbergen]
npar_obj <- npar.t.test(jump_length ~ animal, data = fac1_tbl) 

 #------Nonparametric Test Procedures and Confidence Intervals for relative  effects-----# 
 
 - Alternative Hypothesis:  True relative effect p is less or equal than 1/2 
 - Confidence level: 95 % 
 - Method = Logit - Transformation 
 
 #---------------------------Interpretation----------------------------------# 
 p(a,b) > 1/2 : b tends to be larger than a 
 #---------------------------------------------------------------------------# 
 
R Code [zeigen / verbergen]
npar_obj$Analysis
      Effect Estimator Lower Upper      T p.Value
1 p(dog,cat)     0.102 0.018 0.412 -2.345   0.019

Effektschätzer

R Code [zeigen / verbergen]
fac1_tbl |> 
  wilcox_effsize(jump_length ~ animal) |> 
  select(effsize, magnitude)
# A tibble: 1 × 2
  effsize magnitude
    <dbl> <ord>    
1   0.666 large    

Parametrische Lösung: Der t-Test

R Code [zeigen / verbergen]
fac1_tbl |> 
  mutate(ranked_jump_length = rank(jump_length)) |> 
  t_test(ranked_jump_length ~ animal) |> 
  select(group1, group2, statistic, p)
# A tibble: 1 × 4
  group1 group2 statistic       p
  <chr>  <chr>      <dbl>   <dbl>
1 dog    cat         3.31 0.00624

35.6.2 … mit abhängigen Beobachtungen

wilxoc.test()

R Code [zeigen / verbergen]
wilcox.test(paired_tbl$hungrig, paired_tbl$satt, paired = TRUE)
Warning in wilcox.test.default(paired_tbl$hungrig, paired_tbl$satt, paired =
TRUE): cannot compute exact p-value with ties

    Wilcoxon signed rank test with continuity correction

data:  paired_tbl$hungrig and paired_tbl$satt
V = 0, p-value = 0.05791
alternative hypothesis: true location shift is not equal to 0

wilcox_test()

R Code [zeigen / verbergen]
wilcoxsign_test(paired_tbl$hungrig ~ paired_tbl$satt, paired = TRUE) 

    Asymptotic Wilcoxon-Pratt Signed-Rank Test

data:  y by x (pos, neg) 
     stratified by block
Z = -2.0319, p-value = 0.04217
alternative hypothesis: true mu is not equal to 0

Wilcoxon Test in R

wilcox_test()

R Code [zeigen / verbergen]
rstatix::wilcox_test(jump_length ~ trt, data = paired_long_tbl, paired = TRUE) |> 
  select(group1, group2, p)
# A tibble: 1 × 3
  group1  group2      p
  <chr>   <chr>   <dbl>
1 hungrig satt   0.0579

npar.t.test.paired()

R Code [zeigen / verbergen]
npar_obj <- npar.t.test.paired(jump_length ~ trt, data = paired_long_tbl,
                               plot.simci = FALSE)

 #----------------Nonparametric Paired t Test-------------------------------------------# 
 
 - Sample Size:  5 
 - Factor Levels:  hungrig satt 
 - H0:  p=1/2 
 - Alternative Hypothesis:  True relative effect is less or greater than 1/2 
 - Confidence Level: 95 % 
 - Method: Brunner-Munzel (BM), Permutation (PERM) 
 
 #--------------------------------------------------------------------------------------# 
 
R Code [zeigen / verbergen]
npar_obj$Analysis
     Lower p.hat Upper     T p.value
BM   0.656  0.76 0.864 6.949   0.002
PERM 0.500  0.76 1.020 6.949   0.000

Parametrische Lösung: Der paired t-Test

R Code [zeigen / verbergen]
paired_long_tbl |> 
  mutate(ranked_jump_length = rank(jump_length)) |> 
  t_test(ranked_jump_length ~ trt, paired = TRUE) |> 
  select(group1, group2, statistic, p)
# A tibble: 1 × 4
  group1  group2 statistic       p
  <chr>   <chr>      <dbl>   <dbl>
1 hungrig satt       -6.04 0.00378

35.7 Ergebnisse mit {tidyplots}

Häufig wollen wir nicht nur den p-Wert aus einem t-Test berichten sondern natürlich auch gleich die richtige Abbildung dazu haben. Hier gibt es mit dem R Paket {tidyplots} eine gute Möglichkeit. Das R Paket verbindet dabei die Funktionalität von {ggplot} und {ggpubr}. Dabei bleibt es aber dann sehr einfahc zu bedienen. Insbesondere in dem Fall, dass du nur zwei Gruppen in einem t-Test miteinander vergleichen willst.

Alternativen zu {tidyplots}

Das R Paket {ggpubr} bietet auch noch andere Alternativen für die Darstellung von statistischen Vergleichen in deinen Daten unter ggpubr: ‘ggplot2’ Based Publication Ready Plots. Vielleicht findest du da auch noch eine bessere Abbildung als hier. Da wir hier sehr viel ähnliches haben, bleibe ich bei {tidyplots}.

Neben den p-Werten, die ich hier mit der Funktion add_test_pvalue() ergänze kannst du auch Sterne mit der Funktion add_test_asterisks() nutzen. Das liegt dann ganz bei dir. Es geibt auch die Möglichkeit nicht signifikante Ergebnisse auszublenden. Mehr dazu findest du dann auf der Hilfeseite zu den statistischen Vergleichen in {tidyplots}. Ich zeige hier dir nur die Standardanwendung. Wichtig ist auch zu wissen, dass wir immer einen Welch t-Test rechnen, also immer für die Varianzheterogenität adjustieren. Das ist auch eigentlich die bessere Variante als der Student t-Test. Häufig ist es sehr schwer in kleinen Fallzahlen abzuschätzen wie die Varianzen in den Gruppen sind. Dann lieber gleich richtig adjsutieren und auf der sicheren Seite sein.

Die Standardabbildung ist sicherlich der Barplot zusammen mit der Standardabweichung als Fehlerbalken. Dann habe ich noch die einzelnen Beobachtungen ergänzt. Die Klammer über den beiden Säulen gibt den Vergleich an und die Zahl ist der p-Wert aus einem Welch t-Test. Wir sehen hier, dass sich die beiden Floharten in den Sprungweiten signifikant unterscheiden. Der p-Wert ist kleiner als das Signifikanzniveau \(\alpha\) gleich 5%.

R Code [zeigen / verbergen]
tidyplot(data = fac1_tbl, 
         x = animal, y = jump_length, color = animal) |> 
  add_data_points() |>
  add_mean_bar(alpha = 0.4, width = 0.4) |> 
  add_sd_errorbar(width = 0.2) |> 
  add_test_pvalue(method = "wilcox_test", hide_info = TRUE) |>
  remove_legend() |> 
  adjust_font(fontsize = 9) |>
  adjust_x_axis_title("Flohart") |>
  adjust_y_axis_title("Sprungweite in [cm]") |> 
  rename_x_axis_labels(new_names = c("dog" = "Hund", "cat" = "Katze")) |> 
  adjust_size(width = NA, height = NA) 
Abbildung 35.8— Einfaktorieller Barplot für die Sprungweiten in [cm] gruppiert nach den Floharten mit mehr Optionen und angepassten Beschriftungen sowie den p-Wert aus einem Welch t-Test.

Es gibt auch gute Gründe ienmal den Boxplot zu wählen, wenn wir etwas besser die Verteilung der Sprungweiten darstellen wollen. Ich habe dann noch die einzelnen Beobachtungen ergänzt. Die Klammer über den beiden Säulen gibt den Vergleich an und die Zahl ist der p-Wert aus einem Welch t-Test. Wir sehen hier, dass sich die beiden Floharten in den Sprungweiten signifikant unterscheiden. Der p-Wert ist kleiner als das Signifikanzniveau \(\alpha\) gleich 5%.

R Code [zeigen / verbergen]
tidyplot(data = fac1_tbl, 
         x = animal, y = jump_length, color = animal) |> 
  add_data_points() |>
  add_boxplot(alpha = 0.4, box_width = 0.3) |> 
  add_test_pvalue(method = "wilcox_test", hide_info = TRUE) |> 
  remove_legend() |> 
  adjust_font(fontsize = 9) |>
  adjust_x_axis_title("Flohart") |>
  adjust_y_axis_title("Sprungweite in [cm]") |> 
  rename_x_axis_labels(new_names = c("dog" = "Hund", "cat" = "Katze")) |> 
  adjust_size(width = NA, height = NA) 
Abbildung 35.9— Einfaktorieller Boxplot für die Sprungweiten in [cm] gruppiert nach den Floharten mit mehr Optionen und angepassten Beschriftungen sowie den p-Wert aus einem Welch t-Test.

Am Ende wollen wir uns dann nochmal den gepaarten t-Test anschauen. Hier ist dann die Abbildung realtiv einfach. Wir können da die Daten paired_tbl aus dem gepaarten t-Test nutzen nachdem wir die Daten in das Long-Format überführt haben. Etwas schwieriger ist dann der p-Wert, den p-Wert müssen wir dann erst selber errechnen und dann ergänzen. Also fangen wir einmal an die Daten in das Long-Format zu überführen.

R Code [zeigen / verbergen]
paired_long_tbl <- paired_tbl |> 
  pivot_longer(cols = satt:hungrig,
               values_to = "jump_length",
               names_to = "trt")

Jetzt können wir den gepaarten t-Test rechnen und zwar aus dem R Paket {rstatix}. Dann müssen wir noch alles so umbauen, dass wir die Informationen dann in {tidyplots} auch nutzen können.

R Code [zeigen / verbergen]
stats_tbl <- paired_long_tbl |> 
  arrange(id) |> 
  wilcox_test(jump_length ~ trt, paired = TRUE) |> 
  add_significance() |> 
  add_xy_position()

Wir butzen hier die Funktion stat_pvalue_manual() um händisch die p-Werte zu den Dotplot mit den Mittelwert und Standardabweichung zu ergänzen. Die Verbindungen zwischen den Beobachtungen haben wir dann durch add_line() erzeugt. Ich gebe zu, dass ist etwas komplizierter. Wenn du dann die Sterne haben willst, dann musst due das Label auf "p.signif" setzen. Dann werden statt der p-Werte "p" dir die Sterne * angezeigt. Wir sehen hier, dass sich die beiden Fütterungslevel in den Sprungweiten signifikant unterscheiden. Der p-Wert ist kleiner als das Signifikanzniveau \(\alpha\) gleich 5%.

R Code [zeigen / verbergen]
paired_long_tbl |> 
  tidyplot(x = trt, y = jump_length, color = trt, fill = NA) |> 
  add_line(group = id, color = "grey") |> 
  add_data_points() |>
  add_mean_dash(width = 0.2) |> 
  add_sd_errorbar(width = 0.2) |> 
  add(stat_pvalue_manual(stats_tbl, size = 7/.pt, label = "p",
                         bracket.nudge.y = 0.1)) |> 
  remove_legend() |> 
  adjust_font(fontsize = 9) |>
  adjust_x_axis_title("Fütterung") |>
  adjust_y_axis_title("Sprungweite in [cm]") |> 
  reorder_x_axis_labels("hungrig", "satt") |>  
  rename_x_axis_labels(new_names = c("satt" = "gefüttert", "hungrig" = "ungefüttert")) |>
  adjust_size(width = NA, height = NA) 
Abbildung 35.10— Dotplot mit Mittelwert und Standardabweichung für die Sprungweiten in [cm] gruppiert nach den Floharten mit mehr Optionen und angepassten Beschriftungen sowie den p-Wert aus einem paired t-Test. Gleiche Messungen an gleichen Flöhen sind mit einer Linie verbunden.

Referenzen

Divine, G. W., Norton, H. J., Barón, A. E., & Juarez-Colunga, E. (2018). The Wilcoxon–Mann–Whitney procedure fails as a test of medians. The American Statistician, 72(3), 278–286.
Hart, A. (2001). Mann-Whitney test is not just a test of medians: differences in spread can be important. Bmj, 323(7309), 391–393.
Sugimoto, E., Li, J., Hayashi, Y., Iida, K., Asada, S., Fukushima, T., Tamura, M., Shikata, S., Zhang, W., Yamamoto, K., et al. (2023). Hyperactive Natural Killer cells in Rag2 knockout mice inhibit the development of acute myeloid leukemia. Communications Biology, 6(1), 1294.