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
JavaScript
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`);
});
}
});
}