@cogitator-ai/evals 0.10.0 → 0.12.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/README.md +91 -15
- package/dist/calibrate-judge.d.ts +53 -0
- package/dist/calibrate-judge.d.ts.map +1 -0
- package/dist/calibrate-judge.js +114 -0
- package/dist/calibrate-judge.js.map +1 -0
- package/dist/datasets/dataset.d.ts.map +1 -1
- package/dist/datasets/dataset.js +3 -27
- package/dist/datasets/dataset.js.map +1 -1
- package/dist/eval-comparison.d.ts +71 -2
- package/dist/eval-comparison.d.ts.map +1 -1
- package/dist/eval-comparison.js +149 -42
- package/dist/eval-comparison.js.map +1 -1
- package/dist/index.d.ts +17 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/metrics/deterministic.d.ts +1 -0
- package/dist/metrics/deterministic.d.ts.map +1 -1
- package/dist/metrics/deterministic.js +49 -4
- package/dist/metrics/deterministic.js.map +1 -1
- package/dist/metrics/g-eval.d.ts +29 -0
- package/dist/metrics/g-eval.d.ts.map +1 -0
- package/dist/metrics/g-eval.js +89 -0
- package/dist/metrics/g-eval.js.map +1 -0
- package/dist/metrics/index.d.ts +4 -2
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +2 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/judge-prompt.d.ts +31 -0
- package/dist/metrics/judge-prompt.d.ts.map +1 -0
- package/dist/metrics/judge-prompt.js +90 -0
- package/dist/metrics/judge-prompt.js.map +1 -0
- package/dist/metrics/llm-judge.d.ts +96 -9
- package/dist/metrics/llm-judge.d.ts.map +1 -1
- package/dist/metrics/llm-judge.js +265 -120
- package/dist/metrics/llm-judge.js.map +1 -1
- package/dist/options.d.ts +4 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +9 -0
- package/dist/options.js.map +1 -0
- package/dist/pairwise.d.ts +53 -0
- package/dist/pairwise.d.ts.map +1 -0
- package/dist/pairwise.js +118 -0
- package/dist/pairwise.js.map +1 -0
- package/dist/schema.d.ts +16 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +17 -0
- package/dist/schema.js.map +1 -1
- package/dist/stats/bootstrap.d.ts +22 -0
- package/dist/stats/bootstrap.d.ts.map +1 -0
- package/dist/stats/bootstrap.js +34 -0
- package/dist/stats/bootstrap.js.map +1 -0
- package/dist/stats/correlation.d.ts +11 -0
- package/dist/stats/correlation.d.ts.map +1 -0
- package/dist/stats/correlation.js +42 -0
- package/dist/stats/correlation.js.map +1 -0
- package/dist/stats/effect-size.d.ts +7 -0
- package/dist/stats/effect-size.d.ts.map +1 -0
- package/dist/stats/effect-size.js +17 -0
- package/dist/stats/effect-size.js.map +1 -0
- package/dist/stats/holm.d.ts +7 -0
- package/dist/stats/holm.d.ts.map +1 -0
- package/dist/stats/holm.js +21 -0
- package/dist/stats/holm.js.map +1 -0
- package/dist/stats/index.d.ts +10 -2
- package/dist/stats/index.d.ts.map +1 -1
- package/dist/stats/index.js +7 -1
- package/dist/stats/index.js.map +1 -1
- package/dist/stats/mcnemar.d.ts +9 -0
- package/dist/stats/mcnemar.d.ts.map +1 -1
- package/dist/stats/mcnemar.js +27 -13
- package/dist/stats/mcnemar.js.map +1 -1
- package/dist/stats/normal.d.ts +5 -0
- package/dist/stats/normal.d.ts.map +1 -0
- package/dist/stats/normal.js +19 -0
- package/dist/stats/normal.js.map +1 -0
- package/dist/stats/precision.d.ts +12 -0
- package/dist/stats/precision.d.ts.map +1 -0
- package/dist/stats/precision.js +29 -0
- package/dist/stats/precision.js.map +1 -0
- package/dist/stats/random.d.ts +6 -0
- package/dist/stats/random.d.ts.map +1 -0
- package/dist/stats/random.js +25 -0
- package/dist/stats/random.js.map +1 -0
- package/dist/stats/ranks.d.ts +5 -0
- package/dist/stats/ranks.d.ts.map +1 -0
- package/dist/stats/ranks.js +24 -0
- package/dist/stats/ranks.js.map +1 -0
- package/dist/stats/t-test.d.ts +4 -0
- package/dist/stats/t-test.d.ts.map +1 -1
- package/dist/stats/t-test.js +9 -3
- package/dist/stats/t-test.js.map +1 -1
- package/dist/stats/wilcoxon.d.ts +19 -0
- package/dist/stats/wilcoxon.d.ts.map +1 -0
- package/dist/stats/wilcoxon.js +70 -0
- package/dist/stats/wilcoxon.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Complementary error function (Abramowitz and Stegun 7.1.26, absolute error below 1.5e-7) */
|
|
2
|
+
export declare function erfc(x: number): number;
|
|
3
|
+
/** Two-sided p-value of a standard normal statistic `z` */
|
|
4
|
+
export declare function normalTwoSidedP(z: number): number;
|
|
5
|
+
//# sourceMappingURL=normal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normal.d.ts","sourceRoot":"","sources":["../../src/stats/normal.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CActC;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Complementary error function (Abramowitz and Stegun 7.1.26, absolute error below 1.5e-7) */
|
|
2
|
+
export function erfc(x) {
|
|
3
|
+
const a1 = 0.254829592;
|
|
4
|
+
const a2 = -0.284496736;
|
|
5
|
+
const a3 = 1.421413741;
|
|
6
|
+
const a4 = -1.453152027;
|
|
7
|
+
const a5 = 1.061405429;
|
|
8
|
+
const p = 0.3275911;
|
|
9
|
+
const sign = x < 0 ? -1 : 1;
|
|
10
|
+
const absX = Math.abs(x);
|
|
11
|
+
const t = 1.0 / (1.0 + p * absX);
|
|
12
|
+
const y = 1.0 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-absX * absX);
|
|
13
|
+
return 1.0 - sign * y;
|
|
14
|
+
}
|
|
15
|
+
/** Two-sided p-value of a standard normal statistic `z` */
|
|
16
|
+
export function normalTwoSidedP(z) {
|
|
17
|
+
return Math.min(1, erfc(Math.abs(z) / Math.SQRT2));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=normal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normal.js","sourceRoot":"","sources":["../../src/stats/normal.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,UAAU,IAAI,CAAC,CAAS;IAC5B,MAAM,EAAE,GAAG,WAAW,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC;IACxB,MAAM,EAAE,GAAG,WAAW,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC;IACxB,MAAM,EAAE,GAAG,WAAW,CAAC;IACvB,MAAM,CAAC,GAAG,SAAS,CAAC;IAEpB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAE5F,OAAO,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** A value rounded to 12 significant digits, so float noise such as 0.29999999999999993 reads 0.3 */
|
|
2
|
+
export declare function withoutNoise(value: number): number;
|
|
3
|
+
/**
|
|
4
|
+
* `a - b` on a grid of 12 significant digits of the larger of `a` and `b`, where the float noise
|
|
5
|
+
* of the subtraction lives, so `0.7 - 0.4` and `0.6 - 0.9` tie in magnitude, so do
|
|
6
|
+
* `12345.9 - 12345.7` and `98765.7 - 98765.5`, and two means of the same trials differ by nothing.
|
|
7
|
+
* An infinite or NaN difference stays as it is.
|
|
8
|
+
*/
|
|
9
|
+
export declare function pairedDifference(a: number, b: number): number;
|
|
10
|
+
/** Whether every value is the same */
|
|
11
|
+
export declare function isConstant(values: readonly number[]): boolean;
|
|
12
|
+
//# sourceMappingURL=precision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precision.d.ts","sourceRoot":"","sources":["../../src/stats/precision.ts"],"names":[],"mappings":"AAEA,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAED,sCAAsC;AACtC,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const SIGNIFICANT_DIGITS = 12;
|
|
2
|
+
/** A value rounded to 12 significant digits, so float noise such as 0.29999999999999993 reads 0.3 */
|
|
3
|
+
export function withoutNoise(value) {
|
|
4
|
+
return value === 0 || !Number.isFinite(value)
|
|
5
|
+
? value
|
|
6
|
+
: Number(value.toPrecision(SIGNIFICANT_DIGITS));
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* `a - b` on a grid of 12 significant digits of the larger of `a` and `b`, where the float noise
|
|
10
|
+
* of the subtraction lives, so `0.7 - 0.4` and `0.6 - 0.9` tie in magnitude, so do
|
|
11
|
+
* `12345.9 - 12345.7` and `98765.7 - 98765.5`, and two means of the same trials differ by nothing.
|
|
12
|
+
* An infinite or NaN difference stays as it is.
|
|
13
|
+
*/
|
|
14
|
+
export function pairedDifference(a, b) {
|
|
15
|
+
const difference = a - b;
|
|
16
|
+
if (!Number.isFinite(difference))
|
|
17
|
+
return difference;
|
|
18
|
+
const scale = Math.max(Math.abs(a), Math.abs(b));
|
|
19
|
+
if (scale === 0)
|
|
20
|
+
return 0;
|
|
21
|
+
const step = 10 ** (Math.floor(Math.log10(scale)) - (SIGNIFICANT_DIGITS - 1));
|
|
22
|
+
const snapped = Math.round(difference / step) * step;
|
|
23
|
+
return snapped === 0 ? 0 : withoutNoise(snapped);
|
|
24
|
+
}
|
|
25
|
+
/** Whether every value is the same */
|
|
26
|
+
export function isConstant(values) {
|
|
27
|
+
return values.every((value) => value === values[0]);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=precision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precision.js","sourceRoot":"","sources":["../../src/stats/precision.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,qGAAqG;AACrG,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3C,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,CAAS;IACnD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Math.random`, or a mulberry32 generator seeded by the FNV-1a hash of `seed`, so every number
|
|
3
|
+
* and string seeds its own sequence (`1.2` and `1.7`, `-1` and `2 ** 32 - 1` alike)
|
|
4
|
+
*/
|
|
5
|
+
export declare function seededRandom(seed: number | string | undefined): () => number;
|
|
6
|
+
//# sourceMappingURL=random.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/stats/random.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,MAAM,CAU5E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Math.random`, or a mulberry32 generator seeded by the FNV-1a hash of `seed`, so every number
|
|
3
|
+
* and string seeds its own sequence (`1.2` and `1.7`, `-1` and `2 ** 32 - 1` alike)
|
|
4
|
+
*/
|
|
5
|
+
export function seededRandom(seed) {
|
|
6
|
+
if (seed === undefined)
|
|
7
|
+
return Math.random;
|
|
8
|
+
let state = hashSeed(String(seed));
|
|
9
|
+
return () => {
|
|
10
|
+
state = (state + 0x6d2b79f5) >>> 0;
|
|
11
|
+
let t = state;
|
|
12
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
13
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
14
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function hashSeed(seed) {
|
|
18
|
+
let hash = 0x811c9dc5;
|
|
19
|
+
for (let i = 0; i < seed.length; i++) {
|
|
20
|
+
hash ^= seed.charCodeAt(i);
|
|
21
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
22
|
+
}
|
|
23
|
+
return hash;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/stats/random.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAiC;IAC5D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC3C,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,OAAO,GAAG,EAAE;QACV,KAAK,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The rank of each value from 1 up, tied values sharing the mean of their ranks */
|
|
2
|
+
export declare function averageRanks(values: readonly number[]): number[];
|
|
3
|
+
/** The sizes of the groups of tied values, groups of one left out */
|
|
4
|
+
export declare function tieGroups(values: readonly number[]): number[];
|
|
5
|
+
//# sourceMappingURL=ranks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranks.d.ts","sourceRoot":"","sources":["../../src/stats/ranks.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAYhE;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI7D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** The rank of each value from 1 up, tied values sharing the mean of their ranks */
|
|
2
|
+
export function averageRanks(values) {
|
|
3
|
+
const order = values.map((value, index) => ({ value, index })).sort((a, b) => a.value - b.value);
|
|
4
|
+
const ranks = new Array(values.length);
|
|
5
|
+
let start = 0;
|
|
6
|
+
while (start < order.length) {
|
|
7
|
+
let end = start;
|
|
8
|
+
while (end + 1 < order.length && order[end + 1].value === order[start].value)
|
|
9
|
+
end++;
|
|
10
|
+
const rank = (start + end) / 2 + 1;
|
|
11
|
+
for (let at = start; at <= end; at++)
|
|
12
|
+
ranks[order[at].index] = rank;
|
|
13
|
+
start = end + 1;
|
|
14
|
+
}
|
|
15
|
+
return ranks;
|
|
16
|
+
}
|
|
17
|
+
/** The sizes of the groups of tied values, groups of one left out */
|
|
18
|
+
export function tieGroups(values) {
|
|
19
|
+
const counts = new Map();
|
|
20
|
+
for (const value of values)
|
|
21
|
+
counts.set(value, (counts.get(value) ?? 0) + 1);
|
|
22
|
+
return [...counts.values()].filter((count) => count > 1);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ranks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranks.js","sourceRoot":"","sources":["../../src/stats/ranks.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK;YAAE,GAAG,EAAE,CAAC;QACpF,MAAM,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,KAAK,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;YAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACpE,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,SAAS,CAAC,MAAyB;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/stats/t-test.d.ts
CHANGED
|
@@ -5,5 +5,9 @@ export interface TTestResult {
|
|
|
5
5
|
significant: boolean;
|
|
6
6
|
confidenceInterval: [number, number];
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Paired t-test, two-sided. The differences `a - b` are rounded to 12 significant digits first,
|
|
10
|
+
* so a constant difference with float noise counts as constant
|
|
11
|
+
*/
|
|
8
12
|
export declare function pairedTTest(samplesA: number[], samplesB: number[]): TTestResult;
|
|
9
13
|
//# sourceMappingURL=t-test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"t-test.d.ts","sourceRoot":"","sources":["../../src/stats/t-test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"t-test.d.ts","sourceRoot":"","sources":["../../src/stats/t-test.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAkGD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,CA6C/E"}
|
package/dist/stats/t-test.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { mean, stdDev } from './percentiles.js';
|
|
2
|
+
import { isConstant, pairedDifference } from './precision.js';
|
|
2
3
|
function lnGamma(z) {
|
|
3
4
|
const g = 7;
|
|
4
5
|
const coefficients = [
|
|
@@ -88,6 +89,10 @@ function tDistQuantile(p, df) {
|
|
|
88
89
|
}
|
|
89
90
|
return (lo + hi) / 2;
|
|
90
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Paired t-test, two-sided. The differences `a - b` are rounded to 12 significant digits first,
|
|
94
|
+
* so a constant difference with float noise counts as constant
|
|
95
|
+
*/
|
|
91
96
|
export function pairedTTest(samplesA, samplesB) {
|
|
92
97
|
if (samplesA.length !== samplesB.length) {
|
|
93
98
|
throw new Error('Sample arrays must have equal length');
|
|
@@ -98,10 +103,11 @@ export function pairedTTest(samplesA, samplesB) {
|
|
|
98
103
|
const n = samplesA.length;
|
|
99
104
|
const diffs = new Array(n);
|
|
100
105
|
for (let i = 0; i < n; i++) {
|
|
101
|
-
diffs[i] = samplesA[i]
|
|
106
|
+
diffs[i] = pairedDifference(samplesA[i], samplesB[i]);
|
|
102
107
|
}
|
|
103
|
-
const
|
|
104
|
-
const
|
|
108
|
+
const constant = isConstant(diffs);
|
|
109
|
+
const meanD = constant ? diffs[0] : mean(diffs);
|
|
110
|
+
const sdD = constant ? 0 : stdDev(diffs);
|
|
105
111
|
const df = n - 1;
|
|
106
112
|
if (sdD === 0) {
|
|
107
113
|
return {
|
package/dist/stats/t-test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"t-test.js","sourceRoot":"","sources":["../../src/stats/t-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"t-test.js","sourceRoot":"","sources":["../../src/stats/t-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface WilcoxonResult {
|
|
2
|
+
/** W+: the sum of the ranks of the positive differences `a - b` */
|
|
3
|
+
statistic: number;
|
|
4
|
+
/** Pairs left once the zero differences are dropped */
|
|
5
|
+
n: number;
|
|
6
|
+
pValue: number;
|
|
7
|
+
significant: boolean;
|
|
8
|
+
/** `exact` for up to 20 pairs, `normal` (with tie and continuity corrections) above */
|
|
9
|
+
method: 'exact' | 'normal';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Wilcoxon signed-rank test of paired samples, two-sided. The differences `a - b` are rounded to
|
|
13
|
+
* 12 significant digits first, so float noise neither splits ties nor hides a zero. Zero differences are dropped
|
|
14
|
+
* (Wilcoxon's handling, not Pratt's), tied absolute differences share their mean rank. The
|
|
15
|
+
* p-value is exact for up to 20 nonzero pairs, ties included, and from the normal approximation
|
|
16
|
+
* with tie and continuity corrections above
|
|
17
|
+
*/
|
|
18
|
+
export declare function wilcoxonSignedRank(samplesA: readonly number[], samplesB: readonly number[]): WilcoxonResult;
|
|
19
|
+
//# sourceMappingURL=wilcoxon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wilcoxon.d.ts","sourceRoot":"","sources":["../../src/stats/wilcoxon.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,uFAAuF;IACvF,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC5B;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,cAAc,CAuBhB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { normalTwoSidedP } from './normal.js';
|
|
2
|
+
import { averageRanks, tieGroups } from './ranks.js';
|
|
3
|
+
import { pairedDifference } from './precision.js';
|
|
4
|
+
const EXACT_UP_TO = 20;
|
|
5
|
+
/**
|
|
6
|
+
* Wilcoxon signed-rank test of paired samples, two-sided. The differences `a - b` are rounded to
|
|
7
|
+
* 12 significant digits first, so float noise neither splits ties nor hides a zero. Zero differences are dropped
|
|
8
|
+
* (Wilcoxon's handling, not Pratt's), tied absolute differences share their mean rank. The
|
|
9
|
+
* p-value is exact for up to 20 nonzero pairs, ties included, and from the normal approximation
|
|
10
|
+
* with tie and continuity corrections above
|
|
11
|
+
*/
|
|
12
|
+
export function wilcoxonSignedRank(samplesA, samplesB) {
|
|
13
|
+
if (samplesA.length !== samplesB.length) {
|
|
14
|
+
throw new Error('Sample arrays must have equal length');
|
|
15
|
+
}
|
|
16
|
+
const differences = samplesA
|
|
17
|
+
.map((a, i) => pairedDifference(a, samplesB[i]))
|
|
18
|
+
.filter((d) => d !== 0);
|
|
19
|
+
const n = differences.length;
|
|
20
|
+
if (n === 0)
|
|
21
|
+
return { statistic: 0, n: 0, pValue: 1, significant: false, method: 'exact' };
|
|
22
|
+
const magnitudes = differences.map(Math.abs);
|
|
23
|
+
const ranks = averageRanks(magnitudes);
|
|
24
|
+
const statistic = ranks.reduce((sum, rank, i) => (differences[i] > 0 ? sum + rank : sum), 0);
|
|
25
|
+
const pValue = n <= EXACT_UP_TO ? exactP(ranks, statistic) : normalP(n, statistic, tieGroups(magnitudes));
|
|
26
|
+
return {
|
|
27
|
+
statistic,
|
|
28
|
+
n,
|
|
29
|
+
pValue,
|
|
30
|
+
significant: pValue < 0.05,
|
|
31
|
+
method: n <= EXACT_UP_TO ? 'exact' : 'normal',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The exact two-sided p-value of W+ over every assignment of signs to the ranks, counted on
|
|
36
|
+
* doubled ranks so mean ranks of ties stay integers
|
|
37
|
+
*/
|
|
38
|
+
function exactP(ranks, statistic) {
|
|
39
|
+
const doubled = ranks.map((rank) => Math.round(rank * 2));
|
|
40
|
+
const total = doubled.reduce((sum, r) => sum + r, 0);
|
|
41
|
+
let counts = new Array(total + 1).fill(0);
|
|
42
|
+
counts[0] = 1;
|
|
43
|
+
for (const r of doubled) {
|
|
44
|
+
const next = [...counts];
|
|
45
|
+
for (let s = 0; s + r <= total; s++)
|
|
46
|
+
next[s + r] += counts[s];
|
|
47
|
+
counts = next;
|
|
48
|
+
}
|
|
49
|
+
const observed = Math.round(statistic * 2);
|
|
50
|
+
const outcomes = 2 ** ranks.length;
|
|
51
|
+
let lower = 0;
|
|
52
|
+
let upper = 0;
|
|
53
|
+
for (let s = 0; s <= total; s++) {
|
|
54
|
+
if (s <= observed)
|
|
55
|
+
lower += counts[s];
|
|
56
|
+
if (s >= observed)
|
|
57
|
+
upper += counts[s];
|
|
58
|
+
}
|
|
59
|
+
return Math.min(1, (2 * Math.min(lower, upper)) / outcomes);
|
|
60
|
+
}
|
|
61
|
+
function normalP(n, statistic, ties) {
|
|
62
|
+
const expected = (n * (n + 1)) / 4;
|
|
63
|
+
const tieCorrection = ties.reduce((sum, t) => sum + (t ** 3 - t), 0) / 48;
|
|
64
|
+
const variance = (n * (n + 1) * (2 * n + 1)) / 24 - tieCorrection;
|
|
65
|
+
if (variance <= 0)
|
|
66
|
+
return 1;
|
|
67
|
+
const distance = Math.max(0, Math.abs(statistic - expected) - 0.5);
|
|
68
|
+
return normalTwoSidedP(distance / Math.sqrt(variance));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=wilcoxon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wilcoxon.js","sourceRoot":"","sources":["../../src/stats/wilcoxon.ts"],"names":[],"mappings":"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"}
|