distribution 0.6.0 → 0.7.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.
- data.tar.gz.sig +0 -0
- data/History.txt +7 -0
- data/Manifest.txt +6 -0
- data/README.txt +4 -4
- data/data/template/spec.erb +7 -6
- data/lib/distribution.rb +33 -24
- data/lib/distribution/logistic.rb +1 -1
- data/lib/distribution/logistic/ruby.rb +5 -5
- data/lib/distribution/lognormal.rb +39 -0
- data/lib/distribution/lognormal/gsl.rb +19 -0
- data/lib/distribution/lognormal/ruby.rb +20 -0
- data/lib/distribution/math_extension.rb +6 -3
- data/lib/distribution/math_extension/erfc.rb +3 -3
- data/lib/distribution/normal/java.rb +28 -0
- data/lib/distribution/poisson.rb +1 -1
- data/lib/distribution/poisson/java.rb +31 -0
- data/lib/distribution/t.rb +3 -1
- data/spec/beta_spec.rb +11 -11
- data/spec/gamma_spec.rb +14 -14
- data/spec/logistic_spec.rb +12 -13
- data/spec/lognormal_spec.rb +60 -0
- data/spec/math_extension_spec.rb +6 -4
- data/spec/poisson_spec.rb +29 -9
- data/spec/spec_helper.rb +11 -0
- data/vendor/java/commons-math-2.2.jar +0 -0
- metadata +41 -8
- metadata.gz.sig +0 -0
- data/.gemtest +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
=== 0.7.0 / 2011-11-30
|
2
|
+
|
3
|
+
+ Basic log-normal distribution support, with pdf and cdf for ruby [dennyabraham and clbustos]
|
4
|
+
* Matthew Peterson add Java support for Poisson and Normal distributions.
|
5
|
+
* Updated Logistic, Normal spec. Added LogNormal spec [clbustos]
|
6
|
+
* Updated template for new distributions
|
7
|
+
|
1
8
|
=== 0.6.0 / 2011-09-23
|
2
9
|
* Incomplete Beta functions on math renamed to Regularized beta, because MathExtension::IncompleteBeta calculates regularized beta function, not Incomplete Beta.
|
3
10
|
* Corrected documention on F distribution and added comments on gamma and beta[Claudio Bustos]
|
data/Manifest.txt
CHANGED
@@ -53,6 +53,9 @@ lib/distribution/hypergeometric/java.rb
|
|
53
53
|
lib/distribution/hypergeometric/ruby.rb
|
54
54
|
lib/distribution/logistic.rb
|
55
55
|
lib/distribution/logistic/ruby.rb
|
56
|
+
lib/distribution/lognormal.rb
|
57
|
+
lib/distribution/lognormal/gsl.rb
|
58
|
+
lib/distribution/lognormal/ruby.rb
|
56
59
|
lib/distribution/math_extension.rb
|
57
60
|
lib/distribution/math_extension/chebyshev_series.rb
|
58
61
|
lib/distribution/math_extension/erfc.rb
|
@@ -70,6 +73,7 @@ lib/distribution/normal/statistics2.rb
|
|
70
73
|
lib/distribution/normalmultivariate.rb
|
71
74
|
lib/distribution/poisson.rb
|
72
75
|
lib/distribution/poisson/gsl.rb
|
76
|
+
lib/distribution/poisson/java.rb
|
73
77
|
lib/distribution/poisson/ruby.rb
|
74
78
|
lib/distribution/t.rb
|
75
79
|
lib/distribution/t/gsl.rb
|
@@ -86,6 +90,7 @@ spec/f_spec.rb
|
|
86
90
|
spec/gamma_spec.rb
|
87
91
|
spec/hypergeometric_spec.rb
|
88
92
|
spec/logistic_spec.rb
|
93
|
+
spec/lognormal_spec.rb
|
89
94
|
spec/math_extension_spec.rb
|
90
95
|
spec/normal_spec.rb
|
91
96
|
spec/poisson_spec.rb
|
@@ -93,3 +98,4 @@ spec/shorthand_spec.rb
|
|
93
98
|
spec/spec.opts
|
94
99
|
spec/spec_helper.rb
|
95
100
|
spec/t_spec.rb
|
101
|
+
vendor/java/commons-math-2.2.jar
|
data/README.txt
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
Statistical Distributions library. Includes Normal univariate and bivariate, T, F, Chi Square, Binomial, Hypergeometric, Exponential, Poisson, Beta and Gamma.
|
7
|
+
Statistical Distributions library. Includes Normal univariate and bivariate, T, F, Chi Square, Binomial, Hypergeometric, Exponential, Poisson, Beta, LogNormal and Gamma.
|
8
8
|
|
9
9
|
Uses Ruby by default and C (statistics2/GSL) or Java extensions where available.
|
10
10
|
|
@@ -15,7 +15,6 @@ Includes code from statistics2 on Normal, T, F and Chi Square ruby code [http://
|
|
15
15
|
* Very fast ruby 1.8.7/1.9.+ implementation, with improved method to calculate factorials and others common functions
|
16
16
|
* All methods tested on several ranges. See spec/
|
17
17
|
* On Jruby and Rubinius, BivariateNormal returns incorrect pdf
|
18
|
-
* Ruby t distribution's cdf can't calculate fractional df. Install gsl, for now.
|
19
18
|
|
20
19
|
== API structure
|
21
20
|
|
@@ -46,6 +45,7 @@ Shortnames for distributions:
|
|
46
45
|
* Poisson: pois
|
47
46
|
* Beta: beta
|
48
47
|
* Gamma: gamma
|
48
|
+
* LogNormal: lognormal
|
49
49
|
|
50
50
|
For example
|
51
51
|
|
@@ -68,8 +68,8 @@ could be called after including Distribution::Shorthand
|
|
68
68
|
|
69
69
|
I try to provide a Ruby version for each method. To increase (notably!) the speed, please install
|
70
70
|
|
71
|
-
* Ruby 1.8-1.9: gsl or statistics2
|
72
|
-
* Java:
|
71
|
+
* Ruby 1.8-1.9: gsl (prefered) or statistics2
|
72
|
+
* Java: Not yet implemented
|
73
73
|
|
74
74
|
== INSTALL:
|
75
75
|
|
data/data/template/spec.erb
CHANGED
@@ -41,13 +41,14 @@ describe Distribution::<%= distribution.capitalize %> do
|
|
41
41
|
it_should_behave_like "<%= distribution %> engine"
|
42
42
|
|
43
43
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
|
45
|
+
if Distribution.has_gsl?
|
46
|
+
describe Distribution::<%= distribution.capitalize %>::GSL_ do
|
47
|
+
before do
|
48
|
+
@engine=Distribution::<%= distribution.capitalize %>::GSL_
|
49
|
+
end
|
50
|
+
it_should_behave_like "<%= distribution %> engine"
|
48
51
|
end
|
49
|
-
it_should_behave_like "<%= distribution %> engine"
|
50
|
-
|
51
52
|
end
|
52
53
|
|
53
54
|
|
data/lib/distribution.rb
CHANGED
@@ -27,16 +27,16 @@
|
|
27
27
|
# Specific notices will be placed where there are appropiate
|
28
28
|
#
|
29
29
|
if !respond_to? :define_singleton_method
|
30
|
-
class Module
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
class Object
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
class Module
|
31
|
+
public :define_method
|
32
|
+
end
|
33
|
+
|
34
|
+
class Object
|
35
|
+
def define_singleton_method(name,&block)
|
36
|
+
sc=class <<self;self;end
|
37
|
+
sc.define_method(name,&block)
|
38
|
+
end
|
38
39
|
end
|
39
|
-
end
|
40
40
|
end
|
41
41
|
require 'distribution/math_extension'
|
42
42
|
|
@@ -50,8 +50,7 @@ require 'distribution/math_extension'
|
|
50
50
|
# Distribution::Normal.p_value(0.95)
|
51
51
|
# => 1.64485364660836
|
52
52
|
module Distribution
|
53
|
-
VERSION="0.
|
54
|
-
|
53
|
+
VERSION="0.7.0"
|
55
54
|
module Shorthand
|
56
55
|
EQUIVALENCES={:p_value=>:p, :cdf=>:cdf, :pdf=>:pdf, :rng=>:r, :exact_pdf=>:epdf, :exact_cdf=>:ecdf, :exact_p_value=>:ep}
|
57
56
|
def self.add_shortcut(sh,m, &block)
|
@@ -111,7 +110,6 @@ module Distribution
|
|
111
110
|
# This section was created between a very long reunion
|
112
111
|
# and a 456 Km. travel
|
113
112
|
def create_distribution_methods()
|
114
|
-
|
115
113
|
Distribution.libraries_order.each do |l_name|
|
116
114
|
if const_defined? l_name
|
117
115
|
l =const_get(l_name)
|
@@ -138,19 +136,30 @@ module Distribution
|
|
138
136
|
end
|
139
137
|
|
140
138
|
end
|
139
|
+
def self.init_java()
|
140
|
+
$:.unshift(File.dirname(__FILE__)+"/../vendor/java")
|
141
|
+
require 'commons-math-2.2.jar'
|
142
|
+
java_import 'org.apache.commons.math.distribution.NormalDistributionImpl'
|
143
|
+
java_import 'org.apache.commons.math.distribution.PoissonDistributionImpl'
|
141
144
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
145
|
+
end
|
146
|
+
require 'distribution/normal'
|
147
|
+
require 'distribution/chisquare'
|
148
|
+
require 'distribution/gamma'
|
149
|
+
require 'distribution/beta'
|
150
|
+
require 'distribution/t'
|
151
|
+
require 'distribution/f'
|
152
|
+
require 'distribution/bivariatenormal'
|
153
|
+
require 'distribution/binomial'
|
154
|
+
require 'distribution/hypergeometric'
|
155
|
+
require 'distribution/exponential'
|
156
|
+
require 'distribution/poisson'
|
157
|
+
require 'distribution/logistic'
|
158
|
+
require 'distribution/lognormal'
|
159
|
+
|
160
|
+
if has_java?
|
161
|
+
init_java()
|
162
|
+
end
|
154
163
|
end
|
155
164
|
|
156
165
|
|
@@ -2,14 +2,14 @@ module Distribution
|
|
2
2
|
module Logistic
|
3
3
|
module Ruby_
|
4
4
|
class << self
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
def rng(u,s)
|
6
|
+
lambda {p_value(rand(),u,s)}
|
7
|
+
end
|
8
8
|
def pdf(x,u,s )
|
9
|
-
(Math.exp(-(x-u)/s))/(s*(1+Math.exp(-(x-u)/s)**2))
|
9
|
+
(Math.exp(-(x-u) / s)) / (s*(1+Math.exp(-(x-u) / s)**2))
|
10
10
|
end
|
11
11
|
def cdf(x,u,s )
|
12
|
-
1/(1+Math.exp(-(x-u)/s))
|
12
|
+
1/(1+Math.exp(-(x-u) / s))
|
13
13
|
end
|
14
14
|
def p_value(pr,u,s )
|
15
15
|
u+s*Math.log(pr/(1-pr))
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'distribution/lognormal/gsl'
|
2
|
+
require 'distribution/lognormal/ruby'
|
3
|
+
|
4
|
+
module Distribution
|
5
|
+
# From Wikipedia:
|
6
|
+
# In probability theory, a log-normal distribution is a probability
|
7
|
+
# distribution of a random variable whose logarithm is normally
|
8
|
+
# distributed. If X is a random variable with a normal distribution, then
|
9
|
+
# Y = exp(X) has a log-normal distribution; likewise, if Y is
|
10
|
+
# log-normally distributed, then X = log(Y) is normally distributed. (This
|
11
|
+
# is true regardless of the base of the logarithmic function: if loga(Y) is
|
12
|
+
# normally distributed, then so is logb(Y), for any two positive numbers
|
13
|
+
# a, b ≠ 1.)
|
14
|
+
#
|
15
|
+
# This module calculate the pdf, cdf and inverse cdf for Beta Distribution.
|
16
|
+
#
|
17
|
+
module LogNormal
|
18
|
+
extend Distributable
|
19
|
+
SHORTHAND='lognormal'
|
20
|
+
create_distribution_methods
|
21
|
+
|
22
|
+
##
|
23
|
+
# :singleton-method: pdf(x,u,s)
|
24
|
+
# Returns PDF of of Lognormal distribution with parameters u (position) and
|
25
|
+
# s (deviation)
|
26
|
+
|
27
|
+
|
28
|
+
##
|
29
|
+
# :singleton-method: cdf(x,u,s)
|
30
|
+
# Returns the CDF of Lognormal distribution of x with parameters
|
31
|
+
# u (position) and s(deviation)
|
32
|
+
|
33
|
+
##
|
34
|
+
# :singleton-method: p_value(pr,u,s)
|
35
|
+
# Return the quantile of the corresponding integral +pr+
|
36
|
+
# on a lognormal distribution's cdf with parameters z and s
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Distribution
|
2
|
+
module LogNormal
|
3
|
+
module GSL_
|
4
|
+
class << self
|
5
|
+
def pdf(x,u,s)
|
6
|
+
GSL::Ran::lognormal_pdf(x.to_f, u.to_f, s.to_f)
|
7
|
+
end
|
8
|
+
|
9
|
+
def p_value(pr,u,s)
|
10
|
+
GSL::Cdf::lognormal_Pinv(pr.to_f, u.to_f, s.to_f)
|
11
|
+
end
|
12
|
+
|
13
|
+
def cdf(x,u,s)
|
14
|
+
GSL::Cdf::lognormal_P(x.to_f, u.to_f, s.to_f)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Distribution
|
2
|
+
module LogNormal
|
3
|
+
module Ruby_
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def pdf(x,u,s)
|
7
|
+
raise "x should be > 0 " if x < 0
|
8
|
+
(1.0/(x*s*Math.sqrt(2*Math::PI)))*Math.exp(-((Math.log(x)-u)**2 / (2*s**2)))
|
9
|
+
end
|
10
|
+
|
11
|
+
#def p_value(pr,u,s)
|
12
|
+
#end
|
13
|
+
|
14
|
+
def cdf(x,u,s)
|
15
|
+
Distribution::Normal.cdf((Math.log(x)-u) / s)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -68,10 +68,13 @@ module Distribution
|
|
68
68
|
# From statistics2
|
69
69
|
def gamma(x)
|
70
70
|
if (x < 0.0)
|
71
|
-
return Math::PI / (Math.sin(Math
|
71
|
+
return Math::PI / (Math.sin(Math::PI * x) * Math.exp(loggamma(1 - x))) #/
|
72
72
|
end
|
73
73
|
Math.exp(loggamma(x))
|
74
74
|
end
|
75
|
+
def lgamma(x)
|
76
|
+
[loggamma(x.abs), Math.gamma(x) < 0 ? -1 : 1]
|
77
|
+
end
|
75
78
|
end
|
76
79
|
# Useful additions to Math
|
77
80
|
module MathExtension
|
@@ -281,7 +284,7 @@ module Distribution
|
|
281
284
|
end
|
282
285
|
|
283
286
|
# Not the same as erfc. This is the GSL version, which may have slightly different results.
|
284
|
-
def erfc_e
|
287
|
+
def erfc_e(x, with_error = false)
|
285
288
|
Erfc.evaluate(x, with_error)
|
286
289
|
end
|
287
290
|
|
@@ -365,7 +368,7 @@ if RUBY_VERSION<"1.9"
|
|
365
368
|
module Math
|
366
369
|
remove_method :loggamma
|
367
370
|
include Distribution::MathExtension18
|
368
|
-
module_function :gamma, :loggamma
|
371
|
+
module_function :gamma, :loggamma, :lgamma
|
369
372
|
end
|
370
373
|
end
|
371
374
|
|
@@ -23,7 +23,7 @@ module Distribution
|
|
23
23
|
class << self
|
24
24
|
# Estimates erfc(x) valid for 8 < x < 100
|
25
25
|
# erfc8_sum from GSL-1.9
|
26
|
-
def erfc8_sum
|
26
|
+
def erfc8_sum(x)
|
27
27
|
num = P[5]
|
28
28
|
4.downto(0) { |i| num = x*num + P[i] }
|
29
29
|
den = Q[6]
|
@@ -31,7 +31,7 @@ module Distribution
|
|
31
31
|
num / den
|
32
32
|
end
|
33
33
|
|
34
|
-
def erfc8
|
34
|
+
def erfc8(x)
|
35
35
|
erfc8_sum(x) * Math.exp(-x*x)
|
36
36
|
end
|
37
37
|
|
@@ -54,7 +54,7 @@ module Distribution
|
|
54
54
|
e *= ex2
|
55
55
|
end
|
56
56
|
elsif ax < 10.0
|
57
|
-
exterm = Math.exp(-x*x)/ax
|
57
|
+
exterm = Math.exp(-x*x) / ax
|
58
58
|
t = (2*ax-15).quo(5)
|
59
59
|
e = ChebyshevSeries.evaluate(:erfc_x510, t, with_error)
|
60
60
|
if with_error
|
@@ -3,6 +3,34 @@ module Distribution
|
|
3
3
|
# TODO
|
4
4
|
module Java_
|
5
5
|
class << self
|
6
|
+
#==
|
7
|
+
# Generate random variables from the provided distribution
|
8
|
+
def rng(mean=0,sigma=1,seed=nil)
|
9
|
+
dist = NormalDistributionImpl.new(mean, sigma)
|
10
|
+
lambda { dist.sample }
|
11
|
+
end
|
12
|
+
|
13
|
+
#==
|
14
|
+
# Get the inverse cumulative density function (p-value) for qn
|
15
|
+
def p_value(qn)
|
16
|
+
dist = NormalDistributionImpl.new
|
17
|
+
dist.inverseCumulativeProbability(qn)
|
18
|
+
end
|
19
|
+
|
20
|
+
#==
|
21
|
+
# Return the cumulative density function at x
|
22
|
+
def cdf(x)
|
23
|
+
dist = NormalDistributionImpl.new
|
24
|
+
dist.cumulativeProbability(x)
|
25
|
+
end
|
26
|
+
|
27
|
+
#==
|
28
|
+
# Return the probability density function at x
|
29
|
+
def pdf(x)
|
30
|
+
dist = NormalDistributionImpl.new
|
31
|
+
dist.density(x)
|
32
|
+
end
|
33
|
+
|
6
34
|
end
|
7
35
|
end
|
8
36
|
end
|
data/lib/distribution/poisson.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Distribution
|
2
|
+
module Poisson
|
3
|
+
module Java_
|
4
|
+
class << self
|
5
|
+
#==
|
6
|
+
# Create the PoissonDistributionImpl object for use in calculations
|
7
|
+
# with mean of l
|
8
|
+
def create_distribution(l)
|
9
|
+
PoissonDistributionImpl.new(l)
|
10
|
+
end
|
11
|
+
|
12
|
+
#==
|
13
|
+
#
|
14
|
+
def pdf(k,l)
|
15
|
+
dist = create_distribution(l)
|
16
|
+
dist.probability(k)
|
17
|
+
end
|
18
|
+
|
19
|
+
def cdf(k,l)
|
20
|
+
dist = create_distribution(l)
|
21
|
+
dist.cumulativeProbability(k)
|
22
|
+
end
|
23
|
+
|
24
|
+
# def p_value(pr,l)
|
25
|
+
# dist = create_distribution(l)
|
26
|
+
# dist.inverseCumulativeProbability(pr)
|
27
|
+
# end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/distribution/t.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'distribution/t/ruby'
|
2
2
|
require 'distribution/t/gsl'
|
3
|
-
|
3
|
+
# Removed statistics2 support for t, because
|
4
|
+
# can't calculate correctly cdf for rational d.f
|
5
|
+
# require 'distribution/t/statistics2'
|
4
6
|
require 'distribution/t/java'
|
5
7
|
|
6
8
|
module Distribution
|
data/spec/beta_spec.rb
CHANGED
@@ -19,18 +19,18 @@ describe Distribution::Beta do
|
|
19
19
|
it_only_with_gsl "should return correct cdf" do
|
20
20
|
if @engine.respond_to? :cdf
|
21
21
|
# From GSL-1.9.
|
22
|
-
|
22
|
+
tol = 1048576.0*Float::EPSILON
|
23
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(
|
25
|
-
@engine.cdf(0.001, 1.2, 1.3).should be_within(
|
26
|
-
@engine.cdf(0.01, 1.2, 1.3).should be_within(
|
27
|
-
@engine.cdf(0.1, 1.2, 1.3).should be_within(
|
28
|
-
@engine.cdf(0.325, 1.2, 1.3).should be_within(
|
29
|
-
@engine.cdf(0.5, 1.2, 1.3).should be_within(
|
30
|
-
@engine.cdf(0.9, 1.2, 1.3).should be_within(
|
31
|
-
@engine.cdf(0.99, 1.2, 1.3).should be_within(
|
32
|
-
@engine.cdf(0.999, 1.2, 1.3).should be_within(
|
33
|
-
@engine.cdf(1.0, 1.2, 1.3).should be_within(
|
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
34
|
else
|
35
35
|
pending("No #{@engine}.cdf")
|
36
36
|
end
|
data/spec/gamma_spec.rb
CHANGED
@@ -19,21 +19,21 @@ shared_examples_for "Gamma engine" do
|
|
19
19
|
it_only_with_gsl "should return correct cdf" do
|
20
20
|
if @engine.respond_to? :cdf
|
21
21
|
# From GSL-1.9.
|
22
|
-
|
22
|
+
tol = 1048576.0*Float::EPSILON
|
23
23
|
@engine.cdf(0.0, 1.0, 1.0).should eq(0.0)
|
24
|
-
@engine.cdf(1e-100, 1.0, 1.0).should be_within(
|
25
|
-
@engine.cdf(0.001, 1.0, 1.0).should be_within(
|
26
|
-
@engine.cdf(0.01, 1.0, 1.0).should be_within(
|
27
|
-
@engine.cdf(0.1, 1.0, 1.0).should be_within(
|
28
|
-
@engine.cdf(0.325, 1.0, 1.0).should be_within(
|
29
|
-
@engine.cdf(1.0, 1.0, 1.0).should be_within(
|
30
|
-
@engine.cdf(1.5, 1.0, 1.0).should be_within(
|
31
|
-
@engine.cdf(2.0, 1.0, 1.0).should be_within(
|
32
|
-
@engine.cdf(10.0, 1.0, 1.0).should be_within(
|
33
|
-
@engine.cdf(20.0, 1.0, 1.0).should be_within(
|
34
|
-
@engine.cdf(100.0, 1.0, 1.0).should be_within(
|
35
|
-
@engine.cdf(1000.0, 1.0, 1.0).should be_within(
|
36
|
-
@engine.cdf(10000.0, 1.0, 1.0).should be_within(
|
24
|
+
@engine.cdf(1e-100, 1.0, 1.0).should be_within(tol).of(1e-100)
|
25
|
+
@engine.cdf(0.001, 1.0, 1.0).should be_within(tol).of(9.99500166625008332e-4)
|
26
|
+
@engine.cdf(0.01, 1.0, 1.0).should be_within(tol).of(9.95016625083194643e-3)
|
27
|
+
@engine.cdf(0.1, 1.0, 1.0).should be_within(tol).of(9.51625819640404268e-2)
|
28
|
+
@engine.cdf(0.325, 1.0, 1.0).should be_within(tol).of(2.77472646357927811e-1)
|
29
|
+
@engine.cdf(1.0, 1.0, 1.0).should be_within(tol).of(6.32120558828557678e-1)
|
30
|
+
@engine.cdf(1.5, 1.0, 1.0).should be_within(tol).of(7.76869839851570171e-1)
|
31
|
+
@engine.cdf(2.0, 1.0, 1.0).should be_within(tol).of(8.64664716763387308e-1)
|
32
|
+
@engine.cdf(10.0, 1.0, 1.0).should be_within(tol).of(9.99954600070237515e-1)
|
33
|
+
@engine.cdf(20.0, 1.0, 1.0).should be_within(tol).of(9.99999997938846378e-1)
|
34
|
+
@engine.cdf(100.0, 1.0, 1.0).should be_within(tol).of(1e0)
|
35
|
+
@engine.cdf(1000.0, 1.0, 1.0).should be_within(tol).of(1e0)
|
36
|
+
@engine.cdf(10000.0, 1.0, 1.0).should be_within(tol).of(1e0)
|
37
37
|
else
|
38
38
|
pending("No #{@engine}.cdf")
|
39
39
|
end
|
data/spec/logistic_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Distribution::Logistic do
|
|
6
6
|
it "should return correct pdf" do
|
7
7
|
if @engine.respond_to? :pdf
|
8
8
|
1.upto(10) {
|
9
|
-
|
9
|
+
u=rand()
|
10
10
|
s=rand()+1
|
11
11
|
x=rand()*100-50
|
12
12
|
exp=Math.exp(-(x-u) / s) / (s*(1+Math.exp(-(x-u) / s)**2))
|
@@ -19,14 +19,13 @@ describe Distribution::Logistic do
|
|
19
19
|
|
20
20
|
it "should return correct cdf" do
|
21
21
|
if @engine.respond_to? :cdf
|
22
|
-
|
23
|
-
|
24
22
|
1.upto(100) {
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
u=rand()
|
24
|
+
s=rand()*100
|
25
|
+
x=rand()*100-50
|
26
|
+
exp=1/(1+Math.exp(-(x-u) / s))
|
27
|
+
|
28
|
+
@engine.cdf(x,u,s).should eq(exp)
|
30
29
|
}
|
31
30
|
|
32
31
|
else
|
@@ -38,11 +37,11 @@ describe Distribution::Logistic do
|
|
38
37
|
it "should return correct p_value" do
|
39
38
|
if @engine.respond_to? :p_value
|
40
39
|
1.upto(9) {|i|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
u=rand()
|
41
|
+
s=rand()*100
|
42
|
+
x=@engine.p_value(i/10.0,u,s)
|
43
|
+
@engine.cdf(x,u,s).should be_within(1e-10).of(i/10.0)
|
44
|
+
}
|
46
45
|
else
|
47
46
|
pending("No #{@engine}.cdf")
|
48
47
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)+"/spec_helper.rb")
|
2
|
+
|
3
|
+
describe Distribution::LogNormal do
|
4
|
+
|
5
|
+
shared_examples_for "log-normal engine" do
|
6
|
+
it "should return correct pdf" do
|
7
|
+
if @engine.respond_to? :pdf
|
8
|
+
1.upto(10) {
|
9
|
+
u=rand()
|
10
|
+
s=rand()*100
|
11
|
+
x=rand()*50
|
12
|
+
exp=(1.0/(x*s*Math.sqrt(2*Math::PI)))*Math.exp(-((Math.log(x)-u)**2 / (2*s**2)))
|
13
|
+
@engine.pdf(x,u,s).should be_within(1e-10).of(exp)
|
14
|
+
}
|
15
|
+
else
|
16
|
+
pending("No #{@engine}.pdf")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
it "should return correct cdf" do
|
20
|
+
if @engine.respond_to? :cdf
|
21
|
+
1.upto(10) {
|
22
|
+
u=rand()
|
23
|
+
s=rand()*100
|
24
|
+
x=rand()*50
|
25
|
+
exp=Distribution::Normal.cdf((Math.log(x) - u) / s)
|
26
|
+
@engine.cdf(x,u,s).should be_within(1e-10).of(exp)
|
27
|
+
}
|
28
|
+
else
|
29
|
+
pending("No #{@engine}.cdf")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "singleton" do
|
36
|
+
before do
|
37
|
+
@engine=Distribution::LogNormal
|
38
|
+
end
|
39
|
+
it_should_behave_like "log-normal engine"
|
40
|
+
end
|
41
|
+
|
42
|
+
describe Distribution::LogNormal::Ruby_ do
|
43
|
+
before do
|
44
|
+
@engine=Distribution::LogNormal::Ruby_
|
45
|
+
end
|
46
|
+
it_should_behave_like "log-normal engine"
|
47
|
+
|
48
|
+
end
|
49
|
+
if Distribution.has_gsl?
|
50
|
+
describe Distribution::LogNormal::GSL_ do
|
51
|
+
before do
|
52
|
+
@engine=Distribution::LogNormal::GSL_
|
53
|
+
end
|
54
|
+
it_should_behave_like "log-normal engine"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
end
|
data/spec/math_extension_spec.rb
CHANGED
@@ -119,16 +119,18 @@ describe Distribution::MathExtension do
|
|
119
119
|
|
120
120
|
|
121
121
|
it "unnormalized_incomplete_gamma with x=0 should return correct values" do
|
122
|
-
Math.unnormalized_incomplete_gamma(-1.5, 0).should be_within(1e-10).of(4.0*Math.sqrt(Math::PI)/3.0)
|
122
|
+
Math.unnormalized_incomplete_gamma(-1.5, 0).should be_within(1e-10).of(4.0*Math.sqrt(Math::PI) / 3.0)
|
123
123
|
Math.unnormalized_incomplete_gamma(-0.5, 0).should be_within(1e-10).of(-2*Math.sqrt(Math::PI))
|
124
124
|
Math.unnormalized_incomplete_gamma(0.5, 0).should be_within(1e-10).of(Math.sqrt(Math::PI))
|
125
125
|
Math.unnormalized_incomplete_gamma(1.0, 0).should eq 1.0
|
126
|
-
Math.unnormalized_incomplete_gamma(1.5, 0).should be_within(1e-10).of(Math.sqrt(Math::PI)/2.0)
|
126
|
+
Math.unnormalized_incomplete_gamma(1.5, 0).should be_within(1e-10).of(Math.sqrt(Math::PI) / 2.0)
|
127
127
|
Math.unnormalized_incomplete_gamma(2.0, 0).should eq 1.0
|
128
128
|
Math.unnormalized_incomplete_gamma(2.5, 0).should be_within(1e-10).of(0.75*Math.sqrt(Math::PI))
|
129
|
-
|
129
|
+
|
130
|
+
Math.unnormalized_incomplete_gamma(3.0, 0).should be_within(1e-12).of(2.0)
|
131
|
+
|
130
132
|
Math.unnormalized_incomplete_gamma(3.5, 0).should be_within(1e-10).of(15.0*Math.sqrt(Math::PI) / 8.0)
|
131
|
-
Math.unnormalized_incomplete_gamma(4.0, 0).should
|
133
|
+
Math.unnormalized_incomplete_gamma(4.0, 0).should be_within(1e-12).of(6.0)
|
132
134
|
end
|
133
135
|
|
134
136
|
it "incomplete_gamma should return correct values" do
|
data/spec/poisson_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe Distribution::Poisson do
|
|
7
7
|
if @engine.respond_to? :pdf
|
8
8
|
[0.5,1,1.5].each {|l|
|
9
9
|
1.upto(5) {|k|
|
10
|
-
@engine.pdf(k,l).should be_within(1e-10).of((l**k*Math.exp(-l)).quo(Math.factorial(k)))
|
10
|
+
@engine.pdf(k,l).should be_within(1e-10).of( (l**k*Math.exp(-l)).quo(Math.factorial(k)) )
|
11
11
|
}
|
12
12
|
}
|
13
13
|
else
|
@@ -27,6 +27,8 @@ describe Distribution::Poisson do
|
|
27
27
|
pending("No #{@engine}.cdf")
|
28
28
|
end
|
29
29
|
end
|
30
|
+
|
31
|
+
|
30
32
|
|
31
33
|
|
32
34
|
it "should return correct p_value" do
|
@@ -59,14 +61,32 @@ describe Distribution::Poisson do
|
|
59
61
|
it_should_behave_like "poisson engine"
|
60
62
|
|
61
63
|
end
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
if Distribution.has_gsl?
|
65
|
+
describe Distribution::Poisson::GSL_ do
|
66
|
+
before do
|
67
|
+
@engine=Distribution::Poisson::GSL_
|
68
|
+
end
|
69
|
+
it_should_behave_like "poisson engine"
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
if Distribution.has_java?
|
74
|
+
describe Distribution::Poisson::Java_ do
|
75
|
+
before do
|
76
|
+
@engine=Distribution::Poisson::Java_
|
77
|
+
end
|
78
|
+
it_should_behave_like "poisson engine"
|
79
|
+
|
80
|
+
|
81
|
+
it "should return correct cdf" do
|
82
|
+
[0.5,1,1.5,4,10].each {|l|
|
83
|
+
1.upto(5) {|k|
|
84
|
+
@engine.cdf(k,l).should be_within(1e-10).of(Distribution::Poisson::Ruby_.cdf(k,l))
|
85
|
+
}
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
|
66
90
|
end
|
67
|
-
it_should_behave_like "poisson engine"
|
68
|
-
|
69
91
|
end
|
70
|
-
|
71
|
-
|
72
92
|
end
|
data/spec/spec_helper.rb
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: distribution
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: 3
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Claudio Bustos
|
@@ -31,7 +36,7 @@ cert_chain:
|
|
31
36
|
rpP0jjs0
|
32
37
|
-----END CERTIFICATE-----
|
33
38
|
|
34
|
-
date: 2011-
|
39
|
+
date: 2011-11-30 00:00:00 -03:00
|
35
40
|
default_executable:
|
36
41
|
dependencies:
|
37
42
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +47,11 @@ dependencies:
|
|
42
47
|
requirements:
|
43
48
|
- - ">="
|
44
49
|
- !ruby/object:Gem::Version
|
50
|
+
hash: 7
|
51
|
+
segments:
|
52
|
+
- 2
|
53
|
+
- 0
|
54
|
+
- 4
|
45
55
|
version: 2.0.4
|
46
56
|
type: :development
|
47
57
|
version_requirements: *id001
|
@@ -53,6 +63,10 @@ dependencies:
|
|
53
63
|
requirements:
|
54
64
|
- - ">="
|
55
65
|
- !ruby/object:Gem::Version
|
66
|
+
hash: 3
|
67
|
+
segments:
|
68
|
+
- 2
|
69
|
+
- 0
|
56
70
|
version: "2.0"
|
57
71
|
type: :development
|
58
72
|
version_requirements: *id002
|
@@ -64,6 +78,9 @@ dependencies:
|
|
64
78
|
requirements:
|
65
79
|
- - ">="
|
66
80
|
- !ruby/object:Gem::Version
|
81
|
+
hash: 3
|
82
|
+
segments:
|
83
|
+
- 0
|
67
84
|
version: "0"
|
68
85
|
type: :development
|
69
86
|
version_requirements: *id003
|
@@ -73,13 +90,18 @@ dependencies:
|
|
73
90
|
requirement: &id004 !ruby/object:Gem::Requirement
|
74
91
|
none: false
|
75
92
|
requirements:
|
76
|
-
- -
|
93
|
+
- - ">="
|
77
94
|
- !ruby/object:Gem::Version
|
78
|
-
|
95
|
+
hash: 47
|
96
|
+
segments:
|
97
|
+
- 2
|
98
|
+
- 8
|
99
|
+
- 0
|
100
|
+
version: 2.8.0
|
79
101
|
type: :development
|
80
102
|
version_requirements: *id004
|
81
103
|
description: |-
|
82
|
-
Statistical Distributions library. Includes Normal univariate and bivariate, T, F, Chi Square, Binomial, Hypergeometric, Exponential, Poisson, Beta and Gamma.
|
104
|
+
Statistical Distributions library. Includes Normal univariate and bivariate, T, F, Chi Square, Binomial, Hypergeometric, Exponential, Poisson, Beta, LogNormal and Gamma.
|
83
105
|
|
84
106
|
Uses Ruby by default and C (statistics2/GSL) or Java extensions where available.
|
85
107
|
|
@@ -150,6 +172,9 @@ files:
|
|
150
172
|
- lib/distribution/hypergeometric/ruby.rb
|
151
173
|
- lib/distribution/logistic.rb
|
152
174
|
- lib/distribution/logistic/ruby.rb
|
175
|
+
- lib/distribution/lognormal.rb
|
176
|
+
- lib/distribution/lognormal/gsl.rb
|
177
|
+
- lib/distribution/lognormal/ruby.rb
|
153
178
|
- lib/distribution/math_extension.rb
|
154
179
|
- lib/distribution/math_extension/chebyshev_series.rb
|
155
180
|
- lib/distribution/math_extension/erfc.rb
|
@@ -167,6 +192,7 @@ files:
|
|
167
192
|
- lib/distribution/normalmultivariate.rb
|
168
193
|
- lib/distribution/poisson.rb
|
169
194
|
- lib/distribution/poisson/gsl.rb
|
195
|
+
- lib/distribution/poisson/java.rb
|
170
196
|
- lib/distribution/poisson/ruby.rb
|
171
197
|
- lib/distribution/t.rb
|
172
198
|
- lib/distribution/t/gsl.rb
|
@@ -183,6 +209,7 @@ files:
|
|
183
209
|
- spec/gamma_spec.rb
|
184
210
|
- spec/hypergeometric_spec.rb
|
185
211
|
- spec/logistic_spec.rb
|
212
|
+
- spec/lognormal_spec.rb
|
186
213
|
- spec/math_extension_spec.rb
|
187
214
|
- spec/normal_spec.rb
|
188
215
|
- spec/poisson_spec.rb
|
@@ -190,7 +217,7 @@ files:
|
|
190
217
|
- spec/spec.opts
|
191
218
|
- spec/spec_helper.rb
|
192
219
|
- spec/t_spec.rb
|
193
|
-
- .
|
220
|
+
- vendor/java/commons-math-2.2.jar
|
194
221
|
has_rdoc: true
|
195
222
|
homepage: https://github.com/clbustos/distribution
|
196
223
|
licenses: []
|
@@ -206,17 +233,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
206
233
|
requirements:
|
207
234
|
- - ">="
|
208
235
|
- !ruby/object:Gem::Version
|
236
|
+
hash: 3
|
237
|
+
segments:
|
238
|
+
- 0
|
209
239
|
version: "0"
|
210
240
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
241
|
none: false
|
212
242
|
requirements:
|
213
243
|
- - ">="
|
214
244
|
- !ruby/object:Gem::Version
|
245
|
+
hash: 3
|
246
|
+
segments:
|
247
|
+
- 0
|
215
248
|
version: "0"
|
216
249
|
requirements: []
|
217
250
|
|
218
251
|
rubyforge_project: distribution
|
219
|
-
rubygems_version: 1.
|
252
|
+
rubygems_version: 1.3.7
|
220
253
|
signing_key:
|
221
254
|
specification_version: 3
|
222
255
|
summary: Statistical Distributions library
|
metadata.gz.sig
CHANGED
Binary file
|
data/.gemtest
DELETED
File without changes
|