test_tukeylambda_stats.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from __future__ import division, print_function, absolute_import
  2. import numpy as np
  3. from numpy.testing import assert_allclose, assert_equal
  4. from scipy.stats._tukeylambda_stats import (tukeylambda_variance,
  5. tukeylambda_kurtosis)
  6. def test_tukeylambda_stats_known_exact():
  7. """Compare results with some known exact formulas."""
  8. # Some exact values of the Tukey Lambda variance and kurtosis:
  9. # lambda var kurtosis
  10. # 0 pi**2/3 6/5 (logistic distribution)
  11. # 0.5 4 - pi (5/3 - pi/2)/(pi/4 - 1)**2 - 3
  12. # 1 1/3 -6/5 (uniform distribution on (-1,1))
  13. # 2 1/12 -6/5 (uniform distribution on (-1/2, 1/2))
  14. # lambda = 0
  15. var = tukeylambda_variance(0)
  16. assert_allclose(var, np.pi**2 / 3, atol=1e-12)
  17. kurt = tukeylambda_kurtosis(0)
  18. assert_allclose(kurt, 1.2, atol=1e-10)
  19. # lambda = 0.5
  20. var = tukeylambda_variance(0.5)
  21. assert_allclose(var, 4 - np.pi, atol=1e-12)
  22. kurt = tukeylambda_kurtosis(0.5)
  23. desired = (5./3 - np.pi/2) / (np.pi/4 - 1)**2 - 3
  24. assert_allclose(kurt, desired, atol=1e-10)
  25. # lambda = 1
  26. var = tukeylambda_variance(1)
  27. assert_allclose(var, 1.0 / 3, atol=1e-12)
  28. kurt = tukeylambda_kurtosis(1)
  29. assert_allclose(kurt, -1.2, atol=1e-10)
  30. # lambda = 2
  31. var = tukeylambda_variance(2)
  32. assert_allclose(var, 1.0 / 12, atol=1e-12)
  33. kurt = tukeylambda_kurtosis(2)
  34. assert_allclose(kurt, -1.2, atol=1e-10)
  35. def test_tukeylambda_stats_mpmath():
  36. """Compare results with some values that were computed using mpmath."""
  37. a10 = dict(atol=1e-10, rtol=0)
  38. a12 = dict(atol=1e-12, rtol=0)
  39. data = [
  40. # lambda variance kurtosis
  41. [-0.1, 4.78050217874253547, 3.78559520346454510],
  42. [-0.0649, 4.16428023599895777, 2.52019675947435718],
  43. [-0.05, 3.93672267890775277, 2.13129793057777277],
  44. [-0.001, 3.30128380390964882, 1.21452460083542988],
  45. [0.001, 3.27850775649572176, 1.18560634779287585],
  46. [0.03125, 2.95927803254615800, 0.804487555161819980],
  47. [0.05, 2.78281053405464501, 0.611604043886644327],
  48. [0.0649, 2.65282386754100551, 0.476834119532774540],
  49. [1.2, 0.242153920578588346, -1.23428047169049726],
  50. [10.0, 0.00095237579757703597, 2.37810697355144933],
  51. [20.0, 0.00012195121951131043, 7.37654321002709531],
  52. ]
  53. for lam, var_expected, kurt_expected in data:
  54. var = tukeylambda_variance(lam)
  55. assert_allclose(var, var_expected, **a12)
  56. kurt = tukeylambda_kurtosis(lam)
  57. assert_allclose(kurt, kurt_expected, **a10)
  58. # Test with vector arguments (most of the other tests are for single
  59. # values).
  60. lam, var_expected, kurt_expected = zip(*data)
  61. var = tukeylambda_variance(lam)
  62. assert_allclose(var, var_expected, **a12)
  63. kurt = tukeylambda_kurtosis(lam)
  64. assert_allclose(kurt, kurt_expected, **a10)
  65. def test_tukeylambda_stats_invalid():
  66. """Test values of lambda outside the domains of the functions."""
  67. lam = [-1.0, -0.5]
  68. var = tukeylambda_variance(lam)
  69. assert_equal(var, np.array([np.nan, np.inf]))
  70. lam = [-1.0, -0.25]
  71. kurt = tukeylambda_kurtosis(lam)
  72. assert_equal(kurt, np.array([np.nan, np.inf]))