81 lines
2.5 KiB
Go
81 lines
2.5 KiB
Go
// Copyright 2015 The Go 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 stats
|
|
|
|
import "testing"
|
|
|
|
func TestMannWhitneyUTest(t *testing.T) {
|
|
check := func(want, got *MannWhitneyUTestResult) {
|
|
if want.N1 != got.N1 || want.N2 != got.N2 ||
|
|
!aeq(want.U, got.U) ||
|
|
want.AltHypothesis != got.AltHypothesis ||
|
|
!aeq(want.P, got.P) {
|
|
t.Errorf("want %+v, got %+v", want, got)
|
|
}
|
|
}
|
|
check3 := func(x1, x2 []float64, U float64, pless, pdiff, pgreater float64) {
|
|
want := &MannWhitneyUTestResult{N1: len(x1), N2: len(x2), U: U}
|
|
|
|
want.AltHypothesis = LocationLess
|
|
want.P = pless
|
|
got, _ := MannWhitneyUTest(x1, x2, want.AltHypothesis)
|
|
check(want, got)
|
|
|
|
want.AltHypothesis = LocationDiffers
|
|
want.P = pdiff
|
|
got, _ = MannWhitneyUTest(x1, x2, want.AltHypothesis)
|
|
check(want, got)
|
|
|
|
want.AltHypothesis = LocationGreater
|
|
want.P = pgreater
|
|
got, _ = MannWhitneyUTest(x1, x2, want.AltHypothesis)
|
|
check(want, got)
|
|
}
|
|
|
|
s1 := []float64{2, 1, 3, 5}
|
|
s2 := []float64{12, 11, 13, 15}
|
|
s3 := []float64{0, 4, 6, 7} // Interleaved with s1, but no ties
|
|
s4 := []float64{2, 2, 2, 2}
|
|
s5 := []float64{1, 1, 1, 1, 1}
|
|
|
|
// Small sample, no ties
|
|
check3(s1, s2, 0, 0.014285714285714289, 0.028571428571428577, 1)
|
|
check3(s2, s1, 16, 1, 0.028571428571428577, 0.014285714285714289)
|
|
check3(s1, s3, 5, 0.24285714285714288, 0.485714285714285770, 0.8285714285714285)
|
|
|
|
// Small sample, ties
|
|
// TODO: Check these against some other implementation.
|
|
check3(s1, s1, 8, 0.6285714285714286, 1, 0.6285714285714286)
|
|
check3(s1, s4, 10, 0.8571428571428571, 0.7142857142857143, 0.3571428571428571)
|
|
check3(s1, s5, 17.5, 1, 0, 0.04761904761904767)
|
|
|
|
r, err := MannWhitneyUTest(s4, s4, LocationDiffers)
|
|
if err != ErrSamplesEqual {
|
|
t.Errorf("want ErrSamplesEqual, got %+v, %+v", r, err)
|
|
}
|
|
|
|
// Large samples.
|
|
l1 := make([]float64, 500)
|
|
for i := range l1 {
|
|
l1[i] = float64(i * 2)
|
|
}
|
|
l2 := make([]float64, 600)
|
|
for i := range l2 {
|
|
l2[i] = float64(i*2 - 41)
|
|
}
|
|
l3 := append([]float64{}, l2...)
|
|
for i := 0; i < 30; i++ {
|
|
l3[i] = l1[i]
|
|
}
|
|
// For comparing with R's wilcox.test:
|
|
// l1 <- seq(0, 499)*2
|
|
// l2 <- seq(0,599)*2-41
|
|
// l3 <- l2; for (i in 1:30) { l3[i] = l1[i] }
|
|
|
|
check3(l1, l2, 135250, 0.0024667680407086112, 0.0049335360814172224, 0.9975346930458906)
|
|
check3(l1, l1, 125000, 0.5000436801680628, 1, 0.5000436801680628)
|
|
check3(l1, l3, 134845, 0.0019351907119808942, 0.0038703814239617884, 0.9980659818257166)
|
|
}
|