@silupanda/label-score 0.3.2
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/README.md +694 -0
- package/dist/__tests__/cohen-kappa.test.d.ts +2 -0
- package/dist/__tests__/cohen-kappa.test.d.ts.map +1 -0
- package/dist/__tests__/cohen-kappa.test.js +110 -0
- package/dist/__tests__/cohen-kappa.test.js.map +1 -0
- package/dist/__tests__/fleiss-kappa.test.d.ts +2 -0
- package/dist/__tests__/fleiss-kappa.test.d.ts.map +1 -0
- package/dist/__tests__/fleiss-kappa.test.js +84 -0
- package/dist/__tests__/fleiss-kappa.test.js.map +1 -0
- package/dist/__tests__/gwet-ac1.test.d.ts +2 -0
- package/dist/__tests__/gwet-ac1.test.d.ts.map +1 -0
- package/dist/__tests__/gwet-ac1.test.js +74 -0
- package/dist/__tests__/gwet-ac1.test.js.map +1 -0
- package/dist/__tests__/interpret.test.d.ts +2 -0
- package/dist/__tests__/interpret.test.d.ts.map +1 -0
- package/dist/__tests__/interpret.test.js +66 -0
- package/dist/__tests__/interpret.test.js.map +1 -0
- package/dist/__tests__/krippendorff-alpha.test.d.ts +2 -0
- package/dist/__tests__/krippendorff-alpha.test.d.ts.map +1 -0
- package/dist/__tests__/krippendorff-alpha.test.js +98 -0
- package/dist/__tests__/krippendorff-alpha.test.js.map +1 -0
- package/dist/__tests__/scott-pi.test.d.ts +2 -0
- package/dist/__tests__/scott-pi.test.d.ts.map +1 -0
- package/dist/__tests__/scott-pi.test.js +60 -0
- package/dist/__tests__/scott-pi.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +92 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/__tests__/validate.test.d.ts +2 -0
- package/dist/__tests__/validate.test.d.ts.map +1 -0
- package/dist/__tests__/validate.test.js +121 -0
- package/dist/__tests__/validate.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/interpret.d.ts +23 -0
- package/dist/interpret.d.ts.map +1 -0
- package/dist/interpret.js +48 -0
- package/dist/interpret.js.map +1 -0
- package/dist/metrics/cohen-kappa.d.ts +16 -0
- package/dist/metrics/cohen-kappa.d.ts.map +1 -0
- package/dist/metrics/cohen-kappa.js +130 -0
- package/dist/metrics/cohen-kappa.js.map +1 -0
- package/dist/metrics/fleiss-kappa.d.ts +17 -0
- package/dist/metrics/fleiss-kappa.d.ts.map +1 -0
- package/dist/metrics/fleiss-kappa.js +63 -0
- package/dist/metrics/fleiss-kappa.js.map +1 -0
- package/dist/metrics/gwet-ac1.d.ts +19 -0
- package/dist/metrics/gwet-ac1.d.ts.map +1 -0
- package/dist/metrics/gwet-ac1.js +82 -0
- package/dist/metrics/gwet-ac1.js.map +1 -0
- package/dist/metrics/krippendorff-alpha.d.ts +21 -0
- package/dist/metrics/krippendorff-alpha.d.ts.map +1 -0
- package/dist/metrics/krippendorff-alpha.js +162 -0
- package/dist/metrics/krippendorff-alpha.js.map +1 -0
- package/dist/metrics/scott-pi.d.ts +18 -0
- package/dist/metrics/scott-pi.d.ts.map +1 -0
- package/dist/metrics/scott-pi.js +73 -0
- package/dist/metrics/scott-pi.js.map +1 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +33 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +83 -0
- package/dist/validate.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
(0, vitest_1.describe)('types: compile-time shape checks', () => {
|
|
5
|
+
(0, vitest_1.it)('KappaResult can be constructed with required fields', () => {
|
|
6
|
+
const result = {
|
|
7
|
+
metric: 'cohens-kappa',
|
|
8
|
+
value: 0.75,
|
|
9
|
+
observed: 0.85,
|
|
10
|
+
expected: 0.40,
|
|
11
|
+
interpretation: 'substantial',
|
|
12
|
+
};
|
|
13
|
+
(0, vitest_1.expect)(result.metric).toBe('cohens-kappa');
|
|
14
|
+
(0, vitest_1.expect)(result.value).toBe(0.75);
|
|
15
|
+
(0, vitest_1.expect)(result.observed).toBe(0.85);
|
|
16
|
+
(0, vitest_1.expect)(result.expected).toBe(0.40);
|
|
17
|
+
(0, vitest_1.expect)(result.interpretation).toBe('substantial');
|
|
18
|
+
(0, vitest_1.expect)(result.ci).toBeUndefined();
|
|
19
|
+
(0, vitest_1.expect)(result.categories).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('FleissKappaResult has annotatorCount and itemCount', () => {
|
|
22
|
+
const result = {
|
|
23
|
+
metric: 'fleiss-kappa',
|
|
24
|
+
value: 0.60,
|
|
25
|
+
observed: 0.70,
|
|
26
|
+
expected: 0.25,
|
|
27
|
+
interpretation: 'substantial',
|
|
28
|
+
annotatorCount: 5,
|
|
29
|
+
itemCount: 100,
|
|
30
|
+
};
|
|
31
|
+
(0, vitest_1.expect)(result.annotatorCount).toBe(5);
|
|
32
|
+
(0, vitest_1.expect)(result.itemCount).toBe(100);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('AlphaResult has missingCount', () => {
|
|
35
|
+
const result = {
|
|
36
|
+
metric: 'krippendorff-alpha',
|
|
37
|
+
value: 0.85,
|
|
38
|
+
interpretation: 'reliable',
|
|
39
|
+
level: 'nominal',
|
|
40
|
+
itemCount: 50,
|
|
41
|
+
annotatorCount: 3,
|
|
42
|
+
missingCount: 2,
|
|
43
|
+
};
|
|
44
|
+
(0, vitest_1.expect)(result.missingCount).toBe(2);
|
|
45
|
+
(0, vitest_1.expect)(result.itemCount).toBe(50);
|
|
46
|
+
(0, vitest_1.expect)(result.annotatorCount).toBe(3);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('AgreementOptions all fields optional', () => {
|
|
49
|
+
const empty = {};
|
|
50
|
+
(0, vitest_1.expect)(empty).toBeDefined();
|
|
51
|
+
const full = {
|
|
52
|
+
metric: 'cohens-kappa',
|
|
53
|
+
level: 'ordinal',
|
|
54
|
+
missingData: 'exclude',
|
|
55
|
+
ci: true,
|
|
56
|
+
ciLevel: 0.95,
|
|
57
|
+
seed: 42,
|
|
58
|
+
};
|
|
59
|
+
(0, vitest_1.expect)(full.metric).toBe('cohens-kappa');
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)('MetricName union covers all 6 metrics', () => {
|
|
62
|
+
const metrics = [
|
|
63
|
+
'cohens-kappa',
|
|
64
|
+
'fleiss-kappa',
|
|
65
|
+
'krippendorff-alpha',
|
|
66
|
+
'scotts-pi',
|
|
67
|
+
'gwets-ac1',
|
|
68
|
+
'percent-agreement',
|
|
69
|
+
];
|
|
70
|
+
(0, vitest_1.expect)(metrics).toHaveLength(6);
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.it)('MeasurementLevel covers all 4 values', () => {
|
|
73
|
+
const levels = ['nominal', 'ordinal', 'interval', 'ratio'];
|
|
74
|
+
(0, vitest_1.expect)(levels).toHaveLength(4);
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)('Interpretation covers all 6 values', () => {
|
|
77
|
+
const values = [
|
|
78
|
+
'poor',
|
|
79
|
+
'slight',
|
|
80
|
+
'fair',
|
|
81
|
+
'moderate',
|
|
82
|
+
'substantial',
|
|
83
|
+
'almost-perfect',
|
|
84
|
+
];
|
|
85
|
+
(0, vitest_1.expect)(values).toHaveLength(6);
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)('AlphaInterpretation covers all 3 values', () => {
|
|
88
|
+
const values = ['unreliable', 'tentative', 'reliable'];
|
|
89
|
+
(0, vitest_1.expect)(values).toHaveLength(3);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const validate_1 = require("../validate");
|
|
5
|
+
(0, vitest_1.describe)('assertEqualLength', () => {
|
|
6
|
+
(0, vitest_1.it)('passes when arrays have equal lengths', () => {
|
|
7
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertEqualLength)([1, 2, 3], ['a', 'b', 'c'])).not.toThrow();
|
|
8
|
+
});
|
|
9
|
+
(0, vitest_1.it)('passes for two empty arrays', () => {
|
|
10
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertEqualLength)([], [])).not.toThrow();
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('throws when arrays have different lengths', () => {
|
|
13
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertEqualLength)([1, 2], [1])).toThrow('Arrays must have equal length: got 2 and 1');
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)('includes optional label in error message', () => {
|
|
16
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertEqualLength)([1, 2], [1], 'annotators')).toThrow('Arrays must have equal length: got 2 and 1 annotators');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.describe)('assertNonEmpty', () => {
|
|
20
|
+
(0, vitest_1.it)('passes for a non-empty array', () => {
|
|
21
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertNonEmpty)([1, 2, 3])).not.toThrow();
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)('throws for an empty array', () => {
|
|
24
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertNonEmpty)([])).toThrow('Array must be non-empty');
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.it)('includes optional label in error message', () => {
|
|
27
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertNonEmpty)([], 'labels')).toThrow('Array must be non-empty labels');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.describe)('assertConsistentRowLengths', () => {
|
|
31
|
+
(0, vitest_1.it)('passes for a matrix with consistent row lengths', () => {
|
|
32
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConsistentRowLengths)([[1, 2], [3, 4], [5, 6]])).not.toThrow();
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('passes for an empty matrix', () => {
|
|
35
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConsistentRowLengths)([])).not.toThrow();
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)('passes for a single-row matrix', () => {
|
|
38
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConsistentRowLengths)([[1, 2, 3]])).not.toThrow();
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('throws when rows have different lengths', () => {
|
|
41
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConsistentRowLengths)([[1, 2], [3, 4, 5]])).toThrow('Matrix has inconsistent row lengths');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.describe)('assertConstantRowSums', () => {
|
|
45
|
+
(0, vitest_1.it)('passes when all rows have equal sums', () => {
|
|
46
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConstantRowSums)([[1, 2, 3], [2, 2, 2], [0, 0, 6]])).not.toThrow();
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('passes for an empty matrix', () => {
|
|
49
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConstantRowSums)([])).not.toThrow();
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('passes for a single row', () => {
|
|
52
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConstantRowSums)([[3, 2, 1]])).not.toThrow();
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)('throws when rows have different sums', () => {
|
|
55
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConstantRowSums)([[1, 2], [3, 4]])).toThrow('Category-count matrix rows must have equal sums');
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.it)('passes with floating-point values within tolerance', () => {
|
|
58
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertConstantRowSums)([[0.1, 0.2, 0.7], [0.4, 0.4, 0.2]])).not.toThrow();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.describe)('assertMinAnnotators', () => {
|
|
62
|
+
(0, vitest_1.it)('passes for exactly 2 annotators', () => {
|
|
63
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertMinAnnotators)(2)).not.toThrow();
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.it)('passes for more than 2 annotators', () => {
|
|
66
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertMinAnnotators)(5)).not.toThrow();
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)('throws for 1 annotator', () => {
|
|
69
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertMinAnnotators)(1)).toThrow('At least 2 annotators required, got 1');
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.it)('throws for 0 annotators', () => {
|
|
72
|
+
(0, vitest_1.expect)(() => (0, validate_1.assertMinAnnotators)(0)).toThrow('At least 2 annotators required, got 0');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.describe)('detectDuplicates', () => {
|
|
76
|
+
(0, vitest_1.it)('returns empty array when there are no duplicates', () => {
|
|
77
|
+
const triples = [
|
|
78
|
+
{ item: 1, annotator: 'A' },
|
|
79
|
+
{ item: 1, annotator: 'B' },
|
|
80
|
+
{ item: 2, annotator: 'A' },
|
|
81
|
+
];
|
|
82
|
+
(0, vitest_1.expect)((0, validate_1.detectDuplicates)(triples)).toEqual([]);
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('returns the duplicate pair when a pair appears more than once', () => {
|
|
85
|
+
const triples = [
|
|
86
|
+
{ item: 1, annotator: 'A' },
|
|
87
|
+
{ item: 1, annotator: 'A' },
|
|
88
|
+
{ item: 2, annotator: 'B' },
|
|
89
|
+
];
|
|
90
|
+
const result = (0, validate_1.detectDuplicates)(triples);
|
|
91
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
92
|
+
(0, vitest_1.expect)(result[0]).toEqual({ item: 1, annotator: 'A' });
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)('returns each duplicate pair only once even when it appears 3 times', () => {
|
|
95
|
+
const triples = [
|
|
96
|
+
{ item: 'x', annotator: 1 },
|
|
97
|
+
{ item: 'x', annotator: 1 },
|
|
98
|
+
{ item: 'x', annotator: 1 },
|
|
99
|
+
];
|
|
100
|
+
const result = (0, validate_1.detectDuplicates)(triples);
|
|
101
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
102
|
+
(0, vitest_1.expect)(result[0]).toEqual({ item: 'x', annotator: 1 });
|
|
103
|
+
});
|
|
104
|
+
(0, vitest_1.it)('returns multiple duplicate pairs when several pairs are duplicated', () => {
|
|
105
|
+
const triples = [
|
|
106
|
+
{ item: 1, annotator: 'A' },
|
|
107
|
+
{ item: 1, annotator: 'A' },
|
|
108
|
+
{ item: 2, annotator: 'B' },
|
|
109
|
+
{ item: 2, annotator: 'B' },
|
|
110
|
+
{ item: 3, annotator: 'C' },
|
|
111
|
+
];
|
|
112
|
+
const result = (0, validate_1.detectDuplicates)(triples);
|
|
113
|
+
(0, vitest_1.expect)(result).toHaveLength(2);
|
|
114
|
+
(0, vitest_1.expect)(result).toContainEqual({ item: 1, annotator: 'A' });
|
|
115
|
+
(0, vitest_1.expect)(result).toContainEqual({ item: 2, annotator: 'B' });
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('returns empty array for an empty input', () => {
|
|
118
|
+
(0, vitest_1.expect)((0, validate_1.detectDuplicates)([])).toEqual([]);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=validate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../src/__tests__/validate.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,0CAOqB;AAErB,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,4BAAiB,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,4BAAiB,EAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,4BAAiB,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAClD,4CAA4C,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,4BAAiB,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAChE,uDAAuD,CACxD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,yBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,yBAAc,EAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,yBAAc,EAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAA,WAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,qCAA0B,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,qCAA0B,EAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,qCAA0B,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,qCAA0B,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CACnE,qCAAqC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,gCAAqB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,gCAAqB,EAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,gCAAqB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,gCAAqB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAC3D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,gCAAqB,EAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,8BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,8BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,8BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,8BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,OAAO,GAAG;YACd,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;SAC5B,CAAC;QACF,IAAA,eAAM,EAAC,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,OAAO,GAAG;YACd,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;SAC5B,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC;QACzC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG;YACd,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;YAC3B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;YAC3B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;SAC5B,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC;QACzC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG;YACd,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3B,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;SAC5B,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC;QACzC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,IAAA,eAAM,EAAC,IAAA,2BAAgB,EAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { Label, MeasurementLevel, MetricName, AnnotationTriple, Interpretation, AlphaInterpretation, ConfidenceInterval, KappaResult, FleissKappaResult, AlphaResult, PiResult, AC1Result, ConfusionMatrix, CohensKappaOptions, FleissKappaOptions, KrippendorffOptions, ScottsPiOptions, AC1Options, AgreementOptions, CIOptions, AgreementReport, } from './types';
|
|
2
|
+
export { interpretKappa, interpretAlpha } from './interpret';
|
|
3
|
+
export { assertEqualLength, assertNonEmpty, assertConsistentRowLengths, assertConstantRowSums, assertMinAnnotators, detectDuplicates, } from './validate';
|
|
4
|
+
export { cohenKappa } from './metrics/cohen-kappa';
|
|
5
|
+
export { fleissKappa } from './metrics/fleiss-kappa';
|
|
6
|
+
export { scottPi } from './metrics/scott-pi';
|
|
7
|
+
export { krippendorffAlpha } from './metrics/krippendorff-alpha';
|
|
8
|
+
export { gwetAC1 } from './metrics/gwet-ac1';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gwetAC1 = exports.krippendorffAlpha = exports.scottPi = exports.fleissKappa = exports.cohenKappa = exports.detectDuplicates = exports.assertMinAnnotators = exports.assertConstantRowSums = exports.assertConsistentRowLengths = exports.assertNonEmpty = exports.assertEqualLength = exports.interpretAlpha = exports.interpretKappa = void 0;
|
|
4
|
+
var interpret_1 = require("./interpret");
|
|
5
|
+
Object.defineProperty(exports, "interpretKappa", { enumerable: true, get: function () { return interpret_1.interpretKappa; } });
|
|
6
|
+
Object.defineProperty(exports, "interpretAlpha", { enumerable: true, get: function () { return interpret_1.interpretAlpha; } });
|
|
7
|
+
var validate_1 = require("./validate");
|
|
8
|
+
Object.defineProperty(exports, "assertEqualLength", { enumerable: true, get: function () { return validate_1.assertEqualLength; } });
|
|
9
|
+
Object.defineProperty(exports, "assertNonEmpty", { enumerable: true, get: function () { return validate_1.assertNonEmpty; } });
|
|
10
|
+
Object.defineProperty(exports, "assertConsistentRowLengths", { enumerable: true, get: function () { return validate_1.assertConsistentRowLengths; } });
|
|
11
|
+
Object.defineProperty(exports, "assertConstantRowSums", { enumerable: true, get: function () { return validate_1.assertConstantRowSums; } });
|
|
12
|
+
Object.defineProperty(exports, "assertMinAnnotators", { enumerable: true, get: function () { return validate_1.assertMinAnnotators; } });
|
|
13
|
+
Object.defineProperty(exports, "detectDuplicates", { enumerable: true, get: function () { return validate_1.detectDuplicates; } });
|
|
14
|
+
var cohen_kappa_1 = require("./metrics/cohen-kappa");
|
|
15
|
+
Object.defineProperty(exports, "cohenKappa", { enumerable: true, get: function () { return cohen_kappa_1.cohenKappa; } });
|
|
16
|
+
var fleiss_kappa_1 = require("./metrics/fleiss-kappa");
|
|
17
|
+
Object.defineProperty(exports, "fleissKappa", { enumerable: true, get: function () { return fleiss_kappa_1.fleissKappa; } });
|
|
18
|
+
var scott_pi_1 = require("./metrics/scott-pi");
|
|
19
|
+
Object.defineProperty(exports, "scottPi", { enumerable: true, get: function () { return scott_pi_1.scottPi; } });
|
|
20
|
+
var krippendorff_alpha_1 = require("./metrics/krippendorff-alpha");
|
|
21
|
+
Object.defineProperty(exports, "krippendorffAlpha", { enumerable: true, get: function () { return krippendorff_alpha_1.krippendorffAlpha; } });
|
|
22
|
+
var gwet_ac1_1 = require("./metrics/gwet-ac1");
|
|
23
|
+
Object.defineProperty(exports, "gwetAC1", { enumerable: true, get: function () { return gwet_ac1_1.gwetAC1; } });
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAwBA,yCAA6D;AAApD,2GAAA,cAAc,OAAA;AAAE,2GAAA,cAAc,OAAA;AACvC,uCAOoB;AANlB,6GAAA,iBAAiB,OAAA;AACjB,0GAAA,cAAc,OAAA;AACd,sHAAA,0BAA0B,OAAA;AAC1B,iHAAA,qBAAqB,OAAA;AACrB,+GAAA,mBAAmB,OAAA;AACnB,4GAAA,gBAAgB,OAAA;AAElB,qDAAmD;AAA1C,yGAAA,UAAU,OAAA;AACnB,uDAAqD;AAA5C,2GAAA,WAAW,OAAA;AACpB,+CAA6C;AAApC,mGAAA,OAAO,OAAA;AAChB,mEAAiE;AAAxD,uHAAA,iBAAiB,OAAA;AAC1B,+CAA6C;AAApC,mGAAA,OAAO,OAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Interpretation, AlphaInterpretation } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Interprets a kappa-family metric value using the Landis & Koch (1977) scale.
|
|
4
|
+
*
|
|
5
|
+
* Ranges:
|
|
6
|
+
* value < 0 → 'poor'
|
|
7
|
+
* 0 ≤ value < 0.20 → 'slight'
|
|
8
|
+
* 0.20 ≤ value < 0.40 → 'fair'
|
|
9
|
+
* 0.40 ≤ value < 0.60 → 'moderate'
|
|
10
|
+
* 0.60 ≤ value < 0.80 → 'substantial'
|
|
11
|
+
* value ≥ 0.80 → 'almost-perfect'
|
|
12
|
+
*/
|
|
13
|
+
export declare function interpretKappa(value: number): Interpretation;
|
|
14
|
+
/**
|
|
15
|
+
* Interprets a Krippendorff's Alpha value using Krippendorff's recommended thresholds.
|
|
16
|
+
*
|
|
17
|
+
* Ranges:
|
|
18
|
+
* value < 0.667 → 'unreliable'
|
|
19
|
+
* 0.667 ≤ value < 0.800 → 'tentative'
|
|
20
|
+
* value ≥ 0.800 → 'reliable'
|
|
21
|
+
*/
|
|
22
|
+
export declare function interpretAlpha(value: number): AlphaInterpretation;
|
|
23
|
+
//# sourceMappingURL=interpret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpret.d.ts","sourceRoot":"","sources":["../src/interpret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAQ5D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAKjE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.interpretKappa = interpretKappa;
|
|
4
|
+
exports.interpretAlpha = interpretAlpha;
|
|
5
|
+
/**
|
|
6
|
+
* Interprets a kappa-family metric value using the Landis & Koch (1977) scale.
|
|
7
|
+
*
|
|
8
|
+
* Ranges:
|
|
9
|
+
* value < 0 → 'poor'
|
|
10
|
+
* 0 ≤ value < 0.20 → 'slight'
|
|
11
|
+
* 0.20 ≤ value < 0.40 → 'fair'
|
|
12
|
+
* 0.40 ≤ value < 0.60 → 'moderate'
|
|
13
|
+
* 0.60 ≤ value < 0.80 → 'substantial'
|
|
14
|
+
* value ≥ 0.80 → 'almost-perfect'
|
|
15
|
+
*/
|
|
16
|
+
function interpretKappa(value) {
|
|
17
|
+
if (Number.isNaN(value))
|
|
18
|
+
return 'poor';
|
|
19
|
+
if (value < 0)
|
|
20
|
+
return 'poor';
|
|
21
|
+
if (value < 0.20)
|
|
22
|
+
return 'slight';
|
|
23
|
+
if (value < 0.40)
|
|
24
|
+
return 'fair';
|
|
25
|
+
if (value < 0.60)
|
|
26
|
+
return 'moderate';
|
|
27
|
+
if (value < 0.80)
|
|
28
|
+
return 'substantial';
|
|
29
|
+
return 'almost-perfect';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Interprets a Krippendorff's Alpha value using Krippendorff's recommended thresholds.
|
|
33
|
+
*
|
|
34
|
+
* Ranges:
|
|
35
|
+
* value < 0.667 → 'unreliable'
|
|
36
|
+
* 0.667 ≤ value < 0.800 → 'tentative'
|
|
37
|
+
* value ≥ 0.800 → 'reliable'
|
|
38
|
+
*/
|
|
39
|
+
function interpretAlpha(value) {
|
|
40
|
+
if (Number.isNaN(value))
|
|
41
|
+
return 'unreliable';
|
|
42
|
+
if (value < 0.667)
|
|
43
|
+
return 'unreliable';
|
|
44
|
+
if (value < 0.800)
|
|
45
|
+
return 'tentative';
|
|
46
|
+
return 'reliable';
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=interpret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpret.js","sourceRoot":"","sources":["../src/interpret.ts"],"names":[],"mappings":";;AAaA,wCAQC;AAUD,wCAKC;AAlCD;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,QAAQ,CAAC;IAClC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,aAAa,CAAC;IACvC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAC7C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,YAAY,CAAC;IACvC,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,WAAW,CAAC;IACtC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Label, KappaResult, CohensKappaOptions } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Computes Cohen's Kappa (unweighted or weighted) for two raters.
|
|
4
|
+
*
|
|
5
|
+
* Unweighted: κ = (Po - Pe) / (1 - Pe)
|
|
6
|
+
* Po = observed agreement proportion
|
|
7
|
+
* Pe = expected agreement by chance (product of marginal proportions)
|
|
8
|
+
*
|
|
9
|
+
* Weighted (linear or quadratic): disagreements are penalised by weight w[i][j].
|
|
10
|
+
* linear: w[i][j] = |i - j| / (k - 1)
|
|
11
|
+
* quadratic: w[i][j] = (i - j)² / (k - 1)²
|
|
12
|
+
*
|
|
13
|
+
* Edge case: Pe = 1 (all items in one category) returns 1.0.
|
|
14
|
+
*/
|
|
15
|
+
export declare function cohenKappa(rater1: Label[], rater2: Label[], options?: CohensKappaOptions): KappaResult;
|
|
16
|
+
//# sourceMappingURL=cohen-kappa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohen-kappa.d.ts","sourceRoot":"","sources":["../../src/metrics/cohen-kappa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAoCvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAgGb"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cohenKappa = cohenKappa;
|
|
4
|
+
const validate_1 = require("../validate");
|
|
5
|
+
const interpret_1 = require("../interpret");
|
|
6
|
+
/**
|
|
7
|
+
* Builds a sorted list of unique categories from two label arrays.
|
|
8
|
+
*/
|
|
9
|
+
function getCategories(rater1, rater2) {
|
|
10
|
+
const set = new Set();
|
|
11
|
+
for (const v of rater1)
|
|
12
|
+
set.add(v);
|
|
13
|
+
for (const v of rater2)
|
|
14
|
+
set.add(v);
|
|
15
|
+
return Array.from(set).sort((a, b) => String(a).localeCompare(String(b)));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Builds a contingency matrix where matrix[i][j] = count of items
|
|
19
|
+
* where rater1 gave categories[i] and rater2 gave categories[j].
|
|
20
|
+
*/
|
|
21
|
+
function buildContingencyMatrix(rater1, rater2, categories) {
|
|
22
|
+
const idx = new Map(categories.map((c, i) => [c, i]));
|
|
23
|
+
const k = categories.length;
|
|
24
|
+
const matrix = Array.from({ length: k }, () => new Array(k).fill(0));
|
|
25
|
+
for (let n = 0; n < rater1.length; n++) {
|
|
26
|
+
const i = idx.get(rater1[n]);
|
|
27
|
+
const j = idx.get(rater2[n]);
|
|
28
|
+
if (i !== undefined && j !== undefined) {
|
|
29
|
+
matrix[i][j]++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return matrix;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Computes Cohen's Kappa (unweighted or weighted) for two raters.
|
|
36
|
+
*
|
|
37
|
+
* Unweighted: κ = (Po - Pe) / (1 - Pe)
|
|
38
|
+
* Po = observed agreement proportion
|
|
39
|
+
* Pe = expected agreement by chance (product of marginal proportions)
|
|
40
|
+
*
|
|
41
|
+
* Weighted (linear or quadratic): disagreements are penalised by weight w[i][j].
|
|
42
|
+
* linear: w[i][j] = |i - j| / (k - 1)
|
|
43
|
+
* quadratic: w[i][j] = (i - j)² / (k - 1)²
|
|
44
|
+
*
|
|
45
|
+
* Edge case: Pe = 1 (all items in one category) returns 1.0.
|
|
46
|
+
*/
|
|
47
|
+
function cohenKappa(rater1, rater2, options = {}) {
|
|
48
|
+
(0, validate_1.assertNonEmpty)(rater1, 'rater1');
|
|
49
|
+
(0, validate_1.assertEqualLength)(rater1, rater2, '(rater1 vs rater2)');
|
|
50
|
+
const categories = getCategories(rater1, rater2);
|
|
51
|
+
const k = categories.length;
|
|
52
|
+
const n = rater1.length;
|
|
53
|
+
const matrix = buildContingencyMatrix(rater1, rater2, categories);
|
|
54
|
+
// Row and column marginals
|
|
55
|
+
const rowMarginals = matrix.map(row => row.reduce((s, v) => s + v, 0));
|
|
56
|
+
const colMarginals = Array.from({ length: k }, (_, j) => matrix.reduce((s, row) => s + row[j], 0));
|
|
57
|
+
const weighted = options.weighted === true;
|
|
58
|
+
const weightScheme = options.weights ?? 'linear';
|
|
59
|
+
if (!weighted || k === 1) {
|
|
60
|
+
// Unweighted kappa
|
|
61
|
+
const Po = matrix.reduce((s, row, i) => s + row[i], 0) / n;
|
|
62
|
+
const Pe = rowMarginals.reduce((s, ri, i) => s + (ri / n) * (colMarginals[i] / n), 0);
|
|
63
|
+
if (Pe >= 1 - 1e-12) {
|
|
64
|
+
return {
|
|
65
|
+
metric: 'cohens-kappa',
|
|
66
|
+
value: 1.0,
|
|
67
|
+
observed: Po,
|
|
68
|
+
expected: Pe,
|
|
69
|
+
interpretation: (0, interpret_1.interpretKappa)(1.0),
|
|
70
|
+
categories,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const value = (Po - Pe) / (1 - Pe);
|
|
74
|
+
return {
|
|
75
|
+
metric: 'cohens-kappa',
|
|
76
|
+
value,
|
|
77
|
+
observed: Po,
|
|
78
|
+
expected: Pe,
|
|
79
|
+
interpretation: (0, interpret_1.interpretKappa)(value),
|
|
80
|
+
categories,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Weighted kappa
|
|
84
|
+
// Build weight matrix: w[i][j] = disagreement weight (0 on diagonal)
|
|
85
|
+
const weights = Array.from({ length: k }, (_, i) => Array.from({ length: k }, (__, j) => {
|
|
86
|
+
if (i === j)
|
|
87
|
+
return 0;
|
|
88
|
+
if (weightScheme === 'quadratic') {
|
|
89
|
+
return ((i - j) ** 2) / ((k - 1) ** 2);
|
|
90
|
+
}
|
|
91
|
+
// linear
|
|
92
|
+
return Math.abs(i - j) / (k - 1);
|
|
93
|
+
}));
|
|
94
|
+
// Po_w = 1 - weighted observed disagreement
|
|
95
|
+
let observedDisagreement = 0;
|
|
96
|
+
for (let i = 0; i < k; i++) {
|
|
97
|
+
for (let j = 0; j < k; j++) {
|
|
98
|
+
observedDisagreement += weights[i][j] * (matrix[i][j] / n);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const Po = 1 - observedDisagreement;
|
|
102
|
+
// Pe_w = 1 - weighted expected disagreement
|
|
103
|
+
let expectedDisagreement = 0;
|
|
104
|
+
for (let i = 0; i < k; i++) {
|
|
105
|
+
for (let j = 0; j < k; j++) {
|
|
106
|
+
expectedDisagreement += weights[i][j] * (rowMarginals[i] / n) * (colMarginals[j] / n);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const Pe = 1 - expectedDisagreement;
|
|
110
|
+
if (Pe >= 1 - 1e-12) {
|
|
111
|
+
return {
|
|
112
|
+
metric: 'cohens-kappa',
|
|
113
|
+
value: 1.0,
|
|
114
|
+
observed: Po,
|
|
115
|
+
expected: Pe,
|
|
116
|
+
interpretation: (0, interpret_1.interpretKappa)(1.0),
|
|
117
|
+
categories,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const value = (Po - Pe) / (1 - Pe);
|
|
121
|
+
return {
|
|
122
|
+
metric: 'cohens-kappa',
|
|
123
|
+
value,
|
|
124
|
+
observed: Po,
|
|
125
|
+
expected: Pe,
|
|
126
|
+
interpretation: (0, interpret_1.interpretKappa)(value),
|
|
127
|
+
categories,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=cohen-kappa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohen-kappa.js","sourceRoot":"","sources":["../../src/metrics/cohen-kappa.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { FleissKappaResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Computes Fleiss' Kappa for multiple raters.
|
|
4
|
+
*
|
|
5
|
+
* Input: matrix[n_subjects][n_categories]
|
|
6
|
+
* matrix[i][j] = number of raters who assigned category j to subject i
|
|
7
|
+
* All rows must sum to the same value n (the number of raters per subject).
|
|
8
|
+
*
|
|
9
|
+
* Formula:
|
|
10
|
+
* P̄ = (1/n_subjects) * Σ_i P_i
|
|
11
|
+
* P_i = (1 / (n*(n-1))) * (Σ_j n_ij*(n_ij - 1))
|
|
12
|
+
* p_j = (1 / (n_subjects * n)) * Σ_i n_ij (marginal proportion for category j)
|
|
13
|
+
* P̄_e = Σ_j p_j²
|
|
14
|
+
* κ = (P̄ - P̄_e) / (1 - P̄_e)
|
|
15
|
+
*/
|
|
16
|
+
export declare function fleissKappa(matrix: number[][]): FleissKappaResult;
|
|
17
|
+
//# sourceMappingURL=fleiss-kappa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleiss-kappa.d.ts","sourceRoot":"","sources":["../../src/metrics/fleiss-kappa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAIlD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,iBAAiB,CAsDjE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fleissKappa = fleissKappa;
|
|
4
|
+
const validate_1 = require("../validate");
|
|
5
|
+
const interpret_1 = require("../interpret");
|
|
6
|
+
/**
|
|
7
|
+
* Computes Fleiss' Kappa for multiple raters.
|
|
8
|
+
*
|
|
9
|
+
* Input: matrix[n_subjects][n_categories]
|
|
10
|
+
* matrix[i][j] = number of raters who assigned category j to subject i
|
|
11
|
+
* All rows must sum to the same value n (the number of raters per subject).
|
|
12
|
+
*
|
|
13
|
+
* Formula:
|
|
14
|
+
* P̄ = (1/n_subjects) * Σ_i P_i
|
|
15
|
+
* P_i = (1 / (n*(n-1))) * (Σ_j n_ij*(n_ij - 1))
|
|
16
|
+
* p_j = (1 / (n_subjects * n)) * Σ_i n_ij (marginal proportion for category j)
|
|
17
|
+
* P̄_e = Σ_j p_j²
|
|
18
|
+
* κ = (P̄ - P̄_e) / (1 - P̄_e)
|
|
19
|
+
*/
|
|
20
|
+
function fleissKappa(matrix) {
|
|
21
|
+
(0, validate_1.assertNonEmpty)(matrix, 'matrix');
|
|
22
|
+
(0, validate_1.assertConsistentRowLengths)(matrix);
|
|
23
|
+
(0, validate_1.assertConstantRowSums)(matrix);
|
|
24
|
+
const N = matrix.length; // number of subjects
|
|
25
|
+
const k = matrix[0].length; // number of categories
|
|
26
|
+
if (k < 2) {
|
|
27
|
+
throw new Error('Fleiss Kappa requires at least 2 categories');
|
|
28
|
+
}
|
|
29
|
+
// n = number of raters per subject (row sum, constant across rows)
|
|
30
|
+
const n = matrix[0].reduce((s, v) => s + v, 0);
|
|
31
|
+
(0, validate_1.assertMinAnnotators)(n);
|
|
32
|
+
// p_j: marginal proportion for each category
|
|
33
|
+
const pj = Array.from({ length: k }, (_, j) => matrix.reduce((s, row) => s + row[j], 0) / (N * n));
|
|
34
|
+
// P_i: per-subject agreement
|
|
35
|
+
const Pi = matrix.map(row => {
|
|
36
|
+
const sumSquares = row.reduce((s, nij) => s + nij * (nij - 1), 0);
|
|
37
|
+
return sumSquares / (n * (n - 1));
|
|
38
|
+
});
|
|
39
|
+
const Pbar = Pi.reduce((s, p) => s + p, 0) / N;
|
|
40
|
+
const Pe = pj.reduce((s, p) => s + p * p, 0);
|
|
41
|
+
if (Pe >= 1 - 1e-12) {
|
|
42
|
+
return {
|
|
43
|
+
metric: 'fleiss-kappa',
|
|
44
|
+
value: 1.0,
|
|
45
|
+
observed: Pbar,
|
|
46
|
+
expected: Pe,
|
|
47
|
+
interpretation: (0, interpret_1.interpretKappa)(1.0),
|
|
48
|
+
annotatorCount: n,
|
|
49
|
+
itemCount: N,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const value = (Pbar - Pe) / (1 - Pe);
|
|
53
|
+
return {
|
|
54
|
+
metric: 'fleiss-kappa',
|
|
55
|
+
value,
|
|
56
|
+
observed: Pbar,
|
|
57
|
+
expected: Pe,
|
|
58
|
+
interpretation: (0, interpret_1.interpretKappa)(value),
|
|
59
|
+
annotatorCount: n,
|
|
60
|
+
itemCount: N,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=fleiss-kappa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleiss-kappa.js","sourceRoot":"","sources":["../../src/metrics/fleiss-kappa.ts"],"names":[],"mappings":";;AAkBA,kCAsDC;AAvED,0CAAqH;AACrH,4CAA8C;AAE9C;;;;;;;;;;;;;GAaG;AACH,SAAgB,WAAW,CAAC,MAAkB;IAC5C,IAAA,yBAAc,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,IAAA,qCAA0B,EAAC,MAAM,CAAC,CAAC;IACnC,IAAA,gCAAqB,EAAC,MAAM,CAAC,CAAC;IAE9B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAS,qBAAqB;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAM,uBAAuB;IAExD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,mEAAmE;IACnE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/C,IAAA,8BAAmB,EAAC,CAAC,CAAC,CAAC;IAEvB,6CAA6C;IAC7C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CACnD,CAAC;IAEF,6BAA6B;IAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7C,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,IAAA,0BAAc,EAAC,GAAG,CAAC;YACnC,cAAc,EAAE,CAAC;YACjB,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAErC,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,KAAK;QACL,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,IAAA,0BAAc,EAAC,KAAK,CAAC;QACrC,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,CAAC;KACb,CAAC;AACJ,CAAC"}
|