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
77 lines (65 loc) • 3.22 kB
JavaScript
import { it, describe } from 'node:test'
import assert from 'assert';
import { frequencies, recode, normalizeRules } from '../../lib/descriptive/frequencies.js';
describe('frequencies', () => {
// 1) Метки по точным значениям (пол)
const labelsGender = [
['male', 1],
['female', 2],
];
// 2) Метки по диапазонам (возрастные группы)
const labelsAge = [
['newBorn', 0, 1],
['child', 1, 12],
['young', 12, 18],
['grown', 18, 40],
['adult', 40, 60],
['old', 60, null] // 60+
];
it('Пример frequencies без меток', () => {
const result = frequencies({ values: [1, 2, 1, 3, 2, 2] })
assert.deepStrictEqual(result, { '1': 2, '2': 3, '3': 1 })
})
it('Пример frequencies с метками по значениям', () => {
const result = frequencies({ values: [1, 2, 1, 2, 2, 1], labels: labelsGender })
assert.deepStrictEqual(result, { male: 3, female: 3 })
})
it('Пример frequencies с метками по диапазонам', () => {
const results = frequencies({ values: [0.5, 1, 4, 12, 17, 18, 40, 85], labels: labelsAge })
const expected = { newBorn: 1, child: 2, young: 2, grown: 1, adult: 1, old: 1 }
assert.deepStrictEqual(results, expected)
// Пояснение: значение "1" попадает в 'child' (т.к. [1,12)), а 40 — в 'adult' ([40,60)).
// 0.5 -> newBorn, 85 -> old, 18 -> grown, 12 и 17 -> young.
// Ещё одно значение (зависит от набора) может уйти в _other, если не попало в диапазоны.
})
it('normalizeRules: некорректный формат правил → throw', () => {
assert.throws(() => normalizeRules([['only-one'], ['too', 'many', 'items', 'here']]), /Wrong rule format/);
});
it('recode: eq и range-правила работают', () => {
const values = [1, 2, 3, 'x', 'y'];
const out = recode({ values }, [
['low', 1, 3], // [1,3): 1 и 2 → 'low'; 3 останется 3
['X', 'x'], // точное равенство
]);
assert.deepEqual(out, ['low', 'low', 3, 'X', 'y']);
});
})
describe('Recode', () => {
it('Пример recode по точным значениям: [ [old, new], ... ]', () => {
const result = recode({ values: [1, 2, 2, 4] }, [[2, 1], [3, 2]])
const expected = [2, 3, 3, 4]
assert.deepStrictEqual(result, expected)
})
it('Пример recode по диапазонам: [ [new, min, max], ... ]', () => {
// Пусть хотим превратить возраст в коды 1..6:
const ageToCode = [
[1, 0, 1], // 0 <= age < 1
[2, 1, 12], // 1 <= age < 12
[3, 12, 18], // 12 <= age < 18
[4, 18, 40], // 18 <= age < 40
[5, 40, 60], // 40 <= age < 60
[6, 60, null] // 60+
];
assert.deepStrictEqual(recode({ values: [0.5, 1, 12, 18, 40, 60, 85] }, ageToCode), [1, 2, 3, 4, 5, 6, 6])
})
})