Chciałbym przetestować hipotezę, że dwie próbki pochodzą z tej samej populacji, nie przyjmując żadnych założeń dotyczących rozkładu próbek lub populacji. Jak mam to zrobić?
Z Wikipedii mam wrażenie, że test U Manna Whitneya powinien być odpowiedni, ale wydaje mi się, że nie działa w praktyce.
Dla konkretności stworzyłem zestaw danych z dwoma próbkami (a, b), które są duże (n = 10000) i pochodzą z dwóch populacji, które są nienormalne (bimodalne), są podobne (ta sama średnia), ale są różne (odchylenie standardowe wokół „garbów”). Szukam testu, który rozpozna, że próbki nie pochodzą z tej samej populacji.
Widok histogramu:
Kod R:
a <- tibble(group = "a",
n = c(rnorm(1e4, mean=50, sd=10),
rnorm(1e4, mean=100, sd=10)))
b <- tibble(group = "b",
n = c(rnorm(1e4, mean=50, sd=3),
rnorm(1e4, mean=100, sd=3)))
ggplot(rbind(a,b), aes(x=n, fill=group)) +
geom_histogram(position='dodge', bins=100)
Oto zaskakująco (?) Test Manna Whitneya, który nie odrzucił hipotezy zerowej, że próbki pochodzą z tej samej populacji:
> wilcox.test(n ~ group, rbind(a,b))
Wilcoxon rank sum test with continuity correction
data: n by group
W = 199990000, p-value = 0.9932
alternative hypothesis: true location shift is not equal to 0
Wsparcie! Jak zaktualizować kod, aby wykrył różne dystrybucje? (Chciałbym szczególnie metodę opartą na ogólnej randomizacji / ponownym próbkowaniu, jeśli jest dostępna).
EDYTOWAĆ:
Dziękuję wszystkim za odpowiedzi! Z podekscytowaniem dowiaduję się więcej o Kołmogorowie – Smirnowie, który wydaje się bardzo odpowiedni do moich celów.
Rozumiem, że test KS porównuje te ECDF dwóch próbek:
Tutaj mogę wizualnie zobaczyć trzy interesujące funkcje. (1) Próbki pochodzą z różnych dystrybucji. (2) A jest wyraźnie powyżej B w niektórych punktach. (3) A jest wyraźnie poniżej B w niektórych innych punktach.
Test KS wydaje się być w stanie sprawdzić hipotezę każdej z tych cech:
> ks.test(a$n, b$n)
Two-sample Kolmogorov-Smirnov test
data: a$n and b$n
D = 0.1364, p-value < 2.2e-16
alternative hypothesis: two-sided
> ks.test(a$n, b$n, alternative="greater")
Two-sample Kolmogorov-Smirnov test
data: a$n and b$n
D^+ = 0.1364, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies above that of y
> ks.test(a$n, b$n, alternative="less")
Two-sample Kolmogorov-Smirnov test
data: a$n and b$n
D^- = 0.1322, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y
To jest naprawdę fajne! Praktycznie interesuję się każdą z tych funkcji, więc świetnie, że test KS może sprawdzić każdą z nich.