Source code for lossmodels.frequency.geometric

import numpy as np
from ..utils.random import RNGLike, resolve_rng
from scipy.stats import geom

from .base import FrequencyModel
from ..utils.numeric import eval_dist


[docs] class Geometric(FrequencyModel): """ Geometric frequency model. Support starting at 0: {0, 1, 2, 3, ...} Parameters ---------- p : float Probability of success Notes ----- NumPy and SciPy define the geometric distribution on {1, 2, 3, ...} as the number of trials until first success. This implementation shifts that convention by 1 so the support starts at 0, which is more natural for claim counts. """ def __init__(self, p: float): if not (0 < p <= 1): raise ValueError("p must be in (0, 1].") self.p = p
[docs] def sample(self, size: int = 1, rng: RNGLike = None) -> np.ndarray: return resolve_rng(rng).geometric(self.p, size=size) - 1
[docs] def mean(self) -> float: return (1 - self.p) / self.p
[docs] def variance(self) -> float: return (1 - self.p) / (self.p ** 2)
[docs] def pmf(self, k): """Probability mass function P(N = k).""" return eval_dist(lambda v: geom.pmf(v + 1, self.p), k)
[docs] def cdf(self, k): """Cumulative distribution function P(N <= k).""" return eval_dist(lambda v: geom.cdf(v + 1, self.p), k)
def __repr__(self): return f"Geometric(p={self.p})"