distribution 0.7.3 → 0.8.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.
- checksums.yaml +5 -5
- data/.travis.yml +4 -6
- data/.yardopts +5 -0
- data/History.txt +3 -0
- data/README.md +87 -44
- data/benchmark/binomial_coefficient.rb +19 -23
- data/benchmark/binomial_coefficient/experiment.rb +33 -36
- data/benchmark/factorial_hash.rb +7 -8
- data/benchmark/factorial_method.rb +4 -6
- data/benchmark/odd.rb +6 -7
- data/benchmark/power.rb +11 -11
- data/bin/distribution +26 -26
- data/distribution.gemspec +3 -4
- data/lib/distribution.rb +55 -96
- data/lib/distribution/beta/gsl.rb +10 -5
- data/lib/distribution/beta/ruby.rb +3 -1
- data/lib/distribution/binomial/ruby.rb +5 -2
- data/lib/distribution/bivariatenormal.rb +4 -5
- data/lib/distribution/bivariatenormal/gsl.rb +2 -2
- data/lib/distribution/bivariatenormal/java.rb +1 -1
- data/lib/distribution/bivariatenormal/ruby.rb +245 -254
- data/lib/distribution/chisquare.rb +8 -10
- data/lib/distribution/chisquare/gsl.rb +24 -19
- data/lib/distribution/chisquare/java.rb +1 -1
- data/lib/distribution/chisquare/ruby.rb +25 -25
- data/lib/distribution/chisquare/statistics2.rb +16 -13
- data/lib/distribution/distributable.rb +40 -0
- data/lib/distribution/exponential.rb +4 -5
- data/lib/distribution/exponential/gsl.rb +13 -9
- data/lib/distribution/exponential/ruby.rb +14 -9
- data/lib/distribution/f.rb +1 -1
- data/lib/distribution/f/gsl.rb +26 -22
- data/lib/distribution/f/java.rb +1 -1
- data/lib/distribution/f/ruby.rb +16 -19
- data/lib/distribution/f/statistics2.rb +22 -19
- data/lib/distribution/gamma.rb +5 -7
- data/lib/distribution/gamma/gsl.rb +13 -9
- data/lib/distribution/gamma/java.rb +1 -1
- data/lib/distribution/gamma/ruby.rb +5 -11
- data/lib/distribution/hypergeometric.rb +5 -8
- data/lib/distribution/hypergeometric/gsl.rb +4 -5
- data/lib/distribution/hypergeometric/java.rb +1 -1
- data/lib/distribution/hypergeometric/ruby.rb +34 -35
- data/lib/distribution/logistic.rb +5 -8
- data/lib/distribution/logistic/ruby.rb +13 -8
- data/lib/distribution/lognormal.rb +5 -7
- data/lib/distribution/lognormal/gsl.rb +8 -6
- data/lib/distribution/lognormal/ruby.rb +5 -9
- data/lib/distribution/math_extension.rb +6 -15
- data/lib/distribution/math_extension/chebyshev_series.rb +281 -272
- data/lib/distribution/math_extension/erfc.rb +26 -29
- data/lib/distribution/math_extension/exponential_integral.rb +17 -17
- data/lib/distribution/math_extension/gammastar.rb +19 -20
- data/lib/distribution/math_extension/gsl_utilities.rb +12 -12
- data/lib/distribution/math_extension/incomplete_beta.rb +52 -61
- data/lib/distribution/math_extension/incomplete_gamma.rb +166 -168
- data/lib/distribution/math_extension/log_utilities.rb +20 -22
- data/lib/distribution/normal.rb +11 -13
- data/lib/distribution/normal/gsl.rb +13 -10
- data/lib/distribution/normal/java.rb +14 -13
- data/lib/distribution/normal/ruby.rb +68 -58
- data/lib/distribution/normal/statistics2.rb +5 -2
- data/lib/distribution/normalmultivariate.rb +64 -64
- data/lib/distribution/poisson.rb +11 -13
- data/lib/distribution/poisson/gsl.rb +7 -7
- data/lib/distribution/poisson/java.rb +19 -24
- data/lib/distribution/poisson/ruby.rb +38 -9
- data/lib/distribution/shorthand.rb +17 -0
- data/lib/distribution/t.rb +13 -15
- data/lib/distribution/t/gsl.rb +27 -24
- data/lib/distribution/t/java.rb +1 -1
- data/lib/distribution/t/ruby.rb +99 -100
- data/lib/distribution/t/statistics2.rb +19 -19
- data/lib/distribution/uniform.rb +26 -0
- data/lib/distribution/uniform/gsl.rb +36 -0
- data/lib/distribution/uniform/ruby.rb +91 -0
- data/lib/distribution/version.rb +1 -1
- data/lib/distribution/weibull.rb +6 -7
- data/lib/distribution/weibull/gsl.rb +16 -16
- data/lib/distribution/weibull/ruby.rb +30 -23
- data/spec/beta_spec.rb +45 -47
- data/spec/binomial_spec.rb +77 -85
- data/spec/bivariatenormal_spec.rb +28 -35
- data/spec/chisquare_spec.rb +48 -52
- data/spec/distribution_spec.rb +10 -10
- data/spec/exponential_spec.rb +44 -49
- data/spec/f_spec.rb +4 -4
- data/spec/gamma_spec.rb +50 -53
- data/spec/hypergeometric_spec.rb +63 -69
- data/spec/logistic_spec.rb +32 -37
- data/spec/lognormal_spec.rb +25 -31
- data/spec/math_extension_spec.rb +192 -210
- data/spec/normal_spec.rb +80 -73
- data/spec/poisson_spec.rb +63 -41
- data/spec/shorthand_spec.rb +19 -22
- data/spec/spec_helper.rb +8 -9
- data/spec/t_spec.rb +63 -77
- data/spec/uniform_spec.rb +154 -0
- data/spec/weibull_spec.rb +13 -14
- metadata +17 -8
data/lib/distribution/poisson.rb
CHANGED
@@ -2,33 +2,31 @@ require 'distribution/poisson/ruby'
|
|
2
2
|
require 'distribution/poisson/gsl'
|
3
3
|
require 'distribution/poisson/java'
|
4
4
|
|
5
|
-
|
6
5
|
module Distribution
|
7
6
|
# From Wikipedia
|
8
|
-
# In probability theory and statistics, the Poisson distribution is
|
9
|
-
# a discrete probability distribution that expresses the probability of
|
10
|
-
# a number of events occurring in a fixed period of time if these
|
11
|
-
# events occur with a known average rate and independently of the time
|
7
|
+
# In probability theory and statistics, the Poisson distribution is
|
8
|
+
# a discrete probability distribution that expresses the probability of
|
9
|
+
# a number of events occurring in a fixed period of time if these
|
10
|
+
# events occur with a known average rate and independently of the time
|
12
11
|
# since the last event.
|
13
12
|
module Poisson
|
14
|
-
SHORTHAND='pois'
|
13
|
+
SHORTHAND = 'pois'
|
15
14
|
extend Distributable
|
16
15
|
create_distribution_methods
|
17
16
|
|
18
17
|
##
|
19
18
|
# :singleton-method: pdf(k , l)
|
20
|
-
# PDF for Poisson distribution,
|
21
|
-
# [+k+] is the number of occurrences of an event
|
19
|
+
# PDF for Poisson distribution,
|
20
|
+
# [+k+] is the number of occurrences of an event
|
22
21
|
# [+l+] is a positive real number, equal to the expected number of occurrences that occur during the given interval.
|
23
|
-
|
22
|
+
|
24
23
|
##
|
25
24
|
# :singleton-method: cdf(k , l)
|
26
25
|
# CDF for Poisson distribution
|
27
|
-
# [+k+] is the number of occurrences of an event
|
28
|
-
# [+l+] is a positive real number, equal to the expected number of occurrences that occur during the given interval.
|
29
|
-
|
26
|
+
# [+k+] is the number of occurrences of an event
|
27
|
+
# [+l+] is a positive real number, equal to the expected number of occurrences that occur during the given interval.
|
28
|
+
|
30
29
|
# TODO: Not implemented yet
|
31
30
|
# :singleton-method: p_value(pr , l)
|
32
|
-
|
33
31
|
end
|
34
32
|
end
|
@@ -2,16 +2,16 @@ module Distribution
|
|
2
2
|
module Poisson
|
3
3
|
module GSL_
|
4
4
|
class << self
|
5
|
-
def pdf(k,l)
|
6
|
-
return 0 if k<0
|
7
|
-
GSL::Ran.poisson_pdf(k,l.to_f)
|
5
|
+
def pdf(k, l)
|
6
|
+
return 0 if k < 0
|
7
|
+
GSL::Ran.poisson_pdf(k, l.to_f)
|
8
8
|
end
|
9
|
-
|
10
|
-
|
9
|
+
|
10
|
+
def cdf(k, l)
|
11
|
+
return 0 if k < 0
|
11
12
|
GSL::Cdf.poisson_P(k, l.to_f)
|
12
13
|
end
|
13
|
-
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
end
|
17
|
+
end
|
@@ -2,30 +2,25 @@ module Distribution
|
|
2
2
|
module Poisson
|
3
3
|
module Java_
|
4
4
|
class << self
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
# def p_value(pr,l)
|
25
|
-
# dist = create_distribution(l)
|
26
|
-
# dist.inverseCumulativeProbability(pr)
|
27
|
-
# end
|
5
|
+
#==
|
6
|
+
# Create the PoissonDistributionImpl object for use in calculations
|
7
|
+
# with mean of l
|
8
|
+
def create_distribution(l)
|
9
|
+
PoissonDistributionImpl.new(l)
|
10
|
+
end
|
11
|
+
|
12
|
+
#==
|
13
|
+
#
|
14
|
+
def pdf(k, l)
|
15
|
+
dist = create_distribution(l)
|
16
|
+
dist.probability(k)
|
17
|
+
end
|
18
|
+
|
19
|
+
def cdf(k, l)
|
20
|
+
dist = create_distribution(l)
|
21
|
+
dist.cumulativeProbability(k)
|
22
|
+
end
|
28
23
|
end
|
29
24
|
end
|
30
25
|
end
|
31
|
-
end
|
26
|
+
end
|
@@ -2,20 +2,49 @@ module Distribution
|
|
2
2
|
module Poisson
|
3
3
|
module Ruby_
|
4
4
|
class << self
|
5
|
-
|
6
|
-
|
5
|
+
|
6
|
+
# Return a Proc object which returns a random number drawn
|
7
|
+
# from the poisson distribution with lambda.
|
8
|
+
#
|
9
|
+
# == Arguments
|
10
|
+
# * +lambda_val+ - mean of the poisson distribution
|
11
|
+
# * +seed+ - seed, an integer value to set the initial state
|
12
|
+
#
|
13
|
+
# == Algorithm
|
14
|
+
# * Donald Knuth
|
15
|
+
#
|
16
|
+
def rng(lambda_val = 1, seed = nil)
|
17
|
+
seed = Random.new_seed if seed.nil?
|
18
|
+
r = Random.new(seed).rand
|
19
|
+
x = 0
|
20
|
+
l = Math.exp(-lambda_val)
|
21
|
+
s = l
|
22
|
+
while r > s
|
23
|
+
x += 1
|
24
|
+
l *= lambda_val / x.to_f
|
25
|
+
s += l
|
26
|
+
end
|
27
|
+
x
|
28
|
+
end
|
29
|
+
|
30
|
+
def pdf(k, l)
|
31
|
+
(l**k * Math.exp(-l)).quo(Math.factorial(k))
|
7
32
|
end
|
8
|
-
|
9
|
-
|
33
|
+
|
34
|
+
def cdf(k, l)
|
35
|
+
Math.exp(-l) * (0..k).inject(0) { |ac, i| ac + (l**i).quo(Math.factorial(i)) }
|
10
36
|
end
|
11
|
-
|
12
|
-
|
37
|
+
|
38
|
+
def quantile(prob, l)
|
39
|
+
ac = 0
|
13
40
|
(0..100).each do |i|
|
14
|
-
ac+=pdf(i,l)
|
15
|
-
return i if prob<=ac
|
41
|
+
ac += pdf(i, l)
|
42
|
+
return i if prob <= ac
|
16
43
|
end
|
17
44
|
end
|
45
|
+
|
46
|
+
alias_method :p_value, :quantile
|
18
47
|
end
|
19
48
|
end
|
20
49
|
end
|
21
|
-
end
|
50
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Distribution
|
2
|
+
module Shorthand
|
3
|
+
EQUIVALENCES = { p_value: :p, cdf: :cdf, pdf: :pdf, rng: :r,
|
4
|
+
exact_pdf: :epdf, exact_cdf: :ecdf, exact_p_value: :ep }
|
5
|
+
|
6
|
+
def self.add_shortcut(shortcut, method, &block)
|
7
|
+
if EQUIVALENCES.include? method.to_sym
|
8
|
+
name = shortcut + "_#{method}"
|
9
|
+
define_method(name, &block)
|
10
|
+
|
11
|
+
name = shortcut + "_#{EQUIVALENCES[method.to_sym]}"
|
12
|
+
define_method(name, &block)
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/distribution/t.rb
CHANGED
@@ -6,26 +6,24 @@ require 'distribution/t/gsl'
|
|
6
6
|
require 'distribution/t/java'
|
7
7
|
|
8
8
|
module Distribution
|
9
|
+
# Calculate statisticals for T Distribution.
|
10
|
+
module T
|
11
|
+
SHORTHAND = 'tdist'
|
12
|
+
extend Distributable
|
13
|
+
create_distribution_methods
|
9
14
|
|
10
|
-
# Calculate statisticals for T Distribution.
|
11
|
-
module T
|
12
|
-
SHORTHAND='tdist'
|
13
|
-
extend Distributable
|
14
|
-
create_distribution_methods
|
15
|
-
|
16
15
|
##
|
17
16
|
# :singleton-method: pdf(x,k)
|
18
|
-
# Returns the integral of T distribution
|
19
|
-
# with +k+ degrees of freedom over [0, +x+]
|
20
|
-
|
17
|
+
# Returns the integral of T distribution
|
18
|
+
# with +k+ degrees of freedom over [0, +x+]
|
21
19
|
##
|
22
20
|
# :singleton-method: p_value(qn, k)
|
23
|
-
# Return the P-value of the corresponding integral +qn+ with
|
24
|
-
# +k+ degrees of freedom
|
25
|
-
|
21
|
+
# Return the P-value of the corresponding integral +qn+ with
|
22
|
+
# +k+ degrees of freedom
|
23
|
+
|
26
24
|
##
|
27
25
|
# :singleton-method: cdf(x,k)
|
28
|
-
# Returns the integral of T distribution
|
29
|
-
# with +k+ degrees of freedom over [0, +x+]
|
30
|
-
|
26
|
+
# Returns the integral of T distribution
|
27
|
+
# with +k+ degrees of freedom over [0, +x+]
|
28
|
+
end
|
31
29
|
end
|
data/lib/distribution/t/gsl.rb
CHANGED
@@ -1,29 +1,32 @@
|
|
1
1
|
module Distribution
|
2
2
|
module T
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
3
|
+
module GSL_
|
4
|
+
class << self
|
5
|
+
def pdf(x, k)
|
6
|
+
GSL::Ran.tdist_pdf(x, k)
|
7
|
+
end
|
8
|
+
|
9
|
+
# F cumulative distribution function (cdf).
|
10
|
+
#
|
11
|
+
# Returns the integral of F-distribution
|
12
|
+
# with k1 and k2 degrees of freedom
|
13
|
+
# over [0, x].
|
14
|
+
# Distribution::F.cdf(20,3,2)
|
15
|
+
#
|
16
|
+
def cdf(x, k)
|
17
|
+
GSL::Cdf.tdist_P(x.to_f, k)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return the P-value of the corresponding integral with
|
21
|
+
# k degrees of freedom
|
22
|
+
#
|
23
|
+
# Distribution::F.p_value(0.95,1,2)
|
24
|
+
def quantile(pr, k)
|
25
|
+
GSL::Cdf.tdist_Pinv(pr, k)
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :p_value, :quantile
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
28
|
-
|
29
|
-
end
|
32
|
+
end
|
data/lib/distribution/t/java.rb
CHANGED
data/lib/distribution/t/ruby.rb
CHANGED
@@ -1,111 +1,110 @@
|
|
1
1
|
module Distribution
|
2
2
|
module T
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
# Returns the integral of t-distribution with n degrees of freedom over (-Infty, x].
|
10
|
-
def cdf(t, n)
|
11
|
-
p_t(n, t)
|
12
|
-
end
|
13
|
-
|
14
|
-
# t-distribution ([1])
|
15
|
-
# (-\infty, x]
|
16
|
-
def p_t(df, t)
|
17
|
-
if df.to_i!=df
|
18
|
-
x=(t+Math.sqrt(t**2+df)) / (2*Math.sqrt(t**2+df))
|
19
|
-
return Math.regularized_beta(x,df/2.0,df/2.0)
|
3
|
+
module Ruby_
|
4
|
+
class << self
|
5
|
+
def pdf(t, v)
|
6
|
+
((Math.gamma((v + 1) / 2.0)) / (Math.sqrt(v * Math::PI) * Math.gamma(v / 2.0))) * ((1 + (t**2 / v.to_f))**(-(v + 1) / 2.0))
|
20
7
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
p = 0.0;
|
26
|
-
i = df % 2 + 2
|
27
|
-
while i <= df
|
28
|
-
p += s
|
29
|
-
s *= (i - 1) * c2 / i
|
30
|
-
i += 2
|
8
|
+
|
9
|
+
# Returns the integral of t-distribution with n degrees of freedom over (-Infty, x].
|
10
|
+
def cdf(t, n)
|
11
|
+
p_t(n, t)
|
31
12
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
13
|
+
|
14
|
+
# t-distribution ([1])
|
15
|
+
# (-\infty, x]
|
16
|
+
def p_t(df, t)
|
17
|
+
if df.to_i != df
|
18
|
+
x = (t + Math.sqrt(t**2 + df)) / (2 * Math.sqrt(t**2 + df))
|
19
|
+
return Math.regularized_beta(x, df / 2.0, df / 2.0)
|
20
|
+
end
|
21
|
+
df = df.to_i
|
22
|
+
c2 = df.to_f / (df + t * t)
|
23
|
+
s = Math.sqrt(1.0 - c2)
|
24
|
+
s = -s if t < 0.0
|
25
|
+
p = 0.0
|
26
|
+
i = df % 2 + 2
|
27
|
+
while i <= df
|
28
|
+
p += s
|
29
|
+
s *= (i - 1) * c2 / i
|
30
|
+
i += 2
|
31
|
+
end
|
32
|
+
|
33
|
+
if df.is_a?(Float) || df & 1 != 0
|
34
|
+
0.5 + (p * Math.sqrt(c2) + Math.atan(t / Math.sqrt(df))) / Math::PI
|
35
|
+
else
|
36
|
+
(1.0 + p) / 2.0
|
37
|
+
end
|
37
38
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def pt(q, n)
|
68
|
-
q = q.to_f
|
69
|
-
if(q < 1.0e-5 || q > 1.0 || n < 1)
|
70
|
-
$stderr.printf("Error : Illegal parameter in pt()!\n")
|
71
|
-
return 0.0
|
39
|
+
|
40
|
+
# inverse of t-distribution ([2])
|
41
|
+
# (-\infty, -q/2] + [q/2, \infty)
|
42
|
+
def ptsub(q, n)
|
43
|
+
q = q.to_f
|
44
|
+
if n == 1 && 0.001 < q && q < 0.01
|
45
|
+
eps = 1.0e-4
|
46
|
+
elsif n == 2 && q < 0.0001
|
47
|
+
eps = 1.0e-4
|
48
|
+
elsif n == 1 && q < 0.001
|
49
|
+
eps = 1.0e-2
|
50
|
+
else
|
51
|
+
eps = 1.0e-5
|
52
|
+
end
|
53
|
+
s = 10_000.0
|
54
|
+
w = 0.0
|
55
|
+
loop do
|
56
|
+
w += s
|
57
|
+
return w if (s <= eps)
|
58
|
+
if ((qe = 2.0 - p_t(n, w) * 2.0 - q) == 0.0) then return w end
|
59
|
+
if qe < 0.0
|
60
|
+
w -= s
|
61
|
+
s /= 10.0 # /
|
62
|
+
end
|
63
|
+
end
|
72
64
|
end
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
- pt(y*2.0, n)
|
65
|
+
|
66
|
+
def pt(q, n)
|
67
|
+
q = q.to_f
|
68
|
+
if q < 1.0e-5 || q > 1.0 || n < 1
|
69
|
+
$stderr.printf("Error : Illegal parameter in pt()!\n")
|
70
|
+
return 0.0
|
71
|
+
end
|
72
|
+
|
73
|
+
return ptsub(q, n) if (n <= 5)
|
74
|
+
return ptsub(q, n) if q <= 5.0e-3 && n <= 13
|
75
|
+
|
76
|
+
f1 = 4.0 * (f = n.to_f)
|
77
|
+
f5 = (f4 = (f3 = (f2 = f * f) * f) * f) * f
|
78
|
+
f2 *= 96.0
|
79
|
+
f3 *= 384.0
|
80
|
+
f4 *= 92_160.0
|
81
|
+
f5 *= 368_640.0
|
82
|
+
u = Normal.p_value(1.0 - q / 2.0)
|
83
|
+
|
84
|
+
w0 = (u2 = u * u) * u
|
85
|
+
w1 = w0 * u2
|
86
|
+
w2 = w1 * u2
|
87
|
+
w3 = w2 * u2
|
88
|
+
w4 = w3 * u2
|
89
|
+
w = (w0 + u) / f1
|
90
|
+
w += (5.0 * w1 + 16.0 * w0 + 3.0 * u) / f2
|
91
|
+
w += (3.0 * w2 + 19.0 * w1 + 17.0 * w0 - 15.0 * u) / f3
|
92
|
+
w += (79.0 * w3 + 776.0 * w2 + 1482.0 * w1 - 1920.0 * w0 - 9450.0 * u) / f4
|
93
|
+
w += (27.0 * w4 + 339.0 * w3 + 930.0 * w2 - 1782.0 * w1 - 765.0 * w0 + 17_955.0 * u) / f5
|
94
|
+
u + w
|
104
95
|
end
|
96
|
+
|
97
|
+
# Returns the P-value of tdist().
|
98
|
+
def quantile(y, n)
|
99
|
+
if y > 0.5
|
100
|
+
pt(2.0 - y * 2.0, n)
|
101
|
+
else
|
102
|
+
- pt(y * 2.0, n)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
alias_method :p_value, :quantile
|
105
107
|
end
|
106
|
-
|
107
|
-
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
111
|
-
end
|