diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index d5e69fc79..8fe32b1b4 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -29,7 +29,7 @@ from pytensor.tensor import gammaln, get_underlying_scalar_constant_value from pytensor.tensor.exceptions import NotScalarConstantError from pytensor.tensor.extra_ops import broadcast_shape -from pytensor.tensor.math import betaincinv, gammaincinv, tanh +from pytensor.tensor.math import betaincinv, gammainccinv, gammaincinv, tanh from pytensor.tensor.random.basic import ( BetaRV, _gamma, @@ -2541,6 +2541,16 @@ def logcdf(value, alpha, beta): msg="alpha > 0, beta > 0", ) + def icdf(value, alpha, beta): + res = beta / gammainccinv(alpha, value) + res = check_icdf_value(res, value) + return check_icdf_parameters( + res, + alpha > 0, + beta > 0, + msg="alpha > 0, beta > 0", + ) + class ChiSquared: r""" diff --git a/tests/distributions/test_continuous.py b/tests/distributions/test_continuous.py index 2864335e3..30317849c 100644 --- a/tests/distributions/test_continuous.py +++ b/tests/distributions/test_continuous.py @@ -675,6 +675,13 @@ def test_inverse_gamma_logp(self): lambda value, alpha, beta: st.invgamma.logpdf(value, alpha, scale=beta), ) + def test_inverse_gamma_icdf(self): + check_icdf( + pm.InverseGamma, + {"alpha": Rplusbig, "beta": Rplusbig}, + lambda q, alpha, beta: st.invgamma.ppf(q, alpha, scale=beta), + ) + @pytest.mark.skipif( condition=(pytensor.config.floatX == "float32"), reason="Fails on float32 due to numerical issues",