Skip to main content

simulate

Function simulate 

Source
pub fn simulate(
    copula: &dyn Copula,
    marginals: &[&(dyn Distribution + Sync)],
    dims: Vec<String>,
    components: Vec<ComponentKey>,
    n_sims: usize,
    seed: u64,
    provenance: Provenance,
) -> Result<PredictiveDistribution>
Expand description

Simulates marginals joined by a copula: in simulation i, draws u from copula with StreamRng::new(seed, i) and sets component j to marginals[j].quantile(u_j).

The result has one component per marginal, keyed by components under dims, and records the seed in its provenance.

use prospicio_prob::copula::{GaussianCopula, simulate};
use prospicio_prob::{Distribution, KeyValue, Lognormal, Provenance};

let motor = Lognormal::from_mean_cv(100.0, 0.2).unwrap();
let property = Lognormal::from_mean_cv(50.0, 1.0).unwrap();
let copula = GaussianCopula::new(&[1.0, 0.4, 0.4, 1.0], 2).unwrap();
let pd = simulate(
    &copula,
    &[&motor, &property],
    vec!["lob".into()],
    vec![vec![KeyValue::from("motor")], vec![KeyValue::from("property")]],
    10_000,
    42,
    Provenance::new("portfolio"),
)
.unwrap();
assert!((pd.mean() - 150.0).abs() < 3.0);