blob: a16285f436a90f7351b74551a7cc611d440910cf [file] [log] [blame]
// Copyright ©2018 The Gonum Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package distuv
import (
"math"
"sort"
"testing"
"gonum.org/v1/gonum/floats"
"golang.org/x/exp/rand"
)
func TestGumbelRightProbCDF(t *testing.T) {
for _, test := range []struct {
x, mu, beta, wantProb, wantCDF float64
}{
// Values calculated with scipy.stats.gumbel_r .
{-2, 0, 1, 0.0045662814201279153, 0.00061797898933109343},
{0.01, 0, 1, 0.36786110881643569, 0.37155817442380817},
{6, 0, 1, 0.0024726155730149077, 0.99752431739275249},
// Values calculated with Wolfram Alpha's ExtremeValueDistribution.
{0.1, 2, 5, 0.06776411497087929, 0.231706315790068},
{0.1, -2, 5, 0.06811997894673336, 0.5183799456323944},
{-2.1, -2, 0.1, 1.793740787340169, 0.06598803584531238},
} {
g := GumbelRight{Mu: test.mu, Beta: test.beta}
pdf := g.Prob(test.x)
if !floats.EqualWithinAbsOrRel(pdf, test.wantProb, 1e-12, 1e-12) {
t.Errorf("Prob mismatch, x = %v, mu = %v, beta = %v. Got %v, want %v", test.x, test.mu, test.beta, pdf, test.wantProb)
}
cdf := g.CDF(test.x)
if !floats.EqualWithinAbsOrRel(cdf, test.wantCDF, 1e-12, 1e-12) {
t.Errorf("CDF mismatch, x = %v, mu = %v, beta = %v. Got %v, want %v", test.x, test.mu, test.beta, cdf, test.wantCDF)
}
}
}
func TestGumbelRight(t *testing.T) {
src := rand.New(rand.NewSource(1))
for i, b := range []GumbelRight{
{0, 1, src},
{-5, 6, src},
{3, 0.1, src},
} {
testGumbelRight(t, b, i)
}
}
func testGumbelRight(t *testing.T, g GumbelRight, i int) {
const (
tol = 1e-2
n = 5e5
bins = 50
)
x := make([]float64, n)
generateSamples(x, g)
sort.Float64s(x)
min := math.Inf(-1)
testRandLogProbContinuous(t, i, min, x, g, tol, bins)
checkProbContinuous(t, i, x, g, 1e-3)
checkMean(t, i, x, g, tol)
checkVarAndStd(t, i, x, g, tol)
checkExKurtosis(t, i, x, g, 1e-1)
checkSkewness(t, i, x, g, 5e-2)
checkQuantileCDFSurvival(t, i, x, g, 5e-3)
}