1 /*
2 * unittests/stat/Functions.cc
3 * Apto
4 *
5 * Created by David on 2/22/11.
6 * Copyright 2011 David Michael Bryson. All rights reserved.
7 * http://programerror.com/software/apto
8 *
9 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
10 * following conditions are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
13 * following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
15 * following disclaimer in the documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of David Michael Bryson, nor the names of contributors may be used to endorse or promote
17 * products derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY DAVID MICHAEL BRYSON AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL DAVID MICHAEL BRYSON OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
25 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 * Authors: David M. Bryson <david@programerror.com>
28 *
29 */
30
31 #include "apto/stat/ContingencyTable.h"
32 #include "apto/stat/Functions.h"
33
34 #include "gtest/gtest.h"
35
36 #include <iostream>
37
38
TEST(StatFunctions,FishersExact)39 TEST(StatFunctions, FishersExact) {
40 double pvalue = 0.0;
41 Apto::Stat::ContingencyTable t1(2,2);
42 t1[0][0] = 2; t1[0][1] = 2;
43 t1[1][0] = 4; t1[1][1] = 0;
44
45 pvalue = Apto::Stat::FishersExact(t1);
46 EXPECT_LT(0.428571428, pvalue);
47 EXPECT_GT(0.428571429, pvalue);
48
49
50 Apto::Stat::ContingencyTable t2(2,9);
51 t2[0][0] = 1; t2[0][1] = 1; t2[0][2] = 1; t2[0][3] = 0; t2[0][4] = 0; t2[0][5] = 0; t2[0][6] = 1; t2[0][7] = 3; t2[0][8] = 3;
52 t2[1][0] = 4; t2[1][1] = 4; t2[1][2] = 4; t2[1][3] = 4; t2[1][4] = 4; t2[1][5] = 4; t2[1][6] = 4; t2[1][7] = 1; t2[1][8] = 1;
53
54 pvalue = Apto::Stat::FishersExact(t2);
55 EXPECT_LT(.0679646227, pvalue);
56 EXPECT_GT(.0679646228, pvalue);
57
58
59 Apto::Stat::ContingencyTable t3(4,5);
60 t3[0][0] = 2; t3[0][1] = 0; t3[0][2] = 1; t3[0][3] = 2; t3[0][4] = 6;
61 t3[1][0] = 1; t3[1][1] = 3; t3[1][2] = 1; t3[1][3] = 1; t3[1][4] = 1;
62 t3[2][0] = 1; t3[2][1] = 0; t3[2][2] = 3; t3[2][3] = 1; t3[2][4] = 0;
63 t3[3][0] = 1; t3[3][1] = 2; t3[3][2] = 1; t3[3][3] = 2; t3[3][4] = 0;
64
65 pvalue = Apto::Stat::FishersExact(t3);
66 EXPECT_LT(.0911177720, pvalue);
67 EXPECT_GT(.0911177721, pvalue);
68
69
70 Apto::Stat::ContingencyTable t4(4,6);
71 t4[0][0] = 2; t4[0][1] = 0; t4[0][2] = 1; t4[0][3] = 2; t4[0][4] = 6; t4[0][5] = 5;
72 t4[1][0] = 1; t4[1][1] = 3; t4[1][2] = 1; t4[1][3] = 1; t4[1][4] = 1; t4[1][5] = 2;
73 t4[2][0] = 1; t4[2][1] = 0; t4[2][2] = 3; t4[2][3] = 1; t4[2][4] = 0; t4[2][5] = 0;
74 t4[3][0] = 1; t4[3][1] = 2; t4[3][2] = 1; t4[3][3] = 2; t4[3][4] = 0; t4[3][5] = 0;
75
76 pvalue = Apto::Stat::FishersExact(t4);
77 EXPECT_LT(.0453742835, pvalue);
78 EXPECT_GT(.0453742836, pvalue);
79
80
81 Apto::Stat::ContingencyTable t5(3,9);
82 t5[0][0] = 1; t5[0][1] = 1; t5[0][2] = 1; t5[0][3] = 0; t5[0][4] = 0; t5[0][5] = 0; t5[0][6] = 1; t5[0][7] = 2; t5[0][8] = 4;
83 t5[1][0] = 4; t5[1][1] = 4; t5[1][2] = 4; t5[1][3] = 5; t5[1][4] = 5; t5[1][5] = 5; t5[1][6] = 6; t5[1][7] = 5; t5[1][8] = 0;
84 t5[2][0] = 1; t5[2][1] = 1; t5[2][2] = 1; t5[2][3] = 0; t5[2][4] = 0; t5[2][5] = 0; t5[2][6] = 1; t5[2][7] = 2; t5[2][8] = 4;
85
86 pvalue = Apto::Stat::FishersExact(t5);
87 EXPECT_LT(.0353520689, pvalue);
88 EXPECT_GT(.0353520690, pvalue);
89
90
91 Apto::Stat::ContingencyTable t6(5,6);
92 t6[0][0] = 1; t6[0][1] = 2; t6[0][2] = 2; t6[0][3] = 1; t6[0][4] = 1; t6[0][5] = 0;
93 t6[1][0] = 2; t6[1][1] = 0; t6[1][2] = 0; t6[1][3] = 2; t6[1][4] = 3; t6[1][5] = 0;
94 t6[2][0] = 0; t6[2][1] = 1; t6[2][2] = 1; t6[2][3] = 1; t6[2][4] = 2; t6[2][5] = 7;
95 t6[3][0] = 1; t6[3][1] = 1; t6[3][2] = 2; t6[3][3] = 0; t6[3][4] = 0; t6[3][5] = 0;
96 t6[4][0] = 0; t6[4][1] = 1; t6[4][2] = 1; t6[4][3] = 1; t6[4][4] = 1; t6[4][5] = 0;
97
98 pvalue = Apto::Stat::FishersExact(t6);
99 EXPECT_LT(.0258388679, pvalue);
100 EXPECT_GT(.0258388680, pvalue);
101
102
103 Apto::Stat::ContingencyTable t7(5,7);
104 t7[0][0] = 1; t7[0][1] = 2; t7[0][2] = 2; t7[0][3] = 1; t7[0][4] = 1; t7[0][5] = 0; t7[0][6] = 1;
105 t7[1][0] = 2; t7[1][1] = 0; t7[1][2] = 0; t7[1][3] = 2; t7[1][4] = 3; t7[1][5] = 0; t7[1][6] = 0;
106 t7[2][0] = 0; t7[2][1] = 1; t7[2][2] = 1; t7[2][3] = 1; t7[2][4] = 2; t7[2][5] = 7; t7[2][6] = 3;
107 t7[3][0] = 1; t7[3][1] = 1; t7[3][2] = 2; t7[3][3] = 0; t7[3][4] = 0; t7[3][5] = 0; t7[3][6] = 1;
108 t7[4][0] = 0; t7[4][1] = 1; t7[4][2] = 1; t7[4][3] = 1; t7[4][4] = 1; t7[4][5] = 0; t7[4][6] = 0;
109
110 pvalue = Apto::Stat::FishersExact(t7);
111 EXPECT_LT(.0392896436, pvalue);
112 EXPECT_GT(.0392896437, pvalue);
113
114
115 Apto::Stat::ContingencyTable t8(3,3);
116 t8[0][0] = 2; t8[0][1] = 4; t8[0][2] = 6;
117 t8[1][0] = 7; t8[1][1] = 6; t8[1][2] = 1;
118 t8[2][0] = 5; t8[2][1] = 0; t8[2][2] = 0;
119
120 pvalue = Apto::Stat::FishersExact(t8);
121 EXPECT_LT(.00760907288, pvalue);
122 EXPECT_GT(.00760907290, pvalue);
123
124
125 Apto::Stat::ContingencyTable t9(2,8);
126 t9[0][0] = 22; t9[0][1] = 13; t9[0][2] = 5; t9[0][3] = 4; t9[0][4] = 5; t9[0][5] = 3; t9[0][6] = 2; t9[0][7] = 1;
127 t9[1][0] = 7; t9[1][1] = 1; t9[1][2] = 4; t9[1][3] = 3; t9[1][4] = 1; t9[1][5] = 2; t9[1][6] = 3; t9[1][7] = 4;
128
129 pvalue = Apto::Stat::FishersExact(t9);
130 EXPECT_LT(.0359536592, pvalue);
131 EXPECT_GT(.0359536593, pvalue);
132
133
134 Apto::Stat::ContingencyTable t10(2,5);
135 t10[0][0] = 2; t10[0][1] = 3; t10[0][2] = 4; t10[0][3] = 8; t10[0][4] = 9;
136 t10[1][0] = 0; t10[1][1] = 0; t10[1][2] = 11; t10[1][3] = 10; t10[1][4] = 11;
137
138 pvalue = Apto::Stat::FishersExact(t10);
139 EXPECT_LT(.0855243656, pvalue);
140 EXPECT_GT(.0855243657, pvalue);
141
142
143 Apto::Stat::ContingencyTable t11(3,5);
144 t11[0][0] = 24; t11[0][1] = 7; t11[0][2] = 3; t11[0][3] = 8; t11[0][4] = 1;
145 t11[1][0] = 9; t11[1][1] = 5; t11[1][2] = 5; t11[1][3] = 0; t11[1][4] = 3;
146 t11[2][0] = 2; t11[2][1] = 0; t11[2][2] = 2; t11[2][3] = 0; t11[2][4] = 1;
147
148 pvalue = Apto::Stat::FishersExact(t11);
149 EXPECT_LT(.0199296518, pvalue);
150 EXPECT_GT(.0199296519, pvalue);
151
152
153 Apto::Stat::ContingencyTable t12(2,10);
154 t12[0][0] = 20; t12[0][1] = 3; t12[0][2] = 6; t12[0][3] = 4; t12[0][4] = 7; t12[0][5] = 6; t12[0][6] = 6; t12[0][7] = 2; t12[0][8] = 2; t12[0][9] = 2;
155 t12[1][0] = 8; t12[1][1] = 8; t12[1][2] = 4; t12[1][3] = 5; t12[1][4] = 2; t12[1][5] = 1; t12[1][6] = 0; t12[1][7] = 2; t12[1][8] = 1; t12[1][9] = 1;
156
157 pvalue = Apto::Stat::FishersExact(t12);
158 EXPECT_LT(.0825379121, pvalue);
159 EXPECT_GT(.0825379122, pvalue);
160
161
162 Apto::Stat::ContingencyTable t13(3,7);
163 t13[0][0] = 1; t13[0][1] = 8; t13[0][2] = 5; t13[0][3] = 4; t13[0][4] = 4; t13[0][5] = 2; t13[0][6] = 2;
164 t13[1][0] = 5; t13[1][1] = 3; t13[1][2] = 3; t13[1][3] = 4; t13[1][4] = 3; t13[1][5] = 1; t13[1][6] = 0;
165 t13[2][0] = 10; t13[2][1] = 1; t13[2][2] = 4; t13[2][3] = 0; t13[2][4] = 0; t13[2][5] = 0; t13[2][6] = 0;
166
167 pvalue = Apto::Stat::FishersExact(t13);
168 EXPECT_LT(.00355998020, pvalue);
169 EXPECT_GT(.00355998021, pvalue);
170
171
172 Apto::Stat::ContingencyTable t14(4,5);
173 t14[0][0] = 9; t14[0][1] = 1; t14[0][2] = 3; t14[0][3] = 1; t14[0][4] = 3;
174 t14[1][0] = 3; t14[1][1] = 3; t14[1][2] = 2; t14[1][3] = 1; t14[1][4] = 3;
175 t14[2][0] = 8; t14[2][1] = 2; t14[2][2] = 4; t14[2][3] = 2; t14[2][4] = 0;
176 t14[3][0] = 4; t14[3][1] = 9; t14[3][2] = 2; t14[3][3] = 0; t14[3][4] = 0;
177
178 pvalue = Apto::Stat::FishersExact(t14);
179 EXPECT_LT(.0251308776, pvalue);
180 EXPECT_GT(.0251308777, pvalue);
181
182
183 Apto::Stat::ContingencyTable t15(3,6);
184 t15[0][0] = 12; t15[0][1] = 6; t15[0][2] = 12; t15[0][3] = 1; t15[0][4] = 1; t15[0][5] = 0;
185 t15[1][0] = 5; t15[1][1] = 12; t15[1][2] = 4; t15[1][3] = 4; t15[1][4] = 0; t15[1][5] = 1;
186 t15[2][0] = 5; t15[2][1] = 12; t15[2][2] = 10; t15[2][3] = 1; t15[2][4] = 1; t15[2][5] = 0;
187
188 pvalue = Apto::Stat::FishersExact(t15);
189 EXPECT_LT(.0494795032, pvalue);
190 EXPECT_GT(.0494795033, pvalue);
191
192
193 Apto::Stat::ContingencyTable t16(3,8);
194 t16[0][0] = 20; t16[0][1] = 20; t16[0][2] = 2; t16[0][3] = 2; t16[0][4] = 0; t16[0][5] = 0; t16[0][6] = 0; t16[0][7] = 1;
195 t16[1][0] = 10; t16[1][1] = 10; t16[1][2] = 1; t16[1][3] = 1; t16[1][4] = 3; t16[1][5] = 3; t16[1][6] = 1; t16[1][7] = 0;
196 t16[2][0] = 20; t16[2][1] = 20; t16[2][2] = 2; t16[2][3] = 2; t16[2][4] = 0; t16[2][5] = 0; t16[2][6] = 0; t16[2][7] = 1;
197
198 pvalue = Apto::Stat::FishersExact(t16);
199 EXPECT_LT(.125371228, pvalue);
200 EXPECT_GT(.125371229, pvalue);
201
202
203 Apto::Stat::ContingencyTable t17(19,2);
204 t17[ 0][0] = 3; t17[ 0][1] = 7;
205 t17[ 1][0] = 1; t17[ 1][1] = 9;
206 t17[ 2][0] = 10; t17[ 2][1] = 0;
207 t17[ 3][0] = 0; t17[ 3][1] = 10;
208 t17[ 4][0] = 4; t17[ 4][1] = 6;
209 t17[ 5][0] = 3; t17[ 5][1] = 7;
210 t17[ 6][0] = 3; t17[ 6][1] = 7;
211 t17[ 7][0] = 2; t17[ 7][1] = 8;
212 t17[ 8][0] = 0; t17[ 8][1] = 10;
213 t17[ 9][0] = 2; t17[ 9][1] = 8;
214 t17[10][0] = 0; t17[10][1] = 10;
215 t17[11][0] = 2; t17[11][1] = 8;
216 t17[12][0] = 1; t17[12][1] = 9;
217 t17[13][0] = 1; t17[13][1] = 9;
218 t17[14][0] = 6; t17[14][1] = 4;
219 t17[15][0] = 10; t17[15][1] = 0;
220 t17[16][0] = 5; t17[16][1] = 5;
221 t17[17][0] = 7; t17[17][1] = 3;
222 t17[18][0] = 2; t17[18][1] = 8;
223 pvalue = Apto::Stat::FishersExact(t17);
224 EXPECT_LT(.159961169e-11, pvalue);
225 EXPECT_GT(.159961170e-11, pvalue);
226 }
227