Distributions

The distributions module provides probability distributions used for shocks and initial conditions. Continuous distributions support both drawing random samples and discretization into point-mass approximations.

Note

Normal and Lognormal are parameterized by the distribution’s mean and standard deviation in levels, not by the log-space parameters \((\mu, \sigma)\) familiar from other libraries. A standard deviation of zero produces a degenerate point mass at the mean argument.

Distribution classes that provide compatibility with scipy.stats and torch.distributions for better integration with neural network methods while maintaining API compatibility.

class skagent.distributions.Bernoulli(p=0.5, backend='scipy', rng=None)

Bernoulli distribution compatible with skagent.distributions.Bernoulli

Parameters:
discretize(**kwargs)

Bernoulli is already discrete

Return type:

DiscreteDistribution

icdf(u)

Bernoulli’s quantile function.

Neither backend supplies a usable one: torch.distributions.Bernoulli raises NotImplementedError, and scipy’s ppf maps u = 0, which rng.random can return, to -1.

Return type:

ndarray

property mean: float

Mean of the distribution

property std: float

Standard deviation of the distribution

class skagent.distributions.DiscreteDistribution(points, weights, var_names=None, rng=None)

A discrete distribution representation for labeled discrete distributions

Parameters:
draw(n=1)

Draw samples from the discrete distribution

Parameters:

n (int)

Return type:

ndarray

class skagent.distributions.DiscreteDistributionLabeled(points, weights, var_names=None, rng=None)

Labeled discrete distribution with variable names

Parameters:
classmethod from_unlabeled(unlabeled_dist, var_names)

Create labeled distribution from unlabeled one

Parameters:

var_names (list[str])

class skagent.distributions.Distribution(backend='scipy', rng=None)

Base class for all distributions, providing a common interface that works with both scipy and torch backends.

Parameters:
abstractmethod discretize(**kwargs)

Discretize the distribution

Return type:

DiscreteDistribution

draw(n=1)

Draw n samples from the distribution.

Samples are taken by inverting the distribution at uniform draws from self.rng, so that two distributions sharing a generator state and differing slightly in their parameters produce samples that differ slightly, rather than a different sample path.

Parameters:

n (int)

Return type:

ndarray

icdf(u)

Quantile function: the value below which a proportion u of the mass lies.

Parameters:

u (array_like) – Probabilities in [0, 1].

Return type:

ndarray

log_prob(x)

Log density (or log mass, for a discrete distribution) at x.

Parameters:

x (array_like) – Points in the support of the distribution.

Return type:

ndarray

abstract property mean: float

Mean of the distribution

abstract property std: float

Standard deviation of the distribution

class skagent.distributions.IndexDistribution(dist_class, params_dict, rng=None)

Distribution that varies by index (like age), compatible with skagent.distributions.IndexDistribution

Parameters:
draw(conditions)

Draw samples based on conditions (typically ages)

Parameters:

conditions (ndarray)

Return type:

ndarray

class skagent.distributions.Lognormal(mean=1.0, std=1.0, backend='scipy', rng=None)

Lognormal distribution compatible with skagent.distributions.Lognormal

Parameters:
discretize(n_points=7, N=None, **kwargs)

Discretize the distribution

Parameters:
Return type:

DiscreteDistribution

icdf(u)

Quantile function: the value below which a proportion u of the mass lies.

Parameters:

u (array_like) – Probabilities in [0, 1].

Return type:

ndarray

property mean: float

Mean of the distribution

property std: float

Standard deviation of the distribution

class skagent.distributions.MeanOneLogNormal(sigma=1.0, backend='scipy', rng=None)

Lognormal distribution with mean normalized to 1.0

Parameters:
class skagent.distributions.Normal(mu=0.0, sigma=1.0, backend='scipy', rng=None)

Normal distribution compatible with skagent.distributions.Normal

Parameters:
discretize(n_points=7, sigma_range=3.0, N=None, **kwargs)

Discretize using Gauss-Hermite quadrature or uniform grid

Parameters:
Return type:

DiscreteDistribution

icdf(u)

Quantile function: the value below which a proportion u of the mass lies.

Parameters:

u (array_like) – Probabilities in [0, 1].

Return type:

ndarray

property mean: float

Mean of the distribution

property std: float

Standard deviation of the distribution

class skagent.distributions.TimeVaryingDiscreteDistribution(distributions)

Time-varying discrete distribution for compatibility

Parameters:

distributions (list[DiscreteDistribution])

draw(conditions)

Draw samples based on time conditions

Parameters:

conditions (ndarray)

Return type:

ndarray

class skagent.distributions.Uniform(low=0.0, high=1.0, backend='scipy', rng=None)

Uniform distribution

Parameters:
discretize(n_points=7, N=None, **kwargs)

Discretize using Gauss-Hermite quadrature or uniform grid

Parameters:
Return type:

DiscreteDistribution

icdf(u)

Quantile function: the value below which a proportion u of the mass lies.

Parameters:

u (array_like) – Probabilities in [0, 1].

Return type:

ndarray

property mean: float

Mean of the distribution

property std: float

Standard deviation of the distribution

skagent.distributions.combine_indep_dstns(*distributions)

Combine independent discrete distributions into a joint distribution Compatible with skagent.distributions.combine_indep_dstns

Return type:

DiscreteDistribution

skagent.distributions.expected(func, dist)

Compute expected value of a function over a discrete distribution Compatible with skagent.distributions.expected

Parameters:

dist (DiscreteDistribution)

Return type:

float