distribution 0.6.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.travis.yml +13 -0
  4. data/.yardopts +5 -0
  5. data/Gemfile +5 -0
  6. data/History.txt +24 -8
  7. data/LICENCE.md +26 -0
  8. data/README.md +155 -0
  9. data/Rakefile +15 -19
  10. data/benchmark/binomial_coefficient.rb +19 -23
  11. data/benchmark/binomial_coefficient/experiment.rb +33 -36
  12. data/benchmark/factorial_hash.rb +7 -8
  13. data/benchmark/factorial_method.rb +4 -6
  14. data/benchmark/odd.rb +6 -7
  15. data/benchmark/power.rb +11 -11
  16. data/bin/distribution +26 -26
  17. data/data/template/spec.erb +7 -6
  18. data/distribution.gemspec +25 -0
  19. data/lib/distribution.rb +79 -124
  20. data/lib/distribution/beta.rb +6 -8
  21. data/lib/distribution/beta/gsl.rb +14 -9
  22. data/lib/distribution/beta/java.rb +1 -1
  23. data/lib/distribution/beta/ruby.rb +41 -7
  24. data/lib/distribution/binomial.rb +10 -11
  25. data/lib/distribution/binomial/gsl.rb +6 -5
  26. data/lib/distribution/binomial/java.rb +1 -1
  27. data/lib/distribution/binomial/ruby.rb +22 -15
  28. data/lib/distribution/bivariatenormal.rb +4 -5
  29. data/lib/distribution/bivariatenormal/gsl.rb +2 -2
  30. data/lib/distribution/bivariatenormal/java.rb +1 -1
  31. data/lib/distribution/bivariatenormal/ruby.rb +245 -254
  32. data/lib/distribution/chisquare.rb +8 -10
  33. data/lib/distribution/chisquare/gsl.rb +24 -19
  34. data/lib/distribution/chisquare/java.rb +1 -1
  35. data/lib/distribution/chisquare/ruby.rb +60 -55
  36. data/lib/distribution/chisquare/statistics2.rb +16 -13
  37. data/lib/distribution/distributable.rb +40 -0
  38. data/lib/distribution/exponential.rb +4 -5
  39. data/lib/distribution/exponential/gsl.rb +13 -9
  40. data/lib/distribution/exponential/ruby.rb +17 -11
  41. data/lib/distribution/f.rb +10 -11
  42. data/lib/distribution/f/gsl.rb +26 -22
  43. data/lib/distribution/f/java.rb +1 -1
  44. data/lib/distribution/f/ruby.rb +104 -105
  45. data/lib/distribution/f/statistics2.rb +22 -19
  46. data/lib/distribution/gamma.rb +5 -7
  47. data/lib/distribution/gamma/gsl.rb +13 -9
  48. data/lib/distribution/gamma/java.rb +1 -1
  49. data/lib/distribution/gamma/ruby.rb +5 -11
  50. data/lib/distribution/hypergeometric.rb +5 -8
  51. data/lib/distribution/hypergeometric/gsl.rb +5 -6
  52. data/lib/distribution/hypergeometric/java.rb +1 -1
  53. data/lib/distribution/hypergeometric/ruby.rb +34 -35
  54. data/lib/distribution/logistic.rb +6 -9
  55. data/lib/distribution/logistic/ruby.rb +14 -9
  56. data/lib/distribution/lognormal.rb +37 -0
  57. data/lib/distribution/lognormal/gsl.rb +21 -0
  58. data/lib/distribution/lognormal/ruby.rb +16 -0
  59. data/lib/distribution/math_extension.rb +187 -231
  60. data/lib/distribution/math_extension/chebyshev_series.rb +281 -272
  61. data/lib/distribution/math_extension/erfc.rb +28 -31
  62. data/lib/distribution/math_extension/exponential_integral.rb +17 -17
  63. data/lib/distribution/math_extension/gammastar.rb +19 -20
  64. data/lib/distribution/math_extension/gsl_utilities.rb +12 -12
  65. data/lib/distribution/math_extension/incomplete_beta.rb +52 -61
  66. data/lib/distribution/math_extension/incomplete_gamma.rb +166 -168
  67. data/lib/distribution/math_extension/log_utilities.rb +20 -22
  68. data/lib/distribution/normal.rb +11 -13
  69. data/lib/distribution/normal/gsl.rb +13 -10
  70. data/lib/distribution/normal/java.rb +30 -1
  71. data/lib/distribution/normal/ruby.rb +69 -59
  72. data/lib/distribution/normal/statistics2.rb +5 -2
  73. data/lib/distribution/normalmultivariate.rb +64 -64
  74. data/lib/distribution/poisson.rb +12 -14
  75. data/lib/distribution/poisson/gsl.rb +7 -7
  76. data/lib/distribution/poisson/java.rb +26 -0
  77. data/lib/distribution/poisson/ruby.rb +38 -9
  78. data/lib/distribution/shorthand.rb +17 -0
  79. data/lib/distribution/t.rb +16 -16
  80. data/lib/distribution/t/gsl.rb +27 -24
  81. data/lib/distribution/t/java.rb +1 -1
  82. data/lib/distribution/t/ruby.rb +99 -100
  83. data/lib/distribution/t/statistics2.rb +19 -19
  84. data/lib/distribution/uniform.rb +26 -0
  85. data/lib/distribution/uniform/gsl.rb +36 -0
  86. data/lib/distribution/uniform/ruby.rb +91 -0
  87. data/lib/distribution/version.rb +3 -0
  88. data/lib/distribution/weibull.rb +10 -0
  89. data/lib/distribution/weibull/gsl.rb +21 -0
  90. data/lib/distribution/weibull/ruby.rb +34 -0
  91. data/spec/beta_spec.rb +48 -50
  92. data/spec/binomial_spec.rb +80 -84
  93. data/spec/bivariatenormal_spec.rb +28 -35
  94. data/spec/chisquare_spec.rb +49 -52
  95. data/spec/distribution_spec.rb +11 -11
  96. data/spec/exponential_spec.rb +48 -39
  97. data/spec/f_spec.rb +73 -71
  98. data/spec/gamma_spec.rb +50 -53
  99. data/spec/hypergeometric_spec.rb +63 -69
  100. data/spec/logistic_spec.rb +31 -37
  101. data/spec/lognormal_spec.rb +54 -0
  102. data/spec/math_extension_spec.rb +192 -209
  103. data/spec/normal_spec.rb +80 -73
  104. data/spec/poisson_spec.rb +78 -36
  105. data/spec/shorthand_spec.rb +19 -22
  106. data/spec/spec_helper.rb +31 -6
  107. data/spec/t_spec.rb +63 -77
  108. data/spec/uniform_spec.rb +154 -0
  109. data/spec/weibull_spec.rb +17 -0
  110. data/vendor/java/commons-math-2.2.jar +0 -0
  111. metadata +91 -111
  112. data.tar.gz.sig +0 -0
  113. data/.autotest +0 -23
  114. data/.gemtest +0 -0
  115. data/Manifest.txt +0 -95
  116. data/README.txt +0 -100
  117. metadata.gz.sig +0 -0
