Testowanie losowo generowanych danych pod kątem zamierzonego rozkładu


17

Napisałem program, który generuje losowe dane. Jeśli program działa poprawnie, dane powinny mieć określony, znany rozkład prawdopodobieństwa. Chciałbym uruchomić program, wykonać obliczenia wyniku i podać wartość p.

Zanim ktokolwiek to powie: rozumiem, że testowanie hipotez nie może wykryć, kiedy program działa poprawnie. Może wykryć tylko, gdy działa nieprawidłowo w określony sposób. (I nawet wtedy test „powinien” zawieść X% czasu, w zależności od wybranego poziomu istotności ...)

Staram się więc zrozumieć, jakie narzędzia mogą być odpowiednie. W szczególności:

  • Mogę wygenerować tyle losowych danych, ile chcę. Wystarczy, że uruchomię program wystarczająco długo. Więc nie jestem ograniczony do żadnej konkretnej wielkości próbki.

  • Interesują mnie techniki, które dają wartość p. Więc gapienie się na wykres i powiedzenie „tak, to wygląda trochę liniowo” nie jest ciekawą opcją. Chyba że istnieje jakiś sposób na ustawienie twardej liczby na „wygrywalności” wykresu. ;-)

Co wiem do tej pory:

  • Widziałem trzy główne rodzaje wspomnianych testów, które brzmią, jakby mogły mieć zastosowanie: test chi-kwadrat Pearsona, test Kołmogorowa-Smirnowa i test Andersona-Darlinga.

  • Wydaje się, że test chi-kwadrat jest odpowiedni dla rozkładów dyskretnych , podczas gdy dwa pozostałe są bardziej odpowiednie dla rozkładów ciągłych . (?)

  • Różne źródła podają, że test AD jest „lepszy” niż test KS, ale nie zawierają żadnych dalszych szczegółów.

Ostatecznie wszystkie te testy prawdopodobnie wykrywają „różne sposoby” odstępstwa od określonego rozkładu zerowego. Ale tak naprawdę nie wiem jeszcze, jakie są różnice ... Podsumowując, szukam jakiegoś ogólnego opisu tego, gdzie każdy rodzaj testu jest najbardziej odpowiedni i jakie problemy najlepiej wykrywa.


Jeśli sam go napisałeś, prawie nie może „zawieść”, gdy przekroczysz granice swojej wiedzy (którą umieściłeś w projekcie). Spójrz na random.org/analysis, które zawierają listę niektórych metod sprawdzania, i oczywiście stackoverflow.com/q/2130621/717355 . Filozoficznie, jeśli program jest deterministyczny, to i tak nie może być przypadkowy ;-) Zdecydowanie warto go przestudiować (i nie zapomnij o dyskusjach dotyczących hakowania haseł).
Philip Oakley,

Odpowiedzi:


21

Oto ogólny opis działania 3 wymienionych metod.

Metoda Chi-Squared polega na porównaniu liczby obserwacji w zbiorniku z liczbą oczekiwaną w zbiorniku na podstawie rozkładu. W przypadku dystrybucji dyskretnych pojemniki są zwykle dyskretnymi możliwościami lub ich kombinacjami. W przypadku ciągłych rozkładów możesz wybrać punkty cięcia, aby utworzyć pojemniki. Wiele funkcji, które to zaimplementują, automatycznie utworzy przedziały, ale powinieneś być w stanie utworzyć własne przedziały, jeśli chcesz porównać w określonych obszarach. Wadą tej metody jest to, że nie zostaną wykryte różnice między rozkładem teoretycznym a danymi empirycznymi, które nadal umieszczają wartości w tym samym przedziale, przykładem może być zaokrąglanie, jeśli teoretycznie liczby między 2 a 3 powinny być rozłożone w całym zakresie (spodziewamy się zobaczyć wartości takie jak 2.34296),

