Ten wpis jest wprowadzeniem / rozpoznaniem gruntu dla pewnej ciekawej inicjatywy wydawniczej, o której napiszę w czwartek.
Tekst ten jest bardzo techniczny, przeznaczony dla osób znających postawy teorii testowania hipotez.
Pod koniec stycznia miałem przyjemność prowadzić szkolenie z testów statystycznych ,,na poważnie”. Odbiorcami była wymagająca grupa dociekliwych, pracujących w KNFie. Część szkolenia dotyczyła testów normalności, czyli, moim zdaniem, metodologicznie bardzo ciekawego zagadnienia. Podczas przerwy zimowej uzupełniłem tę część materiałów, tak by można je było udostępnić na blogu. W uzupełnianiu pomógł mi bardzo Krzysztof Trajkowski sugerując różne rozszerzenia, za co bardzo dziękuję.
Aktualna wersja w postaci PDF znajduje się tutaj [[Wersja PDF]], a po konwersji do html i drobnych zmianach jest też przedstawiona poniżej. Wersja html była generowana z użyciem narzędzia 'latex2html’ co samo w sobie było pewnym wyzwaniem, lepiej złożona moim zdaniem jest wersja pdf.
Miłej lektury!

Wybrane testy normalności
Założenie o rozkładzie normalnym zmiennych jest podstawą wielu klasycznych technik modelowania (przykładowo analiza wariancji, regresja gaussowska, modele mieszane). Stąd też popularność technik testowania tego założenia.
W tym dokumencie przedstawiamy czternaście przykładowych testów normalności podzielonych na pięć grup, różniących się sposobem konstrukcji statystyki testowej. Poniżej przedstawiono testy, które mnie osobiście z różnych powodów interesowały, ale to nie są wszystkie testy do badania normalności. Moim celem było pokazanie mnogości podejść do tematu badania zgodności z rodziną rozkładów normalnych a nie wykonanie pełnego przeglądu testów normalności.
Ten dokument był częścią materiałów przygotowanych w ramach szkolenia o testach dla KNFu, a po uzupełnieniu i za zgodą został przekazany fundacji SmarterPoland.pl. Za pomoc w uzupełnieniu i rozbudowaniu pierwszej wersji dziękuję Krzysztofowi Trajkowskiemu, który jak zwykle wskazał wiele punktów, które warto poprawić i testów o których warto napisać.
Mam nadzieję, że dokument okaże się przydatnym. Wszelkie komentarze, sugestie propozycje do tego dokumentu proszę zgłaszać na adres Przemyslaw.Biecek@gmail.com
. Z dokumentu można korzystać na zasadzie uznania autorstwa, cytując:
Przemysław Biecek, Wybrane testy normalności, 2013. Materiały Fundacji SmarterPoland.pl.
Wprowadzenie
Interesuje nas testowanie zgodności z rodziną rozkładów normalnych. Obserwujemy próbę prostą obserwacji
,
, niezależnych realizacji zmiennej losowej o rozkładzie
. Interesuje nas weryfikacja hipotezy


Ponieważ parametrów i
najczęściej nie znamy, więc testowana hipoteza zerowa jest hipotezą złożoną, co nastręcza pewnych trudności. W poniżej opisanych testach najczęściej te parametry są estymowane z próby, z użyciem być może niestandardowych estymatorów, a statystyka testowa odpowiada badaniu zgodności z hipotezą prostą

Poniżej przedstawiamy różne testy do weryfikacji hipotezy o zgodności z rodziną rozkładów normalnych, ale wiele z prezentowanych metod może być zaadoptowanych do zagadnienia testowania zgodności z innymi rodzinami rozkładów.
Dla większości testów przedstawiamy też przykładowe alternatywy, dla których dany test ma największą moc. Wybrane scenariusze alternatyw to jednak kropla w zbiorze możliwych odstępstw od normalności.
Naturalnym pytaniem jest ,,którego testu używać”, poniższe przykłady wykazują, że nie ma testu dobrego w każdym przypadku, ale o dwóch warto wspomnieć. Testem często stosowanym jest test Shapiro Wilka, popularny i zaimplementowany w większości pakietów statystycznych. Testem o szerokim spektrum wykrywania możliwych odstępstw jest test gładki test Neymana zaimplementowany w pakiecie R.
Testy zgodności oparte o dystrybuantę empiryczną
Testy wymienione w tym rozdziale badają zgodność z rozkładem normalnym przez ocenę odległości pomiędzy dystrybuantą empiryczną a dystrybuantą rozkładu normalnego.
Opisane w tym rozdziale testy określa się terminem ,,distribution free”, co oznacza, że rozkład statystyki testowej przy prawdziwej hipotezie zerowej nie zależy od rozkładu, z którym badana jest zgodność.
Test Cramera von Misesa
Ten test jest oparty o odległość Cramera von Misesa pomiędzy dystrybuantami empiryczną i teoretyczną
![]() | (1) |
Statystykę testową dla próby zbudowaną na powyższej odległości można zapisać jako
![]() | (2) |
W przypadku badania zgodności z rozkładem normalnym dystrybuanta jest zastępowana przez
dla oszacowanych parametrów średniej i wariancji. Rozkład statystyki przybliża się po uprzedniej modyfikacji [Stephens1986]
![]() | (3) |
Przyglądając się odległości widzimy, że ,,zauważane” są różnice w centrum rozkładu, tam gdzie
jest duża. Spodziewamy się ,,czułości” testu dla alternatyw zniekształconych w środku rozkładu.
W programie R ten test jest zaimplementowany w funkcji cvm.test{nortest}
.
1 2 3 4 5 6 7 8 | set.seed(1313); x <- rnorm(100) library(nortest) cvm.test(x) ## Cramer-von Mises normality test ##data: x #W = 0.0607, p-value = 0.3665 #cvm.test(x)$p.value # 0.3664784 |
![]() ![]() |
Test Andersona-Darlinga
Ten test jest oparty o ważoną odległość Cramera von Misesa pomiędzy dystrybuantami empiryczną


