361 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			361 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
---
 | 
						|
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";
 | 
						|
 | 
						|
<TOCInline toc={toc} maxHeadingLevel={2} />
 | 
						|
 | 
						|
## 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.
 | 
						|
 | 
						|
<Tabs>
 | 
						|
  <TabItem value="ex1" label="5 to 10" default>
 | 
						|
    When <code>5 to 10</code> is entered, both numbers are positive, so it
 | 
						|
    generates a lognormal distribution with 5th and 95th percentiles at 5 and
 | 
						|
    10.
 | 
						|
    <SquiggleEditor initialSquiggleString="5 to 10" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex3" label="to(5,10)">
 | 
						|
    <code>5 to 10</code> does the same thing as <code>to(5,10)</code>.
 | 
						|
    <SquiggleEditor initialSquiggleString="to(5,10)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex2" label="-5 to 5">
 | 
						|
    When <code>-5 to 5</code> is entered, there's negative values, so it
 | 
						|
    generates a normal distribution. This has 5th and 95th percentiles at 5 and
 | 
						|
    10.
 | 
						|
    <SquiggleEditor initialSquiggleString="-5 to -3" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex4" label="1 to 10000">
 | 
						|
    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.
 | 
						|
    <SquiggleEditor initialSquiggleString="1 to 10000" />
 | 
						|
  </TabItem>
 | 
						|
</Tabs>
 | 
						|
 | 
						|
### Arguments
 | 
						|
 | 
						|
- `5thPercentile`: number
 | 
						|
- `95thPercentile`: number, greater than `5thPercentile`
 | 
						|
 | 
						|
<Admonition type="tip" title="Tip">
 | 
						|
  <p>
 | 
						|
    "<bold>To</bold>" 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.
 | 
						|
  </p>
 | 
						|
</Admonition>
 | 
						|
 | 
						|
<Admonition type="caution" title="Caution">
 | 
						|
  <p>
 | 
						|
    If you haven't tried{" "}
 | 
						|
    <a href="https://www.lesswrong.com/posts/LdFbx9oqtKAAwtKF3/list-of-probability-calibration-exercises">
 | 
						|
      calibration training
 | 
						|
    </a>
 | 
						|
    , you're likely to be overconfident. We recommend doing calibration training
 | 
						|
    to get a feel for what a 90 percent confident interval feels like.
 | 
						|
  </p>
 | 
						|
</Admonition>
 | 
						|
 | 
						|
## 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.
 | 
						|
 | 
						|
<Tabs>
 | 
						|
  <TabItem value="ex1" label="Simple" default>
 | 
						|
    <SquiggleEditor initialSquiggleString="mixture(1 to 2, 5 to 8, 9 to 10)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex2" label="With Weights">
 | 
						|
    <SquiggleEditor initialSquiggleString="mixture(1 to 2, 5 to 8, 9 to 10, [0.1, 0.1, 0.8])" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex3" label="With Continuous and Discrete Inputs">
 | 
						|
    <SquiggleEditor initialSquiggleString="mixture(1 to 5, 8 to 10, 1, 3, 20)" />
 | 
						|
  </TabItem>
 | 
						|
</Tabs>
 | 
						|
 | 
						|
### 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
 | 
						|
 | 
						|
<details>
 | 
						|
  <summary>🕐 Zero or Continuous</summary>
 | 
						|
  <p>
 | 
						|
    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.
 | 
						|
  </p>
 | 
						|
 | 
						|
  <p>
 | 
						|
    In this case, I have a 20% chance of spending 0 time with it. I might estimate my hours with,
 | 
						|
  </p>
 | 
						|
  <SquiggleEditor
 | 
						|
    initialSquiggleString={`hours_the_project_will_take = 5 to 20
 | 
						|
chance_of_doing_anything = 0.8
 | 
						|
mx(hours_the_project_will_take, 0, [chance_of_doing_anything, 1 - chance_of_doing_anything])`}
 | 
						|
  />
 | 
						|
</details>
 | 
						|
 | 
						|
<details>
 | 
						|
  <summary>🔒 Model Uncertainty Safeguarding</summary>
 | 
						|
  <p>
 | 
						|
  One technique several <a href="https://www.foretold.io/">Foretold.io</a> 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.
 | 
						|
  </p>
 | 
						|
<SquiggleEditor
 | 
						|
  initialSquiggleString={`forecast = 3 to 30
 | 
						|
chance_completely_wrong = 0.05
 | 
						|
forecast_if_completely_wrong = -100 to 200
 | 
						|
mx(forecast, forecast_if_completely_wrong, [1-chance_completely_wrong, chance_completely_wrong])`}
 | 
						|