Statystyka testu KS jest maksymalną odległością między 2 porównywanymi funkcjami rozkładu skumulowanego (często teoretyczną i empiryczną). Jeśli 2 rozkłady prawdopodobieństwa mają tylko 1 punkt przecięcia, wówczas 1 minus maksymalna odległość to obszar nakładania się 2 rozkładów prawdopodobieństwa (pomaga to niektórym ludziom wizualizować, co jest mierzone). Pomyśl o wykreśleniu na tym samym wykresie funkcji rozkładu teoretycznego i EDF, a następnie zmierz odległość między 2 „krzywymi”, największą różnicą jest statystyka testowa i jest ona porównywana z rozkładem wartości dla tego, gdy zerowa jest prawdziwa. To wychwytuje różnice w kształcie rozkładu lub 1 rozkład przesunięty lub rozciągnięty w porównaniu do drugiego.1n

Test Andersona-Darlinga wykorzystuje również różnicę między krzywymi CDF, jak test KS, ale zamiast maksymalnej różnicy wykorzystuje funkcję całkowitego pola powierzchni między dwoma krzywymi (w rzeczywistości różnicuje kwadraty, waży je, więc ogony mają większy wpływ, a następnie integruje się w domenie dystrybucji). Daje to większą wagę wartościom odstającym niż KS, a także daje większą wagę, jeśli istnieje kilka małych różnic (w porównaniu z 1 dużą różnicą, którą KS podkreśliłby). Może to doprowadzić do obezwładnienia testu w celu znalezienia różnic, które uważasz za nieistotne (łagodne zaokrąglanie itp.). Podobnie jak test KS zakłada to, że nie oszacowałeś parametrów na podstawie danych.

Oto wykres pokazujący ogólne idee ostatnich 2:

wprowadź opis zdjęcia tutaj

na podstawie tego kodu R:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

Górny wykres pokazuje EDF próbki ze standardowej normy w porównaniu do CDF standardowej normy z linią pokazującą statystykę KS. Środkowy wykres pokazuje różnicę na 2 krzywych (możesz zobaczyć, gdzie występuje statystyka KS). Dno jest wtedy kwadratową, ważoną różnicą, test AD opiera się na polu pod tą krzywą (zakładając, że wszystko poprawnie wykonałem).

Inne testy sprawdzają korelację w qqplot, patrzą na nachylenie w qqplot, porównują średnią, var i inne statystyki w oparciu o momenty.


+1, to dobra odpowiedź na aktualne pytanie (w przeciwieństwie do mojego ...). Opis biegnący przez środek akapitu 3 wymaga jedynie przedstawienia ilustracyjnej postaci, jeśli czujesz się skłonny do jej stworzenia.
Gung - Przywróć Monikę

To naprawdę miła odpowiedź. Żeby się upewnić, że rozumiem całkowicie: test KS zwraca największe odchylenie między CDF i EDF, podczas gdy AD zwraca całkowite [ważone] pole między dwiema krzywymi?
MathematicalOrchid

@MathematicalOrchid, w większości poprawne, AD kwadrat kwadratu odległość, następnie wagi, a następnie całkuje, więc jest nieco inny niż obszar (choć dla zrozumienia, myślenie o nim jako obszarze jest prawdopodobnie w porządku i znacznie prostsze).
Greg Snow

1
Oczekuję, że jeśli twój rozkład teoretyczny miałby masę punktową (skok pionowy w CDF w danym punkcie), a faktyczny rozkład twoich danych miał masę punktową w prawie, ale nie całkiem, w tym samym miejscu, to test KS może być lepszy do testu AD. Ale ta sprawa jest prawdopodobnie nieco wymyślona. Test KS pozwala na testy jednostronne, w których AD ma zawsze charakter dwustronny, więc byłaby to kolejna różnica (po prostu nie powszechna).
Greg Snow

2
Nie podoba mi się charakterystyka @MathematicalOrchid, że statystyki KS zależą tylko od „jednego skrajnego punktu”. Lokalizacja tego „jednego punktu” (często w środku rozkładu) w CDF zależy od wartości innych punktów w zestawie, a zatem nie jest tak odizolowana ani samotna, jak sugerowałby ten język naiwnemu słuchaczowi.
DWin

12

