lib/distribution/chisquare/ruby.rb in distribution-0.7.3 vs lib/distribution/chisquare/ruby.rb in distribution-0.8.0

- old
+ new

@@ -1,30 +1,28 @@ module Distribution module ChiSquare module Ruby_ class << self - include Math - def pdf(x,n) + def pdf(x, n) if n == 1 - 1.0/Math.sqrt(2 * Math::PI * x) * Math::E**(-x/2.0) + 1.0 / Math.sqrt(2 * Math::PI * x) * Math::E**(-x / 2.0) elsif n == 2 - 0.5 * Math::E**(-x/2.0) + 0.5 * Math::E**(-x / 2.0) else n = n.to_f - n2 = n/2 + n2 = n / 2 x = x.to_f - 1.0 / 2**n2 / gamma(n2) * x**(n2 - 1.0) * Math.exp(-x/2.0) - end + 1.0 / 2**n2 / gamma(n2) * x**(n2 - 1.0) * Math.exp(-x / 2.0) + end end - - + # CDF Inverse over [x, \infty) # Pr([x, \infty)) = y -> x def pchi2(n, y) if n == 1 - w = Distribution::Normal.p_value(1 - y/2) # = p1.0-Distribution::Normal.cdf(y/2) + w = Distribution::Normal.p_value(1 - y / 2) # = p1.0-Distribution::Normal.cdf(y/2) w * w elsif n == 2 # v = (1.0 / y - 1.0) / 33.0 # newton_a(y, v) {|x| [q_chi2(n, x), -chi2dens(n, x)] } -2.0 * Math.log(y) @@ -32,58 +30,60 @@ eps = 1.0e-5 v = 0.0 s = 10.0 loop do v += s - if s <= eps then break end + break if s <= eps if (qe = q_chi2(n, v) - y) == 0.0 then break end if qe < 0.0 - v -= s - s /= 10.0 + v -= s + s /= 10.0 + end end - end - v + v end end - def p_value(pr,k) - pchi2(k, 1.0-pr) + def cdf(x, k) + 1.0 - q_chi2(k, x) end - def cdf(x,k) - 1.0-q_chi2(k,x) - end - # chi-square distribution ([1]) # Integral over [x, \infty) def q_chi2(df, chi2) chi2 = chi2.to_f if (df & 1) != 0 chi = Math.sqrt(chi2) - if (df == 1) then return 2 * (1.0-Distribution::Normal.cdf(chi)); end + return 2 * (1.0 - Distribution::Normal.cdf(chi)) if (df == 1) s = t = chi * Math.exp(-0.5 * chi2) / SQ2PI k = 3 while k < df - t *= chi2 / k; s += t; + t *= chi2 / k; s += t k += 2 end - 2 * (1.0-(Distribution::Normal.cdf(chi)) + s) + 2 * (1.0 - (Distribution::Normal.cdf(chi)) + s) else s = t = Math.exp(-0.5 * chi2) k = 2 while k < df - t *= chi2 / k; s += t; + t *= chi2 / k; s += t k += 2 end s end end + + def quantile(pr, k) + pchi2(k, 1.0 - pr) + end + + alias_method :p_value, :quantile end end end end