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

131 lines (112 loc) 5.42 kB
import { describe, it } from 'node:test'; import assert from 'node:assert'; import { CronbachAlpha } from '../../../lib/analyze/correlate/cronbach-alpha.js'; // Вспомогательная функция для "примерно равны" с учётом допустимой погрешности function approxEqual(actual, expected, tolerance = 1e-5) { const diff = Math.abs(actual - expected); assert.ok( diff <= tolerance, `Разница слишком велика.\nActual: ${actual}\nExpected: ${expected}\nDiff: ${diff}` ); } describe('Tests', () => { it('CronbachAlpha: основной расчет', () => { const table = { Q1: [4, 5, 3, 4, 5], Q2: [3, 4, 2, 3, 4], Q3: [4, 4, 4, 4, 4], // Постоянные значения (нулевая дисперсия) Q4: [5, 3, 4, 5, 2] } const alpha = new CronbachAlpha(table); // console.log(alpha) // assert.ok(alpha.alpha < 1); }); // --------------------------------------------------------- // 1) Все вопросы идентичны → alpha ~ 1.0 // --------------------------------------------------------- it('CronbachAlpha scenario 1: all questions identical', () => { // Допустим 3 вопроса, 4 респондента // Q1,Q2,Q3 у каждого респондента совпадают const table = { Q1: [1, 2, 3, 4], Q2: [1, 2, 3, 4], Q3: [1, 2, 3, 4], } // Ожидаем alpha ~ 1.0 const alphaObj = new CronbachAlpha(table); const alpha = alphaObj.alpha; approxEqual(alpha, 1.0, 1e-5); }); // --------------------------------------------------------- // 2) Полностью несвязанные вопросы → alpha ~ 0.0 // --------------------------------------------------------- it('CronbachAlpha scenario 2: completely uncorrelated', () => { // Для простоты возьмём 2 вопроса, 4 респондента, "шумовые" данные, // подобранные так, чтобы итоговая корреляция была ~0. const table = { Q1: [1, 2, 3, 4], Q2: [4, 3, 2, 1], }; const alphaObj = new CronbachAlpha(table); const alpha = alphaObj.alpha; // Для указанных данных, alpha может оказаться чуть <0, но // если хотим "почти 0", можно подобрать другие данные. // Для демонстрации - проверим, что оно <=0. // Или же подберите массивы, дающие alpha = ~0 точно. assert.ok(alpha < 0.01 && alpha > -0.01, `Ожидалось alpha ~ 0, получили alpha=${alpha}`); }); // --------------------------------------------------------- // 3) Умеренная согласованность → alpha ~ 0.6 // --------------------------------------------------------- it('CronbachAlpha scenario 3: moderate correlation', () => { // 3 вопроса, 4 респондента, // первые 2 вопроса хорошо коррелируют, а третий частично смещён const table = { Q1: [1, 2, 3, 4], Q2: [1, 2, 3, 4], // Q1 и Q2 идентичны => высокая корреляция Q3: [2, 1, 4, 3], // менее связана } const alphaObj = new CronbachAlpha(table); approxEqual(alphaObj.alpha, 0.89, 0.1); }); // --------------------------------------------------------- // 4) Есть константный столбец (нулевая дисперсия) → alpha ~ 0.75 // --------------------------------------------------------- it('CronbachAlpha scenario 4: one constant column', () => { // 3 вопроса, 4 респондента // Q1,Q2 коррелируют, Q3 постоянный const table = { Q1: [1, 2, 3, 4], Q2: [1, 2, 3, 4], // полностью совпадает с Q1 Q3: [5, 5, 5, 5], // константная колонка } const alphaObj = new CronbachAlpha(table); const alpha = alphaObj.alpha; // Допустим, мы заранее (в Python) вычислили, что alpha=0.75 (пример) // Проверяем с точностью ±0.0001 approxEqual(alpha, 0.75, 1e-4); }); it('CronbachAlpha: расчет при удалении колонок', () => { const table = { Q1: [4, 5, 3, 4, 5], Q2: [3, 4, 2, 3, 4], Q3: [5, 3, 4, 5, 2], } const alpha = new CronbachAlpha(table); const perColumn = alpha.ifItemsDeleted; // console.log(perColumn) // console.log({ perColumn }, alpha.alpha) for (let col in perColumn) { assert(perColumn[col] !== alpha.alpha) } }); it('CronbachAlpha: ошибка, если столбцов меньше 2', () => { assert.throws(() => new CronbachAlpha({ 'Q1': [4, 5, 3, 4, 5] })); }); it('CronbachAlpha: htmlTable генерируется', () => { const c = new CronbachAlpha({ X: [1, 2, 3, 4], Y: [1, 2, 3, 4], C: [1, 2, 4, 5] }); const html = c.htmlTable; assert.equal(typeof html, 'string'); assert.ok(html.toLowerCase().includes('cronbach')); }); })