The normality R package provides a collection of
statistical tools for assessing whether a sample is consistent with a
normal distribution. It includes:
Install the released version from CRAN:
or the development version from GitHub:
Then load the package:
The simplest way to assess a numeric vector is with
is_normal().
For a more detailed result:
is_normal(x, summary = TRUE)
#> $summary
#> alpha statistic pval signif standard_value
#> Shapiro-Wilk-Royston (W) 0.05 0.9789351 0.7965839 ns -0.8294810
#> D'Agostino-Pearson (K2) 0.05 0.4871878 0.7838059 ns 0.4871878
#> Anderson-Darling (A2) 0.05 0.1995093 0.8730283 ns 0.2049958
#> critical_value SE CI_lower CI_upper N AVG
#> Shapiro-Wilk-Royston (W) 1.6448536 NA NA NA 30 -0.04710376
#> D'Agostino-Pearson (K2) 5.9914645 NA NA NA 30 -0.04710376
#> Anderson-Darling (A2) 0.7307448 NA NA NA 30 -0.04710376
#> MED MIN MAX SD
#> Shapiro-Wilk-Royston (W) -0.07373326 -1.966617 1.786913 0.9810307
#> D'Agostino-Pearson (K2) -0.07373326 -1.966617 1.786913 0.9810307
#> Anderson-Darling (A2) -0.07373326 -1.966617 1.786913 0.9810307
#>
#> $is_normal
#> [1] TRUEIf you only require a quick check for data normality, use
is_normal and feel free to skip the remainder of this
guide.
For explicit test selection, use check_normality():
Most formal normality tests use:
\[H_0: X \sim N(\mu, \sigma^2)\]
versus
\[H_1: X \not\sim N(\mu, \sigma^2)\]
A small p-value provides evidence against normality. A large p-value indicates that the test did not detect sufficient evidence of departure from normality.
A large p-value does not prove that the data are normally distributed.
Different tests are sensitive to different forms of departure. For example, skewness-based procedures focus on asymmetry, kurtosis-based procedures focus on tail weight, and EDF procedures compare the empirical and theoretical distributions.
| Method | Function | Sample-size |
|---|---|---|
| AD | Anderson_Darling_test() |
≥ 8 |
| CVM | Cramer_von_Mises_test() |
≥ 8 |
| LF | Lilliefors_test() |
≥ 8 |
| DAP | D.Agostino_Pearson_test() |
≥ 20 |
| JB | Jarque_Bera_test() |
≥ 20 |
| SW | Shapiro_Wilk_test(method = "SW") |
3–50 |
| SF | Shapiro_Wilk_test(method = "SF") |
5–5000 |
| SWR | Shapiro_Wilk_test(method = "SWR") |
3–5000 |
The Anderson–Darling test is an EDF-based goodness-of-fit test that places greater emphasis on discrepancies in the tails.
ad <- Anderson_Darling_test(x)
#>
#> ------------------------------------
#> Anderson-Darling (A2) normality test
#>
#> Statistic (A2) = 0.1995
#> p-value = 0.87303
#> ------------------------------------The summary table is available with:
ad$summary
#> alpha statistic pval signif standard_value
#> Anderson-Darling (A2) 0.05 0.1995093 0.8730283 ns 0.2049958
#> critical_value SE CI_lower CI_upper N AVG
#> Anderson-Darling (A2) 0.7307448 NA NA NA 30 -0.04710376
#> MED MIN MAX SD
#> Anderson-Darling (A2) -0.07373326 -1.966617 1.786913 0.9810307The Cramér–von Mises test is also EDF-based and evaluates discrepancies throughout the distribution.
cvm <- Cramer_von_Mises_test(x)
#>
#> ------------------------------------
#> Cramer-von-Mises (W2) normality test
#>
#> Statistic (W2) = 0.0286
#> p-value = 0.85958
#> ------------------------------------Conceptually, Anderson–Darling emphasizes the tails more strongly, whereas Cramér–von Mises gives more uniform weight to discrepancies.
The Lilliefors test is an EDF-based procedure derived from the Kolmogorov–Smirnov framework and adapted for testing normality when the population mean and standard deviation are estimated from the sample.
The D’Agostino–Pearson test is an omnibus moment-based test combining information from skewness and kurtosis.
dap <- D.Agostino_Pearson_test(x)
#>
#> --------------------------------------
#> D'Agostino-Pearson (K2) normality test
#>
#> Alternative: two.sided
#>
#> Skewness = 0.1427 ; p-value = 0.7094
#> Kurtosis = 2.3627 ; p-value = 0.55507
#>
#> Statistic (K2) = 0.4872
#> p-value = 0.78381
#> --------------------------------------The alternative argument can be used for component
skewness and kurtosis assessments:
The Jarque–Bera test is another moment-based omnibus normality test.
jb <- Jarque_Bera_test(x)
#>
#> ------------------------------------
#> Jarque-Bera (JB) normality test
#>
#> Alternative: two.sided
#>
#> Skewness = 0.1356 ; p-value = 0.72474
#> Kurtosis = 2.2078 ; p-value = 0.22604
#>
#> Statistic (JB) = 0.8765
#> p-value = 0.64518
#> ------------------------------------The Shapiro-family tests are generally the most powerful. However, they are limited by ties in the data and provide no numerical indication of the nature of non-normality as a by-product (D’Agostino, 1986; Section 9.5).
Shapiro_Wilk_test() provides three related
procedures:
SW: Shapiro–Wilk;SF: Shapiro–Francia;SWR: Shapiro–Wilk with Royston’s modifications
(default).The Shapiro-family procedures have finite sample-size limits in their
direct implementations. Shapiro_Wilk_test() applies an
re-sampling mechanism by default for observations above the maximum
supported sample size.
The high-level functions support data frames and formulas.
data("iris")
check_normality(iris, Sepal.Length ~ Species, method = "SWR")
#> x is_normal Pvalue W
#> 1 setosa TRUE 0.4595132 0.9776985
#> 2 versicolor TRUE 0.4647370 0.9778357
#> 3 virginica TRUE 0.2583148 0.9711794
#> method
#> 1 Shapiro-Wilk-Royston (w) normality test
#> 2 Shapiro-Wilk-Royston (w) normality test
#> 3 Shapiro-Wilk-Royston (w) normality testThe formula has the form:
response ~ group
The same interface is available in is_normal():
For samples fewer than 8 observations, the automatic assessment relies on Shapiro–Wilk–Royston.
For samples from 8 through 19 observations, it combines:
For samples of at least 20 observations, it combines:
The sensitivity argument controls how many component
assessments must support normality. Its allowed range is 1 to 3. A
larger value makes the criterion more conservative.
The skewness() function assesses distributional
asymmetry. Three estimators (G1, b1,
g1) are available (Joanes & Gill,
1998, Wright
& Herrington, 2011).
skewness(x, method = "G1")
#>
#> --------------------------------------
#> Skewness test
#>
#> Alternative: two.sided
#>
#> Skewness (G1) = 0.1503
#> p-value = 0.72474
#> --------------------------------------
skewness(x, method = "b1")
#>
#> --------------------------------------
#> Skewness test
#>
#> Alternative: two.sided
#>
#> Skewness (b1) = 0.1356
#> p-value = 0.72474
#> --------------------------------------
skewness(x, method = "g1")
#>
#> --------------------------------------
#> Skewness test
#>
#> Alternative: two.sided
#>
#> Skewness (g1) = 0.1427
#> p-value = 0.72474
#> --------------------------------------The kurtosis() function assesses tail-related
distributional characteristics. Three estimators (G2,
b2, g2) are available (Joanes & Gill,
1998, Wright
& Herrington, 2011).
kurtosis(x, method = "G2")
#>
#> --------------------------------------
#> Kurtosis test
#>
#> Alternative: two.sided
#>
#> Kurtosis (G2) = 2.4723
#> p-value = 1.47373
#> --------------------------------------
kurtosis(x, method = "b2")
#>
#> --------------------------------------
#> Kurtosis test
#>
#> Alternative: two.sided
#>
#> Kurtosis (b2) = 2.2078
#> p-value = 1.77396
#> --------------------------------------
kurtosis(x, method = "g2")
#>
#> --------------------------------------
#> Kurtosis test
#>
#> Alternative: two.sided
#>
#> Kurtosis (g2) = 2.3627
#> p-value = 1.63723
#> --------------------------------------If a test produces a p-value of 0.12, the appropriate conclusion is:
The test did not provide sufficient evidence to reject the null hypothesis of normality.
If the p-value is 0.003:
The test provided evidence against the assumption of normality.
The next step should be to investigate the nature and practical importance of the departure.
The normality package provides a unified toolkit for assessing departures from normality.
The main functions are:
is_normal() for high-level automatic assessment;check_normality() for selecting a specific normality
test;Shapiro_Wilk_test() for Shapiro-family procedures;Anderson_Darling_test() for tail-sensitive EDF
testing;Cramer_von_Mises_test() for overall EDF
discrepancy;Lilliefors_test() for KS-type normality
assessment;D.Agostino_Pearson_test() and
Jarque_Bera_test() for moment-based tests;skewness() for distributional asymmetry; andkurtosis() for tail-related characteristics.Formal tests are most informative when considered together with sample size, graphical diagnostics, and the assumptions of the statistical method that will subsequently be applied.
Anderson, T.W., & Darling, D.A. (1954). A test of goodness of fit. Journal of the American Statistical Association, 49, 765–769. https://doi.org/10.1080/01621459.1954.10501232
D’Agostino, R.B. (1986). Goodness-of-Fit-Techniques (1st ed.). Routledge. https://doi.org/10.1201/9780203753064
D’Agostino, R.B., Belanger, A., & D’Agostino, R.B. (1990). A suggestion for using powerful and informative tests of normality. The American Statistician, 44, 316–321. https://doi.org/10.1080/00031305.1990.10475751
Jarque, C.M., & Bera, A.K. (1987). A test for normality of observations and regression residuals. International Statistical Review, 55, 163–172. https://doi.org/10.2307/1403192
Joanes, D.N., Gill, C.A. (1998). Comparing measures of sample skewness and kurtosis. Journal of the Royal Statistical Society: Series D (The Statistician), 47, 183–189. https://doi.org/10.1111/1467-9884.00122
Molin, P. & Abdi, H. (1998). New table and numerical approximations for Kolmogorov-Smirnov/Lilliefors/Van Soest normality test. Technical report, University of Bourgogne.
Royston, P. (1992). Approximating the Shapiro–Wilk W-test for non-normality. Statistics and Computing, 2, 117–119. https://doi.org/10.1007/BF01891203
Royston, P. (1993). A pocket-calculator algorithm for the Shapiro–Francia test for non-normality: an application to medicine. Statistics in Medicine, 12, 181–184. https://doi.org/10.1002/sim.4780120209
Shapiro, S.S. & Francia, R.S. (1972). An approximate analysis of variance test for normality. Journal of the American Statistical Association, 67, 215–216. https://doi.org/10.1080/01621459.1972.10481232
Shapiro, S.S. & Wilk, M.B. (1965). An analysis of variance test for normality (complete samples). Biometrika, 52, 591–611. https://doi.org/10.2307/2333709
Thode, H.C. (2002). Testing For Normality (1st ed.). CRC Press. https://doi.org/10.1201/9780203910894
Wright, D.B. & Herrington, J.A. (2011). Problematic standard errors and confidence intervals for skewness and kurtosis. Behavior Research Methods, 43, 8–17. https://doi.org/10.3758/s13428-010-0044-x