pub struct PiecewisePareto { /* private fields */ }Expand description
Piecewise Pareto distribution with thresholds t_1 < … < t_n and
alphas α_1, …, α_n: P(X > x) = 1 below t_1, and on
[t_k, t_{k+1})
P(X > x) = P(X > t_k) (t_k / x)^α_k,so α_k is the local Pareto alpha on the k-th piece. Interior
alphas may be 0 (no losses end in that piece); the last must be
positive. Matches pPiecewisePareto(x, t, alpha) in the R package
Pareto.
Survival at the thresholds is kept as a logarithm, so steep pieces far in the tail do not underflow. Every layer moment is a sum of single-piece Pareto integrals, in closed form.
use prospicio_prob::{Distribution, PiecewisePareto, Severity};
let pp = PiecewisePareto::new(vec![1000.0, 2000.0], vec![1.0, 2.0]).unwrap();
// P(X > 2000) = 1/2, then Pareto(2000, 2) above.
assert!((pp.survival(4000.0) - 0.125).abs() < 1e-15);
// E[X − 2000]+ = P(X > 2000) · 2000 / (2 − 1).
assert!((pp.stop_loss(2000.0) - 1000.0).abs() < 1e-12);Implementations§
Source§impl PiecewisePareto
impl PiecewisePareto
Sourcepub fn fit(
t: Vec<f64>,
data: &LargeLosses,
truncation: Option<(f64, Truncation)>,
) -> Result<Self>
pub fn fit( t: Vec<f64>, data: &LargeLosses, truncation: Option<(f64, Truncation)>, ) -> Result<Self>
Maximum likelihood fit of the alphas of a piecewise Pareto with
thresholds t to losses at or above t[0], optionally with the
last piece truncated at truncation.
The likelihood separates by piece: alpha k is the uncensored
weight ending in piece k over the weighted log-exposure
Σ w ln(min(y, t_{k+1}) / max(r, t_k))⁺ inside it, and a truncated
last piece is the truncated Pareto fit of the losses reaching it.
Every piece needs some exposure; a piece where no uncensored loss
ends gets alpha 0 (the last piece must have one).
Truncation of the whole distribution at T couples the alphas,
since each loss’s likelihood is conditioned through S(r) − S(T).
The fit then maximizes the likelihood by coordinate ascent from the
untruncated estimates, each alpha by bisection on its analytic
partial derivative and clamped to [1e-3, 1e3] (as the R package
clamps to its bounds). S(a) − S(T) is computed as
S(a) (1 − e^D) with D summed piece by piece over [a, T], so
losses just below T keep their precision.
use prospicio_prob::{LargeLosses, PiecewisePareto};
let data = LargeLosses::new(vec![1200.0, 1500.0, 2500.0, 6000.0]).unwrap();
let fit = PiecewisePareto::fit(vec![1000.0, 2000.0], &data, None).unwrap();
// Piece 1: 2 losses end in it; exposure ln 1.2 + ln 1.5 + 2 ln 2.
let want = 2.0 / (1.2f64.ln() + 1.5f64.ln() + 2.0 * 2f64.ln());
assert!((fit.alphas()[0] - want).abs() < 1e-14);Source§impl PiecewisePareto
impl PiecewisePareto
Sourcepub fn new(t: Vec<f64>, alpha: Vec<f64>) -> Result<Self>
pub fn new(t: Vec<f64>, alpha: Vec<f64>) -> Result<Self>
Piecewise Pareto from strictly increasing positive thresholds t
and alphas alpha of the same length: interior alphas ≥ 0, the
last > 0.
Sourcepub fn truncated(self, truncation: f64, kind: Truncation) -> Result<Self>
pub fn truncated(self, truncation: f64, kind: Truncation) -> Result<Self>
The same distribution truncated at truncation, which must be
finite and above the last threshold (as in the R package).
Sourcepub fn thresholds(&self) -> &[f64]
pub fn thresholds(&self) -> &[f64]
Thresholds t_1 < … < t_n.
Sourcepub fn truncation(&self) -> Option<(f64, Truncation)>
pub fn truncation(&self) -> Option<(f64, Truncation)>
Truncation point and kind, if any.
Trait Implementations§
Source§impl Clone for PiecewisePareto
impl Clone for PiecewisePareto
Source§fn clone(&self) -> PiecewisePareto
fn clone(&self) -> PiecewisePareto
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PiecewisePareto
impl Debug for PiecewisePareto
Source§impl Distribution for PiecewisePareto
impl Distribution for PiecewisePareto
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 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 From<PiecewisePareto> for Dist
impl From<PiecewisePareto> for Dist
Source§fn from(d: PiecewisePareto) -> Self
fn from(d: PiecewisePareto) -> Self
Source§impl PartialEq for PiecewisePareto
impl PartialEq for PiecewisePareto
Source§impl Severity for PiecewisePareto
impl Severity for PiecewisePareto
Source§fn layer_second_moment(&self, limit: f64, attachment: f64) -> f64
fn layer_second_moment(&self, limit: f64, attachment: f64) -> f64
2 ∫_a^b (x − a) S(x) dx with b = a + limit.
Source§fn stop_loss(&self, retention: f64) -> f64
fn stop_loss(&self, retention: f64) -> f64
E[max(X - retention, 0)].impl StructuralPartialEq for PiecewisePareto
Auto Trait Implementations§
impl Freeze for PiecewisePareto
impl RefUnwindSafe for PiecewisePareto
impl Send for PiecewisePareto
impl Sync for PiecewisePareto
impl Unpin for PiecewisePareto
impl UnsafeUnpin for PiecewisePareto
impl UnwindSafe for PiecewisePareto
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