ruby-statistics 2.0.4 → 2.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 298bc7d8dff1aeabc7db9c11fe9d7987f16bde40
4
- data.tar.gz: 1d796e62c18052f87fc2616b4c1a5f777080c1ab
2
+ SHA256:
3
+ metadata.gz: 1e73ce22e1ad6da4f9d2925ed5884d6e72d915ebad14b56b9e81c64c422c14cf
4
+ data.tar.gz: 18fa7cafd8bbf457dd8963b2e666525964ad588257ffc8774cee2d1250f4b469
5
5
  SHA512:
6
- metadata.gz: 98e8c58f34668e839be9689c74debd75bd7a6869372536d7e9927a63f77fca59ab05e06b413705f0d286094292cb566c01e6fe71145cdd7d2152fc930829910e
7
- data.tar.gz: 37b78191adb8d659f21134346a8a415c5bd7bd8a7dd99b2c1f8d7793a2ea741c43e60d8235a7d5fcc2bc0284b24e8e58e8404e0b4b4401ee3bc60f7e1afc8b8b
6
+ metadata.gz: d362a9a2a5ea950ccc37ca5754dca0644040f49563afb14bbd10792ac2ef1f13853724cb693107fa6eb571972432026c5b3cf363ea4932513360f33513147401
7
+ data.tar.gz: cd5dd0a2b386fcaa0190d369a1f9d40248d4ed315e165df43403884cb33438902dd080a3f1579ba498eb88a5f2936ba91f6cd4a9e31a948ac31e2d124ba232fe
@@ -1,8 +1,7 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.2
5
- - 2.3.1
6
- - 2.4.0
7
- - 2.5.0
4
+ - 2.3.7
5
+ - 2.4.4
6
+ - 2.5.1
8
7
  before_install: gem install bundler
