source: project/release/5/statistics/trunk/tests/run.scm @ 36303

Last change on this file since 36303 was 36303, checked in by Ivan Raikov, 14 months ago

statistics port to C5

File size: 13.3 KB
Line 
1;; some tests for statistics package
2
3(import test statistics srfi-1)
4
5;; -- to help the tests
6
7(define (to-4-dp f)
8  (/ (round (* f 10000)) 10000))
9
10(define (to-5-dp f)
11  (/ (round (* f 100000)) 100000))
12
13(define (=4 n1 n2)
14  (= (to-4-dp n1) (to-4-dp n2)))
15
16(define (=5 n1 n2)
17  (= (to-5-dp n1) (to-5-dp n2)))
18
19(test-group "utilities"
20
21            (test "cumsum"
22                  '(1 3 6 10 15)
23                  (cumsum '(1 2 3 4 5)))
24           
25            (test "average-rank"
26                  3
27                  (average-rank 3 '(1 2 3 4 5)))
28           
29            (test "average-rank"
30                  7/2
31                  (average-rank 3 '(1 2 3 3 4 5)))
32           
33            (test-assert "beta-incomplete"
34                         (=5 0.28367
35                             (beta-incomplete 0.2 0.1 0.3)))
36           
37           
38            (test "bin-and-count"
39                  (vector 5 5)
40                  (bin-and-count '(1 2 3 4 5 6 7 8 9 10) 2))
41           
42            (test "bin-and-count"
43                  (vector 2 2 2 2 2)
44                  (bin-and-count '(1 2 3 4 5 6 7 8 9 10) 5))
45           
46            (test "bin-and-count"
47                  (vector 5 1)
48                  (bin-and-count '(1 2 2 2 3 9) 2))
49           
50            (test "combinations"
51                  120 (combinations 10 3) )
52           
53            (test "factorial"
54                  3628800
55                  (factorial 10))
56           
57           
58            (test-assert "fisher-z-transform"
59             (=5 (fisher-z-transform 0.1)
60                 0.10034))
61
62            (test-assert "fisher-z-transform"
63                         (=5 (fisher-z-transform 0.5) 0.54931))
64           
65            (test "gamma-incomplete"
66                  (list 0.44217 0.0)
67                  (let-values (((a b) (gamma-incomplete 2.0 1.5))) (list (to-5-dp a) b)))
68           
69            (test-assert "gamma-ln"
70                         (=5 (gamma-ln 0.5)
71                             0.57236))
72           
73            (test "permutations" 720 (permutations 10 3))
74            )
75
76;(test (random-weighted-sample 3 '(1 2 3 4 5 7 8 9) '(0.15 0.025 0.4 0.1 0.35 0.2 0.15 0.25 0.05 0.01))
77;       (=> (lambda (result expected) (= (length result) expected))) 3)
78
79(test-group "descriptive statistics"
80
81            (test "mean" 0 (mean '()))
82
83            (test "mean" 1 (mean '(1)))
84
85            (test "mean" 3 (mean '(1 2 3 4 5)) )
86
87            (test "median" 1 (median '(1)))
88
89            (test "median" 3 (median '(1 2 3 4 5)))
90
91            (test "median" 4 (median '(1 1 2 3 4 5 6 7 8)))
92
93            (test "mode" '((1) 3) (let-values (((modes counts) (mode '(1 1 1 2 3 4 5)))) 
94                                    (list modes counts)))
95           
96            (test "mode" '((1 4) 3) (let-values (((modes counts) (mode '(1 1 1 2 3 4 4 4 5)))) 
97                                      (list modes counts)))
98            (test "geometric mean" 10.0 (geometric-mean '(1 100)))
99           
100            (test-assert "geometric mean"  (=5 2.60517 (geometric-mean '(1 2 3 4 5))))
101           
102            (test "range" 4 (range '(1 2 3 4 5)))
103           
104            (test "range" 9 (range '(1 1 1 2 3 4 10)))
105           
106            (test "percentile" 7/2 (percentile '(1 2 3 4 5 6) 50))
107           
108            (test "percentile" 2 (percentile '(1 2 3 4 5 6) 30))
109           
110            (test "variance" 5/2 (variance '(1 2 3 4 5)))
111
112            (test-assert "standard deviation" (=5 1.58113883 (standard-deviation '(1 2 3 4 5))))
113           
114            (test-assert "coefficient of variation" (=5 52.704627 (coefficient-of-variation '(1 2 3 4 5))))
115           
116            (test-assert (=5  (standard-error-of-the-mean '(1 2 3 4 5))
117                              0.707106781186548))
118           
119            (let-values (((mean sd n) (mean-sd-n '(1 2 3 4 5))))
120              (test-assert "mean sd" (=5  sd  1.58113883008419)))
121)
122
123(print (binomial-probability 10 0 0.5))
124
125
126(test-group "distributional functions"
127
128            (test-assert "binomial-probability"
129                         (every
130                          (lambda (pair)
131                            (=5 (binomial-probability 10 (car pair) 0.5) (cadr pair)))
132                          '((0 0.0009765625) (1 0.009765625) (2 0.0439453125) (3 0.1171875)
133                            (4 0.205078125) (5 0.24609375) (6 0.205078125)
134                            (7 0.1171875) (8 0.0439453125) (9 0.009765625)
135                            (10 0.0009765625))))
136
137
138            (test-assert "binomial-cumulative-probability"
139                         (every
140                          (lambda (pair)
141                            (=5 (binomial-cumulative-probability 10 (car pair) 0.5) (cadr pair)))
142                          '((0 0.0) (1 0.0009765625) (2 0.0107421875) (3 0.0546875)
143                            (4 0.171875) (5 0.376953125) (6 0.623046875)
144                            (7 0.828125) (8 0.9453125) (9 0.9892578125)
145                            (10 0.9990234375))))
146           
147            (test-assert "binomial-cumulative-probability"
148                         (every
149                          (lambda (pair)
150                            (=4 (poisson-probability 10 (car pair)) (cadr pair)))
151                          '((0 0.0000) (1 0.0005) (2 0.0023) (3 0.0076) (4 0.0189) (5 0.0378)
152                            (6 0.0631) (7 0.0901) (8 0.1126) (9 0.1251) (10 0.1251)
153                            (11 0.1137) (12 0.0948) (13 0.0729) (14 0.0521)
154                            (15 0.0347) (16 0.0217) (17 0.0128) (18 0.0071)
155                            (19 0.0037))))
156
157            (test-assert "poisson-cumulative-probability"
158                         (every
159                          (lambda (pair)
160                            (=4 (poisson-cumulative-probability 10 (car pair)) (cadr pair)))
161                          '((0 0.0000) (1 0.0000) (2 0.0005) (3 0.0028) (4 0.0103) (5 0.0293)
162                            (6 0.0671) (7 0.1301) (8 0.2202) (9 0.3328) (10 0.4579) 
163                            (11 0.5830) (12 0.6968) (13 0.7916) (14 0.8645)
164                            (15 0.9165) (16 0.9513) (17 0.9730) (18 0.9857) (19 0.9928))))
165
166           
167            (test-assert "normal-pdf"
168                         (every
169                          (lambda (pair)
170                            (=4 (normal-pdf (car pair) 5 4) (cadr pair)))
171                          '((0 0.0088) (1 0.0270) (2 0.0648) (3 0.1210) (4 0.1760)
172                            (5 0.1995) (6 0.1760) (7 0.1210) (8 0.0648)
173                            (9 0.0270)(10 0.0088))))
174           
175            (test-assert "phi"
176                         (every
177                          (lambda (pair)
178                            (=4 (phi (car pair)) (cadr pair)))
179                          '((-2.0 0.0228) (-1.6 0.0548) (-1.2 0.1151) (-0.8 0.2119)
180                            (-0.4 0.3446) ( 0.0 0.5000) ( 0.4 0.6554)
181                            ( 0.8 0.7881) ( 1.2 0.8849) ( 1.6 0.9452))))
182
183            (test-assert "z"
184                         (every
185                          (lambda (pair)
186                            (=5 (z (car pair)) (cadr pair)))
187                          '((0.1 -1.2815515713806909) (0.2 -0.8416212245351449))))
188           
189            (test "convert-to-standard-normal"
190                  -1/2
191                  (convert-to-standard-normal 5 6 2))
192
193            (test-assert "t-distribution"
194                  (=5 3.07763671875
195                      (t-distribution 1 0.9)))
196
197            (test-assert "t-distribution"
198                         (=5 1.3721923828125
199                             (t-distribution 10 0.9)))
200
201            (test-assert "chi-square"
202                         (=5 (chi-square 10 0.4405)
203                             10))
204           
205            (test-assert "chi-square"
206                         (=5 (chi-square 3 0.1718) 5))
207           
208            (test-assert "chi-square-cdf"
209                          (=5 (chi-square-cdf 10 10)
210                              0.559506714934786))
211           
212            (test-assert "chi-square-cdf"
213                         (=5 (chi-square-cdf 5 3)
214                             0.828202855703266))
215            )
216
217(test-group "tests of confidence intervals"
218
219            (let-values (((upper-bound lower-bound) (binomial-probability-ci 10 0.8 0.9)))
220              (test-assert "binomial-probability-ci" (=5 upper-bound 0.724273681640625))
221              (test-assert "binomial-probability-ci" (=5 lower-bound 0.851547241210938))
222              )
223
224            (let-values (((upper-bound lower-bound) (poisson-mu-ci 10 0.9)))
225              (test-assert "poisson-mu-ci" (=5 upper-bound 8.305419921875))
226              (test-assert "poisson-mu-ci" (=5 lower-bound 10.0635986328125)))
227
228            (let-values (((upper-bound lower-bound) (normal-mean-ci 0.5 0.1 10 0.8)))
229              (test-assert "normal-mean-ci" (=5 upper-bound 0.491747852700165))
230              (test-assert "normal-mean-ci" (=5 lower-bound 0.508252147299835)))
231
232            (let-values (((upper-bound lower-bound) (normal-mean-ci-on-sequence '(1 2 3 4 5) 0.9)))
233              (test-assert "normal-mean-ci-on-sequence" (=5 upper-bound 2.90535368828478))
234              (test-assert "normal-mean-ci-on-sequence" (=5 lower-bound 3.09464631171522)))
235)
236
237(test-group "hypothesis testing"
238
239            (test-assert "z-test"
240                        (=5 (z-test 40 1 #:mu 50 #:sigma 10 #:tails ':negative)
241                            0.15865525))
242            (test-assert "z-test"
243                         (=5 (z-test 40 10 #:mu 50 #:sigma 10 #:tails ':negative)
244                             0.000783))
245            (test-assert "z-test"
246                         (=5 (z-test 40 5 #:mu 50 #:sigma 10)
247                             0.025347))
248
249            (test-assert "z-test"
250                         (=5 (z-test 11/5 5 #:mu 2 #:sigma 1)
251                             0.65472085))
252           
253            (test-assert "z-test-on-sequence"
254                         (=5 (z-test-on-sequence '(1 1 2 3 4) #:mu 2 #:sigma 1)
255                             0.65472085))
256           
257            (test-assert "t-test-one-sample"
258                         (=5 (t-test-one-sample 5 0.8 3 6)
259                             0.162781641721079))
260           
261            (test-assert "t-test-one-sample-on-sequence"
262                         (=5 (t-test-one-sample-on-sequence '(5 6 7) 5.9)
263                             0.878433865229034))
264           
265            (test-assert "correlation-test-two-sample"
266                         (=5 (correlation-test-two-sample 0.9 100 0.85 50)
267                             0.224083300908794))
268           
269            (test-assert "t-test-paired"
270                         (=5 (t-test-paired 7/3 0.57735 3)
271                             0.0198039411803931))
272           
273            (test-assert "t-test-paired-on-sequences"
274                         (=5 (t-test-paired-on-sequences '(4 3 5) '(1 1 3))
275                             0.0198039411803931))
276           
277            )
278
279
280
281(let-values (((s p) (spearman-rank-correlation '((4 5) (10 8) (3 6) (1 2) (9 10) (2 3) (6 9) (7 4) (8 7) (5 1)))))
282  (test-assert "spearman-rank-correlation" (=5 s (/ 113 165)))
283  (test-assert "spearman-rank-correlation" (=5 p 0.0288827975067328)))
284
285(test-group "sample size estimates"
286           
287            (test "t-test-one-sample-sse" 163 (t-test-one-sample-sse 5.0 5.2 0.5))
288
289            (let-values (((n1 n2) (t-test-two-sample-sse 5.1 0.5 5.2 0.3)))
290              (test "t-test-two-sample-sse" 1040 n1)
291              (test "t-test-two-sample-sse" 1040 n2))
292
293            (test "correlation-sse" 11 (correlation-sse 0.80 #:alpha 0.05 #:1-beta 0.9))
294            ) ;; NOTE: Not same as some on-line sites describe ...
295
296(test-group "correlation and regression"
297
298            (let-values (((a b r r2 p) (linear-regression '((1.0 0.1) (2.0 0.3) (3.0 0.8)))))
299              (test "linear-regression"  -0.3 a)
300              (test-assert "linear-regression" (=5 b 0.35))
301              (test-assert "linear-regression" (=5 r 0.970725343394151))
302              (test-assert "linear-regression" (=5 r2  0.942307692307692))
303              (test-assert "linear-regression" (=5 p  0.154420958311267))
304              )
305
306            (test-assert "correlation-coefficient"
307                         (=5 0.970725343394151 (correlation-coefficient '((1.0 0.1) (2.0 0.3) (3.0 0.8)))))
308            )
309
310(test-group "significance tests"
311
312            (test-assert "t-significance" (=5 (t-significance 0.2 5) 0.849360513995829))
313           
314            (test-assert "t-significance" (=5 (t-significance 0.2 5 #:tails ':both) 0.849360513995829))
315           
316            (test-assert "t-significance" (=5 (t-significance 0.2 5 #:tails ':positive) 0.424680256997915))
317           
318            (test-assert "t-significance" (=5 (t-significance 0.2 5 #:tails ':negative) 0.575319743002086))
319           
320            (test-assert "f-significance" (=5 (f-significance 1.5 8 2) 0.920449812578091))
321           
322            (test-assert "f-significance" (=5 (f-significance 1.5 8 2 #:one-tailed? #t) 0.460224906289046))
323           
324            (test-assert "binomial-test-two-sample" (=5 (binomial-test-two-sample 0.2 100 0.3 50) 0.245930683028145))
325           
326            (test-assert "fisher-exact-test" (=5 (fisher-exact-test 10 20 30 40) 0.5066621427235114))
327           
328            (test-assert "lambert-W0" (=5 (lambert-W0 1.0) 0.567143290410))
329           
330            (test-assert "lambert-Wm1" (=5 (lambert-Wm1 1.0) 0.567143290410))
331            )
332
333(test-exit)
Note: See TracBrowser for help on using the repository browser.