Module: Distribution::Normal::Ruby_

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

Class Method Summary collapse

Class Method Details

.cdf(z) ⇒ Object

Normal cumulative distribution function (cdf).

Returns the integral of normal distribution over (-Infty, z].


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/distribution/normal/ruby.rb', line 58

def cdf(z)
  return 0.0 if z < -12
  return 1.0 if z > 12
  return 0.5 if z == 0.0

  if z > 0.0
    e = true
  else
    e = false
    z = -z
  end
  z = z.to_f
  z2 = z * z
  t = q = z * Math.exp(-0.5 * z2) / SQ2PI

  3.step(199, 2) do |i|
    prev = q
    t *= z2 / i
    q += t
    return(e ? 0.5 + q : 0.5 - q) if q <= prev
  end
  e ? 1.0 : 0.0
end

.pdf(x) ⇒ Object

Normal probability density function (pdf) With x=0 and sigma=1


49
50
51
# File 'lib/distribution/normal/ruby.rb', line 49

def pdf(x)
  (1.0 / SQ2PI) * Math.exp(-(x**2 / 2.0))
end

.quantile(qn) ⇒ Object Also known as: p_value

Return the inverse CDF or P-value of the corresponding integral


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/distribution/normal/ruby.rb', line 83

def quantile(qn)
  b = [1.570796288, 0.03706987906, -0.8364353589e-3,
       -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5,
       -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8,
       0.3657763036e-10, 0.6936233982e-12]

  if qn < 0.0 || 1.0 < qn
    $stderr.printf("Error : qn <= 0 or qn >= 1  in pnorm()!\n")
    return 0.0
  end
  qn == 0.5 and return 0.0

  w1 = qn
  w3 = -Math.log(4.0 * w1 * (1.0 - w1))
  w1 = b[0]
  1.upto 10 do |i|
    w1 += b[i] * w3**i
  end
  qn > 0.5 and return Math.sqrt(w1 * w3)
  -Math.sqrt(w1 * w3)
end

.rng(mean = 0, sigma = 1, seed = nil) ⇒ Object

Return a Proc object which returns a random number drawn from the normal distribution with mean +mean+ and standard deviation +sigma+, i.e. from N(+mean+,+sigma+^2).

== Arguments

  • +mean+ - mean of the normal distribution
  • +sigma+ - standard deviation, a strictly positive number
  • +seed+ - seed, an integer value to set the initial state

== Reference


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/distribution/normal/ruby.rb', line 17

def rng(mean = 0, sigma = 1, seed = nil)
  seed = Random.new_seed if seed.nil?
  r = Random.new(seed)
  returned = 0
  y1 = 0
  y2 = 0
  lambda do
    if returned == 0
      begin
        x1 = 2.0 * r.rand - 1.0
        x2 = 2.0 * r.rand - 1.0
        w = x1 * x1 + x2 * x2
      end while (w >= 1.0)
      w = Math.sqrt((-2.0 * Math.log(w)) / w)
      y1 = x1 * w
      y2 = x2 * w
      returned = 1
      y1 * sigma + mean
    else
      returned = 0
      y2 * sigma + mean
    end
  end
end

.rnguObject

random number within a gaussian distribution X ~ N(0,1)


43
44
45
# File 'lib/distribution/normal/ruby.rb', line 43

def rngu
  rng(0, 1, nil)
end