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);