d3-regression
Version:
Calculate statistical regressions for two-dimensional data
52 lines (42 loc) • 1.29 kB
JavaScript
// Adapted from vega-statistics by Jeffrey Heer
// License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE
// Source: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/packages/vega-statistics/src/regression/points.js
export function points(data, x, y, sort) {
data = data.filter((d, i) => {
let u = x(d, i), v = y(d, i);
return u != null && isFinite(u) && v != null && isFinite(v);
});
if (sort) {
data.sort((a, b) => x(a) - x(b));
}
const n = data.length,
X = new Float64Array(n),
Y = new Float64Array(n);
// extract values, calculate means
let ux = 0, uy = 0, xv, yv, d;
for (let i = 0; i < n; ) {
d = data[i];
X[i] = xv = +x(d, i, data);
Y[i] = yv = +y(d, i, data);
++i;
ux += (xv - ux) / i;
uy += (yv - uy) / i;
}
// mean center the data
for (let i = 0; i < n; ++i) {
X[i] -= ux;
Y[i] -= uy;
}
return [X, Y, ux, uy];
}
export function visitPoints(data, x, y, cb){
let iterations = 0;
for (let i = 0, n = data.length; i < n; i++) {
const d = data[i],
dx = +x(d, i, data),
dy = +y(d, i, data);
if (dx != null && isFinite(dx) && dy != null && isFinite(dy)) {
cb(dx, dy, iterations++);
}
}
}