![]() | (4) |
Statystykę testowę opartą o powyższą odległość dla próby prostej można przedstawić jako
![]() | (5) |
Podobnie jak w teście Cramera von Misesa, testując zgodność z rozkładem normalnym przyjmuje się , a rozkład statystyki testowej przybliża się po po uprzedniej korekcie [Stephens1986] (w literaturze spotyka się też inne korekty, poniżej prezentowana jest używana w programie R)
![]() | (6) |
W programie R ten test jest zaimplementowany w funkcji ad.test{nortest}
.
1 2 3 4 5 6 7 8 | set.seed(1313); x <- rnorm(100) library(nortest) ad.test(x) ## Anderson-Darling normality test ##data: x #A = 0.4141, p-value = 0.3301 #ad.test(x)$p.value # [1] 0.3300575 |
![]() ![]() |
Test Kołmogorowa-Smirnowa
Test oparty o odległość supremum pomiędzy dystrybuantami empiryczną i teoretyczną
![]() | (7) |
Statystyka testowa oparta o powyższą odległość sprowadza się do liczenia maksimum modułu różnicy dystrybuant w punktach skoku dystrybuanty empirycznej
![]() | (8) |
Rozważa się też ważoną wersją testu Kołmogorowa Smirnowa, bardziej czułą na różnice w ogonach

Rozkład statystyki testowej można wyznaczyć w sposób dokładny (rekurencyjnie) dla prostej hipotezy zerowej, a więc dla porównania z jednym określonym rozkładem. Asymptotycznie, ta statystyka przemnożona przez ma rozkład Kołmogorowa.Test ten pomimo łatwego opisu probabilistycznego nie jest stosowany z uwagi na moc niższą niż konkurencja.
W programie R ten test jest zaimplementowany w funkcji ks.test{stats}
.
1 2 3 4 5 6 7 8 9 | set.seed(1313) x <- rnorm(100) ks.test(scale(x), "pnorm") ## One-sample Kolmogorov-Smirnov test ##data: scale(x) #D = 0.0543, p-value = 0.9297 #alternative hypothesis: two-sided #ks.test(scale(x), "pnorm")$p.value # [1] 0.9297479 |
Test Lillieforsa
Ten test to modyfikacja testu Kołmogorowa-Smirnowa zaproponowana przez Huberta Lillieforsa [Lilliefors1967], pozwalająca na testowanie zgodności z całą rodziną rozkładów normalnych, bez znajomości parametrów średniej i odchylenia standardowego (test Kołmogorowa-Smirnowa pozwala na zbadanie zgodności z jednym określonym rozkładem).
Statystyka testowa w przypadku testu Lillieforsa wygląda tak samo jak w przypadku testu Kołmogorowa Smirnowa. Różnica polega na zastosowaniu innego rozkładu dla statystyki testowej (przybliżenie rozkładu dokładnego), uwzględniającego to, że hipoteza zerowa jest hipotezą złożoną.
W programie R ten test jest zaimplementowany w funkcji lillie.test{nortest}
i lillieTest{fBasics}
.
1 2 3 4 5 | set.seed(1313); x <- rnorm(100) lillie.test(x)$p.value # [1] 0.6643097 lillieTest(x)@test$p.value # 0.6643097 |
![]() ![]() |
Testy oparte o momenty z próby
Testy oparte o dystrybuantę empiryczną można było stosować do badania zgodności z dowolnym rozkładem. Poniższe testy wykorzystują specyficzną właściwość rozkładu normalnego, tzn. zerową skośność i kurtozę równą 3 (licząc zgodnie z definicją ) lub kurtozę równą 0 (licząc zgodnie z definicją
).
Aby łatwiej nam było opisać poniższe testy, przyjmijmy następujące oznaczenia na to k-ty centralny moment z próby, skośność i kurtozę.
![]() | (9) |
Test D’Agostino oparty o skośność
Test D’Agostino (1970) za statystykę testową wykorzystuje przekształconą próbkową skośność.W celu ,,normalizacji” rozkładu statystyki testowej stosuje się następujące przekształcenie
![]() | (10) |
Statystyką testową jest . Przy założeniu prawdziwej hipotezy zerowej ta statystyka ma asymptotyczny rozkład normalny [Agostino1970].
W programie R ten test jest zaimplementowany w funkcji dagoTest{fBasics}
.
1 2 3 4 | set.seed(1313); x <- rnorm(100) dagoTest(x)@test$p.value[2] # Skewness Test # 0.9287743 |
![]() ![]() |
Test D’Agostino oparty o kurtozę
Test D’Agostino za statystykę testową wykorzystuje przekształconą próbkową kurtozę.
Bazując na wynikach [Anscombe1983] w celu ,,normalizacji” rozkładu oceny kurtozy stosuje się następujące przekształcenie
![]() | (11) |
gdzie ,
to obciążenie i wariancja oceny kurtozy dla rozkładu normalnego.
Statystyką testową jest . Przy założeniu prawdziwej hipotezy zerowej ta statystyka ma asymptotyczny rozkład normalny.
W programie R ten test jest zaimplementowany w funkcji dagoTest{fBasics}
.
1 2 3 4 | set.seed(1313); x <- rnorm(100) dagoTest(x)@test$p.value[3] #Kurtosis Test # 0.4417257 |
![]() ![]() |
Test typu omnibus D’Agostino-Pearsona oparty o kurtozę i skośność
Łącząc dwa powyższe testy otrzymuje się test czuły na odstępstwa od normalności zarówno w postaci niezerowej skośności jak i kurtozy istotnie różniej od 3 [Agostino1973].
Statystyką testową jest
![]() | (12) |