@@ -3,26 +3,26 @@ module Distribution
3
3
  module T
4
4
  module Statistics2_
5
5
  class << self
6
- # Return the P-value of the corresponding integral with
7
- # k degrees of freedom
8
- def p_value(pr,k)
9
- Statistics2.ptdist(k, pr)
10
- end
11
-
12
-
13
- # There are some problem on i686 with t on statistics2
14
- if true or !RbConfig::CONFIG['arch']=~/i686/
15
- # T cumulative distribution function (cdf).
16
- #
17
- # Returns the integral of t-distribution
18
- # with n degrees of freedom over (-Infty, x].
19
- #
20
- def cdf(x,k)
21
- Statistics2.tdist(k,x)
6
+ # There are some problem on i686 with t on statistics2
7
+ if true || !RbConfig::CONFIG['arch'] =~ /i686/
8
+ # T cumulative distribution function (cdf).
9
+ #
10
+ # Returns the integral of t-distribution
11
+ # with n degrees of freedom over (-Infty, x].
12
+ #
13
+ def cdf(x, k)
14
+ Statistics2.tdist(k, x)
15
+ end
16
+
17
+ # Return the P-value of the corresponding integral with
18
+ # k degrees of freedom
19
+ def quantile(pr, k)
20
+ Statistics2.ptdist(k, pr)
21
+ end
22
+
23
+ alias_method :p_value, :quantile
22
24
  end
