Skip to main content

Distributions: Creation

To

(5thPercentile: number) to (95thPercentile: number)
to(5thPercentile: number, 95thPercentile: number)

The to function is an easy way to generate simple distributions using predicted 5th and 95th percentiles.

If both values are above zero, a lognormal distribution is used. If not, a normal distribution is used.

When 5 to 10 is entered, both numbers are positive, so it generates a lognormal distribution with 5th and 95th percentiles at 5 and 10.
Result:
Distribution plot

Arguments

  • 5thPercentile: number
  • 95thPercentile: number, greater than 5thPercentile
Tip

"To" is a great way to generate probability distributions very quickly from your intuitions. It's easy to write and easy to read. It's often a good place to begin an estimate.

Caution

If you haven't tried calibration training, you're likely to be overconfident. We recommend doing calibration training to get a feel for what a 90 percent confident interval feels like.

Mixture

mixture(...distributions: Distribution[], weights?: number[])
mx(...distributions: Distribution[], weights?: number[])
mixture(distributions: Distribution[], weights?: number[])
mx(distributions: Distribution[], weights?: number[])

The mixture mixes combines multiple distributions to create a mixture. You can optionally pass in a list of proportional weights.

Result:
Distribution plot

Arguments

  • distributions: A set of distributions or numbers, each passed as a paramater. Numbers will be converted into point mass distributions.
  • weights: An optional array of numbers, each representing the weight of its corresponding distribution. The weights will be re-scaled to add to 1.0. If a weights array is provided, it must be the same length as the distribution paramaters.

Aliases

  • mx

Special Use Cases of Mixtures

🕐 Zero or Continuous

One common reason to have mixtures of continous and discrete distributions is to handle the special case of 0. Say I want to model the time I will spend on some upcoming project. I think I have an 80% chance of doing it.

In this case, I have a 20% chance of spending 0 time with it. I might estimate my hours with,

Caution

There's a temporary bug where the below render is compressed. If you toggle the code it will fix render correctly.

Result:
Distribution plot
🔒 Model Uncertainty Safeguarding

One technique several Foretold.io users used is to combine their main guess, with a "just-in-case distribution". This latter distribution would have very low weight, but would be very wide, just in case they were dramatically off for some weird reason.

Result:
Distribution plot

Normal

normal(mean:number, standardDeviation:number)

Creates a normal distribution with the given mean and standard deviation.

Result:
Distribution plot

Arguments

  • mean: Number
  • standard deviation: Number greater than zero

Wikipedia

Log-normal

lognormal(mu: number, sigma: number)

Creates a log-normal distribution with the given mu and sigma.

Mu and sigma represent the mean and standard deviation of the normal which results when you take the log of our lognormal distribution. They can be difficult to directly reason about. Because of this complexity, we recommend typically using the to syntax instead of estimating mu and sigma directly.

Result:
Distribution plot

Arguments

  • mu: Number
  • sigma: Number greater than zero

Wikipedia

❓ Understanding mu and sigma

The log of lognormal(mu, sigma) is a normal distribution with mean muand standard deviation sigma. For example, these two distributions are identical:

Result:
0:
Distribution plot
1:
Distribution plot

Uniform

uniform(low:number, high:number)

Creates a uniform distribution with the given low and high values.

Result:
Distribution plot

Arguments

  • low: Number
  • high: Number greater than low
Caution

While uniform distributions are very simple to understand, we find it rare to find uncertainties that actually look like this. Before using a uniform distribution, think hard about if you are really 100% confident that the paramater will not wind up being just outside the stated boundaries.

One good example of a uniform distribution uncertainty would be clear physical limitations. You might have complete complete uncertainty on what time of day an event will occur, but can say with 100% confidence it will happen between the hours of 0:00 and 24:00.

Point Mass

pointMass(value:number)

Creates a discrete distribution with all of its probability mass at point value.

Few Squiggle users call the function pointMass() directly. Numbers are converted into point mass distributions automatically, when it is appropriate.

For example, in the function mixture(1,2,normal(5,2)), the first two arguments will get converted into point mass distributions with values at 1 and 2. Therefore, this is the same as mixture(pointMass(1),pointMass(2),pointMass(5,2)).

pointMass() distributions are currently the only discrete distributions accessible in Squiggle.

Result:
Distribution plot

Arguments

  • value: Number

Beta

beta(alpha:number, beta:number) beta({mean: number, stdev: number})

Creates a beta distribution with the given alpha and beta values. For a good summary of the beta distribution, see this explanation on Stack Overflow.

Result:
Distribution plot

Arguments

  • alpha: Number greater than zero
  • beta: Number greater than zero
Caution with small numbers

Squiggle struggles to show beta distributions when either alpha or beta are below 1.0. This is because the tails at ~0.0 and ~1.0 are very high. Using a log scale for the y-axis helps here.

Examples
Result:
Distribution plot

Exponential

exponential(rate:number)

Creates an exponential distribution with the given rate.

Result:
Distribution plot

Arguments

  • rate: Number greater than zero

Triangular distribution

triangular(low:number, mode:number, high:number)

Creates a triangular distribution with the given low, mode, and high values.

Arguments

  • low: Number
  • mode: Number greater than low
  • high: Number greater than mode
Result:
Distribution plot

SampleSet.fromList

SampleSet.fromList(samples:number[])

Creates a sample set distribution using an array of samples.

Result:
Distribution plot

Arguments

  • samples: An array of at least 5 numbers.
Caution!

Samples are converted into PDF shapes automatically using kernel density estimation and an approximated bandwidth. Eventually Squiggle will allow for more specificity.

PointSet.makeContinuous

PointSet.makeContinuous(points:{x: number, y: number})

Creates a continuous point set distribution using a list of points.

Result:
Distribution plot

Arguments

  • points: An array of at least 3 coordinates.

PointSet.makeDiscrete

PointSet.makeDiscrete(points:{x: number, y: number})

Creates a discrete point set distribution using a list of points.

Result:
Distribution plot

Arguments

  • points: An array of at least 1 coordinate.