UNPKG

lumenize

Version:

Illuminating the forest AND the trees in your data.

168 lines (153 loc) 4.82 kB
// Generated by CoffeeScript 1.10.0 /* JavaScript version from which this CoffeeScript version was derived by Ben Tilly <btilly@gmail.com> which was derived from the Perl version by Michael Kospach <mike.perl@gmx.at> both of which are licensed under the Perl Artistic License which allows linking from MIT licensed code. Note: these are approximations good to 5 digits (which is good enough for almost every thing) https://code.google.com/p/statistics-distributions-js/source/browse/trunk/statistics-distributions.js */ (function() { var distributions; distributions = {}; distributions.fDist = function(n, m, x) { /* Upper probability of the F distribution */ var a, b, i, p, p1, y, z; p = void 0; if (x <= 0) { p = 1; } else if (m % 2 === 0) { z = m / (m + n * x); a = 1; i = m - 2; while (i >= 2) { a = 1 + (n + i - 2) / i * z * a; i -= 2; } p = 1 - (Math.pow(1 - z, n / 2) * a); } else if (n % 2 === 0) { z = n * x / (m + n * x); a = 1; i = n - 2; while (i >= 2) { a = 1 + (m + i - 2) / i * z * a; i -= 2; } p = Math.pow(1 - z, m / 2) * a; } else { y = Math.atan2(Math.sqrt(n * x / m), 1); z = Math.pow(Math.sin(y), 2); a = (n === 1 ? 0 : 1); i = n - 2; while (i >= 3) { a = 1 + (m + i - 2) / i * z * a; i -= 2; } b = Math.PI; i = 2; while (i <= m - 1) { b *= (i - 1) / i; i += 2; } p1 = 2 / b * Math.sin(y) * Math.pow(Math.cos(y), m) * a; z = Math.pow(Math.cos(y), 2); a = (m === 1 ? 0 : 1); i = m - 2; while (i >= 3) { a = 1 + (i - 1) / i * z * a; i -= 2; } p = Math.max(0, p1 + 1 - 2 * y / Math.PI - 2 / Math.PI * Math.sin(y) * Math.cos(y) * a); } return p; }; distributions.tInverseUpper = function($n, p) { var $a, $b, $c, $d, $delta, $e, $n1, $round, $u, $u2, $x, p1; if (p >= 1 || p <= 0) { throw new Error("Invalid p: p\n"); } if (p === 0.5) { return 0; } else { if (p < 0.5) { return -_subt($n, 1 - p); } } $u = _subu(p); $u2 = Math.pow($u, 2); $a = ($u2 + 1) / 4; $b = ((5 * $u2 + 16) * $u2 + 3) / 96; $c = (((3 * $u2 + 19) * $u2 + 17) * $u2 - 15) / 384; $d = ((((79 * $u2 + 776) * $u2 + 1482) * $u2 - 1920) * $u2 - 945) / 92160; $e = (((((27 * $u2 + 339) * $u2 + 930) * $u2 - 1782) * $u2 - 765) * $u2 + 17955) / 368640; $x = $u * (1 + ($a + ($b + ($c + ($d + $e / $n) / $n) / $n) / $n) / $n); if ($n <= Math.pow(log10(p), 2) + 3) { $round = void 0; while (true) { p1 = _subtprob($n, $x); $n1 = $n + 1; $delta = (p1 - p) / Math.exp(($n1 * Math.log($n1 / ($n + $x * $x)) + Math.log($n / $n1 / 2 / Math.PI) - 1 + (1 / $n1 - 1 / $n) / 6) / 2); $x += $delta; $round = round_to_precision($delta, Math.abs(integer(log10(Math.abs($x)) - 4))); if (!($x && ($round !== 0))) { break; } } } return $x; }; distributions.tDist = function($n, $x) { var $a, $b, $i, $w, $y, $z; $a = void 0; $b = void 0; $w = Math.atan2($x / Math.sqrt($n), 1); $z = Math.pow(Math.cos($w), 2); $y = 1; $i = $n - 2; while ($i >= 2) { $y = 1 + ($i - 1) / $i * $z * $y; $i -= 2; } if ($n % 2 === 0) { $a = Math.sin($w) / 2; $b = .5; } else { $a = ($n === 1 ? 0 : Math.sin($w) * Math.cos($w) / Math.PI); $b = .5 + $w / Math.PI; } return Math.max(0, 1 - $b - $a * $y); }; distributions.normDist = function($x) { var $absx, $i, p; p = 0; $absx = Math.abs($x); if ($absx < 1.9) { p = Math.pow(1 + $absx * (.049867347 + $absx * (.0211410061 + $absx * (.0032776263 + $absx * (.0000380036 + $absx * (.0000488906 + $absx * .000005383))))), -16) / 2; } else if ($absx <= 100) { $i = 18; while ($i >= 1) { p = $i / ($absx + p); $i--; } p = Math.exp(-.5 * $absx * $absx) / Math.sqrt(2 * Math.PI) / ($absx + p); } if ($x < 0) { p = 1 - p; } return p; }; distributions.normInverseUpper = function(p) { var $x, $y; $y = -Math.log(4 * p * (1 - p)); $x = Math.sqrt($y * (1.570796288 + $y * (.03706987906 + $y * (-.8364353589e-3 + $y * (-.2250947176e-3 + $y * (.6841218299e-5 + $y * (0.5824238515e-5 + $y * (-.104527497e-5 + $y * (.8360937017e-7 + $y * (-.3231081277e-8 + $y * (.3657763036e-10 + $y * .6936233982e-12))))))))))); if (p > .5) { $x = -$x; } return $x; }; distributions.normInverse = function(p) { return distributions.normInverseUpper(1 - p); }; exports.distributions = distributions; }).call(this);