--- title: "Distribution Creation" sidebar_position: 8 --- import TOCInline from "@theme/TOCInline"; import { SquiggleEditor } from "../../src/components/SquiggleEditor"; import Admonition from "@theme/Admonition"; import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; ## 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. `5 to 10` does the same thing as `to(5,10)`. When `-5 to 5` is entered, there's negative values, so it generates a normal distribution. This has 5th and 95th percentiles at 5 and 10. It's very easy to generate distributions with very long tails. If this happens, you can click the "log x scale" box to view this using a log scale. ### Arguments - `5thPercentile`: number - `95thPercentile`: number, greater than `5thPercentile`

"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.

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[])` The `mixture` mixes combines multiple distributions to create a mixture. You can optionally pass in a list of proportional weights. ### Arguments - `distributions`: A set of distributions or numbers, each passed as a paramater. Numbers will be converted into Delta 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,

🔒 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.

## Normal `normal(mean:number, standardDeviation:number)` Creates a [normal distribution](https://en.wikipedia.org/wiki/Normal_distribution) with the given mean and standard deviation. ### Arguments - `mean`: Number - `standard deviation`: Number greater than zero [Wikipedia](https://en.wikipedia.org/wiki/Normal_distribution) ## Log-normal `lognormal(mu: number, sigma: number)` Creates a [log-normal distribution](https://en.wikipedia.org/wiki/Log-normal_distribution) with the given mu and sigma. `Mu` and `sigma` 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. ### Arguments - `mu`: Number - `sigma`: Number greater than zero [Wikipedia](https://en.wikipedia.org/wiki/Log-normal_distribution)
❓ Understanding mu and sigma

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

## Uniform `uniform(low:number, high:number)` Creates a [uniform distribution]() with the given low and high values. ### Arguments - `low`: Number - `high`: Number greater than `low`

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.

## Delta `delta(value:number)` Creates a discrete distribution with all of its probability mass at point `value`. Numbers are often cast into delta distributions automatically. For example, in the function, `mixture(1,2,normal(5,2))`, the first two arguments will get converted into delta distributions with values at 1 and 2. Therefore, `mixture(1,2,normal(5,2))` is the same as `mixture(delta(1), delta(2),normal(5,2))` ### Arguments - `value`: Number ## Beta `beta(alpha:number, beta:number)` Creates a [beta distribution](https://en.wikipedia.org/wiki/Beta_distribution) with the given `alpha` and `beta` values. For a good summary of the beta distribution, see [this explanation](https://stats.stackexchange.com/a/47782) on Stack Overflow. ### Arguments - `alpha`: Number greater than zero - `beta`: Number greater than zero

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
## Exponential `exponential(rate:number)` Creates an [exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution) with the given rate. ### Arguments - `rate`: Number greater than zero ## Triangular distribution `triangular(low:number, mode:number, high:number)` Creates a [triangular distribution](https://en.wikipedia.org/wiki/Triangular_distribution) with the given low, mode, and high values. #### Validity ### Arguments - `low`: Number - `mode`: Number greater than `low` - `high`: Number greater than `mode` ## FromSamples `fromSamples(samples:number[])` Creates a sample set distribution using an array of samples. ### Arguments - `samples`: An array of at least 5 numbers.