23
25
  end
24
-
25
- end
26
26
  end
27
27
  end
28
- end
28
+ end
@@ -0,0 +1,26 @@
1
+ require 'distribution/uniform/ruby'
2
+ require 'distribution/uniform/gsl'
3
+ #require 'distribution/uniform/java'
4
+
5
+
6
+ module Distribution
7
+ # Expresses the uniformly spread probability over a finite interval
8
+ module Uniform
9
+ SHORTHAND='unif'
10
+ extend Distributable
11
+ create_distribution_methods
12
+
13
+ ##
14
+ # :singleton-method: pdf(x, lower, upper)
15
+ # Returns the uniform PDF
16
+
17
+ ##
18
+ # :singleton-method: cdf(x, lower, upper)
19
+ # Returns the uniform CDF
20
+
21
+ ##
22
+ # :singleton-method: quantile(qn, lower, upper)
23
+ # Returns the uniform inverse CDF or P-value
24
+
25
+ end
26
+ end
@@ -0,0 +1,36 @@
1
+ module Distribution
2
+ module Uniform
3
+ module GSL_
4
+ class << self
5
+ # Returns a lambda to call for uniformly distributed random numbers
6
+ # returns a double precision float in [0, 1]
7
+ def rng(lower = 0, upper = 1, seed = nil)
8
+ seed = Random.new_seed.modulo 100000007 if seed.nil?
9
+ rng = GSL::Rng.alloc(GSL::Rng::MT19937, seed)
10
+
11
+ -> { lower + (upper - lower) * rng.uniform }
12
+ end
13
+
14
+ # :nodoc:
15
+ def pdf(x, lower = 0, upper = 1)
16
+ # rb-gsl/blob/master/ext/gsl_native/randist.c#L1732
17
+ GSL::Ran.flat_pdf(x, lower, upper)
18
+ end
19
+
20
+ # :nodoc:
21
+ def cdf(x, lower = 0, upper = 1)
22
+ # rb-gsl/blob/master/ext/gsl_native/cdf.c#L644
23
+ GSL::Cdf.flat_P(x, lower, upper)
24
+ end
25
+
26
+ # :nodoc:
27
+ def quantile(qn, lower, upper)
28
+ # rb-gsl/blob/master/ext/gsl_native/cdf.c#L646
29
+ GSL::Cdf.flat_Pinv(qn, lower, upper)
30
+ end
31
+
32
+ alias_method :p_value, :quantile
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,91 @@
1
+ module Distribution
2
+ module Uniform
3
+ module Ruby_
4
+ # Module contain pure ruby implementation of the
5
+ # uniform distribution (rng, pdf, cdf and quantile functions)
6
+ class << self
7
+ # Returns a lambda that emits a uniformly distributed
8
+ # sequence of random numbers between the defined limits
9
+ #
10
+ # == Arguments
11
+ # * +lower+ - Lower limit of the distribution
12
+ # * +upper+ - Upper limit of the distribution
13
+ # * +seed+ - Seed to set the initial state, randomized if ommited
14
+ #
15
+ def rng(lower = 0, upper = 1, seed = nil)
16
+ seed = Random.new_seed if seed.nil?
17
+ prng = Random.new(seed)
18
+ -> { prng.rand * (upper - lower) + lower }
19
+ end
20
+
21
+ # Uniform probability density function on [a, b]
22
+ #
23
+ # == Arguments
24
+ # If you are referring the wiki page for this continuous distribution
25
+ # the arguments can be translated as follows
26
+ # * +x+ - same as continuous random variable
27
+ # * +lower+ - lower limit or a, must be a real number
28
+ # * +upper+ - upper limit or b, must be a real number
29
+ #
30
+ # == Reference
31
+ # * https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)
32
+ #
33
+ # The implementation has been adopted from GSL-1.9 gsl/randist/flat.c
34
+ #
35
+ def pdf(x, lower = 0, upper = 1)
36
+ upper, lower = lower, upper if lower > upper
37
+ return 1 / (upper - lower) if (lower..upper).member? x
38
+ 0
39
+ end
40
+
41
+ # The uniform cumulative density function (CDF)
42
+ # == Arguments
43
+ # If you are referring the wiki page for this continuous distribution
44
+ # the arguments can be translated as follows
45
+ # * +x+ - same as continuous random variable
46
+ # * +lower+ - lower limit or a, must be a real number
47
+ # * +upper+ - upper limit or b, must be a real number
48
+ #
49
+ # == Reference
50
+ # * https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)
51
+ #
52
+ # The implementation has been adpoted from GSL-1.9 gsl/cdf/flat.c
53
+ #
54
+ def cdf(x, lower = 0, upper = 1)
55
+ if x < lower
56
+ 0
57
+ elsif x > upper
58
+ 1
59
+ else
60
+ (x - lower) / (upper - lower)
61
+ end
62
+ end
63
+
64
+ # The uniform inverse CDF density function / P-value function
65
+ # == Arguments
66
+ # If you are referring the wiki page for this continuous distribution
67
+ # the arguments can be translated as follows
68
+ # * +qn+ - same as integral value
69
+ # * +lower+ - lower limit or a, must be a real number
70
+ # * +upper+ - upper limit or b, must be a real number
71
+ #
72
+ # == Returns
73
+ # * nil if the integral value is not in [0, 1]
74
+ # * inverse cdf otherwise
75
+ # == Reference
76
+ # * https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)
77
+ #
78
+ # The implementation has been adpoted from GSL-1.9 gsl/cdf/flatinv.c
79
+ #
80
+ def quantile(qn, lower = 0, upper = 1)
81
+ fail RangeError, 'cdf value(qn) must be from [0, 1]. '\
82
+ "Cannot find quantile for qn=#{qn}" if qn > 1 || qn < 0
83
+
84
+ qn * upper + (1 - qn) * lower
85
+ end
86
+
87
+ alias p_value quantile
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,3 @@
1
+ module Distribution
2
+ VERSION = '0.8.0'
3
+ end
@@ -0,0 +1,10 @@
1
+ require 'distribution/weibull/ruby'
2
+ require 'distribution/weibull/gsl'
3
+
4
+ module Distribution
5
+ module Weibull
6
+ SHORTHAND = 'weibull'
7
+ extend Distributable
8
+ create_distribution_methods
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module Distribution
2
+ module Weibull
3
+ module GSL_
4
+ class << self
5
+ def pdf(x, k, lam)
6
+ GSL::Ran.weibull_pdf(x, lam, k)
7
+ end
8
+
9
+ def cdf(x, k, lam)
10
+ GSL::Cdf.weibull_P(x, lam, k)
11
+ end
12
+
13
+ def quantile(y, k, lam)
14
+ GSL::Cdf.weibull_Pinv(y, lam, k)
15
+ end
16
+
17
+ alias_method :p_value, :quantile
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ module Distribution
2
+ module Weibull
3
+ module Ruby_
4
+ class << self
5
+ def pdf(x, k, lam)
6
+ if x < 0.0
7
+ 0.0
8
+ else
9
+ a = (k.to_f / lam.to_f)
10
+ b = (x.to_f / lam.to_f)
11
+ c = (k - 1.0)
12
+ d = Math.exp(-(x.to_f / lam.to_f)**k)
13
+ (a * b**c) * d
14
+ end
15
+ end
16
+
17
+ # Returns the integral of the Weibull distribution from [-Inf to x]
18
+ def cdf(x, k, lam)
19
+ return 0.0 if x < 0.0
20
+ 1.0 - Math.exp(-(x.to_f / lam.to_f)**k)
21
+ end
22
+
23
+ # Returns the P-value of weibull
24
+ def quantile(y, k, lam)
25
+ return 1.0 if y > 1.0
26
+ return 0.0 if y < 0.0
27
+ -lam * (Math.log(1.0 - y))**(1.0 / k)
28
+ end
29
+
30
+ alias_method :p_value, :quantile
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,82 +1,80 @@
1
- require File.expand_path(File.dirname(__FILE__)+"/spec_helper.rb")
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
2
2
  include ExampleWithGSL
