jsCAT: JavaScript 的计算机适应测试
一个支持基于IRT的JavaScript计算机适应测试的库
安装
您可以从 npm 安装 jsCAT
npm i @bdelab/jscat
使用量
对于已有的jsCAT用户:为使您的应用程序与更新的jsCAT版本相兼容,您需要以以下方式通过刺激:
// import jsCAT
import { Cat } from '@bdelab/jscat';
// create a Cat object with MLE estimator
const cat1 = new CAT({method: 'MLE', itemSelect: 'MFI', nStartItems: 0, theta: 0, minTheta: -6, maxTheta: 6})
// create a Cat object with EAP estimator with normal distribution
const cat2 = new CAT({method: 'eap', itemSelect: 'MFI', nStartItems: 0, theta: 0, minTheta: -6, maxTheta: 6, priorDist: 'norm', priorPar: [0, 1]})
// create a Cat object with EAP estimator with unirform distribution
const cat3 = new CAT({method: 'eap', itemSelect: 'MFI', nStartItems: 0, theta: 0, minTheta: -6, maxTheta: 6, priorDist: 'unif', priorPar: [-4, 4]})
// option 1 to input stimuli:
const zeta = {[{discrimination: 1, difficulty: 0, guessing: 0, slipping: 1}, {discrimination: 1, difficulty: 0.5, guessing: 0, slipping: 1}]}
// option 2 to input stimuli:
const zeta = {[{a: 1, b: 0, c: 0, d: 1}, {a: 1, b: 0.5, c: 0, d: 1}]}
const answer = {[1, 0]}
// update the ability estimate by adding test items
cat.updateAbilityEstimate(zeta, answer);
const currentTheta = cat1.theta;
const currentSeMeasurement = cat1.seMeasurement;
const numItems = cat1.nItems;
// find the next available item from an input array of stimuli based on a selection method
> **Note:** For existing jsCAT users: To make your applications compatible with the updated jsCAT version, you will need to pass the stimuli in the following way:
const stimuli = [{ discrimination: 1, difficulty: -2, guessing: 0, slipping: 1, item = "item1" },{ discrimination: 1, difficulty: 3, guessing: 0, slipping: 1, item = "item2" }];
const nextItem = cat1.findNextItem(stimuli, 'MFI');
验证
验证 theta 估计和 theta 标准错误
参考软件:米尔特 (Chalmers, 2012)

微额供资机构算法验证
参考软件: catR (Magis等, 2017)

