pcntoolkit.math_functions.shash#

Sinh-Arcsinh (SHASH) Distribution Implementation Module.

This module implements the Sinh-Arcsinh (SHASH) distribution and its variants as described in Jones and Pewsey (2009) [1]. The SHASH distribution is a flexible distribution family that can model skewness and kurtosis through separate parameters.

The module provides:

  1. Basic SHASH transformations (S, S_inv, C)

  2. SHASH distribution (base implementation)

  3. SHASHo distribution (location-scale variant)

  4. SHASHo2 distribution (alternative parameterization)

  5. SHASHb distribution (standardized variant)

References

Notes

The implementation uses PyMC and PyTensor for probabilistic programming capabilities. All distributions support random sampling and log-probability calculations.

Attributes#

Classes#

Functions#

K(p, x[, chunks])

P(→ numpy.typing.NDArray[numpy.float64])

The P function as given in Jones et al.

S(→ numpy.typing.NDArray[numpy.float64])

Sinh arcsinh transformation.

S_inv(→ numpy.typing.NDArray[numpy.float64])

Inverse sinh arcsinh transformation.

m(→ numpy.typing.NDArray[numpy.float64])

The r'th uncentered moment as given in Jones et al.

m1m2(→ Tuple[float, float])

Module Contents#

class Kv#

Bases: pytensor.scalar.basic.BinaryScalarOp

grad(inputs: Sequence[pytensor.graph.basic.Variable[Any, Any]], output_gradients: Sequence[pytensor.graph.basic.Variable[Any, Any]]) List[pytensor.graph.basic.Variable]#
impl(p: float | int, x: float | int) float#
static st_impl(p: float | int, x: float | int) float#
nfunc_spec = ('scipy.special.kv', 2, 1)#
class SHASH#

Bases: pymc.distributions.Continuous

static P(q: float) float#
classmethod dist(epsilon: pytensor.tensor.TensorLike, delta: pytensor.tensor.TensorLike, **kwargs: Any) Any#
logp(epsilon: float, delta: float) float#
static m1(epsilon: float, delta: float) float#
static m1m2(epsilon: float, delta: float) Tuple[float, float]#
static m2(epsilon: float, delta: float) float#
my_K#
rv_op#
class SHASHb#

Bases: pymc.distributions.Continuous

classmethod dist(mu: pytensor.tensor.TensorLike, sigma: pytensor.tensor.TensorLike, epsilon: pytensor.tensor.TensorLike, delta: pytensor.tensor.TensorLike, **kwargs: Any) Any#
logp(mu: float, sigma: float, epsilon: float, delta: float) float#
rv_op#
class SHASHbRV#

Bases: pytensor.tensor.random.op.RandomVariable

classmethod rng_fn(rng: numpy.random.Generator, mu: float, sigma: float, epsilon: float, delta: float, size: int | Tuple[int, Ellipsis] | None = None) numpy.typing.NDArray[numpy.float64]#
dtype = 'floatX'#
name = 'shashb'#
signature = '(),(),(),()->()'#
class SHASHo#

Bases: pymc.distributions.Continuous

classmethod dist(mu: pytensor.tensor.TensorLike, sigma: pytensor.tensor.TensorLike, epsilon: pytensor.tensor.TensorLike, delta: pytensor.tensor.TensorLike, **kwargs: Any) Any#
logp(mu: float, sigma: float, epsilon: float, delta: float) float#
rv_op#
class SHASHo2#

Bases: pymc.distributions.Continuous

classmethod dist(mu: pytensor.tensor.TensorLike, sigma: pytensor.tensor.TensorLike, epsilon: pytensor.tensor.TensorLike, delta: pytensor.tensor.TensorLike, **kwargs: Any) Any#
logp(mu: float, sigma: float, epsilon: float, delta: float) float#
rv_op#
class SHASHo2RV#

Bases: pytensor.tensor.random.op.RandomVariable

classmethod rng_fn(rng: numpy.random.Generator, mu: pytensor.tensor.TensorLike, sigma: pytensor.tensor.TensorLike, epsilon: pytensor.tensor.TensorLike, delta: pytensor.tensor.TensorLike, size: int | Tuple[int, Ellipsis] | None = None) numpy.typing.NDArray[numpy.float64]#
dtype = 'floatX'#
name = 'shasho2'#
signature = '(),(),(),()->()'#
class SHASHoRV#

Bases: pytensor.tensor.random.op.RandomVariable

classmethod rng_fn(rng: numpy.random.Generator, mu: pytensor.tensor.TensorLike, sigma: pytensor.tensor.TensorLike, epsilon: pytensor.tensor.TensorLike, delta: pytensor.tensor.TensorLike, size: int | Tuple[int, Ellipsis] | None = None) numpy.typing.NDArray[numpy.float64]#
dtype = 'floatX'#
name = 'shasho'#
signature = '(),(),(),()->()'#
class SHASHrv#

Bases: pytensor.tensor.random.op.RandomVariable

classmethod rng_fn(rng: numpy.random.Generator, epsilon: float, delta: float, size: int | Tuple[int, Ellipsis] | None = None) numpy.typing.NDArray[numpy.float64]#
dtype = 'floatX'#
name = 'shash'#
signature = '(),()->()'#
K(p, x, chunks=None)#
P(q: numpy.typing.NDArray[numpy.float64]) numpy.typing.NDArray[numpy.float64]#

The P function as given in Jones et al.

S(x: numpy.typing.NDArray[numpy.float64], e: numpy.typing.NDArray[numpy.float64], d: numpy.typing.NDArray[numpy.float64]) numpy.typing.NDArray[numpy.float64]#

Sinh arcsinh transformation.

S_inv(x: numpy.typing.NDArray[numpy.float64], e: numpy.typing.NDArray[numpy.float64], d: numpy.typing.NDArray[numpy.float64]) numpy.typing.NDArray[numpy.float64]#

Inverse sinh arcsinh transformation.

m(epsilon: numpy.typing.NDArray[numpy.float64], delta: numpy.typing.NDArray[numpy.float64], r: int) numpy.typing.NDArray[numpy.float64]#

The r’th uncentered moment as given in Jones et al.

m1m2(epsilon: float, delta: float) Tuple[float, float]#
CONST1#
CONST2#
KV_GRADIENT_DP = 1e-08#
kv#
shash#
shashb#
shasho#
shasho2#