gonum.org/v1/gonum@v0.14.0/stat/distuv/gumbel_test.go (about) 1 // Copyright ©2018 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 "golang.org/x/exp/rand" 13 "gonum.org/v1/gonum/floats/scalar" 14 ) 15 16 func TestGumbelRightProbCDF(t *testing.T) { 17 t.Parallel() 18 for _, test := range []struct { 19 x, mu, beta, wantProb, wantCDF float64 20 }{ 21 // Values calculated with scipy.stats.gumbel_r . 22 {-2, 0, 1, 0.0045662814201279153, 0.00061797898933109343}, 23 {0.01, 0, 1, 0.36786110881643569, 0.37155817442380817}, 24 {6, 0, 1, 0.0024726155730149077, 0.99752431739275249}, 25 26 // Values calculated with Wolfram Alpha's ExtremeValueDistribution. 27 {0.1, 2, 5, 0.06776411497087929, 0.231706315790068}, 28 {0.1, -2, 5, 0.06811997894673336, 0.5183799456323944}, 29 {-2.1, -2, 0.1, 1.793740787340169, 0.06598803584531238}, 30 } { 31 g := GumbelRight{Mu: test.mu, Beta: test.beta} 32 pdf := g.Prob(test.x) 33 if !scalar.EqualWithinAbsOrRel(pdf, test.wantProb, 1e-12, 1e-12) { 34 t.Errorf("Prob mismatch, x = %v, mu = %v, beta = %v. Got %v, want %v", test.x, test.mu, test.beta, pdf, test.wantProb) 35 } 36 cdf := g.CDF(test.x) 37 if !scalar.EqualWithinAbsOrRel(cdf, test.wantCDF, 1e-12, 1e-12) { 38 t.Errorf("CDF mismatch, x = %v, mu = %v, beta = %v. Got %v, want %v", test.x, test.mu, test.beta, cdf, test.wantCDF) 39 } 40 } 41 } 42 43 func TestGumbelRight(t *testing.T) { 44 t.Parallel() 45 src := rand.New(rand.NewSource(1)) 46 for i, b := range []GumbelRight{ 47 {0, 1, src}, 48 {-5, 6, src}, 49 {3, 0.1, src}, 50 } { 51 testGumbelRight(t, b, i) 52 } 53 } 54 55 func testGumbelRight(t *testing.T, g GumbelRight, i int) { 56 const ( 57 tol = 1e-2 58 n = 5e5 59 bins = 50 60 ) 61 x := make([]float64, n) 62 generateSamples(x, g) 63 sort.Float64s(x) 64 65 min := math.Inf(-1) 66 testRandLogProbContinuous(t, i, min, x, g, tol, bins) 67 checkProbContinuous(t, i, x, math.Inf(-1), math.Inf(1), g, 1e-10) 68 checkEntropy(t, i, x, g, tol) 69 checkMean(t, i, x, g, tol) 70 checkMedian(t, i, x, g, tol) 71 checkVarAndStd(t, i, x, g, tol) 72 checkExKurtosis(t, i, x, g, 1e-1) 73 checkSkewness(t, i, x, g, 5e-2) 74 checkQuantileCDFSurvival(t, i, x, g, 5e-3) 75 if g.Mu != g.Mode() { 76 t.Errorf("Mismatch in mode value: got %v, want %g", g.Mode(), g.Mu) 77 } 78 if g.NumParameters() != 2 { 79 t.Errorf("Mismatch in NumParameters: got %v, want 2", g.NumParameters()) 80 } 81 }