source: trunk/test/fisher.cc @ 2706

Last change on this file since 2706 was 2706, checked in by Peter, 12 years ago

avoid missing regression. remove trailing WS

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.6 KB
Line 
1// $Id: fisher.cc 2706 2012-03-13 07:16:56Z peter $
2
3/*
4  Copyright (C) 2008, 2009, 2010 Peter Johansson
5
6  This file is part of the yat library, http://dev.thep.lu.se/yat
7
8  The yat library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 3 of the
11  License, or (at your option) any later version.
12
13  The yat library is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with yat. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "Suite.h"
23
24#include "yat/statistics/Fisher.h"
25
26#include <climits>
27
28using namespace theplu::yat;
29void test_p_value(test::Suite&);
30void test_p_value_approximative(test::Suite&);
31void test_p_value_exact(test::Suite&);
32void test_large_numbers(test::Suite&);
33
34int main(int argc, char* argv[])
35{
36  test::Suite suite(argc, argv);
37
38  statistics::Fisher f;
39  if (!suite.equal(f.oddsratio(1,4,5,1), 0.05)) {
40    suite.add(false);
41    suite.err() << "oddsratio failed\n";
42  }
43  double a, b, c, d;
44  f.expected(a,b,c,d);
45  if (!suite.equal(a, 30.0/11.0)) {
46    suite.add(false);
47    suite.err() << "expected a failed\n";
48  }
49  if (!suite.equal(b, 25.0/11.0)) {
50    suite.add(false);
51    suite.err() << "expected b failed\n";
52  }
53  if (!suite.equal(c, 36.0/11.0)) {
54    suite.add(false);
55    suite.err() << "expected c failed\n";
56  }
57  if (!suite.equal(d, 30.0/11.0)) {
58    suite.add(false);
59    suite.err() << "expected d failed\n";
60  }
61  if (!suite.equal(f.Chi2(), 4.4122222222222222222222)) {
62    suite.add(false);
63    suite.err() << "Chi2 failed\n";
64  }
65  if (!suite.equal(f.minimum_size(),10)) {
66    suite.add(false);
67    suite.err() << "minimum_size failed\n";
68  }
69  test_p_value(suite);
70  test_large_numbers(suite);
71  return suite.return_value();
72}
73
74
75void test_large_numbers(test::Suite& suite)
76{
77  // skip test if unsigned int is 16 bit
78  if ((UINT_MAX >> 16) == 0) {
79    suite.out() << "skipping test_large_numbers\n";
80    return;
81  }
82
83  statistics::Fisher f;
84  double oddsratio = f.oddsratio(1166,63326825-1166,1095,66074759-1095);
85  if (oddsratio<0.5 || oddsratio>2) {
86    suite.err() << "oddsratio: " << oddsratio << "\n";
87    suite.err() << "expected ~ 1\n";
88    suite.add(false);
89  }
90  suite.add(suite.equal_fix(f.p_value(), 0.0123, 0.0001));
91  f.p_value_one_sided();
92}
93
94
95void test_p_value(test::Suite& suite)
96{
97  test_p_value_exact(suite);
98  test_p_value_approximative(suite);
99}
100
101
102void test_p_value_approximative(test::Suite& suite)
103{
104  suite.err() << "testing p_value_approximative\n";
105  statistics::Fisher f;
106  f.minimum_size() = 0;
107  f.oddsratio(10,20,20,50);
108  suite.add(suite.equal(f.p_value(), 2*f.p_value_one_sided()));
109  f.oddsratio(10,20,10,20);
110  suite.add(suite.equal(f.p_value(), 1.0));
111  suite.add(suite.equal(f.p_value_one_sided(), 0.5));
112}
113
114
115void test_p_value_exact(test::Suite& suite)
116{
117  suite.err() << "test p_value_exact\n";
118  statistics::Fisher f;
119  f.minimum_size() = 1000;
120  f.oddsratio(10,20,10,20);
121  suite.add(suite.equal(f.p_value(), 1.0));
122
123  f.oddsratio(10, 20, 20, 200);
124  suite.add(suite.equal_fix(f.p_value(), 0.000811906062767622,1e-16));
125  suite.add(suite.equal_fix(f.p_value_one_sided(), 0.000811906062767622,1e-16));
126
127  // testing symmetry
128  statistics::Fisher f2;
129  f2.minimum_size() = 1000;
130  f2.oddsratio(20, 200, 10, 20);
131  suite.add(suite.equal(f2.p_value(), f.p_value()));
132
133  f.oddsratio(1, 1, 1, 2);
134  suite.add(suite.equal(f.p_value(), 1.0, 2));
135  suite.add(suite.equal(f.p_value_one_sided(), 0.7));
136
137  f.oddsratio(1, 1, 2, 1);
138  suite.add(suite.equal(f.p_value(), 1.0, 2));
139  suite.add(suite.equal(f.p_value_one_sided(), 0.9));
140
141}
Note: See TracBrowser for help on using the repository browser.