pub enum Distortion {
Tvar(f64),
Wang(f64),
ProportionalHazard(f64),
DualPower(f64),
Exponential(f64),
}Expand description
A distortion of the survival function. Every variant is concave, so every measure here is coherent.
| Variant | g(s) | Parameter |
|---|---|---|
Tvar(p) | min(s / (1 - p), 1) | p in [0, 1] |
Wang(λ) | Φ(Φ⁻¹(s) + λ) | λ >= 0 |
ProportionalHazard(ρ) | s^ρ | ρ in (0, 1] |
DualPower(β) | 1 - (1 - s)^β | β >= 1 |
Exponential(k) | (1 - e^(-k s)) / (1 - e^(-k)) | k > 0 |
Each has a parameter value that gives the mean (Tvar(0), Wang(0),
ProportionalHazard(1), DualPower(1), and Exponential(k) as
k → 0).
A concave distortion is a spectral risk measure,
ρ = ∫₀¹ φ(u) VaR_u du with the non-decreasing risk-aversion spectrum
φ(u) = g'(1 - u). Exponential(k) is the spectral measure with
exponential risk aversion, φ(u) = k e^(-k(1-u)) / (1 - e^(-k))
(Acerbi, 2002; Dowd, Cotter and Sorwar, 2008); Tvar(p) is the one
whose spectrum is flat above p.
use prospicio_prob::Distortion;
let x = [1.0, 2.0, 3.0, 4.0];
// TVaR at 50%: the mean of the top half.
assert_eq!(Distortion::tvar(0.5).unwrap().apply_sorted(&x), 3.5);
// Wang with λ = 0 is the mean.
assert!((Distortion::wang(0.0).unwrap().apply_sorted(&x) - 2.5).abs() < 1e-15);Variants§
Implementations§
Source§impl Distortion
impl Distortion
Sourcepub fn proportional_hazard(rho: f64) -> Result<Self>
pub fn proportional_hazard(rho: f64) -> Result<Self>
Proportional hazard transform with rho in (0, 1].
Sourcepub fn dual_power(beta: f64) -> Result<Self>
pub fn dual_power(beta: f64) -> Result<Self>
Dual power transform with beta >= 1.
Sourcepub fn exponential(k: f64) -> Result<Self>
pub fn exponential(k: f64) -> Result<Self>
The spectral measure with exponential risk aversion k > 0: the
larger k, the more weight on the worst outcomes.
Sourcepub fn weights(&self, n: usize) -> Vec<f64>
pub fn weights(&self, n: usize) -> Vec<f64>
Weights for n equally likely values sorted ascending: value i
(0-based) gets g((n - i) / n) - g((n - i - 1) / n). They are
non-negative and sum to 1.
use prospicio_prob::Distortion;
// TVaR at 50% on four values: the top two, equally.
assert_eq!(Distortion::tvar(0.5).unwrap().weights(4), [0.0, 0.0, 0.5, 0.5]);Sourcepub fn apply_sorted(&self, sorted: &[f64]) -> f64
pub fn apply_sorted(&self, sorted: &[f64]) -> f64
The risk measure of equally likely draws sorted ascending.
For Tvar(p) this agrees with tvar_sorted
up to rounding, including the fractional weight at the VaR. sorted
must be non-empty and sorted ascending; this is checked only in
debug builds.
Sourcepub fn apply_discrete(&self, values: &[f64], probs: &[f64]) -> f64
pub fn apply_discrete(&self, values: &[f64], probs: &[f64]) -> f64
The risk measure of a discrete distribution with ascending values
and their probs (which should sum to 1).
Survival probabilities are summed from the top, so small tail probabilities keep their precision.
use prospicio_prob::Distortion;
let ph = Distortion::proportional_hazard(0.5).unwrap();
// P(X = 0) = 0.75, P(X = 1) = 0.25: ρ = g(0.25) = 0.5.
assert_eq!(ph.apply_discrete(&[0.0, 1.0], &[0.75, 0.25]), 0.5);Trait Implementations§
Source§impl Clone for Distortion
impl Clone for Distortion
Source§fn clone(&self) -> Distortion
fn clone(&self) -> Distortion
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for Distortion
Source§impl Debug for Distortion
impl Debug for Distortion
Source§impl PartialEq for Distortion
impl PartialEq for Distortion
impl StructuralPartialEq for Distortion
Auto Trait Implementations§
impl Freeze for Distortion
impl RefUnwindSafe for Distortion
impl Send for Distortion
impl Sync for Distortion
impl Unpin for Distortion
impl UnsafeUnpin for Distortion
impl UnwindSafe for Distortion
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