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