Module: Distribution::Normal::Ruby_
- Defined in:
- lib/distribution/normal/ruby.rb
Class Method Summary collapse
-
.cdf(z) ⇒ Object
Normal cumulative distribution function (cdf).
-
.pdf(x) ⇒ Object
Normal probability density function (pdf) With x=0 and sigma=1.
-
.quantile(qn) ⇒ Object
(also: p_value)
Return the inverse CDF or P-value of the corresponding integral.
-
.rng(mean = 0, sigma = 1, seed = nil) ⇒ Object
Return a Proc object which returns a random number drawn from the normal distribution with mean
meanand standard deviationsigma, i.e. -
.rngu ⇒ Object
random number within a gaussian distribution X ~ N(0,1).
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 distributionsigma- standard deviation, a strictly positive numberseed- 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 |
.rngu ⇒ Object
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 |