github.com/gopherd/gonum@v0.0.4/stat/distuv/studentst_test.go (about)

     1  // Copyright ©2016 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"
    15  	"github.com/gopherd/gonum/floats/scalar"
    16  )
    17  
    18  func TestStudentsTProb(t *testing.T) {
    19  	t.Parallel()
    20  	for _, test := range []struct {
    21  		x, mu, sigma, nu, want float64
    22  	}{
    23  		// Values comparison with scipy.
    24  		{0.01, 0, 1, 2.74, 0.364778548181318},
    25  		{-0.01, 0, 1, 2.74, 0.364778548181318},
    26  		{0.4, 0, 1, 1.6, 0.30376391362582678},
    27  		{-0.4, 0, 1, 1.6, 0.30376391362582678},
    28  		{0.2, 15, 5, 10, 0.0024440848858034393},
    29  	} {
    30  		pdf := StudentsT{test.mu, test.sigma, test.nu, nil}.Prob(test.x)
    31  		if !scalar.EqualWithinAbsOrRel(pdf, test.want, 1e-10, 1e-10) {
    32  			t.Errorf("Pdf mismatch, x = %v, Nu = %v. Got %v, want %v", test.x, test.nu, pdf, test.want)
    33  		}
    34  	}
    35  }
    36  
    37  func TestStudentsT(t *testing.T) {
    38  	t.Parallel()
    39  	src := rand.New(rand.NewSource(1))
    40  	for i, b := range []StudentsT{
    41  		{0, 1, 3.3, src},
    42  		{0, 1, 7.2, src},
    43  		{0, 1, 12, src},
    44  		{0.9, 0.8, 6, src},
    45  	} {
    46  		testStudentsT(t, b, i)
    47  	}
    48  }
    49  
    50  func testStudentsT(t *testing.T, c StudentsT, i int) {
    51  	const (
    52  		tol  = 1e-2
    53  		n    = 3e5
    54  		bins = 50
    55  	)
    56  	x := make([]float64, n)
    57  	generateSamples(x, c)
    58  	sort.Float64s(x)
    59  
    60  	testRandLogProbContinuous(t, i, math.Inf(-1), x, c, tol, bins)
    61  	checkMean(t, i, x, c, tol)
    62  	if c.Nu > 2 {
    63  		checkVarAndStd(t, i, x, c, 5e-2)
    64  	}
    65  	checkProbContinuous(t, i, x, math.Inf(-1), math.Inf(1), c, 1e-10)
    66  	checkQuantileCDFSurvival(t, i, x, c, tol)
    67  	checkProbQuantContinuous(t, i, x, c, tol)
    68  	if c.Mu != c.Mode() {
    69  		t.Errorf("Mismatch in mode value: got %v, want %g", c.Mode(), c.Mu)
    70  	}
    71  	if c.NumParameters() != 3 {
    72  		t.Errorf("Mismatch in NumParameters: got %v, want 3", c.NumParameters())
    73  	}
    74  }
    75  
    76  func TestStudentsTQuantile(t *testing.T) {
    77  	t.Parallel()
    78  	nSteps := 101
    79  	probs := make([]float64, nSteps)
    80  	floats.Span(probs, 0, 1)
    81  	for i, b := range []StudentsT{
    82  		{0, 1, 3.3, nil},
    83  		{0, 1, 7.2, nil},
    84  		{0, 1, 12, nil},
    85  		{0.9, 0.8, 6, nil},
    86  	} {
    87  		for _, p := range probs {
    88  			x := b.Quantile(p)
    89  			p2 := b.CDF(x)
    90  			if !scalar.EqualWithinAbsOrRel(p, p2, 1e-10, 1e-10) {
    91  				t.Errorf("mismatch between CDF and Quantile. Case %v. Want %v, got %v", i, p, p2)
    92  				break
    93  			}
    94  		}
    95  	}
    96  }
    97  
    98  func TestStudentsVarianceSpecial(t *testing.T) {
    99  	t.Parallel()
   100  	dist := StudentsT{0, 1, 1, nil}
   101  	variance := dist.Variance()
   102  	if !math.IsNaN(variance) {
   103  		t.Errorf("Expected NaN variance for Nu <= 1, got %v", variance)
   104  	}
   105  	dist = StudentsT{0, 1, 2, nil}
   106  	variance = dist.Variance()
   107  	if !math.IsInf(variance, 1) {
   108  		t.Errorf("Expected +Inf variance for 1 < Nu <= 2, got %v", variance)
   109  	}
   110  }