source: branches/0.6-stable/test/fisher_test.cc @ 2317

Last change on this file since 2317 was 2317, checked in by Peter, 13 years ago

updating copyright years

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.6 KB
Line 
1// $Id: fisher_test.cc 2317 2010-08-20 04:10:07Z 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 <climits>
23
24#include "Suite.h"
25
26#include "yat/statistics/Fisher.h"
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_p_value(test::Suite& suite)
76{
77  test_p_value_exact(suite);
78  test_p_value_approximative(suite);
79}
80
81
82void test_p_value_approximative(test::Suite& suite)
83{
84  suite.err() << "testing p_value_approximative\n";
85  statistics::Fisher f;
86  f.minimum_size() = 0;
87  f.oddsratio(10,20,20,50);
88  suite.add(suite.equal(f.p_value(), 2*f.p_value_one_sided()));
89  f.oddsratio(10,20,10,20);
90  suite.add(suite.equal(f.p_value(), 1.0));
91  suite.add(suite.equal(f.p_value_one_sided(), 0.5));
92}
93
94
95void test_p_value_exact(test::Suite& suite)
96{
97  suite.err() << "test p_value_exact\n";
98  statistics::Fisher f;
99  f.minimum_size() = 1000;
100  f.oddsratio(10,20,10,20);
101  suite.add(suite.equal(f.p_value(), 1.0));
102
103  f.oddsratio(10, 20, 20, 200);
104  suite.add(suite.equal_fix(f.p_value(), 0.000811906062767622,1e-16));
105  suite.add(suite.equal_fix(f.p_value_one_sided(), 0.000811906062767622,1e-16));
106
107  // testing symmetry
108  statistics::Fisher f2;
109  f2.minimum_size() = 1000;
110  f2.oddsratio(20, 200, 10, 20);
111  suite.add(suite.equal(f2.p_value(), f.p_value()));
112
113  f.oddsratio(1, 1, 1, 2);
114  suite.add(suite.equal(f.p_value(), 1.0, 2));
115  suite.add(suite.equal(f.p_value_one_sided(), 0.7));
116
117  f.oddsratio(1, 1, 2, 1);
118  suite.add(suite.equal(f.p_value(), 1.0, 2));
119  suite.add(suite.equal(f.p_value_one_sided(), 0.9));
120
121}
122
123void test_large_numbers(test::Suite& suite)
124{
125  // skip test if unsigned int is 16 bit
126  if (UINT_MAX == ( 1 << 16))
127    return;
128
129  statistics::Fisher f;
130  double oddsratio = f.oddsratio(1166,63326825-1166,1095,66074759-1095);
131  if (oddsratio<0.5 || oddsratio>2) {
132    suite.err() << "oddsratio: " << oddsratio << "\n";
133    suite.err() << "expected ~ 1\n";
134    suite.xadd(false);
135  }
136  f.p_value();
137  f.p_value_one_sided();
138}
Note: See TracBrowser for help on using the repository browser.