Rozdział 20 Testy nieparametryczne
Poniżej przedstawione testy, razem z testem chi-kwadrat opisanym w rozdziale 18, są najpopularniejszymi testami zaliczanymi do grupy testów nazywanej testami nieparametrycznymi.
W odróżnieniu od testów parametrycznych (takich jak te przedstawione w rozdziałach 14-17 i 19), testy nieparametryczne mają luźniejsze założenia. W szczególności nie potrzebują założenia o rozkładzie normalnym w populacji. Jednocześnie jednak testy nieparametryczne mają zwykle słabszą moc w porównaniu z ich parametrycznymi odpowiednikami.
20.1 Test serii
Test serii jest prostym testem sprawdzającym, czy dane dychotomiczne (przedstawiane w formie ciągu zer i jedynek) są ułożone losowo.
Hipoteza zerowa w tym teście stwierdza, że dane są ułożone losowo. Hipoteza alternatywna, że kolejność wyników nie jest losowa.
Losowość sprawdza się zliczając liczbę serii. Seria (ang. run14) to oddzielony ciąg zer lub jedynek. Np. w ciągu 0001100010 serie to 000, 11, 000, 1 i 0.
Statystyka testowa w tym teście to
\[z = \frac{r - \mu_r - \text{sgn}(r - \mu_r)/2}{\sigma_r},\]
gdzie
\[\mu_r = \frac{2 n_0 n_1}{n} + 1,\]
\[\sigma_r = \sqrt{\frac{2 n_0 n_1 (2 n_0 n_1 - n)}{n^2 (n - 1)}},\]
\(r\) to liczba serii,
\(n_0\) to liczba zer,
\(n_1\) to liczba jedynek,
\(n = n_0+n_1\) to liczba elementów ciągu (zer lub jedynek).
Test stosujemy dla dużych prób (można przyjąć kierunkowo \(n \geqslant 30\)), statystyka testowa \(z\) ma wtedy w przybliżeniu rozkład normalny standardowy.
20.2 Test Manna-Whitneya
Test Manna-Whitneya (nazywany też testem Wilcoxona-Manna-Whitneya) to test będący odpowiednikiem parametrycznego testu 2 średnich (zob. 16).
Założenia: Niezależne próby losowe pochodzą z dwóch populacji.
Hipotezy: H0: W obu populacjach są takie same rozkłady, co oznacza taką samą średnią rangę w obu populacjach. HA: Różne średnie rangi w obu populacjach. Możliwa jest również hipoteza jednostronna: rangi są systematycznie niższe lub wyższe w jednej z populacji.
Statystyka testowa: Statystyka testowa U wyznaczona jest na podstawie rang. Uwzględnia również przypadek rang wiązanych (gdy więcej niż jedna obserwacja ma taką samą wartość). Konstrukcja statystyki testowej jest dość złożona, wyliczają ją dobre pakiety statystyczne.
Wielkość efektu: Zgrabną miarą wielkości efektu w teście Manna-Whitneya jest AUC (nazwa pochodzi od skrótu area under the ROC curve — pole pod krzywą ROC, czyli tzw. krzywą charakterystyki operacyjnej odbiornika15). Tę miarę można interpretować następująco: jeżeli wylosujemy jedną obserwację z grupy 1 i jedną obserwację z grupy 2, to prawdopodobieństwo, że obserwacja z grupy 1 będzie miała wyższą rangę16, to właśnie AUC. Aby obliczyć AUC, nie trzeba rysować krzywej ROC, szczególnie gdy mamy już statystykę U:
\[AUC = \frac{U}{n_1n_2}\]
20.3 Test Wilcoxona dla par obserwacji
Test Wilcoxona dla par obserwacji jest odpowiednikiem parametrycznego testu średniej różnicy dla prób zestawionych w pary (zob. 16.4).
Założenia: Losowa próba obserwacji zestawionych w pary. Różnice obserwacji mają symetryczny rozkład (w populacji) i można je uszeregować za pomocą rang.
Hipotezy: H0: Mediana różnic w populacji wynosi 0; HA: Mediana różnic w populacji nie wynosi 0. Możliwe są również jednostronne hipotezy alternatywne.
Statystyka testowa: Statystyka testowa wyprowadzona jest na podstawie rang obserwacji. Dla dużych prób statystykę testową można przekształcić w statystykę \(z\) mającą w przybliżeniu rozkład normalny.
20.4 Test Kruskala-Wallisa
Test Kruskala-Wallisa jest nieparametrycznym odpowiednikiem analizy wariancji (ANOVA, rozdział 19).
Założenia: Próby losowe zostały pobrane niezależnie z kilku (\(r\)) populacji.
Hipotezy: H0: We wszystkich \(r\) populacjach są takie same rozkłady prawdopodobieństwa. HA: Nie we wszystkich populacjach są takie same rozkłady prawdopodobieństwa.
Statystyka testowa: Opiera się na zmienności międzygrupowej rang w próbach. Wartość p (p-value) można odczytać z rozkładu chi-kwadrat o \(r-1\) stopniach swobody (prawostronny obszar krytyczny).
20.5 Linki
Test Manna-Whitneya (Pogotowie statystyczne): https://pogotowiestatystyczne.pl/aploud/2023/04/2023-04-Test-Manna-Whitneya.pdf
Test Wilcoxona (Pogotowie statystyczne): https://pogotowiestatystyczne.pl/aploud/2023/04/2023-05-Test-Wilcoxona.pdf
Test Kruskala-Wallisa (Pogotowie statystyczne): https://pogotowiestatystyczne.pl/aploud/2023/04/2023-07-Test-Kruskala-Wallisa.pdf
20.6 Szablony
Test serii — arkusz Google
Test serii — szablon w Excelu
Test Manna-Whitneya — arkusz Google
Test Manna-Whitneya — szablon w Excelu
Test Wilcoxona dla par obserwacji — arkusz Google
Test Wilcoxona dla par obserwacji — szablon w Excelu
Test Kruskala-Wallisa — arkusz Google
Test Kruskala-Wallisa — szablon w Excelu
# Test serii
# Przykładowe dane
vOR <- "OORORRROORORROOROROOROROOORRORORORROORRRROOROORRORORROROOOR"
# Zamiana na wektor zer i jedynek
v01 <- 1*(unlist(strsplit(vOR, ""))=="O")
# Test
DescTools::RunsTest(v01)
##
## Runs Test for Randomness
##
## data: v01
## z = 1,8413, runs = 38, m = 29, n = 30, p-value = 0,06557
## alternative hypothesis: true number of runs is not equal the expected number
# Test Manna-Whitneya
# Przykładowe dane:
p1<-c(24, 25, 21, 22, 23, 18, 17, 28, 24, 27, 21, 23)
p2<-c(20, 23, 21, 25, 18, 17, 18, 24, 20, 24, 23, 19)
# Test
# z parametrami: wilcox.test(p1, p2, correct=TRUE, exact=FALSE)
wilcox.test(p1, p2)
##
## Wilcoxon rank sum test with continuity correction
##
## data: p1 and p2
## W = 94, p-value = 0,2114
## alternative hypothesis: true location shift is not equal to 0
# Test Wilcoxona dla par obserwacji
# Przykładowe dane:
p1<-c(24, 25, 21, 22, 23, 18, 17, 28, 24, 27, 21, 23)
p2<-c(20, 23, 21, 25, 18, 17, 18, 24, 20, 24, 23, 19)
# Test:
# z parametrami: wilcox.test(p2, p1, paired=TRUE, correct=FALSE, exact=FALSE, alternative="two.sided")
wilcox.test(p1, p2, paired=TRUE)
##
## Wilcoxon signed rank test with continuity correction
##
## data: p1 and p2
## V = 55,5, p-value = 0,04898
## alternative hypothesis: true location shift is not equal to 0
# Test Kruskala-Wallisa
# Przykładowe dane:
df<-data.frame(A = c(7,8,9,9,10,11), B = c(12,13,14,14,15,16))
df2 <- tidyr::gather(df)
# Test:
kruskal.test(value ~ key, data = df2)
##
## Kruskal-Wallis rank sum test
##
## data: value by key
## Kruskal-Wallis chi-squared = 8,3662, df = 1, p-value = 0,003823
import numpy as np
import pandas as pd
from scipy.stats import wilcoxon, kruskal, mannwhitneyu
from statsmodels.stats.proportion import proportions_ztest
# Test serii
# Przykładowe dane
vOR = "OORORRROORORROOROROOROROOORRORORORROORRRROOROORROR"
# Zamiana na wektor zer i jedynek
v01 = np.array([1 if char == 'O' else 0 for char in vOR])
# Obliczenia
def getRuns(l):
import itertools
# return len([sum(1 for _ in r) for _, r in itertools.groupby(l)])
return sum(1 for _ in itertools.groupby(l))
r = getRuns(v01)
n = len(v01)
n1 = sum(v01)
n0 = n - n1
mu_r = (2 * n0 * n1 / n) + 1
sigma_r = np.sqrt((2 * n0 * n1 * (2 * n0 * n1 - n)) / (n ** 2 * (n - 1)))
z = (r-mu_r-np.sign(r-mu_r)/2)/sigma_r
p_value = 2 * (1 - norm.cdf(abs(z)))
print("z =", z, "p-value =", p_value)
## z = 1.5717559182858727 p-value = 0.11600716834451785
# Test Manna-Whitneya
# Przykładowe dane:
p1 = np.array([24, 25, 21, 22, 23, 18, 17, 28, 24, 27, 21, 23])
p2 = np.array([20, 23, 21, 25, 18, 17, 18, 24, 20, 24, 23, 19])
# Test
mannwhitneyu(p1, p2)
## MannwhitneyuResult(statistic=94.0, pvalue=0.21138945901258455)
# Test Wilcoxona dla par obserwacji
# Przykładowe dane:
p1 = np.array([24, 25, 21, 22, 23, 18, 17, 28, 24, 27, 21, 23])
p2 = np.array([20, 23, 21, 25, 18, 17, 18, 24, 20, 24, 23, 19])
# Test:
# z parametrami: wilcox.test(p2, p1, paired=True, correct=False, exact=False, alternative="two.sided")
wilcoxon(p1, p2)
## WilcoxonResult(statistic=10.5, pvalue=0.044065400736826854)
# Test Kruskala-Wallisa
# Przykładowe dane:
df = pd.DataFrame({'A': [7, 8, 9, 9, 10, 11], 'B': [12, 13, 14, 14, 15, 16]})
df2 = df.melt()
# Test:
kruskal(*[group["value"].values for name, group in df2.groupby("variable")])
## KruskalResult(statistic=8.366197183098597, pvalue=0.0038226470545864484)
20.7 Zadania
Zadanie 20.1 Grupa studencka otrzymała zadanie stworzenia wymyślonych wyników 100 rzutów monetą (orzeł/reszka). Studentka Julia zapisała na kartce następujący ciąg wyników:
OORORRROOR ORROOROROO ROROOORROR ORORROORRR ROOROORROR ORROROOORO RROOOROROR ORROORRROO RORROROOOR ORRROORORR
Za pomocą testu serii sprawdź, czy ciąg przygotowany przez studentkę Julię można uznać za ciąg losowy.
Zadanie 20.2 Użyj danych z zadania 16.2, żeby przeprowadzić odpowiedni test nieparametryczny.
Zadanie 20.3 Użyj danych z zadania 16.5, żeby przeprowadzić odpowiedni test nieparametryczny.
Zadanie 20.4 Użyj danych z zadania 19.2, żeby przeprowadzić odpowiedni test nieparametryczny.