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