3
3
  describe Distribution::Beta do
4
-
5
- shared_examples_for "Beta engine" do
6
- it_only_with_gsl "should return correct pdf" do
4
+ shared_examples_for 'Beta engine' do
5
+ it_only_with_gsl 'should return correct pdf' do
7
6
  if @engine.respond_to? :pdf
8
7
  1.upto(101) do |x|
9
- a=rand * x
10
- b=1 + rand * 5
11
- g=GSL::Ran.beta_pdf(x,a,b)
12
- @engine.pdf(x,a,b).should be_within(1e-10).of(g)
8
+ a = rand * x
9
+ b = 1 + rand * 5
10
+ g = GSL::Ran.beta_pdf(x, a, b)
11
+ expect(@engine.pdf(x, a, b)).to be_within(1e-09).of(g)
13
12
  end
14
13
  else
15
- pending("No #{@engine}.pdf")
14
+ skip("No #{@engine}.pdf")
16
15
  end
17
16
  end
18
17
 
19
- it_only_with_gsl "should return correct cdf" do
20
- if @engine.respond_to? :cdf
21
- # From GSL-1.9.
22
- TOL = 1048576.0*Float::EPSILON
23
- @engine.cdf(0.0, 1.2, 1.3).should eq(0.0)
24
- @engine.cdf(1e-100, 1.2, 1.3).should be_within(TOL).of(1.34434944656489596e-120)
25
- @engine.cdf(0.001, 1.2, 1.3).should be_within(TOL).of(3.37630042504535813e-4)
26
- @engine.cdf(0.01, 1.2, 1.3).should be_within(TOL).of(5.34317264038929473e-3)
27
- @engine.cdf(0.1, 1.2, 1.3).should be_within(TOL).of(8.33997828306748346e-2)
28
- @engine.cdf(0.325, 1.2, 1.3).should be_within(TOL).of(3.28698654180583916e-1)
29
- @engine.cdf(0.5, 1.2, 1.3).should be_within(TOL).of(5.29781429451299081e-1)
30
- @engine.cdf(0.9, 1.2, 1.3).should be_within(TOL).of(9.38529397224430659e-1)
31
- @engine.cdf(0.99, 1.2, 1.3).should be_within(TOL).of(9.96886438341254380e-1)
32
- @engine.cdf(0.999, 1.2, 1.3).should be_within(TOL).of(9.99843792833067634e-1)
33
- @engine.cdf(1.0, 1.2, 1.3).should be_within(TOL).of(1.0)
34
- else
35
- pending("No #{@engine}.cdf")
18
+ it_only_with_gsl 'should return correct cdf' do
19
+ if @engine.respond_to? :cdf
20
+ # From GSL-1.9.
21
+ tol = 1_048_576.0 * Float::EPSILON
22
+ expect(@engine.cdf(0.0, 1.2, 1.3)).to eq(0.0)
23
+ expect(@engine.cdf(1e-100, 1.2, 1.3)).to be_within(tol).of(1.34434944656489596e-120)
24
+ expect(@engine.cdf(0.001, 1.2, 1.3)).to be_within(tol).of(3.37630042504535813e-4)
25
+ expect(@engine.cdf(0.01, 1.2, 1.3)).to be_within(tol).of(5.34317264038929473e-3)
26
+ expect(@engine.cdf(0.1, 1.2, 1.3)).to be_within(tol).of(8.33997828306748346e-2)
27
+ expect(@engine.cdf(0.325, 1.2, 1.3)).to be_within(tol).of(3.28698654180583916e-1)
28
+ expect(@engine.cdf(0.5, 1.2, 1.3)).to be_within(tol).of(5.29781429451299081e-1)
29
+ expect(@engine.cdf(0.9, 1.2, 1.3)).to be_within(tol).of(9.38529397224430659e-1)
30
+ expect(@engine.cdf(0.99, 1.2, 1.3)).to be_within(tol).of(9.96886438341254380e-1)
31
+ expect(@engine.cdf(0.999, 1.2, 1.3)).to be_within(tol).of(9.99843792833067634e-1)
32
+ expect(@engine.cdf(1.0, 1.2, 1.3)).to be_within(tol).of(1.0)
33
+ else
34
+ skip("No #{@engine}.cdf")
35
+ end
36
36
  end