克劳德用法指南
这个 Clowder 类是管理多重的强大工具 Cat 在适应性的测试情景中处理刺激性公司。 本指南概述了整合情况 Clowder 输入应用程序,并附上关键特性的示例和解释.
单键更改 Cat 改为 Clowder
为什么用克洛德?
- 多种CAT支助: 管理多个
Cat同时出现实例. - 中央公司管理: 在整个"猫"(Cats)中处理已验证和未验证的物品.
- 高级审判管理:动态地更新"猫"并基于可配置规则取回刺激.
- 及早停止机制:通过整合条件自动停止试验来优化测试.
向克洛德过渡
1. 单人替代 Cat 使用量
单身 Cat 示例
const cat = new Cat({ method: 'MLE', theta: 0.5 });
const nextItem = cat.findNextItem(stimuli);
克劳德等价:
const clowder = new Clowder({
cats: { cat1: { method: 'MLE', theta: 0.5 } },
corpus: stimuli,
});
const nextItem = clowder.updateCatAndGetNextItem({
catToSelect: 'cat1',
});
2. 使用多Zeta刺激的Corpus
这个 Clowder 实体支持多泽塔刺激,允许每个刺激定义多猫的参数. 使用下列工具编写文书:
填充默认 Zeta 参数 :
import { fillZetaDefaults } from './corpus';
const filledStimuli = stimuli.map((stim) => fillZetaDefaults(stim));
这是什么 fillZetaDefaults? 吗?
职能 fillZetaDefaults 确保每个刺激物都有Zeta参数。 如果缺少任何参数,它会以默认的Zeta值填充.
默认值为:
export const defaultZeta = (desiredFormat: 'symbolic' | 'semantic' = 'symbolic'): Zeta => {
const defaultZeta: Zeta = {
a: 1,
b: 0,
c: 0,
d: 1,
};
return convertZeta(defaultZeta, desiredFormat);
};
- 如果未指定想要的Format, 它默认为“ symbolic ” .
- 这确保了不同刺激之间的一致性,并避免了遗漏Zeta参数的错误.
- 您可以通过“ 语义” 来将默认 Zeta 值转换为不同的表达式 .
验证公司:
import { checkNoDuplicateCatNames } from './corpus';
checkNoDuplicateCatNames(corpus);
特定猫的过滤刺激 :
import { filterItemsByCatParameterAvailability } from './corpus';
const { available, missing } = filterItemsByCatParameterAvailability(corpus, 'cat1');
3. 添加早期停止
整合早期停止机制以优化测试过程.
示例:在 N 项目后停止
import { StopAfterNItems } from './stopping';
const earlyStopping = new StopAfterNItems({
requiredItems: { cat1: 2 },
});
const clowder = new Clowder({
cats: { cat1: { method: 'MLE', theta: 0.5 } },
corpus: stimuli,
earlyStopping: earlyStopping,
});
提前停止标准组合
为了澄清可供早期停用的现有组合, 以下是您可以使用的选项的细分:
1. 逻辑操作
使用下列逻辑操作之一,可以合并多个停止标准:
and: 需要满足所有条件才能触发早停.or: 任何一项条件的满足都会引发早停.only:只考虑特定条件(需要指定评价的猫).
2. 停止标准类别
您可以配置不同类型的停止标准:
StopAfterNItems: 在指定项目数后停止进程.StopOnSEMeasurementPlateau: 如果计量的标准误差(SE)对于特定数量的项目保持稳定(在定义的可容忍度范围内),则停止.StopIfSEMeasurementBelowThreshold:如果SE测量值低于设定阈值,则停止.
组合如何运作
可以将这些标准与不同的逻辑操作相混合并匹配,给你一系列的配置,以便及早停止. 例如:
- 使用
and两者StopAfterNItems财务报告和审定财务报表StopIfSEMeasurementBelowThreshold意味着只有在两个条件都得到满足的情况下才会停止. - 使用
or与StopOnSEMeasurementPlateau财务报告和审定财务报表StopAfterNItems如果符合任一条件,则允许提前停止.
压缩示例
以下是一个完整的例子,说明如何配置和使用 Clowder数字 :
import { Clowder } from './clowder';
import { createMultiZetaStimulus, createZetaCatMap } from './utils';
import { StopAfterNItems } from './stopping';
// Define the Cats
const catConfigs = {
cat1: { method: 'MLE', theta: 0.5 }, // Cat1 uses Maximum Likelihood Estimation
cat2: { method: 'EAP', theta: -1.0 }, // Cat2 uses Expected A Posteriori
};
// Define the corpus
const corpus = [
createMultiZetaStimulus('item1', [
createZetaCatMap(['cat1'], { a: 1, b: 0.5, c: 0.2, d: 0.8 }),
createZetaCatMap(['cat2'], { a: 2, b: 0.7, c: 0.3, d: 0.9 }),
]),
createMultiZetaStimulus('item2', [createZetaCatMap(['cat1'], { a: 1.5, b: 0.4, c: 0.1, d: 0.85 })]),
createMultiZetaStimulus('item3', [createZetaCatMap(['cat2'], { a: 2.5, b: 0.6, c: 0.25, d: 0.95 })]),
createMultiZetaStimulus('item4', []), // Unvalidated item
];
// Optional: Add an early stopping strategy
const earlyStopping = new StopAfterNItems({
requiredItems: { cat1: 2, cat2: 2 },
});
// Initialize the Clowder
const clowder = new Clowder({
cats: catConfigs,
corpus: corpus,
earlyStopping: earlyStopping,
});
// Running Trials
const nextItem = clowder.updateCatAndGetNextItem({
catToSelect: 'cat1',
catsToUpdate: ['cat1', 'cat2'], // Update responses for both Cats
items: [clowder.corpus[0]], // Previously seen item
answers: [1], // Response for the previously seen item
additionalItemsToRemove: [clowder.corpus[3]], // Optional: Remove items without updating ability estimates
});
console.log('Next item to present:', nextItem);
// Check stopping condition
if (clowder.earlyStopping?.earlyStop) {
console.log('Early stopping triggered:', clowder.stoppingReason);
}
4. 管理物品搬运 additionalItemsToRemove
这个 additionalItemsToRemove 参数允许您在不更新能力估计的情况下删除剩余实体中的物品。 这有助于排除不应再次提出的项目(例如,由于其他原因被跳过、标出或排除在外的项目).
关键特征 :
- 不影响能力估计: 项目在
additionalItemsToRemove但不帮助更新 Cat 的能力. - 不添加到已看到的项目: 这些项目没有在
seenItems阵列. - 累计清除: 多次通话
updateCatAndGetNextItem与additionalItemsToRemove将累积删除项目.
示例使用法:
// Remove items that were skipped or flagged without updating ability estimates
const nextItem = clowder.updateCatAndGetNextItem({
catToSelect: 'cat1',
catsToUpdate: ['cat1'],
items: [clowder.corpus[0]], // Item that was presented and answered
answers: [1],
additionalItemsToRemove: [clowder.corpus[2], clowder.corpus[3]], // Items to exclude without updating ability
});
// After this call:
// - clowder.corpus[0] is in seenItems and was used to update cat1's ability
// - clowder.corpus[2] and clowder.corpus[3] are removed from remainingItems but NOT in seenItems
// - Only clowder.corpus[1] and any other items remain available for selection
通过整合 Clowder,你的应用可以高效地管理适应性的测试情景,并进行强力的试验和刺激处理,多CAT配置,以及停止条件以确保最佳性能.
参考资料
-
Chalmers, R. P. (2012年) (英语). mirt:R环境的多维项响应理论包. 统计软件杂志.
-
马吉斯, D., & Barrada, J. R. (2017). 计算机化适应性测试与R:最近更新的包 catR. 统计软件学报, 76, 1-19.
-
Lucas Duailibe, irt-js, (2019), GitHub 寄存器, https://github.com/geekie/irt-js (英语)
许可证
jsCAT 分发于 ISC 许可证。 。 。 .
贡献者
jsCAT由Wanjing Anya Ma, Emily Judith Arteaga Garcia, Jason D. Yetman和Adam Richie-Halford提供.
引用
若您在网络应用中使用 jsCAT , 请引用 : 马, W. A., Richie-Halford, A., Burkhardt, A. K., 卡诺普卡, K., C., C., Domingue, B. W., & Yeatman, J. D. (2025). 注重成果的年度报告-CAT:利用计算机化适应性测试快速在线评估阅读能力。 行为研究方法, 57(1), 1-17. https://doi.org/10.3758/s13428-024-02578-y (中文(简体) )
@article{ma2025roar, 标题: " 通过计算机化的适应测试快速在线评估阅读能力 " , 作者:马、万京·安亚和里奇-哈尔福德、亚当和布尔克哈特、艾米克和卡诺普卡、克林特和乔、克莱门汀和多明格、本杰明·W和叶特曼、杰森·D}, 《行为研究方法》, volume57}, 号码qq1], -17页), {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我还没说完呢 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}, 出版社 \fn微软雅黑Springer} {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