102 lines
4.2 KiB
Python
102 lines
4.2 KiB
Python
"""
|
|
Test data from Lilliefors test for normality
|
|
An Analytic Approximation to the Distribution of Lilliefors's
|
|
Test Statistic for Normality
|
|
Author(s): Gerard E. Dallal and Leland WilkinsonSource: The American
|
|
Statistician, Vol. 40, No. 4 (Nov., 1986), pp. 294-296
|
|
"""
|
|
import numpy as np
|
|
from numpy.testing import assert_almost_equal, assert_allclose
|
|
|
|
from statsmodels.stats.tabledist import TableDist
|
|
|
|
|
|
def test_tabledist():
|
|
# for this test alpha is sf probability, i.e. right tail probability
|
|
alpha = np.array([0.2, 0.15, 0.1, 0.05, 0.01, 0.001])[::-1]
|
|
size = np.array([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
16, 17, 18, 19, 20, 25, 30, 40, 100, 400, 900], float)
|
|
|
|
# critical values, rows are by sample size, columns are by alpha
|
|
crit_lf = np.array([[303, 321, 346, 376, 413, 433],
|
|
[289, 303, 319, 343, 397, 439],
|
|
[269, 281, 297, 323, 371, 424],
|
|
[252, 264, 280, 304, 351, 402],
|
|
[239, 250, 265, 288, 333, 384],
|
|
[227, 238, 252, 274, 317, 365],
|
|
[217, 228, 241, 262, 304, 352],
|
|
[208, 218, 231, 251, 291, 338],
|
|
[200, 210, 222, 242, 281, 325],
|
|
[193, 202, 215, 234, 271, 314],
|
|
[187, 196, 208, 226, 262, 305],
|
|
[181, 190, 201, 219, 254, 296],
|
|
[176, 184, 195, 213, 247, 287],
|
|
[171, 179, 190, 207, 240, 279],
|
|
[167, 175, 185, 202, 234, 273],
|
|
[163, 170, 181, 197, 228, 266],
|
|
[159, 166, 176, 192, 223, 260],
|
|
[143, 150, 159, 173, 201, 236],
|
|
[131, 138, 146, 159, 185, 217],
|
|
[115, 120, 128, 139, 162, 189],
|
|
[74, 77, 82, 89, 104, 122],
|
|
[37, 39, 41, 45, 52, 61],
|
|
[25, 26, 28, 30, 35, 42]])[:, ::-1] / 1000.
|
|
|
|
lf = TableDist(alpha, size, crit_lf)
|
|
|
|
assert_almost_equal(lf.prob(0.166, 20), 0.15)
|
|
assert_almost_equal(lf.crit(0.15, 20), 0.166)
|
|
assert_almost_equal(lf.crit3(0.15, 20), 0.166)
|
|
|
|
assert .159 <= lf.crit(0.17, 20) <= 166
|
|
assert .159 <= lf.crit3(0.17, 20) <= .166
|
|
|
|
assert .159 <= lf.crit(0.19, 20) <= .166
|
|
assert .159 <= lf.crit3(0.19, 20) <= .166
|
|
|
|
assert .159 <= lf.crit(0.199, 20) <= .166
|
|
assert .159 <= lf.crit3(0.199, 20) <= .166
|
|
|
|
# testing
|
|
vals = [lf.prob(c, size[i]) for i in range(len(size)) for c in crit_lf[i]]
|
|
vals = np.array(vals).reshape(-1, lf.n_alpha)
|
|
delta = np.abs(vals) - lf.alpha
|
|
assert_allclose(delta, np.zeros_like(delta))
|
|
|
|
# 1.6653345369377348e-16
|
|
vals = [lf.crit(c, size[i]) for i in range(len(size)) for c in lf.alpha]
|
|
vals = np.array(vals).reshape(-1, lf.n_alpha)
|
|
delta = np.abs(vals - crit_lf)
|
|
assert_allclose(delta, np.zeros_like(delta))
|
|
|
|
# 6.9388939039072284e-18)
|
|
print(np.max(np.abs(np.array(
|
|
[lf.crit3(c, size[i]) for i in range(len(size)) for c in
|
|
lf.alpha]).reshape(-1, lf.n_alpha) - crit_lf)))
|
|
# 4.0615705243496336e-12)
|
|
vals = [lf.crit3(c, size[i]) for i in range(len(size))
|
|
for c in lf.alpha[:-1] * 1.1]
|
|
vals = np.array(vals).reshape(-1, lf.n_alpha - 1)
|
|
assert (vals < crit_lf[:, :-1]).all()
|
|
|
|
vals = [lf.crit3(c, size[i]) for i in range(len(size)) for c in
|
|
lf.alpha[:-1] * 1.1]
|
|
vals = np.array(vals).reshape(-1, lf.n_alpha - 1)
|
|
assert (vals > crit_lf[:, 1:]).all()
|
|
|
|
vals = [lf.prob(c * 0.9, size[i]) for i in range(len(size))
|
|
for c in crit_lf[i, :-1]]
|
|
vals = np.array(vals).reshape(-1, lf.n_alpha - 1)
|
|
assert (vals > lf.alpha[:-1]).all()
|
|
|
|
vals = [lf.prob(c * 1.1, size[i]) for i in range(len(size)) for c in
|
|
crit_lf[i, 1:]]
|
|
vals = np.array(vals).reshape(-1, lf.n_alpha - 1)
|
|
assert (vals < lf.alpha[1:]).all()
|
|
|
|
# start at size_idx=2 because of non-monotonicity of lf_crit
|
|
vals = [lf.prob(c, size[i] * 0.9) for i in range(2, len(size))
|
|
for c in crit_lf[i, :-1]]
|
|
vals = np.array(vals).reshape(-1, lf.n_alpha - 1)
|
|
assert (vals > lf.alpha[:-1]).all()
|