@@ -0,0 +1,35 @@
1
+ module Statistics
2
+ module Distribution
3
+ class Bernoulli
4
+ def self.density_function(n, p)
5
+ return if n != 0 && n != 1 # The support of the distribution is n = {0, 1}.
6
+
7
+ case n
8
+ when 0 then 1.0 - p
9
+ when 1 then p
10
+ end
11
+ end
12
+
13
+ def self.cumulative_function(n, p)
14
+ return if n != 0 && n != 1 # The support of the distribution is n = {0, 1}.
15
+
16
+ case n
17
+ when 0 then 1.0 - p
18
+ when 1 then 1.0
19
+ end
20
+ end
21
+
22
+ def self.variance(p)
23
+ p * (1.0 - p)
24
+ end
25
+
26
+ def self.skewness(p)
27
+ (1.0 - 2.0*p).to_f / Math.sqrt(p * (1.0 - p))
28
+ end
29
+
30
+ def self.kurtosis(p)
31
+ (6.0 * (p ** 2) - (6 * p) + 1) / (p * (1.0 - p))
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,76 @@
1
+ module Statistics
2
+ module Distribution
3
+ class Geometric
4
+ attr_accessor :probability_of_success, :always_success_allowed
5
+
6
+ def initialize(p, always_success: false)
7
+ self.probability_of_success = p.to_f
8
+ self.always_success_allowed = always_success
9
+ end
10
+
11
+ def density_function(k)
12
+ k = k.to_i
13
+
14
+ if always_success_allowed
15
+ return if k < 0
16
+
17
+ ((1.0 - probability_of_success) ** k) * probability_of_success
18
+ else
19
+ return if k <= 0
20
+
21
+ ((1.0 - probability_of_success) ** (k - 1.0)) * probability_of_success
22
+ end
23
+ end
24
+
25
+ def cumulative_function(k)
26
+ k = k.to_i
27
+
28
+ if always_success_allowed
29
+ return if k < 0
30
+
31
+ 1.0 - ((1.0 - probability_of_success) ** (k + 1.0))
32
+ else
33
+ return if k <= 0
34
+
35
+ 1.0 - ((1.0 - probability_of_success) ** k)
36
+ end
37
+ end
38
+
39
+ def mean
40
+ if always_success_allowed
41
+ (1.0 - probability_of_success) / probability_of_success
42
+ else
43
+ 1.0 / probability_of_success
44
+ end
45
+ end
46
+
47
+ def median
48
+ if always_success_allowed
49
+ (-1.0 / Math.log2(1.0 - probability_of_success)).ceil - 1.0
50
+ else
51
+ (-1.0 / Math.log2(1.0 - probability_of_success)).ceil
52
+ end
53
+ end
54
+
55
+ def mode
56
+ if always_success_allowed
57
+ 0.0
58
+ else
59
+ 1.0
60
+ end
61
+ end
62
+
63
+ def variance
64
+ (1.0 - probability_of_success) / (probability_of_success ** 2)
65
+ end
66
+
67
+ def skewness
68
+ (2.0 - probability_of_success) / Math.sqrt(1.0 - probability_of_success)
69
+ end
70
+
71
+ def kurtosis
72
+ 6.0 + ((probability_of_success ** 2) / (1.0 - probability_of_success))
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,51 @@
1
+ module Statistics
2
+ module Distribution
3
+ class LogSeries
4
+ def self.density_function(k, p)
5
+ return if k <= 0
6
+ k = k.to_i
7
+
8
+ left = (-1.0 / Math.log(1.0 - p))
9
+ right = (p ** k).to_f
10
+
11
+ left * right / k
12
+ end
13
+
14
+ def self.cumulative_function(k, p)
15
+ return if k <= 0
16
+
17
+ # Sadly, the incomplete beta function is converging
18
+ # too fast to zero and breaking the calculation on logs.
19
+ # So, we default to the basic definition of the CDF which is
20
+ # the integral (-Inf, K) of the PDF, with P(X <= x) which can
21
+ # be solved as a summation of all PDFs from 1 to K. Note that the summation approach
22
+ # only applies to discrete distributions.
23
+ #
24
+ # right = Math.incomplete_beta_function(p, (k + 1).floor, 0) / Math.log(1.0 - p)
25
+ # 1.0 + right
26
+
27
+ result = 0.0
28
+ 1.upto(k) do |number|
29
+ result += self.density_function(number, p)
30
+ end
31
+
32
+ result
33
+ end
34
+
35
+ def self.mode
36
+ 1.0
37
+ end
38
+
39
+ def self.mean(p)
40
+ (-1.0 / Math.log(1.0 - p)) * (p / (1.0 - p))
41
+ end
42
+
43
+ def self.variance(p)
44
+ up = p + Math.log(1.0 - p)
45
+ down = ((1.0 - p) ** 2) * (Math.log(1.0 - p) ** 2)
46
+
47
+ (-1.0 * p) * (up / down.to_f)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,51 @@
1
+ module Statistics
2
+ module Distribution
3
+ class NegativeBinomial
4
+ attr_accessor :number_of_failures, :probability_per_trial
5
+
6
+ def initialize(r, p)
7
+ self.number_of_failures = r.to_i
8
+ self.probability_per_trial = p
9
+ end
10
+
11
+ def probability_mass_function(k)
12
+ return if number_of_failures < 0 || k < 0 || k > number_of_failures
13
+
14
+ left = Math.combination(k + number_of_failures - 1, k)
15
+ right = ((1 - probability_per_trial) ** number_of_failures) * (probability_per_trial ** k)
16
+
17
+ left * right
18
+ end
19
+
20
+ def cumulative_function(k)
21
+ return if k < 0 || k > number_of_failures
22
+ k = k.to_i
23
+
24
+ 1.0 - Math.incomplete_beta_function(probability_per_trial, k + 1, number_of_failures)
25
+ end
26
+
27
+ def mean
28
+ (probability_per_trial * number_of_failures)/(1 - probability_per_trial).to_f
29
+ end
30
+
31
+ def variance
32
+ (probability_per_trial * number_of_failures)/((1 - probability_per_trial) ** 2).to_f
33
+ end
34
+
35
+ def skewness
36
+ (1 + probability_per_trial).to_f / Math.sqrt(probability_per_trial * number_of_failures)
37
+ end
38
+
39
+ def mode
40
+ if number_of_failures > 1
41
+ up = probability_per_trial * (number_of_failures - 1)
42
+ down = (1 - probability_per_trial).to_f
43
+
44
+ (up/down).floor
45
+ elsif number_of_failures <= 1
46
+ 0.0
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,3 @@
1
1
  module Statistics
2
- VERSION = "2.0.4"
2
+ VERSION = "2.0.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-statistics
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - esteban zapata
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-18 00:00:00.000000000 Z
11
+ date: 2018-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -137,10 +137,14 @@ files:
137
137
  - lib/math.rb
138
138
  - lib/statistics.rb
139
139
  - lib/statistics/distribution.rb
140
+ - lib/statistics/distribution/bernoulli.rb
140
141
  - lib/statistics/distribution/beta.rb
141
142
  - lib/statistics/distribution/binomial.rb
142
143
  - lib/statistics/distribution/chi_squared.rb
143
144
  - lib/statistics/distribution/f.rb
145
+ - lib/statistics/distribution/geometric.rb
146
+ - lib/statistics/distribution/logseries.rb
147
+ - lib/statistics/distribution/negative_binomial.rb
144
148
  - lib/statistics/distribution/normal.rb
145
149
  - lib/statistics/distribution/poisson.rb
146
150
  - lib/statistics/distribution/t_student.rb
@@ -173,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
177
  version: '0'
174
178
  requirements: []
175
179
  rubyforge_project:
176
- rubygems_version: 2.5.2.1
180
+ rubygems_version: 2.7.3
177
181
  signing_key:
178
182
  specification_version: 4
179
183
  summary: A ruby gem for som specific statistics. Inspired by the jStat js library.