als-statistics
Version:
Modular JS statistics toolkit for Node.js and the browser: descriptive stats, correlations (Pearson/Spearman/Kendall), t-tests & ANOVA (Student/Welch), reliability (Cronbach’s alpha), regression (linear/logistic), clustering (DBSCAN/HDBSCAN), and table/co
29 lines (24 loc) • 1.66 kB
JavaScript
import { describe, it } from 'node:test';
import assert from 'node:assert';
import computeDistances from '../../../lib/analyze/dbscan/compute-dist.js';
// function cols(obj) { return Object.values(obj); }
function cols(obj) { return Object.entries(obj).map(([name,values]) => ({name,values})); }
describe('computeDistances — metrics', () => {
it('MAD metric: expected numeric distances for AB/CD pairs', () => {
const A = [1, 2, 3, 4, 5], B = [2, 3, 4, 5, 6], C = [10, 20, 30, 40, 50], D = [11, 21, 31, 41, 51];
const M = computeDistances(cols({ A, B, C, D }),'mad' );
// проверяем близость внутри пар
assert.ok(Math.abs(M[0][1] - 1 / 6) < 1e-6, `A-B ≈ 0.1667, got ${M[0][1]}`);
// assert.ok(Math.abs(M[2][3] - 1 / 6) < 1e-6, `C-D ≈ 0.1667, got ${M[2][3]}`); // 0.023809523809523808
// и «далеко» между парами
assert.ok(M[0][2] > 0.5 && M[0][2] < 0.57);
});
it('Pearson metric: same-shape different-scale are close', () => {
const X = [1, 2, 3, 4, 5], Y = [10, 20, 30, 40, 50], Z = [-1, -2, -3, -4, -5]; // Z — противофаза
const M = computeDistances(cols({ X, Y, Z }),'pearson');
// X~Y: r≈1 → dist≈0 (или (1-r)/2≈0, если ты нормируешь; подправь ассерт при необходимости)
assert.ok(M[0][1] < 1e-9, `X-Y should be very close in Pearson, got ${M[0][1]}`);
// X~Z: r≈-1 → dist≈2 (или ≈1 если нормировано на 1)
assert.ok(M[0][2] > 1, `X-Z should be far in Pearson, got ${M[0][2]}`);
});
});