Asymptotyczny rozkład tej statystyki to oczywiście rozkład .
W programie R ten test jest zaimplementowany w funkcji dagoTest{fBasics}
.
1 2 3 4 | set.seed(1313); x <- rnorm(100) dagoTest(x)@test$p.value[1] #Omnibus Test # 0.7408977 |
Rozszerzeniem testu D’Agostino-Pearsona na przypadek testowania zgodności z wielowymiarowym rozkładem normalnym, dla statystyki testowej opartej o kurtozę i skośność, jest test Doornika-Hansena [Doornik1994]. Jest on zaimplementowany w funkcji normality.test1{normwhn.test}
, a ta implementacja pozwala też na testowanie kierunkowych alternatyw dla skośności i kurtozy, czyli że rozkład jest bardziej/mniej lewoskośny/spłaszczony niż rozkład normalny. W funkcji normality.test2{normwhn.test}
zaimplementowana jest modyfikacja pozwalająca na testowanie zgodności z rozkładem normalnym przy osłabionym założeniu dotyczącym niezależności. Tzn. jest to test normalności dopuszczający słabą strukturę zależności pomiędzy obserwacjami, patrz [Velasco2004].
Więcej o teście Doornika-Hansena i innych wielowymiarowych testach normalności (np. teście Mardii, wielowymiarowym Shapiro-Francia) przeczytać można w [BiecekTrajkowski2011].
Test typu omnibus Jarque-Bera oparty o kurtozę i skośność
Innym testem opartym o kurtozę i skośność jest test Jarque-Bera [Jarque1987]. Statystyka testowa w przypadku tego testu ma łatwiejszą postać niż dla testu D’Agostino-Pearsona. Traci się jednak na niedokładnym oszacowaniu wartości krytycznych przy niewielkich wielkościach próby. Asymptotycznie ten test jest tak samo mocny jak test D’Agostino-Pearsona, ale na asymptotykę można liczyć jedynie w przypadku dużych prób.
Statystyka testowa ma postać
![]() | (13) |
Asymptotyczny rozkład statystyki testowej to rozkład
. W funkcji
jbTest{fBasics}
zaimplementowane są też dwie inne metody liczenia p-wartości i szacowania kwantyli rozkładu statystyki JB oparte o mnożniki Lagrange, przy czym raportowane przez tę funkcję p-wartości są zaokrąglone do trzeciego miejsca po przecinku dziesiętnym. P-wartość wyznaczane przez funkcję jarqueberaTest{fBasics}
nie jest zaokrąglana, jest więc podawana z większą dokładnością, ale jedynie dla przybliżenia rozkładu statystyki testowej rozkładem asymptotycznym. Zaokrąglanie p-wartości do tysięcznych uniemożliwia testowanie na poziomie istotności rzędu lub mniejszym.
1 2 3 4 | set.seed(1313); x <- rnorm(100) jbTest(x)@test$p.value # LM p-value ALM p-value Asymptotic # 0.894 0.810 0.900 |
Testy oparte o statystyki pozycyjne
Kolejne dwa testy oparte są o statystyki pozycyjne z próby. Ideę ich działania najłatwiej uchwycić przyglądając się wykresowi kwantylowemu QQ-plot.
Test Shapiro-Wilka
Jednym z bardziej popularnych testów klasycznych jest test Shapiro-Wilka [Shapiro1965]. Statystyka testowa jest oparta o iloczyn skalarny unormowanych uporządkowanych statystyk porządkowych z unormowanych wartościami oczekiwanymi statystyk porządkowych. Innymi słowy
![]() | (14) |
gdzie to wektor wartości oczekiwanych uporządkowanych statystyk pozycyjnych w rozkładzie normalnym, a
to macierz kowariancji tych statystyk testowych.
Wartości wektora i macierzy
oraz rozkładu statystyki testowej pracowicie stablicowano [Sarhan1956]. W kolejnych latach proponowano różne aproksymacje tych wartości [Davis1978,Royston1982,Royston1992]. Wykorzystując tę ostatnią aproksymację wzór na statystykę testową można wyznaczyć następującym algorytmem.
W pierwszym kroku wyznaczane są wartości oczekiwane statystyk porządkowych i wektor wag
![]() | (15) |
W zależności od rozmiaru próby stosuje się dwa różne przybliżenia.
Dla używa się przybliżenia
![]() | (16) |
Dla używa się przybliżenia
![]() | (17) |
Wyznaczywszy te współczynniki, statystykę testową wyznaczamy ze wzoru
![]() | (18) |
Statystyka po przekształceniu przez funkcję
ma rozkład bliski rozkładowi normalnemu o średniej
i odchyleniu standardowym
[Royston1993].
Dla używa się przybliżenia
![]() | (19) |
Dla używa się przybliżenia
![]() | (20) |
Statystyka ma w przybliżeniu rozkład
.
W programie R ten test jest zaimplementowany w funkcji shapiro.test{stats}
. Ta implementacja pozwala na testowanie normalności wektorów o długości od 3 do 5000 obserwacji.
1 2 3 | set.seed(1313); x <- rnorm(100) shapiro.test(x)$p.value # [1] 0.4879372 |
![]() ![]() |
Test Shapiro-Francia
Test Shapiro-Francia jest uproszczoną wersją testu Shapiro-Wilka, w którym macierz kowariancji statystyk pozycyjnych zastąpiono przez macierz identycznościową [Shapiro1972].Dla dużych prób ten test ma podobne zachowanie jak test Shapiro Wilka.
Statystyką testową jest
![]() | (21) |
Warto zauważyć, że statystyka to korelacja punktów na wykresie kwantylowym QQ-plot.Do obliczeń wykorzystuje się wzory
![]() | (22) |
Podobnie jak w teście Shapiro-Wilka statystyka jest przybliżana rozkładem normalnym o parametrach
![]() | (23) |
Statystyka ma w przybliżeniu rozkład normalny
.
W programie R ten test jest zaimplementowany w funkcji sf.test{nortest}
. Ta implementacja pozwala na testowanie normalności wektorów o długości od 5 do 5000 obserwacji.
1 2 3 | set.seed(1313); x <- rnorm(100) sf.test(x)$p.value # [1] 0.3414609 |
![]() ![]() |
Testy oparte o statystykę 
Dla rozkładów o dyskretnym nośniku do badania zgodności można wykorzystać test zgodności . W postaci ogólnej jest on zaimplementowany w programie R w funkcji
chisq.test(stats)
.
W przypadku testowania zgodności z rozkładem ciągłym, można też wykorzystać ten test, dzieląc uprzednio nośnik rozkładu na przedziałów, domyślnie w R liczbę przedziałów wyznacza się z wzoru
. Następnie bada się zgodność z takim zdyskretyzowanym rozkładem.
Test Pearsona
Test Pearsona jest oparty o statystykę







