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
@@ -4,27 +4,25 @@ require 'distribution/chisquare/statistics2'
|
|
4
4
|
require 'distribution/chisquare/java'
|
5
5
|
module Distribution
|
6
6
|
# Calculate cdf and inverse cdf for Chi Square Distribution.
|
7
|
-
#
|
7
|
+
#
|
8
8
|
module ChiSquare
|
9
9
|
extend Distributable
|
10
|
-
SHORTHAND='chisq'
|
10
|
+
SHORTHAND = 'chisq'
|
11
11
|
create_distribution_methods
|
12
|
-
|
12
|
+
|
13
13
|
##
|
14
14
|
# :singleton-method: pdf(x)
|
15
|
-
# Returns PDF of of Chi-squared distribution
|
15
|
+
# Returns PDF of of Chi-squared distribution
|
16
16
|
# with +k+ degrees of freedom
|
17
|
-
|
18
|
-
|
17
|
+
|
19
18
|
##
|
20
19
|
# :singleton-method: cdf(x,k)
|
21
|
-
# Returns the integral of Chi-squared distribution
|
22
|
-
# with +k+ degrees of freedom over [0, +x+]
|
20
|
+
# Returns the integral of Chi-squared distribution
|
21
|
+
# with +k+ degrees of freedom over [0, +x+]
|
23
22
|
|
24
23
|
##
|
25
24
|
# :singleton-method: p_value(qn, k)
|
26
|
-
# Return the P-value of the corresponding integral +qn+ with
|
25
|
+
# Return the P-value of the corresponding integral +qn+ with
|
27
26
|
# +k+ degrees of freedom
|
28
|
-
|
29
27
|
end
|
30
28
|
end
|
@@ -2,25 +2,30 @@ module Distribution
|
|
2
2
|
module ChiSquare
|
3
3
|
module GSL_
|
4
4
|
class << self
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
5
|
+
def rng(_k, _seed = nil)
|
6
|
+
nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def pdf(x, k)
|
10
|
+
GSL::Ran.chisq_pdf(x.to_f, k.to_i)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Chi-square cumulative distribution function (cdf).
|
14
|
+
#
|
15
|
+
# Returns the integral of Chi-squared distribution
|
16
|
+
# with k degrees of freedom over [0, x]
|
17
|
+
#
|
18
|
+
def cdf(x, k)
|
19
|
+
GSL::Cdf.chisq_P(x.to_f, k.to_i)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Return the P-value of the corresponding integral with
|
23
|
+
# k degrees of freedom
|
24
|
+
def quantile(pr, k)
|
25
|
+
GSL::Cdf.chisq_Pinv(pr.to_f, k.to_i)
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :p_value, :quantile
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -2,27 +2,25 @@ module Distribution
|
|
2
2
|
module ChiSquare
|
3
3
|
module Ruby_
|
4
4
|
class << self
|
5
|
-
|
6
5
|
include Math
|
7
|
-
def pdf(x,n)
|
6
|
+
def pdf(x, n)
|
8
7
|
if n == 1
|
9
|
-
1.0/Math.sqrt(2 * Math::PI * x) * Math::E**(-x/2.0)
|
8
|
+
1.0 / Math.sqrt(2 * Math::PI * x) * Math::E**(-x / 2.0)
|
10
9
|
elsif n == 2
|
11
|
-
0.5 * Math::E**(-x/2.0)
|
10
|
+
0.5 * Math::E**(-x / 2.0)
|
12
11
|
else
|
13
12
|
n = n.to_f
|
14
|
-
n2 = n/2
|
13
|
+
n2 = n / 2
|
15
14
|
x = x.to_f
|
16
|
-
1.0 / 2**n2 / gamma(n2) * x**(n2 - 1.0) * Math.exp(-x/2.0)
|
17
|
-
end
|
15
|
+
1.0 / 2**n2 / gamma(n2) * x**(n2 - 1.0) * Math.exp(-x / 2.0)
|
16
|
+
end
|
18
17
|
end
|
19
|
-
|
20
|
-
|
18
|
+
|
21
19
|
# CDF Inverse over [x, \infty)
|
22
20
|
# Pr([x, \infty)) = y -> x
|
23
21
|
def pchi2(n, y)
|
24
22
|
if n == 1
|
25
|
-
w = Distribution::Normal.p_value(1 - y/2) # = p1.0-Distribution::Normal.cdf(y/2)
|
23
|
+
w = Distribution::Normal.p_value(1 - y / 2) # = p1.0-Distribution::Normal.cdf(y/2)
|
26
24
|
w * w
|
27
25
|
elsif n == 2
|
28
26
|
# v = (1.0 / y - 1.0) / 33.0
|
@@ -34,26 +32,22 @@ module Distribution
|
|
34
32
|
s = 10.0
|
35
33
|
loop do
|
36
34
|
v += s
|
37
|
-
if s <= eps
|
35
|
+
break if s <= eps
|
38
36
|
if (qe = q_chi2(n, v) - y) == 0.0 then break end
|
39
37
|
if qe < 0.0
|
40
|
-
|
41
|
-
|
38
|
+
v -= s
|
39
|
+
s /= 10.0
|
40
|
+
end
|
42
41
|
end
|
43
|
-
end
|
44
42
|
|
45
|
-
|
43
|
+
v
|
46
44
|
end
|
47
45
|
end
|
48
46
|
|
49
|
-
def
|
50
|
-
|
47
|
+
def cdf(x, k)
|
48
|
+
1.0 - q_chi2(k, x)
|
51
49
|
end
|
52
50
|
|
53
|
-
def cdf(x,k)
|
54
|
-
1.0-q_chi2(k,x)
|
55
|
-
end
|
56
|
-
|
57
51
|
# chi-square distribution ([1])
|
58
52
|
# Integral over [x, \infty)
|
59
53
|
def q_chi2(df, chi2)
|
@@ -61,28 +55,34 @@ module Distribution
|
|
61
55
|
if (df & 1) != 0
|
62
56
|
chi = Math.sqrt(chi2)
|
63
57
|
|
64
|
-
|
58
|
+
return 2 * (1.0 - Distribution::Normal.cdf(chi)) if (df == 1)
|
65
59
|
s = t = chi * Math.exp(-0.5 * chi2) / SQ2PI
|
66
60
|
k = 3
|
67
61
|
|
68
62
|
while k < df
|
69
|
-
t *= chi2 / k; s += t
|
63
|
+
t *= chi2 / k; s += t
|
70
64
|
k += 2
|
71
65
|
end
|
72
66
|
|
73
|
-
2 * (1.0-(Distribution::Normal.cdf(chi)) + s)
|
67
|
+
2 * (1.0 - (Distribution::Normal.cdf(chi)) + s)
|
74
68
|
|
75
69
|
else
|
76
70
|
s = t = Math.exp(-0.5 * chi2)
|
77
71
|
k = 2
|
78
72
|
|
79
73
|
while k < df
|
80
|
-
t *= chi2 / k; s += t
|
74
|
+
t *= chi2 / k; s += t
|
81
75
|
k += 2
|
82
76
|
end
|
83
77
|
s
|
84
78
|
end
|
85
79
|
end
|
80
|
+
|
81
|
+
def quantile(pr, k)
|
82
|
+
pchi2(k, 1.0 - pr)
|
83
|
+
end
|
84
|
+
|
85
|
+
alias_method :p_value, :quantile
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
@@ -2,20 +2,23 @@ module Distribution
|
|
2
2
|
module ChiSquare
|
3
3
|
module Statistics2_
|
4
4
|
class << self
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
5
|
+
# Chi-square cumulative distribution function (cdf).
|
6
|
+
#
|
7
|
+
# Returns the integral of Chi-squared distribution
|
8
|
+
# with k degrees of freedom over [0, x]
|
9
|
+
#
|
10
|
+
def cdf(x, k)
|
11
|
+
Statistics2.chi2dist(k.to_i, x)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Return the P-value of the corresponding integral with
|
15
|
+
# k degrees of freedom
|
16
|
+
def quantile(pr, k)
|
17
|
+
Statistics2.pchi2X_(k.to_i, pr)
|
18
|
+
end
|
19
|
+
|
20
|
+
alias_method :p_value, :quantile
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
20
|
-
end
|
21
24
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Distribution
|
2
|
+
# Magic module
|
3
|
+
module Distributable #:nodoc:
|
4
|
+
# Create methods for each module and add methods to
|
5
|
+
# Distribution::Shorthand.
|
6
|
+
#
|
7
|
+
# Traverse Distribution.libraries_order adding
|
8
|
+
# methods availables for each engine module on
|
9
|
+
# the current library
|
10
|
+
#
|
11
|
+
# Kids: Metaprogramming trickery! Don't do at work.
|
12
|
+
# This section was created between a very long reunion
|
13
|
+
# and a 456 Km. travel
|
14
|
+
def create_distribution_methods
|
15
|
+
Distribution.libraries_order.each do |l_name|
|
16
|
+
if const_defined? l_name
|
17
|
+
l = const_get(l_name)
|
18
|
+
# Add methods from engine to base base, if not yet included
|
19
|
+
l.singleton_methods.each do |m|
|
20
|
+
unless singleton_methods.include? m
|
21
|
+
define_method(m) do |*args|
|
22
|
+
l.send(m, *args)
|
23
|
+
end
|
24
|
+
# Add method to Distribution::Shorthand
|
25
|
+
sh = const_get(:SHORTHAND)
|
26
|
+
Distribution::Shorthand.add_shortcut(sh, m) do |*args|
|
27
|
+
l.send(m, *args)
|
28
|
+
end
|
29
|
+
|
30
|
+
module_function m
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# create alias for common methods
|
37
|
+
alias_method :inverse_cdf, :p_value if singleton_methods.include? :p_value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,19 +1,18 @@
|
|
1
1
|
require 'distribution/exponential/ruby'
|
2
2
|
require 'distribution/exponential/gsl'
|
3
|
-
#require 'distribution/exponential/java'
|
4
|
-
|
3
|
+
# require 'distribution/exponential/java'
|
5
4
|
|
6
5
|
module Distribution
|
7
6
|
# From Wikipedia:
|
8
|
-
# In probability theory and statistics, the exponential distribution
|
7
|
+
# In probability theory and statistics, the exponential distribution
|
9
8
|
# (a.k.a. negative exponential distribution) is a family of continuous
|
10
9
|
# probability distributions. It describes the time between events in a
|
11
|
-
# Poisson process, i.e. a process in which events occur continuously
|
10
|
+
# Poisson process, i.e. a process in which events occur continuously
|
12
11
|
# and independently at a constant average rate.
|
13
12
|
#
|
14
13
|
# Parameter +l+ is the rate parameter, the number of occurrences/unit time.
|
15
14
|
module Exponential
|
16
|
-
SHORTHAND='expo'
|
15
|
+
SHORTHAND = 'expo'
|
17
16
|
extend Distributable
|
18
17
|
create_distribution_methods
|
19
18
|
##
|
@@ -2,18 +2,22 @@ module Distribution
|
|
2
2
|
module Exponential
|
3
3
|
module GSL_
|
4
4
|
class << self
|
5
|
-
def pdf(x,l)
|
6
|
-
return 0 if x<0
|
7
|
-
GSL::Ran.exponential_pdf(x,1/l.to_f)
|
5
|
+
def pdf(x, l)
|
6
|
+
return 0 if x < 0
|
7
|
+
GSL::Ran.exponential_pdf(x, 1 / l.to_f)
|
8
8
|
end
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
|
10
|
+
def cdf(x, l)
|
11
|
+
return 0 if x < 0
|
12
|
+
GSL::Cdf.exponential_P(x, 1 / l.to_f)
|
12
13
|
end
|
13
|
-
|
14
|
-
|
14
|
+
|
15
|
+
def quantile(pr, l)
|
16
|
+
GSL::Cdf.exponential_Pinv(pr, 1 / l.to_f)
|
15
17
|
end
|
18
|
+
|
19
|
+
alias_method :p_value, :quantile
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
19
|
-
end
|
23
|
+
end
|
@@ -4,19 +4,24 @@ module Distribution
|
|
4
4
|
class << self
|
5
5
|
def rng(l, opts = {})
|
6
6
|
rng = opts[:random] || Random
|
7
|
-
|
7
|
+
-> { p_value(rng.rand, l) }
|
8
8
|
end
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
|
10
|
+
def pdf(x, l)
|
11
|
+
return 0 if x < 0
|
12
|
+
l * Math.exp(-l * x)
|
12
13
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
|
15
|
+
def cdf(x, l)
|
16
|
+
return 0 if x < 0
|
17
|
+
1 - Math.exp(-l * x)
|
16
18
|
end
|
17
|
-
|
18
|
-
|
19
|
+
|
20
|
+
def quantile(pr, l)
|
21
|
+
(-Math.log(1 - pr)).quo(l)
|
19
22
|
end
|
23
|
+
|
24
|
+
alias_method :p_value, :quantile
|
20
25
|
end
|
21
26
|
end
|
22
27
|
end
|
data/lib/distribution/f.rb
CHANGED
data/lib/distribution/f/gsl.rb
CHANGED
@@ -1,27 +1,31 @@
|
|
1
1
|
module Distribution
|
2
2
|
module F
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
3
|
+
module GSL_
|
4
|
+
class << self
|
5
|
+
def pdf(x, k1, k2)
|
6
|
+
GSL::Ran.fdist_pdf(x.to_f, k1, k2)
|
7
|
+
end
|
8
|
+
|
9
|
+
# F cumulative distribution function (cdf).
|
10
|
+
#
|
11
|
+
# Returns the integral of F-distribution
|
12
|
+
# with k1 and k2 degrees of freedom
|
13
|
+
# over [0, x].
|
14
|
+
# Distribution::F.cdf(20,3,2)
|
15
|
+
#
|
16
|
+
def cdf(x, k1, k2)
|
17
|
+
GSL::Cdf.fdist_P(x.to_f.to_f, k1, k2)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return the P-value of the corresponding integral with
|
21
|
+
# k degrees of freedom
|
22
|
+
#
|
23
|
+
# Distribution::F.p_value(0.95,1,2)
|
24
|
+
def quantile(pr, k1, k2)
|
25
|
+
GSL::Cdf.fdist_Pinv(pr.to_f, k1, k2)
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :p_value, :quantile
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
data/lib/distribution/f/java.rb
CHANGED
data/lib/distribution/f/ruby.rb
CHANGED
@@ -16,19 +16,19 @@ module Distribution
|
|
16
16
|
module Ruby_
|
17
17
|
extend Distribution::MathExtension
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
19
|
+
# functions needed:
|
20
|
+
# - pdf
|
21
|
+
# - cdf (lower cumulative function, P(x))
|
22
|
+
# - Q(x), upper cumulative function
|
23
|
+
# - mean
|
24
|
+
# - mode
|
25
|
+
# - kurtosis
|
26
|
+
# - skewness
|
27
|
+
# - entropy
|
28
|
+
# - "fit" (maximum likelihood?)
|
29
|
+
# - expected value (given a function)
|
30
|
+
# - lower-tail quantile -> P
|
31
|
+
# - upper tail quantile -> Q
|
32
32
|
|
33
33
|
class << self
|
34
34
|
# F Distribution (Ruby) -- Probability Density Function
|
@@ -61,7 +61,7 @@ module Distribution
|
|
61
61
|
#
|
62
62
|
# Taken from:
|
63
63
|
# https://github.com/JuliaLang/Rmath-julia/blob/master/src/qf.c
|
64
|
-
def
|
64
|
+
def quantile(probability, n, m)
|
65
65
|
return Float::NAN if n <= 0.0 || m <= 0.0
|
66
66
|
|
67
67
|
if n == Float::INFINITY || n == -Float::INFINITY || m == Float::INFINITY || m == -Float::INFINITY
|
@@ -80,6 +80,8 @@ module Distribution
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
alias_method :p_value, :quantile
|
84
|
+
|
83
85
|
# Complementary quantile function.
|
84
86
|
#
|
85
87
|
# def cquantile(prob, n, m)
|
@@ -95,23 +97,18 @@ module Distribution
|
|
95
97
|
# @return [Float] Value of the F distribution that gives a p-value of `y`.
|
96
98
|
|
97
99
|
def mean
|
98
|
-
|
99
100
|
end
|
100
101
|
|
101
102
|
def mode
|
102
|
-
|
103
103
|
end
|
104
104
|
|
105
105
|
def skewness
|
106
|
-
|
107
106
|
end
|
108
107
|
|
109
108
|
def kurtosis
|
110
|
-
|
111
109
|
end
|
112
110
|
|
113
111
|
def entropy
|
114
|
-
|
115
112
|
end
|
116
113
|
end
|
117
114
|
end
|