croupier 1.2.0 → 1.3.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/README.md CHANGED
@@ -32,7 +32,16 @@ where:
32
32
 
33
33
  ### Available distributions and options
34
34
 
35
- Current version provides: Cauchy, exponential, normal, Poisson, triangular and uniform distributions.
35
+ Current version implements the following distributions:
36
+
37
+ * Cauchy
38
+ * Exponential
39
+ * Geometric
40
+ * Negative binomial
41
+ * Normal
42
+ * Poisson
43
+ * Triangular
44
+ * Uniform
36
45
 
37
46
  To get a list of all the available distributions use the ```--help``` (or ```-h```) option with croupier:
38
47
 
@@ -0,0 +1,45 @@
1
+ module Croupier
2
+ module Distributions
3
+
4
+ #####################################################################
5
+ # Geometric Distribution
6
+ # Discrete probability distribution that expresses the number of X
7
+ # Bernoulli trials needed to get one success, supported on the
8
+ # set { 1, 2, 3, ...}
9
+ #
10
+ # Wikipedia -- http://en.wikipedia.org/wiki/Geometric_distribution
11
+ # I made this choice because it's Knuth choice.
12
+ # (The Art of Computer Programming, Volume 2, 3.4.1.F )
13
+ class Geometric < ::Croupier::Distribution
14
+
15
+ def initialize(options={})
16
+ @name = "Geometric distribution"
17
+ @description = "Discrete probability distribution that expresses the the number of X Bernoulli trials needed to get one success, supported on the set { 1, 2, 3, ...}"
18
+ configure(options)
19
+ raise Croupier::InputParamsError, "Probability of success must be in the interval [0,1]" if params[:success] > 1 || params[:success] < 0
20
+ end
21
+
22
+ # Fair point: it is not the inverse of the cdf,
23
+ # but it generates the distribution from an uniform.
24
+ def inv_cdf n
25
+ (Math.log(1-n) / Math.log(1-params[:success])).ceil
26
+ end
27
+
28
+ def default_parameters
29
+ {:success => 0.5}
30
+ end
31
+
32
+ def self.cli_name
33
+ "geometric"
34
+ end
35
+
36
+ def self.cli_options
37
+ {:options => [
38
+ [:success, 'success probability of each trial', {:type=>:float, :short => "-p", :default => 0.5}]
39
+ ],
40
+ :banner => "Geometric distribution. Discrete probability distribution that expresses the number of X Bernoulli trials needed to get one success, supported on the set { 1, 2, 3, ...} }"
41
+ }
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,57 @@
1
+ module Croupier
2
+ module Distributions
3
+
4
+ #####################################################################
5
+ # Negative Binomial Distribution
6
+ # Discrete probability distribution of the number of successes in a
7
+ # sequence of Bernoulli trials before a specified (non-random)
8
+ # number of failures (denoted size) occur.
9
+ #
10
+ # The parameter prob expresses the probability of success.
11
+ # Wikipedia -- http://en.wikipedia.org/wiki/Negative_binomial_distribution
12
+ class Nbinomial < ::Croupier::Distribution
13
+
14
+ def initialize(options={})
15
+ @name = "Negative binomial distribution"
16
+ @description = "Discrete probability distribution of the number of successes in a sequence of Bernoulli trials before a specified (non-random) number of failures (denoted size) occur."
17
+ configure(options)
18
+ raise Croupier::InputParamsError, "Probability of success must be in the interval [0,1]" if params[:success] > 1 || params[:success] < 0
19
+ end
20
+
21
+ # Fair point: it is not the inverse of the cdf,
22
+ # but it generates the distribution from an uniform.
23
+ def generate_sample n=1
24
+ generate_geometrics(n).each_slice(params[:size]).map do |sample|
25
+ sample.inject(-params[:size], &:+) # Inject starts on -size because
26
+ # this way it is equivalent to:
27
+ # sample.map{|x| x - 1}.inject(&:+)
28
+ end
29
+ end
30
+
31
+ def base_geometric
32
+ ::Croupier::Distributions::Geometric.new(success: params[:success])
33
+ end
34
+
35
+ def generate_geometrics(n)
36
+ base_geometric.generate_sample(params[:size]*n)
37
+ end
38
+
39
+ def default_parameters
40
+ {:success => 0.5, :size => 1}
41
+ end
42
+
43
+ def self.cli_name
44
+ "nbinomial"
45
+ end
46
+
47
+ def self.cli_options
48
+ {:options => [
49
+ [:size, 'number of errors', {:type => :integer, :default => 1}],
50
+ [:success, 'success probability of each trial', {:type=>:float, :short => "-p", :default => 0.5}]
51
+ ],
52
+ :banner => "Negative binomial distribution. Discrete probability distribution of the number of successes in a sequence of Bernoulli trials before a specified (non-random) number of failures (denoted size) occur."
53
+ }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,23 @@
1
+ context('** Geometric Distribution **')
2
+
3
+ # It uses the fact that it is equivalent to a negative binomial
4
+ # distribution with parameters size=1 and prob = p (Wikipedia
5
+ # set p_{nbinomial} to be the fail probability while R takes
6
+ # it as the success one).
7
+ # Besides, since for the equality to hold the support must start
8
+ # at zero, it just substracts one from the vector of samples.
9
+ context('ChiSquare Goodness of Fit test for p=0.5')
10
+ croupier_geometric <- read.table("../generated_samples/geometric_05.data")
11
+ cs_result<-summary(goodfit(croupier_geometric$V1 - 1, type="nbinomial", method="ML", par=list(size=1, prob=0.5)))
12
+
13
+ test_that("p-value > 0.05, geometric, p = 0.5", {
14
+ expect_true(cs_result['Pearson',3] > 0.05)
15
+ })
16
+
17
+ context('ChiSquare Goodness of Fit test for p = 0.05')
18
+ croupier_geometric <- read.table("../generated_samples/geometric_005.data")
19
+ cs_result<-summary(goodfit(croupier_geometric$V1 - 1, type="nbinomial", method="ML", par=list(size=1, prob=0.05)))
20
+
21
+ test_that("p-value > 0.05, geometric, p=0.05", {
22
+ expect_true(cs_result['Pearson',3] > 0.05)
23
+ })
@@ -0,0 +1,17 @@
1
+ context('** Negative Binomial Distribution **')
2
+
3
+ context('ChiSquare Goodness of Fit test for prob=0.5, size=5')
4
+ croupier_nbinomial <- read.table("../generated_samples/nbinomial_05_5.data")
5
+ cs_result<-summary(goodfit(croupier_nbinomial$V1, type="nbinomial", method="ML", par=list(size=5, prob=0.5)))
6
+
7
+ test_that("p-value > 0.05, nbinomial, prob = 0.5, size=5", {
8
+ expect_true(cs_result['Pearson',3] > 0.05)
9
+ })
10
+
11
+ context('ChiSquare Goodness of Fit test for prob = 0.25, size=15')
12
+ croupier_nbinomial <- read.table("../generated_samples/nbinomial_025_15.data")
13
+ cs_result<-summary(goodfit(croupier_nbinomial$V1, type="nbinomial", method="ML", par=list(size=15, prob=0.25)))
14
+
15
+ test_that("p-value > 0.05, nbinomial, prob=0.25, size=15", {
16
+ expect_true(cs_result['Pearson',3] > 0.05)
17
+ })
@@ -7,11 +7,11 @@ context('Kolmogorov-Smirnov test for default mean = 0 and std = 1')
7
7
  croupier_normal <- read.table("../generated_samples/normal_0_1.data")
