---
sidebar_position: 3
title: Distribution
---

import TOCInline from "@theme/TOCInline";

<TOCInline toc={toc} />

## Distribution Creation

### Normal Distribution

**Definitions**

```javascript
normal: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

```javascript
normal: (dict<{p5: frValueDistOrNumber, p95: frValueDistOrNumber}>) => distribution
```

```javascript
normal: (dict<{mean: frValueDistOrNumber, stdev: frValueDistOrNumber}>) => distribution
```

**Examples**

```js
normal(5, 1);
normal({ p5: 4, p95: 10 });
normal({ mean: 5, stdev: 2 });
```

### Lognormal Distribution

**Definitions**

```javascript
lognormal: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

```javascript
lognormal: (dict<{p5: frValueDistOrNumber, p95: frValueDistOrNumber}>) => distribution
```

```javascript
lognormal: (dict<{mean: frValueDistOrNumber, stdev: frValueDistOrNumber}>) => distribution
```

**Examples**

```javascript
lognormal(0.5, 0.8);
lognormal({ p5: 4, p95: 10 });
lognormal({ mean: 5, stdev: 2 });
```

### Uniform Distribution

**Definitions**

```javascript
uniform: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
uniform(10, 12);
```

### Beta Distribution

**Definitions**

```javascript
beta: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
beta(20, 25);
```

### Cauchy Distribution

**Definitions**

```javascript
cauchy: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
cauchy(5, 1);
```

### Gamma Distribution

**Definitions**

```javascript
gamma: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
gamma(5, 1);
```

### Logistic Distribution

**Definitions**

```javascript
logistic: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
gamma(5, 1);
```

### To (Distribution)

**Definitions**

