pub struct Gamma { /* private fields */ }Expand description
Gamma distribution with shape α and scale θ: density
x^(α-1) e^(-x/θ) / (Γ(α) θ^α), mean αθ, variance αθ².
Parameterized as in SciPy (a = shape, scale) and R (shape,
scale = 1/rate). The gamma GLM family is this distribution with
shape 1/φ and mean μ; see Gamma::from_mean_dispersion.
§Example
use prospicio_prob::{Distribution, Gamma, Severity};
let d = Gamma::from_mean_cv(1000.0, 0.5).unwrap();
assert!((d.shape() - 4.0).abs() < 1e-12);
assert!((d.std_dev() - 500.0).abs() < 1e-9);
// LEV + stop-loss = mean.
assert!((d.lev(1500.0) + d.stop_loss(1500.0) - 1000.0).abs() < 1e-9);Implementations§
Source§impl Gamma
impl Gamma
Sourcepub fn from_mean_cv(mean: f64, cv: f64) -> Result<Self>
pub fn from_mean_cv(mean: f64, cv: f64) -> Result<Self>
Gamma with the given mean and coefficient of variation: shape
1/cv², scale mean cv².
Sourcepub fn from_mean_dispersion(mean: f64, dispersion: f64) -> Result<Self>
pub fn from_mean_dispersion(mean: f64, dispersion: f64) -> Result<Self>
Gamma with mean μ and GLM dispersion φ (variance φμ²): shape
1/φ, scale φμ.
Trait Implementations§
impl Copy for Gamma
Source§impl Distribution for Gamma
impl Distribution for Gamma
Source§fn quantile(&self, p: f64) -> Result<f64>
fn quantile(&self, p: f64) -> Result<f64>
By bisection to full precision, on the distribution function below the median and on the survival function above it, so both tails keep their relative precision.
Source§fn sample(&self, rng: &mut StreamRng, n: usize) -> Vec<f64>
fn sample(&self, rng: &mut StreamRng, n: usize) -> Vec<f64>
n draws by Marsaglia and Tsang (2000), not inverse transform:
each is θ times a Gamma(α, 1) draw from rng (for α < 1, a
draw at α + 1 times U^(1/α)), so draws stay a pure function of
(seed, stream) but are not monotone in one uniform. The quantile
function costs a bisection on the incomplete gamma function, whose
series grows with the shape, where this costs about one normal and
one uniform at any shape.
Source§fn survival(&self, x: f64) -> f64
fn survival(&self, x: f64) -> f64
P(X > x). Representations with a direct form override the
default 1 - cdf(x), which loses all precision far in the tail.Source§fn is_parallel_safe(&self) -> bool
fn is_parallel_safe(&self) -> bool
crate::Custom
whose callbacks must stay on the calling thread (an R function), so
the parallel simulations run single-threaded when they meet one.Source§impl Severity for Gamma
impl Severity for Gamma
Source§fn stop_loss(&self, retention: f64) -> f64
fn stop_loss(&self, retention: f64) -> f64
E[(X - d)+] = αθ Q(α + 1, d/θ) - d Q(α, d/θ), from the tail, so
it does not cancel against the mean.
Source§fn layer(&self, limit: f64, attachment: f64) -> f64
fn layer(&self, limit: f64, attachment: f64) -> f64
LEV(a + limit) - LEV(a) for a layer attaching below the mean,
where both are small, and stop_loss(a) - stop_loss(a + limit)
above it, where those are: neither difference cancels.
impl StructuralPartialEq for Gamma
Auto Trait Implementations§
impl Freeze for Gamma
impl RefUnwindSafe for Gamma
impl Send for Gamma
impl Sync for Gamma
impl Unpin for Gamma
impl UnsafeUnpin for Gamma
impl UnwindSafe for Gamma
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more