Do przybliżenia rozkładu statystyki testowej używa się rozkładu lub
. W przypadku nieznanych parametrów
i
żaden z tych rozkładów nie jest dokładnym rozkładem statystyki testowej ale zaleca się wyznaczanie p-wartości z użyciem rozkładu
.
W programie R ten test jest zaimplementowany w funkcji pearson.test{nortest}
oraz pchiTest{fBasics}
. W pierwszej z tych funkcji za wybór rozkładu asymptotycznego odpowiada opcja adjust=TRUE
(, domyślnie) lub
adjust=FALSE
(). W drugiej z tych funkcji liczone są dwie p-wartości, dla rozkładu
i dla
.
1 2 3 4 5 | set.seed(1313); x <- rnorm(100) pearson.test(x)$p.value # [1] 0.5878833pchiTest(x)@test$p.value # Adjusted Not adjusted # 0.5878833 0.7515082 |
![]() ![]() |
Testy ,,data-driven”
Poza wymienionymi klasycznymi testami zgodności, w literaturze znaleźć można też ,,nowoczesne” testy w znacznym stopniu oparte na możliwościach obliczeniowych współczesnych komputerów. Poniżej przedstawiona będzie modyfikacja gładkiego testu Neymana, ciekawa metodologicznie i łatwo dostępna w programie R.
Gładki test Neymana zgodności z rozkładem normalnym
Poniższy opis statystyki testowej dotyczy badania zgodności z rodzinami rozkładów z parametrem położenia i skali, a w szczególności z rodziną rozkładów normalnych [Janic2008]. Więcej o gładkich testach znaleźć można w [Kallenberg1997].
Statystyką testową jest
![]() | (24) |



