blob: f784eb156e734fcf33eedc076ed21c37ed613ee0 [file] [log] [blame]
// 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)
}