Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
// Source:
// https://en.wikipedia.org/wiki/Beta_distribution#Transformations
function PERT(min, max, mode = (min + max)/2, lambda = 4) {
const width = max - min
const a = 1 + lambda * ((mode - min)/width)
const b = 1 + lambda * ((max - mode)/width)
const p = jStat.beta.sample(a, b)
return min + p*width
}
export const Distributions = {
beta: jStat.beta.sample,
centralF: jStat.centralF.sample,
cauchy: jStat.cauchy.sample,
chisquare: jStat.chisquare.sample,
exponential: jStat.exponential.sample,
invgamma: jStat.invgamma.sample,
lognormal: jStat.lognormal.sample,
normal: jStat.normal.sample,
studentt: jStat.studentt.sample,
weibull: jStat.weibull.sample,
uniform: jStat.uniform.sample,
gamma: jStat.gamma.sample,
triangular,
doubleTriangular,
PERT,
bernoulli: bernoulli,
if: bernoulli,
test: bernoulli,
binomial: binomial,
poisson: poisson,
negBinomial: negBinomial
import math from 'mathjs'
import {jStat} from 'jstat'
var Finance = require('financejs')
const finance = new Finance()
const jStatDistributions = {
beta: jStat.beta.sample,
centralF: jStat.centralF.sample,
cauchy: jStat.cauchy.sample,
chisquare: jStat.chisquare.sample,
exponential: jStat.exponential.sample,
invgamma: jStat.invgamma.sample,
lognormal: jStat.lognormal.sample,
normal: jStat.normal.sample,
studentt: jStat.studentt.sample,
weibull: jStat.weibull.sample,
uniform: jStat.uniform.sample,
gamma: jStat.gamma.sample
}
const financeFunctions = {
PV: finance.PV,
FV: finance.FV,
NPV: finance.NPV,
//IRR: finance.IRR, Too slow.
PP: finance.PP,
ROI: finance.ROI,
private draw(dist: Distribution): number {
switch (dist.tag) {
case 'constant':
return dist.value;
case 'exp':
const expDraw = jStat.exponential.sample(dist.rate) as number;
return expDraw > 0 ? expDraw : 0;
case 'gamma':
const grammDraw = jStat.gamma.sample(dist.shape, dist.scale) as number;
return grammDraw > 0 ? grammDraw : 0;
case 'normal':
const normalDraw = jStat.normal.sample(dist.mean, dist.std) as number;
return normalDraw > 0 ? normalDraw : 0;
default:
throw new Error('Unsupported distribution');
}
}