[Scipy-svn] r5089 - trunk/scipy/stats/tests

scipy-svn at scipy.org scipy-svn at scipy.org
Thu Nov 13 00:54:28 EST 2008


Author: josef
Date: 2008-11-12 23:54:26 -0600 (Wed, 12 Nov 2008)
New Revision: 5089

Added:
   trunk/scipy/stats/tests/test_continuous_basic.py
Log:
add test for basic methods of continuous distributions

Added: trunk/scipy/stats/tests/test_continuous_basic.py
===================================================================
--- trunk/scipy/stats/tests/test_continuous_basic.py	2008-11-13 04:32:10 UTC (rev 5088)
+++ trunk/scipy/stats/tests/test_continuous_basic.py	2008-11-13 05:54:26 UTC (rev 5089)
@@ -0,0 +1,191 @@
+import numpy.testing as npt
+import numpy as np
+import nose
+
+from scipy import stats
+
+"""
+Test all continuous distributions.
+
+Parameters were chosen for those distributions that pass the
+Kolmogorov-Smirnov test.  This provides safe parameters for each
+distributions so that we can perform further testing of class methods.
+
+These tests currently check only/mostly for serious errors and exceptions,
+not for numerically exact results.
+"""
+
+DECIMAL = 2 # specify the precision of the tests
+
+distcont = [
+    ['alpha', (3.5704770516650459,)],
+    ['anglit', ()],
+    ['arcsine', ()],
+    ['beta', (2.3098496451481823, 0.62687954300963677)],
+    ['betaprime', (100, 86)],
+    ['bradford', (0.29891359763170633,)],
+    ['burr', (0.94839838075366045, 4.3820284068855795)],
+    ['cauchy', ()],
+    ['chi', (78,)],
+    ['chi2', (55,)],
+    ['cosine', ()],
+    ['dgamma', (1.1023326088288166,)],
+    ['dweibull', (2.0685080649914673,)],
+    ['erlang', (4, 0.7341136511570574, 0.047510038926818488)],
+    ['expon', ()],
+    ['exponpow', (2.697119160358469,)],
+    ['exponweib', (2.8923945291034436, 1.9505288745913174)],
+    ['f', (29, 18)],
+    ['fatiguelife', (29, 18)],
+    ['fisk', (3.0857548622253179,)],
+    ['foldcauchy', (4.7164673455831894,)],
+    ['foldnorm', (1.9521253373555869,)],
+    ['frechet_l', (3.6279911255583239,)],
+    ['frechet_r', (1.8928171603534227,)],
+    ['gamma', (1.9932305483800778,)],
+    ['gausshyper', (13.763771604130699, 3.1189636648681431,
+                    2.5145980350183019, 5.1811649903971615)],
+    ['genexpon', (9.1325976465418908, 16.231956600590632, 3.2819552690843983)],
+    ['genextreme', (3.3184017469423535,)],
+    ['gengamma', (4.4162385429431925, 3.1193091679242761)],
+    ['genhalflogistic', (0.77274727809929322,)],
+    ['genlogistic', (0.41192440799679475,)],
+    ['genpareto', (4.4566867037959144,)],
+    ['gilbrat', ()],
+    ['gompertz', (0.94743713075105251,)],
+    ['gumbel_l', ()],
+    ['gumbel_r', ()],
+    ['halfcauchy', ()],
+    ['halflogistic', ()],
+    ['halfnorm', ()],
+    ['hypsecant', ()],
+    ['invgamma', (2.0668996136993067,)],
+    ['invnorm', (0.14546264555347513,)],
+    ['invweibull', (0.58847112119264788,)],
+    ['johnsonsb', (4.3172675099141058, 3.1837781130785063)],
+    ['johnsonsu', (2.554395574161155, 2.2482281679651965)],
+    ['kstwobign', ()],
+    ['laplace', ()],
+    ['levy', ()],
+    ['levy_l', ()],
+#    ['levy_stable', (0.35667405469844993,
+#                     -0.67450531578494011)], #NotImplementedError
+    ['loggamma', (0.41411931826052117,)],
+    ['logistic', ()],
+    ['loglaplace', (3.2505926592051435,)],
+    ['lognorm', (0.95368226960575331,)],
+    ['lomax', (1.8771398388773268,)],
+    ['maxwell', ()],
+    ['mielke', (4.6420495492121487, 0.59707419545516938)],
+    ['nakagami', (4.9673794866666237,)],
+    ['ncf', (27, 27, 0.41578441799226107)],
+    ['nct', (14, 0.24045031331198066)],
+    ['ncx2', (21, 1.0560465975116415)],
+    ['norm', ()],
+    ['pareto', (2.621716532144454,)],
+    ['powerlaw', (1.6591133289905851,)],
+    ['powerlognorm', (2.1413923530064087, 0.44639540782048337)],
+    ['powernorm', (4.4453652254590779,)],
+    ['rayleigh', ()],
+    ['rdist', (3.8266985793976525,)],
+    ['recipinvgauss', (0.63004267809369119,)],
+    ['reciprocal', (0.0062309367010521255, 1.0062309367010522)],
+    ['rice', (0.7749725210111873,)],
+    ['semicircular', ()],
+    ['t', (2.7433514990818093,)],
+    ['triang', (0.15785029824528218,)],
+    ['truncexpon', (4.6907725456810478,)],
+    ['truncnorm', (-1.0978730080013919, 2.7306754109031979)],
+    ['tukeylambda', (3.1321477856738267,)],
+    ['uniform', ()],
+    ['vonmises', (3.9939042581071398,)],
+    ['wald', ()],
+    ['weibull_max', (2.8687961709100187,)],
+    ['weibull_min', (1.7866166930421596,)],
+    ['wrapcauchy', (0.031071279018614728,)]]
+
+
+def test_cont_basic():
+    for distname, arg in distcont[:]:
+        distfn = getattr(stats, distname)
+        rvs = distfn.rvs(size=1000,*arg)
+        sm = rvs.mean()
+        sv = rvs.var()
+        skurt = stats.kurtosis(rvs)
+        sskew = stats.skew(rvs)
+        yield check_sample_meanvar_, distfn, arg, sm, sv, distname + \
+              'sample mean test'
+        yield check_sample_skew_kurt, distfn, arg, skurt, sskew, distname
+        yield check_cdf_ppf, distfn, arg, distname
+        yield check_sf_isf, distfn, arg, distname
+        yield check_pdf, distfn, arg, distname
+        #yield check_oth, distfn, arg # is still missing
+
+
+def check_sample_meanvar_(distfn, arg, sm, sv, msg):
+    m,v = distfn.stats(*arg)
+    check_sample_meanvar, sm, m, msg + 'sample mean test'
+    check_sample_meanvar, sv, v, msg + 'sample var test'
+
+def check_sample_skew_kurt(distfn, arg, sk, ss, msg):
+    k,s = distfn.stats(moment='ks',*arg)
+    check_sample_meanvar, sk, k, msg + 'sample skew test'
+    check_sample_meanvar, ss, s, msg + 'sample kurtosis test'
+
+def check_sample_meanvar(sm,m,msg):
+
+    if m < np.inf:
+        npt.assert_almost_equal(sm, m, decimal=DECIMAL, err_msg= msg + \
+                                ' - finite moment')
+    else:
+        assert sm > 10000, 'infinite moment, sm = ' + str(sm)
+
+def check_cdf_ppf(distfn,arg,msg):
+    npt.assert_almost_equal(distfn.cdf(distfn.ppf([0.1,0.5,0.9], *arg), *arg),
+                            [0.1,0.5,0.9], decimal=DECIMAL, err_msg= msg + \
+                            ' - cdf-ppf roundtrip')
+
+def check_sf_isf(distfn,arg,msg):
+    npt.assert_almost_equal(distfn.sf(distfn.isf([0.1,0.5,0.9], *arg), *arg),
+                            [0.1,0.5,0.9], decimal=DECIMAL, err_msg= msg + \
+                            ' - sf-isf roundtrip')
+    npt.assert_almost_equal(distfn.cdf([0.1,0.9], *arg),
+                            1.0-distfn.sf([0.1,0.9], *arg),
+                            decimal=DECIMAL, err_msg= msg + \
+                            ' - cdf-sf relationship')
+
+def check_pdf(distfn, arg, msg):
+    median = distfn.ppf(0.5, *arg)
+    eps = 1e-6
+    pdfv = distfn.pdf(median, *arg)
+    if (pdfv < 1e-4) or (pdfv > 1e4):
+        # avoid checking a case where pdf is close to zero or huge (singularity)
+        median = median + 0.1
+        pdfv = distfn.pdf(median, *arg)
+    cdfdiff = (distfn.cdf(median + eps, *arg) -
+               distfn.cdf(median - eps, *arg))/eps/2.0
+    #replace with better diff and better test (more points)
+    npt.assert_almost_equal(pdfv, cdfdiff,
+                decimal=DECIMAL, err_msg= msg + ' - cdf-pdf relationship')
+
+
+
+def _est_all_distributions():
+    #test from scipy.stats.tests
+    for dist, args in distcont:
+        distfunc = getattr(stats, dist)
+        alpha = 0.01
+        yield check_distribution, dist, args, alpha
+
+
+def check_distribution(dist, args, alpha):
+    #test from scipy.stats.tests
+    D,pval = stats.kstest(dist,'', args=args, N=1000)
+    if (pval < alpha):
+        D,pval = stats.kstest(dist,'',args=args, N=1000)
+        assert (pval > alpha), "D = " + str(D) + "; pval = " + str(pval) + \
+               "; alpha = " + str(alpha) + "\nargs = " + str(args)
+
+if __name__ == "__main__":
+    nose.run(argv=['', __file__])
+




More information about the Scipy-svn mailing list