37
- end
38
- it "should return correct p_value" do
39
- if @engine.respond_to? :p_value
40
- 2.upto(99) do |x|
41
- a=rand() * x
42
- b=1 + rand() * 5
43
- pr=@engine.cdf(x/100.0,a,b)
44
- @engine.p_value(pr,a, b).should be_within(1e-10).of(x/100.0)
45
- end
46
- else
47
- pending("No #{@engine}.p_value")
37
+ it 'should return correct p_value' do
38
+ if @engine.respond_to? :p_value
39
+ 2.upto(99) do |x|
40
+ a = rand * x
41
+ b = 1 + rand * 5
42
+ pr = @engine.cdf(x / 100.0, a, b)
43
+ expect(@engine.p_value(pr, a, b)).to be_within(1e-09).of(x / 100.0)
44
+ end
45
+ else
46
+ skip("No #{@engine}.p_value")
47
+ end
48
48
  end
49
49
  end
50
- end
51
50
 
52
- describe "singleton" do
51
+ describe 'singleton' do
53
52
  before do
54
- @engine=Distribution::Beta
53
+ @engine = Distribution::Beta
55
54
  end
56
- it_should_behave_like "Beta engine"
55
+ it_should_behave_like 'Beta engine'
57
56
  end
58
-
57
+
59
58
  describe Distribution::Beta::Ruby_ do
