gonum.org/v1/gonum@v0.14.0/stat/distuv/chisquared_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  	"golang.org/x/exp/rand"
    13  
    14  	"gonum.org/v1/gonum/floats/scalar"
    15  )
    16  
    17  func TestChiSquaredProb(t *testing.T) {
    18  	t.Parallel()
    19  	for _, test := range []struct {
    20  		x, k, want float64
    21  	}{
    22  		{10, 3, 0.0085003666025203432},
    23  		{2.3, 3, 0.19157345407042367},
    24  		{0.8, 0.2, 0.080363259903912673},
    25  	} {
    26  		pdf := ChiSquared{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 TestChiSquaredCDF(t *testing.T) {
    34  	t.Parallel()
    35  	for _, test := range []struct {
    36  		x, k, want float64
    37  	}{
    38  		// Values calculated with scipy.stats.chi2.cdf
    39  		{0, 1, 0},
    40  		{0.01, 5, 5.3002700426865167e-07},
    41  		{0.05, 3, 0.002929332764619924},
    42  		{0.5, 2, 0.22119921692859512},
    43  		{0.95, 3, 0.1866520918701263},
    44  		{0.99, 5, 0.036631697220869196},
    45  		{1, 1, 0.68268949213708596},
    46  		{1.5, 4, 0.17335853270322427},
    47  		{10, 10, 0.55950671493478743},
    48  		{25, 15, 0.95005656637357172},
    49  	} {
    50  		cdf := ChiSquared{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 TestChiSquared(t *testing.T) {
    58  	t.Parallel()
    59  	src := rand.New(rand.NewSource(1))
    60  	for i, b := range []ChiSquared{
    61  		{3, src},
    62  		{1.5, src},
    63  		{0.9, src},
    64  	} {
    65  		testChiSquared(t, b, i)
    66  	}
    67  }
    68  
    69  func testChiSquared(t *testing.T, c ChiSquared, 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  	checkVarAndStd(t, i, x, c, tol)
    82  	checkExKurtosis(t, i, x, c, 7e-2)
    83  	checkProbContinuous(t, i, x, 0, math.Inf(1), c, 1e-5)
    84  	checkQuantileCDFSurvival(t, i, x, c, 1e-2)
    85  
    86  	expectedMode := math.Max(c.K-2, 0)
    87  	if c.Mode() != expectedMode {
    88  		t.Errorf("Mode is not equal to max(k - 2, 0). Got %v, want %v", c.Mode(), expectedMode)
    89  	}
    90  	if c.NumParameters() != 1 {
    91  		t.Errorf("NumParameters is not 1. Got %v", c.NumParameters())
    92  	}
    93  	survival := c.Survival(-0.00001)
    94  	if survival != 1 {
    95  		t.Errorf("Survival is not 1 for negative argument. Got %v", survival)
    96  	}
    97  }