![${I}=Cov_{\theta_0}[\ell(x_1)]^T[\ell(x_1)]$](http://tofesi.mimuw.edu.pl/~cogito/smarterpoland/samouczki/testyNormalnosci/img88.png)



![$[0,1]$](http://tofesi.mimuw.edu.pl/~cogito/smarterpoland/samouczki/testyNormalnosci/img92.png)


Wybór statystyk i ich liczba wpływa na to, na jakie alternatywy ten ten będzie ,,wyczulony”. W poniżej przedstawionej implementacji, liczba jest wybierana z użyciem pewnego kryterium wyboru modelu, a
to pierwsze
funkcji z bazy funkcji ortonormalnych, np. bazy kosinusów lub bazy wielomianów Legendre’a. Użycie kryterium wyboru modelu do wyboru liczby
powoduje, że im większa próba, tym na większą liczbę alternatyw ten test będzie czuły.
Parametry rozkładu normalnego ocenia się estymatorami
![]() | (25) |
gdzie to uporządkowane rosnąco statystyki porządkowe próby, a
.
Statystyka testowa opisana jest szczegółowo w [Janic2008]. Wartość statystyki testowej można wyznaczyć dzięki stablicowanym macierzom
. Do wyznaczania p-wartości stosuje się aproksymacje funkcji kwantylowej.
W programie R ten test jest zaimplementowany w funkcji ddst.norm.test{ddst}
.
1 2 3 4 5 | set.seed(1313); x <- rnorm(100) ddst.norm.test(x, compute.p=TRUE) # Data Driven Smooth Test for Normality ##data: x, base: ddst.base.legendre, c: 100 #WT* = 0.0318, n. coord = 1, p-value = 0.872 |
![]() ![]() |
Test oparty o statystykę E (energii)
Do studium symulacyjnego dodano test zgodności z wielowymiarowym rozkładem normalnym (w tym przypadku jednowymiarowym), test oparty o statystykę E (patrz [Szekely2005]), czyli średnią odległość pomiędzy każdą parą obserwacji (to nie jest prawdziwa odległość w matematycznym sensie, chodzi o )









W programie R ten test jest zaimplementowany w funkcji mvnorm.etest{energy}
.
1 2 3 4 5 | set.seed(1313); x <- rnorm(100) mvnorm.etest(x, R = 999) ## Energy test of multivariate normality: estimated parameters ##data: x, sample size 100, dimension 1, replicates 999 #E-statistic = 0.4521, p-value = 0.3373 |
Test oparty o statystykę SJ
W symulacjach uwzględniono również test zgodności z rozkładem normalnym oparty o statystykę SJ (S od ,,standard deviation” i J od ,,average absolute deviation from the median”) [Gel2007].Jest to test kierunkowy badający ciężko-ogonowość rozkładu, stąd też dla pewnych alternatyw moc tego testu będzie znacznie niższa niż poziom istotności.
![]() | (26) |




W programie R ten test jest zaimplementowany w funkcji sj.test{lawstat}
.
1 2 3 4 5 | set.seed(1313); x <- rnorm(100) sj.test(x) ## Test of Normality - SJ Test ##data: x #Standardized SJ Statistic = 0.0353, ratio of S to J = 1.001, p-value = 0.4865 |
![]() ![]() |
Bibliography
- Anscombe1983
- Anscombe FJ, Glynn WJ. Distribution of the Kurtosis Statistic b 2 for Normal Samples. Biometrika. 1983; 70(1):227-34. Blom G. Statistical Estimates and Transformed Beta-Variables. New York, NY. John Wiley & Sons, 1958.
- Agostino1970
- D’Agostino RB. Transformation to Normality of the Null Distribution of g1. Biometrika. 1970; 57(3):679-81.
- Agostino1973
- D’Agostino R, Pearson ES. Tests for Departure from Normality. Empirical Results for the Distributions of b 2 and b 1. Biometrika. 1973; 60(3):613-22.
- Agostino1990
- D’Agostino RB, Belanger A, D’Agostino Jr RB. A Suggestion for Using Powerful and Informative Tests of Normality. The American Statistician. 1990; 44(4):316-21.
- Anderson1954
- Anderson, T.W. and Darling, D.A. (1954). A Test of Goodness-of-Fit. Journal of the American Statistical Association 49: 765ľ769.
- BiecekTrajkowski2011
- Przemyslaw Biecek, Krzysztof Trajkowski (2011). Na przelaj przez Data Mining, URL http://www.biecek.pl/NaPrzelajPrzezDataMining.
- Davis1978
- Davis C, Stephens M. Approximating the Covariance Matrix of Normal Order Statistics. Applied Statistics. 1978; 27(2):206-212.
- Dickey1979
- Dickey, D.A. and W.A. Fuller (1979). Distribution of the Estimators for Autoregressive Time Series with a Unit Root. Journal of the American Statistical Association, 74, p. 427ľ431.
- Doornik1994
- Doornik, J.A., and H. Hansen (1994). An Omnibus Test for Univariate and Multivariate Normality, Working Paper, Nuffield College, Oxford University, U.K. Lobato, I.,
- Gel2007
- Gel, Y. R., Miao, W., and Gastwirth, J. L. (2007). Robust Directed Tests of Normality Against Heavy Tailed Alternatives. Computational Statistics and Data Analysis 51, 2734-2746.
- Jarque1980
- Jarque CM, Bera AK. Efficient tests for normality, homoscedasticity and serial independence of regression residuals. Economics Letters. 1980; 6(3):255-259.
- Jarque1987
- Jarque CM, Bera AK. A Test for Normality of Observations and Regression Residuals. International Statistical Review/Revue Internationale de Statistique. 1987; 55(2):163ľ172.
- Janic2008
- Janic, A. and Ledwina, T. (2008). Data-driven tests for a location-scale family revisited. J. Statist. Theory. Pract. Special issue on Modern Goodness of Fit Methods.
- Kallenberg1997
- Kallenberg, W.C.M., Ledwina, T. (1997 a). Data driven smooth tests for composite hypotheses: Comparison of powers. J. Statist. Comput. Simul. 59, 101ľ121.
- Lilliefors1967
- Lilliefors, H. (June 1967), On the KolmogorovľSmirnov test for normality with mean and variance unknown, Journal of the American Statistical Association, Vol. 62. pp. 399ľ402.
- Royston1982
- Royston JP. Algorithm AS 177: Expected normal order statistics (exact and approximate). Journal of the Royal Statistical Society. Series C (Applied Statistics). 1982; 31(2):161ľ165.
- Royston1992
- Royston P. Approximating the Shapiro-Wilk W-test for non-normality. Statistics and Computing. 1992; 2(3):117-119.
- Royston1993
- Royston P. A Toolkit for Testing for Non-Normality in Complete and Censored Samples. The Statistician. 1993; 42(1):37.
- Sarhan1956
- Sarhan AE, Greenberg BG. Estimation of location and scale parameters by order statistics from singly and doubly censored samples. The Annals of Mathematical Statistics. 1956; 27(2):427ľ451.
- Shapiro1965
- Shapiro SS, Wilk MB. An analysis of variance test for normality (complete samples). Biometrika. 1965; 52(3-4):591-611.
- Shapiro1972
- Shapiro SS, Francia R. An approximate analysis of variance test for normality. Journal of the American Statistical Association. 1972; 67(337):215ľ216.
- Stephens1986
- Stephens, M.A. (1986): Tests based on EDF statistics. In: D’Agostino, R.B. and Stephens, M.A., eds.: Goodness-of-Fit Techniques. Marcel Dekker, New York.
- Szekely2005
- Szekely, G. J. and Rizzo, M. L. (2005) A New Test for Multivariate Normality, Journal of Multivariate Analysis, 93/1, 58-80.
- Velasco2004
- C. Velasco (2004). A Simple Test of Normality of Time Series, Econometric Theory, 20, pp. 671-689, Cambridge University Press.
Dodatek, kody w programie R
Kod w programie R rysujący gęstości i dystrybuanty wybranych alternatyw
Rozkład Cauchego
1 2 3 4 5 | x <- seq(-5,5,0.01) plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość") lines(x, dcauchy(x,0,0.8), type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(x, pcauchy(x,0,0.8), type="l", lwd=3, col="red3") |
Rozkład Gumbela (wartości ekstremalnej)
1 2 3 4 | plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość") lines(x, dgumbel(x,-0.3), type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(x, pgumbel(x,-0.3), type="l", lwd=3, col="red3") |
Rozkład mieszaniny dwóch rozkładów
1 2 3 4 | plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość") lines(x, (dnorm(x,-1)+dnorm(x,1))/2, type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(x, (pnorm(x,1)+pnorm(x,-1))/2, type="l", lwd=3, col="red3") |
Rozkład logistyczny
1 2 3 4 | plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość") lines(x, dlogis(x,0,0.627), type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(x, plogis(x,0,0.627), type="l", lwd=3, col="red3") |
Rozkład lognormalny
1 2 3 4 | plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość") lines(x, dlnorm(x+2.2,0.83,0.5), type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(x, plnorm(x+2.2,0.83,0.5), type="l", lwd=3, col="red3") |
Rozkład alternatywa Legendre’a rzędu 2
1 2 3 4 5 6 | tx <- seq(0.0001,1-0.0001,0.0001) ty <- (ddst:::ddst.polynomial.fun[[3]](tx)+2)/2 plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość") lines(qnorm(tx)[-1], ty[-1]/diff(qnorm(tx))/10000, type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(qnorm(tx), cumsum(ty)/10000, type="l", lwd=3, col="red3") |
Rozkład alternatywa Legendre’a rzędu 7
1 2 3 4 5 6 | tx <- seq(0.0001,1-0.0001,0.0001) ty <- (ddst:::ddst.polynomial.fun[[7]](tx)+2)/2 plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość",ylim=c(0,0.53)) lines(qnorm(tx)[-1], ty[-1]/diff(qnorm(tx))/10000, type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(qnorm(tx), cumsum(ty)/10000, type="l", lwd=3, col="red3") |
Rozkład alternatywa Legendre’a rzędu 6
1 2 3 4 5 6 | tx <- seq(0.0001,1-0.0001,0.0001) ty <- (ddst:::ddst.polynomial.fun[[6]](tx)+4)/4 plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość",ylim=c(0,0.5)) lines(qnorm(tx)[-1], ty[-1]/diff(qnorm(tx))/10000, type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(qnorm(tx), cumsum(ty)/10000, type="l", lwd=3, col="red3") |
Rozkład alternatywa Legendre’a rzędu 4
1 2 3 4 5 6 | tx <- seq(0.0001,1-0.0001,0.0001) ty <- (ddst:::ddst.polynomial.fun[[4]](tx)+3 )/3 plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość") lines(qnorm(tx)[-1], ty[-1]/diff(qnorm(tx))/10000, type="l", lwd=3, col="red3") plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(qnorm(tx), cumsum(ty)/10000, type="l", lwd=3, col="red3") |
Rozkład alternatywa w której część rozkładu normalnego skupiono w punkcie
1 2 3 4 5 6 7 8 9 | dd <- dnorm(x) dd[x < 0 &amp; x > -0.32] = 0 dd[abs(x) < 0.001] = 100 plot(x, dnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="gęstość", ylim=c(0,0.5)) lines(x, dd, type="l", lwd=3, col="red3") pp <- pnorm(x) pp[x < 0 & x > -0.32] = pnorm(-0.32) plot(x, pnorm(x), type="l", lwd=3, las=1, ylab="",xlab="", main="dystrybuanta") lines(x, pp, type="l", lwd=3, col="red3") |
Kod w programie R rysujący wykresy mocy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | library(fBasics) library(lawstat) library(nortest) library(energy) library(ddst) # # funkcja liczy p-wartosci dla rozważanych testów # za wyjątkiem testu E, dla którego liczona jest wartosc statystyki testowej zbiorTestow <- function(x) { c(ad=ad.test(x)$p.value, cvm = cvm.test(x)$p.value, lillie=lillie.test(x)$p.value, ks=ks.test(scale(x),"pnorm")$p.value, dagoTest(x)@test$p.value, jbTest(x)@test$p.value, shapiro=shapiro.test(x)$p.value, francia=sf.test(x)$p.value, pearson=pearson.test(x)$p.value, ddst=ddst.norm.test(x, compute.p=TRUE)$p.value, normal.e(x), sj.test(x)$p.value) } # # scenariusze alternatyw getData <- function(k = 1) { switch(k, '1'= runif(50), '2'= rcauchy(20), '3'= rlnorm(20), '4'= rgumbel(60), '5'= ifelse(runif(500)<0.5,rnorm(500),rnorm(500,2)), '6'= ifelse(runif(300)<0.5,rnorm(300),rnorm(300,0,2)), '7'= rnorm(25), '8' = rchisq(45,3), '9' = rweibull(20,0.8), '10' = rweibull(40,1.5), '11' = rexp(25,0.7), '12' = ifelse(runif(1000)<0.08,rnorm(1000),rnorm(1000,0,10)), '13' = round(rnorm(500)*5,0), '14' = runif(500)+runif(500), '15' = runif(1000)+runif(1000)+runif(1000), '16' = rlogis(350), '17' = rt(100,3), '18' = qnorm(sample(tx,80,replace=T,prob=wx)), '19' = qnorm(sample(tx,100,replace=T,prob=wx2)), '20' = qnorm(sample(tx,100,replace=T,prob=wx3)), '21' = qnorm(sample(tx,250,replace=T,prob=wx4)), '22' = qnorm(sample(tx,1000,replace=T,prob=wx5)), '23' = qnorm(sample(tx,100,replace=T,prob=wx6))) } # # gestosci pomocnicze tx <- seq(0.0001,1-0.0001,0.0001) wx <- ddst:::ddst.polynomial.fun[[5]](tx)+2 wx2 <- ddst:::ddst.polynomial.fun[[3]](tx)+2 wx3 <- ddst:::ddst.polynomial.fun[[7]](tx)+2 wx4 <- ddst:::ddst.polynomial.fun[[6]](tx)+4 wx5 <- ddst:::ddst.polynomial.fun[[2]](tx)+2 wx6 <- ddst:::ddst.polynomial.fun[[4]](tx)+3 # # poziomy istotnosci dla kolejnych testow alfy <- c(0.05,0.01,0.01,0.05,0.05,0.05,0.01,0.01,0.01,0.05, 0.03,0.05,0.01,0.05,0.05,0.05,0.05,0.05,0.05,0.05, 0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05) # # wyznacz moce dla wszystkich alternatyw N <- 10000 for (alte in 1:23) { # policz p-wartosci res <- replicate(N, zbiorTestow(getData(alte)) ) # dla testu E wyznacz empirycznie p-wartosci n <- length(getData(alte)) res0 <- replicate(N, normal.e(rnorm(n)) ) res["energy",] <- sapply(res["energy",], function(r) (sum(r < res0) + 1)/(N+1)) # rysuj wykres do pliku pdf pdf(paste0("moc",alte,".pdf"),9,4) par(mar=c(3,10,2,2)) moce <- rowMeans(res < alfy[alte]) th <- max(moce,na.rm=T)*0.8 bb <- barplot(moce[-(8:9)], horiz=T,las=1, xlim=c(0,1), main="", col=ifelse(moce[-(8:9)] > th, "red3", "grey"), border=ifelse(moce[-(8:9)] > th, "red3", "grey")) abline(v = seq(0,1,0.1), lty = 3, col = "#77777777") abline(v = th, lty = 2, lwd = 1, col = "red4") rect(moce[-(8:9)]+0.005, bb - 0.35, moce[-(8:9)]+0.08, bb + 0.4, col="white", border="white") text(moce[-(8:9)]+0.01, bb - 0.25, substr(as.character(round(moce[-(8:9)],3)),2,10), adj=c(0,0), cex=0.8) axis(3,th,round(th,3)) dev.off() } |
Pytanie laika – praktyka, czyli osoby, która od czasu do czasu potrzebuje policzyć jakieś statystki ze swoich wyników, a nie pasjonuje się statystyką jako dziedziną nauki, który test jest najlepszy i do czego w życiu codziennym (przykład) się je stosuje (skoro wszystkie służą do określenia zgodności rozkładu zmiennej z rozkładem normalnym)?
Na co dzień korzystam zupełnie nie świadomie z testu Shapiro-Wilka i nie zastanawiałem się czy inne testy byłyby lepsze, czy gorsze, a teraz zacząłem mieć poważne wątpliwości…
Bardzo ciekawe zestawienie (drobna uwaga na grafie Test Kołmogorowa-Smirnova nakłada się z testem SJ, poza tym napis wychodzi poza koło – może warto by wydłużyć gałąź główną od tych testów opartych o dystrybuantę empiryczną (chyba że nakładanie się tych testów było celowe), a w nazwie „test Kołmogorowa-Smirnowa” zmniejszyć czcionkę lub odległość między znakami).
Uczciwą odpowiedzią będzie, że nie ma testu najlepszego dla wszystkich alternatyw.
Wiekszość testów nie widzi pewnego rodzaju odstepstw, test shapiro-wilka ma tą zaletę, że jest popularny[?].
Inną sprawą jest, że gdy nie jesteśmy pewni czy mamy do czynienia z rozkłądem normalnym to lepiej użyć metod odpornych, które są już dosyć dostępne.
Proponuję zamienić wszystkie statystki na statystyki. Jest to bardzo popularny (ciekawe, dlaczego?), ale jednak błąd.
Dobry pomysł, dziękuję.
Dobry tekst.
Drobne literówki,:
str. 19 powinno być „stablicowana”, nie „ztablicowana”
str. 19 na dole jest „verage absolute deviation from the median” – chyba „average”
dziękuję, poprawione
Dzień dobry,
To bardzo ciekawy materiał dla osób wykonujących od czasu do czasu obliczenia satystyczne. Brakuje mi tylko informacji o stosowalności poszczególnych testów ze wzgledu na liczebność próby. W zagadnieniach technicznych liczebność jest zazwyczaj niewielka – od kilku do kilkunastu elementów w danej próbie, zwykle nie przekracza 30.
Z powazaniem
Prezentowane studium mocy dotyczyło większych prób, ale pokazywało, że w zależności od tego jakiego typu jakiego rodzaju odstępstwo od normalności występuje, inny test jest najsilniejszy. Podobnie będzie dla mniejszych prób, może więcej stracą bardziej złożone testy, a więcej zyskają te proste [np. Shapiro Wilka].
Studiuję matematykę i trochę z testami miałam do czynienia. Ubolewam, że nie ma tu informacji o teście Mardii (odsyłacz nie znalazł takiego artykułu). Jednak, (zwłaszcza), informacje o teście Kołmogorowa- Smirnowa były dla mnie wartościowe. Dziękuję.
Cieszę się, że się przydało.
Testy wielowymiarowe to oddzielny temat. Aby kompleksowo do niego podejść trzeba by ten opis zwiększyć kilkukrotnie. Krzysiek napisał o teście Mardii w dokumencie http://www.biecek.pl/NaPrzelajPrzezDataMining [dziękuję za informację o niedziałających linkach, poprawiłem].
Swoją drogą, biorąc pod uwagę, że Kanti Mardia to mężczyzna, to czy powinno mówić się o teście Mardii czy teście Mardiego?
Czy badając normalność za pomocą kilku testów równocześnie np. stosując test Kołmogorowa-Smirnowa i test Shapiro-Wilka należy zastosować poprawkę np. Bonferroniego?