60
59
  before do
61
- @engine=Distribution::Beta::Ruby_
60
+ @engine = Distribution::Beta::Ruby_
62
61
  end
63
- it_should_behave_like "Beta engine"
62
+ it_should_behave_like 'Beta engine'
64
63
  end
65
64
  if Distribution.has_gsl?
66
65
  describe Distribution::Beta::GSL_ do
67
66
  before do
68
- @engine=Distribution::Beta::GSL_
67
+ @engine = Distribution::Beta::GSL_
69
68
  end
70
- it_should_behave_like "Beta engine"
69
+ it_should_behave_like 'Beta engine'
71
70
  end
72
71
  end
73
72
  if Distribution.has_java?
74
73
  describe Distribution::Beta::Java_ do
75
74
  before do
76
- @engine=Distribution::Beta::Java_
75
+ @engine = Distribution::Beta::Java_
77
76
  end
78
- it_should_behave_like "Beta engine"
79
- end
77
+ it_should_behave_like 'Beta engine'
78
+ end
80
79
  end
81
-
82
80
  end
@@ -1,126 +1,122 @@
1
- require File.expand_path(File.dirname(__FILE__)+"/spec_helper.rb")
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
2
2
  include ExampleWithGSL
3
3
  describe Distribution::Binomial do
4
-
5
- shared_examples_for "binomial engine" do
6
- it "should return correct pdf" do
7
- if @engine.respond_to? :pdf
8
- [10,100,1000].each do |n|
9
- [1.quo(4),1.quo(2),3.quo(4)].each do |pr|
10
- [0, 1,n/2,n-1].each do |x|
11
- exp=Math.binomial_coefficient(n,x)*pr**x*(1-pr)**(n-x)
12
- obs=@engine.pdf(x,n,pr)
13
- obs.should be_within(1e-5).of(exp), "For pdf(#{x},#{n},#{pr}) expected #{exp}, obtained #{obs}"
14
-
4
+ shared_examples_for 'binomial engine' do
5
+ it 'should return correct pdf' do
6
+ if @engine.respond_to? :pdf
7
+ [10, 100, 1000].each do |n|
8
+ [1.quo(4), 1.quo(2), 3.quo(4)].each do |pr|
9
+ [0, 1, n / 2, n - 1].each do |x|
10
+ exp = Math.binomial_coefficient(n, x) * pr**x * (1 - pr)**(n - x)
11
+ obs = @engine.pdf(x, n, pr)
12
+ expect(obs).to be_within(1e-5).of(exp), "For pdf(#{x},#{n},#{pr}) expected #{exp}, obtained #{obs}"
13
+ end
15
14
  end
