@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,19 @@
|
|
|
1
|
+
import type { Label, AC1Result, AC1Options } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Computes Gwet's AC1 for two raters.
|
|
4
|
+
*
|
|
5
|
+
* Gwet's AC1 is designed to be robust to the prevalence and bias effects
|
|
6
|
+
* that can inflate or deflate Cohen's Kappa when category distributions are skewed.
|
|
7
|
+
*
|
|
8
|
+
* Formula:
|
|
9
|
+
* Po = observed agreement proportion
|
|
10
|
+
* q = number of categories
|
|
11
|
+
* p_k = marginal proportion for category k (average of both raters' proportions)
|
|
12
|
+
* Pe_gwet = (1/(q-1)) * Σ_k p_k * (1 - p_k)
|
|
13
|
+
* AC1 = (Po - Pe_gwet) / (1 - Pe_gwet)
|
|
14
|
+
*
|
|
15
|
+
* When q = 1, all items are in the same category; Pe_gwet = 0, AC1 = Po.
|
|
16
|
+
* Edge case: Pe_gwet >= 1 returns 1.0.
|
|
17
|
+
*/
|
|
18
|
+
export declare function gwetAC1(rater1: Label[], rater2: Label[], options?: AC1Options): AC1Result;
|
|
19
|
+
//# sourceMappingURL=gwet-ac1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gwet-ac1.d.ts","sourceRoot":"","sources":["../../src/metrics/gwet-ac1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI7D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,GAAE,UAAe,GACvB,SAAS,CA4DX"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gwetAC1 = gwetAC1;
|
|
4
|
+
const validate_1 = require("../validate");
|
|
5
|
+
const interpret_1 = require("../interpret");
|
|
6
|
+
/**
|
|
7
|
+
* Computes Gwet's AC1 for two raters.
|
|
8
|
+
*
|
|
9
|
+
* Gwet's AC1 is designed to be robust to the prevalence and bias effects
|
|
10
|
+
* that can inflate or deflate Cohen's Kappa when category distributions are skewed.
|
|
11
|
+
*
|
|
12
|
+
* Formula:
|
|
13
|
+
* Po = observed agreement proportion
|
|
14
|
+
* q = number of categories
|
|
15
|
+
* p_k = marginal proportion for category k (average of both raters' proportions)
|
|
16
|
+
* Pe_gwet = (1/(q-1)) * Σ_k p_k * (1 - p_k)
|
|
17
|
+
* AC1 = (Po - Pe_gwet) / (1 - Pe_gwet)
|
|
18
|
+
*
|
|
19
|
+
* When q = 1, all items are in the same category; Pe_gwet = 0, AC1 = Po.
|
|
20
|
+
* Edge case: Pe_gwet >= 1 returns 1.0.
|
|
21
|
+
*/
|
|
22
|
+
function gwetAC1(rater1, rater2, options = {} // reserved for future CI support
|
|
23
|
+
) {
|
|
24
|
+
void options;
|
|
25
|
+
(0, validate_1.assertNonEmpty)(rater1, 'rater1');
|
|
26
|
+
(0, validate_1.assertEqualLength)(rater1, rater2, '(rater1 vs rater2)');
|
|
27
|
+
const n = rater1.length;
|
|
28
|
+
// Build unique categories
|
|
29
|
+
const categorySet = new Set();
|
|
30
|
+
for (const v of rater1)
|
|
31
|
+
categorySet.add(v);
|
|
32
|
+
for (const v of rater2)
|
|
33
|
+
categorySet.add(v);
|
|
34
|
+
const categories = Array.from(categorySet);
|
|
35
|
+
const q = categories.length;
|
|
36
|
+
// Observed agreement
|
|
37
|
+
let agreements = 0;
|
|
38
|
+
for (let i = 0; i < n; i++) {
|
|
39
|
+
if (rater1[i] === rater2[i])
|
|
40
|
+
agreements++;
|
|
41
|
+
}
|
|
42
|
+
const Po = agreements / n;
|
|
43
|
+
// Marginal proportion for each category: average of rater1 and rater2 proportions
|
|
44
|
+
const counts1 = new Map();
|
|
45
|
+
const counts2 = new Map();
|
|
46
|
+
for (const v of rater1)
|
|
47
|
+
counts1.set(v, (counts1.get(v) ?? 0) + 1);
|
|
48
|
+
for (const v of rater2)
|
|
49
|
+
counts2.set(v, (counts2.get(v) ?? 0) + 1);
|
|
50
|
+
let Pe = 0;
|
|
51
|
+
if (q === 1) {
|
|
52
|
+
// Only one category; by definition Pe_gwet = 0
|
|
53
|
+
Pe = 0;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
for (const cat of categories) {
|
|
57
|
+
const p1k = (counts1.get(cat) ?? 0) / n;
|
|
58
|
+
const p2k = (counts2.get(cat) ?? 0) / n;
|
|
59
|
+
const pk = (p1k + p2k) / 2;
|
|
60
|
+
Pe += pk * (1 - pk);
|
|
61
|
+
}
|
|
62
|
+
Pe /= (q - 1);
|
|
63
|
+
}
|
|
64
|
+
if (Pe >= 1 - 1e-12) {
|
|
65
|
+
return {
|
|
66
|
+
metric: 'gwets-ac1',
|
|
67
|
+
value: 1.0,
|
|
68
|
+
observed: Po,
|
|
69
|
+
expected: Pe,
|
|
70
|
+
interpretation: (0, interpret_1.interpretKappa)(1.0),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const value = (Po - Pe) / (1 - Pe);
|
|
74
|
+
return {
|
|
75
|
+
metric: 'gwets-ac1',
|
|
76
|
+
value,
|
|
77
|
+
observed: Po,
|
|
78
|
+
expected: Pe,
|
|
79
|
+
interpretation: (0, interpret_1.interpretKappa)(value),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=gwet-ac1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gwet-ac1.js","sourceRoot":"","sources":["../../src/metrics/gwet-ac1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AlphaResult, KrippendorffOptions } from '../types';
|
|
2
|
+
type Cell = string | number | null | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* Computes Krippendorff's Alpha for multiple raters with optional missing data.
|
|
5
|
+
*
|
|
6
|
+
* Input: matrix[n_raters][n_items]
|
|
7
|
+
* Each cell is a label (string | number) or null/undefined for missing data.
|
|
8
|
+
*
|
|
9
|
+
* Nominal metric formula:
|
|
10
|
+
* Do = observed disagreement = mean of d(v_u, v_u') over all coincident pairs
|
|
11
|
+
* De = expected disagreement = (n_u / (n_u - 1)) * Σ_{v≠v'} n_v * n_v' / n_u²
|
|
12
|
+
* where n_u = total non-missing annotations, n_v = count of value v
|
|
13
|
+
* α = 1 - (Do / De)
|
|
14
|
+
*
|
|
15
|
+
* For nominal metric: d(v, v') = 0 if v == v', else 1.
|
|
16
|
+
*
|
|
17
|
+
* Edge case: De = 0 (all annotations identical) returns 1.0.
|
|
18
|
+
*/
|
|
19
|
+
export declare function krippendorffAlpha(matrix: Cell[][], options?: KrippendorffOptions): AlphaResult;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=krippendorff-alpha.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"krippendorff-alpha.d.ts","sourceRoot":"","sources":["../../src/metrics/krippendorff-alpha.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAIjE,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,IAAI,EAAE,EAAE,EAChB,OAAO,GAAE,mBAAwB,GAChC,WAAW,CAuIb"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.krippendorffAlpha = krippendorffAlpha;
|
|
4
|
+
const validate_1 = require("../validate");
|
|
5
|
+
const interpret_1 = require("../interpret");
|
|
6
|
+
/**
|
|
7
|
+
* Computes Krippendorff's Alpha for multiple raters with optional missing data.
|
|
8
|
+
*
|
|
9
|
+
* Input: matrix[n_raters][n_items]
|
|
10
|
+
* Each cell is a label (string | number) or null/undefined for missing data.
|
|
11
|
+
*
|
|
12
|
+
* Nominal metric formula:
|
|
13
|
+
* Do = observed disagreement = mean of d(v_u, v_u') over all coincident pairs
|
|
14
|
+
* De = expected disagreement = (n_u / (n_u - 1)) * Σ_{v≠v'} n_v * n_v' / n_u²
|
|
15
|
+
* where n_u = total non-missing annotations, n_v = count of value v
|
|
16
|
+
* α = 1 - (Do / De)
|
|
17
|
+
*
|
|
18
|
+
* For nominal metric: d(v, v') = 0 if v == v', else 1.
|
|
19
|
+
*
|
|
20
|
+
* Edge case: De = 0 (all annotations identical) returns 1.0.
|
|
21
|
+
*/
|
|
22
|
+
function krippendorffAlpha(matrix, options = {}) {
|
|
23
|
+
if (matrix.length === 0) {
|
|
24
|
+
throw new Error('Array must be non-empty');
|
|
25
|
+
}
|
|
26
|
+
const level = options.level ?? 'nominal';
|
|
27
|
+
const missingData = options.missingData ?? 'exclude';
|
|
28
|
+
const nRaters = matrix.length;
|
|
29
|
+
(0, validate_1.assertMinAnnotators)(nRaters);
|
|
30
|
+
const nItems = Math.max(...matrix.map(row => row.length));
|
|
31
|
+
if (nItems === 0) {
|
|
32
|
+
throw new Error('Array must be non-empty');
|
|
33
|
+
}
|
|
34
|
+
// Validate: check for missing data
|
|
35
|
+
let missingCount = 0;
|
|
36
|
+
for (let r = 0; r < nRaters; r++) {
|
|
37
|
+
for (let c = 0; c < nItems; c++) {
|
|
38
|
+
const cell = matrix[r][c];
|
|
39
|
+
if (cell === null || cell === undefined) {
|
|
40
|
+
missingCount++;
|
|
41
|
+
if (missingData === 'error') {
|
|
42
|
+
throw new Error(`Missing data found at rater ${r}, item ${c}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Build coincidence matrix: for each item, look at all pairs of raters
|
|
48
|
+
// that both annotated it, and tally their label pairs.
|
|
49
|
+
const valueCounts = new Map();
|
|
50
|
+
let totalAnnotations = 0;
|
|
51
|
+
// coincidences: Map from "v1|v2" to count (with fractional weighting)
|
|
52
|
+
const coincidences = new Map();
|
|
53
|
+
for (let c = 0; c < nItems; c++) {
|
|
54
|
+
// Collect non-missing annotations for this item
|
|
55
|
+
const itemLabels = [];
|
|
56
|
+
for (let r = 0; r < nRaters; r++) {
|
|
57
|
+
const cell = matrix[r][c];
|
|
58
|
+
if (cell !== null && cell !== undefined) {
|
|
59
|
+
itemLabels.push(cell);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const mu = itemLabels.length;
|
|
63
|
+
if (mu < 2)
|
|
64
|
+
continue; // need at least 2 annotations for a coincident pair
|
|
65
|
+
// Each pair (u, v) contributes 1/(mu - 1) to the coincidence count
|
|
66
|
+
const weight = 1 / (mu - 1);
|
|
67
|
+
for (let i = 0; i < mu; i++) {
|
|
68
|
+
for (let j = 0; j < mu; j++) {
|
|
69
|
+
if (i === j)
|
|
70
|
+
continue;
|
|
71
|
+
const vi = itemLabels[i];
|
|
72
|
+
const vj = itemLabels[j];
|
|
73
|
+
const key = JSON.stringify([vi, vj]);
|
|
74
|
+
coincidences.set(key, (coincidences.get(key) ?? 0) + weight);
|
|
75
|
+
}
|
|
76
|
+
// Count annotation for value distribution
|
|
77
|
+
const v = itemLabels[i];
|
|
78
|
+
valueCounts.set(v, (valueCounts.get(v) ?? 0) + 1);
|
|
79
|
+
totalAnnotations++;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (coincidences.size === 0) {
|
|
83
|
+
// No coincident pairs; return alpha = 1 (trivially)
|
|
84
|
+
return {
|
|
85
|
+
metric: 'krippendorff-alpha',
|
|
86
|
+
value: 1.0,
|
|
87
|
+
interpretation: (0, interpret_1.interpretAlpha)(1.0),
|
|
88
|
+
level,
|
|
89
|
+
itemCount: nItems,
|
|
90
|
+
annotatorCount: nRaters,
|
|
91
|
+
missingCount,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const nu = totalAnnotations; // total non-missing annotations across all coincident items
|
|
95
|
+
// Compute Do (observed disagreement)
|
|
96
|
+
let Do = 0;
|
|
97
|
+
let totalCoincidences = 0;
|
|
98
|
+
for (const [key, count] of coincidences) {
|
|
99
|
+
const [vi, vj] = JSON.parse(key);
|
|
100
|
+
const d = disagreement(vi, vj, level);
|
|
101
|
+
Do += d * count;
|
|
102
|
+
totalCoincidences += count;
|
|
103
|
+
}
|
|
104
|
+
if (totalCoincidences > 0) {
|
|
105
|
+
Do /= totalCoincidences;
|
|
106
|
+
}
|
|
107
|
+
// Compute De (expected disagreement)
|
|
108
|
+
// De = (1 / (nu*(nu-1))) * Σ_{v,v'} n_v * n_v' * d(v, v') where v != v'... actually:
|
|
109
|
+
// De = (1 / (nu*(nu-1))) * Σ_{v} Σ_{v'} n_v * n_v' * d(v, v')
|
|
110
|
+
// which includes v = v' (those contribute 0 for nominal)
|
|
111
|
+
const values = Array.from(valueCounts.keys());
|
|
112
|
+
let De = 0;
|
|
113
|
+
for (let i = 0; i < values.length; i++) {
|
|
114
|
+
for (let j = 0; j < values.length; j++) {
|
|
115
|
+
const nv = valueCounts.get(values[i]) ?? 0;
|
|
116
|
+
const nvp = valueCounts.get(values[j]) ?? 0;
|
|
117
|
+
const d = disagreement(values[i], values[j], level);
|
|
118
|
+
De += nv * nvp * d;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
De /= nu * (nu - 1);
|
|
122
|
+
if (De < 1e-12) {
|
|
123
|
+
// All annotations identical — perfect agreement
|
|
124
|
+
return {
|
|
125
|
+
metric: 'krippendorff-alpha',
|
|
126
|
+
value: 1.0,
|
|
127
|
+
interpretation: (0, interpret_1.interpretAlpha)(1.0),
|
|
128
|
+
level,
|
|
129
|
+
itemCount: nItems,
|
|
130
|
+
annotatorCount: nRaters,
|
|
131
|
+
missingCount,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const value = 1 - Do / De;
|
|
135
|
+
return {
|
|
136
|
+
metric: 'krippendorff-alpha',
|
|
137
|
+
value,
|
|
138
|
+
interpretation: (0, interpret_1.interpretAlpha)(value),
|
|
139
|
+
level,
|
|
140
|
+
itemCount: nItems,
|
|
141
|
+
annotatorCount: nRaters,
|
|
142
|
+
missingCount,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Disagreement function d(v, v') by measurement level.
|
|
147
|
+
* For nominal: 0 if equal, 1 otherwise.
|
|
148
|
+
* For ordinal: (rank distance)² / (max rank distance)² — simplified to rank-distance based.
|
|
149
|
+
* For interval/ratio: (v - v')².
|
|
150
|
+
*/
|
|
151
|
+
function disagreement(v, vp, level) {
|
|
152
|
+
if (level === 'nominal') {
|
|
153
|
+
return v === vp ? 0 : 1;
|
|
154
|
+
}
|
|
155
|
+
if (level === 'interval' || level === 'ratio') {
|
|
156
|
+
const diff = Number(v) - Number(vp);
|
|
157
|
+
return diff * diff;
|
|
158
|
+
}
|
|
159
|
+
// ordinal: treat as nominal for simplicity (rank-based would need sorted category list)
|
|
160
|
+
return v === vp ? 0 : 1;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=krippendorff-alpha.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"krippendorff-alpha.js","sourceRoot":"","sources":["../../src/metrics/krippendorff-alpha.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Label, PiResult, ScottsPiOptions } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Computes Scott's Pi for two raters.
|
|
4
|
+
*
|
|
5
|
+
* Scott's Pi differs from Cohen's Kappa in how expected agreement is computed.
|
|
6
|
+
* Instead of using each rater's own marginal proportions separately, it uses
|
|
7
|
+
* the joint (averaged) marginal proportions from both raters combined.
|
|
8
|
+
*
|
|
9
|
+
* Formula:
|
|
10
|
+
* Po = observed agreement proportion
|
|
11
|
+
* p_k = (count_rater1(k) + count_rater2(k)) / (2 * n) (joint marginal)
|
|
12
|
+
* Pe = Σ_k p_k²
|
|
13
|
+
* π = (Po - Pe) / (1 - Pe)
|
|
14
|
+
*
|
|
15
|
+
* Edge case: Pe = 1 returns 1.0.
|
|
16
|
+
*/
|
|
17
|
+
export declare function scottPi(rater1: Label[], rater2: Label[], options?: ScottsPiOptions): PiResult;
|
|
18
|
+
//# sourceMappingURL=scott-pi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scott-pi.d.ts","sourceRoot":"","sources":["../../src/metrics/scott-pi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIjE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CAqDV"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scottPi = scottPi;
|
|
4
|
+
const validate_1 = require("../validate");
|
|
5
|
+
const interpret_1 = require("../interpret");
|
|
6
|
+
/**
|
|
7
|
+
* Computes Scott's Pi for two raters.
|
|
8
|
+
*
|
|
9
|
+
* Scott's Pi differs from Cohen's Kappa in how expected agreement is computed.
|
|
10
|
+
* Instead of using each rater's own marginal proportions separately, it uses
|
|
11
|
+
* the joint (averaged) marginal proportions from both raters combined.
|
|
12
|
+
*
|
|
13
|
+
* Formula:
|
|
14
|
+
* Po = observed agreement proportion
|
|
15
|
+
* p_k = (count_rater1(k) + count_rater2(k)) / (2 * n) (joint marginal)
|
|
16
|
+
* Pe = Σ_k p_k²
|
|
17
|
+
* π = (Po - Pe) / (1 - Pe)
|
|
18
|
+
*
|
|
19
|
+
* Edge case: Pe = 1 returns 1.0.
|
|
20
|
+
*/
|
|
21
|
+
function scottPi(rater1, rater2, options = {} // reserved for future CI support
|
|
22
|
+
) {
|
|
23
|
+
void options;
|
|
24
|
+
(0, validate_1.assertNonEmpty)(rater1, 'rater1');
|
|
25
|
+
(0, validate_1.assertEqualLength)(rater1, rater2, '(rater1 vs rater2)');
|
|
26
|
+
const n = rater1.length;
|
|
27
|
+
// Build unique categories
|
|
28
|
+
const categorySet = new Set();
|
|
29
|
+
for (const v of rater1)
|
|
30
|
+
categorySet.add(v);
|
|
31
|
+
for (const v of rater2)
|
|
32
|
+
categorySet.add(v);
|
|
33
|
+
const categories = Array.from(categorySet).sort((a, b) => String(a).localeCompare(String(b)));
|
|
34
|
+
// Observed agreement
|
|
35
|
+
let agreements = 0;
|
|
36
|
+
for (let i = 0; i < n; i++) {
|
|
37
|
+
if (rater1[i] === rater2[i])
|
|
38
|
+
agreements++;
|
|
39
|
+
}
|
|
40
|
+
const Po = agreements / n;
|
|
41
|
+
// Joint marginal proportions
|
|
42
|
+
const counts = new Map();
|
|
43
|
+
for (const v of rater1)
|
|
44
|
+
counts.set(v, (counts.get(v) ?? 0) + 1);
|
|
45
|
+
for (const v of rater2)
|
|
46
|
+
counts.set(v, (counts.get(v) ?? 0) + 1);
|
|
47
|
+
// Pe = Σ_k ((count1_k + count2_k) / (2n))²
|
|
48
|
+
let Pe = 0;
|
|
49
|
+
for (const count of counts.values()) {
|
|
50
|
+
const pk = count / (2 * n);
|
|
51
|
+
Pe += pk * pk;
|
|
52
|
+
}
|
|
53
|
+
if (Pe >= 1 - 1e-12) {
|
|
54
|
+
return {
|
|
55
|
+
metric: 'scotts-pi',
|
|
56
|
+
value: 1.0,
|
|
57
|
+
observed: Po,
|
|
58
|
+
expected: Pe,
|
|
59
|
+
interpretation: (0, interpret_1.interpretKappa)(1.0),
|
|
60
|
+
categories,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const value = (Po - Pe) / (1 - Pe);
|
|
64
|
+
return {
|
|
65
|
+
metric: 'scotts-pi',
|
|
66
|
+
value,
|
|
67
|
+
observed: Po,
|
|
68
|
+
expected: Pe,
|
|
69
|
+
interpretation: (0, interpret_1.interpretKappa)(value),
|
|
70
|
+
categories,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=scott-pi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scott-pi.js","sourceRoot":"","sources":["../../src/metrics/scott-pi.ts"],"names":[],"mappings":";;AAmBA,0BAyDC;AA3ED,0CAAgE;AAChE,4CAA8C;AAE9C;;;;;;;;;;;;;;GAcG;AACH,SAAgB,OAAO,CACrB,MAAe,EACf,MAAe,EACf,UAA2B,EAAE,CAAE,iCAAiC;;IAEhE,KAAK,OAAO,CAAC;IACb,IAAA,yBAAc,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,IAAA,4BAAiB,EAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAExD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAExB,0BAA0B;IAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAS,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,qBAAqB;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;YAAE,UAAU,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC;IAE1B,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhE,2CAA2C;IAC3C,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,IAAA,0BAAc,EAAC,GAAG,CAAC;YACnC,UAAU;SACX,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnC,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,KAAK;QACL,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,IAAA,0BAAc,EAAC,KAAK,CAAC;QACrC,UAAU;KACX,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export type Label = string | number;
|
|
2
|
+
export type MeasurementLevel = 'nominal' | 'ordinal' | 'interval' | 'ratio';
|
|
3
|
+
export type MetricName = 'cohens-kappa' | 'fleiss-kappa' | 'krippendorff-alpha' | 'scotts-pi' | 'gwets-ac1' | 'percent-agreement';
|
|
4
|
+
export type AnnotationTriple = {
|
|
5
|
+
item: string | number;
|
|
6
|
+
annotator: string | number;
|
|
7
|
+
label: Label;
|
|
8
|
+
};
|
|
9
|
+
export type Interpretation = 'poor' | 'slight' | 'fair' | 'moderate' | 'substantial' | 'almost-perfect';
|
|
10
|
+
export type AlphaInterpretation = 'unreliable' | 'tentative' | 'reliable';
|
|
11
|
+
export interface ConfidenceInterval {
|
|
12
|
+
lower: number;
|
|
13
|
+
upper: number;
|
|
14
|
+
level: number;
|
|
15
|
+
}
|
|
16
|
+
export interface KappaResult {
|
|
17
|
+
metric: MetricName;
|
|
18
|
+
value: number;
|
|
19
|
+
observed: number;
|
|
20
|
+
expected: number;
|
|
21
|
+
interpretation: Interpretation;
|
|
22
|
+
ci?: ConfidenceInterval;
|
|
23
|
+
categories?: Label[];
|
|
24
|
+
}
|
|
25
|
+
export interface FleissKappaResult {
|
|
26
|
+
metric: 'fleiss-kappa';
|
|
27
|
+
value: number;
|
|
28
|
+
observed: number;
|
|
29
|
+
expected: number;
|
|
30
|
+
interpretation: Interpretation;
|
|
31
|
+
ci?: ConfidenceInterval;
|
|
32
|
+
annotatorCount: number;
|
|
33
|
+
itemCount: number;
|
|
34
|
+
}
|
|
35
|
+
export interface AlphaResult {
|
|
36
|
+
metric: 'krippendorff-alpha';
|
|
37
|
+
value: number;
|
|
38
|
+
interpretation: AlphaInterpretation;
|
|
39
|
+
level: MeasurementLevel;
|
|
40
|
+
ci?: ConfidenceInterval;
|
|
41
|
+
itemCount: number;
|
|
42
|
+
annotatorCount: number;
|
|
43
|
+
missingCount: number;
|
|
44
|
+
}
|
|
45
|
+
export interface PiResult {
|
|
46
|
+
metric: 'scotts-pi';
|
|
47
|
+
value: number;
|
|
48
|
+
observed: number;
|
|
49
|
+
expected: number;
|
|
50
|
+
interpretation: Interpretation;
|
|
51
|
+
ci?: ConfidenceInterval;
|
|
52
|
+
categories?: Label[];
|
|
53
|
+
}
|
|
54
|
+
export interface AC1Result {
|
|
55
|
+
metric: 'gwets-ac1';
|
|
56
|
+
value: number;
|
|
57
|
+
observed: number;
|
|
58
|
+
expected: number;
|
|
59
|
+
interpretation: Interpretation;
|
|
60
|
+
ci?: ConfidenceInterval;
|
|
61
|
+
}
|
|
62
|
+
export interface ConfusionMatrix {
|
|
63
|
+
labels: Label[];
|
|
64
|
+
matrix: number[][];
|
|
65
|
+
}
|
|
66
|
+
export interface CohensKappaOptions {
|
|
67
|
+
weighted?: boolean;
|
|
68
|
+
weights?: 'linear' | 'quadratic';
|
|
69
|
+
ci?: boolean;
|
|
70
|
+
ciLevel?: number;
|
|
71
|
+
ciBootstrapSamples?: number;
|
|
72
|
+
seed?: number;
|
|
73
|
+
}
|
|
74
|
+
export interface FleissKappaOptions {
|
|
75
|
+
ci?: boolean;
|
|
76
|
+
ciLevel?: number;
|
|
77
|
+
ciBootstrapSamples?: number;
|
|
78
|
+
seed?: number;
|
|
79
|
+
}
|
|
80
|
+
export interface KrippendorffOptions {
|
|
81
|
+
level?: MeasurementLevel;
|
|
82
|
+
ci?: boolean;
|
|
83
|
+
ciLevel?: number;
|
|
84
|
+
ciBootstrapSamples?: number;
|
|
85
|
+
seed?: number;
|
|
86
|
+
missingData?: 'exclude' | 'error';
|
|
87
|
+
}
|
|
88
|
+
export interface ScottsPiOptions {
|
|
89
|
+
ci?: boolean;
|
|
90
|
+
ciLevel?: number;
|
|
91
|
+
ciBootstrapSamples?: number;
|
|
92
|
+
seed?: number;
|
|
93
|
+
}
|
|
94
|
+
export interface AC1Options {
|
|
95
|
+
ci?: boolean;
|
|
96
|
+
ciLevel?: number;
|
|
97
|
+
ciBootstrapSamples?: number;
|
|
98
|
+
seed?: number;
|
|
99
|
+
}
|
|
100
|
+
export interface AgreementOptions {
|
|
101
|
+
metric?: MetricName;
|
|
102
|
+
level?: MeasurementLevel;
|
|
103
|
+
missingData?: 'exclude' | 'error';
|
|
104
|
+
ci?: boolean;
|
|
105
|
+
ciLevel?: number;
|
|
106
|
+
seed?: number;
|
|
107
|
+
}
|
|
108
|
+
export interface CIOptions {
|
|
109
|
+
level?: number;
|
|
110
|
+
bootstrapSamples?: number;
|
|
111
|
+
seed?: number;
|
|
112
|
+
}
|
|
113
|
+
export interface AgreementReport {
|
|
114
|
+
metric: MetricName;
|
|
115
|
+
value: number;
|
|
116
|
+
interpretation: Interpretation | AlphaInterpretation;
|
|
117
|
+
ci?: ConfidenceInterval;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Throws if a and b do not have the same length.
|
|
3
|
+
*/
|
|
4
|
+
export declare function assertEqualLength(a: unknown[], b: unknown[], label?: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Throws if arr is empty.
|
|
7
|
+
*/
|
|
8
|
+
export declare function assertNonEmpty(arr: unknown[], label?: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Throws if the rows of a 2-D matrix do not all have the same length.
|
|
11
|
+
*/
|
|
12
|
+
export declare function assertConsistentRowLengths(matrix: unknown[][]): void;
|
|
13
|
+
/**
|
|
14
|
+
* Throws if rows of a numeric matrix do not all sum to the same value
|
|
15
|
+
* (within floating-point tolerance).
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertConstantRowSums(matrix: number[][]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Throws if count is less than 2.
|
|
20
|
+
*/
|
|
21
|
+
export declare function assertMinAnnotators(count: number): void;
|
|
22
|
+
/**
|
|
23
|
+
* Returns the (item, annotator) pairs that appear more than once in the given
|
|
24
|
+
* array of triples. Each duplicate pair is returned only once.
|
|
25
|
+
*/
|
|
26
|
+
export declare function detectDuplicates(triples: Array<{
|
|
27
|
+
item: unknown;
|
|
28
|
+
annotator: unknown;
|
|
29
|
+
}>): Array<{
|
|
30
|
+
item: unknown;
|
|
31
|
+
annotator: unknown;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAKlF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAKnE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAQpE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAW9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,GACpD,KAAK,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAc9C"}
|