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