statsample 0.18.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +23 -0
  3. data/Manifest.txt +28 -17
  4. data/Rakefile +3 -2
  5. data/benchmarks/correlation_matrix_15_variables.rb +31 -0
  6. data/benchmarks/correlation_matrix_5_variables.rb +32 -0
  7. data/benchmarks/correlation_matrix_methods/correlation_matrix.ds +0 -0
  8. data/benchmarks/correlation_matrix_methods/correlation_matrix.html +93 -0
  9. data/benchmarks/correlation_matrix_methods/correlation_matrix.rb +75 -0
  10. data/benchmarks/correlation_matrix_methods/correlation_matrix.xls +0 -0
  11. data/benchmarks/correlation_matrix_methods/correlation_matrix_gsl_ruby.ods +0 -0
  12. data/benchmarks/correlation_matrix_methods/correlation_matrix_with_graphics.ods +0 -0
  13. data/benchmarks/correlation_matrix_methods/results.ds +0 -0
  14. data/benchmarks/factor_map.rb +37 -0
  15. data/benchmarks/helpers_benchmark.rb +5 -0
  16. data/examples/boxplot.rb +13 -14
  17. data/examples/correlation_matrix.rb +16 -8
  18. data/examples/dataset.rb +13 -4
  19. data/examples/dominance_analysis.rb +23 -17
  20. data/examples/dominance_analysis_bootstrap.rb +28 -22
  21. data/examples/histogram.rb +8 -9
  22. data/examples/icc.rb +20 -21
  23. data/examples/levene.rb +10 -4
  24. data/examples/multiple_regression.rb +9 -28
  25. data/examples/multivariate_correlation.rb +9 -3
  26. data/examples/parallel_analysis.rb +20 -16
  27. data/examples/polychoric.rb +15 -9
  28. data/examples/principal_axis.rb +18 -6
  29. data/examples/reliability.rb +26 -13
  30. data/examples/scatterplot.rb +10 -6
  31. data/examples/t_test.rb +15 -6
  32. data/examples/tetrachoric.rb +9 -2
  33. data/examples/u_test.rb +12 -4
  34. data/examples/vector.rb +13 -2
  35. data/examples/velicer_map_test.rb +33 -26
  36. data/lib/statsample.rb +32 -12
  37. data/lib/statsample/analysis.rb +79 -0
  38. data/lib/statsample/analysis/suite.rb +72 -0
  39. data/lib/statsample/analysis/suitereportbuilder.rb +38 -0
  40. data/lib/statsample/bivariate.rb +70 -16
  41. data/lib/statsample/dataset.rb +25 -19
  42. data/lib/statsample/dominanceanalysis.rb +2 -2
  43. data/lib/statsample/factor.rb +2 -0
  44. data/lib/statsample/factor/map.rb +16 -10
  45. data/lib/statsample/factor/parallelanalysis.rb +9 -3
  46. data/lib/statsample/factor/pca.rb +28 -32
  47. data/lib/statsample/factor/rotation.rb +15 -8
  48. data/lib/statsample/graph/boxplot.rb +3 -4
  49. data/lib/statsample/graph/histogram.rb +2 -1
  50. data/lib/statsample/graph/scatterplot.rb +1 -0
  51. data/lib/statsample/matrix.rb +106 -16
  52. data/lib/statsample/regression.rb +4 -1
  53. data/lib/statsample/regression/binomial.rb +1 -1
  54. data/lib/statsample/regression/multiple/baseengine.rb +19 -9
  55. data/lib/statsample/regression/multiple/gslengine.rb +127 -126
  56. data/lib/statsample/regression/multiple/matrixengine.rb +8 -5
  57. data/lib/statsample/regression/multiple/rubyengine.rb +1 -1
  58. data/lib/statsample/regression/simple.rb +31 -6
  59. data/lib/statsample/reliability.rb +11 -3
  60. data/lib/statsample/reliability/scaleanalysis.rb +4 -4
  61. data/lib/statsample/shorthand.rb +81 -0
  62. data/lib/statsample/test/chisquare.rb +1 -1
  63. data/lib/statsample/vector.rb +163 -163
  64. data/lib/statsample/vector/gsl.rb +106 -0
  65. data/references.txt +2 -2
  66. data/{data → test/fixtures}/crime.txt +0 -0
  67. data/{data → test/fixtures}/hartman_23.matrix +0 -0
  68. data/{data → test/fixtures}/repeated_fields.csv +0 -0
  69. data/{data → test/fixtures}/test_binomial.csv +0 -0
  70. data/test/{test_csv.csv → fixtures/test_csv.csv} +0 -0
  71. data/test/{test_xls.xls → fixtures/test_xls.xls} +0 -0
  72. data/{data → test/fixtures}/tetmat_matrix.txt +0 -0
  73. data/{data → test/fixtures}/tetmat_test.txt +0 -0
  74. data/test/helpers_tests.rb +18 -2
  75. data/test/test_analysis.rb +118 -0
  76. data/test/test_anovatwoway.rb +1 -1
  77. data/test/test_anovatwowaywithdataset.rb +1 -1
  78. data/test/test_anovawithvectors.rb +1 -2
  79. data/test/test_bartlettsphericity.rb +1 -2
  80. data/test/test_bivariate.rb +64 -22
  81. data/test/test_codification.rb +1 -2
  82. data/test/test_crosstab.rb +1 -2
  83. data/test/test_csv.rb +3 -4
  84. data/test/test_dataset.rb +24 -3
  85. data/test/test_dominance_analysis.rb +1 -2
  86. data/test/test_factor.rb +8 -69
  87. data/test/test_factor_map.rb +43 -0
  88. data/test/test_factor_pa.rb +54 -0
  89. data/test/test_ggobi.rb +1 -1
  90. data/test/test_gsl.rb +12 -18
  91. data/test/test_histogram.rb +1 -2
  92. data/test/test_logit.rb +62 -18
  93. data/test/test_matrix.rb +4 -5
  94. data/test/test_mle.rb +3 -4
  95. data/test/test_regression.rb +21 -2
  96. data/test/test_reliability.rb +3 -3
  97. data/test/test_reliability_icc.rb +1 -1
  98. data/test/test_reliability_skillscale.rb +20 -4
  99. data/test/test_resample.rb +1 -2
  100. data/test/test_rserve_extension.rb +1 -2
  101. data/test/test_srs.rb +1 -2
  102. data/test/test_statistics.rb +1 -2
  103. data/test/test_stest.rb +1 -2
  104. data/test/test_stratified.rb +1 -2
  105. data/test/test_test_f.rb +1 -2
  106. data/test/test_test_t.rb +1 -2
  107. data/test/test_umannwhitney.rb +1 -2
  108. data/test/test_vector.rb +117 -18
  109. data/test/test_xls.rb +2 -3
  110. data/web/Rakefile +39 -0
  111. metadata +109 -29
  112. metadata.gz.sig +0 -0
  113. data/examples/parallel_analysis_tetrachoric.rb +0 -31
  114. data/lib/distribution.rb +0 -25
  115. data/lib/distribution/chisquare.rb +0 -23
  116. data/lib/distribution/f.rb +0 -35
  117. data/lib/distribution/normal.rb +0 -60
  118. data/lib/distribution/normalbivariate.rb +0 -284
  119. data/lib/distribution/normalmultivariate.rb +0 -73
  120. data/lib/distribution/t.rb +0 -55
  121. data/test/test_distribution.rb +0 -73
