test_owens_t.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import numpy as np
  2. from numpy.testing import assert_equal, assert_allclose
  3. import scipy.special as sc
  4. def test_symmetries():
  5. np.random.seed(1234)
  6. a, h = np.random.rand(100), np.random.rand(100)
  7. assert_equal(sc.owens_t(h, a), sc.owens_t(-h, a))
  8. assert_equal(sc.owens_t(h, a), -sc.owens_t(h, -a))
  9. def test_special_cases():
  10. assert_equal(sc.owens_t(5, 0), 0)
  11. assert_allclose(sc.owens_t(0, 5), 0.5*np.arctan(5)/np.pi,
  12. rtol=5e-14)
  13. # Target value is 0.5*Phi(5)*(1 - Phi(5)) for Phi the CDF of the
  14. # standard normal distribution
  15. assert_allclose(sc.owens_t(5, 1), 1.4332574485503512543e-07,
  16. rtol=5e-14)
  17. def test_nans():
  18. assert_equal(sc.owens_t(20, np.nan), np.nan)
  19. assert_equal(sc.owens_t(np.nan, 20), np.nan)
  20. assert_equal(sc.owens_t(np.nan, np.nan), np.nan)
  21. def test_infs():
  22. h, a = 0, np.inf
  23. # T(0, a) = 1/2π * arctan(a)
  24. res = 1/(2*np.pi) * np.arctan(a)
  25. assert_allclose(sc.owens_t(h, a), res, rtol=5e-14)
  26. assert_allclose(sc.owens_t(h, -a), -res, rtol=5e-14)
  27. h = 1
  28. # Refer Owens T function definition in Wikipedia
  29. # https://en.wikipedia.org/wiki/Owen%27s_T_function
  30. # Value approximated through Numerical Integration
  31. # using scipy.integrate.quad
  32. # quad(lambda x: 1/(2*pi)*(exp(-0.5*(1*1)*(1+x*x))/(1+x*x)), 0, inf)
  33. res = 0.07932762696572854
  34. assert_allclose(sc.owens_t(h, np.inf), res, rtol=5e-14)
  35. assert_allclose(sc.owens_t(h, -np.inf), -res, rtol=5e-14)
  36. assert_equal(sc.owens_t(np.inf, 1), 0)
  37. assert_equal(sc.owens_t(-np.inf, 1), 0)
  38. assert_equal(sc.owens_t(np.inf, np.inf), 0)
  39. assert_equal(sc.owens_t(-np.inf, np.inf), 0)
  40. assert_equal(sc.owens_t(np.inf, -np.inf), -0.0)
  41. assert_equal(sc.owens_t(-np.inf, -np.inf), -0.0)