8
8
  ks_result<-ks.test(croupier_normal$V1, "pnorm")
9
9
 
10
- test_that("p-value > 0.05", {
10
+ test_that("p-value > 0.05, normal (0,1)", {
11
11
  expect_true(ks_result$p.value > 0.05)
12
12
  })
13
13
 
14
- test_that("statistic converging to 0", {
14
+ test_that("statistic converging to 0, normal(0,1)", {
15
15
  expect_true(as.numeric(ks_result$statistic) < 0.05)
16
16
  })
17
17
 
@@ -19,11 +19,11 @@ context('Shapiro test for default mean = 0 and std = 1')
19
19
  croupier_normal <- read.table("../generated_samples/normal_0_1.data")
20
20
  s_result<-shapiro.test(croupier_normal$V1[1:5000])
21
21
 
22
- test_that("p-value > 0.05", {
22
+ test_that("p-value > 0.05, normal (0,1)", {
23
23
  expect_true(s_result$p.value > 0.05)
24
24
  })
25
25
 
26
- test_that("statistic converging to 0", {
26
+ test_that("statistic converging to 0, normal(0,1)", {
27
27
  expect_true(as.numeric(ks_result$statistic) < 0.05)
28
28
  })
29
29
 
@@ -31,11 +31,11 @@ context('Kolmogorov-Smirnov test for given mean = 5 and std = 6')
31
31
  croupier_normal <- read.table("../generated_samples/normal_5_6.data")
32
32
  ks_result<-ks.test((croupier_normal$V1 - 5)/6, "pnorm")
33
33
 
34
- test_that("p-value > 0.05", {
34
+ test_that("p-value > 0.05, normal(5,6)", {
35
35
  expect_true(ks_result$p.value > 0.05)
36
36
  })
37
37
 
38
- test_that("statistic converging to 0", {
38
+ test_that("statistic converging to 0, normal(5,6)", {
39
39
  expect_true(as.numeric(ks_result$statistic) < 0.05)
40
40
  })
41
41
 
@@ -43,10 +43,10 @@ context('Shapiro test for default mean = 5 and std = 1')
43
43
  croupier_normal <- read.table("../generated_samples/normal_0_1.data")
44
44
  s_result<-shapiro.test((croupier_normal$V1[1:5000] - 5 ) / 6)
45
45
 
46
- test_that("p-value > 0.05", {
46
+ test_that("p-value > 0.05, normal(5,6)", {
47
47
  expect_true(s_result$p.value > 0.05)
48
48
  })
49
49
 
50
- test_that("statistic converging to 0", {
50
+ test_that("statistic converging to 0, normal(5,6)", {
51
51
  expect_true(as.numeric(ks_result$statistic) < 0.05)
52
52
  })
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: croupier
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-06-21 00:00:00.000000000 Z
13
+ date: 2012-06-22 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Croupier is a Ruby gem to generate a random sample of numbers with a
16
16
  given probability distribution.
@@ -30,6 +30,8 @@ files:
30
30
  - lib/croupier/distribution.rb
31
31
  - lib/croupier/distributions/cauchy.rb
32
32
  - lib/croupier/distributions/exponential.rb
33
+ - lib/croupier/distributions/geometric.rb
34
+ - lib/croupier/distributions/nbinomial.rb
33
35
  - lib/croupier/distributions/normal.rb
34
36
  - lib/croupier/distributions/poisson.rb
35
37
  - lib/croupier/distributions/triangular.rb
@@ -38,6 +40,8 @@ files:
38
40
  - lib/croupier.rb
39
41
  - test/distributions/R_tests/test_cauchy.R
40
42
  - test/distributions/R_tests/test_exponential.R
43
+ - test/distributions/R_tests/test_geometric.R
44
+ - test/distributions/R_tests/test_nbinomial.R
41
45
  - test/distributions/R_tests/test_normal.R
42
46
  - test/distributions/R_tests/test_poisson.R
43
47
  - test/distributions/R_tests/test_triangular.R
@@ -76,6 +80,8 @@ summary: Samples of random numbers with specific probability distributions
76
80
  test_files:
77
81
  - test/distributions/R_tests/test_cauchy.R
78
82
  - test/distributions/R_tests/test_exponential.R
83
+ - test/distributions/R_tests/test_geometric.R
84
+ - test/distributions/R_tests/test_nbinomial.R
79
85
  - test/distributions/R_tests/test_normal.R
80
86
  - test/distributions/R_tests/test_poisson.R
81
87
  - test/distributions/R_tests/test_triangular.R