@@ -1,284 +0,0 @@
1
- module Distribution
2
- # Calculate pdf and cdf for bivariate normal distribution.
3
- #
4
- # Pdf if easy to calculate, but CDF is not trivial. Several papers
5
- # describe methods to calculate the integral.
6
- #
7
- # Three methods are implemented on this module:
8
- # * Genz:: Used by default, with improvement to calculate p on rho > 0.95
9
- # * Hull:: Port from a C++ code
10
- # * Jantaravareerat:: Iterative (and slow)
11
- #
12
-
13
- module NormalBivariate
14
-
15
- class << self
16
- SIDE=0.1 # :nodoc:
17
- LIMIT=5 # :nodoc:
18
- # Return the partial derivative of cdf over x, with y and rho constant
19
- # Reference:
20
- # * Tallis, 1962, p.346, cited by Olsson, 1979
21
- def partial_derivative_cdf_x(x,y,rho)
22
- Distribution::Normal.pdf(x) * Distribution::Normal.cdf((y-rho*x).quo( Math::sqrt( 1 - rho**2 )))
23
- end
24
- alias :pd_cdf_x :partial_derivative_cdf_x
25
- # Probability density function for a given x, y and rho value.
26
- #
27
- # Source: http://en.wikipedia.org/wiki/Multivariate_normal_distribution
28
- def pdf(x,y, rho, s1=1.0, s2=1.0)
29
- 1.quo(2 * Math::PI * s1 * s2 * Math::sqrt( 1 - rho**2 )) * (Math::exp(-(1.quo(2*(1-rho**2))) *
30
- ((x**2.quo(s1)) + (y**2.quo(s2)) - (2*rho*x*y).quo(s1*s2))))
31
- end
32
-
33
- def f(x,y,aprime,bprime,rho)
34
- r=aprime*(2*x-aprime)+bprime*(2*y-bprime)+2*rho*(x-aprime)*(y-bprime)
35
- Math::exp(r)
36
- end
37
-
38
- # CDF for a given x, y and rho value.
39
- # Uses Genz algorithm (cdf_genz method).
40
- #
41
- def cdf(a,b,rho)
42
- cdf_genz(a,b,rho)
43
- end
44
-
45
- def sgn(x)
46
- if(x>=0)
47
- 1
48
- else
49
- -1
50
- end
51
- end
52
-
53
- # Normal cumulative distribution function (cdf) for a given x, y and rho.
54
- # Based on Hull (1993, cited by Arne, 2003)
55
- #
56
- # References:
57
- # * Arne, B.(2003). Financial Numerical Recipes in C ++. Available on http://finance.bi.no/~bernt/gcc_prog/recipes/recipes/node23.html
58
- def cdf_hull(a,b,rho)
59
- #puts "a:#{a} - b:#{b} - rho:#{rho}"
60
- if (a<=0 and b<=0 and rho<=0)
61
- # puts "ruta 1"
62
- aprime=a.quo(Math::sqrt(2.0*(1.0-rho**2)))
63
- bprime=b.quo(Math::sqrt(2.0*(1.0-rho**2)))
64
- aa=[0.3253030, 0.4211071, 0.1334425, 0.006374323]
65
- bb=[0.1337764, 0.6243247, 1.3425378, 2.2626645]
66
- sum=0
67
- 4.times do |i|
68
- 4.times do |j|
69
- sum+=aa[i]*aa[j] * f(bb[i], bb[j], aprime, bprime,rho)
70
- end
71
- end
72
- sum=sum*(Math::sqrt(1.0-rho**2).quo(Math::PI))
73
- return sum
74
- elsif(a*b*rho<=0.0)
75
-
76
- #puts "ruta 2"
77
- if(a<=0 and b>=0 and rho>=0)
78
- return Distribution::Normal.cdf(a) - cdf(a,-b,-rho)
79
- elsif (a>=0.0 and b<=0.0 and rho>=0)
80
- return Distribution::Normal.cdf(b) - cdf(-a,b,-rho)
81
- elsif (a>=0.0 and b>=0.0 and rho<=0)
82
- return Distribution::Normal.cdf(a) + Distribution::Normal.cdf(b) - 1.0 + cdf(-a,-b,rho)
83
- end
84
- elsif (a*b*rho>=0.0)
85
- #puts "ruta 3"
86
- denum=Math::sqrt(a**2 - 2*rho*a*b + b**2)
87
- rho1=((rho*a-b)*sgn(a)).quo(denum)
88
- rho2=((rho*b-a)*sgn(b)).quo(denum)
89
- delta=(1.0-sgn(a)*sgn(b)).quo(4)
90
- #puts "#{rho1} - #{rho2}"
91
- return cdf(a, 0.0, rho1) + cdf(b, 0.0, rho2) - delta
92
- end
93
- raise "Should'nt be here! #{a} - #{b} #{rho}"
94
- end
95
-
96
- # CDF. Iterative method by Jantaravareerat (n/d)
97
- #
98
- # Reference:
99
- # * Jantaravareerat, M. & Thomopoulos, N. (n/d). Tables for standard bivariate normal distribution
100
-
101
- def cdf_jantaravareerat(x,y,rho,s1=1,s2=1)
102
- # Special cases
103
- return 1 if x>LIMIT and y>LIMIT
104
- return 0 if x<-LIMIT or y<-LIMIT
105
- return Distribution::Normal.cdf(y) if x>LIMIT
106
- return Distribution::Normal.cdf(x) if y>LIMIT
107
-
108
- #puts "x:#{x} - y:#{y}"
109
- x=-LIMIT if x<-LIMIT
110
- x=LIMIT if x>LIMIT
111
- y=-LIMIT if y<-LIMIT
112
- y=LIMIT if y>LIMIT
113
-
114
- x_squares=((LIMIT+x) / SIDE).to_i
115
- y_squares=((LIMIT+y) / SIDE).to_i
116
- sum=0
117
- x_squares.times do |i|
118
- y_squares.times do |j|
119
- z1=-LIMIT+(i+1)*SIDE
120
- z2=-LIMIT+(j+1)*SIDE
121
- #puts " #{z1}-#{z2}"
122
- h=(pdf(z1,z2,rho,s1,s2)+pdf(z1-SIDE,z2,rho,s1,s2)+pdf(z1,z2-SIDE,rho,s1,s2) + pdf(z1-SIDE,z2-SIDE,rho,s1,s2)).quo(4)
123
- sum+= (SIDE**2)*h # area
124
- end
125
- end
126
- sum
127
- end
128
- # Normal cumulative distribution function (cdf) for a given x, y and rho.
129
- # Ported from Fortran code by Alan Genz
130
- #
131
- # Original documentation
132
- # DOUBLE PRECISION FUNCTION BVND( DH, DK, R )
133
- # A function for computing bivariate normal probabilities.
134
- #
135
- # Alan Genz
136
- # Department of Mathematics
137
- # Washington State University
138
- # Pullman, WA 99164-3113
139
- # Email : alangenz_AT_wsu.edu
140
- #
141
- # This function is based on the method described by
142
- # Drezner, Z and G.O. Wesolowsky, (1989),
143
- # On the computation of the bivariate normal integral,
144
- # Journal of Statist. Comput. Simul. 35, pp. 101-107,
145
- # with major modifications for double precision, and for |R| close to 1.
146
- #
147
- # Original location:
148
- # * http://www.math.wsu.edu/faculty/genz/software/fort77/tvpack.f
149
- def cdf_genz(x,y,rho)
150
- dh=-x
151
- dk=-y
152
- r=rho
153
- twopi = 6.283185307179586
154
-
155
- w=11.times.collect {[nil]*4};
156
- x=11.times.collect {[nil]*4}
157
-
158
- data=[
159
- 0.1713244923791705E+00, -0.9324695142031522E+00,
160
- 0.3607615730481384E+00, -0.6612093864662647E+00,
161
- 0.4679139345726904E+00, -0.2386191860831970E+00]
162
-
163
- (1..3).each {|i|
164
- w[i][1]=data[(i-1)*2]
165
- x[i][1]=data[(i-1)*2+1]
166
-
167
- }
168
- data=[
169
- 0.4717533638651177E-01,-0.9815606342467191E+00,
170
- 0.1069393259953183E+00,-0.9041172563704750E+00,
171
- 0.1600783285433464E+00,-0.7699026741943050E+00,
172
- 0.2031674267230659E+00,-0.5873179542866171E+00,
173
- 0.2334925365383547E+00,-0.3678314989981802E+00,
174
- 0.2491470458134029E+00,-0.1252334085114692E+00]
175
- (1..6).each {|i|
176
- w[i][2]=data[(i-1)*2]
177
- x[i][2]=data[(i-1)*2+1]
178
-
179
-
180
- }
181
- data=[
182
- 0.1761400713915212E-01,-0.9931285991850949E+00,
183
- 0.4060142980038694E-01,-0.9639719272779138E+00,
184
- 0.6267204833410906E-01,-0.9122344282513259E+00,
185
- 0.8327674157670475E-01,-0.8391169718222188E+00,
186
- 0.1019301198172404E+00,-0.7463319064601508E+00,
187
- 0.1181945319615184E+00,-0.6360536807265150E+00,
188
- 0.1316886384491766E+00,-0.5108670019508271E+00,
189
- 0.1420961093183821E+00,-0.3737060887154196E+00,
190
- 0.1491729864726037E+00,-0.2277858511416451E+00,
191
- 0.1527533871307259E+00,-0.7652652113349733E-01]
192
-
193
- (1..10).each {|i|
194
- w[i][3]=data[(i-1)*2]
195
- x[i][3]=data[(i-1)*2+1]
196
-
197
-
198
- }
199
-
200
-
201
- if ( r.abs < 0.3 )
202
- ng = 1
203
- lg = 3
204
- elsif ( r.abs < 0.75 )
205
- ng = 2
206
- lg = 6
207
- else
208
- ng = 3
209
- lg = 10
210
- end
211
-
212
-
213
- h = dh
214
- k = dk
215
- hk = h*k
216
- bvn = 0
217
- if ( r.abs < 0.925 )
218
- if ( r.abs > 0 )
219
- hs = ( h*h + k*k ).quo(2)
220
- asr = Math::asin(r)
221
- (1..lg).each do |i|
222
- [-1,1].each do |is|
223
- sn = Math::sin(asr*(is* x[i][ng]+1).quo(2) )
224
- bvn = bvn + w[i][ng] * Math::exp( ( sn*hk-hs ).quo( 1-sn*sn ) )
225
- end # do
226
- end # do
227
- bvn = bvn*asr.quo( 2*twopi )
228
- end # if
229
- bvn = bvn + Distribution::Normal.cdf(-h) * Distribution::Normal.cdf(-k)
230
-
231
-
232
- else # r.abs
233
- if ( r < 0 )
234
- k = -k
235
- hk = -hk
236
- end
237
-
238
- if ( r.abs < 1 )
239
- as = ( 1 - r )*( 1 + r )
240
- a = Math::sqrt(as)
241
- bs = ( h - k )**2
242
- c = ( 4 - hk ).quo(8)
243
- d = ( 12 - hk ).quo(16)
244
- asr = -( bs.quo(as) + hk ).quo(2)
245
- if ( asr > -100 )
246
- bvn = a*Math::exp(asr) * ( 1 - c*( bs - as )*( 1 - d*bs.quo(5) ).quo(3) + c*d*as*as.quo(5) )
247
- end
248
- if ( -hk < 100 )
249
- b = Math::sqrt(bs)
250
- bvn = bvn - Math::exp( -hk.quo(2) ) * Math::sqrt(twopi)*Distribution::Normal.cdf(-b.quo(a))*b *
251
- ( 1 - c*bs*( 1 - d*bs.quo(5) ).quo(3) )
252
- end
253
-
254
-
255
- a = a.quo(2)
256
- (1..lg).each do |i|
257
- [-1,1].each do |is|
258
- xs = (a*( is*x[i][ng] + 1 ) )**2
259
- rs = Math::sqrt( 1 - xs )
260
- asr = -( bs/xs + hk ).quo(2)
261
- if ( asr > -100 )
262
- bvn = bvn + a*w[i][ng] * Math::exp( asr ) *
263
- ( Math::exp( -hk*( 1 - rs ).quo(2*( 1 + rs ) ) ) .quo(rs) - ( 1 + c*xs*( 1 + d*xs ) ) )
264
- end
265
- end
266
- end
267
- bvn = -bvn/twopi
268
- end
269
-
270
- if ( r > 0 )
271
- bvn = bvn + Distribution::Normal.cdf(-[h,k].max)
272
- else
273
- bvn = -bvn
274
- if ( k > h )
275
- bvn = bvn + Distribution::Normal.cdf(k) - Distribution::Normal.cdf(h)
276
- end
277
- end
278
- end
279
- bvn
280
- end
281
- private :f, :sgn
282
- end
283
- end
284
- end
@@ -1,73 +0,0 @@
1
- module Distribution
2
- # Calculate cdf and inverse cdf for Multivariate Distribution.
3
- module NormalMultivariate
4
- class << self
5
- # Returns multivariate cdf distribution
6
- # * a is the array of lower values
7
- # * b is the array of higher values
8
- # * s is an symmetric positive definite covariance matrix
9
- def cdf(aa,bb,sigma, epsilon=0.0001, alpha=2.5, max_iterations=100) # :nodoc:
10
- raise "Doesn't work yet"
11
- a=[nil]+aa
12
- b=[nil]+bb
13
- m=aa.size
14
- sigma=sigma.to_gsl if sigma.respond_to? :to_gsl
15
-
16
- cc=GSL::Linalg::Cholesky.decomp(sigma)
17
- c=cc.lower
18
- intsum=0
19
- varsum=0
20
- n=0
21
- d=Array.new(m+1,nil)
22
- e=Array.new(m+1,nil)
23
- f=Array.new(m+1,nil)
24
- (1..m).each {|i|
25
- d[i]=0.0 if a[i].nil?
26
- e[i]=1.0 if b[i].nil?
27
- }
28
- d[1]=uPhi(a[1].quo( c[0,0])) unless d[1]==0
29
- e[1]=uPhi(b[1].quo( c[0,0])) unless e[1]==1
30
- f[1]=e[1]-d[1]
31
-
32
- error=1000
33
- begin
34
- w=(m+1).times.collect {|i| rand*epsilon}
35
- y=[]
36
- (2..m).each do |i|
37
- y[i-1]=iPhi(d[i-1] + w[i-1] * (e[i-1] - d[i-1]))
38
- sumc=0
39
- (1..(i-1)).each do |j|
40
- sumc+=c[i-1, j-1]*y[j]
41
- end
42
-
43
- if a[i]!=nil
44
- d[i]=uPhi((a[i]-sumc).quo(c[i-1,i-1]))
45
- end
46
- # puts "sumc:#{sumc}"
47
-
48
- if b[i]!=nil
49
- #puts "e[#{i}] :#{c[i-1,i-1]}"
50
- e[i]=uPhi((b[i]-sumc).quo(c[i-1, i-1]))
51
- end
52
- f[i]=(e[i]-d[i])*f[i-1]
53
- end
54
- intsum+=intsum+f[m]
55
- varsum=varsum+f[m]**2
56
- n+=1
57
- error=alpha*Math::sqrt((varsum.quo(n) - (intsum.quo(n))**2).quo(n))
58
- end while(error>epsilon and n<max_iterations)
59
-
60
- f=intsum.quo(n)
61
- #p intsum
62
- #puts "f:#{f}, n:#{n}, error:#{error}"
63
- f
64
- end
65
- def iPhi(pr)
66
- Distribution::Normal.p_value(pr)
67
- end
68
- def uPhi(x)
69
- Distribution::Normal.cdf(x)
70
- end
71
- end
72
- end
73
- end
@@ -1,55 +0,0 @@
1
- require 'rbconfig'
2
- module Distribution
3
-
4
- # Calculate cdf and inverse cdf for T Distribution.
5
- # Uses Statistics2 Module.
6
- module T
7
- class << self
8
- # Return the P-value of the corresponding integral with
9
- # k degrees of freedom
10
- def p_value(pr,k)
11
- Statistics2.ptdist(k, pr)
12
- end
13
- # T cumulative distribution function (cdf).
14
- #
15
- # Returns the integral of t-distribution
16
- # with n degrees of freedom over (-Infty, x].
17
- #
18
- def cdf(x,k)
19
- if RbConfig::CONFIG['arch']=~/i686/
20
- tdist(k, x)
21
- else
22
- Statistics2.tdist(k,x)
23
- end
24
- end
25
-
26
- # Returns the integral of t-distribution with n degrees of freedom over (-Infty, x].
27
- def tdist(n, t)
28
- p_t(n, t)
29
- end
30
-
31
- # t-distribution ([1])
32
- # (-\infty, x]
33
- def p_t(df, t)
34
- c2 = df.to_f / (df + t * t);
35
- s = Math.sqrt(1.0 - c2)
36
- s = -s if t < 0.0
37
- p = 0.0;
38
- i = df % 2 + 2
39
- while i <= df
40
- p += s
41
- s *= (i - 1) * c2 / i
42
- i += 2
43
- end
44
- if df.is_a? Float or df & 1 != 0
45
- 0.5+(p*Math.sqrt(c2)+Math.atan(t/Math.sqrt(df)))/Math::PI
46
- else
47
- (1.0 + p) / 2.0
48
- end
49
- end
50
-
51
-
52
-
53
- end
54
- end
55
- end
@@ -1,73 +0,0 @@
1
- require(File.dirname(__FILE__)+'/helpers_tests.rb')
2
-
3
- require 'distribution'
4
-
5
-
6
- class DistributionTestCase < MiniTest::Unit::TestCase
7
- def test_chi
8
- if Distribution.has_gsl?
9
- [2,3,4,5].each{|k|
10
- chis=rand()*10
11
- area=Distribution::ChiSquare.cdf(chis, k)
12
- assert_in_delta(area, GSL::Cdf.chisq_P(chis,k),0.0001)
13
- assert_in_delta(chis, Distribution::ChiSquare.p_value(area,k),0.0001,"Error on prob #{area} and k #{k}")
14
- }
15
- end
16
- end
17
- def test_t
18
- if Distribution.has_gsl?
19
- [-2,0.1,0.5,1,2].each{|t|
20
- [2,5,10].each{|n|
21
- area=Distribution::T.cdf(t,n)
22
- assert_in_delta(area, GSL::Cdf.tdist_P(t,n),0.0001)
23
- assert_in_delta(Distribution::T.p_value(area,n), GSL::Cdf.tdist_Pinv(area,n),0.0001)
24
-
25
- }
26
- }
27
- end
28
- end
29
- def test_normal
30
- if Distribution.has_gsl?
31
- [-2,0.1,0.5,1,2].each{|x|
32
- area=Distribution::Normal.cdf(x)
33
- assert_in_delta(area, GSL::Cdf.ugaussian_P(x),0.0001)
34
- assert_in_delta(Distribution::Normal.p_value(area), GSL::Cdf.ugaussian_Pinv(area),0.0001)
35
- assert_in_delta(Distribution::Normal.pdf(x), GSL::Ran::ugaussian_pdf(x),0.0001)
36
- }
37
- end
38
- end
39
- def test_normal_bivariate
40
- if Distribution.has_gsl?
41
- [0.2,0.4,0.6,0.8,0.9, 0.99,0.999,0.999999].each {|rho|
42
- assert_in_delta(GSL::Ran::bivariate_gaussian_pdf(0, 0, 1,1,rho), Distribution::NormalBivariate.pdf(0,0, rho , 1,1),1e-8)
43
-
44
- }
45
- end
46
-
47
- [-3,-2,-1,0,1,1.5].each {|x|
48
- assert_in_delta(Distribution::NormalBivariate.cdf_hull(x,x,0.5), Distribution::NormalBivariate.cdf_genz(x,x,0.5), 0.001)
49
- #assert_in_delta(Distribution::NormalBivariate.cdf_genz(x,x,0.5), Distribution::NormalBivariate.cdf_jantaravareerat(x,x,0.5), 0.001)
50
- }
51
-
52
- assert_in_delta(0.686, Distribution::NormalBivariate.cdf(2,0.5,0.5), 0.001)
53
- assert_in_delta(0.498, Distribution::NormalBivariate.cdf(2,0.0,0.5), 0.001)
54
- assert_in_delta(0.671, Distribution::NormalBivariate.cdf(1.5,0.5,0.5), 0.001)
55
-
56
- assert_in_delta(Distribution::Normal.cdf(0), Distribution::NormalBivariate.cdf(10,0,0.9), 0.001)
57
- end
58
- def test_f
59
- if Distribution.has_gsl?
60
- [0.1,0.5,1,2,10,20,30].each{|f|
61
- [2,5,10].each{|n2|
62
- [2,5,10].each{|n1|
63
- area=Distribution::F.cdf(f,n1,n2)
64
- assert_in_delta(area, GSL::Cdf.fdist_P(f,n1,n2),0.0001)
65
- assert_in_delta(Distribution::F.p_value(area,n1,n2), GSL::Cdf.fdist_Pinv(area,n1,n2),0.0001)
66
-
67
- }
68
- }
69
- }
70
- end
71
- end
72
-
73
- end