UNPKG

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

59 lines (51 loc) 3.08 kB
import { EPS } from "../settings.js"; import { Stats } from "../../lib/index.js"; import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { nearlyEqual, hasDataOrSkip, splitGroups, toRecordFromArray } from '../helpers.js' export function testDescriptive(g) { // --- Descriptive stats --- describe('Descriptives (Stats)', () => { const cols = ['X', 'Y', 'score', 'before', 'after']; for (const name of cols) { it(`matches basic moments for ${name}`, () => { const arr = g.data[name]; const gd = g.stats[name]; nearlyEqual(Stats.mean({ values: arr }), gd.mean, EPS.stat, `${name}.mean`); nearlyEqual(Stats.median({ values: arr }), gd.median, EPS.stat, `${name}.median`); // population/sample variance & std nearlyEqual(Stats.variance({ values: arr }), gd.variance, EPS.stat, `${name}.variance(pop)`); nearlyEqual(Stats.varianceSample({ values: arr }), gd.variance_sample, EPS.stat, `${name}.variance(sample)`); nearlyEqual(Stats.stdDev({ values: arr }), gd.std, EPS.stat, `${name}.std(pop)`); nearlyEqual(Stats.stdDevSample({ values: arr }), gd.std_sample, EPS.stat, `${name}.std(sample)`); // quantiles nearlyEqual(Stats.q1({ values: arr }), gd.q1, EPS.stat, `${name}.q1`); nearlyEqual(Stats.q3({ values: arr }), gd.q3, EPS.stat, `${name}.q3`); nearlyEqual(Stats.p10({ values: arr }), gd.p10, EPS.stat, `${name}.p10`); nearlyEqual(Stats.p90({ values: arr }), gd.p90, EPS.stat, `${name}.p90`); nearlyEqual(Stats.iqr({ values: arr }), gd.iqr, EPS.stat, `${name}.iqr`); nearlyEqual(Stats.mad({ values: arr }), gd.mad, 5e-6, `${name}.mad`); // min/max/range nearlyEqual(Stats.min({ values: arr }), gd.min, EPS.stat, `${name}.min`); nearlyEqual(Stats.max({ values: arr }), gd.max, EPS.stat, `${name}.max`); nearlyEqual(Stats.range({ values: arr }), gd.range, EPS.stat, `${name}.range`); }); it(`flatness (GM/AM) for ${name}`, () => { const arr = g.data[name]; const gd = g.stats[name]; const expected = gd.geometricMean / gd.mean; const actual = Stats.flatness({ values: arr }); // console.log(actual - expected) nearlyEqual(actual, expected, EPS.flatness, `${name}.flatness`); }); it(`z-scores ~ N(0,1) summary for ${name}`, () => { const arr = g.data[name]; const summary = g.stats[name].zscores_summary; const zs = Stats.zScores({ values: arr },true); const meanZ = Stats.mean({ values: zs }); const stdZ = Stats.stdDevSample({ values: zs }); nearlyEqual(meanZ, summary.mean, EPS.z, `${name}.zscores_summary.mean`); nearlyEqual(stdZ, summary.std, EPS.z, `${name}.zscores_summary.std`); }); } }); }