learngraph 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/routes/analytics.js +288 -0
- package/dist/cjs/api/routes/analytics.js.map +1 -0
- package/dist/cjs/api/routes/assessments.js +269 -0
- package/dist/cjs/api/routes/assessments.js.map +1 -0
- package/dist/cjs/api/routes/curriculum.js +345 -0
- package/dist/cjs/api/routes/curriculum.js.map +1 -0
- package/dist/cjs/api/routes/edges.js +162 -0
- package/dist/cjs/api/routes/edges.js.map +1 -0
- package/dist/cjs/api/routes/explore.js +224 -0
- package/dist/cjs/api/routes/explore.js.map +1 -0
- package/dist/cjs/api/routes/learners.js +324 -0
- package/dist/cjs/api/routes/learners.js.map +1 -0
- package/dist/cjs/api/routes/me.js +404 -0
- package/dist/cjs/api/routes/me.js.map +1 -0
- package/dist/cjs/api/routes/skills.js +319 -0
- package/dist/cjs/api/routes/skills.js.map +1 -0
- package/dist/cjs/api/server.js +185 -0
- package/dist/cjs/api/server.js.map +1 -0
- package/dist/cjs/api/types.js +10 -0
- package/dist/cjs/api/types.js.map +1 -0
- package/dist/cjs/assessment/adaptive.js +390 -0
- package/dist/cjs/assessment/adaptive.js.map +1 -0
- package/dist/cjs/assessment/bkt.js +362 -0
- package/dist/cjs/assessment/bkt.js.map +1 -0
- package/dist/cjs/assessment/index.js +54 -0
- package/dist/cjs/assessment/index.js.map +1 -0
- package/dist/cjs/assessment/irt.js +420 -0
- package/dist/cjs/assessment/irt.js.map +1 -0
- package/dist/cjs/assessment/mastery-engine.js +411 -0
- package/dist/cjs/assessment/mastery-engine.js.map +1 -0
- package/dist/cjs/components/LearningPathView.js +320 -0
- package/dist/cjs/components/LearningPathView.js.map +1 -0
- package/dist/cjs/components/ProgressDashboard.js +308 -0
- package/dist/cjs/components/ProgressDashboard.js.map +1 -0
- package/dist/cjs/components/SkillCard.js +264 -0
- package/dist/cjs/components/SkillCard.js.map +1 -0
- package/dist/cjs/components/SkillExplorer.js +401 -0
- package/dist/cjs/components/SkillExplorer.js.map +1 -0
- package/dist/cjs/components/SkillGraph.js +435 -0
- package/dist/cjs/components/SkillGraph.js.map +1 -0
- package/dist/cjs/components/hooks.js +510 -0
- package/dist/cjs/components/hooks.js.map +1 -0
- package/dist/cjs/components/index.js +77 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/components/types.js +34 -0
- package/dist/cjs/components/types.js.map +1 -0
- package/dist/cjs/index.js +35 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/llm/adapters/anthropic.js +91 -3
- package/dist/cjs/llm/adapters/anthropic.js.map +1 -1
- package/dist/cjs/llm/adapters/gemini.js +101 -8
- package/dist/cjs/llm/adapters/gemini.js.map +1 -1
- package/dist/cjs/llm/adapters/index.js +42 -1
- package/dist/cjs/llm/adapters/index.js.map +1 -1
- package/dist/cjs/llm/adapters/ollama.js +120 -3
- package/dist/cjs/llm/adapters/ollama.js.map +1 -1
- package/dist/cjs/llm/adapters/openai.js +108 -2
- package/dist/cjs/llm/adapters/openai.js.map +1 -1
- package/dist/cjs/mcp/cli.js +302 -0
- package/dist/cjs/mcp/cli.js.map +1 -0
- package/dist/cjs/mcp/index.js +79 -0
- package/dist/cjs/mcp/index.js.map +1 -0
- package/dist/cjs/mcp/prompts.js +425 -0
- package/dist/cjs/mcp/prompts.js.map +1 -0
- package/dist/cjs/mcp/resources.js +371 -0
- package/dist/cjs/mcp/resources.js.map +1 -0
- package/dist/cjs/mcp/server.js +410 -0
- package/dist/cjs/mcp/server.js.map +1 -0
- package/dist/cjs/mcp/tools.js +612 -0
- package/dist/cjs/mcp/tools.js.map +1 -0
- package/dist/cjs/mcp/types.js +10 -0
- package/dist/cjs/mcp/types.js.map +1 -0
- package/dist/cjs/types/assessment.js +46 -0
- package/dist/cjs/types/assessment.js.map +1 -0
- package/dist/cjs/types/bloom.js +12 -1
- package/dist/cjs/types/bloom.js.map +1 -1
- package/dist/cjs/types/index.js +7 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/esm/api/routes/analytics.js +285 -0
- package/dist/esm/api/routes/analytics.js.map +1 -0
- package/dist/esm/api/routes/assessments.js +266 -0
- package/dist/esm/api/routes/assessments.js.map +1 -0
- package/dist/esm/api/routes/curriculum.js +342 -0
- package/dist/esm/api/routes/curriculum.js.map +1 -0
- package/dist/esm/api/routes/edges.js +159 -0
- package/dist/esm/api/routes/edges.js.map +1 -0
- package/dist/esm/api/routes/explore.js +221 -0
- package/dist/esm/api/routes/explore.js.map +1 -0
- package/dist/esm/api/routes/learners.js +321 -0
- package/dist/esm/api/routes/learners.js.map +1 -0
- package/dist/esm/api/routes/me.js +401 -0
- package/dist/esm/api/routes/me.js.map +1 -0
- package/dist/esm/api/routes/skills.js +316 -0
- package/dist/esm/api/routes/skills.js.map +1 -0
- package/dist/esm/api/server.js +179 -0
- package/dist/esm/api/server.js.map +1 -0
- package/dist/esm/api/types.js +9 -0
- package/dist/esm/api/types.js.map +1 -0
- package/dist/esm/assessment/adaptive.js +384 -0
- package/dist/esm/assessment/adaptive.js.map +1 -0
- package/dist/esm/assessment/bkt.js +354 -0
- package/dist/esm/assessment/bkt.js.map +1 -0
- package/dist/esm/assessment/index.js +21 -0
- package/dist/esm/assessment/index.js.map +1 -0
- package/dist/esm/assessment/irt.js +406 -0
- package/dist/esm/assessment/irt.js.map +1 -0
- package/dist/esm/assessment/mastery-engine.js +406 -0
- package/dist/esm/assessment/mastery-engine.js.map +1 -0
- package/dist/esm/components/LearningPathView.js +316 -0
- package/dist/esm/components/LearningPathView.js.map +1 -0
- package/dist/esm/components/ProgressDashboard.js +304 -0
- package/dist/esm/components/ProgressDashboard.js.map +1 -0
- package/dist/esm/components/SkillCard.js +260 -0
- package/dist/esm/components/SkillCard.js.map +1 -0
- package/dist/esm/components/SkillExplorer.js +397 -0
- package/dist/esm/components/SkillExplorer.js.map +1 -0
- package/dist/esm/components/SkillGraph.js +398 -0
- package/dist/esm/components/SkillGraph.js.map +1 -0
- package/dist/esm/components/hooks.js +502 -0
- package/dist/esm/components/hooks.js.map +1 -0
- package/dist/esm/components/index.js +61 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/components/types.js +31 -0
- package/dist/esm/components/types.js.map +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/llm/adapters/anthropic.js +88 -2
- package/dist/esm/llm/adapters/anthropic.js.map +1 -1
- package/dist/esm/llm/adapters/gemini.js +98 -7
- package/dist/esm/llm/adapters/gemini.js.map +1 -1
- package/dist/esm/llm/adapters/index.js +15 -4
- package/dist/esm/llm/adapters/index.js.map +1 -1
- package/dist/esm/llm/adapters/ollama.js +117 -2
- package/dist/esm/llm/adapters/ollama.js.map +1 -1
- package/dist/esm/llm/adapters/openai.js +105 -1
- package/dist/esm/llm/adapters/openai.js.map +1 -1
- package/dist/esm/mcp/cli.js +267 -0
- package/dist/esm/mcp/cli.js.map +1 -0
- package/dist/esm/mcp/index.js +39 -0
- package/dist/esm/mcp/index.js.map +1 -0
- package/dist/esm/mcp/prompts.js +419 -0
- package/dist/esm/mcp/prompts.js.map +1 -0
- package/dist/esm/mcp/resources.js +359 -0
- package/dist/esm/mcp/resources.js.map +1 -0
- package/dist/esm/mcp/server.js +372 -0
- package/dist/esm/mcp/server.js.map +1 -0
- package/dist/esm/mcp/tools.js +598 -0
- package/dist/esm/mcp/tools.js.map +1 -0
- package/dist/esm/mcp/types.js +9 -0
- package/dist/esm/mcp/types.js.map +1 -0
- package/dist/esm/types/assessment.js +40 -0
- package/dist/esm/types/assessment.js.map +1 -0
- package/dist/esm/types/bloom.js +11 -0
- package/dist/esm/types/bloom.js.map +1 -1
- package/dist/esm/types/index.js +2 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/types/api/routes/analytics.d.ts +14 -0
- package/dist/types/api/routes/analytics.d.ts.map +1 -0
- package/dist/types/api/routes/assessments.d.ts +14 -0
- package/dist/types/api/routes/assessments.d.ts.map +1 -0
- package/dist/types/api/routes/curriculum.d.ts +14 -0
- package/dist/types/api/routes/curriculum.d.ts.map +1 -0
- package/dist/types/api/routes/edges.d.ts +14 -0
- package/dist/types/api/routes/edges.d.ts.map +1 -0
- package/dist/types/api/routes/explore.d.ts +14 -0
- package/dist/types/api/routes/explore.d.ts.map +1 -0
- package/dist/types/api/routes/learners.d.ts +14 -0
- package/dist/types/api/routes/learners.d.ts.map +1 -0
- package/dist/types/api/routes/me.d.ts +14 -0
- package/dist/types/api/routes/me.d.ts.map +1 -0
- package/dist/types/api/routes/skills.d.ts +14 -0
- package/dist/types/api/routes/skills.d.ts.map +1 -0
- package/dist/types/api/server.d.ts +147 -0
- package/dist/types/api/server.d.ts.map +1 -0
- package/dist/types/api/types.d.ts +443 -0
- package/dist/types/api/types.d.ts.map +1 -0
- package/dist/types/assessment/adaptive.d.ts +155 -0
- package/dist/types/assessment/adaptive.d.ts.map +1 -0
- package/dist/types/assessment/bkt.d.ts +185 -0
- package/dist/types/assessment/bkt.d.ts.map +1 -0
- package/dist/types/assessment/index.d.ts +18 -0
- package/dist/types/assessment/index.d.ts.map +1 -0
- package/dist/types/assessment/irt.d.ts +159 -0
- package/dist/types/assessment/irt.d.ts.map +1 -0
- package/dist/types/assessment/mastery-engine.d.ts +178 -0
- package/dist/types/assessment/mastery-engine.d.ts.map +1 -0
- package/dist/types/components/LearningPathView.d.ts +40 -0
- package/dist/types/components/LearningPathView.d.ts.map +1 -0
- package/dist/types/components/ProgressDashboard.d.ts +49 -0
- package/dist/types/components/ProgressDashboard.d.ts.map +1 -0
- package/dist/types/components/SkillCard.d.ts +34 -0
- package/dist/types/components/SkillCard.d.ts.map +1 -0
- package/dist/types/components/SkillExplorer.d.ts +39 -0
- package/dist/types/components/SkillExplorer.d.ts.map +1 -0
- package/dist/types/components/SkillGraph.d.ts +38 -0
- package/dist/types/components/SkillGraph.d.ts.map +1 -0
- package/dist/types/components/hooks.d.ts +187 -0
- package/dist/types/components/hooks.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +59 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/components/types.d.ts +410 -0
- package/dist/types/components/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/llm/adapters/anthropic.d.ts +84 -1
- package/dist/types/llm/adapters/anthropic.d.ts.map +1 -1
- package/dist/types/llm/adapters/gemini.d.ts +93 -6
- package/dist/types/llm/adapters/gemini.d.ts.map +1 -1
- package/dist/types/llm/adapters/index.d.ts +13 -4
- package/dist/types/llm/adapters/index.d.ts.map +1 -1
- package/dist/types/llm/adapters/ollama.d.ts +126 -1
- package/dist/types/llm/adapters/ollama.d.ts.map +1 -1
- package/dist/types/llm/adapters/openai.d.ts +104 -1
- package/dist/types/llm/adapters/openai.d.ts.map +1 -1
- package/dist/types/mcp/cli.d.ts +15 -0
- package/dist/types/mcp/cli.d.ts.map +1 -0
- package/dist/types/mcp/index.d.ts +32 -0
- package/dist/types/mcp/index.d.ts.map +1 -0
- package/dist/types/mcp/prompts.d.ts +27 -0
- package/dist/types/mcp/prompts.d.ts.map +1 -0
- package/dist/types/mcp/resources.d.ts +59 -0
- package/dist/types/mcp/resources.d.ts.map +1 -0
- package/dist/types/mcp/server.d.ts +136 -0
- package/dist/types/mcp/server.d.ts.map +1 -0
- package/dist/types/mcp/tools.d.ts +344 -0
- package/dist/types/mcp/tools.d.ts.map +1 -0
- package/dist/types/mcp/types.d.ts +137 -0
- package/dist/types/mcp/types.d.ts.map +1 -0
- package/dist/types/types/assessment.d.ts +512 -0
- package/dist/types/types/assessment.d.ts.map +1 -0
- package/dist/types/types/bloom.d.ts +4 -0
- package/dist/types/types/bloom.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +3 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +48 -3
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Item Response Theory (IRT)
|
|
4
|
+
*
|
|
5
|
+
* Implements the 1PL (Rasch), 2PL, and 3PL IRT models for:
|
|
6
|
+
* - Calculating probability of correct response
|
|
7
|
+
* - Estimating learner ability (theta)
|
|
8
|
+
* - Calculating item information
|
|
9
|
+
* - Adaptive item selection
|
|
10
|
+
*
|
|
11
|
+
* @see Lord, F.M. (1980). Applications of item response theory to practical testing problems.
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.IRTEstimator = exports.IRT_CONFIG_DEFAULTS = void 0;
|
|
17
|
+
exports.calculateProbability = calculateProbability;
|
|
18
|
+
exports.calculateProbabilityDerivative = calculateProbabilityDerivative;
|
|
19
|
+
exports.calculateInformation = calculateInformation;
|
|
20
|
+
exports.calculateTestInformation = calculateTestInformation;
|
|
21
|
+
exports.calculateStandardError = calculateStandardError;
|
|
22
|
+
exports.selectNextItemMFI = selectNextItemMFI;
|
|
23
|
+
exports.abilityToPercentile = abilityToPercentile;
|
|
24
|
+
exports.abilityToGradeLevel = abilityToGradeLevel;
|
|
25
|
+
exports.createIRTEstimator = createIRTEstimator;
|
|
26
|
+
exports.estimateAbility = estimateAbility;
|
|
27
|
+
/**
|
|
28
|
+
* Default IRT configuration
|
|
29
|
+
*/
|
|
30
|
+
exports.IRT_CONFIG_DEFAULTS = {
|
|
31
|
+
model: '2PL',
|
|
32
|
+
abilityPrior: { mean: 0, sd: 1 },
|
|
33
|
+
maxIterations: 100,
|
|
34
|
+
convergenceThreshold: 0.001,
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Calculate probability of correct response using IRT model
|
|
38
|
+
*
|
|
39
|
+
* 1PL (Rasch): P(θ) = 1 / (1 + exp(-(θ - b)))
|
|
40
|
+
* 2PL: P(θ) = 1 / (1 + exp(-a(θ - b)))
|
|
41
|
+
* 3PL: P(θ) = c + (1 - c) / (1 + exp(-a(θ - b)))
|
|
42
|
+
*
|
|
43
|
+
* @param theta - Ability parameter
|
|
44
|
+
* @param params - Item parameters
|
|
45
|
+
* @returns Probability of correct response (0-1)
|
|
46
|
+
*/
|
|
47
|
+
function calculateProbability(theta, params) {
|
|
48
|
+
const { difficulty: b, model } = params;
|
|
49
|
+
const a = params.discrimination ?? 1.0;
|
|
50
|
+
const c = params.guessing ?? 0.0;
|
|
51
|
+
// Logistic function
|
|
52
|
+
const z = a * (theta - b);
|
|
53
|
+
const pStar = 1 / (1 + Math.exp(-z));
|
|
54
|
+
switch (model) {
|
|
55
|
+
case '1PL':
|
|
56
|
+
return 1 / (1 + Math.exp(-(theta - b)));
|
|
57
|
+
case '2PL':
|
|
58
|
+
return pStar;
|
|
59
|
+
case '3PL':
|
|
60
|
+
return c + (1 - c) * pStar;
|
|
61
|
+
default:
|
|
62
|
+
return pStar;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Calculate the first derivative of P with respect to theta
|
|
67
|
+
* Used in ability estimation
|
|
68
|
+
*/
|
|
69
|
+
function calculateProbabilityDerivative(theta, params) {
|
|
70
|
+
const { difficulty: b, model } = params;
|
|
71
|
+
const a = params.discrimination ?? 1.0;
|
|
72
|
+
const c = params.guessing ?? 0.0;
|
|
73
|
+
const z = a * (theta - b);
|
|
74
|
+
const expNegZ = Math.exp(-z);
|
|
75
|
+
const pStar = 1 / (1 + expNegZ);
|
|
76
|
+
switch (model) {
|
|
77
|
+
case '1PL':
|
|
78
|
+
return pStar * (1 - pStar);
|
|
79
|
+
case '2PL':
|
|
80
|
+
return a * pStar * (1 - pStar);
|
|
81
|
+
case '3PL':
|
|
82
|
+
return a * (1 - c) * pStar * (1 - pStar);
|
|
83
|
+
default:
|
|
84
|
+
return a * pStar * (1 - pStar);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Calculate Fisher Information for an item at a given ability
|
|
89
|
+
*
|
|
90
|
+
* Information represents how precisely the item measures ability at theta.
|
|
91
|
+
* Higher information = more useful for measuring that ability level.
|
|
92
|
+
*
|
|
93
|
+
* I(θ) = [P'(θ)]² / [P(θ)(1-P(θ))]
|
|
94
|
+
*/
|
|
95
|
+
function calculateInformation(theta, params) {
|
|
96
|
+
const p = calculateProbability(theta, params);
|
|
97
|
+
const pPrime = calculateProbabilityDerivative(theta, params);
|
|
98
|
+
// Avoid division by zero
|
|
99
|
+
const denominator = p * (1 - p);
|
|
100
|
+
if (denominator < 1e-10) {
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
return (pPrime * pPrime) / denominator;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Calculate test information (sum of item information)
|
|
107
|
+
*/
|
|
108
|
+
function calculateTestInformation(theta, items) {
|
|
109
|
+
return items.reduce((sum, item) => sum + calculateInformation(theta, item), 0);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Calculate standard error of ability estimate
|
|
113
|
+
* SE(θ) = 1 / √I(θ)
|
|
114
|
+
*/
|
|
115
|
+
function calculateStandardError(theta, items) {
|
|
116
|
+
const information = calculateTestInformation(theta, items);
|
|
117
|
+
if (information < 1e-10) {
|
|
118
|
+
return 10; // Large SE when no information
|
|
119
|
+
}
|
|
120
|
+
return 1 / Math.sqrt(information);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* IRT Ability Estimator
|
|
124
|
+
*
|
|
125
|
+
* Estimates learner ability (theta) from response patterns using
|
|
126
|
+
* Maximum Likelihood Estimation (MLE) or Expected A Posteriori (EAP).
|
|
127
|
+
*/
|
|
128
|
+
class IRTEstimator {
|
|
129
|
+
config;
|
|
130
|
+
constructor(config = {}) {
|
|
131
|
+
this.config = { ...exports.IRT_CONFIG_DEFAULTS, ...config };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Estimate ability using Maximum Likelihood Estimation (MLE)
|
|
135
|
+
*
|
|
136
|
+
* Uses Newton-Raphson iteration to find the theta that maximizes
|
|
137
|
+
* the likelihood of the observed response pattern.
|
|
138
|
+
*/
|
|
139
|
+
estimateMLE(responses) {
|
|
140
|
+
if (responses.length === 0) {
|
|
141
|
+
return this.defaultEstimate();
|
|
142
|
+
}
|
|
143
|
+
// Check for extreme patterns
|
|
144
|
+
const allCorrect = responses.every((r) => r.correct);
|
|
145
|
+
const allIncorrect = responses.every((r) => !r.correct);
|
|
146
|
+
if (allCorrect) {
|
|
147
|
+
return this.extremeEstimate(responses, 3);
|
|
148
|
+
}
|
|
149
|
+
if (allIncorrect) {
|
|
150
|
+
return this.extremeEstimate(responses, -3);
|
|
151
|
+
}
|
|
152
|
+
// Newton-Raphson iteration
|
|
153
|
+
let theta = 0; // Start at mean
|
|
154
|
+
let iteration = 0;
|
|
155
|
+
while (iteration < this.config.maxIterations) {
|
|
156
|
+
const { firstDerivative, secondDerivative } = this.calculateDerivatives(theta, responses);
|
|
157
|
+
// Newton-Raphson update
|
|
158
|
+
if (Math.abs(secondDerivative) < 1e-10) {
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
const delta = firstDerivative / secondDerivative;
|
|
162
|
+
theta = theta - delta;
|
|
163
|
+
// Bound theta to reasonable range
|
|
164
|
+
theta = Math.max(-4, Math.min(4, theta));
|
|
165
|
+
// Check convergence
|
|
166
|
+
if (Math.abs(delta) < this.config.convergenceThreshold) {
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
iteration++;
|
|
170
|
+
}
|
|
171
|
+
return this.buildEstimate(theta, responses, 'MLE');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Estimate ability using Expected A Posteriori (EAP)
|
|
175
|
+
*
|
|
176
|
+
* Uses numerical integration with a prior distribution.
|
|
177
|
+
* More stable than MLE, especially with few responses.
|
|
178
|
+
*/
|
|
179
|
+
estimateEAP(responses) {
|
|
180
|
+
if (responses.length === 0) {
|
|
181
|
+
return this.defaultEstimate();
|
|
182
|
+
}
|
|
183
|
+
// Quadrature points
|
|
184
|
+
const numPoints = 49;
|
|
185
|
+
const range = 4;
|
|
186
|
+
const points = Array.from({ length: numPoints }, (_, i) => -range + (2 * range * i) / (numPoints - 1));
|
|
187
|
+
// Calculate posterior at each point
|
|
188
|
+
let numerator = 0;
|
|
189
|
+
let denominator = 0;
|
|
190
|
+
let variance = 0;
|
|
191
|
+
for (const theta of points) {
|
|
192
|
+
const prior = this.normalPDF(theta, this.config.abilityPrior.mean, this.config.abilityPrior.sd);
|
|
193
|
+
const likelihood = this.calculateLikelihood(theta, responses);
|
|
194
|
+
const posterior = prior * likelihood;
|
|
195
|
+
numerator += theta * posterior;
|
|
196
|
+
denominator += posterior;
|
|
197
|
+
}
|
|
198
|
+
if (denominator < 1e-10) {
|
|
199
|
+
return this.defaultEstimate();
|
|
200
|
+
}
|
|
201
|
+
const thetaEAP = numerator / denominator;
|
|
202
|
+
// Calculate variance for SE
|
|
203
|
+
for (const theta of points) {
|
|
204
|
+
const prior = this.normalPDF(theta, this.config.abilityPrior.mean, this.config.abilityPrior.sd);
|
|
205
|
+
const likelihood = this.calculateLikelihood(theta, responses);
|
|
206
|
+
const posterior = prior * likelihood;
|
|
207
|
+
variance += (theta - thetaEAP) ** 2 * posterior;
|
|
208
|
+
}
|
|
209
|
+
const se = Math.sqrt(variance / denominator);
|
|
210
|
+
return {
|
|
211
|
+
theta: thetaEAP,
|
|
212
|
+
standardError: se,
|
|
213
|
+
itemCount: responses.length,
|
|
214
|
+
method: 'EAP',
|
|
215
|
+
confidenceInterval: {
|
|
216
|
+
lower: thetaEAP - 1.96 * se,
|
|
217
|
+
upper: thetaEAP + 1.96 * se,
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Estimate ability using Maximum A Posteriori (MAP)
|
|
223
|
+
*
|
|
224
|
+
* Like MLE but includes prior distribution.
|
|
225
|
+
*/
|
|
226
|
+
estimateMAP(responses) {
|
|
227
|
+
if (responses.length === 0) {
|
|
228
|
+
return this.defaultEstimate();
|
|
229
|
+
}
|
|
230
|
+
// Newton-Raphson with prior
|
|
231
|
+
let theta = this.config.abilityPrior.mean;
|
|
232
|
+
let iteration = 0;
|
|
233
|
+
while (iteration < this.config.maxIterations) {
|
|
234
|
+
const { firstDerivative, secondDerivative } = this.calculateDerivatives(theta, responses);
|
|
235
|
+
// Add prior contribution
|
|
236
|
+
const priorMean = this.config.abilityPrior.mean;
|
|
237
|
+
const priorVar = this.config.abilityPrior.sd ** 2;
|
|
238
|
+
const priorFirstDeriv = -(theta - priorMean) / priorVar;
|
|
239
|
+
const priorSecondDeriv = -1 / priorVar;
|
|
240
|
+
const totalFirst = firstDerivative + priorFirstDeriv;
|
|
241
|
+
const totalSecond = secondDerivative + priorSecondDeriv;
|
|
242
|
+
if (Math.abs(totalSecond) < 1e-10) {
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
const delta = totalFirst / totalSecond;
|
|
246
|
+
theta = theta - delta;
|
|
247
|
+
// Bound theta
|
|
248
|
+
theta = Math.max(-4, Math.min(4, theta));
|
|
249
|
+
if (Math.abs(delta) < this.config.convergenceThreshold) {
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
iteration++;
|
|
253
|
+
}
|
|
254
|
+
return this.buildEstimate(theta, responses, 'MAP');
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Auto-select best estimation method based on response count
|
|
258
|
+
*/
|
|
259
|
+
estimate(responses) {
|
|
260
|
+
if (responses.length < 5) {
|
|
261
|
+
return this.estimateEAP(responses); // EAP is more stable with few items
|
|
262
|
+
}
|
|
263
|
+
return this.estimateMLE(responses);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Calculate log-likelihood derivatives for Newton-Raphson
|
|
267
|
+
*/
|
|
268
|
+
calculateDerivatives(theta, responses) {
|
|
269
|
+
let first = 0;
|
|
270
|
+
let second = 0;
|
|
271
|
+
for (const response of responses) {
|
|
272
|
+
const p = calculateProbability(theta, response.params);
|
|
273
|
+
const pPrime = calculateProbabilityDerivative(theta, response.params);
|
|
274
|
+
const q = 1 - p;
|
|
275
|
+
const u = response.correct ? 1 : 0;
|
|
276
|
+
// Avoid division by zero
|
|
277
|
+
if (p < 1e-10 || q < 1e-10)
|
|
278
|
+
continue;
|
|
279
|
+
// First derivative: Σ (u - P) × P' / (P × Q)
|
|
280
|
+
first += ((u - p) * pPrime) / (p * q);
|
|
281
|
+
// Second derivative (negative Hessian)
|
|
282
|
+
second -= (pPrime * pPrime) / (p * q);
|
|
283
|
+
}
|
|
284
|
+
return { firstDerivative: first, secondDerivative: second };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Calculate likelihood of response pattern
|
|
288
|
+
*/
|
|
289
|
+
calculateLikelihood(theta, responses) {
|
|
290
|
+
let logLikelihood = 0;
|
|
291
|
+
for (const response of responses) {
|
|
292
|
+
const p = calculateProbability(theta, response.params);
|
|
293
|
+
logLikelihood += response.correct ? Math.log(p) : Math.log(1 - p);
|
|
294
|
+
}
|
|
295
|
+
return Math.exp(logLikelihood);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Normal PDF for prior
|
|
299
|
+
*/
|
|
300
|
+
normalPDF(x, mean, sd) {
|
|
301
|
+
const z = (x - mean) / sd;
|
|
302
|
+
return Math.exp(-0.5 * z * z) / (sd * Math.sqrt(2 * Math.PI));
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Build ability estimate result
|
|
306
|
+
*/
|
|
307
|
+
buildEstimate(theta, responses, method) {
|
|
308
|
+
const items = responses.map((r) => r.params);
|
|
309
|
+
const se = calculateStandardError(theta, items);
|
|
310
|
+
return {
|
|
311
|
+
theta,
|
|
312
|
+
standardError: se,
|
|
313
|
+
itemCount: responses.length,
|
|
314
|
+
method,
|
|
315
|
+
confidenceInterval: {
|
|
316
|
+
lower: theta - 1.96 * se,
|
|
317
|
+
upper: theta + 1.96 * se,
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Default estimate when no responses
|
|
323
|
+
*/
|
|
324
|
+
defaultEstimate() {
|
|
325
|
+
return {
|
|
326
|
+
theta: this.config.abilityPrior.mean,
|
|
327
|
+
standardError: this.config.abilityPrior.sd,
|
|
328
|
+
itemCount: 0,
|
|
329
|
+
method: 'EAP',
|
|
330
|
+
confidenceInterval: {
|
|
331
|
+
lower: this.config.abilityPrior.mean - 1.96 * this.config.abilityPrior.sd,
|
|
332
|
+
upper: this.config.abilityPrior.mean + 1.96 * this.config.abilityPrior.sd,
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Handle extreme response patterns
|
|
338
|
+
*/
|
|
339
|
+
extremeEstimate(responses, theta) {
|
|
340
|
+
const items = responses.map((r) => r.params);
|
|
341
|
+
// Large SE for extreme patterns
|
|
342
|
+
const se = Math.max(calculateStandardError(theta, items), 1.5);
|
|
343
|
+
return {
|
|
344
|
+
theta,
|
|
345
|
+
standardError: se,
|
|
346
|
+
itemCount: responses.length,
|
|
347
|
+
method: 'MLE',
|
|
348
|
+
confidenceInterval: {
|
|
349
|
+
lower: theta - 1.96 * se,
|
|
350
|
+
upper: theta + 1.96 * se,
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
exports.IRTEstimator = IRTEstimator;
|
|
356
|
+
/**
|
|
357
|
+
* Select next item for adaptive testing using Maximum Fisher Information
|
|
358
|
+
*
|
|
359
|
+
* Selects the item that provides the most information at the current ability estimate.
|
|
360
|
+
*/
|
|
361
|
+
function selectNextItemMFI(currentTheta, availableItems, administeredIds) {
|
|
362
|
+
let bestItem = null;
|
|
363
|
+
let maxInfo = -Infinity;
|
|
364
|
+
for (const item of availableItems) {
|
|
365
|
+
if (administeredIds.has(item.id))
|
|
366
|
+
continue;
|
|
367
|
+
const info = calculateInformation(currentTheta, item.params);
|
|
368
|
+
if (info > maxInfo) {
|
|
369
|
+
maxInfo = info;
|
|
370
|
+
bestItem = item;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (!bestItem)
|
|
374
|
+
return null;
|
|
375
|
+
return { ...bestItem, information: maxInfo };
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Convert ability (theta) to percentile
|
|
379
|
+
*
|
|
380
|
+
* Assumes standard normal distribution of ability.
|
|
381
|
+
*/
|
|
382
|
+
function abilityToPercentile(theta) {
|
|
383
|
+
// Standard normal CDF approximation
|
|
384
|
+
const t = 1 / (1 + 0.2316419 * Math.abs(theta));
|
|
385
|
+
const d = 0.3989423 * Math.exp((-theta * theta) / 2);
|
|
386
|
+
const p = d *
|
|
387
|
+
t *
|
|
388
|
+
(0.3193815 +
|
|
389
|
+
t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))));
|
|
390
|
+
return theta >= 0 ? (1 - p) * 100 : p * 100;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Convert ability to grade-level equivalent (rough approximation)
|
|
394
|
+
*
|
|
395
|
+
* Maps theta to approximate grade level (K-12 scale).
|
|
396
|
+
*/
|
|
397
|
+
function abilityToGradeLevel(theta) {
|
|
398
|
+
// Map -3 to +3 roughly to K-12
|
|
399
|
+
// 0 = 6th grade, -3 = K, +3 = 12+
|
|
400
|
+
return Math.max(0, Math.min(12, 6 + theta * 2));
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Create an IRT estimator
|
|
404
|
+
*/
|
|
405
|
+
function createIRTEstimator(config) {
|
|
406
|
+
return new IRTEstimator(config);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Quick ability estimation using EAP
|
|
410
|
+
*/
|
|
411
|
+
function estimateAbility(responses, config) {
|
|
412
|
+
const estimator = new IRTEstimator(config);
|
|
413
|
+
const irtResponses = responses.map((r, i) => ({
|
|
414
|
+
questionId: `q-${i}`,
|
|
415
|
+
params: r.params,
|
|
416
|
+
correct: r.correct,
|
|
417
|
+
}));
|
|
418
|
+
return estimator.estimateEAP(irtResponses).theta;
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=irt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"irt.js","sourceRoot":"","sources":["../../../src/assessment/irt.ts"],"names":[],"mappings":"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"}
|