1
+ using Roots
2
+
1
3
# Various algorithms for computing quantile
2
4
3
5
function quantile_bisect (d:: ContinuousUnivariateDistribution , p:: Real , lx:: T , rx:: T ) where {T<: Real }
@@ -48,20 +50,20 @@ quantile_bisect(d::ContinuousUnivariateDistribution, p::Real) =
48
50
# http://www.statsci.org/smyth/pubs/qinvgaussPreprint.pdf
49
51
50
52
function newton (f, xs:: T = mode (d), tol:: Real = 1e-12 ) where {T}
51
- x = xs + f (xs)
53
+ x = xs - f (xs)
52
54
@assert typeof (x) === T
53
55
x0 = T (xs)
54
56
while abs (x- x0) > max (abs (x),abs (x0)) * tol
55
57
x0 = x
56
- x = x0 + f (x0)
58
+ x = x0 - f (x0)
57
59
end
58
60
return x
59
61
end
60
62
61
63
function quantile_newton (d:: ContinuousUnivariateDistribution , p:: Real , xs:: Real = mode (d), tol:: Real = 1e-12 )
62
- f (x) = ( p - cdf (d, x)) / pdf (d, x)
64
+ f (x) = - (( p - cdf (d, x)) / pdf (d, x) )
63
65
# FIXME : can this be expressed via `promote_type()`? Test coverage missing.
64
- x = xs + f (xs)
66
+ x = xs - f (xs)
65
67
T = typeof (x)
66
68
if 0 < p < 1
67
69
return newton (f, T (xs), tol)
@@ -75,9 +77,9 @@ function quantile_newton(d::ContinuousUnivariateDistribution, p::Real, xs::Real=
75
77
end
76
78
77
79
function cquantile_newton (d:: ContinuousUnivariateDistribution , p:: Real , xs:: Real = mode (d), tol:: Real = 1e-12 )
78
- f (x) = ( ccdf (d, x)- p) / pdf (d, x)
80
+ f (x) = - (( ccdf (d, x)- p) / pdf (d, x) )
79
81
# FIXME : can this be expressed via `promote_type()`? Test coverage missing.
80
- x = xs + f (xs)
82
+ x = xs - f (xs)
81
83
T = typeof (x)
82
84
if 0 < p < 1
83
85
return newton (f, T (xs), tol)
92
94
93
95
function invlogcdf_newton (d:: ContinuousUnivariateDistribution , lp:: Real , xs:: Real = mode (d), tol:: Real = 1e-12 )
94
96
T = typeof (lp - logpdf (d,xs))
95
- f_a (x) = - exp (lp - logpdf (d,x) + logexpm1 (max (logcdf (d,x)- lp,0 )))
96
- f_b (x) = exp (lp - logpdf (d,x) + log1mexp (min (logcdf (d,x)- lp,0 )))
97
+ f_a (x) = exp (lp - logpdf (d,x) + logexpm1 (max (logcdf (d,x)- lp,0 )))
98
+ f_b (x) = - exp (lp - logpdf (d,x) + log1mexp (min (logcdf (d,x)- lp,0 )))
97
99
if - Inf < lp < 0
98
100
x0 = T (xs)
99
101
if lp < logcdf (d,x0)
113
115
114
116
function invlogccdf_newton (d:: ContinuousUnivariateDistribution , lp:: Real , xs:: Real = mode (d), tol:: Real = 1e-12 )
115
117
T = typeof (lp - logpdf (d,xs))
116
- f_a (x) = exp (lp - logpdf (d,x) + logexpm1 (max (logccdf (d,x)- lp,0 )))
117
- f_b (x) = - exp (lp - logpdf (d,x) + log1mexp (min (logccdf (d,x)- lp,0 )))
118
+ f_a (x) = - exp (lp - logpdf (d,x) + logexpm1 (max (logccdf (d,x)- lp,0 )))
119
+ f_b (x) = exp (lp - logpdf (d,x) + log1mexp (min (logccdf (d,x)- lp,0 )))
118
120
if - Inf < lp < 0
119
121
x0 = T (xs)
120
122
if lp < logccdf (d,x0)
0 commit comments