16
15
  end
16
+ else
17
+ skip("No #{@engine}.pdf")
17
18
  end
18
- else
19
- pending("No #{@engine}.pdf")
20
19
  end
21
- end
22
- it_only_with_gsl "should return correct cdf for n<=100" do
23
- if @engine.respond_to? :pdf
24
- [10,100].each do |n|
25
- [0.25,0.5,0.75].each do |pr|
26
- [1,n/2,n-1].each do |x|
27
- exp=GSL::Cdf.binomial_P(x,pr,n)
28
- obs=@engine.cdf(x,n,pr)
29
- exp.should be_within(1e-5).of(obs), "For cdf(#{x},#{n},#{pr}) expected #{exp}, obtained #{obs}"
20
+
21
+ it_only_with_gsl 'should return correct cdf for n<=100' do
22
+ if @engine.respond_to? :pdf
23
+ [10, 100].each do |n|
24
+ [0.25, 0.5, 0.75].each do |pr|
25
+ [1, n / 2, n - 1].each do |x|
26
+ exp = GSL::Cdf.binomial_P(x, pr, n)
27
+ obs = @engine.cdf(x, n, pr)
28
+ expect(exp).to be_within(1e-5).of(obs), "For cdf(#{x},#{n},#{pr}) expected #{exp}, obtained #{obs}"
30
29
  end
31
30
  end
32
31
  end
33
32
  else
34
- pending("No #{@engine}.cdf")
33
+ skip("No #{@engine}.cdf")
35
34
  end
35
+ end
36
36
  end
37
37
 
38
-
39
-
40
- end
41
-
42
- describe "singleton" do
38
+ describe 'singleton' do
43
39
  before do
44
- @engine=Distribution::Binomial
40
+ @engine = Distribution::Binomial
45
41
  end
46
- it_should_behave_like "binomial engine"
47
-
48
-
49
- it {@engine.should respond_to(:exact_pdf) }
42
+
43
+ it_should_behave_like 'binomial engine'
44
+
45
+ it { expect(@engine).to respond_to(:exact_pdf) }
46
+
50
47
  it {
51
- pending("No exact_p_value")
52
- @engine.should respond_to(:exact_p_value)
48
+ pending('No exact_p_value')
49
+ expect(@engine).to respond_to(:exact_p_value)
53
50
  }
54
- it "exact_cdf should return same values as cdf for n=50" do
55
- pr=rand()*0.8+0.1
56
- n=rand(10)+10
57
- [1,(n/2).to_i,n-1].each do |k|
58
-
59
- @engine.exact_cdf(k,n,pr).should be_within(1e-10).of(@engine.cdf(k,n,pr))
51
+
52
+ it 'exact_cdf should return same values as cdf for n=50' do
53
+ pr = rand * 0.8 + 0.1
54
+ n = rand(10) + 10
55
+ [1, (n / 2).to_i, n - 1].each do |k|
56
+ expect(@engine.exact_cdf(k, n, pr)).to be_within(1e-10).of(@engine.cdf(k, n, pr))
60
57
  end
