pub struct Tweedie { /* private fields */ }Expand description
Tweedie distribution with mean μ, dispersion φ and power
1 < p < 2: variance φ μ^p, a point mass at 0 and a continuous
density above it.
It is the compound Poisson sum Y = X_1 + … + X_N with
N ~ Poisson(λ), λ = μ^(2-p) / (φ (2 - p))
X ~ Gamma(α, θ), α = (2 - p) / (p - 1), θ = φ (p - 1) μ^(p-1)the GLM family for pure premium (losses per exposure), where claim
counts and severities are not modelled separately. Every quantity is a
Poisson-weighted sum over the number of claims n, of the matching
quantity of Gamma(nα, θ), summed until the remaining terms are
negligible:
P(Y = 0) = e^(-λ);- the distribution function, survival function and layer moments from the gamma’s, each tail summed directly so both keep their precision;
- the density (Dunn & Smyth’s series), in log space.
§Example
use prospicio_prob::{Distribution, Severity, Tweedie};
let y = Tweedie::new(500.0, 40.0, 1.6).unwrap();
assert!((y.mean() - 500.0).abs() < 1e-9);
assert!((y.variance() - 40.0 * 500f64.powf(1.6)).abs() < 1e-6);
// P(Y = 0) = e^(-λ).
assert!((y.cdf(0.0) - (-y.lambda()).exp()).abs() < 1e-15);
assert!((y.lev(800.0) + y.stop_loss(800.0) - 500.0).abs() < 1e-9);Implementations§
Source§impl Tweedie
impl Tweedie
Sourcepub fn new(mean: f64, dispersion: f64, power: f64) -> Result<Self>
pub fn new(mean: f64, dispersion: f64, power: f64) -> Result<Self>
Tweedie with mean μ > 0, dispersion φ > 0 and power p in
(1, 2).
Sourcepub fn from_poisson_gamma(lambda: f64, shape: f64, scale: f64) -> Result<Self>
pub fn from_poisson_gamma(lambda: f64, shape: f64, scale: f64) -> Result<Self>
The Tweedie equal to a Poisson(lambda) number of
Gamma(shape, scale) losses: power (α + 2) / (α + 1), mean
λαθ.
use prospicio_prob::Tweedie;
let y = Tweedie::from_poisson_gamma(3.0, 2.0, 100.0).unwrap();
assert!((y.power() - 4.0 / 3.0).abs() < 1e-15);
assert!((y.lambda() - 3.0).abs() < 1e-12);Sourcepub fn mean_param(&self) -> f64
pub fn mean_param(&self) -> f64
Mean μ.
Sourcepub fn dispersion(&self) -> f64
pub fn dispersion(&self) -> f64
Dispersion φ.
Sourcepub fn ln_pdf(&self, y: f64) -> f64
pub fn ln_pdf(&self, y: f64) -> f64
Log density at y > 0 (the continuous part); at y = 0, the log
of the point mass -λ. -inf below 0.
use prospicio_prob::Tweedie;
// λ = 1 with unit exponential losses:
// f(y) = e^(-1-y) Σ_n y^(n-1) / (n! (n-1)!).
let y = Tweedie::from_poisson_gamma(1.0, 1.0, 1.0).unwrap();
let (mut series, mut term) = (0.0, 1.0); // term = 2^(n-1) / (n! (n-1)!)
for n in 1..40 {
series += term;
term *= 2.0 / (f64::from(n + 1) * f64::from(n));
}
assert!((y.ln_pdf(2.0) - (-3.0 + f64::ln(series))).abs() < 1e-13);Trait Implementations§
impl Copy for Tweedie
Source§impl Distribution for Tweedie
impl Distribution for Tweedie
Source§fn quantile(&self, p: f64) -> Result<f64>
fn quantile(&self, p: f64) -> Result<f64>
0 when p is within the point mass; otherwise by bisection on the
distribution or survival function, whichever is the smaller tail.
Source§fn survival(&self, y: f64) -> f64
fn survival(&self, y: 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 sample(&self, rng: &mut StreamRng, n: usize) -> Vec<f64>
fn sample(&self, rng: &mut StreamRng, n: usize) -> Vec<f64>
n draws from stream rng, by inverse transform unless the family
overrides it (crate::Gamma draws by Marsaglia and Tsang). Read moreSource§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 Tweedie
impl Severity for Tweedie
Source§fn stop_loss(&self, retention: f64) -> f64
fn stop_loss(&self, retention: f64) -> f64
E[max(X - retention, 0)].Source§fn layer(&self, limit: f64, attachment: f64) -> f64
fn layer(&self, limit: f64, attachment: f64) -> f64
limit xs attachment,
E[min(max(X - attachment, 0), limit)].impl StructuralPartialEq for Tweedie
Auto Trait Implementations§
impl Freeze for Tweedie
impl RefUnwindSafe for Tweedie
impl Send for Tweedie
impl Sync for Tweedie
impl Unpin for Tweedie
impl UnsafeUnpin for Tweedie
impl UnwindSafe for Tweedie
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