vega-statistics
Advanced tools
Comparing version 1.7.8 to 1.7.9
@@ -7,3 +7,3 @@ (function (global, factory) { | ||
function* numbers(values, valueof) { | ||
function* numbers (values, valueof) { | ||
if (valueof == null) { | ||
@@ -17,4 +17,6 @@ for (let value of values) { | ||
let index = -1; | ||
for (let value of values) { | ||
value = valueof(value, ++index, values); | ||
if (value != null && value !== '' && (value = +value) >= value) { | ||
@@ -27,19 +29,17 @@ yield value; | ||
function quantiles(array, p, f) { | ||
const values = Float64Array.from(numbers(array, f)); | ||
function quantiles (array, p, f) { | ||
const values = Float64Array.from(numbers(array, f)); // don't depend on return value from typed array sort call | ||
// protects against undefined sort results in Safari (vega/vega-lite#4964) | ||
// don't depend on return value from typed array sort call | ||
// protects against undefined sort results in Safari (vega/vega-lite#4964) | ||
values.sort(d3Array.ascending); | ||
return p.map(_ => d3Array.quantileSorted(values, _)); | ||
} | ||
function quartiles(array, f) { | ||
function quartiles (array, f) { | ||
return quantiles(array, [0.25, 0.50, 0.75], f); | ||
} | ||
// Scott, D. W. (1992) Multivariate Density Estimation: | ||
// Theory, Practice, and Visualization. Wiley. | ||
function estimateBandwidth(array, f) { | ||
function estimateBandwidth (array, f) { | ||
const n = array.length, | ||
@@ -53,3 +53,3 @@ d = d3Array.deviation(array, f), | ||
function bin(_) { | ||
function bin (_) { | ||
// determine range | ||
@@ -59,10 +59,13 @@ const maxb = _.maxbins || 20, | ||
logb = Math.log(base), | ||
div = _.divide || [5, 2]; | ||
div = _.divide || [5, 2]; | ||
let min = _.extent[0], | ||
max = _.extent[1], | ||
step, | ||
level, | ||
minstep, | ||
v, | ||
i, | ||
n; | ||
const span = _.span || max - min || Math.abs(min) || 1; | ||
let min = _.extent[0], | ||
max = _.extent[1], | ||
step, level, minstep, v, i, n; | ||
const span = _.span || (max - min) || Math.abs(min) || 1; | ||
if (_.step) { | ||
@@ -74,4 +77,6 @@ // if step size is explicitly given, use that | ||
v = span / maxb; | ||
for (i=0, n=_.steps.length; i < n && _.steps[i] < v; ++i); | ||
step = _.steps[Math.max(0, i-1)]; | ||
for (i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i); | ||
step = _.steps[Math.max(0, i - 1)]; | ||
} else { | ||
@@ -81,21 +86,20 @@ // else use span to determine step size | ||
minstep = _.minstep || 0; | ||
step = Math.max( | ||
minstep, | ||
Math.pow(base, Math.round(Math.log(span) / logb) - level) | ||
); | ||
step = Math.max(minstep, Math.pow(base, Math.round(Math.log(span) / logb) - level)); // increase step size if too many bins | ||
// increase step size if too many bins | ||
while (Math.ceil(span/step) > maxb) { step *= base; } | ||
while (Math.ceil(span / step) > maxb) { | ||
step *= base; | ||
} // decrease step size if allowed | ||
// decrease step size if allowed | ||
for (i=0, n=div.length; i<n; ++i) { | ||
for (i = 0, n = div.length; i < n; ++i) { | ||
v = step / div[i]; | ||
if (v >= minstep && span / v <= maxb) step = v; | ||
} | ||
} | ||
} // update precision, min and max | ||
// update precision, min and max | ||
v = Math.log(step); | ||
const precision = v >= 0 ? 0 : ~~(-v / logb) + 1, | ||
eps = Math.pow(base, -precision - 1); | ||
if (_.nice || _.nice === undefined) { | ||
@@ -109,4 +113,4 @@ v = Math.floor(min / step + eps) * step; | ||
start: min, | ||
stop: max === min ? min + step : max, | ||
step: step | ||
stop: max === min ? min + step : max, | ||
step: step | ||
}; | ||
@@ -116,3 +120,2 @@ } | ||
exports.random = Math.random; | ||
function setRandom(r) { | ||
@@ -122,5 +125,4 @@ exports.random = r; | ||
function bootstrapCI(array, samples, alpha, f) { | ||
function bootstrapCI (array, samples, alpha, f) { | ||
if (!array.length) return [undefined, undefined]; | ||
const values = Float64Array.from(numbers(array, f)), | ||
@@ -131,6 +133,7 @@ n = values.length, | ||
for (j=0, mu=Array(m); j<m; ++j) { | ||
for (a=0, i=0; i<n; ++i) { | ||
for (j = 0, mu = Array(m); j < m; ++j) { | ||
for (a = 0, i = 0; i < n; ++i) { | ||
a += values[~~(exports.random() * n)]; | ||
} | ||
mu[j] = a / n; | ||
@@ -140,7 +143,3 @@ } | ||
mu.sort(d3Array.ascending); | ||
return [ | ||
d3Array.quantile(mu, alpha/2), | ||
d3Array.quantile(mu, 1-(alpha/2)) | ||
]; | ||
return [d3Array.quantile(mu, alpha / 2), d3Array.quantile(mu, 1 - alpha / 2)]; | ||
} | ||
@@ -151,3 +150,3 @@ | ||
// https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf | ||
function dotbin(array, step, smooth, f) { | ||
function dotbin (array, step, smooth, f) { | ||
f = f || (_ => _); | ||
@@ -157,4 +156,4 @@ | ||
v = new Float64Array(n); | ||
let i = 0, j = 1, | ||
let i = 0, | ||
j = 1, | ||
a = f(array[0]), | ||
@@ -165,10 +164,14 @@ b = a, | ||
for (; j<n; ++j) { | ||
for (; j < n; ++j) { | ||
x = f(array[j]); | ||
if (x >= w) { | ||
b = (a + b) / 2; | ||
for (; i<j; ++i) v[i] = b; | ||
for (; i < j; ++i) v[i] = b; | ||
w = x + step; | ||
a = x; | ||
} | ||
b = x; | ||
@@ -178,10 +181,10 @@ } | ||
b = (a + b) / 2; | ||
for (; i<j; ++i) v[i] = b; | ||
for (; i < j; ++i) v[i] = b; | ||
return smooth ? smoothing(v, step + step / 4) : v; | ||
} | ||
// perform smoothing to reduce variance | ||
} // perform smoothing to reduce variance | ||
// swap points between "adjacent" stacks | ||
// Wilkinson defines adjacent as within step/4 units | ||
function smoothing(v, thresh) { | ||
@@ -191,5 +194,5 @@ const n = v.length; | ||
b = 1, | ||
c, d; | ||
c, | ||
d; // get left stack | ||
// get left stack | ||
while (v[a] === v[b]) ++b; | ||
@@ -200,13 +203,16 @@ | ||
c = b + 1; | ||
while (v[b] === v[c]) ++c; | ||
// are stacks adjacent? | ||
while (v[b] === v[c]) ++c; // are stacks adjacent? | ||
// if so, compare sizes and swap as needed | ||
if (v[b] - v[b-1] < thresh) { | ||
d = b + ((a + c - b - b) >> 1); | ||
if (v[b] - v[b - 1] < thresh) { | ||
d = b + (a + c - b - b >> 1); | ||
while (d < b) v[d++] = v[b]; | ||
while (d > b) v[d--] = v[a]; | ||
} | ||
} // update left stack indices | ||
// update left stack indices | ||
a = b; | ||
@@ -219,6 +225,6 @@ b = c; | ||
function lcg(seed) { | ||
function lcg (seed) { | ||
// Random numbers using a Linear Congruential Generator with seed value | ||
// Uses glibc values from https://en.wikipedia.org/wiki/Linear_congruential_generator | ||
return function() { | ||
return function () { | ||
seed = (1103515245 * seed + 12345) % 2147483647; | ||
@@ -229,3 +235,3 @@ return seed / 2147483647; | ||
function integer(min, max) { | ||
function integer (min, max) { | ||
if (max == null) { | ||
@@ -237,3 +243,2 @@ max = min; | ||
let a, b, d; | ||
const dist = { | ||
@@ -249,2 +254,3 @@ min(_) { | ||
}, | ||
max(_) { | ||
@@ -259,8 +265,11 @@ if (arguments.length) { | ||
}, | ||
sample() { | ||
return a + Math.floor(d * exports.random()); | ||
}, | ||
pdf(x) { | ||
return (x === Math.floor(x) && x >= a && x < b) ? 1 / d : 0; | ||
return x === Math.floor(x) && x >= a && x < b ? 1 / d : 0; | ||
}, | ||
cdf(x) { | ||
@@ -270,7 +279,8 @@ const v = Math.floor(x); | ||
}, | ||
icdf(p) { | ||
return (p >= 0 && p <= 1) ? a - 1 + Math.floor(p * d) : NaN; | ||
return p >= 0 && p <= 1 ? a - 1 + Math.floor(p * d) : NaN; | ||
} | ||
}; | ||
return dist.min(min).max(max); | ||
@@ -283,8 +293,10 @@ } | ||
let nextSample = NaN; | ||
function sampleNormal(mean, stdev) { | ||
mean = mean || 0; | ||
stdev = stdev == null ? 1 : stdev; | ||
let x = 0, | ||
y = 0, | ||
rds, | ||
c; | ||
let x = 0, y = 0, rds, c; | ||
if (nextSample === nextSample) { | ||
@@ -299,9 +311,11 @@ x = nextSample; | ||
} while (rds === 0 || rds > 1); | ||
c = Math.sqrt(-2 * Math.log(rds) / rds); // Box-Muller transform | ||
x *= c; | ||
nextSample = y * c; | ||
} | ||
return mean + x * stdev; | ||
} | ||
function densityNormal(value, mean, stdev) { | ||
@@ -311,10 +325,8 @@ stdev = stdev == null ? 1 : stdev; | ||
return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI); | ||
} | ||
} // Approximation from West (2009) | ||
// Better Approximations to Cumulative Normal Functions | ||
// Approximation from West (2009) | ||
// Better Approximations to Cumulative Normal Functions | ||
function cumulativeNormal(value, mean, stdev) { | ||
mean = mean || 0; | ||
stdev = stdev == null ? 1 : stdev; | ||
const z = (value - mean) / stdev, | ||
@@ -329,2 +341,3 @@ Z = Math.abs(z); | ||
let sum; | ||
if (Z < 7.07106781186547) { | ||
@@ -355,14 +368,13 @@ sum = 3.52624965998911e-02 * Z + 0.700383064443688; | ||
} | ||
return z > 0 ? 1 - cd : cd; | ||
} | ||
} // Approximation of Probit function using inverse error function. | ||
// Approximation of Probit function using inverse error function. | ||
function quantileNormal(p, mean, stdev) { | ||
if (p < 0 || p > 1) return NaN; | ||
return (mean || 0) + (stdev == null ? 1 : stdev) * SQRT2 * erfinv(2 * p - 1); | ||
} | ||
// Approximate inverse error function. Implementation from "Approximating | ||
} // Approximate inverse error function. Implementation from "Approximating | ||
// the erfinv function" by Mike Giles, GPU Computing Gems, volume 2, 2010. | ||
// Ported from Apache Commons Math, http://www.apache.org/licenses/LICENSE-2.0 | ||
function erfinv(x) { | ||
@@ -373,71 +385,72 @@ // beware that the logarithm argument must be | ||
// would induce rounding errors near the boundaries +/-1 | ||
let w = - Math.log((1 - x) * (1 + x)), p; | ||
let w = -Math.log((1 - x) * (1 + x)), | ||
p; | ||
if (w < 6.25) { | ||
w -= 3.125; | ||
p = -3.6444120640178196996e-21; | ||
p = -1.685059138182016589e-19 + p * w; | ||
p = 1.2858480715256400167e-18 + p * w; | ||
p = 1.115787767802518096e-17 + p * w; | ||
p = -1.333171662854620906e-16 + p * w; | ||
p = 2.0972767875968561637e-17 + p * w; | ||
p = 6.6376381343583238325e-15 + p * w; | ||
p = -4.0545662729752068639e-14 + p * w; | ||
p = -8.1519341976054721522e-14 + p * w; | ||
p = 2.6335093153082322977e-12 + p * w; | ||
p = -1.2975133253453532498e-11 + p * w; | ||
p = -5.4154120542946279317e-11 + p * w; | ||
p = 1.051212273321532285e-09 + p * w; | ||
p = -4.1126339803469836976e-09 + p * w; | ||
p = -2.9070369957882005086e-08 + p * w; | ||
p = 4.2347877827932403518e-07 + p * w; | ||
p = -1.3654692000834678645e-06 + p * w; | ||
p = -1.3882523362786468719e-05 + p * w; | ||
p = 0.0001867342080340571352 + p * w; | ||
p = -0.00074070253416626697512 + p * w; | ||
p = -0.0060336708714301490533 + p * w; | ||
p = 0.24015818242558961693 + p * w; | ||
p = 1.6536545626831027356 + p * w; | ||
w -= 3.125; | ||
p = -3.6444120640178196996e-21; | ||
p = -1.685059138182016589e-19 + p * w; | ||
p = 1.2858480715256400167e-18 + p * w; | ||
p = 1.115787767802518096e-17 + p * w; | ||
p = -1.333171662854620906e-16 + p * w; | ||
p = 2.0972767875968561637e-17 + p * w; | ||
p = 6.6376381343583238325e-15 + p * w; | ||
p = -4.0545662729752068639e-14 + p * w; | ||
p = -8.1519341976054721522e-14 + p * w; | ||
p = 2.6335093153082322977e-12 + p * w; | ||
p = -1.2975133253453532498e-11 + p * w; | ||
p = -5.4154120542946279317e-11 + p * w; | ||
p = 1.051212273321532285e-09 + p * w; | ||
p = -4.1126339803469836976e-09 + p * w; | ||
p = -2.9070369957882005086e-08 + p * w; | ||
p = 4.2347877827932403518e-07 + p * w; | ||
p = -1.3654692000834678645e-06 + p * w; | ||
p = -1.3882523362786468719e-05 + p * w; | ||
p = 0.0001867342080340571352 + p * w; | ||
p = -0.00074070253416626697512 + p * w; | ||
p = -0.0060336708714301490533 + p * w; | ||
p = 0.24015818242558961693 + p * w; | ||
p = 1.6536545626831027356 + p * w; | ||
} else if (w < 16.0) { | ||
w = Math.sqrt(w) - 3.25; | ||
p = 2.2137376921775787049e-09; | ||
p = 9.0756561938885390979e-08 + p * w; | ||
p = -2.7517406297064545428e-07 + p * w; | ||
p = 1.8239629214389227755e-08 + p * w; | ||
p = 1.5027403968909827627e-06 + p * w; | ||
p = -4.013867526981545969e-06 + p * w; | ||
p = 2.9234449089955446044e-06 + p * w; | ||
p = 1.2475304481671778723e-05 + p * w; | ||
p = -4.7318229009055733981e-05 + p * w; | ||
p = 6.8284851459573175448e-05 + p * w; | ||
p = 2.4031110387097893999e-05 + p * w; | ||
p = -0.0003550375203628474796 + p * w; | ||
p = 0.00095328937973738049703 + p * w; | ||
p = -0.0016882755560235047313 + p * w; | ||
p = 0.0024914420961078508066 + p * w; | ||
p = -0.0037512085075692412107 + p * w; | ||
p = 0.005370914553590063617 + p * w; | ||
p = 1.0052589676941592334 + p * w; | ||
p = 3.0838856104922207635 + p * w; | ||
w = Math.sqrt(w) - 3.25; | ||
p = 2.2137376921775787049e-09; | ||
p = 9.0756561938885390979e-08 + p * w; | ||
p = -2.7517406297064545428e-07 + p * w; | ||
p = 1.8239629214389227755e-08 + p * w; | ||
p = 1.5027403968909827627e-06 + p * w; | ||
p = -4.013867526981545969e-06 + p * w; | ||
p = 2.9234449089955446044e-06 + p * w; | ||
p = 1.2475304481671778723e-05 + p * w; | ||
p = -4.7318229009055733981e-05 + p * w; | ||
p = 6.8284851459573175448e-05 + p * w; | ||
p = 2.4031110387097893999e-05 + p * w; | ||
p = -0.0003550375203628474796 + p * w; | ||
p = 0.00095328937973738049703 + p * w; | ||
p = -0.0016882755560235047313 + p * w; | ||
p = 0.0024914420961078508066 + p * w; | ||
p = -0.0037512085075692412107 + p * w; | ||
p = 0.005370914553590063617 + p * w; | ||
p = 1.0052589676941592334 + p * w; | ||
p = 3.0838856104922207635 + p * w; | ||
} else if (Number.isFinite(w)) { | ||
w = Math.sqrt(w) - 5.0; | ||
p = -2.7109920616438573243e-11; | ||
p = -2.5556418169965252055e-10 + p * w; | ||
p = 1.5076572693500548083e-09 + p * w; | ||
p = -3.7894654401267369937e-09 + p * w; | ||
p = 7.6157012080783393804e-09 + p * w; | ||
p = -1.4960026627149240478e-08 + p * w; | ||
p = 2.9147953450901080826e-08 + p * w; | ||
p = -6.7711997758452339498e-08 + p * w; | ||
p = 2.2900482228026654717e-07 + p * w; | ||
p = -9.9298272942317002539e-07 + p * w; | ||
p = 4.5260625972231537039e-06 + p * w; | ||
p = -1.9681778105531670567e-05 + p * w; | ||
p = 7.5995277030017761139e-05 + p * w; | ||
p = -0.00021503011930044477347 + p * w; | ||
p = -0.00013871931833623122026 + p * w; | ||
p = 1.0103004648645343977 + p * w; | ||
p = 4.8499064014085844221 + p * w; | ||
w = Math.sqrt(w) - 5.0; | ||
p = -2.7109920616438573243e-11; | ||
p = -2.5556418169965252055e-10 + p * w; | ||
p = 1.5076572693500548083e-09 + p * w; | ||
p = -3.7894654401267369937e-09 + p * w; | ||
p = 7.6157012080783393804e-09 + p * w; | ||
p = -1.4960026627149240478e-08 + p * w; | ||
p = 2.9147953450901080826e-08 + p * w; | ||
p = -6.7711997758452339498e-08 + p * w; | ||
p = 2.2900482228026654717e-07 + p * w; | ||
p = -9.9298272942317002539e-07 + p * w; | ||
p = 4.5260625972231537039e-06 + p * w; | ||
p = -1.9681778105531670567e-05 + p * w; | ||
p = 7.5995277030017761139e-05 + p * w; | ||
p = -0.00021503011930044477347 + p * w; | ||
p = -0.00013871931833623122026 + p * w; | ||
p = 1.0103004648645343977 + p * w; | ||
p = 4.8499064014085844221 + p * w; | ||
} else { | ||
p = Infinity; | ||
p = Infinity; | ||
} | ||
@@ -448,5 +461,4 @@ | ||
function gaussian(mean, stdev) { | ||
function gaussian (mean, stdev) { | ||
let mu, sigma; | ||
const dist = { | ||
@@ -461,2 +473,3 @@ mean(_) { | ||
}, | ||
stdev(_) { | ||
@@ -470,2 +483,3 @@ if (arguments.length) { | ||
}, | ||
sample: () => sampleNormal(mu, sigma), | ||
@@ -476,10 +490,8 @@ pdf: value => densityNormal(value, mu, sigma), | ||
}; | ||
return dist.mean(mean).stdev(stdev); | ||
} | ||
function kde(support, bandwidth) { | ||
function kde (support, bandwidth) { | ||
const kernel = gaussian(); | ||
let n = 0; | ||
const dist = { | ||
@@ -508,6 +520,9 @@ data(_) { | ||
pdf(x) { | ||
let y = 0, i = 0; | ||
for (; i<n; ++i) { | ||
let y = 0, | ||
i = 0; | ||
for (; i < n; ++i) { | ||
y += kernel.pdf((x - support[i]) / bandwidth); | ||
} | ||
return y / bandwidth / n; | ||
@@ -517,6 +532,9 @@ }, | ||
cdf(x) { | ||
let y = 0, i = 0; | ||
for (; i<n; ++i) { | ||
let y = 0, | ||
i = 0; | ||
for (; i < n; ++i) { | ||
y += kernel.cdf((x - support[i]) / bandwidth); | ||
} | ||
return y / n; | ||
@@ -528,4 +546,4 @@ }, | ||
} | ||
}; | ||
return dist.data(support); | ||
@@ -539,3 +557,2 @@ } | ||
} | ||
function densityLogNormal(value, mean, stdev) { | ||
@@ -548,14 +565,10 @@ if (value <= 0) return 0; | ||
} | ||
function cumulativeLogNormal(value, mean, stdev) { | ||
return cumulativeNormal(Math.log(value), mean, stdev); | ||
} | ||
function quantileLogNormal(p, mean, stdev) { | ||
return Math.exp(quantileNormal(p, mean, stdev)); | ||
} | ||
function lognormal(mean, stdev) { | ||
function lognormal (mean, stdev) { | ||
let mu, sigma; | ||
const dist = { | ||
@@ -570,2 +583,3 @@ mean(_) { | ||
}, | ||
stdev(_) { | ||
@@ -579,2 +593,3 @@ if (arguments.length) { | ||
}, | ||
sample: () => sampleLogNormal(mu, sigma), | ||
@@ -585,14 +600,22 @@ pdf: value => densityLogNormal(value, mu, sigma), | ||
}; | ||
return dist.mean(mean).stdev(stdev); | ||
} | ||
function mixture(dists, weights) { | ||
let m = 0, w; | ||
function mixture (dists, weights) { | ||
let m = 0, | ||
w; | ||
function normalize(x) { | ||
const w = []; | ||
let sum = 0, i; | ||
for (i = 0; i < m; ++i) { sum += (w[i] = (x[i]==null ? 1 : +x[i])); } | ||
for (i = 0; i < m; ++i) { w[i] /= sum; } | ||
let sum = 0, | ||
i; | ||
for (i = 0; i < m; ++i) { | ||
sum += w[i] = x[i] == null ? 1 : +x[i]; | ||
} | ||
for (i = 0; i < m; ++i) { | ||
w[i] /= sum; | ||
} | ||
return w; | ||
@@ -604,5 +627,6 @@ } | ||
if (arguments.length) { | ||
w = normalize(weights = (_ || [])); | ||
w = normalize(weights = _ || []); | ||
return dist; | ||
} | ||
return weights; | ||
@@ -620,4 +644,6 @@ }, | ||
} | ||
return dist.weights(weights); | ||
} | ||
return dists; | ||
@@ -628,11 +654,14 @@ }, | ||
const r = exports.random(); | ||
let d = dists[m-1], | ||
let d = dists[m - 1], | ||
v = w[0], | ||
i = 0; | ||
i = 0; // first select distribution | ||
// first select distribution | ||
for (; i<m-1; v += w[++i]) { | ||
if (r < v) { d = dists[i]; break; } | ||
} | ||
// then sample from it | ||
for (; i < m - 1; v += w[++i]) { | ||
if (r < v) { | ||
d = dists[i]; | ||
break; | ||
} | ||
} // then sample from it | ||
return d.sample(); | ||
@@ -642,6 +671,9 @@ }, | ||
pdf(x) { | ||
let p = 0, i = 0; | ||
for (; i<m; ++i) { | ||
let p = 0, | ||
i = 0; | ||
for (; i < m; ++i) { | ||
p += w[i] * dists[i].pdf(x); | ||
} | ||
return p; | ||
@@ -651,6 +683,9 @@ }, | ||
cdf(x) { | ||
let p = 0, i = 0; | ||
for (; i<m; ++i) { | ||
let p = 0, | ||
i = 0; | ||
for (; i < m; ++i) { | ||
p += w[i] * dists[i].cdf(x); | ||
} | ||
return p; | ||
@@ -662,4 +697,4 @@ }, | ||
} | ||
}; | ||
return dist.distributions(dists).weights(weights); | ||
@@ -670,35 +705,34 @@ } | ||
if (max == null) { | ||
max = (min == null ? 1 : min); | ||
max = min == null ? 1 : min; | ||
min = 0; | ||
} | ||
return min + (max - min) * exports.random(); | ||
} | ||
function densityUniform(value, min, max) { | ||
if (max == null) { | ||
max = (min == null ? 1 : min); | ||
max = min == null ? 1 : min; | ||
min = 0; | ||
} | ||
return (value >= min && value <= max) ? 1 / (max - min) : 0; | ||
return value >= min && value <= max ? 1 / (max - min) : 0; | ||
} | ||
function cumulativeUniform(value, min, max) { | ||
if (max == null) { | ||
max = (min == null ? 1 : min); | ||
max = min == null ? 1 : min; | ||
min = 0; | ||
} | ||
return value < min ? 0 : value > max ? 1 : (value - min) / (max - min); | ||
} | ||
function quantileUniform(p, min, max) { | ||
if (max == null) { | ||
max = (min == null ? 1 : min); | ||
max = min == null ? 1 : min; | ||
min = 0; | ||
} | ||
return (p >= 0 && p <= 1) ? min + p * (max - min) : NaN; | ||
return p >= 0 && p <= 1 ? min + p * (max - min) : NaN; | ||
} | ||
function uniform(min, max) { | ||
function uniform (min, max) { | ||
let a, b; | ||
const dist = { | ||
@@ -713,2 +747,3 @@ min(_) { | ||
}, | ||
max(_) { | ||
@@ -722,2 +757,3 @@ if (arguments.length) { | ||
}, | ||
sample: () => sampleUniform(a, b), | ||
@@ -730,5 +766,6 @@ pdf: value => densityUniform(value, a, b), | ||
if (max == null) { | ||
max = (min == null ? 1 : min); | ||
max = min == null ? 1 : min; | ||
min = 0; | ||
} | ||
return dist.min(min).max(max); | ||
@@ -738,7 +775,6 @@ } | ||
// Ordinary Least Squares | ||
function ols(uX, uY, uXY, uX2) { | ||
function ols (uX, uY, uXY, uX2) { | ||
const delta = uX2 - uX * uX, | ||
slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta, | ||
intercept = uY - slope * uX; | ||
return [intercept, slope]; | ||
@@ -749,3 +785,4 @@ } | ||
data = data.filter(d => { | ||
let u = x(d), v = y(d); | ||
let u = x(d), | ||
v = y(d); | ||
return u != null && (u = +u) >= u && v != null && (v = +v) >= v; | ||
@@ -760,6 +797,11 @@ }); | ||
X = new Float64Array(n), | ||
Y = new Float64Array(n); | ||
Y = new Float64Array(n); // extract values, calculate means | ||
// extract values, calculate means | ||
let i = 0, ux = 0, uy = 0, xv, yv, d; | ||
let i = 0, | ||
ux = 0, | ||
uy = 0, | ||
xv, | ||
yv, | ||
d; | ||
for (d of data) { | ||
@@ -771,6 +813,6 @@ X[i] = xv = +x(d); | ||
uy += (yv - uy) / i; | ||
} | ||
} // mean center the data | ||
// mean center the data | ||
for (i=0; i<n; ++i) { | ||
for (i = 0; i < n; ++i) { | ||
X[i] -= ux; | ||
@@ -782,5 +824,6 @@ Y[i] -= uy; | ||
} | ||
function visitPoints(data, x, y, callback) { | ||
let i = -1, u, v; | ||
let i = -1, | ||
u, | ||
v; | ||
@@ -790,2 +833,3 @@ for (const d of data) { | ||
v = y(d); | ||
if (u != null && (u = +u) >= u && v != null && (v = +v) >= v) { | ||
@@ -797,23 +841,24 @@ callback(u, v, ++i); | ||
// Adapted from d3-regression by Harry Stevens | ||
// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE | ||
function rSquared(data, x, y, uY, predict) { | ||
let SSE = 0, SST = 0; | ||
function rSquared (data, x, y, uY, predict) { | ||
let SSE = 0, | ||
SST = 0; | ||
visitPoints(data, x, y, (dx, dy) => { | ||
const sse = dy - predict(dx), | ||
sst = dy - uY; | ||
SSE += sse * sse; | ||
SST += sst * sst; | ||
}); | ||
return 1 - SSE / SST; | ||
} | ||
// Adapted from d3-regression by Harry Stevens | ||
// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE | ||
function linear(data, x, y) { | ||
let X = 0, Y = 0, XY = 0, X2 = 0, n = 0; | ||
function linear (data, x, y) { | ||
let X = 0, | ||
Y = 0, | ||
XY = 0, | ||
X2 = 0, | ||
n = 0; | ||
visitPoints(data, x, y, (dx, dy) => { | ||
@@ -837,7 +882,10 @@ ++n; | ||
// Adapted from d3-regression by Harry Stevens | ||
// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE | ||
function log(data, x, y) { | ||
let X = 0, Y = 0, XY = 0, X2 = 0, n = 0; | ||
function log (data, x, y) { | ||
let X = 0, | ||
Y = 0, | ||
XY = 0, | ||
X2 = 0, | ||
n = 0; | ||
visitPoints(data, x, y, (dx, dy) => { | ||
@@ -862,7 +910,13 @@ ++n; | ||
function exp(data, x, y) { | ||
function exp (data, x, y) { | ||
// eslint-disable-next-line no-unused-vars | ||
const [xv, yv, ux, uy] = points(data, x, y); | ||
let YL = 0, XY = 0, XYL = 0, X2Y = 0, n = 0, dx, ly, xy; | ||
let YL = 0, | ||
XY = 0, | ||
XYL = 0, | ||
X2Y = 0, | ||
n = 0, | ||
dx, | ||
ly, | ||
xy; | ||
visitPoints(data, x, y, (_, dy) => { | ||
@@ -872,3 +926,2 @@ dx = xv[n++]; | ||
xy = dx * dy; | ||
YL += (dy * ly - YL) / n; | ||
@@ -890,7 +943,11 @@ XY += (xy - XY) / n; | ||
// Adapted from d3-regression by Harry Stevens | ||
// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE | ||
function pow(data, x, y) { | ||
let X = 0, Y = 0, XY = 0, X2 = 0, YS = 0, n = 0; | ||
function pow (data, x, y) { | ||
let X = 0, | ||
Y = 0, | ||
XY = 0, | ||
X2 = 0, | ||
YS = 0, | ||
n = 0; | ||
visitPoints(data, x, y, (dx, dy) => { | ||
@@ -911,3 +968,2 @@ const lx = Math.log(dx), | ||
coef[0] = Math.exp(coef[0]); | ||
return { | ||
@@ -920,10 +976,16 @@ coef: coef, | ||
function quad(data, x, y) { | ||
function quad (data, x, y) { | ||
const [xv, yv, ux, uy] = points(data, x, y), | ||
n = xv.length; | ||
let X2 = 0, | ||
X3 = 0, | ||
X4 = 0, | ||
XY = 0, | ||
X2Y = 0, | ||
i, | ||
dx, | ||
dy, | ||
x2; | ||
let X2 = 0, X3 = 0, X4 = 0, XY = 0, X2Y = 0, | ||
i, dx, dy, x2; | ||
for (i=0; i<n;) { | ||
for (i = 0; i < n;) { | ||
dx = xv[i]; | ||
@@ -939,4 +1001,4 @@ dy = yv[i++]; | ||
const X2X2 = X4 - (X2 * X2), | ||
d = (X2 * X2X2 - X3 * X3), | ||
const X2X2 = X4 - X2 * X2, | ||
d = X2 * X2X2 - X3 * X3, | ||
a = (X2Y * X2 - XY * X3) / d, | ||
@@ -946,13 +1008,9 @@ b = (XY * X2X2 - X2Y * X3) / d, | ||
predict = x => { | ||
x = x - ux; | ||
return a * x * x + b * x + c + uy; | ||
}; | ||
x = x - ux; | ||
return a * x * x + b * x + c + uy; | ||
}; // transform coefficients back from mean-centered space | ||
// transform coefficients back from mean-centered space | ||
return { | ||
coef: [ | ||
c - b * ux + a * ux * ux + uy, | ||
b - 2 * a * ux, | ||
a | ||
], | ||
coef: [c - b * ux + a * ux * ux + uy, b - 2 * a * ux, a], | ||
predict: predict, | ||
@@ -963,3 +1021,2 @@ rSquared: rSquared(data, x, y, uy, predict) | ||
// Adapted from d3-regression by Harry Stevens | ||
// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE | ||
@@ -969,7 +1026,7 @@ // ... which was adapted from regression-js by Tom Alexander | ||
// License: https://github.com/Tom-Alexander/regression-js/blob/master/LICENSE | ||
function poly(data, x, y, order) { | ||
function poly (data, x, y, order) { | ||
// use more efficient methods for lower orders | ||
if (order === 1) return linear(data, x, y); | ||
if (order === 2) return quad(data, x, y); | ||
const [xv, yv, ux, uy] = points(data, x, y), | ||
@@ -980,20 +1037,23 @@ n = xv.length, | ||
k = order + 1; | ||
let i, j, l, v, c; | ||
for (i=0; i<k; ++i) { | ||
for (l=0, v=0; l<n; ++l) { | ||
for (i = 0; i < k; ++i) { | ||
for (l = 0, v = 0; l < n; ++l) { | ||
v += Math.pow(xv[l], i) * yv[l]; | ||
} | ||
lhs.push(v); | ||
c = new Float64Array(k); | ||
c = new Float64Array(k); | ||
for (j=0; j<k; ++j) { | ||
for (l=0, v=0; l<n; ++l) { | ||
for (j = 0; j < k; ++j) { | ||
for (l = 0, v = 0; l < n; ++l) { | ||
v += Math.pow(xv[l], i + j); | ||
} | ||
c[j] = v; | ||
} | ||
rhs.push(c); | ||
} | ||
rhs.push(lhs); | ||
@@ -1003,8 +1063,10 @@ | ||
predict = x => { | ||
x -= ux; | ||
let y = uy + coef[0] + coef[1] * x + coef[2] * x * x; | ||
for (i=3; i<k; ++i) y += coef[i] * Math.pow(x, i); | ||
return y; | ||
}; | ||
x -= ux; | ||
let y = uy + coef[0] + coef[1] * x + coef[2] * x * x; | ||
for (i = 3; i < k; ++i) y += coef[i] * Math.pow(x, i); | ||
return y; | ||
}; | ||
return { | ||
@@ -1019,30 +1081,29 @@ coef: uncenter(k, coef, -ux, uy), | ||
const z = Array(k); | ||
let i, j, v, c; | ||
let i, j, v, c; // initialize to zero | ||
// initialize to zero | ||
for (i=0; i<k; ++i) z[i] = 0; | ||
for (i = 0; i < k; ++i) z[i] = 0; // polynomial expansion | ||
// polynomial expansion | ||
for (i=k-1; i>=0; --i) { | ||
for (i = k - 1; i >= 0; --i) { | ||
v = a[i]; | ||
c = 1; | ||
z[i] += v; | ||
for (j=1; j<=i; ++j) { | ||
for (j = 1; j <= i; ++j) { | ||
c *= (i + 1 - j) / j; // binomial coefficent | ||
z[i-j] += v * Math.pow(x, j) * c; | ||
z[i - j] += v * Math.pow(x, j) * c; | ||
} | ||
} | ||
} // bias term | ||
// bias term | ||
z[0] += y; | ||
return z; | ||
} | ||
} // Given an array for a two-dimensional matrix and the polynomial order, | ||
// solve A * x = b using Gaussian elimination. | ||
// Given an array for a two-dimensional matrix and the polynomial order, | ||
// solve A * x = b using Gaussian elimination. | ||
function gaussianElimination(matrix) { | ||
const n = matrix.length - 1, | ||
coef = []; | ||
let i, j, k, r, t; | ||
@@ -1052,2 +1113,3 @@ | ||
r = i; // max row | ||
for (j = i + 1; j < n; ++j) { | ||
@@ -1067,3 +1129,3 @@ if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) { | ||
for (k = n; k >= i; k--) { | ||
matrix[k][j] -= (matrix[k][i] * matrix[i][j]) / matrix[i][i]; | ||
matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i]; | ||
} | ||
@@ -1075,5 +1137,7 @@ } | ||
t = 0; | ||
for (k = j + 1; k < n; ++k) { | ||
t += matrix[k][j] * coef[k]; | ||
} | ||
coef[j] = (matrix[n][j] - t) / matrix[j][j]; | ||
@@ -1086,16 +1150,16 @@ } | ||
const maxiters = 2, | ||
epsilon = 1e-12; | ||
// Adapted from science.js by Jason Davies | ||
epsilon = 1e-12; // Adapted from science.js by Jason Davies | ||
// Source: https://github.com/jasondavies/science.js/blob/master/src/stats/loess.js | ||
// License: https://github.com/jasondavies/science.js/blob/master/LICENSE | ||
function loess(data, x, y, bandwidth) { | ||
function loess (data, x, y, bandwidth) { | ||
const [xv, yv, ux, uy] = points(data, x, y, true), | ||
n = xv.length, | ||
bw = Math.max(2, ~~(bandwidth * n)), // # nearest neighbors | ||
yhat = new Float64Array(n), | ||
bw = Math.max(2, ~~(bandwidth * n)), | ||
// # nearest neighbors | ||
yhat = new Float64Array(n), | ||
residuals = new Float64Array(n), | ||
robustWeights = new Float64Array(n).fill(1); | ||
for (let iter = -1; ++iter <= maxiters; ) { | ||
for (let iter = -1; ++iter <= maxiters;) { | ||
const interval = [0, bw - 1]; | ||
@@ -1107,5 +1171,8 @@ | ||
i1 = interval[1], | ||
edge = (dx - xv[i0]) > (xv[i1] - dx) ? i0 : i1; | ||
let W = 0, X = 0, Y = 0, XY = 0, X2 = 0; | ||
edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1; | ||
let W = 0, | ||
X = 0, | ||
Y = 0, | ||
XY = 0, | ||
X2 = 0; | ||
const denom = 1 / Math.abs(xv[edge] - dx || 1); // avoid singularity! | ||
@@ -1118,3 +1185,2 @@ | ||
xkw = xk * w; | ||
W += w; | ||
@@ -1125,9 +1191,8 @@ X += xkw; | ||
X2 += xk * xkw; | ||
} | ||
} // linear regression fit | ||
// linear regression fit | ||
const [a, b] = ols(X / W, Y / W, XY / W, X2 / W); | ||
yhat[i] = a + b * dx; | ||
residuals[i] = Math.abs(yv[i] - yhat[i]); | ||
updateInterval(xv, i + 1, interval); | ||
@@ -1143,7 +1208,7 @@ } | ||
for (let i = 0, arg, w; i < n; ++i){ | ||
arg = residuals[i] / (6 * medianResidual); | ||
// default to epsilon (rather than zero) for large deviations | ||
for (let i = 0, arg, w; i < n; ++i) { | ||
arg = residuals[i] / (6 * medianResidual); // default to epsilon (rather than zero) for large deviations | ||
// keeping weights tiny but non-zero prevents singularites | ||
robustWeights[i] = (arg >= 1) ? epsilon : ((w = 1 - arg * arg) * w); | ||
robustWeights[i] = arg >= 1 ? epsilon : (w = 1 - arg * arg) * w; | ||
} | ||
@@ -1153,10 +1218,9 @@ } | ||
return output(xv, yhat, ux, uy); | ||
} | ||
} // weighting kernel for local regression | ||
// weighting kernel for local regression | ||
function tricube(x) { | ||
return (x = 1 - x * x * x) * x * x; | ||
} | ||
} // advance sliding window interval of nearest neighbors | ||
// advance sliding window interval of nearest neighbors | ||
function updateInterval(xv, i, interval) { | ||
@@ -1166,8 +1230,6 @@ const val = xv[i]; | ||
right = interval[1] + 1; | ||
if (right >= xv.length) return; // step right if distance to new right edge is <= distance to old left edge | ||
// step when distance is equal to ensure movement over duplicate x values | ||
if (right >= xv.length) return; | ||
// step right if distance to new right edge is <= distance to old left edge | ||
// step when distance is equal to ensure movement over duplicate x values | ||
while (i > left && (xv[right] - val) <= (val - xv[left])) { | ||
while (i > left && xv[right] - val <= val - xv[left]) { | ||
interval[0] = ++left; | ||
@@ -1177,15 +1239,20 @@ interval[1] = right; | ||
} | ||
} | ||
} // generate smoothed output points | ||
// average points with repeated x values | ||
// generate smoothed output points | ||
// average points with repeated x values | ||
function output(xv, yhat, ux, uy) { | ||
const n = xv.length, out = []; | ||
let i = 0, cnt = 0, prev = [], v; | ||
const n = xv.length, | ||
out = []; | ||
let i = 0, | ||
cnt = 0, | ||
prev = [], | ||
v; | ||
for (; i<n; ++i) { | ||
for (; i < n; ++i) { | ||
v = xv[i] + ux; | ||
if (prev[0] === v) { | ||
// average output values via online update | ||
prev[1] += (yhat[i] - prev[1]) / (++cnt); | ||
prev[1] += (yhat[i] - prev[1]) / ++cnt; | ||
} else { | ||
@@ -1199,4 +1266,4 @@ // add new output point | ||
} | ||
prev[1] += uy; | ||
return out; | ||
@@ -1206,6 +1273,5 @@ } | ||
// subdivide up to accuracy of 0.1 degrees | ||
const MIN_RADIANS = 0.1 * Math.PI / 180; | ||
const MIN_RADIANS = 0.1 * Math.PI / 180; // Adaptively sample an interpolated function over a domain extent | ||
// Adaptively sample an interpolated function over a domain extent | ||
function sampleCurve(f, extent, minSteps, maxSteps) { | ||
function sampleCurve (f, extent, minSteps, maxSteps) { | ||
minSteps = minSteps || 25; | ||
@@ -1225,4 +1291,5 @@ maxSteps = Math.max(minSteps, maxSteps || 200); | ||
for (let i = 1; i < maxSteps; ++i) { | ||
prev.push(point(minX + (i / minSteps) * span)); | ||
prev.push(point(minX + i / minSteps * span)); | ||
} | ||
prev.push(point(maxX)); | ||
@@ -1234,4 +1301,5 @@ return prev; | ||
next.push(point(maxX)); | ||
for (let i = minSteps; --i > 0;) { | ||
next.push(point(minX + (i / minSteps) * span)); | ||
next.push(point(minX + i / minSteps * span)); | ||
} | ||
@@ -1259,2 +1327,3 @@ } | ||
} | ||
p1 = next[next.length - 1]; | ||
@@ -1261,0 +1330,0 @@ } |
@@ -1,1 +0,2 @@ | ||
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("d3-array")):"function"==typeof define&&define.amd?define(["exports","d3-array"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).vega={},t.d3)}(this,(function(t,n){"use strict";function*e(t,n){if(null==n)for(let n of t)null!=n&&""!==n&&(n=+n)>=n&&(yield n);else{let e=-1;for(let r of t)r=n(r,++e,t),null!=r&&""!==r&&(r=+r)>=r&&(yield r)}}function r(t,r,o){const l=Float64Array.from(e(t,o));return l.sort(n.ascending),r.map(t=>n.quantileSorted(l,t))}function o(t,n){return r(t,[.25,.5,.75],n)}function l(t,e){const r=t.length,l=n.deviation(t,e),a=o(t,e),u=(a[2]-a[0])/1.34;return 1.06*(Math.min(l,u)||l||Math.abs(a[0])||1)*Math.pow(r,-.2)}t.random=Math.random;const a=Math.sqrt(2*Math.PI),u=Math.SQRT2;let f=NaN;function i(n,e){n=n||0,e=null==e?1:e;let r,o,l=0,a=0;if(f==f)l=f,f=NaN;else{do{l=2*t.random()-1,a=2*t.random()-1,r=l*l+a*a}while(0===r||r>1);o=Math.sqrt(-2*Math.log(r)/r),l*=o,f=a*o}return n+l*e}function s(t,n,e){const r=(t-(n||0))/(e=null==e?1:e);return Math.exp(-.5*r*r)/(e*a)}function c(t,n,e){const r=(t-(n=n||0))/(e=null==e?1:e),o=Math.abs(r);let l;if(o>37)l=0;else{const t=Math.exp(-o*o/2);let n;o<7.07106781186547?(n=.0352624965998911*o+.700383064443688,n=n*o+6.37396220353165,n=n*o+33.912866078383,n=n*o+112.079291497871,n=n*o+221.213596169931,n=n*o+220.206867912376,l=t*n,n=.0883883476483184*o+1.75566716318264,n=n*o+16.064177579207,n=n*o+86.7807322029461,n=n*o+296.564248779674,n=n*o+637.333633378831,n=n*o+793.826512519948,n=n*o+440.413735824752,l/=n):(n=o+.65,n=o+4/n,n=o+3/n,n=o+2/n,n=o+1/n,l=t/n/2.506628274631)}return r>0?1-l:l}function h(t,n,e){return t<0||t>1?NaN:(n||0)+(null==e?1:e)*u*function(t){let n,e=-Math.log((1-t)*(1+t));e<6.25?(e-=3.125,n=-364441206401782e-35,n=n*e-16850591381820166e-35,n=128584807152564e-32+n*e,n=11157877678025181e-33+n*e,n=n*e-1333171662854621e-31,n=20972767875968562e-33+n*e,n=6637638134358324e-30+n*e,n=n*e-4054566272975207e-29,n=n*e-8151934197605472e-29,n=26335093153082323e-28+n*e,n=n*e-12975133253453532e-27,n=n*e-5415412054294628e-26,n=1.0512122733215323e-9+n*e,n=n*e-4.112633980346984e-9,n=n*e-2.9070369957882005e-8,n=4.2347877827932404e-7+n*e,n=n*e-13654692000834679e-22,n=n*e-13882523362786469e-21,n=.00018673420803405714+n*e,n=n*e-.000740702534166267,n=n*e-.006033670871430149,n=.24015818242558962+n*e,n=1.6536545626831027+n*e):e<16?(e=Math.sqrt(e)-3.25,n=2.2137376921775787e-9,n=9.075656193888539e-8+n*e,n=n*e-2.7517406297064545e-7,n=1.8239629214389228e-8+n*e,n=15027403968909828e-22+n*e,n=n*e-4013867526981546e-21,n=29234449089955446e-22+n*e,n=12475304481671779e-21+n*e,n=n*e-47318229009055734e-21,n=6828485145957318e-20+n*e,n=24031110387097894e-21+n*e,n=n*e-.0003550375203628475,n=.0009532893797373805+n*e,n=n*e-.0016882755560235047,n=.002491442096107851+n*e,n=n*e-.003751208507569241,n=.005370914553590064+n*e,n=1.0052589676941592+n*e,n=3.0838856104922208+n*e):Number.isFinite(e)?(e=Math.sqrt(e)-5,n=-27109920616438573e-27,n=n*e-2.555641816996525e-10,n=1.5076572693500548e-9+n*e,n=n*e-3.789465440126737e-9,n=7.61570120807834e-9+n*e,n=n*e-1.496002662714924e-8,n=2.914795345090108e-8+n*e,n=n*e-6.771199775845234e-8,n=2.2900482228026655e-7+n*e,n=n*e-9.9298272942317e-7,n=4526062597223154e-21+n*e,n=n*e-1968177810553167e-20,n=7599527703001776e-20+n*e,n=n*e-.00021503011930044477,n=n*e-.00013871931833623122,n=1.0103004648645344+n*e,n=4.849906401408584+n*e):n=1/0;return n*t}(2*t-1)}function d(t,n){let e,r;const o={mean(t){return arguments.length?(e=t||0,o):e},stdev(t){return arguments.length?(r=null==t?1:t,o):r},sample:()=>i(e,r),pdf:t=>s(t,e,r),cdf:t=>c(t,e,r),icdf:t=>h(t,e,r)};return o.mean(t).stdev(n)}function p(t,n){return t=t||0,n=null==n?1:n,Math.exp(t+i()*n)}function m(t,n,e){if(t<=0)return 0;n=n||0,e=null==e?1:e;const r=(Math.log(t)-n)/e;return Math.exp(-.5*r*r)/(e*a*t)}function M(t,n,e){return c(Math.log(t),n,e)}function g(t,n,e){return Math.exp(h(t,n,e))}function b(n,e){return null==e&&(e=null==n?1:n,n=0),n+(e-n)*t.random()}function w(t,n,e){return null==e&&(e=null==n?1:n,n=0),t>=n&&t<=e?1/(e-n):0}function x(t,n,e){return null==e&&(e=null==n?1:n,n=0),t<n?0:t>e?1:(t-n)/(e-n)}function y(t,n,e){return null==e&&(e=null==n?1:n,n=0),t>=0&&t<=1?n+t*(e-n):NaN}function N(t,n,e,r){const o=r-t*t,l=Math.abs(o)<1e-24?0:(e-t*n)/o;return[n-l*t,l]}function q(t,n,e,r){t=t.filter(t=>{let r=n(t),o=e(t);return null!=r&&(r=+r)>=r&&null!=o&&(o=+o)>=o}),r&&t.sort((t,e)=>n(t)-n(e));const o=t.length,l=new Float64Array(o),a=new Float64Array(o);let u,f,i,s=0,c=0,h=0;for(i of t)l[s]=u=+n(i),a[s]=f=+e(i),++s,c+=(u-c)/s,h+=(f-h)/s;for(s=0;s<o;++s)l[s]-=c,a[s]-=h;return[l,a,c,h]}function v(t,n,e,r){let o,l,a=-1;for(const u of t)o=n(u),l=e(u),null!=o&&(o=+o)>=o&&null!=l&&(l=+l)>=l&&r(o,l,++a)}function A(t,n,e,r,o){let l=0,a=0;return v(t,n,e,(t,n)=>{const e=n-o(t),u=n-r;l+=e*e,a+=u*u}),1-l/a}function F(t,n,e){let r=0,o=0,l=0,a=0,u=0;v(t,n,e,(t,n)=>{++u,r+=(t-r)/u,o+=(n-o)/u,l+=(t*n-l)/u,a+=(t*t-a)/u});const f=N(r,o,l,a),i=t=>f[0]+f[1]*t;return{coef:f,predict:i,rSquared:A(t,n,e,o,i)}}function L(t,n,e){const[r,o,l,a]=q(t,n,e),u=r.length;let f,i,s,c,h=0,d=0,p=0,m=0,M=0;for(f=0;f<u;)i=r[f],s=o[f++],c=i*i,h+=(c-h)/f,d+=(c*i-d)/f,p+=(c*c-p)/f,m+=(i*s-m)/f,M+=(c*s-M)/f;const g=p-h*h,b=h*g-d*d,w=(M*h-m*d)/b,x=(m*g-M*d)/b,y=-w*h,N=t=>w*(t-=l)*t+x*t+y+a;return{coef:[y-x*l+w*l*l+a,x-2*w*l,w],predict:N,rSquared:A(t,n,e,a,N)}}function S(t,n,e,r){const o=Array(t);let l,a,u,f;for(l=0;l<t;++l)o[l]=0;for(l=t-1;l>=0;--l)for(u=n[l],f=1,o[l]+=u,a=1;a<=l;++a)f*=(l+1-a)/a,o[l-a]+=u*Math.pow(e,a)*f;return o[0]+=r,o}function E(t){return(t=1-t*t*t)*t*t}function P(t,n,e){const r=t[n];let o=e[0],l=e[1]+1;if(!(l>=t.length))for(;n>o&&t[l]-r<=r-t[o];)e[0]=++o,e[1]=l,++l}const U=.1*Math.PI/180;function I(t,n,e){const r=Math.atan2(e[1]-t[1],e[0]-t[0]),o=Math.atan2(n[1]-t[1],n[0]-t[0]);return Math.abs(r-o)}t.bandwidthNRD=l,t.bin=function(t){const n=t.maxbins||20,e=t.base||10,r=Math.log(e),o=t.divide||[5,2];let l,a,u,f,i,s,c=t.extent[0],h=t.extent[1];const d=t.span||h-c||Math.abs(c)||1;if(t.step)l=t.step;else if(t.steps){for(f=d/n,i=0,s=t.steps.length;i<s&&t.steps[i]<f;++i);l=t.steps[Math.max(0,i-1)]}else{for(a=Math.ceil(Math.log(n)/r),u=t.minstep||0,l=Math.max(u,Math.pow(e,Math.round(Math.log(d)/r)-a));Math.ceil(d/l)>n;)l*=e;for(i=0,s=o.length;i<s;++i)f=l/o[i],f>=u&&d/f<=n&&(l=f)}f=Math.log(l);const p=f>=0?0:1+~~(-f/r),m=Math.pow(e,-p-1);return(t.nice||void 0===t.nice)&&(f=Math.floor(c/l+m)*l,c=c<f?f-l:f,h=Math.ceil(h/l)*l),{start:c,stop:h===c?c+l:h,step:l}},t.bootstrapCI=function(r,o,l,a){if(!r.length)return[void 0,void 0];const u=Float64Array.from(e(r,a)),f=u.length,i=o;let s,c,h,d;for(h=0,d=Array(i);h<i;++h){for(s=0,c=0;c<f;++c)s+=u[~~(t.random()*f)];d[h]=s/f}return d.sort(n.ascending),[n.quantile(d,l/2),n.quantile(d,1-l/2)]},t.cumulativeLogNormal=M,t.cumulativeNormal=c,t.cumulativeUniform=x,t.densityLogNormal=m,t.densityNormal=s,t.densityUniform=w,t.dotbin=function(t,n,e,r){r=r||(t=>t);const o=t.length,l=new Float64Array(o);let a,u=0,f=1,i=r(t[0]),s=i,c=i+n;for(;f<o;++f){if(a=r(t[f]),a>=c){for(s=(i+s)/2;u<f;++u)l[u]=s;c=a+n,i=a}s=a}for(s=(i+s)/2;u<f;++u)l[u]=s;return e?function(t,n){const e=t.length;let r,o,l=0,a=1;for(;t[l]===t[a];)++a;for(;a<e;){for(r=a+1;t[a]===t[r];)++r;if(t[a]-t[a-1]<n){for(o=a+(l+r-a-a>>1);o<a;)t[o++]=t[a];for(;o>a;)t[o--]=t[l]}l=a,a=r}return t}(l,n+n/4):l},t.quantileLogNormal=g,t.quantileNormal=h,t.quantileUniform=y,t.quantiles=r,t.quartiles=o,t.randomInteger=function(n,e){let r,o,l;null==e&&(e=n,n=0);const a={min(t){return arguments.length?(r=t||0,l=o-r,a):r},max(t){return arguments.length?(o=t||0,l=o-r,a):o},sample:()=>r+Math.floor(l*t.random()),pdf:t=>t===Math.floor(t)&&t>=r&&t<o?1/l:0,cdf(t){const n=Math.floor(t);return n<r?0:n>=o?1:(n-r+1)/l},icdf:t=>t>=0&&t<=1?r-1+Math.floor(t*l):NaN};return a.min(n).max(e)},t.randomKDE=function(n,e){const r=d();let o=0;const a={data(t){return arguments.length?(n=t,o=t?t.length:0,a.bandwidth(e)):n},bandwidth(t){return arguments.length?(!(e=t)&&n&&(e=l(n)),a):e},sample:()=>n[~~(t.random()*o)]+e*r.sample(),pdf(t){let l=0,a=0;for(;a<o;++a)l+=r.pdf((t-n[a])/e);return l/e/o},cdf(t){let l=0,a=0;for(;a<o;++a)l+=r.cdf((t-n[a])/e);return l/o},icdf(){throw Error("KDE icdf not supported.")}};return a.data(n)},t.randomLCG=function(t){return function(){return(t=(1103515245*t+12345)%2147483647)/2147483647}},t.randomLogNormal=function(t,n){let e,r;const o={mean(t){return arguments.length?(e=t||0,o):e},stdev(t){return arguments.length?(r=null==t?1:t,o):r},sample:()=>p(e,r),pdf:t=>m(t,e,r),cdf:t=>M(t,e,r),icdf:t=>g(t,e,r)};return o.mean(t).stdev(n)},t.randomMixture=function(n,e){let r,o=0;const l={weights(t){return arguments.length?(r=function(t){const n=[];let e,r=0;for(e=0;e<o;++e)r+=n[e]=null==t[e]?1:+t[e];for(e=0;e<o;++e)n[e]/=r;return n}(e=t||[]),l):e},distributions(t){return arguments.length?(t?(o=t.length,n=t):(o=0,n=[]),l.weights(e)):n},sample(){const e=t.random();let l=n[o-1],a=r[0],u=0;for(;u<o-1;a+=r[++u])if(e<a){l=n[u];break}return l.sample()},pdf(t){let e=0,l=0;for(;l<o;++l)e+=r[l]*n[l].pdf(t);return e},cdf(t){let e=0,l=0;for(;l<o;++l)e+=r[l]*n[l].cdf(t);return e},icdf(){throw Error("Mixture icdf not supported.")}};return l.distributions(n).weights(e)},t.randomNormal=d,t.randomUniform=function(t,n){let e,r;const o={min(t){return arguments.length?(e=t||0,o):e},max(t){return arguments.length?(r=null==t?1:t,o):r},sample:()=>b(e,r),pdf:t=>w(t,e,r),cdf:t=>x(t,e,r),icdf:t=>y(t,e,r)};return null==n&&(n=null==t?1:t,t=0),o.min(t).max(n)},t.regressionExp=function(t,n,e){const[r,o,l,a]=q(t,n,e);let u,f,i,s=0,c=0,h=0,d=0,p=0;v(t,n,e,(t,n)=>{u=r[p++],f=Math.log(n),i=u*n,s+=(n*f-s)/p,c+=(i-c)/p,h+=(i*f-h)/p,d+=(u*i-d)/p});const[m,M]=N(c/a,s/a,h/a,d/a),g=t=>Math.exp(m+M*(t-l));return{coef:[Math.exp(m-M*l),M],predict:g,rSquared:A(t,n,e,a,g)}},t.regressionLinear=F,t.regressionLoess=function(t,e,r,o){const[l,a,u,f]=q(t,e,r,!0),i=l.length,s=Math.max(2,~~(o*i)),c=new Float64Array(i),h=new Float64Array(i),d=new Float64Array(i).fill(1);for(let t=-1;++t<=2;){const e=[0,s-1];for(let t=0;t<i;++t){const n=l[t],r=e[0],o=e[1],u=n-l[r]>l[o]-n?r:o;let f=0,i=0,s=0,p=0,m=0;const M=1/Math.abs(l[u]-n||1);for(let t=r;t<=o;++t){const e=l[t],r=a[t],o=E(Math.abs(n-e)*M)*d[t],u=e*o;f+=o,i+=u,s+=r*o,p+=r*u,m+=e*u}const[g,b]=N(i/f,s/f,p/f,m/f);c[t]=g+b*n,h[t]=Math.abs(a[t]-c[t]),P(l,t+1,e)}if(2===t)break;const r=n.median(h);if(Math.abs(r)<1e-12)break;for(let t,n,e=0;e<i;++e)t=h[e]/(6*r),d[e]=t>=1?1e-12:(n=1-t*t)*n}return function(t,n,e,r){const o=t.length,l=[];let a,u=0,f=0,i=[];for(;u<o;++u)a=t[u]+e,i[0]===a?i[1]+=(n[u]-i[1])/++f:(f=0,i[1]+=r,i=[a,n[u]],l.push(i));return i[1]+=r,l}(l,c,u,f)},t.regressionLog=function(t,n,e){let r=0,o=0,l=0,a=0,u=0;v(t,n,e,(t,n)=>{++u,t=Math.log(t),r+=(t-r)/u,o+=(n-o)/u,l+=(t*n-l)/u,a+=(t*t-a)/u});const f=N(r,o,l,a),i=t=>f[0]+f[1]*Math.log(t);return{coef:f,predict:i,rSquared:A(t,n,e,o,i)}},t.regressionPoly=function(t,n,e,r){if(1===r)return F(t,n,e);if(2===r)return L(t,n,e);const[o,l,a,u]=q(t,n,e),f=o.length,i=[],s=[],c=r+1;let h,d,p,m,M;for(h=0;h<c;++h){for(p=0,m=0;p<f;++p)m+=Math.pow(o[p],h)*l[p];for(i.push(m),M=new Float64Array(c),d=0;d<c;++d){for(p=0,m=0;p<f;++p)m+=Math.pow(o[p],h+d);M[d]=m}s.push(M)}s.push(i);const g=function(t){const n=t.length-1,e=[];let r,o,l,a,u;for(r=0;r<n;++r){for(a=r,o=r+1;o<n;++o)Math.abs(t[r][o])>Math.abs(t[r][a])&&(a=o);for(l=r;l<n+1;++l)u=t[l][r],t[l][r]=t[l][a],t[l][a]=u;for(o=r+1;o<n;++o)for(l=n;l>=r;l--)t[l][o]-=t[l][r]*t[r][o]/t[r][r]}for(o=n-1;o>=0;--o){for(u=0,l=o+1;l<n;++l)u+=t[l][o]*e[l];e[o]=(t[n][o]-u)/t[o][o]}return e}(s),b=t=>{t-=a;let n=u+g[0]+g[1]*t+g[2]*t*t;for(h=3;h<c;++h)n+=g[h]*Math.pow(t,h);return n};return{coef:S(c,g,-a,u),predict:b,rSquared:A(t,n,e,u,b)}},t.regressionPow=function(t,n,e){let r=0,o=0,l=0,a=0,u=0,f=0;v(t,n,e,(t,n)=>{const e=Math.log(t),i=Math.log(n);++f,r+=(e-r)/f,o+=(i-o)/f,l+=(e*i-l)/f,a+=(e*e-a)/f,u+=(n-u)/f});const i=N(r,o,l,a),s=t=>i[0]*Math.pow(t,i[1]);return i[0]=Math.exp(i[0]),{coef:i,predict:s,rSquared:A(t,n,e,u,s)}},t.regressionQuad=L,t.sampleCurve=function(t,n,e,r){e=e||25,r=Math.max(e,r||200);const o=n=>[n,t(n)],l=n[0],a=n[1],u=a-l,f=u/r,i=[o(l)],s=[];if(e===r){for(let t=1;t<r;++t)i.push(o(l+t/e*u));return i.push(o(a)),i}s.push(o(a));for(let t=e;--t>0;)s.push(o(l+t/e*u));let c=i[0],h=s[s.length-1];for(;h;){const t=o((c[0]+h[0])/2);t[0]-c[0]>=f&&I(c,t,h)>U?s.push(t):(c=h,i.push(h),s.pop()),h=s[s.length-1]}return i},t.sampleLogNormal=p,t.sampleNormal=i,t.sampleUniform=b,t.setRandom=function(n){t.random=n},Object.defineProperty(t,"__esModule",{value:!0})})); | ||
var vega=function(t){"use strict";function*n(t,n){if(null==n)for(let n of t)null!=n&&""!==n&&(n=+n)>=n&&(yield n);else{let r=-1;for(let e of t)e=n(e,++r,t),null!=e&&""!==e&&(e=+e)>=e&&(yield e)}}function r(t,n){return t<n?-1:t>n?1:t>=n?0:NaN}function e(t){return null===t?NaN:+t}function o(t,n){let r;if(void 0===n)for(const n of t)null!=n&&(r<n||void 0===r&&n>=n)&&(r=n);else{let e=-1;for(let o of t)null!=(o=n(o,++e,t))&&(r<o||void 0===r&&o>=o)&&(r=o)}return r}function l(t,n){let r;if(void 0===n)for(const n of t)null!=n&&(r>n||void 0===r&&n>=n)&&(r=n);else{let e=-1;for(let o of t)null!=(o=n(o,++e,t))&&(r>o||void 0===r&&o>=o)&&(r=o)}return r}function u(t,n,e=0,o=t.length-1,l=r){for(;o>e;){if(o-e>600){const r=o-e+1,f=n-e+1,a=Math.log(r),i=.5*Math.exp(2*a/3),s=.5*Math.sqrt(a*i*(r-i)/r)*(f-r/2<0?-1:1);u(t,n,Math.max(e,Math.floor(n-f*i/r+s)),Math.min(o,Math.floor(n+(r-f)*i/r+s)),l)}const r=t[n];let a=e,i=o;for(f(t,e,n),l(t[o],r)>0&&f(t,e,o);a<i;){for(f(t,a,i),++a,--i;l(t[a],r)<0;)++a;for(;l(t[i],r)>0;)--i}0===l(t[e],r)?f(t,e,i):(++i,f(t,i,o)),i<=n&&(e=i+1),n<=i&&(o=i-1)}return t}function f(t,n,r){const e=t[n];t[n]=t[r],t[r]=e}function a(t,n,r){if(e=(t=Float64Array.from(function*(t,n){if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(yield n);else{let r=-1;for(let e of t)null!=(e=n(e,++r,t))&&(e=+e)>=e&&(yield e)}}(t,r))).length){if((n=+n)<=0||e<2)return l(t);if(n>=1)return o(t);var e,f=(e-1)*n,a=Math.floor(f),i=o(u(t,a).subarray(0,a+1));return i+(l(t.subarray(a+1))-i)*(f-a)}}function i(t,o,l){const u=Float64Array.from(n(t,l));return u.sort(r),o.map(t=>function(t,n,r=e){if(o=t.length){if((n=+n)<=0||o<2)return+r(t[0],0,t);if(n>=1)return+r(t[o-1],o-1,t);var o,l=(o-1)*n,u=Math.floor(l),f=+r(t[u],u,t);return f+(+r(t[u+1],u+1,t)-f)*(l-u)}}(u,t))}function s(t,n){return i(t,[.25,.5,.75],n)}function c(t,n){const r=t.length,e=function(t,n){const r=function(t,n){let r,e=0,o=0,l=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(r=n-o,o+=r/++e,l+=r*(n-o));else{let u=-1;for(let f of t)null!=(f=n(f,++u,t))&&(f=+f)>=f&&(r=f-o,o+=r/++e,l+=r*(f-o))}if(e>1)return l/(e-1)}(t,n);return r?Math.sqrt(r):r}(t,n),o=s(t,n),l=(o[2]-o[0])/1.34;return 1.06*(Math.min(e,l)||e||Math.abs(o[0])||1)*Math.pow(r,-.2)}t.random=Math.random;const h=Math.sqrt(2*Math.PI),d=Math.SQRT2;let M=NaN;function m(n,r){n=n||0,r=null==r?1:r;let e,o,l=0,u=0;if(M==M)l=M,M=NaN;else{do{l=2*t.random()-1,u=2*t.random()-1,e=l*l+u*u}while(0===e||e>1);o=Math.sqrt(-2*Math.log(e)/e),l*=o,M=u*o}return n+l*r}function p(t,n,r){const e=(t-(n||0))/(r=null==r?1:r);return Math.exp(-.5*e*e)/(r*h)}function g(t,n,r){const e=(t-(n=n||0))/(r=null==r?1:r),o=Math.abs(e);let l;if(o>37)l=0;else{const t=Math.exp(-o*o/2);let n;o<7.07106781186547?(n=.0352624965998911*o+.700383064443688,n=n*o+6.37396220353165,n=n*o+33.912866078383,n=n*o+112.079291497871,n=n*o+221.213596169931,n=n*o+220.206867912376,l=t*n,n=.0883883476483184*o+1.75566716318264,n=n*o+16.064177579207,n=n*o+86.7807322029461,n=n*o+296.564248779674,n=n*o+637.333633378831,n=n*o+793.826512519948,n=n*o+440.413735824752,l/=n):(n=o+.65,n=o+4/n,n=o+3/n,n=o+2/n,n=o+1/n,l=t/n/2.506628274631)}return e>0?1-l:l}function b(t,n,r){return t<0||t>1?NaN:(n||0)+(null==r?1:r)*d*function(t){let n,r=-Math.log((1-t)*(1+t));r<6.25?(r-=3.125,n=-364441206401782e-35,n=n*r-16850591381820166e-35,n=128584807152564e-32+n*r,n=11157877678025181e-33+n*r,n=n*r-1333171662854621e-31,n=20972767875968562e-33+n*r,n=6637638134358324e-30+n*r,n=n*r-4054566272975207e-29,n=n*r-8151934197605472e-29,n=26335093153082323e-28+n*r,n=n*r-12975133253453532e-27,n=n*r-5415412054294628e-26,n=1.0512122733215323e-9+n*r,n=n*r-4.112633980346984e-9,n=n*r-2.9070369957882005e-8,n=4.2347877827932404e-7+n*r,n=n*r-13654692000834679e-22,n=n*r-13882523362786469e-21,n=.00018673420803405714+n*r,n=n*r-.000740702534166267,n=n*r-.006033670871430149,n=.24015818242558962+n*r,n=1.6536545626831027+n*r):r<16?(r=Math.sqrt(r)-3.25,n=2.2137376921775787e-9,n=9.075656193888539e-8+n*r,n=n*r-2.7517406297064545e-7,n=1.8239629214389228e-8+n*r,n=15027403968909828e-22+n*r,n=n*r-4013867526981546e-21,n=29234449089955446e-22+n*r,n=12475304481671779e-21+n*r,n=n*r-47318229009055734e-21,n=6828485145957318e-20+n*r,n=24031110387097894e-21+n*r,n=n*r-.0003550375203628475,n=.0009532893797373805+n*r,n=n*r-.0016882755560235047,n=.002491442096107851+n*r,n=n*r-.003751208507569241,n=.005370914553590064+n*r,n=1.0052589676941592+n*r,n=3.0838856104922208+n*r):Number.isFinite(r)?(r=Math.sqrt(r)-5,n=-27109920616438573e-27,n=n*r-2.555641816996525e-10,n=1.5076572693500548e-9+n*r,n=n*r-3.789465440126737e-9,n=7.61570120807834e-9+n*r,n=n*r-1.496002662714924e-8,n=2.914795345090108e-8+n*r,n=n*r-6.771199775845234e-8,n=2.2900482228026655e-7+n*r,n=n*r-9.9298272942317e-7,n=4526062597223154e-21+n*r,n=n*r-1968177810553167e-20,n=7599527703001776e-20+n*r,n=n*r-.00021503011930044477,n=n*r-.00013871931833623122,n=1.0103004648645344+n*r,n=4.849906401408584+n*r):n=1/0;return n*t}(2*t-1)}function N(t,n){let r,e;const o={mean(t){return arguments.length?(r=t||0,o):r},stdev(t){return arguments.length?(e=null==t?1:t,o):e},sample:()=>m(r,e),pdf:t=>p(t,r,e),cdf:t=>g(t,r,e),icdf:t=>b(t,r,e)};return o.mean(t).stdev(n)}function v(t,n){return t=t||0,n=null==n?1:n,Math.exp(t+m()*n)}function w(t,n,r){if(t<=0)return 0;n=n||0,r=null==r?1:r;const e=(Math.log(t)-n)/r;return Math.exp(-.5*e*e)/(r*h*t)}function x(t,n,r){return g(Math.log(t),n,r)}function y(t,n,r){return Math.exp(b(t,n,r))}function q(n,r){return null==r&&(r=null==n?1:n,n=0),n+(r-n)*t.random()}function A(t,n,r){return null==r&&(r=null==n?1:n,n=0),t>=n&&t<=r?1/(r-n):0}function F(t,n,r){return null==r&&(r=null==n?1:n,n=0),t<n?0:t>r?1:(t-n)/(r-n)}function L(t,n,r){return null==r&&(r=null==n?1:n,n=0),t>=0&&t<=1?n+t*(r-n):NaN}function S(t,n,r,e){const o=e-t*t,l=Math.abs(o)<1e-24?0:(r-t*n)/o;return[n-l*t,l]}function E(t,n,r,e){t=t.filter(t=>{let e=n(t),o=r(t);return null!=e&&(e=+e)>=e&&null!=o&&(o=+o)>=o}),e&&t.sort((t,r)=>n(t)-n(r));const o=t.length,l=new Float64Array(o),u=new Float64Array(o);let f,a,i,s=0,c=0,h=0;for(i of t)l[s]=f=+n(i),u[s]=a=+r(i),++s,c+=(f-c)/s,h+=(a-h)/s;for(s=0;s<o;++s)l[s]-=c,u[s]-=h;return[l,u,c,h]}function U(t,n,r,e){let o,l,u=-1;for(const f of t)o=n(f),l=r(f),null!=o&&(o=+o)>=o&&null!=l&&(l=+l)>=l&&e(o,l,++u)}function I(t,n,r,e,o){let l=0,u=0;return U(t,n,r,(t,n)=>{const r=n-o(t),f=n-e;l+=r*r,u+=f*f}),1-l/u}function P(t,n,r){let e=0,o=0,l=0,u=0,f=0;U(t,n,r,(t,n)=>{++f,e+=(t-e)/f,o+=(n-o)/f,l+=(t*n-l)/f,u+=(t*t-u)/f});const a=S(e,o,l,u),i=t=>a[0]+a[1]*t;return{coef:a,predict:i,rSquared:I(t,n,r,o,i)}}function k(t,n,r){const[e,o,l,u]=E(t,n,r),f=e.length;let a,i,s,c,h=0,d=0,M=0,m=0,p=0;for(a=0;a<f;)i=e[a],s=o[a++],c=i*i,h+=(c-h)/a,d+=(c*i-d)/a,M+=(c*c-M)/a,m+=(i*s-m)/a,p+=(c*s-p)/a;const g=M-h*h,b=h*g-d*d,N=(p*h-m*d)/b,v=(m*g-p*d)/b,w=-N*h,x=t=>N*(t-=l)*t+v*t+w+u;return{coef:[w-v*l+N*l*l+u,v-2*N*l,N],predict:x,rSquared:I(t,n,r,u,x)}}function C(t,n,r,e){const o=Array(t);let l,u,f,a;for(l=0;l<t;++l)o[l]=0;for(l=t-1;l>=0;--l)for(f=n[l],a=1,o[l]+=f,u=1;u<=l;++u)a*=(l+1-u)/u,o[l-u]+=f*Math.pow(r,u)*a;return o[0]+=e,o}function D(t){return(t=1-t*t*t)*t*t}function R(t,n,r){const e=t[n];let o=r[0],l=r[1]+1;if(!(l>=t.length))for(;n>o&&t[l]-e<=e-t[o];)r[0]=++o,r[1]=l,++l}const K=.1*Math.PI/180;function Q(t,n,r){const e=Math.atan2(r[1]-t[1],r[0]-t[0]),o=Math.atan2(n[1]-t[1],n[0]-t[0]);return Math.abs(e-o)}return t.bandwidthNRD=c,t.bin=function(t){const n=t.maxbins||20,r=t.base||10,e=Math.log(r),o=t.divide||[5,2];let l,u,f,a,i,s,c=t.extent[0],h=t.extent[1];const d=t.span||h-c||Math.abs(c)||1;if(t.step)l=t.step;else if(t.steps){for(a=d/n,i=0,s=t.steps.length;i<s&&t.steps[i]<a;++i);l=t.steps[Math.max(0,i-1)]}else{for(u=Math.ceil(Math.log(n)/e),f=t.minstep||0,l=Math.max(f,Math.pow(r,Math.round(Math.log(d)/e)-u));Math.ceil(d/l)>n;)l*=r;for(i=0,s=o.length;i<s;++i)a=l/o[i],a>=f&&d/a<=n&&(l=a)}a=Math.log(l);const M=a>=0?0:1+~~(-a/e),m=Math.pow(r,-M-1);return(t.nice||void 0===t.nice)&&(a=Math.floor(c/l+m)*l,c=c<a?a-l:a,h=Math.ceil(h/l)*l),{start:c,stop:h===c?c+l:h,step:l}},t.bootstrapCI=function(e,o,l,u){if(!e.length)return[void 0,void 0];const f=Float64Array.from(n(e,u)),i=f.length,s=o;let c,h,d,M;for(d=0,M=Array(s);d<s;++d){for(c=0,h=0;h<i;++h)c+=f[~~(t.random()*i)];M[d]=c/i}return M.sort(r),[a(M,l/2),a(M,1-l/2)]},t.cumulativeLogNormal=x,t.cumulativeNormal=g,t.cumulativeUniform=F,t.densityLogNormal=w,t.densityNormal=p,t.densityUniform=A,t.dotbin=function(t,n,r,e){e=e||(t=>t);const o=t.length,l=new Float64Array(o);let u,f=0,a=1,i=e(t[0]),s=i,c=i+n;for(;a<o;++a){if(u=e(t[a]),u>=c){for(s=(i+s)/2;f<a;++f)l[f]=s;c=u+n,i=u}s=u}for(s=(i+s)/2;f<a;++f)l[f]=s;return r?function(t,n){const r=t.length;let e,o,l=0,u=1;for(;t[l]===t[u];)++u;for(;u<r;){for(e=u+1;t[u]===t[e];)++e;if(t[u]-t[u-1]<n){for(o=u+(l+e-u-u>>1);o<u;)t[o++]=t[u];for(;o>u;)t[o--]=t[l]}l=u,u=e}return t}(l,n+n/4):l},t.quantileLogNormal=y,t.quantileNormal=b,t.quantileUniform=L,t.quantiles=i,t.quartiles=s,t.randomInteger=function(n,r){let e,o,l;null==r&&(r=n,n=0);const u={min(t){return arguments.length?(e=t||0,l=o-e,u):e},max(t){return arguments.length?(o=t||0,l=o-e,u):o},sample:()=>e+Math.floor(l*t.random()),pdf:t=>t===Math.floor(t)&&t>=e&&t<o?1/l:0,cdf(t){const n=Math.floor(t);return n<e?0:n>=o?1:(n-e+1)/l},icdf:t=>t>=0&&t<=1?e-1+Math.floor(t*l):NaN};return u.min(n).max(r)},t.randomKDE=function(n,r){const e=N();let o=0;const l={data(t){return arguments.length?(n=t,o=t?t.length:0,l.bandwidth(r)):n},bandwidth(t){return arguments.length?(!(r=t)&&n&&(r=c(n)),l):r},sample:()=>n[~~(t.random()*o)]+r*e.sample(),pdf(t){let l=0,u=0;for(;u<o;++u)l+=e.pdf((t-n[u])/r);return l/r/o},cdf(t){let l=0,u=0;for(;u<o;++u)l+=e.cdf((t-n[u])/r);return l/o},icdf(){throw Error("KDE icdf not supported.")}};return l.data(n)},t.randomLCG=function(t){return function(){return(t=(1103515245*t+12345)%2147483647)/2147483647}},t.randomLogNormal=function(t,n){let r,e;const o={mean(t){return arguments.length?(r=t||0,o):r},stdev(t){return arguments.length?(e=null==t?1:t,o):e},sample:()=>v(r,e),pdf:t=>w(t,r,e),cdf:t=>x(t,r,e),icdf:t=>y(t,r,e)};return o.mean(t).stdev(n)},t.randomMixture=function(n,r){let e,o=0;const l={weights(t){return arguments.length?(e=function(t){const n=[];let r,e=0;for(r=0;r<o;++r)e+=n[r]=null==t[r]?1:+t[r];for(r=0;r<o;++r)n[r]/=e;return n}(r=t||[]),l):r},distributions(t){return arguments.length?(t?(o=t.length,n=t):(o=0,n=[]),l.weights(r)):n},sample(){const r=t.random();let l=n[o-1],u=e[0],f=0;for(;f<o-1;u+=e[++f])if(r<u){l=n[f];break}return l.sample()},pdf(t){let r=0,l=0;for(;l<o;++l)r+=e[l]*n[l].pdf(t);return r},cdf(t){let r=0,l=0;for(;l<o;++l)r+=e[l]*n[l].cdf(t);return r},icdf(){throw Error("Mixture icdf not supported.")}};return l.distributions(n).weights(r)},t.randomNormal=N,t.randomUniform=function(t,n){let r,e;const o={min(t){return arguments.length?(r=t||0,o):r},max(t){return arguments.length?(e=null==t?1:t,o):e},sample:()=>q(r,e),pdf:t=>A(t,r,e),cdf:t=>F(t,r,e),icdf:t=>L(t,r,e)};return null==n&&(n=null==t?1:t,t=0),o.min(t).max(n)},t.regressionExp=function(t,n,r){const[e,o,l,u]=E(t,n,r);let f,a,i,s=0,c=0,h=0,d=0,M=0;U(t,n,r,(t,n)=>{f=e[M++],a=Math.log(n),i=f*n,s+=(n*a-s)/M,c+=(i-c)/M,h+=(i*a-h)/M,d+=(f*i-d)/M});const[m,p]=S(c/u,s/u,h/u,d/u),g=t=>Math.exp(m+p*(t-l));return{coef:[Math.exp(m-p*l),p],predict:g,rSquared:I(t,n,r,u,g)}},t.regressionLinear=P,t.regressionLoess=function(t,n,r,e){const[o,l,u,f]=E(t,n,r,!0),i=o.length,s=Math.max(2,~~(e*i)),c=new Float64Array(i),h=new Float64Array(i),d=new Float64Array(i).fill(1);for(let t=-1;++t<=2;){const n=[0,s-1];for(let t=0;t<i;++t){const r=o[t],e=n[0],u=n[1],f=r-o[e]>o[u]-r?e:u;let a=0,i=0,s=0,M=0,m=0;const p=1/Math.abs(o[f]-r||1);for(let t=e;t<=u;++t){const n=o[t],e=l[t],u=D(Math.abs(r-n)*p)*d[t],f=n*u;a+=u,i+=f,s+=e*u,M+=e*f,m+=n*f}const[g,b]=S(i/a,s/a,M/a,m/a);c[t]=g+b*r,h[t]=Math.abs(l[t]-c[t]),R(o,t+1,n)}if(2===t)break;const r=a(h,.5,void 0);if(Math.abs(r)<1e-12)break;for(let t,n,e=0;e<i;++e)t=h[e]/(6*r),d[e]=t>=1?1e-12:(n=1-t*t)*n}return function(t,n,r,e){const o=t.length,l=[];let u,f=0,a=0,i=[];for(;f<o;++f)u=t[f]+r,i[0]===u?i[1]+=(n[f]-i[1])/++a:(a=0,i[1]+=e,i=[u,n[f]],l.push(i));return i[1]+=e,l}(o,c,u,f)},t.regressionLog=function(t,n,r){let e=0,o=0,l=0,u=0,f=0;U(t,n,r,(t,n)=>{++f,t=Math.log(t),e+=(t-e)/f,o+=(n-o)/f,l+=(t*n-l)/f,u+=(t*t-u)/f});const a=S(e,o,l,u),i=t=>a[0]+a[1]*Math.log(t);return{coef:a,predict:i,rSquared:I(t,n,r,o,i)}},t.regressionPoly=function(t,n,r,e){if(1===e)return P(t,n,r);if(2===e)return k(t,n,r);const[o,l,u,f]=E(t,n,r),a=o.length,i=[],s=[],c=e+1;let h,d,M,m,p;for(h=0;h<c;++h){for(M=0,m=0;M<a;++M)m+=Math.pow(o[M],h)*l[M];for(i.push(m),p=new Float64Array(c),d=0;d<c;++d){for(M=0,m=0;M<a;++M)m+=Math.pow(o[M],h+d);p[d]=m}s.push(p)}s.push(i);const g=function(t){const n=t.length-1,r=[];let e,o,l,u,f;for(e=0;e<n;++e){for(u=e,o=e+1;o<n;++o)Math.abs(t[e][o])>Math.abs(t[e][u])&&(u=o);for(l=e;l<n+1;++l)f=t[l][e],t[l][e]=t[l][u],t[l][u]=f;for(o=e+1;o<n;++o)for(l=n;l>=e;l--)t[l][o]-=t[l][e]*t[e][o]/t[e][e]}for(o=n-1;o>=0;--o){for(f=0,l=o+1;l<n;++l)f+=t[l][o]*r[l];r[o]=(t[n][o]-f)/t[o][o]}return r}(s),b=t=>{t-=u;let n=f+g[0]+g[1]*t+g[2]*t*t;for(h=3;h<c;++h)n+=g[h]*Math.pow(t,h);return n};return{coef:C(c,g,-u,f),predict:b,rSquared:I(t,n,r,f,b)}},t.regressionPow=function(t,n,r){let e=0,o=0,l=0,u=0,f=0,a=0;U(t,n,r,(t,n)=>{const r=Math.log(t),i=Math.log(n);++a,e+=(r-e)/a,o+=(i-o)/a,l+=(r*i-l)/a,u+=(r*r-u)/a,f+=(n-f)/a});const i=S(e,o,l,u),s=t=>i[0]*Math.pow(t,i[1]);return i[0]=Math.exp(i[0]),{coef:i,predict:s,rSquared:I(t,n,r,f,s)}},t.regressionQuad=k,t.sampleCurve=function(t,n,r,e){r=r||25,e=Math.max(r,e||200);const o=n=>[n,t(n)],l=n[0],u=n[1],f=u-l,a=f/e,i=[o(l)],s=[];if(r===e){for(let t=1;t<e;++t)i.push(o(l+t/r*f));return i.push(o(u)),i}s.push(o(u));for(let t=r;--t>0;)s.push(o(l+t/r*f));let c=i[0],h=s[s.length-1];for(;h;){const t=o((c[0]+h[0])/2);t[0]-c[0]>=a&&Q(c,t,h)>K?s.push(t):(c=h,i.push(h),s.pop()),h=s[s.length-1]}return i},t.sampleLogNormal=v,t.sampleNormal=m,t.sampleUniform=q,t.setRandom=function(n){t.random=n},t}({}); | ||
//# sourceMappingURL=vega-statistics.min.js.map |
{ | ||
"name": "vega-statistics", | ||
"version": "1.7.8", | ||
"version": "1.7.9", | ||
"description": "Statistical routines and probability distributions.", | ||
@@ -14,18 +14,16 @@ "keywords": [ | ||
"main": "build/vega-statistics.js", | ||
"module": "index", | ||
"module": "build/vega-statistics.module.js", | ||
"unpkg": "build/vega-statistics.min.js", | ||
"repository": "vega/vega", | ||
"scripts": { | ||
"rollup": "rollup -g d3-array:d3 -f umd -n vega -o build/vega-statistics.js -- index.js", | ||
"prebuild": "rimraf build && mkdir build", | ||
"build": "yarn rollup", | ||
"postbuild": "terser build/vega-statistics.js -c -m -o build/vega-statistics.min.js", | ||
"pretest": "yarn prebuild && yarn rollup", | ||
"prebuild": "rimraf build", | ||
"build": "rollup -c", | ||
"pretest": "yarn build --config-test", | ||
"test": "tape 'test/**/*-test.js'", | ||
"prepublishOnly": "yarn test && yarn build", | ||
"postpublish": "git push && git push --tags" | ||
"prepublishOnly": "yarn test && yarn build" | ||
}, | ||
"dependencies": { | ||
"d3-array": "^2.7.0" | ||
"d3-array": "^2.7.1" | ||
}, | ||
"gitHead": "8d6793f4ca7eaaf2d22186764e9ce2dae687cf52" | ||
"gitHead": "4affcbedb9d14815dbb6d3b250ed231b54fc95c0" | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
201213
36
3252
1
Updatedd3-array@^2.7.1