distribution 0.7.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +4 -6
- data/.yardopts +5 -0
- data/History.txt +3 -0
- data/README.md +87 -44
- data/benchmark/binomial_coefficient.rb +19 -23
- data/benchmark/binomial_coefficient/experiment.rb +33 -36
- data/benchmark/factorial_hash.rb +7 -8
- data/benchmark/factorial_method.rb +4 -6
- data/benchmark/odd.rb +6 -7
- data/benchmark/power.rb +11 -11
- data/bin/distribution +26 -26
- data/distribution.gemspec +3 -4
- data/lib/distribution.rb +55 -96
- data/lib/distribution/beta/gsl.rb +10 -5
- data/lib/distribution/beta/ruby.rb +3 -1
- data/lib/distribution/binomial/ruby.rb +5 -2
- data/lib/distribution/bivariatenormal.rb +4 -5
- data/lib/distribution/bivariatenormal/gsl.rb +2 -2
- data/lib/distribution/bivariatenormal/java.rb +1 -1
- data/lib/distribution/bivariatenormal/ruby.rb +245 -254
- data/lib/distribution/chisquare.rb +8 -10
- data/lib/distribution/chisquare/gsl.rb +24 -19
- data/lib/distribution/chisquare/java.rb +1 -1
- data/lib/distribution/chisquare/ruby.rb +25 -25
- data/lib/distribution/chisquare/statistics2.rb +16 -13
- data/lib/distribution/distributable.rb +40 -0
- data/lib/distribution/exponential.rb +4 -5
- data/lib/distribution/exponential/gsl.rb +13 -9
- data/lib/distribution/exponential/ruby.rb +14 -9
- data/lib/distribution/f.rb +1 -1
- data/lib/distribution/f/gsl.rb +26 -22
- data/lib/distribution/f/java.rb +1 -1
- data/lib/distribution/f/ruby.rb +16 -19
- data/lib/distribution/f/statistics2.rb +22 -19
- data/lib/distribution/gamma.rb +5 -7
- data/lib/distribution/gamma/gsl.rb +13 -9
- data/lib/distribution/gamma/java.rb +1 -1
- data/lib/distribution/gamma/ruby.rb +5 -11
- data/lib/distribution/hypergeometric.rb +5 -8
- data/lib/distribution/hypergeometric/gsl.rb +4 -5
- data/lib/distribution/hypergeometric/java.rb +1 -1
- data/lib/distribution/hypergeometric/ruby.rb +34 -35
- data/lib/distribution/logistic.rb +5 -8
- data/lib/distribution/logistic/ruby.rb +13 -8
- data/lib/distribution/lognormal.rb +5 -7
- data/lib/distribution/lognormal/gsl.rb +8 -6
- data/lib/distribution/lognormal/ruby.rb +5 -9
- data/lib/distribution/math_extension.rb +6 -15
- data/lib/distribution/math_extension/chebyshev_series.rb +281 -272
- data/lib/distribution/math_extension/erfc.rb +26 -29
- data/lib/distribution/math_extension/exponential_integral.rb +17 -17
- data/lib/distribution/math_extension/gammastar.rb +19 -20
- data/lib/distribution/math_extension/gsl_utilities.rb +12 -12
- data/lib/distribution/math_extension/incomplete_beta.rb +52 -61
- data/lib/distribution/math_extension/incomplete_gamma.rb +166 -168
- data/lib/distribution/math_extension/log_utilities.rb +20 -22
- data/lib/distribution/normal.rb +11 -13
- data/lib/distribution/normal/gsl.rb +13 -10
- data/lib/distribution/normal/java.rb +14 -13
- data/lib/distribution/normal/ruby.rb +68 -58
- data/lib/distribution/normal/statistics2.rb +5 -2
- data/lib/distribution/normalmultivariate.rb +64 -64
- data/lib/distribution/poisson.rb +11 -13
- data/lib/distribution/poisson/gsl.rb +7 -7
- data/lib/distribution/poisson/java.rb +19 -24
- data/lib/distribution/poisson/ruby.rb +38 -9
- data/lib/distribution/shorthand.rb +17 -0
- data/lib/distribution/t.rb +13 -15
- data/lib/distribution/t/gsl.rb +27 -24
- data/lib/distribution/t/java.rb +1 -1
- data/lib/distribution/t/ruby.rb +99 -100
- data/lib/distribution/t/statistics2.rb +19 -19
- data/lib/distribution/uniform.rb +26 -0
- data/lib/distribution/uniform/gsl.rb +36 -0
- data/lib/distribution/uniform/ruby.rb +91 -0
- data/lib/distribution/version.rb +1 -1
- data/lib/distribution/weibull.rb +6 -7
- data/lib/distribution/weibull/gsl.rb +16 -16
- data/lib/distribution/weibull/ruby.rb +30 -23
- data/spec/beta_spec.rb +45 -47
- data/spec/binomial_spec.rb +77 -85
- data/spec/bivariatenormal_spec.rb +28 -35
- data/spec/chisquare_spec.rb +48 -52
- data/spec/distribution_spec.rb +10 -10
- data/spec/exponential_spec.rb +44 -49
- data/spec/f_spec.rb +4 -4
- data/spec/gamma_spec.rb +50 -53
- data/spec/hypergeometric_spec.rb +63 -69
- data/spec/logistic_spec.rb +32 -37
- data/spec/lognormal_spec.rb +25 -31
- data/spec/math_extension_spec.rb +192 -210
- data/spec/normal_spec.rb +80 -73
- data/spec/poisson_spec.rb +63 -41
- data/spec/shorthand_spec.rb +19 -22
- data/spec/spec_helper.rb +8 -9
- data/spec/t_spec.rb +63 -77
- data/spec/uniform_spec.rb +154 -0
- data/spec/weibull_spec.rb +13 -14
- metadata +17 -8
data/spec/normal_spec.rb
CHANGED
@@ -1,109 +1,116 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__)+
|
2
|
-
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
|
2
|
+
|
3
3
|
describe Distribution::Normal do
|
4
|
-
shared_examples_for
|
5
|
-
|
6
|
-
samples=100
|
7
|
-
sum=0
|
8
|
-
ss=0
|
9
|
-
exp_mean=rand(10)-5
|
10
|
-
exp_sd=1
|
11
|
-
rng
|
12
|
-
|
13
|
-
samples.times do
|
14
|
-
v=rng.call
|
15
|
-
sum+=v
|
16
|
-
ss+=(v-exp_mean)**2
|
4
|
+
shared_examples_for 'gaussian engine(with rng)' do
|
5
|
+
it 'should return correct rng' do
|
6
|
+
samples = 100
|
7
|
+
sum = 0
|
8
|
+
ss = 0
|
9
|
+
exp_mean = rand(10) - 5
|
10
|
+
exp_sd = 1
|
11
|
+
rng = @engine.rng(exp_mean, exp_sd)
|
12
|
+
|
13
|
+
samples.times do
|
14
|
+
v = rng.call
|
15
|
+
sum += v
|
16
|
+
ss += (v - exp_mean)**2
|
17
17
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
|
19
|
+
mean = sum.to_f / samples
|
20
|
+
sd = Math.sqrt(ss.to_f / samples)
|
21
|
+
expect(mean).to be_within(0.5).of(exp_mean)
|
22
|
+
expect(sd).to be_within(0.3).of(exp_sd)
|
23
|
+
end
|
24
24
|
end
|
25
|
-
end
|
26
25
|
|
27
|
-
shared_examples_for
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@engine.pdf(x).should be_within(1e-10).of(pdf)
|
34
|
-
end
|
35
|
-
else
|
36
|
-
pending("No #{@engine}.pdf")
|
26
|
+
shared_examples_for 'gaussian engine(with rng)' do
|
27
|
+
it 'rng with a specified seed should be reproducible' do
|
28
|
+
seed = rand(10)
|
29
|
+
rng1 = @engine.rng(0, 1, seed)
|
30
|
+
rng2 = @engine.rng(0, 1, seed)
|
31
|
+
expect((rng1.call)).to eq(rng2.call)
|
37
32
|
end
|
38
33
|
end
|
39
|
-
end
|
40
34
|
|
41
|
-
shared_examples_for
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
35
|
+
shared_examples_for 'gaussian engine(with pdf)' do
|
36
|
+
it 'should return correct pdf' do
|
37
|
+
if @engine.respond_to? :pdf
|
38
|
+
10.times do |i|
|
39
|
+
x = (i - 5) / 2.0
|
40
|
+
pdf = (1.0 / Distribution::SQ2PI) * Math.exp(-(x**2 / 2.0))
|
41
|
+
expect(@engine.pdf(x)).to be_within(1e-10).of(pdf)
|
42
|
+
end
|
43
|
+
else
|
44
|
+
pending("No #{@engine}.pdf")
|
45
|
+
end
|
48
46
|
end
|
49
47
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
48
|
+
|
49
|
+
shared_examples_for 'gaussian engine' do
|
50
|
+
it 'should return correct cdf' do
|
51
|
+
if @engine.respond_to? :cdf
|
52
|
+
expect(@engine.cdf(1.96)).to be_within(1e-10).of(0.97500210485178)
|
53
|
+
expect(@engine.cdf(0)).to be_within(1e-10).of(0.5)
|
54
|
+
else
|
55
|
+
pending("No #{@engine}.cdf")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
it 'should return correct p_value' do
|
59
|
+
if @engine.respond_to? :p_value
|
60
|
+
expect(@engine.p_value(0.5)).to be_within(1e-3).of(0)
|
61
|
+
10.times do |i|
|
62
|
+
x = (i - 5) / 2.0
|
63
|
+
cdf = @engine.cdf(x)
|
64
|
+
expect(@engine.p_value(cdf)).to be_within(1e-6).of(x)
|
65
|
+
end
|
66
|
+
else
|
67
|
+
pending("No #{@engine}.p_value")
|
57
68
|
end
|
58
|
-
else
|
59
|
-
pending("No #{@engine}.p_value")
|
60
69
|
end
|
61
70
|
end
|
62
|
-
end
|
63
71
|
|
64
|
-
describe
|
72
|
+
describe 'singleton' do
|
65
73
|
before do
|
66
|
-
@engine=Distribution::Normal
|
74
|
+
@engine = Distribution::Normal
|
67
75
|
end
|
68
|
-
it_should_behave_like
|
69
|
-
it_should_behave_like
|
70
|
-
it_should_behave_like
|
76
|
+
it_should_behave_like 'gaussian engine'
|
77
|
+
it_should_behave_like 'gaussian engine(with rng)'
|
78
|
+
it_should_behave_like 'gaussian engine(with pdf)'
|
71
79
|
end
|
72
|
-
|
80
|
+
|
73
81
|
describe Distribution::Normal::Ruby_ do
|
74
82
|
before do
|
75
|
-
@engine=Distribution::Normal::Ruby_
|
83
|
+
@engine = Distribution::Normal::Ruby_
|
76
84
|
end
|
77
|
-
it_should_behave_like
|
78
|
-
it_should_behave_like
|
79
|
-
it_should_behave_like
|
85
|
+
it_should_behave_like 'gaussian engine'
|
86
|
+
it_should_behave_like 'gaussian engine(with rng)'
|
87
|
+
it_should_behave_like 'gaussian engine(with pdf)'
|
80
88
|
end
|
81
89
|
if Distribution.has_gsl?
|
82
90
|
describe Distribution::Normal::GSL_ do
|
83
91
|
before do
|
84
|
-
@engine=Distribution::Normal::GSL_
|
92
|
+
@engine = Distribution::Normal::GSL_
|
85
93
|
end
|
86
|
-
|
87
|
-
|
88
|
-
|
94
|
+
it_should_behave_like 'gaussian engine'
|
95
|
+
it_should_behave_like 'gaussian engine(with rng)'
|
96
|
+
it_should_behave_like 'gaussian engine(with pdf)'
|
89
97
|
end
|
90
|
-
end
|
98
|
+
end
|
91
99
|
if Distribution.has_statistics2?
|
92
100
|
describe Distribution::Normal::Statistics2_ do
|
93
101
|
before do
|
94
|
-
@engine=Distribution::Normal::Statistics2_
|
102
|
+
@engine = Distribution::Normal::Statistics2_
|
95
103
|
end
|
96
|
-
|
97
|
-
end
|
104
|
+
it_should_behave_like 'gaussian engine'
|
105
|
+
end
|
98
106
|
end
|
99
|
-
|
107
|
+
|
100
108
|
if Distribution.has_java?
|
101
109
|
describe Distribution::Normal::Java_ do
|
102
110
|
before do
|
103
|
-
@engine=Distribution::Normal::Java_
|
111
|
+
@engine = Distribution::Normal::Java_
|
104
112
|
end
|
105
|
-
|
106
|
-
end
|
113
|
+
it_should_behave_like 'gaussian engine'
|
114
|
+
end
|
107
115
|
end
|
108
|
-
|
109
116
|
end
|
data/spec/poisson_spec.rb
CHANGED
@@ -1,43 +1,71 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__)+
|
2
|
-
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
|
2
|
+
include ExampleWithGSL
|
3
3
|
describe Distribution::Poisson do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
shared_examples_for 'poisson engine(with rng)' do
|
5
|
+
it 'should return correct rng' do
|
6
|
+
# The expected rng output when 1 is set as the seed value
|
7
|
+
exp_means = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9]
|
8
|
+
|
9
|
+
lambda_val = rand(10) + 1
|
10
|
+
exp_mean = exp_means[lambda_val - 1]
|
11
|
+
seed = 1
|
12
|
+
|
13
|
+
rng = @engine.rng(lambda_val, seed)
|
14
|
+
|
15
|
+
samples = 100
|
16
|
+
sum = 0
|
17
|
+
samples.times do
|
18
|
+
v = rng.call
|
19
|
+
sum += v
|
20
|
+
end
|
21
|
+
mean = sum / samples
|
22
|
+
expect(mean.to_i).to be_within(1e-10).of(exp_mean)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
shared_examples_for 'poisson engine(with rng)' do
|
27
|
+
it 'rng with a specified seed should be reproducible' do
|
28
|
+
seed = 1
|
29
|
+
rng1 = @engine.rng(3, seed)
|
30
|
+
rng2 = @engine.rng(3, seed)
|
31
|
+
expect((rng1.call)).to eq(rng2.call)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
shared_examples_for 'poisson engine' do
|
37
|
+
it 'should return correct pdf' do
|
7
38
|
if @engine.respond_to? :pdf
|
8
|
-
[0.5,1,1.5].each {|l|
|
39
|
+
[0.5, 1, 1.5].each {|l|
|
9
40
|
1.upto(5) {|k|
|
10
|
-
@engine.pdf(k,l).
|
41
|
+
expect(@engine.pdf(k, l)).to be_within(1e-10).of((l**k * Math.exp(-l)).quo(Math.factorial(k)))
|
11
42
|
}
|
12
43
|
}
|
13
44
|
else
|
14
45
|
pending("No #{@engine}.pdf")
|
15
46
|
end
|
16
47
|
end
|
17
|
-
|
18
|
-
it_only_with_gsl
|
48
|
+
|
49
|
+
it_only_with_gsl 'should return correct cdf' do
|
19
50
|
if @engine.respond_to? :cdf
|
20
|
-
[0.5,1,1.5,4,10].each {|l|
|
51
|
+
[0.5, 1, 1.5, 4, 10].each {|l|
|
21
52
|
1.upto(5) {|k|
|
22
|
-
@engine.cdf(k,l).
|
53
|
+
expect(@engine.cdf(k, l)).to be_within(1e-10).of(GSL::Cdf.poisson_P(k, l))
|
23
54
|
}
|
24
55
|
}
|
25
|
-
|
56
|
+
|
26
57
|
else
|
27
58
|
pending("No #{@engine}.cdf")
|
28
59
|
end
|
29
60
|
end
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
it "should return correct p_value" do
|
35
|
-
pending("No exact p_value")
|
61
|
+
|
62
|
+
it 'should return correct p_value' do
|
63
|
+
pending('No exact p_value')
|
36
64
|
if @engine.respond_to? :p_value
|
37
|
-
|
65
|
+
[0.1, 1, 5, 10].each {|l|
|
38
66
|
1.upto(20) {|k|
|
39
|
-
pr
|
40
|
-
@engine.p_value(pr,l).
|
67
|
+
pr = @engine.cdf(k, l)
|
68
|
+
expect(@engine.p_value(pr, l)).to eq(k)
|
41
69
|
}
|
42
70
|
}
|
43
71
|
else
|
@@ -45,48 +73,42 @@ describe Distribution::Poisson do
|
|
45
73
|
end
|
46
74
|
end
|
47
75
|
end
|
48
|
-
|
49
76
|
|
50
|
-
describe
|
77
|
+
describe 'singleton' do
|
51
78
|
before do
|
52
|
-
@engine=Distribution::Poisson
|
79
|
+
@engine = Distribution::Poisson
|
53
80
|
end
|
54
|
-
it_should_behave_like
|
81
|
+
it_should_behave_like 'poisson engine'
|
55
82
|
end
|
56
|
-
|
83
|
+
|
57
84
|
describe Distribution::Poisson::Ruby_ do
|
58
85
|
before do
|
59
|
-
@engine=Distribution::Poisson::Ruby_
|
86
|
+
@engine = Distribution::Poisson::Ruby_
|
60
87
|
end
|
61
|
-
it_should_behave_like
|
62
|
-
|
88
|
+
it_should_behave_like 'poisson engine'
|
63
89
|
end
|
64
90
|
if Distribution.has_gsl?
|
65
91
|
describe Distribution::Poisson::GSL_ do
|
66
92
|
before do
|
67
|
-
@engine=Distribution::Poisson::GSL_
|
93
|
+
@engine = Distribution::Poisson::GSL_
|
68
94
|
end
|
69
|
-
it_should_behave_like
|
70
|
-
|
95
|
+
it_should_behave_like 'poisson engine'
|
71
96
|
end
|
72
97
|
end
|
73
98
|
if Distribution.has_java?
|
74
99
|
describe Distribution::Poisson::Java_ do
|
75
100
|
before do
|
76
|
-
@engine=Distribution::Poisson::Java_
|
101
|
+
@engine = Distribution::Poisson::Java_
|
77
102
|
end
|
78
|
-
it_should_behave_like
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
[0.5,1,1.5,4,10].each {|l|
|
103
|
+
it_should_behave_like 'poisson engine'
|
104
|
+
|
105
|
+
it 'should return correct cdf' do
|
106
|
+
[0.5, 1, 1.5, 4, 10].each {|l|
|
83
107
|
1.upto(5) {|k|
|
84
|
-
@engine.cdf(k,l).
|
108
|
+
expect(@engine.cdf(k, l)).to be_within(1e-10).of(Distribution::Poisson::Ruby_.cdf(k, l))
|
85
109
|
}
|
86
110
|
}
|
87
111
|
end
|
88
|
-
|
89
|
-
|
90
112
|
end
|
91
113
|
end
|
92
114
|
end
|
data/spec/shorthand_spec.rb
CHANGED
@@ -1,34 +1,31 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__)+
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
|
2
2
|
describe Distribution::Shorthand do
|
3
3
|
include Distribution::Shorthand
|
4
|
-
it
|
5
|
-
[:Normal
|
6
|
-
klass=Distribution.const_get(d)
|
7
|
-
shortname=klass::SHORTHAND
|
8
|
-
methods=[:pdf, :cdf, :p_value].map {|m| "#{shortname}_#{m}".to_sym}
|
9
|
-
methods.each do |m|
|
10
|
-
Distribution::Shorthand.instance_methods.map
|
4
|
+
it 'should have basic methods for all distributions' do
|
5
|
+
[:Normal, :ChiSquare, :F, :Hypergeometric, :Binomial, :T].each do |d|
|
6
|
+
klass = Distribution.const_get(d)
|
7
|
+
shortname = klass::SHORTHAND
|
8
|
+
methods = [:pdf, :cdf, :p_value].map { |m| "#{shortname}_#{m}".to_sym }
|
9
|
+
methods.each do |m|
|
10
|
+
expect(Distribution::Shorthand.instance_methods.map(&:to_sym)).to include(m)
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
14
13
|
end
|
15
|
-
it
|
14
|
+
it 'should have exact methods discrete distributions' do
|
16
15
|
[:Hypergeometric, :Binomial].each do |d|
|
17
|
-
klass=Distribution.const_get(d)
|
18
|
-
shortname=klass::SHORTHAND
|
19
|
-
methods=[:epdf, :ecdf].map {|m| "#{shortname}_#{m}".to_sym}
|
20
|
-
methods.each do |m|
|
21
|
-
Distribution::Shorthand.instance_methods.map
|
16
|
+
klass = Distribution.const_get(d)
|
17
|
+
shortname = klass::SHORTHAND
|
18
|
+
methods = [:epdf, :ecdf].map { |m| "#{shortname}_#{m}".to_sym }
|
19
|
+
methods.each do |m|
|
20
|
+
expect(Distribution::Shorthand.instance_methods.map(&:to_sym)).to include(m)
|
22
21
|
end
|
23
22
|
end
|
24
|
-
|
25
23
|
end
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
x
|
30
|
-
|
31
|
-
|
32
|
-
norm_p_value(x).should eql(Distribution::Normal.p_value(x))
|
25
|
+
it 'returns same values as long form' do
|
26
|
+
x = rand
|
27
|
+
expect(norm_cdf(x)).to eql(Distribution::Normal.cdf(x))
|
28
|
+
expect(norm_pdf(x)).to eql(Distribution::Normal.pdf(x))
|
29
|
+
expect(norm_p_value(x)).to eql(Distribution::Normal.p_value(x))
|
33
30
|
end
|
34
31
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
|
2
2
|
begin
|
3
3
|
require 'simplecov'
|
4
4
|
SimpleCov.start do
|
5
|
-
add_filter
|
6
|
-
add_group
|
5
|
+
add_filter '/spec/'
|
6
|
+
add_group 'Libraries', 'lib'
|
7
7
|
end
|
8
8
|
rescue LoadError
|
9
9
|
end
|
@@ -26,24 +26,23 @@ RSpec.configure do |config|
|
|
26
26
|
end
|
27
27
|
|
28
28
|
module ExampleWithGSL
|
29
|
-
def it_only_with_gsl(name,opts={}
|
29
|
+
def it_only_with_gsl(name, opts = {}, &block)
|
30
30
|
it(name, opts) do
|
31
31
|
if Distribution.has_gsl?
|
32
32
|
instance_eval(&block)
|
33
33
|
else
|
34
|
-
skip(
|
34
|
+
skip('Requires GSL')
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
39
|
-
def it_only_with_java(name
|
38
|
+
|
39
|
+
def it_only_with_java(name, &block)
|
40
40
|
it(name) do
|
41
41
|
if Distribution.has_java?
|
42
42
|
instance_eval(&block)
|
43
43
|
else
|
44
|
-
skip(
|
44
|
+
skip('Requires Java')
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
49
48
|
end
|
data/spec/t_spec.rb
CHANGED
@@ -1,111 +1,97 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__)+
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
|
2
2
|
|
3
3
|
include ExampleWithGSL
|
4
4
|
|
5
5
|
describe Distribution::T do
|
6
|
-
shared_examples_for
|
7
|
-
|
8
|
-
|
6
|
+
shared_examples_for 'T engine(with rng)' do
|
7
|
+
it 'should return correct rng' do
|
8
|
+
pending
|
9
|
+
end
|
9
10
|
end
|
10
|
-
end
|
11
11
|
|
12
|
-
shared_examples_for
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
shared_examples_for 'T engine(cdf with fractional df)' do
|
13
|
+
it 'should return correct cdf with fractional df' do
|
14
|
+
expect(@engine.cdf(1, 2.5)).to be_within(1e-6).of(0.7979695)
|
15
|
+
expect(@engine.cdf(2, 3.5)).to be_within(1e-6).of(0.9369307)
|
16
|
+
expect(@engine.cdf(3, 4.5)).to be_within(1e-6).of(0.9828096)
|
17
|
+
end
|
18
18
|
end
|
19
|
-
end
|
20
|
-
|
21
|
-
shared_examples_for "T engine" do
|
22
|
-
it_only_with_gsl "should return correct pdf" do
|
23
|
-
if @engine.respond_to? :pdf
|
24
|
-
[-2,0.1,0.5,1,2].each{|t|
|
25
|
-
[2,5,10].each{|n|
|
26
|
-
@engine.pdf(t,n).should be_within(1e-6).of(GSL::Ran.tdist_pdf(t,n))
|
27
|
-
@engine.pdf(t,n.to_f).should be_within(1e-6).of(@engine.pdf(t,n))
|
28
19
|
|
20
|
+
shared_examples_for 'T engine' do
|
21
|
+
it_only_with_gsl 'should return correct pdf' do
|
22
|
+
if @engine.respond_to? :pdf
|
23
|
+
[-2, 0.1, 0.5, 1, 2].each{|t|
|
24
|
+
[2, 5, 10].each{|n|
|
25
|
+
expect(@engine.pdf(t, n)).to be_within(1e-6).of(GSL::Ran.tdist_pdf(t, n))
|
26
|
+
expect(@engine.pdf(t, n.to_f)).to be_within(1e-6).of(@engine.pdf(t, n))
|
27
|
+
}
|
29
28
|
}
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
else
|
30
|
+
pending("No #{@engine}.pdf")
|
31
|
+
end
|
33
32
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
33
|
+
it_only_with_gsl 'should return correct cdf' do
|
34
|
+
if @engine.respond_to? :cdf
|
35
|
+
# Testing with R values
|
36
|
+
expect(@engine.cdf(1, 2)).to be_within(1e-7).of(0.7886751)
|
37
|
+
expect(@engine.cdf(1, 2.0)).to be_within(1e-7).of(0.7886751)
|
38
|
+
expect(@engine.cdf(1, 3.0)).to be_within(1e-7).of(0.8044989)
|
39
|
+
|
40
|
+
[-2, 0.1, 0.5, 1, 2].each{|t|
|
41
|
+
[2, 5, 10].each{|n|
|
42
|
+
expect(@engine.cdf(t, n)).to be_within(1e-4).of(GSL::Cdf.tdist_P(t, n))
|
43
|
+
expect(@engine.cdf(t, n)).to be_within(1e-4).of(@engine.cdf(t, n.to_f))
|
44
|
+
}
|
47
45
|
}
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
else
|
47
|
+
pending("No #{@engine}.cdf")
|
48
|
+
end
|
51
49
|
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
pending("No #{@engine}.p_value")
|
50
|
+
it_only_with_gsl 'should return correct p_value' do
|
51
|
+
if @engine.respond_to? :p_value
|
52
|
+
[-2, 0.1, 0.5, 1, 2].each{|t|
|
53
|
+
[2, 5, 10].each{|n|
|
54
|
+
area = Distribution::T.cdf(t, n)
|
55
|
+
expect(@engine.p_value(area, n)).to be_within(1e-4).of(GSL::Cdf.tdist_Pinv(area, n))
|
56
|
+
}
|
57
|
+
}
|
58
|
+
else
|
59
|
+
pending("No #{@engine}.p_value")
|
60
|
+
end
|
64
61
|
end
|
65
62
|
end
|
66
|
-
end
|
67
63
|
|
68
|
-
describe
|
64
|
+
describe 'singleton' do
|
69
65
|
before do
|
70
|
-
@engine=Distribution::T
|
66
|
+
@engine = Distribution::T
|
71
67
|
end
|
72
|
-
it_should_behave_like
|
68
|
+
it_should_behave_like 'T engine'
|
73
69
|
end
|
74
|
-
|
70
|
+
|
75
71
|
describe Distribution::T::Ruby_ do
|
76
72
|
before do
|
77
|
-
@engine=Distribution::T::Ruby_
|
73
|
+
@engine = Distribution::T::Ruby_
|
78
74
|
end
|
79
|
-
it_should_behave_like
|
80
|
-
it_should_behave_like
|
81
|
-
|
75
|
+
it_should_behave_like 'T engine'
|
76
|
+
it_should_behave_like 'T engine(cdf with fractional df)'
|
82
77
|
end
|
78
|
+
|
83
79
|
if Distribution.has_gsl?
|
84
80
|
describe Distribution::T::GSL_ do
|
85
81
|
before do
|
86
|
-
@engine=Distribution::T::GSL_
|
82
|
+
@engine = Distribution::T::GSL_
|
87
83
|
end
|
88
|
-
|
89
|
-
|
84
|
+
it_should_behave_like 'T engine'
|
85
|
+
it_should_behave_like 'T engine(cdf with fractional df)'
|
90
86
|
end
|
91
87
|
end
|
92
|
-
|
93
|
-
if Distribution.has_statistics2?
|
94
|
-
describe Distribution::T::Statistics2_ do
|
95
|
-
before do
|
96
|
-
@engine=Distribution::T::Statistics2_
|
97
|
-
end
|
98
|
-
it_should_behave_like "T engine"
|
99
|
-
end
|
100
|
-
end
|
101
|
-
=end
|
88
|
+
|
102
89
|
if Distribution.has_java?
|
103
90
|
describe Distribution::T::Java_ do
|
104
91
|
before do
|
105
|
-
@engine=Distribution::T::Java_
|
92
|
+
@engine = Distribution::T::Java_
|
106
93
|
end
|
107
|
-
|
108
|
-
end
|
94
|
+
it_should_behave_like 'T engine'
|
95
|
+
end
|
109
96
|
end
|
110
|
-
|
111
97
|
end
|