UNPKG

als-statistics

Version:

A powerful and lightweight JavaScript library for descriptive statistics, regression, clustering, outlier detection, and noise analysis using a flexible table/column architecture.

116 lines (100 loc) 5.48 kB
const test = require('node:test'); const assert = require('node:assert'); const Statistics = require('../../index'); const CronbachAlpha = require('../../lib/table/instruments/cronbach-alpha'); test('CronbachAlpha: основной расчет', () => { const table = Statistics.newTable(); table.addColumn('Q1', [4, 5, 3, 4, 5]); table.addColumn('Q2', [3, 4, 2, 3, 4]); table.addColumn('Q3', [4, 4, 4, 4, 4]); // Постоянные значения (нулевая дисперсия) table.addColumn('Q4', [5, 3, 4, 5, 2]); const alpha = new CronbachAlpha(table); assert.ok(alpha.alpha <1); }); test('CronbachAlpha: расчет при удалении колонок', () => { const table = Statistics.newTable(); table.addColumn('Q1', [4, 5, 3, 4, 5]); table.addColumn('Q2', [3, 4, 2, 3, 4]); table.addColumn('Q3', [5, 3, 4, 5, 2]); const alpha = new CronbachAlpha(table); const perColumn = alpha.perColumn; for (let col in perColumn) { assert(perColumn[col] !== alpha.alpha) } }); test('CronbachAlpha: ошибка, если столбцов меньше 2', () => { const table = Statistics.newTable(); table.addColumn('Q1', [4, 5, 3, 4, 5]); assert.throws(() => new CronbachAlpha(table)); }); // Вспомогательная функция для "примерно равны" с учётом допустимой погрешности function approxEqual(actual, expected, tolerance = 1e-5) { const diff = Math.abs(actual - expected); assert.ok( diff <= tolerance, `Разница слишком велика.\nActual: ${actual}\nExpected: ${expected}\nDiff: ${diff}` ); } // --------------------------------------------------------- // 1) Все вопросы идентичны → alpha ~ 1.0 // --------------------------------------------------------- test('CronbachAlpha scenario 1: all questions identical', () => { // Допустим 3 вопроса, 4 респондента // Q1,Q2,Q3 у каждого респондента совпадают const table = Statistics.newTable(); table.addColumn('Q1', [1, 2, 3, 4]); table.addColumn('Q2', [1, 2, 3, 4]); table.addColumn('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 // --------------------------------------------------------- test('CronbachAlpha scenario 2: completely uncorrelated', () => { // Для простоты возьмём 2 вопроса, 4 респондента, "шумовые" данные, // подобранные так, чтобы итоговая корреляция была ~0. const table = Statistics.newTable(); // Q1: [1,2,3,4] // Q2: [4,3,2,1] (возможно, даже отриц.корреляция, но суммарно даёт alpha около 0) table.addColumn('Q1', [1, 2, 3, 4]); table.addColumn('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 // --------------------------------------------------------- test('CronbachAlpha scenario 3: moderate correlation', () => { // 3 вопроса, 4 респондента, // первые 2 вопроса хорошо коррелируют, а третий частично смещён const table = Statistics.newTable(); table.addColumn('Q1', [1, 2, 3, 4]); table.addColumn('Q2', [1, 2, 3, 4]); // Q1 и Q2 идентичны => высокая корреляция table.addColumn('Q3', [2, 1, 4, 3]); // менее связана const alphaObj = new CronbachAlpha(table); approxEqual(alphaObj.alpha, 0.89, 0.1); }); // --------------------------------------------------------- // 4) Есть константный столбец (нулевая дисперсия) → alpha ~ 0.75 // --------------------------------------------------------- test('CronbachAlpha scenario 4: one constant column', () => { // 3 вопроса, 4 респондента // Q1,Q2 коррелируют, Q3 постоянный const table = Statistics.newTable(); table.addColumn('Q1', [1, 2, 3, 4]); table.addColumn('Q2', [1, 2, 3, 4]); // полностью совпадает с Q1 table.addColumn('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); });