| // 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) | |
| } |