+1 za napisanie jasnego i szczegółowego pytania. Mam nadzieję, że moja odpowiedź nie będzie zbyt frustrująca. Uważam, że testowanie hipotez nie jest właściwym podejściem w twoim przypadku. Testowanie znaczenia hipotezy zerowej jest rozsądną rzeczą, gdy odpowiedź może brzmieć tak lub nie, ale nie wiesz, która z nich . (Niestety, tak naprawdę nie mówi, które to jest, ale jest to inny problem.) W twoim przypadku, rozumiem, chcesz wiedzieć, czy twój algorytm jest dobry. Wiadomo jednak (z całą pewnością), że żaden program komputerowy nie może generować prawdziwie losowych danych z dowolnego rozkładu prawdopodobieństwa. Jest tak po pierwsze, ponieważ wszystkie komputery są maszynami skończonymi , a zatem mogą wytwarzać tylko liczby pseudolosowe. Co więcej (odkładając na bok brak prawdziwej przypadkowości), nie jest możliwe, aby wygenerowane wartości idealnie odpowiadały jakiemukolwiek ciągłemu rozkładowi. Jest kilka sposobów, aby to zrozumieć, ale być może najłatwiej jest, aby w linii liczbowej pojawiły się „luki”, co nie jest prawdą w przypadku żadnej ciągłej zmiennej losowej. Co więcej, luki te nie są idealnie idealnie równe ani idealnie równomiernie rozmieszczone. Wśród informatyków pracujących nad generowaniem liczb pseudolosowych nazwa gry polega na ulepszeniu algorytmów, tak aby luki były mniejsze, bardziej równomierne, z dłuższymi okresami (a także by mogły szybciej generować więcej wartości). W każdym razie fakty te dowodzą, że testowanie hipotez jest niewłaściwym podejściem do określania, czy algorytm właściwie postępuje zgodnie z „określonym, znanym rozkładem prawdopodobieństwa”, bo tak nie jest. (Przepraszam.)

Zamiast tego bardziej odpowiednim rozwiązaniem jest określenie, jak blisko są twoje dane do teoretycznego rozkładu. Do tego polecam ponowne rozważenie działek, szczególnie QQ-działek i PP-działek1-βr=1

Z drugiej strony, w odniesieniu do oceny jakości algorytmu, możesz chcieć ustalić czas względem innych standardowych pRNG.

Mam nadzieję że to pomoże.


Nie dokładnie o to prosiłem, ale mimo to wnikliwe. Zakładam, że przez „nieciągłe” chodzi w zasadzie o to, że komputery nie implementują arytmetyki o nieskończonej precyzji?
MathematicalOrchid

To duża część, ale nie cała sprawa. Jest to niezwykle złożony temat.
gung - Przywróć Monikę

1
Niektóre z pomysłów użytkownika @ gung akapicie pierwszym są realizowane w funkcji SnowsPenultimateNormalityTestw TeachingDemospakiecie dla R. zgadzam się z ideą użytkownika @ gung patrzenia na miarę bliskości zamiast koncentrować się na wartości p. Jednym z problemów związanych z użyciem korelacji w wykresie qq jest to, że jeśli dane mają prawidłowy kształt, ale inną średnią, wariancję itp., Nadal można uzyskać naprawdę wysoką korelację. Alternatywą jest użycie statystyki KS lub statystyki AD jako miary różnicy od teoretycznej.
Greg Snow

@gung, dziękuję za odpowiedź. Czy mógłbyś bardziej rozwinąć kwestię „odpowiednio przekonwertowałeś swoje dane do wydruku i obliczając odpowiednie wartości z teoretycznego rozkładu, o którym mowa, możesz je skorelować”? Czy obliczyłeś dane do wykreślania pp lub qq, jaki byłby następny krok do uzyskania wspomnianego wyniku r-score? Czy to jakiś znany test? Czy możesz podać referencje? Dziękuję Ci!
Ivan

1

Nie przeczytałem do końca wszystkich odpowiedzi, ale widzę, że są one dość dokładne i dokładne. Ryzykując, że powtarzam coś ukrytego w długich odpowiedziach, chcę tylko powiedzieć, że v = test chi-kwadrat można wykorzystać do ciągłych danych. To może nie być najlepszy test i, podobnie jak wiele testów, opiera się na teorii asymptotycznej, a zatem może nie być dokładny w małych próbkach z rzadkimi komórkami (zależy to również od sposobu grupowania). Anderson-Darling ma większą moc do testowania normalności niż test KS, ale KS może być lepszy w przypadku innych ciągłych rozkładów. Lillefors ma test przeznaczony do rozkładów wykładniczych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.