UNPKG

normal-distribution

Version:

A small javascript module for working with normal distributions

130 lines (129 loc) 7.21 kB
"use strict"; /** * Rounds a value to a specified amount of decimal places * @param {number} value - the value to be rounded * @param {number} decimalPlaces - the amount of decimal places to round to * @return {number} the rounded number */ Object.defineProperty(exports, "__esModule", { value: true }); var round = function (value, decimalPlaces) { var factor = Math.pow(10, decimalPlaces); return Math.round(value * factor) / factor; }; var NormalDistribution = /** @class */ (function () { /** * The constructor, assumes a standardized normal distribution if * there are no parameters given * @param {number} [mean=0] - the mean average * @param {number} [standardDeviation=1] - the standard deviation */ function NormalDistribution(mean, standardDeviation) { if (mean === void 0) { mean = 0; } if (standardDeviation === void 0) { standardDeviation = 1; } this.mean = mean; this.standardDeviation = standardDeviation; } /** * @param {number} value - the number to convert to a z-score * @return {number} the z-score of the value */ NormalDistribution.prototype.zScore = function (value) { return (value - this.mean) / this.standardDeviation; }; /** * Return the probability of finding x in the distribution * @param {number} value - the value to evaluate * @return {number} the probability */ NormalDistribution.prototype.pdf = function (value) { var dividend = Math.pow(Math.E, -(Math.pow((value - this.mean), 2) / (2 * Math.pow(this.standardDeviation, 2)))); var divisor = this.standardDeviation * Math.sqrt(2 * Math.PI); return dividend / divisor; }; /** * Return the cumalitive probability for everything left of the value * @param {number} value - the value to evaluate * @return {number} the cumulative total */ NormalDistribution.prototype.cdf = function (value) { var zScore = this.zScore(value); zScore = round(zScore, 2); if (zScore === 0) { return 0.5; } else if (zScore <= -3.5) { return 0; } else if (zScore >= 3.5) { return 1; } var zTable = NormalDistribution.zTable; var absZScore = Math.abs(zScore); var zRow = Math.floor(absZScore * 10) / 10; var zCol = round((Math.round(absZScore * 100) % 10) / 100, 2); var zColIndex = zTable.z.indexOf(zCol); var absPercentile = zTable[zRow][zColIndex]; return zScore < 0 ? 1 - absPercentile : absPercentile; }; /** * Return the probability of a value in the distribution being * between two values * @param {number} value1 - the first boundary * @param {number} value2 - the second boundary * @return {number} the probability */ NormalDistribution.prototype.probabilityBetween = function (value1, value2) { return Math.abs(this.cdf(value1) - this.cdf(value2)); }; Object.defineProperty(NormalDistribution, "zTable", { /** * Returns an object representing the standardized z-table * @return {Object} the zTable */ // prettier-ignore get: function () { return { "z": [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09], "0": [0.5000, 0.5040, 0.5080, 0.5120, 0.5160, 0.5199, 0.5239, 0.5279, 0.5319, 0.5359], "0.1": [0.5398, 0.5438, 0.5478, 0.5517, 0.5557, 0.5596, 0.5636, 0.5675, 0.5714, 0.5753], "0.2": [0.5793, 0.5832, 0.5871, 0.5910, 0.5948, 0.5987, 0.6026, 0.6064, 0.6103, 0.6141], "0.3": [0.6179, 0.6217, 0.6255, 0.6293, 0.6331, 0.6368, 0.6406, 0.6443, 0.6480, 0.6517], "0.4": [0.6554, 0.6591, 0.6628, 0.6664, 0.6700, 0.6736, 0.6772, 0.6808, 0.6844, 0.6879], "0.5": [0.6915, 0.6950, 0.6985, 0.7019, 0.7054, 0.7088, 0.7123, 0.7157, 0.7190, 0.7224], "0.6": [0.7257, 0.7291, 0.7324, 0.7357, 0.7389, 0.7422, 0.7454, 0.7486, 0.7517, 0.7549], "0.7": [0.7580, 0.7611, 0.7642, 0.7673, 0.7704, 0.7734, 0.7764, 0.7794, 0.7823, 0.7852], "0.8": [0.7881, 0.7910, 0.7939, 0.7967, 0.7995, 0.8023, 0.8051, 0.8078, 0.8106, 0.8133], "0.9": [0.8159, 0.8186, 0.8212, 0.8238, 0.8264, 0.8289, 0.8315, 0.8340, 0.8365, 0.8389], "1": [0.8413, 0.8438, 0.8461, 0.8485, 0.8508, 0.8531, 0.8554, 0.8577, 0.8599, 0.8621], "1.1": [0.8643, 0.8665, 0.8686, 0.8708, 0.8729, 0.8749, 0.8770, 0.8790, 0.8810, 0.8830], "1.2": [0.8849, 0.8869, 0.8888, 0.8907, 0.8925, 0.8944, 0.8962, 0.8980, 0.8997, 0.9015], "1.3": [0.9032, 0.9049, 0.9066, 0.9082, 0.9099, 0.9115, 0.9131, 0.9147, 0.9162, 0.9177], "1.4": [0.9192, 0.9207, 0.9222, 0.9236, 0.9251, 0.9265, 0.9279, 0.9292, 0.9306, 0.9319], "1.5": [0.9332, 0.9345, 0.9357, 0.9370, 0.9382, 0.9394, 0.9406, 0.9418, 0.9429, 0.9441], "1.6": [0.9452, 0.9463, 0.9474, 0.9484, 0.9495, 0.9505, 0.9515, 0.9525, 0.9535, 0.9545], "1.7": [0.9554, 0.9564, 0.9573, 0.9582, 0.9591, 0.9599, 0.9608, 0.9616, 0.9625, 0.9633], "1.8": [0.9641, 0.9649, 0.9656, 0.9664, 0.9671, 0.9678, 0.9686, 0.9693, 0.9699, 0.9706], "1.9": [0.9713, 0.9719, 0.9726, 0.9732, 0.9738, 0.9744, 0.9750, 0.9756, 0.9761, 0.9767], "2": [0.9772, 0.9778, 0.9783, 0.9788, 0.9793, 0.9798, 0.9803, 0.9808, 0.9812, 0.9817], "2.1": [0.9821, 0.9826, 0.9830, 0.9834, 0.9838, 0.9842, 0.9846, 0.9850, 0.9854, 0.9857], "2.2": [0.9861, 0.9864, 0.9868, 0.9871, 0.9875, 0.9878, 0.9881, 0.9884, 0.9887, 0.9890], "2.3": [0.9893, 0.9896, 0.9898, 0.9901, 0.9904, 0.9906, 0.9909, 0.9911, 0.9913, 0.9916], "2.4": [0.9918, 0.9920, 0.9922, 0.9925, 0.9927, 0.9929, 0.9931, 0.9932, 0.9934, 0.9936], "2.5": [0.9938, 0.9940, 0.9941, 0.9943, 0.9945, 0.9946, 0.9948, 0.9949, 0.9951, 0.9952], "2.6": [0.9953, 0.9955, 0.9956, 0.9957, 0.9959, 0.9960, 0.9961, 0.9962, 0.9963, 0.9964], "2.7": [0.9965, 0.9966, 0.9967, 0.9968, 0.9969, 0.9970, 0.9971, 0.9972, 0.9973, 0.9974], "2.8": [0.9974, 0.9975, 0.9976, 0.9977, 0.9977, 0.9978, 0.9979, 0.9979, 0.9980, 0.9981], "2.9": [0.9981, 0.9982, 0.9982, 0.9983, 0.9984, 0.9984, 0.9985, 0.9985, 0.9986, 0.9986], "3": [0.9987, 0.9987, 0.9987, 0.9988, 0.9988, 0.9989, 0.9989, 0.9989, 0.9990, 0.9990], "3.1": [0.9990, 0.9991, 0.9991, 0.9991, 0.9992, 0.9992, 0.9992, 0.9992, 0.9993, 0.9993], "3.2": [0.9993, 0.9993, 0.9994, 0.9994, 0.9994, 0.9994, 0.9994, 0.9995, 0.9995, 0.9995], "3.3": [0.9995, 0.9995, 0.9995, 0.9996, 0.9996, 0.9996, 0.9996, 0.9996, 0.9996, 0.9997], "3.4": [0.9997, 0.9997, 0.9997, 0.9997, 0.9997, 0.9997, 0.9997, 0.9997, 0.9997, 0.9998] }; }, enumerable: false, configurable: true }); return NormalDistribution; }()); exports.default = NormalDistribution;