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