diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 76932db6f6..b8857b2fe2 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1641,7 +1641,22 @@ def logp(value, b, kappa, mu): kappa > 0, msg="b > 0, kappa > 0", ) - + def icdf(value, b, kappa, mu): + res = pt.switch(pt.le(b, 0), + lambda: ValueError("Scale Parameter b must be positive"), + pt.switch( + pt.le(value, 0.5), + lambda: mu - (b / kappa) * pt.log(2 * value), + lambda: mu + (b / kappa) * pt.log(2 * (1 - value)) + ) + ) + res = check_icdf_parameters(res, value) + return check_icdf_parameters( + res, + b > 0, + kappa > 0, + msg="b > 0, kappa > 0" + ) class LogNormal(PositiveContinuous): r""" diff --git a/tests/distributions/test_continuous.py b/tests/distributions/test_continuous.py index 80bbb816c8..f2041ed22d 100644 --- a/tests/distributions/test_continuous.py +++ b/tests/distributions/test_continuous.py @@ -488,6 +488,11 @@ def test_laplace_asymmetric(self): laplace_asymmetric_logpdf, decimal=select_by_precision(float64=6, float32=2), ) + check_icdf( + pm.AsymmetricLaplace, + {"b": Rplus, "kappa": Rplus, "mu": R}, + lambda q, kappa, mu, b: st.laplace_asymmetric.ppf(q, kappa, mu, b) + ) def test_lognormal(self): check_logp(