/>
 | 
						|
 | 
						|
</details>
 | 
						|
 | 
						|
## Normal
 | 
						|
 | 
						|
`normal(mean:number, standardDeviation:number)`
 | 
						|
 | 
						|
Creates a [normal distribution](https://en.wikipedia.org/wiki/Normal_distribution) with the given mean and standard deviation.
 | 
						|
 | 
						|
<Tabs>
 | 
						|
  <TabItem value="ex1" label="normal(5,1)" default>
 | 
						|
    <SquiggleEditor initialSquiggleString="normal(5, 1)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex2" label="normal(100000000000, 100000000000)">
 | 
						|
    <SquiggleEditor initialSquiggleString="normal(100000000000, 100000000000)" />
 | 
						|
  </TabItem>
 | 
						|
</Tabs>
 | 
						|
 | 
						|
### 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` 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 <a href="#to">to</a> syntax instead of estimating `mu` and `sigma` directly.
 | 
						|
 | 
						|
<SquiggleEditor initialSquiggleString="lognormal(0, 0.7)" />
 | 
						|
 | 
						|
### Arguments
 | 
						|
 | 
						|
- `mu`: Number
 | 
						|
- `sigma`: Number greater than zero
 | 
						|
 | 
						|
[Wikipedia](https://en.wikipedia.org/wiki/Log-normal_distribution)
 | 
						|
 | 
						|
<details>
 | 
						|
  <summary>
 | 
						|
    ❓ Understanding <bold>mu</bold> and <bold>sigma</bold>
 | 
						|
  </summary>
 | 
						|
  <p>
 | 
						|
    The log of <code>lognormal(mu, sigma)</code> is a normal distribution with
 | 
						|
    mean <code>mu</code>
 | 
						|
    and standard deviation <code>sigma</code>. For example, these two distributions
 | 
						|
    are identical:
 | 
						|
  </p>
 | 
						|
  <SquiggleEditor
 | 
						|
    initialSquiggleString={`normalMean = 10
 | 
						|
normalStdDev = 2
 | 
						|
logOfLognormal = log(lognormal(normalMean, normalStdDev))
 | 
						|
[logOfLognormal, normal(normalMean, normalStdDev)]`}
 | 
						|
  />
 | 
						|
</details>
 | 
						|
 | 
						|
## Uniform
 | 
						|
 | 
						|
`uniform(low:number, high:number)`
 | 
						|
 | 
						|
Creates a [uniform distribution](<https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)>) with the given low and high values.
 | 
						|
 | 
						|
<SquiggleEditor initialSquiggleString="uniform(3,7)" />
 | 
						|
 | 
						|
### Arguments
 | 
						|
 | 
						|
- `low`: Number
 | 
						|
- `high`: Number greater than `low`
 | 
						|
 | 
						|
<Admonition type="caution" title="Caution">
 | 
						|
  <p>
 | 
						|
    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.
 | 
						|
  </p>
 | 
						|
 | 
						|
  <p>
 | 
						|
    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.
 | 
						|
  </p>
 | 
						|
</Admonition>
 | 
						|
 | 
						|
## Delta
 | 
						|
 | 
						|
`delta(value:number)`
 | 
						|
 | 
						|
Creates a discrete distribution with all of its probability mass at point `value`.
 | 
						|
 | 
						|
Few Squiggle users call the function `delta()` directly. Numbers are converted into delta 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 delta distributions
 | 
						|
with values at 1 and 2. Therefore, this is the same as `mixture(delta(1),delta(2),normal(5,2))`.
 | 
						|
 | 
						|
`Delta()` distributions are currently the only discrete distributions accessible in Squiggle.
 | 
						|
 | 
						|
<Tabs>
 | 
						|
  <TabItem value="ex1" label="delta(3)" default>
 | 
						|
    <SquiggleEditor initialSquiggleString="delta(3)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex3" label="mixture(1,3,5)">
 | 
						|
    <SquiggleEditor initialSquiggleString="mixture(1,3,5)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex2" label="normal(5,2) * 6">
 | 
						|
    <SquiggleEditor initialSquiggleString="normal(5,2) * 6" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex4" label="dotAdd(normal(5,2), 6)">
 | 
						|
    <SquiggleEditor initialSquiggleString="dotAdd(normal(5,2), 6)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex5" label="dotMultiply(normal(5,2), 6)">
 | 
						|
    <SquiggleEditor initialSquiggleString="dotMultiply(normal(5,2), 6)" />
 | 
						|
  </TabItem>
 | 
						|
</Tabs>
 | 
						|
 | 
						|
### 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.
 | 
						|
 | 
						|
<Tabs>
 | 
						|
  <TabItem value="ex1" label="beta(10, 20)" default>
 | 
						|
    <SquiggleEditor initialSquiggleString="beta(10,20)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex2" label="beta(1000, 1000)">
 | 
						|
    <SquiggleEditor initialSquiggleString="beta(1000, 2000)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex3" label="beta(1, 10)">
 | 
						|
    <SquiggleEditor initialSquiggleString="beta(1, 10)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex4" label="beta(10, 1)">
 | 
						|
    <SquiggleEditor initialSquiggleString="beta(10, 1)" />
 | 
						|
  </TabItem>
 | 
						|
  <TabItem value="ex5" label="beta(0.8, 0.8)">
 | 
						|
    <SquiggleEditor initialSquiggleString="beta(0.8, 0.8)" />
 | 
						|
  </TabItem>
 | 
						|
</Tabs>
 | 
						|
 | 
						|
### Arguments
 | 
						|
 | 
						|
- `alpha`: Number greater than zero
 | 
						|
- `beta`: Number greater than zero
 | 
						|
 | 
						|
<Admonition type="caution" title="Caution with small numbers">
 | 
						|
  <p>
 | 
						|
    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.
 | 
						|
  </p>
 | 
						|
  <details>
 | 
						|
    <summary>Examples</summary>
 | 
						|
    <Tabs>
 | 
						|
      <TabItem value="ex1" label="beta(0.3, 0.3)" default>
 | 
						|
        <SquiggleEditor initialSquiggleString="beta(0.3, 0.3)" />
 | 
						|
      </TabItem>
 | 
						|
      <TabItem value="ex2" label="beta(0.5, 0.5)">
 | 
						|
        <SquiggleEditor initialSquiggleString="beta(0.5, 0.5)" />
 | 
						|
      </TabItem>
 | 
						|
      <TabItem value="ex3" label="beta(0.8, 0.8)">
 | 
						|
        <SquiggleEditor initialSquiggleString="beta(.8,.8)" />
 | 
						|
      </TabItem>
 | 
						|
      <TabItem value="ex4" label="beta(0.9, 0.9)">
 | 
						|
        <SquiggleEditor initialSquiggleString="beta(.9,.9)" />
 | 
						|
      </TabItem>
 | 
						|
    </Tabs>
 | 
						|
  </details>
 | 
						|
</Admonition>
 | 
						|
 | 
						|
## Exponential
 | 
						|
 | 
						|
`exponential(rate:number)`
 | 
						|
 | 
						|
Creates an [exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution) with the given rate.
 | 
						|
 | 
						|
<SquiggleEditor initialSquiggleString="exponential(4)" />
 | 
						|
 | 
						|
### 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.
 | 
						|
 | 
						|
### Arguments
 | 
						|
 | 
						|
- `low`: Number
 | 
						|
- `mode`: Number greater than `low`
 | 
						|
- `high`: Number greater than `mode`
 | 
						|
 | 
						|
<SquiggleEditor initialSquiggleString="triangular(1, 2, 4)" />
 | 
						|
 | 
						|
## FromSamples
 | 
						|
 | 
						|
`fromSamples(samples:number[])`
 | 
						|
 | 
						|
Creates a sample set distribution using an array of samples.
 | 
						|
 | 
						|
<SquiggleEditor initialSquiggleString="fromSamples([1,2,3,4,6,5,5,5])" />
 | 
						|
 | 
						|
### Arguments
 | 
						|
 | 
						|
- `samples`: An array of at least 5 numbers.
 | 
						|
 | 
						|
<Admonition type="caution" title="Caution!">
 | 
						|
  <p>
 | 
						|
    Samples are converted into{" "}
 | 
						|
    <a href="https://en.wikipedia.org/wiki/Probability_density_function">PDF</a>{" "}
 | 
						|
    shapes automatically using{" "}
 | 
						|
    <a href="https://en.wikipedia.org/wiki/Kernel_density_estimation">
 | 
						|
      kernel density estimation
 | 
						|
    </a>{" "}
 | 
						|
    and an approximated bandwidth. Eventually Squiggle will allow for more
 | 
						|
    specificity.
 | 
						|
  </p>
 | 
						|
</Admonition>
 |