From 56ab705d695a596fbafcb5bf922f1313380a8201 Mon Sep 17 00:00:00 2001 From: Jason Walsh Date: Fri, 3 Mar 2023 07:31:56 -0500 Subject: [PATCH 1/5] mode and std --- README.md | 34 +++++++------- src/index.js | 128 +++++++++++++++++++++++++++------------------------ 2 files changed, 83 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index e6aeea4..92b9313 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,6 @@ const exp = stochastic.exp(20); ## API - - ### poissP Returns an array with the times of each arrival in a [Poisson Process](http://en.wikipedia.org/wiki/Poisson_process) with rate `lambda` until time `T`. @@ -57,9 +55,9 @@ over the course of a standard 261 work-day year **Parameters** -- `lambda` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (rate) (optional, default `0`) -- `T` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** time as positive number (optional, default `0`) -- `path` **[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** (optional, default `true`) +- `lambda` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 0)** (rate) +- `T` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 0)** time as positive number +- `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** (optional, default `true`) **Examples** @@ -79,8 +77,8 @@ Returns the average. **Parameters** -- `data` - `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `data` **Examples** @@ -96,8 +94,8 @@ Returns the mode. **Parameters** -- `data` - `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `data` **Examples** @@ -148,7 +146,7 @@ Returns a mock data set that uses the same standard deviation and average. **Parameters** - `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** -- `num` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** a positive integer (optional, default `1`) +- `num` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)]** a positive integer (optional, default `1`) **Examples** @@ -168,7 +166,7 @@ Returns the Skew-Normal (SN) probability distribution. - `n` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** - `location` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** - `scale` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `shape` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 0 is the normal distribution (optional, default `/*: number */0`) +- `shape` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 0)** 0 is the normal distribution **Examples** @@ -186,9 +184,9 @@ Returns an array with `num` normal random variables in a [normal distribution](h **Parameters** -- `mu` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** the mean or expectation of the distribution (and also its median and mode) (optional, default `1`) -- `sigma` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** standard deviation as positive number (optional, default `0`) -- `num` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** a positive integer (optional, default `1`) +- `mu` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 1)** the mean or expectation of the distribution (and also its median and mode) +- `sigma` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 0)** standard deviation as positive number +- `num` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)]** a positive integer (optional, default `1`) - `xi` **Examples** @@ -211,7 +209,7 @@ Returns an array corresponding to the path of [Brownian motion](http://en.wikipe - `sigma` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** volatility parameter (strictly positive real) - `T` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** time (strictly positive real) - `steps` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive integer) -- `path` **[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** (optional, default `true`) +- `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** (optional, default `true`) **Examples** @@ -234,7 +232,7 @@ Returns an array corresponding to the path of [geometric Brownian motion](http:/ - `sigma` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** volatility parameter (strictly positive real) - `T` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** time (strictly positive real) - `steps` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive integer) -- `path` **[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** (optional, default `true`) +- `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** (optional, default `true`) **Examples** @@ -255,7 +253,7 @@ Returns an array with the states at each step of the [discrete-time Markov Chain - `transMatrix` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** - `steps` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive integer) - `start` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `path` **[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** (optional, default `true`) +- `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)](default true)** **Examples** @@ -292,7 +290,7 @@ Returns an object with the {key:value} pair {time:state} at each step of the [co - `transMatrix` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** - `T` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** - `start` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `path` **[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** (optional, default `true`) +- `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** (optional, default `true`) **Examples** @@ -325,7 +323,7 @@ Generates an exponential random variable with rate parameter `lambda`. **Parameters** -- `lambda` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive) (optional, default `1`) +- `lambda` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 1)** (positive) **Examples** @@ -341,9 +339,9 @@ Generates a Pareto random variables with parameters `x_m` and `alpha`. **Parameters** +- `x_a` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive) - `x_m` - `alpha` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `x_a` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive) **Examples** diff --git a/src/index.js b/src/index.js index ec88fa2..54cb3f7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,5 @@ /* @flow */ -var _skewness = require( 'compute-skewness' ); -var _kurtosis = require( 'compute-kurtosis' ); - /** * Returns an array with the times of each arrival in a [Poisson Process](http://en.wikipedia.org/wiki/Poisson_process) with rate `lambda` until time `T`. * @@ -69,20 +66,24 @@ export function average(data /*: Array */) { /** - * Returns the mode. + * Returns the mode (the most frequent value) from an array of numbers. * * @example const mode = stochastic.mode([1, 2, 3]); - * @param {number[]} values - * @returns {number} mode + * @param {number[]} values - An array of numbers. + * @returns {number} The mode of the input array. */ -export function mode(data /*: Array */) { - return data.reduce((p, c) => { - var val = p.numMapping[c] = (p.numMapping[c] || 0) + 1; - if (val > p.greatestFreq) { - p.greatestFreq = val; - p.mode = c; +export function mode(values /*: Array */) { + if (values.length === 0) { + throw new Error('Cannot find mode of an empty array.'); + } + + return values.reduce((accumulator, current) => { + var val = accumulator.numMapping[current] = (accumulator.numMapping[current] || 0) + 1; + if (val > accumulator.greatestFreq) { + accumulator.greatestFreq = val; + accumulator.mode = current; } - return p; + return accumulator; }, {mode: null, greatestFreq: -Infinity, numMapping: {}}).mode; } @@ -91,23 +92,31 @@ export function mode(data /*: Array */) { * Returns the standard deviation. * * @example const std = stochastic.std([2, 3, 4, 4, 4, 5, 6]); - * @param {number[]} values - * @returns {number} standard deviation as positive number + * @param {number[]} values - The array of values to calculate the standard deviation for. + * @returns {number} The standard deviation as a positive number. + * @throws {Error} If the input array is empty or contains non-numeric values. */ export function std(values /*: Array */) { - const avg = average(values); + if (values.length === 0) { + throw new Error("Input array cannot be empty"); + } - const squareDiffs = values.map(function(value){ - var diff = value - avg; - var sqrDiff = diff * diff; - return sqrDiff; - }); + if (!values.every(Number.isFinite)) { + throw new Error("Input array must only contain numeric values"); + } - const avgSquareDiff = average(squareDiffs); + const avg = average(values); - return Math.sqrt(avgSquareDiff); -} + const squareDiffs = values.map(function(value){ + var diff = value - avg; + var sqrDiff = diff * diff; + return sqrDiff; + }); + + const avgSquareDiff = average(squareDiffs); + return Math.sqrt(avgSquareDiff); +} /** * Provides a summary of a set of data. @@ -145,21 +154,18 @@ export function summary(values /*: Array */) { return result; }(sorted)); - const skewness = _skewness(values); - const kurtosis = _kurtosis(values); const _mode = mode(values); // mean | moment | skewness | std | var const result = { - min, - max, - range, - sum, - mean, - median, - mode: _mode, - stdev, - skewness, - excessKurtosis: kurtosis + min, + max, + range, + sum, + mean, + median, + mode: _mode, + stdev, + quantile }; return result; } @@ -237,43 +243,43 @@ export const norm = (mu = 1/*: number */, sigma = 0/*: number */, num = 1/*: num }; -// WIP: Distributions +// // WIP: Distributions -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Beta.html -// Usage: applied in acoustic analysis to assess damage to gears -const dbeta = (n, shape1, shape2, ncp = 0) => { +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Beta.html +// // Usage: applied in acoustic analysis to assess damage to gears +// const dbeta = (n, shape1, shape2, ncp = 0) => { -}; +// }; -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Binomial.html -// Usage: only two mutually exclusive possible outcomes, for example the outcome of tossing a coin is heads or tails -const dbinom = (x, size, prob, log = FALSE) => { +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Binomial.html +// // Usage: only two mutually exclusive possible outcomes, for example the outcome of tossing a coin is heads or tails +// const dbinom = (x, size, prob, log = FALSE) => { -}; +// }; -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Cauchy.html -// Usage: -const dcauchy = (x, location = 0, scale = 1, log = FALSE) => { +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Cauchy.html +// // Usage: +// const dcauchy = (x, location = 0, scale = 1, log = FALSE) => { -}; +// }; -// Usage: -const dlevy = () => { +// // Usage: +// const dlevy = () => { -}; +// }; -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Lognormal.html -// Usage: important in the description of natural phenomena. -const dlnorm = (x, meanlog = 0, sdlog = 1, log = false) => { +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Lognormal.html +// // Usage: important in the description of natural phenomena. +// const dlnorm = (x, meanlog = 0, sdlog = 1, log = false) => { -}; +// }; -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Weibull.html -// https://en.wikipedia.org/wiki/Weibull_distribution -// Usage: in industrial engineering to represent manufacturing and delivery times -const dweibull = (x, shape, scale = 1, log = false) => { +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Weibull.html +// // https://en.wikipedia.org/wiki/Weibull_distribution +// // Usage: in industrial engineering to represent manufacturing and delivery times +// const dweibull = (x, shape, scale = 1, log = false) => { -}; +// }; From 5879006d0e4cf2d4bbec060b92dbd613851710e3 Mon Sep 17 00:00:00 2001 From: Jason Walsh Date: Fri, 3 Mar 2023 07:33:58 -0500 Subject: [PATCH 2/5] summary --- src/index.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/index.js b/src/index.js index 54cb3f7..f414004 100644 --- a/src/index.js +++ b/src/index.js @@ -118,6 +118,7 @@ export function std(values /*: Array */) { return Math.sqrt(avgSquareDiff); } + /** * Provides a summary of a set of data. * @@ -129,33 +130,33 @@ export function summary(values /*: Array */) { if (values.length === 0) { return {}; } - const sorted = values.sort((a, b) => a - b); + const sorted = [...values].sort((a, b) => a - b); // Make a copy of the array to avoid modifying the original const min = sorted[0]; - const max = sorted[values.length - 1]; + const max = sorted[sorted.length - 1]; const range = [min, max]; const sum = values.reduce((p, c) => { return p + c; }, 0); const stdev = std(values); const median = (function(values) { if (values.length % 2 === 1) { - return sorted [(values.length - 1) / 2]; + return sorted[(values.length - 1) / 2]; } else { return (sorted[values.length / 2 - 1] + sorted[values.length / 2]) / 2; } }(values)); const mean = average(values); - // const std = std(values); const quantile = (function(values) { let result = [25, 50, 75].reduce((p, c) => { - p[c] = c; + p[c] = percentile(values, c); // Use percentile function to calculate percentiles return p; }, {}); return result; }(sorted)); - const _mode = mode(values); - // mean | moment | skewness | std | var + const modeArr = mode(values); + const mode = modeArr.length > 0 ? modeArr[0] : null; // Check if mode exists + const result = { min, max, @@ -163,7 +164,7 @@ export function summary(values /*: Array */) { sum, mean, median, - mode: _mode, + mode, stdev, quantile }; From b45666b15432b66eee7c04ccc24d119263c96e64 Mon Sep 17 00:00:00 2001 From: Jason Walsh Date: Fri, 3 Mar 2023 07:37:19 -0500 Subject: [PATCH 3/5] mock --- src/index.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/index.js b/src/index.js index f414004..0aa72fa 100644 --- a/src/index.js +++ b/src/index.js @@ -173,18 +173,16 @@ export function summary(values /*: Array */) { /** - * Returns a mock data set that uses the same standard deviation and average. + * Returns a mock data set with the same mean and standard deviation as the input data. * * ![norm](out/mock.png) * @example const mock = stochastic.mock(stochastic.norm(1, 1, 100)); * @param {number[]} values - * @param {number} [num=1] a positive integer - * @returns {number} standard deviation as positive number + * @param {number} [num=1] A positive integer representing the length of the mock data set to generate. + * @returns {number[]} An array of mock data generated with the same mean and standard deviation as the input data. */ -export function mock(values /*: Array */, num/*: number */) { - return norm(average(values), - std(values), - num || values.length); +export function mock(values /*: Array */, num /*: number */ = 1) { + return norm(average(values), std(values), num || values.length); } From b7970dc5b8123132fda40689f811324ef9f42755 Mon Sep 17 00:00:00 2001 From: Jason Walsh Date: Fri, 3 Mar 2023 07:40:29 -0500 Subject: [PATCH 4/5] Documentation cleanup --- .gitignore | 2 + README.md | 21 ++--- dist/bundle.min.js | 2 +- dist/bundle.min.js.map | 2 +- lib/index.js | 199 ++++++++++++++++++++++++----------------- src/index.js | 16 +++- stochastic-extern.js | 21 +++-- 7 files changed, 157 insertions(+), 106 deletions(-) diff --git a/.gitignore b/.gitignore index 7595163..fe8d710 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .DS_Store node_modules npm-debug.log +dist/ +lib/ diff --git a/README.md b/README.md index 92b9313..fbc131b 100644 --- a/README.md +++ b/README.md @@ -90,12 +90,11 @@ Returns **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer ### mode -Returns the mode. +Returns the mode (the most frequent value) from an array of numbers. **Parameters** -- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** -- `data` +- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** An array of numbers. **Examples** @@ -103,7 +102,7 @@ Returns the mode. const mode = stochastic.mode([1, 2, 3]); ``` -Returns **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** mode +Returns **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** The mode of the input array. ### std @@ -111,7 +110,7 @@ Returns the standard deviation. **Parameters** -- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** The array of values to calculate the standard deviation for. **Examples** @@ -119,7 +118,9 @@ Returns the standard deviation. const std = stochastic.std([2, 3, 4, 4, 4, 5, 6]); ``` -Returns **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** standard deviation as positive number +- Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** If the input array is empty or contains non-numeric values. + +Returns **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** The standard deviation as a positive number. ### summary @@ -139,14 +140,14 @@ Returns **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer ### mock -Returns a mock data set that uses the same standard deviation and average. +Returns a mock data set with the same mean and standard deviation as the input data. ![norm](out/mock.png) **Parameters** - `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** -- `num` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)]** a positive integer (optional, default `1`) +- `num` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)]** A positive integer representing the length of the mock data set to generate. (optional, default `1`) **Examples** @@ -154,7 +155,7 @@ Returns a mock data set that uses the same standard deviation and average. const mock = stochastic.mock(stochastic.norm(1, 1, 100)); ``` -Returns **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** standard deviation as positive number +Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** An array of mock data generated with the same mean and standard deviation as the input data. ### rsn @@ -174,7 +175,7 @@ Returns the Skew-Normal (SN) probability distribution. const rsn = stochastic.rsn(10000, 1.256269, 1.605681, 5); ``` -Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** average +Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** array of n numbers generated from the SN distribution ### norm diff --git a/dist/bundle.min.js b/dist/bundle.min.js index 0f0181c..3a9ed16 100644 --- a/dist/bundle.min.js +++ b/dist/bundle.min.js @@ -1,3 +1,3 @@ /*! @jwalsh/stochastic - 0.2.4 */ -!function(r){function t(o){if(n[o])return n[o].exports;var e=n[o]={i:o,l:!1,exports:{}};return r[o].call(e.exports,e,e.exports,t),e.l=!0,e.exports}var n={};t.m=r,t.c=n,t.d=function(r,n,o){t.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return t.d(n,"a",n),n},t.o=function(r,t){return Object.prototype.hasOwnProperty.call(r,t)},t.p="",t(t.s=0)}([function(r,t,n){window.stoch=n(1)},function(r,t,n){"use strict";function o(r){if(Array.isArray(r)){for(var t=0,n=Array(r.length);t0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=void 0,e=void 0,a=void 0,u=void 0,i=void 0;if(a=[0],u=0,i=0,t<=0||r<=0)return a;for(;u0&&e>0?!1===a?[r*Math.exp((t-n*n/2)*o+n*p(0,Math.sqrt(o),1)[0])]:(i=g(t-n*n/2,n,o,e,!0),i.forEach(function(t){u.push(r*Math.exp(t))}),u):i}function f(r,t,n,o){if(!m(r))throw new Error("Invalid transMatrix");var e=parseInt(n,10),a=[];a.push(e);for(var u=r[e],i=void 0,h=0;hi&&(a.push(v),u=r[v],v=u.length)}return!1===o?a[a.length-1]:a}function v(r){for(var t=Math.max.apply(Math,o(r))+1,n=Array(t).fill(0),e=[],a=0;at)return!1===o?{t:a}:e;v=0,h=Math.random();for(var d=0;dh&&(u=r[d],e[i]=d,a=d,d=u.length)}return e}function c(r,t){for(var n=[],o=0;o0&&void 0!==arguments[0]?arguments[0]:1;return-Math.log(Math.random())/r}function s(r,t){return r/Math.pow(Math.random(),1/t)}function M(r,t){for(var n=r.slice().sort(function(r,t){return r-t}),o=n[r.length-1],e=n[0],a=Math.round(Math.sqrt(r.length)),u=t||(o-e)/a,i={},h=[],f=0;f0&&void 0!==arguments[0]?arguments[0]:1,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,e=void 0,a=void 0,u=void 0,i=void 0,h=void 0,f=void 0,v=[];if(n<=0)return v;if(void 0===o||1===o||o%1!=0)return[r(t,n)[0]];o/2%2!=0&&v.push(r(t,n)[0]);for(var l=0;l0&&o>0))return a;if(!1===e)return[r*n+t*p(0,Math.sqrt(n),1)[0]];for(var f=0;f1||r[n][e]<0)return!1;o+=r[n][e]}var a=4*Math.pow(10,-16);if(o<1-a||o>1+a)return!1}return!0}}]); +!function(r){function t(e){if(n[e])return n[e].exports;var o=n[e]={exports:{},id:e,loaded:!1};return r[e].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=r,t.c=n,t.p="",t(0)}([function(r,t,n){window.stoch=n(1)},function(r,t){"use strict";function n(r){if(Array.isArray(r)){for(var t=0,n=Array(r.length);t0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],e=void 0,o=void 0,a=void 0,i=void 0,u=void 0;if(a=[0],i=0,u=0,t<=0||r<=0)return a;for(;ir.greatestFreq&&(r.greatestFreq=n,r.mode=t),r},{mode:null,greatestFreq:-(1/0),numMapping:{}}).mode}function i(r){if(0===r.length)throw new Error("Input array cannot be empty");if(!r.every(Number.isFinite))throw new Error("Input array must only contain numeric values");var t=o(r),n=r.map(function(r){var n=r-t,e=n*n;return e}),e=o(n);return Math.sqrt(e)}function u(r){if(0===r.length)return{};var t=[].concat(n(r)).sort(function(r,t){return r-t}),e=t[0],a=t[t.length-1],u=[e,a],h=r.reduce(function(r,t){return r+t},0),f=i(r),v=function(r){return r.length%2===1?t[(r.length-1)/2]:(t[r.length/2-1]+t[r.length/2])/2}(r),l=o(r),d=function(r){var t=[25,50,75].reduce(function(t,n){return t[n]=percentile(r,n),t},{});return t}(t),c=s(r),s=c.length>0?c[0]:null,M={min:e,max:a,range:u,sum:h,mean:l,median:v,mode:s,stdev:f,quantile:d};return M}function h(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return m(o(r),i(r),t||r.length)}function f(r,t,n){for(var e=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=0!==e?e/Math.sqrt(1+e*e):0,a=Math.random(),i=Math.random(),u=Math.sqrt(-2*Math.log(a))*Math.cos(2*Math.PI*i),h=o*u+Math.sqrt(1-o*o)*Math.sqrt(-2*Math.log(a))*Math.sin(2*Math.PI*i),f=t+n*h,v=new Array(r),l=0;l5&&void 0!==arguments[5])||arguments[5],i=[],u=[0];return e>0&&o>0?a===!1?[r*Math.exp((t-n*n/2)*e+n*m(0,Math.sqrt(e),1)[0])]:(u=y(t-n*n/2,n,e,o,!0),u.forEach(function(t){i.push(r*Math.exp(t))}),i):u}function l(r,t,n){var e=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];if(!w(r))throw new Error("Invalid transMatrix");var o=parseInt(n,10),a=[];a.push(o);for(var i=r[o],u=void 0,h=0;hu&&(a.push(v),i=r[v],v=i.length)}return e===!1?a[a.length-1]:a}function d(r){for(var t=Math.max.apply(Math,n(r))+1,e=Array(t).fill(0),o=[],a=0;a3&&void 0!==arguments[3])||arguments[3];if(!w(r))throw new Error("Invalid transMatrix");for(var o={0:n},a=n,i=r[n],u=0,h=void 0,f=void 0,v=void 0;ut)return e===!1?{t:a}:o;v=0,h=Math.random();for(var c=0;ch&&(i=r[c],o[u]=c,a=c,c=i.length)}return o}function s(r,t){for(var n=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:1;return-Math.log(Math.random())/r}function g(r,t){return r/Math.pow(Math.random(),1/t)}function p(r,t){for(var n=r.slice().sort(function(r,t){return r-t}),e=n[r.length-1],o=n[0],a=Math.round(Math.sqrt(r.length)),i=t||(e-o)/a,u={},h=[],f=0;f0&&void 0!==arguments[0]?arguments[0]:1,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,o=(arguments[3],void 0),a=void 0,i=void 0,u=void 0,h=void 0,f=void 0,v=[];if(n<=0)return v;if("undefined"==typeof e||1===e||e%1!==0)return[r(t,n)[0]];e/2%2!==0&&v.push(r(t,n)[0]);for(var l=0;l4&&void 0!==arguments[4])||arguments[4],a=[0],i=0,u=n/e,h=void 0;if(!(n>0&&e>0))return a;if(o===!1)return[r*n+t*m(0,Math.sqrt(n),1)[0]];for(var f=0;f1||r[n][o]<0)return!1;e+=r[n][o]}var a=4*Math.pow(10,-16);if(e<1-a||e>1+a)return!1}return!0}}]); //# sourceMappingURL=bundle.min.js.map \ No newline at end of file diff --git a/dist/bundle.min.js.map b/dist/bundle.min.js.map index 046dbd7..af81cf0 100644 --- a/dist/bundle.min.js.map +++ b/dist/bundle.min.js.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"bundle.min.js","sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///bundle.min.js","webpack:///webpack/bootstrap d3055ab28226bcfe381a","webpack:///./dist/index.js","webpack:///./lib/index.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","window","stoch","_toConsumableArray","arr","Array","isArray","i","arr2","length","from","poissP","lambda","arguments","undefined","T","path","U","exp","N_t","t","n","Math","random","log","push","average","data","sum","reduce","curr","acc","mode","values","Error","accumulator","current","val","numMapping","greatestFreq","Infinity","std","every","Number","isFinite","avg","squareDiffs","map","value","diff","sqrDiff","avgSquareDiff","sqrt","summary","sorted","concat","sort","a","b","min","max","range","stdev","median","mean","quantile","result","percentile","modeArr","mock","num","norm","rsn","location","scale","shape","u","v","x","cos","PI","y","sin","z","GBM","S0","mu","sigma","steps","S_t","B_t","brown","forEach","B","DTMC","transMatrix","start","isValid","init","parseInt","fullPath","stateRow","j","collate","states","apply","row","fill","slice","previous","weighted","e","CTMC","0","lastState","sample","samp","index","floor","pareto","x_m","alpha","pow","hist","newArr","bins","round","binSize","obj","keys","key","temp_key","cont","Object","defineProperty","boxMuller","U1","U2","z1","z2","dt","dB","matrix","eps"],"mappings":"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","file":"bundle.min.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\twindow.stoch = __webpack_require__(1);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.poissP = poissP;\n\texports.average = average;\n\texports.mode = mode;\n\texports.std = std;\n\texports.summary = summary;\n\texports.mock = mock;\n\texports.rsn = rsn;\n\texports.GBM = GBM;\n\texports.DTMC = DTMC;\n\texports.collate = collate;\n\texports.CTMC = CTMC;\n\texports.sample = sample;\n\texports.exp = exp;\n\texports.pareto = pareto;\n\texports.hist = hist;\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t/**\n\t * Returns an array with the times of each arrival in a [Poisson Process](http://en.wikipedia.org/wiki/Poisson_process) with rate `lambda` until time `T`.\n\t *\n\t * ![poissP](out/poissP.png)\n\t *\n\t * *Exercise*: Assuming you get 10 emails per hour over the course of an 8 hour day,\n\t * what's the distribution of the number of emails you receive\n\t * over the course of a standard 261 work-day year\n\t *\n\t * ![poissP-emails](out/poissP-emails.png)\n\t *\n\t * @example const poissP = stochastic.poissP(1, 100, true);\n\t * @example const emails = stochastic.hist(Array(261).fill().map(e => stochastic.poissP(10, 8, true).length));\n\t * @param {number} lambda (rate)\n\t * @param {number} T time as positive number\n\t * @param {boolean} [path=true]\n\t * @returns {number[]} times of each arrival in a Poisson Process\n\t */\n\tfunction poissP() /*: boolean */ /*: Array */{\n\t var lambda = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var T = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\t\n\t var U = void 0,\n\t exp = void 0,\n\t N_t = void 0,\n\t t = void 0,\n\t n = void 0;\n\t N_t = [0];\n\t t = 0;\n\t n = 0;\n\t\n\t if (T <= 0 || lambda <= 0) {\n\t return N_t;\n\t }\n\t\n\t // https://www.probabilitycourse.com/chapter11/11_1_2_basic_concepts_of_the_poisson_process.php\n\t while (t < T) {\n\t U = Math.random();\n\t exp = -Math.log(U) / lambda;\n\t t += exp;\n\t if (t < T) {\n\t n += 1;\n\t N_t.push(t);\n\t }\n\t }\n\t\n\t if (path === false) {\n\t return [n];\n\t } else {\n\t return N_t;\n\t }\n\t}\n\t\n\t/**\n\t * Returns the average.\n\t *\n\t * @example const avg = stochastic.average([1, 2, 3]);\n\t * @param {number[]} values\n\t * @returns {number} average\n\t */\n\tfunction average(data /*: Array */) {\n\t var sum = data.reduce(function (curr, acc) {\n\t return acc + curr;\n\t }, 0);\n\t return sum / data.length;\n\t}\n\t\n\t/**\n\t * Returns the mode (the most frequent value) from an array of numbers.\n\t *\n\t * @example const mode = stochastic.mode([1, 2, 3]);\n\t * @param {number[]} values - An array of numbers.\n\t * @returns {number} The mode of the input array.\n\t */\n\tfunction mode(values /*: Array */) {\n\t if (values.length === 0) {\n\t throw new Error('Cannot find mode of an empty array.');\n\t }\n\t\n\t return values.reduce(function (accumulator, current) {\n\t var val = accumulator.numMapping[current] = (accumulator.numMapping[current] || 0) + 1;\n\t if (val > accumulator.greatestFreq) {\n\t accumulator.greatestFreq = val;\n\t accumulator.mode = current;\n\t }\n\t return accumulator;\n\t }, { mode: null, greatestFreq: -Infinity, numMapping: {} }).mode;\n\t}\n\t\n\t/**\n\t * Returns the standard deviation.\n\t *\n\t * @example const std = stochastic.std([2, 3, 4, 4, 4, 5, 6]);\n\t * @param {number[]} values - The array of values to calculate the standard deviation for.\n\t * @returns {number} The standard deviation as a positive number.\n\t * @throws {Error} If the input array is empty or contains non-numeric values.\n\t */\n\tfunction std(values /*: Array */) {\n\t if (values.length === 0) {\n\t throw new Error(\"Input array cannot be empty\");\n\t }\n\t\n\t if (!values.every(Number.isFinite)) {\n\t throw new Error(\"Input array must only contain numeric values\");\n\t }\n\t\n\t var avg = average(values);\n\t\n\t var squareDiffs = values.map(function (value) {\n\t var diff = value - avg;\n\t var sqrDiff = diff * diff;\n\t return sqrDiff;\n\t });\n\t\n\t var avgSquareDiff = average(squareDiffs);\n\t\n\t return Math.sqrt(avgSquareDiff);\n\t}\n\t\n\t/**\n\t * Provides a summary of a set of data.\n\t *\n\t * @example const summary = stochastic.summary([1, 2, 3]);\n\t * @param {number[]} values\n\t * @returns {object} R-like summary of values\n\t */\n\tfunction summary(values /*: Array */) {\n\t if (values.length === 0) {\n\t return {};\n\t }\n\t var sorted = [].concat(_toConsumableArray(values)).sort(function (a, b) {\n\t return a - b;\n\t }); // Make a copy of the array to avoid modifying the original\n\t\n\t var min = sorted[0];\n\t var max = sorted[sorted.length - 1];\n\t var range = [min, max];\n\t\n\t var sum = values.reduce(function (p, c) {\n\t return p + c;\n\t }, 0);\n\t var stdev = std(values);\n\t var median = function (values) {\n\t if (values.length % 2 === 1) {\n\t return sorted[(values.length - 1) / 2];\n\t } else {\n\t return (sorted[values.length / 2 - 1] + sorted[values.length / 2]) / 2;\n\t }\n\t }(values);\n\t var mean = average(values);\n\t var quantile = function (values) {\n\t var result = [25, 50, 75].reduce(function (p, c) {\n\t p[c] = percentile(values, c); // Use percentile function to calculate percentiles\n\t return p;\n\t }, {});\n\t return result;\n\t }(sorted);\n\t\n\t var modeArr = mode(values);\n\t var mode = modeArr.length > 0 ? modeArr[0] : null; // Check if mode exists\n\t\n\t var result = {\n\t min: min,\n\t max: max,\n\t range: range,\n\t sum: sum,\n\t mean: mean,\n\t median: median,\n\t mode: mode,\n\t stdev: stdev,\n\t quantile: quantile\n\t };\n\t return result;\n\t}\n\t\n\t/**\n\t * Returns a mock data set with the same mean and standard deviation as the input data.\n\t *\n\t * ![norm](out/mock.png)\n\t * @example const mock = stochastic.mock(stochastic.norm(1, 1, 100));\n\t * @param {number[]} values\n\t * @param {number} [num=1] A positive integer representing the length of the mock data set to generate.\n\t * @returns {number[]} An array of mock data generated with the same mean and standard deviation as the input data.\n\t */\n\tfunction mock(values /*: Array */) {\n\t var num /*: number */ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\t\n\t return norm(average(values), std(values), num || values.length);\n\t}\n\t\n\t/**\n\t * Returns the Skew-Normal (SN) probability distribution.\n\t * http://azzalini.stat.unipd.it/SN/\n\t *\n\t * @example const rsn = stochastic.rsn(10000, 1.256269, 1.605681, 5);\n\t * @param {number} n\n\t * @param {number} location\n\t * @param {number} scale\n\t * @param {number} shape 0 is the normal distribution\n\t * @returns {number[]} array of n numbers generated from the SN distribution\n\t */\n\tfunction rsn(n, location, scale) {\n\t var shape = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n\t\n\t var t = shape !== 0 ? shape / Math.sqrt(1 + shape * shape) : 0;\n\t var u = Math.random();\n\t var v = Math.random();\n\t var x = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);\n\t var y = t * x + Math.sqrt(1 - t * t) * Math.sqrt(-2 * Math.log(u)) * Math.sin(2 * Math.PI * v);\n\t var z = location + scale * y;\n\t var result = new Array(n);\n\t for (var i = 0; i < n; i++) {\n\t result[i] = z;\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Returns an array with `num` normal random variables in a [normal distribution](http://en.wikipedia.org/wiki/Normal_distribution) of mean `mu` and standard deviation `sigma`.\n\t *\n\t * ![norm](out/norm.png)\n\t * @example const norm = stochastic.norm(1, 1, 100);\n\t * @param {number} mu the mean or expectation of the distribution (and also its median and mode)\n\t * @param {number} sigma standard deviation as positive number\n\t * @param {number} [num=1] a positive integer\n\t * @returns {number[]} normal random values\n\t */\n\tvar norm = exports.norm = function norm() /*: Array */{\n\t var mu = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\t var sigma = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t var num = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\t var /*: number */xi = arguments[3];\n\t\n\t var U1 = void 0,\n\t U2 = void 0,\n\t x = void 0,\n\t y = void 0,\n\t z1 = void 0,\n\t z2 = void 0;\n\t var sample = [];\n\t\n\t if (sigma <= 0) {\n\t return sample;\n\t }\n\t\n\t function boxMuller(mu, sigma) {\n\t U1 = Math.random();\n\t U2 = Math.random();\n\t z1 = Math.sqrt(-2 * Math.log(U1)) * Math.cos(2 * U2 * Math.PI);\n\t z2 = Math.sqrt(-2 * Math.log(U1)) * Math.sin(2 * U2 * Math.PI);\n\t x = mu + sigma * z1;\n\t y = mu + sigma * z2;\n\t return [x, y];\n\t }\n\t\n\t if (typeof num === 'undefined' || num === 1 || num % 1 !== 0) {\n\t return [boxMuller(mu, sigma)[0]];\n\t }\n\t\n\t if (num / 2 % 2 !== 0) sample.push(boxMuller(mu, sigma)[0]);\n\t for (var i = 0; i < Math.floor(num / 2); i++) {\n\t sample = sample.concat(boxMuller(mu, sigma));\n\t }\n\t return sample;\n\t};\n\t\n\t// // WIP: Distributions\n\t\n\t// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Beta.html\n\t// // Usage: applied in acoustic analysis to assess damage to gears\n\t// const dbeta = (n, shape1, shape2, ncp = 0) => {\n\t\n\t// };\n\t\n\t// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Binomial.html\n\t// // Usage: only two mutually exclusive possible outcomes, for example the outcome of tossing a coin is heads or tails\n\t// const dbinom = (x, size, prob, log = FALSE) => {\n\t\n\t// };\n\t\n\t// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Cauchy.html\n\t// // Usage:\n\t// const dcauchy = (x, location = 0, scale = 1, log = FALSE) => {\n\t\n\t// };\n\t\n\t// // Usage:\n\t// const dlevy = () => {\n\t\n\t// };\n\t\n\t// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Lognormal.html\n\t// // Usage: important in the description of natural phenomena.\n\t// const dlnorm = (x, meanlog = 0, sdlog = 1, log = false) => {\n\t\n\t// };\n\t\n\t// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Weibull.html\n\t// // https://en.wikipedia.org/wiki/Weibull_distribution\n\t// // Usage: in industrial engineering to represent manufacturing and delivery times\n\t// const dweibull = (x, shape, scale = 1, log = false) => {\n\t\n\t// };\n\t\n\t\n\t/**\n\t * Returns an array corresponding to the path of [Brownian motion](http://en.wikipedia.org/wiki/Wiener_process#Related_processes) from time 0 to `T` with drift parameter `mu` and volatility parameter `sigma` (the process is initialized to be 0). The i-th entry in the array corresponds to the Brownian process at time `i * (T / steps)`.\n\t *\n\t * ![brown](out/brown.png)\n\t * @example const brown = stochastic.brown(1.0, -0.1, +0.1, 100, true);\n\t * @param {number} mu drift parameter (a real number)\n\t * @param {number} sigma volatility parameter (strictly positive real)\n\t * @param {number} T time (strictly positive real)\n\t * @param {number} steps (positive integer)\n\t * @param {boolean} [path=true]\n\t * @return {number[]} Brownian motion path\n\t */\n\tvar brown = exports.brown = function brown(mu /*: number */\n\t, sigma /*: number */\n\t, T /*: number */\n\t, steps /*: number */\n\t) /*: boolean */ /*: Array */{\n\t var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n\t\n\t var B_t = [0];\n\t var B = 0;\n\t var dt = T / steps;\n\t var dB = void 0;\n\t\n\t if (!(T > 0) || !(steps > 0)) {\n\t return B_t;\n\t }\n\t\n\t if (path === false) {\n\t return [mu * T + sigma * norm(0, Math.sqrt(T), 1)[0]];\n\t } else {\n\t for (var i = 0; i < steps; i++) {\n\t dB = mu * dt + sigma * norm(0, Math.sqrt(dt), 1)[0];\n\t B += dB;\n\t B_t.push(B);\n\t }\n\t return B_t;\n\t }\n\t};\n\t\n\t/**\n\t * Returns an array corresponding to the path of [geometric Brownian motion](http://en.wikipedia.org/wiki/Geometric_Brownian_motion) from time 0 to `T` with drift parameter `mu` and volatility parameter `sigma` (the process is initialized to be S0). The i-th entry in the array corresponds to the geometric Brownian process at time `i * (T/steps)`.\n\t *\n\t * ![GBM](out/GBM.png)\n\t * @example const GBM = stochastic.GBM(1.0, -0.1, 0.1, 1.0, 100, true);\n\t * @param {number} S0 initialized process value\n\t * @param {number} mu drift parameter\n\t * @param {number} sigma volatility parameter (strictly positive real)\n\t * @param {number} T time (strictly positive real)\n\t * @param {number} steps (positive integer)\n\t * @param {boolean} [path=true]\n\t * @returns {number[]} geometric Brownian motion\n\t */\n\tfunction GBM(S0 /*: number */\n\t, mu /*:number */\n\t, sigma /*: number */\n\t, T /*: number */\n\t, steps /*: number */\n\t) /*: boolean */ /*: Array */{\n\t var path = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\t\n\t var S_t = [];\n\t var B_t = [0];\n\t\n\t if (!(T > 0) || !(steps > 0)) {\n\t return B_t;\n\t }\n\t\n\t if (path === false) {\n\t return [S0 * Math.exp((mu - sigma * sigma / 2) * T + sigma * norm(0, Math.sqrt(T), 1)[0])];\n\t } else {\n\t B_t = brown(mu - sigma * sigma / 2, sigma, T, steps, true);\n\t B_t.forEach(function (B) {\n\t S_t.push(S0 * Math.exp(B));\n\t });\n\t return S_t;\n\t }\n\t}\n\t\n\tvar isValid = function isValid(matrix) {\n\t var n = matrix.length;\n\t for (var i = 0; i < n; i++) {\n\t var sum = 0;\n\t if (matrix[i].length !== n) {\n\t return false;\n\t }\n\t for (var j = 0; j < n; j++) {\n\t if (matrix[i][j] > 1 || matrix[i][j] < 0) {\n\t return false;\n\t }\n\t sum += matrix[i][j];\n\t }\n\t var eps = 4 * Math.pow(10, -16);\n\t if (sum < 1 - eps || sum > 1 + eps) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t};\n\t\n\t/**\n\t * Returns an array with the states at each step of the [discrete-time Markov Chain](http://en.wikipedia.org/wiki/Markov_chain) given by `transMatrix` (a square matrix). The number of transitions is given by `steps`. The initial state is given by start (the states are indexed from 0 to n-1 where n is the number of arrays in transMatrix).\n\t *\n\t * ![DTMC](out/DTMC.png)\n\t * @example const DTMC = stochastic.DTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true);\n\t * @param {Array>} transMatrix\n\t * @param {number} steps (positive integer)\n\t * @param {number} start\n\t * @param {boolean} path\n\t * @returns {number[]}\n\t */\n\tfunction DTMC(transMatrix /*: Array> */\n\t, steps /*: number */\n\t, start /*: number */\n\t) /*: boolean */ /*: Array */{\n\t var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t\n\t //function to check if input is a valid transition matrix\n\t\n\t //return null if the transition matrix is not valid\n\t if (!isValid(transMatrix)) {\n\t throw new Error(\"Invalid transMatrix\");\n\t }\n\t\n\t //initialize the Markov Chain\n\t var init = parseInt(start, 10);\n\t var fullPath = [];\n\t fullPath.push(init);\n\t var stateRow = transMatrix[init];\n\t var U = void 0;\n\t\n\t for (var i = 0; i < steps; i++) {\n\t U = Math.random();\n\t var sum = 0;\n\t for (var j = 0; j < stateRow.length; j++) {\n\t sum += stateRow[j];\n\t if (sum > U) {\n\t fullPath.push(j);\n\t stateRow = transMatrix[j];\n\t j = stateRow.length;\n\t }\n\t }\n\t }\n\t if (path === false) {\n\t return fullPath[fullPath.length - 1];\n\t } else {\n\t return fullPath;\n\t }\n\t}\n\t\n\t/**\n\t * Returns the `transMatrix` for an array of mapped `states` to numerical values.\n\t *\n\t * @example const collate = stochastic.collate([0,1,0,0,0,1,1,0,0]);\n\t * @param {number[]} states\n\t * @returns {Array>} transMatrix\n\t */\n\tfunction collate(states /*: Array */) {\n\t // TODO: Allow for arbitrary string values let uniques = [], lookup = {};\n\t var max = Math.max.apply(Math, _toConsumableArray(states)) + 1;\n\t var row = Array(max).fill(0);\n\t var transMatrix = []; // Array(max).fill(row.slice());\n\t for (var i = 0; i < row.length; i++) {\n\t transMatrix.push(row.slice());\n\t }\n\t\n\t var result = states.reduce(function (p, c) {\n\t p.transMatrix[p.previous][c]++;\n\t p.previous = c;\n\t return p;\n\t }, {\n\t transMatrix: transMatrix,\n\t previous: 0\n\t });\n\t var weighted = result.transMatrix.map(function (e) {\n\t var sum = e.reduce(function (p, c) {\n\t return p + c;\n\t }, 0);\n\t return e.map(function (e) {\n\t return e / sum;\n\t });\n\t });\n\t // TODO: percentages\n\t // console.log(result.transMatrix);\n\t return weighted;\n\t}\n\t\n\t/**\n\t * Returns an object with the {key:value} pair {time:state} at each step of the [continuous-time Markov Chain](http://en.wikipedia.org/wiki/Continuous-time_Markov_chain) given by transMatrix (a square matrix). The Markov Chain is simulated until time `T`. The initial state is given by `start` (the states are indexed from 0 to n-1 where n is the number of arrays in `transMatrix`).\n\t *\n\t * ![CTMC](out/CTMC.png)\n\t * @example const CTMC = stochastic.CTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true);\n\t * @param {Array>} transMatrix\n\t * @param {number} T\n\t * @param {number} start\n\t * @param {boolean} [path=true]\n\t * @returns {Object} Continuous-time Markov chain\n\t */\n\tfunction CTMC(transMatrix /*: Array> */\n\t, T /*: number */\n\t, start /*: number */\n\t) /*: boolean */ /*: {[ts:string]: number} */{\n\t var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t\n\t // function to determine if input is a valid CTMC transition matrix\n\t\n\t //return null if the transition matrix is not valid\n\t if (!isValid(transMatrix)) {\n\t throw new Error(\"Invalid transMatrix\");\n\t }\n\t\n\t // initialize simulation of the CTMC\n\t var fullPath = { \"0\": start };\n\t var lastState = start;\n\t var stateRow = transMatrix[start];\n\t var t = 0;\n\t var U = void 0,\n\t exp = void 0,\n\t sum = void 0;\n\t\n\t // begin simulation\n\t while (t < T) {\n\t var lambda = 0;\n\t for (var i = 0; i < stateRow.length; i++) {\n\t lambda += stateRow[i];\n\t }\n\t U = Math.random();\n\t exp = -Math.log(U) / lambda; //exp is the time to make the transition\n\t t += exp;\n\t\n\t if (t > T) {\n\t if (path === false) {\n\t return { t: lastState };\n\t } else {\n\t return fullPath;\n\t }\n\t }\n\t\n\t sum = 0;\n\t U = Math.random();\n\t for (var j = 0; j < stateRow.length; j++) {\n\t sum += stateRow[j] / lambda;\n\t if (sum > U) {\n\t stateRow = transMatrix[j];\n\t fullPath[t] = j;\n\t lastState = j;\n\t j = stateRow.length;\n\t }\n\t }\n\t }\n\t return fullPath;\n\t}\n\t\n\t/**\n\t * Generates a random sample (with replacement) from array `arr` of observations. Number of observations `n` is specified by the user.\n\t * @example const sample = stochastic.sample([1,2,3,4,5], +10);\n\t * @param {number[]} arr\n\t * @param {number} n (positive integer)\n\t * @returns {number[]} random sample\n\t */\n\tfunction sample(arr /*: number[] */, n /*: number */) /*: Array */{\n\t var samp = [];\n\t for (var i = 0; i < n; i++) {\n\t var index = Math.floor(Math.random() * arr.length);\n\t var value = arr[index];\n\t samp.push(value);\n\t }\n\t return samp;\n\t}\n\t\n\t/**\n\t * Generates an exponential random variable with rate parameter `lambda`.\n\t * @example const exp = stochastic.exp(20);\n\t * @param {number} lambda (positive)\n\t * @returns {number} variable\n\t */\n\tfunction exp() /*: number */ /*: number */{\n\t var lambda = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\t\n\t return -Math.log(Math.random()) / lambda;\n\t}\n\t\n\t/**\n\t * Generates a Pareto random variables with parameters `x_m` and `alpha`.\n\t * @example const pareto = stochastic.pareto(+20.0, -1.0);\n\t * @param {number} x_a (positive)\n\t * @param {number} alpha\n\t * @returns {number} distribution\n\t */\n\tfunction pareto(x_m /*: number */, alpha /*: number */) /*: number */{\n\t return x_m / Math.pow(Math.random(), 1 / alpha);\n\t}\n\t\n\t/**\n\t * Generates a histogram object from an array of data. Keys denote the lower bound of each bin and the values indicate the frequency of data in each bin.\n\t *\n\t * ![hist](out/hist.png)\n\t * @example const hist = stochastic.hist([1,1,1,1,2,3,3,4,4,4]);\n\t * @param {Array} arr\n\t * @returns {Object} histogram\n\t */\n\tfunction hist(arr /*: Array */, n /*: number */) {\n\t var newArr = arr.slice().sort(function (a, b) {\n\t return a - b;\n\t });\n\t\n\t var max = newArr[arr.length - 1];\n\t var min = newArr[0];\n\t var bins = Math.round(Math.sqrt(arr.length));\n\t var binSize = n || (max - min) / bins;\n\t\n\t var obj = {};\n\t var keys = [];\n\t for (var i = 0; i < bins; i++) {\n\t var key = min + i * binSize;\n\t keys.push(key);\n\t obj[key] = 0;\n\t }\n\t\n\t for (var j = 0; j < arr.length; j++) {\n\t var val = min;\n\t var temp_key = 0;\n\t var cont = true;\n\t while (cont) {\n\t if (newArr[j] === newArr[newArr.length - 1]) {\n\t obj[keys[keys.length - 1]] += 1;\n\t cont = false;\n\t break;\n\t } else if (newArr[j] < val + binSize) {\n\t obj[keys[temp_key]] += 1;\n\t cont = false;\n\t break;\n\t } else {\n\t temp_key += 1;\n\t val += binSize;\n\t }\n\t }\n\t }\n\t\n\t return obj;\n\t}\n\n/***/ }\n/******/ ]);\n\n\n/** WEBPACK FOOTER **\n ** bundle.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap d3055ab28226bcfe381a\n **/","window.stoch = require('../lib/index.js');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./dist/index.js\n ** module id = 0\n ** module chunks = 0\n **/","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.poissP = poissP;\nexports.average = average;\nexports.mode = mode;\nexports.std = std;\nexports.summary = summary;\nexports.mock = mock;\nexports.rsn = rsn;\nexports.GBM = GBM;\nexports.DTMC = DTMC;\nexports.collate = collate;\nexports.CTMC = CTMC;\nexports.sample = sample;\nexports.exp = exp;\nexports.pareto = pareto;\nexports.hist = hist;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * Returns an array with the times of each arrival in a [Poisson Process](http://en.wikipedia.org/wiki/Poisson_process) with rate `lambda` until time `T`.\n *\n * ![poissP](out/poissP.png)\n *\n * *Exercise*: Assuming you get 10 emails per hour over the course of an 8 hour day,\n * what's the distribution of the number of emails you receive\n * over the course of a standard 261 work-day year\n *\n * ![poissP-emails](out/poissP-emails.png)\n *\n * @example const poissP = stochastic.poissP(1, 100, true);\n * @example const emails = stochastic.hist(Array(261).fill().map(e => stochastic.poissP(10, 8, true).length));\n * @param {number} lambda (rate)\n * @param {number} T time as positive number\n * @param {boolean} [path=true]\n * @returns {number[]} times of each arrival in a Poisson Process\n */\nfunction poissP() /*: boolean */ /*: Array */{\n var lambda = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var T = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var U = void 0,\n exp = void 0,\n N_t = void 0,\n t = void 0,\n n = void 0;\n N_t = [0];\n t = 0;\n n = 0;\n\n if (T <= 0 || lambda <= 0) {\n return N_t;\n }\n\n // https://www.probabilitycourse.com/chapter11/11_1_2_basic_concepts_of_the_poisson_process.php\n while (t < T) {\n U = Math.random();\n exp = -Math.log(U) / lambda;\n t += exp;\n if (t < T) {\n n += 1;\n N_t.push(t);\n }\n }\n\n if (path === false) {\n return [n];\n } else {\n return N_t;\n }\n}\n\n/**\n * Returns the average.\n *\n * @example const avg = stochastic.average([1, 2, 3]);\n * @param {number[]} values\n * @returns {number} average\n */\nfunction average(data /*: Array */) {\n var sum = data.reduce(function (curr, acc) {\n return acc + curr;\n }, 0);\n return sum / data.length;\n}\n\n/**\n * Returns the mode (the most frequent value) from an array of numbers.\n *\n * @example const mode = stochastic.mode([1, 2, 3]);\n * @param {number[]} values - An array of numbers.\n * @returns {number} The mode of the input array.\n */\nfunction mode(values /*: Array */) {\n if (values.length === 0) {\n throw new Error('Cannot find mode of an empty array.');\n }\n\n return values.reduce(function (accumulator, current) {\n var val = accumulator.numMapping[current] = (accumulator.numMapping[current] || 0) + 1;\n if (val > accumulator.greatestFreq) {\n accumulator.greatestFreq = val;\n accumulator.mode = current;\n }\n return accumulator;\n }, { mode: null, greatestFreq: -Infinity, numMapping: {} }).mode;\n}\n\n/**\n * Returns the standard deviation.\n *\n * @example const std = stochastic.std([2, 3, 4, 4, 4, 5, 6]);\n * @param {number[]} values - The array of values to calculate the standard deviation for.\n * @returns {number} The standard deviation as a positive number.\n * @throws {Error} If the input array is empty or contains non-numeric values.\n */\nfunction std(values /*: Array */) {\n if (values.length === 0) {\n throw new Error(\"Input array cannot be empty\");\n }\n\n if (!values.every(Number.isFinite)) {\n throw new Error(\"Input array must only contain numeric values\");\n }\n\n var avg = average(values);\n\n var squareDiffs = values.map(function (value) {\n var diff = value - avg;\n var sqrDiff = diff * diff;\n return sqrDiff;\n });\n\n var avgSquareDiff = average(squareDiffs);\n\n return Math.sqrt(avgSquareDiff);\n}\n\n/**\n * Provides a summary of a set of data.\n *\n * @example const summary = stochastic.summary([1, 2, 3]);\n * @param {number[]} values\n * @returns {object} R-like summary of values\n */\nfunction summary(values /*: Array */) {\n if (values.length === 0) {\n return {};\n }\n var sorted = [].concat(_toConsumableArray(values)).sort(function (a, b) {\n return a - b;\n }); // Make a copy of the array to avoid modifying the original\n\n var min = sorted[0];\n var max = sorted[sorted.length - 1];\n var range = [min, max];\n\n var sum = values.reduce(function (p, c) {\n return p + c;\n }, 0);\n var stdev = std(values);\n var median = function (values) {\n if (values.length % 2 === 1) {\n return sorted[(values.length - 1) / 2];\n } else {\n return (sorted[values.length / 2 - 1] + sorted[values.length / 2]) / 2;\n }\n }(values);\n var mean = average(values);\n var quantile = function (values) {\n var result = [25, 50, 75].reduce(function (p, c) {\n p[c] = percentile(values, c); // Use percentile function to calculate percentiles\n return p;\n }, {});\n return result;\n }(sorted);\n\n var modeArr = mode(values);\n var mode = modeArr.length > 0 ? modeArr[0] : null; // Check if mode exists\n\n var result = {\n min: min,\n max: max,\n range: range,\n sum: sum,\n mean: mean,\n median: median,\n mode: mode,\n stdev: stdev,\n quantile: quantile\n };\n return result;\n}\n\n/**\n * Returns a mock data set with the same mean and standard deviation as the input data.\n *\n * ![norm](out/mock.png)\n * @example const mock = stochastic.mock(stochastic.norm(1, 1, 100));\n * @param {number[]} values\n * @param {number} [num=1] A positive integer representing the length of the mock data set to generate.\n * @returns {number[]} An array of mock data generated with the same mean and standard deviation as the input data.\n */\nfunction mock(values /*: Array */) {\n var num /*: number */ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n return norm(average(values), std(values), num || values.length);\n}\n\n/**\n * Returns the Skew-Normal (SN) probability distribution.\n * http://azzalini.stat.unipd.it/SN/\n *\n * @example const rsn = stochastic.rsn(10000, 1.256269, 1.605681, 5);\n * @param {number} n\n * @param {number} location\n * @param {number} scale\n * @param {number} shape 0 is the normal distribution\n * @returns {number[]} array of n numbers generated from the SN distribution\n */\nfunction rsn(n, location, scale) {\n var shape = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n\n var t = shape !== 0 ? shape / Math.sqrt(1 + shape * shape) : 0;\n var u = Math.random();\n var v = Math.random();\n var x = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);\n var y = t * x + Math.sqrt(1 - t * t) * Math.sqrt(-2 * Math.log(u)) * Math.sin(2 * Math.PI * v);\n var z = location + scale * y;\n var result = new Array(n);\n for (var i = 0; i < n; i++) {\n result[i] = z;\n }\n return result;\n}\n\n/**\n * Returns an array with `num` normal random variables in a [normal distribution](http://en.wikipedia.org/wiki/Normal_distribution) of mean `mu` and standard deviation `sigma`.\n *\n * ![norm](out/norm.png)\n * @example const norm = stochastic.norm(1, 1, 100);\n * @param {number} mu the mean or expectation of the distribution (and also its median and mode)\n * @param {number} sigma standard deviation as positive number\n * @param {number} [num=1] a positive integer\n * @returns {number[]} normal random values\n */\nvar norm = exports.norm = function norm() /*: Array */{\n var mu = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var sigma = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var num = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var /*: number */xi = arguments[3];\n\n var U1 = void 0,\n U2 = void 0,\n x = void 0,\n y = void 0,\n z1 = void 0,\n z2 = void 0;\n var sample = [];\n\n if (sigma <= 0) {\n return sample;\n }\n\n function boxMuller(mu, sigma) {\n U1 = Math.random();\n U2 = Math.random();\n z1 = Math.sqrt(-2 * Math.log(U1)) * Math.cos(2 * U2 * Math.PI);\n z2 = Math.sqrt(-2 * Math.log(U1)) * Math.sin(2 * U2 * Math.PI);\n x = mu + sigma * z1;\n y = mu + sigma * z2;\n return [x, y];\n }\n\n if (typeof num === 'undefined' || num === 1 || num % 1 !== 0) {\n return [boxMuller(mu, sigma)[0]];\n }\n\n if (num / 2 % 2 !== 0) sample.push(boxMuller(mu, sigma)[0]);\n for (var i = 0; i < Math.floor(num / 2); i++) {\n sample = sample.concat(boxMuller(mu, sigma));\n }\n return sample;\n};\n\n// // WIP: Distributions\n\n// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Beta.html\n// // Usage: applied in acoustic analysis to assess damage to gears\n// const dbeta = (n, shape1, shape2, ncp = 0) => {\n\n// };\n\n// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Binomial.html\n// // Usage: only two mutually exclusive possible outcomes, for example the outcome of tossing a coin is heads or tails\n// const dbinom = (x, size, prob, log = FALSE) => {\n\n// };\n\n// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Cauchy.html\n// // Usage:\n// const dcauchy = (x, location = 0, scale = 1, log = FALSE) => {\n\n// };\n\n// // Usage:\n// const dlevy = () => {\n\n// };\n\n// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Lognormal.html\n// // Usage: important in the description of natural phenomena.\n// const dlnorm = (x, meanlog = 0, sdlog = 1, log = false) => {\n\n// };\n\n// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Weibull.html\n// // https://en.wikipedia.org/wiki/Weibull_distribution\n// // Usage: in industrial engineering to represent manufacturing and delivery times\n// const dweibull = (x, shape, scale = 1, log = false) => {\n\n// };\n\n\n/**\n * Returns an array corresponding to the path of [Brownian motion](http://en.wikipedia.org/wiki/Wiener_process#Related_processes) from time 0 to `T` with drift parameter `mu` and volatility parameter `sigma` (the process is initialized to be 0). The i-th entry in the array corresponds to the Brownian process at time `i * (T / steps)`.\n *\n * ![brown](out/brown.png)\n * @example const brown = stochastic.brown(1.0, -0.1, +0.1, 100, true);\n * @param {number} mu drift parameter (a real number)\n * @param {number} sigma volatility parameter (strictly positive real)\n * @param {number} T time (strictly positive real)\n * @param {number} steps (positive integer)\n * @param {boolean} [path=true]\n * @return {number[]} Brownian motion path\n */\nvar brown = exports.brown = function brown(mu /*: number */\n, sigma /*: number */\n, T /*: number */\n, steps /*: number */\n) /*: boolean */ /*: Array */{\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n\n var B_t = [0];\n var B = 0;\n var dt = T / steps;\n var dB = void 0;\n\n if (!(T > 0) || !(steps > 0)) {\n return B_t;\n }\n\n if (path === false) {\n return [mu * T + sigma * norm(0, Math.sqrt(T), 1)[0]];\n } else {\n for (var i = 0; i < steps; i++) {\n dB = mu * dt + sigma * norm(0, Math.sqrt(dt), 1)[0];\n B += dB;\n B_t.push(B);\n }\n return B_t;\n }\n};\n\n/**\n * Returns an array corresponding to the path of [geometric Brownian motion](http://en.wikipedia.org/wiki/Geometric_Brownian_motion) from time 0 to `T` with drift parameter `mu` and volatility parameter `sigma` (the process is initialized to be S0). The i-th entry in the array corresponds to the geometric Brownian process at time `i * (T/steps)`.\n *\n * ![GBM](out/GBM.png)\n * @example const GBM = stochastic.GBM(1.0, -0.1, 0.1, 1.0, 100, true);\n * @param {number} S0 initialized process value\n * @param {number} mu drift parameter\n * @param {number} sigma volatility parameter (strictly positive real)\n * @param {number} T time (strictly positive real)\n * @param {number} steps (positive integer)\n * @param {boolean} [path=true]\n * @returns {number[]} geometric Brownian motion\n */\nfunction GBM(S0 /*: number */\n, mu /*:number */\n, sigma /*: number */\n, T /*: number */\n, steps /*: number */\n) /*: boolean */ /*: Array */{\n var path = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n var S_t = [];\n var B_t = [0];\n\n if (!(T > 0) || !(steps > 0)) {\n return B_t;\n }\n\n if (path === false) {\n return [S0 * Math.exp((mu - sigma * sigma / 2) * T + sigma * norm(0, Math.sqrt(T), 1)[0])];\n } else {\n B_t = brown(mu - sigma * sigma / 2, sigma, T, steps, true);\n B_t.forEach(function (B) {\n S_t.push(S0 * Math.exp(B));\n });\n return S_t;\n }\n}\n\nvar isValid = function isValid(matrix) {\n var n = matrix.length;\n for (var i = 0; i < n; i++) {\n var sum = 0;\n if (matrix[i].length !== n) {\n return false;\n }\n for (var j = 0; j < n; j++) {\n if (matrix[i][j] > 1 || matrix[i][j] < 0) {\n return false;\n }\n sum += matrix[i][j];\n }\n var eps = 4 * Math.pow(10, -16);\n if (sum < 1 - eps || sum > 1 + eps) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns an array with the states at each step of the [discrete-time Markov Chain](http://en.wikipedia.org/wiki/Markov_chain) given by `transMatrix` (a square matrix). The number of transitions is given by `steps`. The initial state is given by start (the states are indexed from 0 to n-1 where n is the number of arrays in transMatrix).\n *\n * ![DTMC](out/DTMC.png)\n * @example const DTMC = stochastic.DTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true);\n * @param {Array>} transMatrix\n * @param {number} steps (positive integer)\n * @param {number} start\n * @param {boolean} path\n * @returns {number[]}\n */\nfunction DTMC(transMatrix /*: Array> */\n, steps /*: number */\n, start /*: number */\n) /*: boolean */ /*: Array */{\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\n //function to check if input is a valid transition matrix\n\n //return null if the transition matrix is not valid\n if (!isValid(transMatrix)) {\n throw new Error(\"Invalid transMatrix\");\n }\n\n //initialize the Markov Chain\n var init = parseInt(start, 10);\n var fullPath = [];\n fullPath.push(init);\n var stateRow = transMatrix[init];\n var U = void 0;\n\n for (var i = 0; i < steps; i++) {\n U = Math.random();\n var sum = 0;\n for (var j = 0; j < stateRow.length; j++) {\n sum += stateRow[j];\n if (sum > U) {\n fullPath.push(j);\n stateRow = transMatrix[j];\n j = stateRow.length;\n }\n }\n }\n if (path === false) {\n return fullPath[fullPath.length - 1];\n } else {\n return fullPath;\n }\n}\n\n/**\n * Returns the `transMatrix` for an array of mapped `states` to numerical values.\n *\n * @example const collate = stochastic.collate([0,1,0,0,0,1,1,0,0]);\n * @param {number[]} states\n * @returns {Array>} transMatrix\n */\nfunction collate(states /*: Array */) {\n // TODO: Allow for arbitrary string values let uniques = [], lookup = {};\n var max = Math.max.apply(Math, _toConsumableArray(states)) + 1;\n var row = Array(max).fill(0);\n var transMatrix = []; // Array(max).fill(row.slice());\n for (var i = 0; i < row.length; i++) {\n transMatrix.push(row.slice());\n }\n\n var result = states.reduce(function (p, c) {\n p.transMatrix[p.previous][c]++;\n p.previous = c;\n return p;\n }, {\n transMatrix: transMatrix,\n previous: 0\n });\n var weighted = result.transMatrix.map(function (e) {\n var sum = e.reduce(function (p, c) {\n return p + c;\n }, 0);\n return e.map(function (e) {\n return e / sum;\n });\n });\n // TODO: percentages\n // console.log(result.transMatrix);\n return weighted;\n}\n\n/**\n * Returns an object with the {key:value} pair {time:state} at each step of the [continuous-time Markov Chain](http://en.wikipedia.org/wiki/Continuous-time_Markov_chain) given by transMatrix (a square matrix). The Markov Chain is simulated until time `T`. The initial state is given by `start` (the states are indexed from 0 to n-1 where n is the number of arrays in `transMatrix`).\n *\n * ![CTMC](out/CTMC.png)\n * @example const CTMC = stochastic.CTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true);\n * @param {Array>} transMatrix\n * @param {number} T\n * @param {number} start\n * @param {boolean} [path=true]\n * @returns {Object} Continuous-time Markov chain\n */\nfunction CTMC(transMatrix /*: Array> */\n, T /*: number */\n, start /*: number */\n) /*: boolean */ /*: {[ts:string]: number} */{\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\n // function to determine if input is a valid CTMC transition matrix\n\n //return null if the transition matrix is not valid\n if (!isValid(transMatrix)) {\n throw new Error(\"Invalid transMatrix\");\n }\n\n // initialize simulation of the CTMC\n var fullPath = { \"0\": start };\n var lastState = start;\n var stateRow = transMatrix[start];\n var t = 0;\n var U = void 0,\n exp = void 0,\n sum = void 0;\n\n // begin simulation\n while (t < T) {\n var lambda = 0;\n for (var i = 0; i < stateRow.length; i++) {\n lambda += stateRow[i];\n }\n U = Math.random();\n exp = -Math.log(U) / lambda; //exp is the time to make the transition\n t += exp;\n\n if (t > T) {\n if (path === false) {\n return { t: lastState };\n } else {\n return fullPath;\n }\n }\n\n sum = 0;\n U = Math.random();\n for (var j = 0; j < stateRow.length; j++) {\n sum += stateRow[j] / lambda;\n if (sum > U) {\n stateRow = transMatrix[j];\n fullPath[t] = j;\n lastState = j;\n j = stateRow.length;\n }\n }\n }\n return fullPath;\n}\n\n/**\n * Generates a random sample (with replacement) from array `arr` of observations. Number of observations `n` is specified by the user.\n * @example const sample = stochastic.sample([1,2,3,4,5], +10);\n * @param {number[]} arr\n * @param {number} n (positive integer)\n * @returns {number[]} random sample\n */\nfunction sample(arr /*: number[] */, n /*: number */) /*: Array */{\n var samp = [];\n for (var i = 0; i < n; i++) {\n var index = Math.floor(Math.random() * arr.length);\n var value = arr[index];\n samp.push(value);\n }\n return samp;\n}\n\n/**\n * Generates an exponential random variable with rate parameter `lambda`.\n * @example const exp = stochastic.exp(20);\n * @param {number} lambda (positive)\n * @returns {number} variable\n */\nfunction exp() /*: number */ /*: number */{\n var lambda = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\n return -Math.log(Math.random()) / lambda;\n}\n\n/**\n * Generates a Pareto random variables with parameters `x_m` and `alpha`.\n * @example const pareto = stochastic.pareto(+20.0, -1.0);\n * @param {number} x_a (positive)\n * @param {number} alpha\n * @returns {number} distribution\n */\nfunction pareto(x_m /*: number */, alpha /*: number */) /*: number */{\n return x_m / Math.pow(Math.random(), 1 / alpha);\n}\n\n/**\n * Generates a histogram object from an array of data. Keys denote the lower bound of each bin and the values indicate the frequency of data in each bin.\n *\n * ![hist](out/hist.png)\n * @example const hist = stochastic.hist([1,1,1,1,2,3,3,4,4,4]);\n * @param {Array} arr\n * @returns {Object} histogram\n */\nfunction hist(arr /*: Array */, n /*: number */) {\n var newArr = arr.slice().sort(function (a, b) {\n return a - b;\n });\n\n var max = newArr[arr.length - 1];\n var min = newArr[0];\n var bins = Math.round(Math.sqrt(arr.length));\n var binSize = n || (max - min) / bins;\n\n var obj = {};\n var keys = [];\n for (var i = 0; i < bins; i++) {\n var key = min + i * binSize;\n keys.push(key);\n obj[key] = 0;\n }\n\n for (var j = 0; j < arr.length; j++) {\n var val = min;\n var temp_key = 0;\n var cont = true;\n while (cont) {\n if (newArr[j] === newArr[newArr.length - 1]) {\n obj[keys[keys.length - 1]] += 1;\n cont = false;\n break;\n } else if (newArr[j] < val + binSize) {\n obj[keys[temp_key]] += 1;\n cont = false;\n break;\n } else {\n temp_key += 1;\n val += binSize;\n }\n }\n }\n\n return obj;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/index.js\n ** module id = 1\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 41fe886..b62a739 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,4 +1,4 @@ -'use strict'; +"use strict"; Object.defineProperty(exports, "__esModule", { value: true @@ -9,6 +9,7 @@ exports.mode = mode; exports.std = std; exports.summary = summary; exports.mock = mock; +exports.rsn = rsn; exports.GBM = GBM; exports.DTMC = DTMC; exports.collate = collate; @@ -20,9 +21,6 @@ exports.hist = hist; function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } -var _skewness = require('compute-skewness'); -var _kurtosis = require('compute-kurtosis'); - /** * Returns an array with the times of each arrival in a [Poisson Process](http://en.wikipedia.org/wiki/Poisson_process) with rate `lambda` until time `T`. * @@ -34,8 +32,8 @@ var _kurtosis = require('compute-kurtosis'); * * ![poissP-emails](out/poissP-emails.png) * - * @example const poissP = stoch.poissP(1, 100, true); - * @example const emails = stoch.hist(Array(261).fill().map(e => stoch.poissP(10, 8, true).length)); + * @example const poissP = stochastic.poissP(1, 100, true); + * @example const emails = stochastic.hist(Array(261).fill().map(e => stochastic.poissP(10, 8, true).length)); * @param {number} lambda (rate) * @param {number} T time as positive number * @param {boolean} [path=true] @@ -80,7 +78,7 @@ function poissP() /*: boolean */ /*: Array */{ /** * Returns the average. * - * @example const avg = stoch.average([1, 2, 3]); + * @example const avg = stochastic.average([1, 2, 3]); * @param {number[]} values * @returns {number} average */ @@ -92,31 +90,44 @@ function average(data /*: Array */) { } /** - * Returns the mode. + * Returns the mode (the most frequent value) from an array of numbers. * - * @example const mode = stoch.mode([1, 2, 3]); - * @param {number[]} values - * @returns {number} mode + * @example const mode = stochastic.mode([1, 2, 3]); + * @param {number[]} values - An array of numbers. + * @returns {number} The mode of the input array. */ -function mode(data /*: Array */) { - return data.reduce(function (p, c) { - var val = p.numMapping[c] = (p.numMapping[c] || 0) + 1; - if (val > p.greatestFreq) { - p.greatestFreq = val; - p.mode = c; +function mode(values /*: Array */) { + if (values.length === 0) { + throw new Error('Cannot find mode of an empty array.'); + } + + return values.reduce(function (accumulator, current) { + var val = accumulator.numMapping[current] = (accumulator.numMapping[current] || 0) + 1; + if (val > accumulator.greatestFreq) { + accumulator.greatestFreq = val; + accumulator.mode = current; } - return p; + return accumulator; }, { mode: null, greatestFreq: -Infinity, numMapping: {} }).mode; } /** * Returns the standard deviation. * - * @example const std = stoch.std([2, 3, 4, 4, 4, 5, 6]); - * @param {number[]} values - * @returns {number} standard deviation as positive number + * @example const std = stochastic.std([2, 3, 4, 4, 4, 5, 6]); + * @param {number[]} values - The array of values to calculate the standard deviation for. + * @returns {number} The standard deviation as a positive number. + * @throws {Error} If the input array is empty or contains non-numeric values. */ function std(values /*: Array */) { + if (values.length === 0) { + throw new Error("Input array cannot be empty"); + } + + if (!values.every(Number.isFinite)) { + throw new Error("Input array must only contain numeric values"); + } + var avg = average(values); var squareDiffs = values.map(function (value) { @@ -133,7 +144,7 @@ function std(values /*: Array */) { /** * Provides a summary of a set of data. * - * @example const summary = stoch.summary([1, 2, 3]); + * @example const summary = stochastic.summary([1, 2, 3]); * @param {number[]} values * @returns {object} R-like summary of values */ @@ -141,12 +152,12 @@ function summary(values /*: Array */) { if (values.length === 0) { return {}; } - var sorted = values.sort(function (a, b) { + var sorted = [].concat(_toConsumableArray(values)).sort(function (a, b) { return a - b; - }); + }); // Make a copy of the array to avoid modifying the original var min = sorted[0]; - var max = sorted[values.length - 1]; + var max = sorted[sorted.length - 1]; var range = [min, max]; var sum = values.reduce(function (p, c) { @@ -161,18 +172,16 @@ function summary(values /*: Array */) { } }(values); var mean = average(values); - // const std = std(values); var quantile = function (values) { var result = [25, 50, 75].reduce(function (p, c) { - p[c] = c; + p[c] = percentile(values, c); // Use percentile function to calculate percentiles return p; }, {}); return result; }(sorted); - var skewness = _skewness(values); - var kurtosis = _kurtosis(values); - var _mode = mode(values); + var modeArr = mode(values); + var mode = modeArr.length > 0 ? modeArr[0] : null; // Check if mode exists var result = { min: min, @@ -181,32 +190,60 @@ function summary(values /*: Array */) { sum: sum, mean: mean, median: median, - mode: _mode, + mode: mode, stdev: stdev, - skewness: skewness, - excessKurtosis: kurtosis + quantile: quantile }; return result; } /** - * Returns a mock data set that uses the same standard deviation and average. + * Returns a mock data set with the same mean and standard deviation as the input data. * * ![norm](out/mock.png) - * @example const mock = stoch.mock(stoch.norm(1, 1, 100)); + * @example const mock = stochastic.mock(stochastic.norm(1, 1, 100)); * @param {number[]} values - * @param {number} [num=1] a positive integer - * @returns {number} standard deviation as positive number + * @param {number} [num=1] A positive integer representing the length of the mock data set to generate. + * @returns {number[]} An array of mock data generated with the same mean and standard deviation as the input data. */ -function mock(values /*: Array */, num /*: number */) { +function mock(values /*: Array */) { + var num /*: number */ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + return norm(average(values), std(values), num || values.length); } +/** + * Returns the Skew-Normal (SN) probability distribution. + * http://azzalini.stat.unipd.it/SN/ + * + * @example const rsn = stochastic.rsn(10000, 1.256269, 1.605681, 5); + * @param {number} n + * @param {number} location + * @param {number} scale + * @param {number} shape 0 is the normal distribution + * @returns {number[]} array of n numbers generated from the SN distribution + */ +function rsn(n, location, scale) { + var shape = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + + var t = shape !== 0 ? shape / Math.sqrt(1 + shape * shape) : 0; + var u = Math.random(); + var v = Math.random(); + var x = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v); + var y = t * x + Math.sqrt(1 - t * t) * Math.sqrt(-2 * Math.log(u)) * Math.sin(2 * Math.PI * v); + var z = location + scale * y; + var result = new Array(n); + for (var i = 0; i < n; i++) { + result[i] = z; + } + return result; +} + /** * Returns an array with `num` normal random variables in a [normal distribution](http://en.wikipedia.org/wiki/Normal_distribution) of mean `mu` and standard deviation `sigma`. * * ![norm](out/norm.png) - * @example const norm = stoch.norm(1, 1, 100); + * @example const norm = stochastic.norm(1, 1, 100); * @param {number} mu the mean or expectation of the distribution (and also its median and mode) * @param {number} sigma standard deviation as positive number * @param {number} [num=1] a positive integer @@ -251,52 +288,50 @@ var norm = exports.norm = function norm() /*: Array */{ return sample; }; -// WIP: Distributions +// // WIP: Distributions -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Beta.html -// Usage: applied in acoustic analysis to assess damage to gears -var dbeta = function dbeta(n, shape1, shape2) { - var ncp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; -}; +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Beta.html +// // Usage: applied in acoustic analysis to assess damage to gears +// const dbeta = (n, shape1, shape2, ncp = 0) => { -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Binomial.html -// Usage: only two mutually exclusive possible outcomes, for example the outcome of tossing a coin is heads or tails -var dbinom = function dbinom(x, size, prob) { - var log = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : FALSE; -}; +// }; -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Cauchy.html -// Usage: -var dcauchy = function dcauchy(x) { - var location = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - var scale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; - var log = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : FALSE; -}; +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Binomial.html +// // Usage: only two mutually exclusive possible outcomes, for example the outcome of tossing a coin is heads or tails +// const dbinom = (x, size, prob, log = FALSE) => { -// Usage: -var dlevy = function dlevy() {}; +// }; -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Lognormal.html -// Usage: important in the description of natural phenomena. -var dlnorm = function dlnorm(x) { - var meanlog = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - var sdlog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; - var log = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; -}; +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Cauchy.html +// // Usage: +// const dcauchy = (x, location = 0, scale = 1, log = FALSE) => { + +// }; + +// // Usage: +// const dlevy = () => { + +// }; + +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Lognormal.html +// // Usage: important in the description of natural phenomena. +// const dlnorm = (x, meanlog = 0, sdlog = 1, log = false) => { + +// }; + +// // https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Weibull.html +// // https://en.wikipedia.org/wiki/Weibull_distribution +// // Usage: in industrial engineering to represent manufacturing and delivery times +// const dweibull = (x, shape, scale = 1, log = false) => { + +// }; -// https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Weibull.html -// https://en.wikipedia.org/wiki/Weibull_distribution -// Usage: in industrial engineering to represent manufacturing and delivery times -var dweibull = function dweibull(x, shape) { - var scale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; - var log = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; -}; /** * Returns an array corresponding to the path of [Brownian motion](http://en.wikipedia.org/wiki/Wiener_process#Related_processes) from time 0 to `T` with drift parameter `mu` and volatility parameter `sigma` (the process is initialized to be 0). The i-th entry in the array corresponds to the Brownian process at time `i * (T / steps)`. * * ![brown](out/brown.png) - * @example const brown = stoch.brown(1.0, -0.1, +0.1, 100, true); + * @example const brown = stochastic.brown(1.0, -0.1, +0.1, 100, true); * @param {number} mu drift parameter (a real number) * @param {number} sigma volatility parameter (strictly positive real) * @param {number} T time (strictly positive real) @@ -336,7 +371,7 @@ var brown = exports.brown = function brown(mu /*: number */ * Returns an array corresponding to the path of [geometric Brownian motion](http://en.wikipedia.org/wiki/Geometric_Brownian_motion) from time 0 to `T` with drift parameter `mu` and volatility parameter `sigma` (the process is initialized to be S0). The i-th entry in the array corresponds to the geometric Brownian process at time `i * (T/steps)`. * * ![GBM](out/GBM.png) - * @example const GBM = stoch.GBM(1.0, -0.1, 0.1, 1.0, 100, true); + * @example const GBM = stochastic.GBM(1.0, -0.1, 0.1, 1.0, 100, true); * @param {number} S0 initialized process value * @param {number} mu drift parameter * @param {number} sigma volatility parameter (strictly positive real) @@ -396,7 +431,7 @@ var isValid = function isValid(matrix) { * Returns an array with the states at each step of the [discrete-time Markov Chain](http://en.wikipedia.org/wiki/Markov_chain) given by `transMatrix` (a square matrix). The number of transitions is given by `steps`. The initial state is given by start (the states are indexed from 0 to n-1 where n is the number of arrays in transMatrix). * * ![DTMC](out/DTMC.png) - * @example const DTMC = stoch.DTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true); + * @example const DTMC = stochastic.DTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true); * @param {Array>} transMatrix * @param {number} steps (positive integer) * @param {number} start @@ -445,7 +480,7 @@ function DTMC(transMatrix /*: Array> */ /** * Returns the `transMatrix` for an array of mapped `states` to numerical values. * - * @example const collate = stoch.collate([0,1,0,0,0,1,1,0,0]); + * @example const collate = stochastic.collate([0,1,0,0,0,1,1,0,0]); * @param {number[]} states * @returns {Array>} transMatrix */ @@ -483,7 +518,7 @@ function collate(states /*: Array */) { * Returns an object with the {key:value} pair {time:state} at each step of the [continuous-time Markov Chain](http://en.wikipedia.org/wiki/Continuous-time_Markov_chain) given by transMatrix (a square matrix). The Markov Chain is simulated until time `T`. The initial state is given by `start` (the states are indexed from 0 to n-1 where n is the number of arrays in `transMatrix`). * * ![CTMC](out/CTMC.png) - * @example const CTMC = stoch.CTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true); + * @example const CTMC = stochastic.CTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true); * @param {Array>} transMatrix * @param {number} T * @param {number} start @@ -547,7 +582,7 @@ function CTMC(transMatrix /*: Array> */ /** * Generates a random sample (with replacement) from array `arr` of observations. Number of observations `n` is specified by the user. - * @example const sample = stoch.sample([1,2,3,4,5], +10); + * @example const sample = stochastic.sample([1,2,3,4,5], +10); * @param {number[]} arr * @param {number} n (positive integer) * @returns {number[]} random sample @@ -564,7 +599,7 @@ function sample(arr /*: number[] */, n /*: number */) /*: Array */{ /** * Generates an exponential random variable with rate parameter `lambda`. - * @example const exp = stoch.exp(20); + * @example const exp = stochastic.exp(20); * @param {number} lambda (positive) * @returns {number} variable */ @@ -576,7 +611,7 @@ function exp() /*: number */ /*: number */{ /** * Generates a Pareto random variables with parameters `x_m` and `alpha`. - * @example const pareto = stoch.pareto(+20.0, -1.0); + * @example const pareto = stochastic.pareto(+20.0, -1.0); * @param {number} x_a (positive) * @param {number} alpha * @returns {number} distribution @@ -589,7 +624,7 @@ function pareto(x_m /*: number */, alpha /*: number */) /*: number */{ * Generates a histogram object from an array of data. Keys denote the lower bound of each bin and the values indicate the frequency of data in each bin. * * ![hist](out/hist.png) - * @example const hist = stoch.hist([1,1,1,1,2,3,3,4,4,4]); + * @example const hist = stochastic.hist([1,1,1,1,2,3,3,4,4,4]); * @param {Array} arr * @returns {Object} histogram */ diff --git a/src/index.js b/src/index.js index 0aa72fa..5b9edeb 100644 --- a/src/index.js +++ b/src/index.js @@ -195,10 +195,20 @@ export function mock(values /*: Array */, num /*: number */ = 1) { * @param {number} location * @param {number} scale * @param {number} shape 0 is the normal distribution - * @returns {number[]} average + * @returns {number[]} array of n numbers generated from the SN distribution */ -export function rsn(n/*: number */, location/*: number */, scale/*: number */, shape/*: number */ = 0) { - return false; +export function rsn(n, location, scale, shape = 0) { + const t = shape !== 0 ? shape / Math.sqrt(1 + shape * shape) : 0; + const u = Math.random(); + const v = Math.random(); + const x = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v); + const y = t * x + Math.sqrt(1 - t * t) * Math.sqrt(-2 * Math.log(u)) * Math.sin(2 * Math.PI * v); + const z = location + scale * y; + const result = new Array(n); + for (let i = 0; i < n; i++) { + result[i] = z; + } + return result; } diff --git a/stochastic-extern.js b/stochastic-extern.js index a8b18a7..f2dfec9 100644 --- a/stochastic-extern.js +++ b/stochastic-extern.js @@ -3,20 +3,23 @@ * Generated by http://jmmk.github.io/javascript-externs-generator **********************************************************************/ var stoch = { - "CTMC": function () {}, - "DTMC": function () {}, - "GBM": function () {}, + "poissP": function () {}, "average": function () {}, - "brown": function () {}, + "mode": function () {}, + "std": function () {}, + "summary": function () {}, + "mock": function () {}, + "rsn": function () {}, + "GBM": function () {}, + "DTMC": function () {}, "collate": function () {}, + "CTMC": function () {}, + "sample": function () {}, "exp": function () {}, + "pareto": function () {}, "hist": function () {}, - "mock": function () {}, "norm": function () {}, - "pareto": function () {}, - "poissP": function () {}, - "sample": function () {}, - "std": function () {} + "brown": function () {} }; /********************************************************************** * End Generated Extern for stoch From bf8cb2392a7fbf941bb8986c954342b17f71df40 Mon Sep 17 00:00:00 2001 From: Jason Walsh Date: Fri, 3 Mar 2023 07:57:47 -0500 Subject: [PATCH 5/5] Additional examples --- README.md | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index fbc131b..e6f8574 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,14 @@ ## Examples -Real-world examples will be provided from some of the following texts or courses: +Real-world examples will be provided from some of the following texts or courses: -- 18.445 Introduction to Stochastic Processes -- 6.041 / 6.431 Probabilistic Systems Analysis and Applied Probability -- Introduction to Stochastic Processes, Erhan Cinlar -- Stochastic Modeling: Analysis & Simulation, Barry L. Nelson -- Markov Models: An Introduction to Markov Models, Steven Taylor +- 18.445 Introduction to Stochastic Processes +- 6.041 / 6.431 Probabilistic Systems Analysis and Applied Probability +- Introduction to Stochastic Processes, Erhan Cinlar +- Stochastic Modeling: Analysis & Simulation, Barry L. Nelson +- Markov Models: An Introduction to Markov Models, Steven Taylor +- An Introduction to Stochastic Modeling, Third Edition, Mark Pinsky and Samuel Karlin ## Usage @@ -77,8 +78,8 @@ Returns the average. **Parameters** -- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** -- `data` +- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `data` **Examples** @@ -128,7 +129,7 @@ Provides a summary of a set of data. **Parameters** -- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** **Examples** @@ -146,7 +147,7 @@ Returns a mock data set with the same mean and standard deviation as the input d **Parameters** -- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `values` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** - `num` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)]** A positive integer representing the length of the mock data set to generate. (optional, default `1`) **Examples** @@ -164,9 +165,9 @@ Returns the Skew-Normal (SN) probability distribution. **Parameters** -- `n` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `location` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `scale` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** +- `n` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** +- `location` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** +- `scale` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** - `shape` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 0)** 0 is the normal distribution **Examples** @@ -188,7 +189,7 @@ Returns an array with `num` normal random variables in a [normal distribution](h - `mu` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 1)** the mean or expectation of the distribution (and also its median and mode) - `sigma` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)](default 0)** standard deviation as positive number - `num` **\[[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)]** a positive integer (optional, default `1`) -- `xi` +- `xi` **Examples** @@ -251,10 +252,10 @@ Returns an array with the states at each step of the [discrete-time Markov Chain **Parameters** -- `transMatrix` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** +- `transMatrix` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** - `steps` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive integer) -- `start` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)](default true)** +- `start` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** +- `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)](default true)** **Examples** @@ -262,7 +263,7 @@ Returns an array with the states at each step of the [discrete-time Markov Chain const DTMC = stochastic.DTMC([[0,1,0],[0,0,1],[1,0,0]], 20, 0, true); ``` -Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** ### collate @@ -270,7 +271,7 @@ Returns the `transMatrix` for an array of mapped `states` to numerical values. **Parameters** -- `states` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `states` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** **Examples** @@ -288,9 +289,9 @@ Returns an object with the {key:value} pair {time:state} at each step of the [co **Parameters** -- `transMatrix` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** -- `T` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** -- `start` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** +- `transMatrix` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** +- `T` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** +- `start` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** - `path` **\[[boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** (optional, default `true`) **Examples** @@ -307,7 +308,7 @@ Generates a random sample (with replacement) from array `arr` of observations. N **Parameters** -- `arr` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `arr` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** - `n` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive integer) **Examples** @@ -341,8 +342,8 @@ Generates a Pareto random variables with parameters `x_m` and `alpha`. **Parameters** - `x_a` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** (positive) -- `x_m` -- `alpha` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** +- `x_m` +- `alpha` **[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** **Examples** @@ -360,8 +361,8 @@ Generates a histogram object from an array of data. Keys denote the lower bound **Parameters** -- `arr` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** -- `n` +- `arr` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>** +- `n` **Examples**