Willkommen bei Stats by Randolph. Hier geht es zur Hauptseite mit weiteren Informationen und Inhalten.

Autor:innen dieser Seite: An den Inhalten dieser Seite haben mitgearbeitet: Valentin Koob, Eva Röttger und Markus Janczyk. Der Inhalt dieser Seite wird in der Lehre in den Studiengängen Psychologie von der AG Forschungsmethoden und Kognitive Psychologie an der Universität Bremen verwendet, steht aber allen Interessierten zur Verfügung. Rückmeldungen/Fehler/Vorschläge können gesendet werden an .

Versionshistory:

  • v1.0: erste online-gestellte Version (14.9.2023)

1 Mann-Whitney \(U\)-Test

In Teil 15 von Statistik 1 haben wir den Mann-Whitney \(U\)-Test als non-parametrischen Test für Unterschiedshypothesen kennengelernt. Dabei wurde die Prüfgröße \(U\) auf Basis der Rangsummen \(RS_1\) und \(RS_2\) berechnet. Zunächst wurden dazu die Werte \(U_1\) und \(U_2\) ermittelt: \[U_1=n_1n_2+\frac{n_1(n_1+1)}{2}-RS_1\hspace{0.5cm}\text{und}\hspace{0.5cm} U_2=n_1n_2+\frac{n_2(n_2+1)}{2}-RS_2\] Die Prüfgröße ergibt sich dann als \[U=\min(U_1,U_2)\]

2 Berechnung des \(p\)-Wertes

Wir hatten festgehalten, dass bei hinreichend großen Stichproben der \(z\)-transformierte Werte von \(U\) an einer Standardnormalverteilung getestet werden kann. Dazu benötigen wir den Erwartungswert und die Varianz der Zufallsvariablen \(\mathbf{U}\) \[E(\mathbf{U})=\frac{n_1n_2}{2}\hspace{0.5cm}\text{und}\hspace{0.5cm}\sigma^2_{\mathbf{U}}=\frac{n_1n_2(n_1+n_2+1)}{12}\] und können schließlich \[z_U=\frac{U-E(\mathbf{U})}{\sqrt{\sigma^2_\mathbf{U}}}\] berechnen.

Der folgende R-Code demonstriert dies:

set.seed(3)                            # zur Reproduzierbarkeit
                                       # für andere Ergebnisse löschen oder ändern
n1 <- 250                              # Stichprobengröße 1
n2 <- 250                              # Stichprobengröße 2
Sample1 <- round(runif(n1, 0, 30))     # jeweils gezogen aus einer Gleichverteilung
Sample2 <- round(runif(n2, 2, 32))

# daraus ein DataFrame machen
data <- data.frame(dv = c(Sample1, Sample2),
                   iv = rep(c("group1", "group2"), times = c(n1,n2)))

# die beiden Rangsummen berechnen
RS <- aggregate(rank(dv) ~ iv,
                data = data,
                FUN = sum)

RS1 <- RS$`rank(dv)`[1]   # RS1
RS2 <- RS$`rank(dv)`[2]   # RS2
print(paste0("RS1 = ", RS1," und RS2 = ", RS2))
## [1] "RS1 = 57068.5 und RS2 = 68181.5"
# dann die beiden U1 und U2 Werte berechnen:
U1 <- n1*n2+( (n1*(n1+1)) / (2)) - RS1
U2 <- n1*n2+( (n2*(n2+1)) / (2)) - RS2
print(paste0("U1 = ",U1, " und U2 = ", U2))
## [1] "U1 = 36806.5 und U2 = 25693.5"
# Prüfgröße U bestimmen
U <- min(U1, U2)

# dann benötigen wir noch Erwartungswert und Varianz von U...
E.U <- (n1*n2) / 2
V.U <- (n1*n2*(n1+n2+1)) / 12

# ...und können damit den z-transformierten Wert von U berechnen
z.U <- (U-E.U)/sqrt(V.U)
z.U
## [1] -3.439799
# mit pnorm() wird schließlich der p-Wert berechnet
2*pnorm(z.U) # p-Wert zweiseitig --> stimmt hier
## [1] 0.0005821463
# zwar gibt es Abweichungen zum p-Wert der Funktion, aber je größer die Stichproben werden, desto 
# geringer sind die Abweichungen
wilcox.test(Sample1, Sample2)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Sample1 and Sample2
## W = 25694, p-value = 0.0005782
## alternative hypothesis: true location shift is not equal to 0

Die verbleibenden Abweichungen des manuell berechneten \(p\)-Wertes und des von wilcox.test() berechneten \(p\)-Wertes liegen daran, dass diese Funktion eine leicht korrigierte Approximation von \(\sigma^2_\mathbf{U}\) verwendet.