```javascript
to: (frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

```javascript
credibleIntervalToDistribution(frValueDistOrNumber, frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
5 to 10
to(5,10)
-5 to 5
```

### Exponential

**Definitions**

```javascript
exponential: (frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
exponential(2);
```

### Bernoulli

**Definitions**

```javascript
bernoulli: (frValueDistOrNumber) => distribution;
```

**Examples**

```javascript
bernoulli(0.5);
```

### toContinuousPointSet

Converts a set of points to a continuous distribution

**Definitions**

```javascript
toContinuousPointSet: (array<dict<{x: numeric, y: numeric}>>) => distribution
```

**Examples**

```javascript
toContinuousPointSet([
  { x: 0, y: 0.1 },
  { x: 1, y: 0.2 },
  { x: 2, y: 0.15 },
  { x: 3, y: 0.1 },
]);
```

### toDiscretePointSet

Converts a set of points to a discrete distribution

**Definitions**

```javascript
toDiscretePointSet: (array<dict<{x: numeric, y: numeric}>>) => distribution
```

**Examples**

```javascript
toDiscretePointSet([
  { x: 0, y: 0.1 },
  { x: 1, y: 0.2 },
  { x: 2, y: 0.15 },
  { x: 3, y: 0.1 },
]);
```

## Functions

### mixture

```javascript
mixture: (...distributionLike, weights:list<float>) => distribution
```

**Examples**

```javascript
mixture(normal(5, 1), normal(10, 1));
mx(normal(5, 1), normal(10, 1), [0.3, 0.7]);
```

### sample

Get one random sample from the distribution

```javascript
sample(distribution) => number
```

**Examples**

```javascript
sample(normal(5, 2));
```

### sampleN

Get n random samples from the distribution

```javascript
sampleN: (distribution, number) => list<number>
```

**Examples**

```javascript
sample: normal(5, 2), 100;
```

### mean

Get the distribution mean

```javascript
mean: (distribution) => number;
```

**Examples**

```javascript
mean: normal(5, 2);
```

### stdev

```javascript
stdev: (distribution) => number;
```

### variance

```javascript
variance: (distribution) => number;
```

### mode

```javascript
mode: (distribution) => number;
```

### cdf

```javascript
cdf: (distribution, number) => number;
```

**Examples**

```javascript
cdf: normal(5, 2), 3;
```

### pdf

```javascript
pdf: (distribution, number) => number;
```

**Examples**

```javascript
pdf(normal(5, 2), 3);
```

### inv

```javascript
inv: (distribution, number) => number;
```

**Examples**

```javascript
inv(normal(5, 2), 0.5);
```

### toPointSet

Converts a distribution to the pointSet format

```javascript
toPointSet: (distribution) => pointSetDistribution;
```

**Examples**

```javascript
toPointSet(normal(5, 2));
```

### toSampleSet

Converts a distribution to the sampleSet format, with n samples

```javascript
toSampleSet: (distribution, number) => sampleSetDistribution;
```

**Examples**

```javascript
toSampleSet(normal(5, 2), 1000);
```

### truncateLeft

Truncates the left side of a distribution. Returns either a pointSet distribution or a symbolic distribution.

```javascript
truncateLeft: (distribution, l => number) => distribution
```

**Examples**

```javascript
truncateLeft(normal(5, 2), 3);
```

### truncateRight

Truncates the right side of a distribution. Returns either a pointSet distribution or a symbolic distribution.

```javascript
truncateRight: (distribution, r => number) => distribution
```

**Examples**

```javascript
truncateLeft(normal(5, 2), 6);
```

## Scoring

### klDivergence

Kullback–Leibler divergence between two distributions

```javascript
klDivergence: (distribution, distribution) => number;
```

**Examples**

```javascript
klDivergence(normal(5, 2), normal(5, 4)); // returns 0.57
```

## Display

### toString

```javascript
toString: (distribution) => string;
```

**Examples**

```javascript
toString(normal(5, 2));
```

### toSparkline

Produce a sparkline of length n

```javascript
toSparkline: (distribution, n = 20) => string;
```

**Examples**

```javascript
toSparkline(normal(5, 2), 10);
```

### inspect

Prints the value of the distribution to the Javascript console, then returns the distribution.

```javascript
inspect: (distribution) => distribution;
```

**Examples**

```javascript
inspect(normal(5, 2));
```

## Normalization

### normalize

Normalize a distribution. This means scaling it appropriately so that it's cumulative sum is equal to 1.

```javascript
normalize: (distribution) => distribution;
```

**Examples**

```javascript
normalize(normal(5, 2));
```

### isNormalized

Check of a distribution is normalized. Most distributions are typically normalized, but there are some commands that could produce non-normalized distributions.

```javascript
isNormalized: (distribution) => bool;
```

**Examples**

```javascript
isNormalized(normal(5, 2)); // returns true
```

### integralSum

Get the sum of the integral of a distribution. If the distribution is normalized, this will be 1.

```javascript
integralSum: (distribution) => number;
```

**Examples**

```javascript
integralSum(normal(5, 2));
```

## Algebraic Operations

### add

```javascript
add: (distributionLike, distributionLike) => distribution;
```

### sum

```javascript
sum: (list<distributionLike>) => distribution
```

### multiply

```javascript
multiply: (distributionLike, distributionLike) => distribution;
```

### product

```javascript
product: (list<distributionLike>) => distribution
```

### subtract

```javascript
subtract: (distributionLike, distributionLike) => distribution;
```

### divide

```javascript
divide: (distributionLike, distributionLike) => distribution;
```

### pow

```javascript
pow: (distributionLike, distributionLike) => distribution;
```

### exp

```javascript
exp: (distributionLike, distributionLike) => distribution;
```

### log

```javascript
log: (distributionLike, distributionLike) => distribution;
```

### log10

```javascript
log10: (distributionLike, distributionLike) => distribution;
```

### unaryMinus

```javascript
unaryMinus: (distribution) => distribution;
```

## Pointwise Operations

### dotAdd

```javascript
dotAdd: (distributionLike, distributionLike) => distribution;
```

### dotMultiply

```javascript
dotMultiply: (distributionLike, distributionLike) => distribution;
```

### dotSubtract

```javascript
dotSubtract: (distributionLike, distributionLike) => distribution;
```

### dotDivide

```javascript
dotDivide: (distributionLike, distributionLike) => distribution;
```

### dotPow

```javascript
dotPow: (distributionLike, distributionLike) => distribution;
```

### dotExp

```javascript
dotExp: (distributionLike, distributionLike) => distribution;
```

## Scale Operations

### scaleMultiply

```javascript
scaleMultiply: (distributionLike, number) => distribution;
```

### scalePow

```javascript
scalePow: (distributionLike, number) => distribution;
```

### scaleExp

```javascript
scaleExp: (distributionLike, number) => distribution;
```

### scaleLog

```javascript
scaleLog: (distributionLike, number) => distribution;
```

### scaleLog10

```javascript
scaleLog10: (distributionLike, number) => distribution;
```

## Special

### Declaration (Continuous Function)

Adds metadata to a function of the input ranges. Works now for numeric and date inputs. This is useful when making predictions. It allows you to limit the domain that your prediction will be used and scored within.

```javascript
declareFn: (dict<{fn: lambda, inputs: array<dict<{min: number, max: number}>>}>) => declaration
```

**Examples**

```javascript
declareFn({
  fn: {|a,b| a },
  inputs: [
    {min: 0, max: 100},
    {min: 30, max: 50}
  ]
})
```
