github.com/gopherd/gonum@v0.0.4/stat/distuv/chi_test.go (about) 1 // Copyright ©2021 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package distuv 6 7 import ( 8 "math" 9 "sort" 10 "testing" 11 12 "math/rand" 13 14 "github.com/gopherd/gonum/floats/scalar" 15 ) 16 17 func TestChiProb(t *testing.T) { 18 t.Parallel() 19 for _, test := range []struct { 20 x, k, want float64 21 }{ 22 {10, 3, 1.538919725341288e-20}, 23 {2.3, 3, 0.2997000593061405}, 24 {0.8, 0.2, 0.1702707693447167}, 25 } { 26 pdf := Chi{test.k, nil}.Prob(test.x) 27 if !scalar.EqualWithinAbsOrRel(pdf, test.want, 1e-10, 1e-10) { 28 t.Errorf("Pdf mismatch, x = %v, K = %v. Got %v, want %v", test.x, test.k, pdf, test.want) 29 } 30 } 31 } 32 33 func TestChiCDF(t *testing.T) { 34 t.Parallel() 35 for _, test := range []struct { 36 x, k, want float64 37 }{ 38 // Values calculated with scipy.stats.chi.cdf 39 {0, 1, 0}, 40 {0.01, 5, 5.319040436531812e-12}, 41 {0.05, 3, 3.3220267268523235e-05}, 42 {0.5, 2, 0.1175030974154046}, 43 {0.95, 3, 0.17517554009157732}, 44 {0.99, 5, 0.035845177452671864}, 45 {1, 1, 0.6826894921370859}, 46 {1.5, 4, 0.3101135068635068}, 47 {10, 10, 1}, 48 {25, 15, 1}, 49 } { 50 cdf := Chi{test.k, nil}.CDF(test.x) 51 if !scalar.EqualWithinAbsOrRel(cdf, test.want, 1e-10, 1e-10) { 52 t.Errorf("CDF mismatch, x = %v, K = %v. Got %v, want %v", test.x, test.k, cdf, test.want) 53 } 54 } 55 } 56 57 func TestChi(t *testing.T) { 58 t.Parallel() 59 src := rand.New(rand.NewSource(1)) 60 for i, b := range []Chi{ 61 {3, src}, 62 {1.5, src}, 63 {0.9, src}, 64 } { 65 testChi(t, b, i) 66 } 67 } 68 69 func testChi(t *testing.T, c Chi, i int) { 70 const ( 71 tol = 1e-2 72 n = 1e6 73 bins = 50 74 ) 75 x := make([]float64, n) 76 generateSamples(x, c) 77 sort.Float64s(x) 78 79 testRandLogProbContinuous(t, i, 0, x, c, tol, bins) 80 checkMean(t, i, x, c, tol) 81 checkMedian(t, i, x, c, tol) 82 checkVarAndStd(t, i, x, c, tol) 83 checkEntropy(t, i, x, c, tol) 84 checkExKurtosis(t, i, x, c, 7e-2) 85 checkProbContinuous(t, i, x, 0, math.Inf(1), c, 1e-5) 86 checkQuantileCDFSurvival(t, i, x, c, 1e-2) 87 88 expectedMode := math.Sqrt(c.K - 1) 89 if !scalar.Same(c.Mode(), expectedMode) { 90 t.Errorf("Mode is not equal to sqrt(k - 1). Got %v, want %v", c.Mode(), expectedMode) 91 } 92 if c.NumParameters() != 1 { 93 t.Errorf("NumParameters is not 1. Got %v", c.NumParameters()) 94 } 95 survival := c.Survival(-0.00001) 96 if survival != 1 { 97 t.Errorf("Survival is not 1 for negative argument. Got %v", survival) 98 } 99 }