61
58
  end
62
-
63
- it "exact_pdf should not return a Float if not float is used as parameter" do
64
- @engine.exact_pdf(1,1,1).should_not be_a(Float)
65
- @engine.exact_pdf(16, 80, 1.quo(2)).should_not be_a(Float)
66
- end
67
59
 
68
-
69
-
70
-
60
+ it 'exact_pdf should not return a Float if not float is used as parameter' do
61
+ expect(@engine.exact_pdf(1, 1, 1)).to_not be_a(Float)
62
+ expect(@engine.exact_pdf(16, 80, 1.quo(2))).to_not be_a(Float)
63
+ end
71
64
  end
72
-
65
+
73
66
  describe Distribution::Binomial::Ruby_ do
74
67
  before do
75
- @engine=Distribution::Binomial::Ruby_
68
+ @engine = Distribution::Binomial::Ruby_
76
69
  end
77
- it_should_behave_like "binomial engine"
78
-
79
- it "should return correct cdf for n>100" do
80
- pending("incomplete beta function is slow. Should be replaced for a faster one")
70
+ it_should_behave_like 'binomial engine'
71
+
72
+ it 'should return correct cdf for n>100' do
73
+ [500, 1000].each do |n|
74
+ [0.5, 0.6].each do |pr|
75
+ [n / 2].each do |x|
76
+ cdf = @engine.exact_cdf(x, n, pr)
77
+ p_value = @engine.p_value(cdf, n, pr)
78
+ msg = "For p_value(#{cdf},#{n},#{pr}) expected #{x}, obtained #{p_value}"
79
+
80
+ expect(p_value).to eq(x), msg
81
+ end
82
+ end
83
+ end
81
84
  end
82
-
83
- it "should return correct p_value for n<=100" do
85
+
86
+ it 'should return correct p_value for n<=100' do
84
87
  pending("Can't calculate with precision x using p")
85
- [10,100].each do |n|
86
- [0.25,0.5,0.75].each do |pr|
87
- [n/2].each do |x|
88
- cdf=@engine.cdf(x,n,pr)
89
- p_value=@engine.p_value(cdf,n,pr)
90
-
91
- p_value.should eq(x), "For p_value(#{cdf},#{n},#{pr}) expected #{x}, obtained #{p_value}"
88
+
89
+ [10, 100].each do |n|
90
+ [0.25, 0.5, 0.75].each do |pr|
91
+ [n / 2].each do |x|
92
+ cdf = @engine.cdf(x, n, pr)
93
+ p_value = @engine.p_value(cdf, n, pr)
94
+
95
+ msg = "For p_value(#{cdf},#{n},#{pr}) expected #{x}, obtained #{p_value}"
96
+ expect(p_value).to eq(x), msg
97
+ end
92
98
  end
93
99
  end
94
100
  end
95
- end
96
-
97
101
  end
102
+
98
103
  if Distribution.has_gsl?
99
104
  describe Distribution::Binomial::GSL_ do
100
105
  before do
101
- @engine=Distribution::Binomial::GSL_
106
+ @engine = Distribution::Binomial::GSL_
102
107
  end
103
- it_should_behave_like "binomial engine"
108
+
109
+ it_should_behave_like 'binomial engine'
104
110
  end
105
111
  end
106
- #if Distribution.has_statistics2?
107
- # describe Distribution::Binomial::Statistics2_ do
108
- #
109
- # before do
110
- # @engine=Distribution::Binomial::Statistics2_
111
- # end
112
- #it_should_behave_like "binomial engine"
113
- # end
114
- #end
115
-
112
+
116
113
  if Distribution.has_java?
117
114
  describe Distribution::Binomial::Java_ do
118
115
  before do
119
- @engine=Distribution::Binomial::Java_
116
+ @engine = Distribution::Binomial::Java_
120
117
  end
121
- it_should_behave_like "binomial engine"
122
-
123
- end
118
+
119
+ it_should_behave_like 'binomial engine'
120
+ end
124
121
  end
125
-
126
122
  end