Module: Distribution::Hypergeometric::Ruby_

Defined in:
lib/distribution/hypergeometric/ruby.rb

Class Method Summary collapse

Class Method Details

.bc(n, k) ⇒ Object



8
9
10
# File 'lib/distribution/hypergeometric/ruby.rb', line 8

def bc(n,k)
  Math.binomial_coefficient(n,k)
end

.cdf(k, m, n, total) ⇒ Object Also known as: exact_cdf

Cumulative distribution function. The probability of obtain, from a sample of size n, k or less elements in a population size total with m interesting elements.

Slow, but secure

Raises:

  • (ArgumentError)


49
50
51
52
53
54
55
# File 'lib/distribution/hypergeometric/ruby.rb', line 49

def cdf(k, m, n, total)
  raise(ArgumentError, "k>m") if k>m
  raise(ArgumentError, "k>n") if k>n
  # Store the den
  den=bc(total,n)
  (0..k).collect { |ki| pdf_with_den(ki,m,n,total,den) }.inject { |sum,v| sum+v}
end

.p_value(pr, m, n, total) ⇒ Object Also known as: exact_p_value

p-value:



34
35
36
37
38
39
40
41
42
# File 'lib/distribution/hypergeometric/ruby.rb', line 34

def p_value(pr, m, n, total)
  ac=0
  den=bc(total,n)
  
  (0..total).each do |i|
    ac+=pdf_with_den(i,m,n,total,den)
    return i if ac>=pr
  end
end

.pdf(k, m, n, total) ⇒ Object Also known as: exact_pdf

Hypergeometric probability density function

Probability p(k, m, n, total) of drawing sets of size m and n with an intersection of size k from a total pool of size total, without replacement.

References



19
20
21
22
23
24
# File 'lib/distribution/hypergeometric/ruby.rb', line 19

def pdf(k, m, n, total)
  min_m_n=m<n ? m : n
  max_t=[0,m+n-total].max
  return 0 if k>min_m_n or k<max_t
  (bc(m,k) * bc(total-m,n-k)).quo(bc(total,n))
end

.pdf_with_den(k, m, n, total, den) ⇒ Object



28
29
30
# File 'lib/distribution/hypergeometric/ruby.rb', line 28

def pdf_with_den(k,m,n,total,den)
  (bc(m,k) * bc(total-m,n-k)).quo(den)
end