pragmastat 6.0.1 → 7.0.1

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.
Files changed (44) hide show
  1. package/README.md +17 -4
  2. package/dist/assumptions.d.ts +13 -10
  3. package/dist/assumptions.d.ts.map +1 -1
  4. package/dist/assumptions.js +22 -16
  5. package/dist/assumptions.js.map +1 -1
  6. package/dist/estimators.d.ts +17 -0
  7. package/dist/estimators.d.ts.map +1 -1
  8. package/dist/estimators.js +98 -25
  9. package/dist/estimators.js.map +1 -1
  10. package/dist/fastCenterQuantiles.d.ts +15 -0
  11. package/dist/fastCenterQuantiles.d.ts.map +1 -0
  12. package/dist/fastCenterQuantiles.js +125 -0
  13. package/dist/fastCenterQuantiles.js.map +1 -0
  14. package/dist/fastShift.js +2 -2
  15. package/dist/fastShift.js.map +1 -1
  16. package/dist/gaussCdf.d.ts +16 -0
  17. package/dist/gaussCdf.d.ts.map +1 -0
  18. package/dist/gaussCdf.js +76 -0
  19. package/dist/gaussCdf.js.map +1 -0
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +5 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/minMisrate.d.ts +23 -0
  25. package/dist/minMisrate.d.ts.map +1 -0
  26. package/dist/minMisrate.js +58 -0
  27. package/dist/minMisrate.js.map +1 -0
  28. package/dist/pairwiseMargin.d.ts +1 -1
  29. package/dist/pairwiseMargin.d.ts.map +1 -1
  30. package/dist/pairwiseMargin.js +14 -75
  31. package/dist/pairwiseMargin.js.map +1 -1
  32. package/dist/rng.d.ts +11 -0
  33. package/dist/rng.d.ts.map +1 -1
  34. package/dist/rng.js +25 -0
  35. package/dist/rng.js.map +1 -1
  36. package/dist/signedRankMargin.d.ts +17 -0
  37. package/dist/signedRankMargin.d.ts.map +1 -0
  38. package/dist/signedRankMargin.js +114 -0
  39. package/dist/signedRankMargin.js.map +1 -0
  40. package/package.json +5 -5
  41. package/dist/utils.d.ts +0 -10
  42. package/dist/utils.d.ts.map +0 -1
  43. package/dist/utils.js +0 -25
  44. package/dist/utils.js.map +0 -1
package/README.md CHANGED
@@ -3,10 +3,10 @@
3
3
  Install from npm:
4
4
 
5
5
  ```bash
6
- npm i pragmastat@6.0.1
6
+ npm i pragmastat@7.0.1
7
7
  ```
8
8
 
9
- Source code: https://github.com/AndreyAkinshin/pragmastat/tree/v6.0.1/ts
9
+ Source code: https://github.com/AndreyAkinshin/pragmastat/tree/v7.0.1/ts
10
10
 
11
11
  Pragmastat on npm: https://www.npmjs.com/package/pragmastat
12
12
 
@@ -14,7 +14,9 @@ Pragmastat on npm: https://www.npmjs.com/package/pragmastat
14
14
 
15
15
  ```typescript
16
16
  import {
17
- median, center, spread, relSpread, shift, ratio, avgSpread, disparity, shiftBounds, ratioBounds, pairwiseMargin,
17
+ median, center, spread, relSpread, shift, ratio, avgSpread, disparity,
18
+ signedRankMargin, pairwiseMargin,
19
+ centerBounds, shiftBounds, ratioBounds,
18
20
  Rng, Uniform, Additive, Exp, Power, Multiplic
19
21
  } from '../src';
20
22
 
@@ -31,6 +33,9 @@ function main() {
31
33
  rng = new Rng("demo-shuffle");
32
34
  console.log(rng.shuffle([1, 2, 3, 4, 5])); // [4, 2, 3, 5, 1]
33
35
 
36
+ rng = new Rng("demo-resample");
37
+ console.log(rng.resample([1, 2, 3, 4, 5], 7)); // [5, 1, 1, 3, 3, 4, 5]
38
+
34
39
  // --- Distribution Sampling ---
35
40
 
36
41
  rng = new Rng("demo-dist-uniform");
@@ -80,7 +85,15 @@ function main() {
80
85
  console.log(ratio(x, y)); // 0.5
81
86
  console.log(ratio(y, x)); // 2
82
87
 
83
- // --- Confidence Bounds ---
88
+ // --- One-Sample Bounds ---
89
+
90
+ x = Array.from({ length: 10 }, (_, i) => i + 1);
91
+
92
+ console.log(signedRankMargin(10, 0.05)); // 18
93
+ console.log(center(x)); // 5.5
94
+ console.log(centerBounds(x, 0.05)); // { lower: 3.5, upper: 7.5 }
95
+
96
+ // --- Two-Sample Bounds ---
84
97
 
85
98
  x = Array.from({ length: 30 }, (_, i) => i + 1);
86
99
  y = Array.from({ length: 30 }, (_, i) => i + 21);
@@ -3,19 +3,21 @@
3
3
  *
4
4
  * Assumption IDs (canonical priority order):
5
5
  * 1. validity - non-empty input with finite defined real values
6
- * 2. positivity - values must be strictly positive
7
- * 3. sparity - sample must be non tie-dominant (Spread > 0)
6
+ * 2. domain - parameter is outside its valid domain
7
+ * 3. positivity - values must be strictly positive
8
+ * 4. sparity - sample must be non tie-dominant (Spread > 0)
8
9
  *
9
10
  * When multiple assumptions are violated, the violation with highest priority
10
11
  * is reported. For two-sample functions, subject X is checked before Y.
11
12
  */
12
13
  export declare const AssumptionId: {
13
14
  readonly VALIDITY: "validity";
15
+ readonly DOMAIN: "domain";
14
16
  readonly POSITIVITY: "positivity";
15
17
  readonly SPARITY: "sparity";
16
18
  };
17
19
  export type AssumptionId = (typeof AssumptionId)[keyof typeof AssumptionId];
18
- export type Subject = 'x' | 'y';
20
+ export type Subject = 'x' | 'y' | 'misrate';
19
21
  export interface Violation {
20
22
  id: AssumptionId;
21
23
  subject: Subject;
@@ -23,15 +25,16 @@ export interface Violation {
23
25
  export declare class AssumptionError extends Error {
24
26
  readonly violation: Violation;
25
27
  constructor(violation: Violation);
26
- static validity(_functionName: string, subject: Subject): AssumptionError;
27
- static positivity(_functionName: string, subject: Subject): AssumptionError;
28
- static sparity(_functionName: string, subject: Subject): AssumptionError;
28
+ static validity(subject: Subject): AssumptionError;
29
+ static positivity(subject: Subject): AssumptionError;
30
+ static sparity(subject: Subject): AssumptionError;
31
+ static domain(subject: Subject): AssumptionError;
29
32
  }
30
- export declare function checkValidity(values: number[], subject: Subject, functionName: string): void;
31
- export declare function checkPositivity(values: number[], subject: Subject, functionName: string): void;
32
- export declare function checkSparity(values: number[], subject: Subject, functionName: string): void;
33
+ export declare function checkValidity(values: number[], subject: Subject): void;
34
+ export declare function checkPositivity(values: number[], subject: Subject): void;
35
+ export declare function checkSparity(values: number[], subject: Subject): void;
33
36
  /**
34
37
  * Log-transforms an array. Throws AssumptionError if any value is non-positive.
35
38
  */
36
- export declare function log(values: number[], subject: Subject, functionName: string): number[];
39
+ export declare function log(values: number[], subject: Subject): number[];
37
40
  //# sourceMappingURL=assumptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assumptions.d.ts","sourceRoot":"","sources":["../src/assumptions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,MAAM,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,YAAY,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;gBAElB,SAAS,EAAE,SAAS;IAMhC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;IAIzE,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;IAI3E,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;CAGzE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAO5F;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAI9F;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAQ3F;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAStF"}
1
+ {"version":3,"file":"assumptions.d.ts","sourceRoot":"","sources":["../src/assumptions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,MAAM,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,YAAY,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;gBAElB,SAAS,EAAE,SAAS;IAOhC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe;IAIlD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe;IAIpD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe;IAIjD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe;CAGjD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAOtE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAIxE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAQrE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAShE"}
@@ -11,64 +11,70 @@ const fastSpread_1 = require("./fastSpread");
11
11
  *
12
12
  * Assumption IDs (canonical priority order):
13
13
  * 1. validity - non-empty input with finite defined real values
14
- * 2. positivity - values must be strictly positive
15
- * 3. sparity - sample must be non tie-dominant (Spread > 0)
14
+ * 2. domain - parameter is outside its valid domain
15
+ * 3. positivity - values must be strictly positive
16
+ * 4. sparity - sample must be non tie-dominant (Spread > 0)
16
17
  *
17
18
  * When multiple assumptions are violated, the violation with highest priority
18
19
  * is reported. For two-sample functions, subject X is checked before Y.
19
20
  */
20
21
  exports.AssumptionId = {
21
22
  VALIDITY: 'validity',
23
+ DOMAIN: 'domain',
22
24
  POSITIVITY: 'positivity',
23
25
  SPARITY: 'sparity',
24
26
  };
25
27
  class AssumptionError extends Error {
26
28
  constructor(violation) {
27
- super(`${violation.id}(${violation.subject})`);
29
+ const violationStr = `${violation.id}(${violation.subject})`;
30
+ super(violationStr);
28
31
  this.name = 'AssumptionError';
29
32
  this.violation = violation;
30
33
  }
31
- static validity(_functionName, subject) {
34
+ static validity(subject) {
32
35
  return new AssumptionError({ id: exports.AssumptionId.VALIDITY, subject });
33
36
  }
34
- static positivity(_functionName, subject) {
37
+ static positivity(subject) {
35
38
  return new AssumptionError({ id: exports.AssumptionId.POSITIVITY, subject });
36
39
  }
37
- static sparity(_functionName, subject) {
40
+ static sparity(subject) {
38
41
  return new AssumptionError({ id: exports.AssumptionId.SPARITY, subject });
39
42
  }
43
+ static domain(subject) {
44
+ return new AssumptionError({ id: exports.AssumptionId.DOMAIN, subject });
45
+ }
40
46
  }
41
47
  exports.AssumptionError = AssumptionError;
42
- function checkValidity(values, subject, functionName) {
48
+ function checkValidity(values, subject) {
43
49
  if (values.length === 0) {
44
- throw AssumptionError.validity(functionName, subject);
50
+ throw AssumptionError.validity(subject);
45
51
  }
46
52
  if (!values.every((v) => Number.isFinite(v))) {
47
- throw AssumptionError.validity(functionName, subject);
53
+ throw AssumptionError.validity(subject);
48
54
  }
49
55
  }
50
- function checkPositivity(values, subject, functionName) {
56
+ function checkPositivity(values, subject) {
51
57
  if (values.some((v) => v <= 0)) {
52
- throw AssumptionError.positivity(functionName, subject);
58
+ throw AssumptionError.positivity(subject);
53
59
  }
54
60
  }
55
- function checkSparity(values, subject, functionName) {
61
+ function checkSparity(values, subject) {
56
62
  if (values.length < 2) {
57
- throw AssumptionError.sparity(functionName, subject);
63
+ throw AssumptionError.sparity(subject);
58
64
  }
59
65
  const spread = (0, fastSpread_1.fastSpread)(values);
60
66
  if (spread <= 0) {
61
- throw AssumptionError.sparity(functionName, subject);
67
+ throw AssumptionError.sparity(subject);
62
68
  }
63
69
  }
64
70
  /**
65
71
  * Log-transforms an array. Throws AssumptionError if any value is non-positive.
66
72
  */
67
- function log(values, subject, functionName) {
73
+ function log(values, subject) {
68
74
  const result = new Array(values.length);
69
75
  for (let i = 0; i < values.length; i++) {
70
76
  if (values[i] <= 0) {
71
- throw AssumptionError.positivity(functionName, subject);
77
+ throw AssumptionError.positivity(subject);
72
78
  }
73
79
  result[i] = Math.log(values[i]);
74
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"assumptions.js","sourceRoot":"","sources":["../src/assumptions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assumptions.js","sourceRoot":"","sources":["../src/assumptions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * Pragmastat estimators implementation
3
3
  */
4
+ /**
5
+ * Calculate the median of an array of numbers
6
+ * @param values Array of numbers
7
+ * @returns The median value
8
+ */
9
+ export declare function median(values: number[]): number;
4
10
  /**
5
11
  * Calculate the Center - median of all pairwise averages (x[i] + x[j])/2
6
12
  * Uses fast O(n log n) algorithm.
@@ -117,4 +123,15 @@ export declare function shiftBounds(x: number[], y: number[], misrate: number):
117
123
  * @throws AssumptionError if either sample is empty, contains NaN/Inf, or contains non-positive values
118
124
  */
119
125
  export declare function ratioBounds(x: number[], y: number[], misrate: number): Bounds;
126
+ /**
127
+ * Provides exact bounds on the Center (Hodges-Lehmann pseudomedian) with specified misclassification rate
128
+ *
129
+ * Uses SignedRankMargin to determine which pairwise averages form the bounds.
130
+ *
131
+ * @param x Sample array
132
+ * @param misrate Misclassification rate (probability that true center falls outside bounds)
133
+ * @returns An object containing the lower and upper bounds
134
+ * @throws AssumptionError if sample is empty or contains NaN/Inf
135
+ */
136
+ export declare function centerBounds(x: number[], misrate: number): Bounds;
120
137
  //# sourceMappingURL=estimators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"estimators.d.ts","sourceRoot":"","sources":["../src/estimators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAI1C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAM1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAW7C;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAMtD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAWtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkB1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAqB1D;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqC7E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgB7E"}
1
+ {"version":3,"file":"estimators.d.ts","sourceRoot":"","sources":["../src/estimators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAY/C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAI1C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAM1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAW7C;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAMtD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAWtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkB1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAqB1D;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA8C7E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyB7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmCjE"}
@@ -3,6 +3,7 @@
3
3
  * Pragmastat estimators implementation
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.median = median;
6
7
  exports.center = center;
7
8
  exports.spread = spread;
8
9
  exports.relSpread = relSpread;
@@ -12,11 +13,32 @@ exports.avgSpread = avgSpread;
12
13
  exports.disparity = disparity;
13
14
  exports.shiftBounds = shiftBounds;
14
15
  exports.ratioBounds = ratioBounds;
16
+ exports.centerBounds = centerBounds;
15
17
  const fastCenter_1 = require("./fastCenter");
16
18
  const fastSpread_1 = require("./fastSpread");
17
19
  const fastShift_1 = require("./fastShift");
18
20
  const pairwiseMargin_1 = require("./pairwiseMargin");
21
+ const signedRankMargin_1 = require("./signedRankMargin");
22
+ const fastCenterQuantiles_1 = require("./fastCenterQuantiles");
23
+ const minMisrate_1 = require("./minMisrate");
19
24
  const assumptions_1 = require("./assumptions");
25
+ /**
26
+ * Calculate the median of an array of numbers
27
+ * @param values Array of numbers
28
+ * @returns The median value
29
+ */
30
+ function median(values) {
31
+ // Check validity (priority 0)
32
+ (0, assumptions_1.checkValidity)(values, 'x');
33
+ const sorted = [...values].sort((a, b) => a - b);
34
+ const mid = Math.floor(sorted.length / 2);
35
+ if (sorted.length % 2 === 0) {
36
+ return (sorted[mid - 1] + sorted[mid]) / 2;
37
+ }
38
+ else {
39
+ return sorted[mid];
40
+ }
41
+ }
20
42
  /**
21
43
  * Calculate the Center - median of all pairwise averages (x[i] + x[j])/2
22
44
  * Uses fast O(n log n) algorithm.
@@ -25,7 +47,7 @@ const assumptions_1 = require("./assumptions");
25
47
  */
26
48
  function center(x) {
27
49
  // Check validity (priority 0)
28
- (0, assumptions_1.checkValidity)(x, 'x', 'Center');
50
+ (0, assumptions_1.checkValidity)(x, 'x');
29
51
  return (0, fastCenter_1.fastCenter)(x);
30
52
  }
31
53
  /**
@@ -41,9 +63,9 @@ function center(x) {
41
63
  */
42
64
  function spread(x) {
43
65
  // Check validity (priority 0)
44
- (0, assumptions_1.checkValidity)(x, 'x', 'Spread');
66
+ (0, assumptions_1.checkValidity)(x, 'x');
45
67
  // Check sparity (priority 2)
46
- (0, assumptions_1.checkSparity)(x, 'x', 'Spread');
68
+ (0, assumptions_1.checkSparity)(x, 'x');
47
69
  return (0, fastSpread_1.fastSpread)(x);
48
70
  }
49
71
  /**
@@ -58,9 +80,9 @@ function spread(x) {
58
80
  */
59
81
  function relSpread(x) {
60
82
  // Check validity (priority 0)
61
- (0, assumptions_1.checkValidity)(x, 'x', 'RelSpread');
83
+ (0, assumptions_1.checkValidity)(x, 'x');
62
84
  // Check positivity (priority 1)
63
- (0, assumptions_1.checkPositivity)(x, 'x', 'RelSpread');
85
+ (0, assumptions_1.checkPositivity)(x, 'x');
64
86
  // Calculate center (we know x is valid, center should succeed)
65
87
  const c = (0, fastCenter_1.fastCenter)(x);
66
88
  // Calculate spread (using internal implementation since we already validated)
@@ -77,8 +99,8 @@ function relSpread(x) {
77
99
  */
78
100
  function shift(x, y) {
79
101
  // Check validity (priority 0)
80
- (0, assumptions_1.checkValidity)(x, 'x', 'Shift');
81
- (0, assumptions_1.checkValidity)(y, 'y', 'Shift');
102
+ (0, assumptions_1.checkValidity)(x, 'x');
103
+ (0, assumptions_1.checkValidity)(y, 'y');
82
104
  return (0, fastShift_1.fastShift)(x, y, [0.5], false)[0];
83
105
  }
84
106
  /**
@@ -97,13 +119,13 @@ function shift(x, y) {
97
119
  */
98
120
  function ratio(x, y) {
99
121
  // Check validity for x (priority 0, subject x)
100
- (0, assumptions_1.checkValidity)(x, 'x', 'Ratio');
122
+ (0, assumptions_1.checkValidity)(x, 'x');
101
123
  // Check validity for y (priority 0, subject y)
102
- (0, assumptions_1.checkValidity)(y, 'y', 'Ratio');
124
+ (0, assumptions_1.checkValidity)(y, 'y');
103
125
  // Check positivity for x (priority 1, subject x)
104
- (0, assumptions_1.checkPositivity)(x, 'x', 'Ratio');
126
+ (0, assumptions_1.checkPositivity)(x, 'x');
105
127
  // Check positivity for y (priority 1, subject y)
106
- (0, assumptions_1.checkPositivity)(y, 'y', 'Ratio');
128
+ (0, assumptions_1.checkPositivity)(y, 'y');
107
129
  return (0, fastShift_1.fastRatio)(x, y, [0.5], false)[0];
108
130
  }
109
131
  /**
@@ -120,13 +142,13 @@ function ratio(x, y) {
120
142
  */
121
143
  function avgSpread(x, y) {
122
144
  // Check validity for x (priority 0, subject x)
123
- (0, assumptions_1.checkValidity)(x, 'x', 'AvgSpread');
145
+ (0, assumptions_1.checkValidity)(x, 'x');
124
146
  // Check validity for y (priority 0, subject y)
125
- (0, assumptions_1.checkValidity)(y, 'y', 'AvgSpread');
147
+ (0, assumptions_1.checkValidity)(y, 'y');
126
148
  // Check sparity for x (priority 2, subject x)
127
- (0, assumptions_1.checkSparity)(x, 'x', 'AvgSpread');
149
+ (0, assumptions_1.checkSparity)(x, 'x');
128
150
  // Check sparity for y (priority 2, subject y)
129
- (0, assumptions_1.checkSparity)(y, 'y', 'AvgSpread');
151
+ (0, assumptions_1.checkSparity)(y, 'y');
130
152
  const nx = x.length;
131
153
  const ny = y.length;
132
154
  // Calculate spreads (using internal implementation since we already validated)
@@ -148,13 +170,13 @@ function avgSpread(x, y) {
148
170
  */
149
171
  function disparity(x, y) {
150
172
  // Check validity for x (priority 0, subject x)
151
- (0, assumptions_1.checkValidity)(x, 'x', 'Disparity');
173
+ (0, assumptions_1.checkValidity)(x, 'x');
152
174
  // Check validity for y (priority 0, subject y)
153
- (0, assumptions_1.checkValidity)(y, 'y', 'Disparity');
175
+ (0, assumptions_1.checkValidity)(y, 'y');
154
176
  // Check sparity for x (priority 2, subject x)
155
- (0, assumptions_1.checkSparity)(x, 'x', 'Disparity');
177
+ (0, assumptions_1.checkSparity)(x, 'x');
156
178
  // Check sparity for y (priority 2, subject y)
157
- (0, assumptions_1.checkSparity)(y, 'y', 'Disparity');
179
+ (0, assumptions_1.checkSparity)(y, 'y');
158
180
  const nx = x.length;
159
181
  const ny = y.length;
160
182
  // Calculate shift (we know inputs are valid)
@@ -179,11 +201,18 @@ function disparity(x, y) {
179
201
  */
180
202
  function shiftBounds(x, y, misrate) {
181
203
  // Check validity for x
182
- (0, assumptions_1.checkValidity)(x, 'x', 'ShiftBounds');
204
+ (0, assumptions_1.checkValidity)(x, 'x');
183
205
  // Check validity for y
184
- (0, assumptions_1.checkValidity)(y, 'y', 'ShiftBounds');
206
+ (0, assumptions_1.checkValidity)(y, 'y');
185
207
  const n = x.length;
186
208
  const m = y.length;
209
+ if (isNaN(misrate) || misrate < 0 || misrate > 1) {
210
+ throw assumptions_1.AssumptionError.domain('misrate');
211
+ }
212
+ const minMisrate = (0, minMisrate_1.minAchievableMisrateTwoSample)(n, m);
213
+ if (misrate < minMisrate) {
214
+ throw assumptions_1.AssumptionError.domain('misrate');
215
+ }
187
216
  // Sort both arrays
188
217
  const xs = [...x].sort((a, b) => a - b);
189
218
  const ys = [...y].sort((a, b) => a - b);
@@ -224,11 +253,18 @@ function shiftBounds(x, y, misrate) {
224
253
  * @throws AssumptionError if either sample is empty, contains NaN/Inf, or contains non-positive values
225
254
  */
226
255
  function ratioBounds(x, y, misrate) {
227
- (0, assumptions_1.checkValidity)(x, 'x', 'RatioBounds');
228
- (0, assumptions_1.checkValidity)(y, 'y', 'RatioBounds');
256
+ (0, assumptions_1.checkValidity)(x, 'x');
257
+ (0, assumptions_1.checkValidity)(y, 'y');
258
+ if (isNaN(misrate) || misrate < 0 || misrate > 1) {
259
+ throw assumptions_1.AssumptionError.domain('misrate');
260
+ }
261
+ const minMisrate = (0, minMisrate_1.minAchievableMisrateTwoSample)(x.length, y.length);
262
+ if (misrate < minMisrate) {
263
+ throw assumptions_1.AssumptionError.domain('misrate');
264
+ }
229
265
  // Log-transform samples (includes positivity check)
230
- const logX = (0, assumptions_1.log)(x, 'x', 'RatioBounds');
231
- const logY = (0, assumptions_1.log)(y, 'y', 'RatioBounds');
266
+ const logX = (0, assumptions_1.log)(x, 'x');
267
+ const logY = (0, assumptions_1.log)(y, 'y');
232
268
  // Delegate to shiftBounds in log-space
233
269
  const logBounds = shiftBounds(logX, logY, misrate);
234
270
  // Exp-transform back to ratio-space
@@ -237,4 +273,41 @@ function ratioBounds(x, y, misrate) {
237
273
  upper: Math.exp(logBounds.upper),
238
274
  };
239
275
  }
276
+ /**
277
+ * Provides exact bounds on the Center (Hodges-Lehmann pseudomedian) with specified misclassification rate
278
+ *
279
+ * Uses SignedRankMargin to determine which pairwise averages form the bounds.
280
+ *
281
+ * @param x Sample array
282
+ * @param misrate Misclassification rate (probability that true center falls outside bounds)
283
+ * @returns An object containing the lower and upper bounds
284
+ * @throws AssumptionError if sample is empty or contains NaN/Inf
285
+ */
286
+ function centerBounds(x, misrate) {
287
+ (0, assumptions_1.checkValidity)(x, 'x');
288
+ if (isNaN(misrate) || misrate < 0 || misrate > 1) {
289
+ throw assumptions_1.AssumptionError.domain('misrate');
290
+ }
291
+ const n = x.length;
292
+ if (n < 2) {
293
+ throw assumptions_1.AssumptionError.domain('x');
294
+ }
295
+ // Validate misrate
296
+ const minMisrate = (0, minMisrate_1.minAchievableMisrateOneSample)(n);
297
+ if (misrate < minMisrate) {
298
+ throw assumptions_1.AssumptionError.domain('misrate');
299
+ }
300
+ // Total number of pairwise averages (including self-pairs)
301
+ const totalPairs = (n * (n + 1)) / 2;
302
+ // Get signed-rank margin
303
+ const margin = (0, signedRankMargin_1.signedRankMargin)(n, misrate);
304
+ const halfMargin = Math.min(Math.floor(margin / 2), Math.floor((totalPairs - 1) / 2));
305
+ // k_left and k_right are 1-based ranks
306
+ const kLeft = halfMargin + 1;
307
+ const kRight = totalPairs - halfMargin;
308
+ // Sort the input
309
+ const sorted = [...x].sort((a, b) => a - b);
310
+ const [lo, hi] = (0, fastCenterQuantiles_1.fastCenterQuantileBounds)(sorted, kLeft, kRight);
311
+ return { lower: lo, upper: hi };
312
+ }
240
313
  //# sourceMappingURL=estimators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"estimators.js","sourceRoot":"","sources":["../src/estimators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"estimators.js","sourceRoot":"","sources":["../src/estimators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Fast algorithm for finding quantiles of pairwise averages (x[i] + x[j])/2.
3
+ *
4
+ * Uses binary search with counting function to find exact quantiles in O(n log(range)) time.
5
+ */
6
+ /**
7
+ * Finds both lower and upper quantile bounds for pairwise averages.
8
+ *
9
+ * @param sorted Sorted array of values
10
+ * @param kLo 1-based rank for lower bound
11
+ * @param kHi 1-based rank for upper bound
12
+ * @returns Tuple of [lower bound, upper bound]
13
+ */
14
+ export declare function fastCenterQuantileBounds(sorted: number[], kLo: number, kHi: number): [number, number];
15
+ //# sourceMappingURL=fastCenterQuantiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastCenterQuantiles.d.ts","sourceRoot":"","sources":["../src/fastCenterQuantiles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkHH;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EAAE,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,CAAC,MAAM,EAAE,MAAM,CAAC,CAalB"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * Fast algorithm for finding quantiles of pairwise averages (x[i] + x[j])/2.
4
+ *
5
+ * Uses binary search with counting function to find exact quantiles in O(n log(range)) time.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.fastCenterQuantileBounds = fastCenterQuantileBounds;
9
+ /** Relative epsilon for floating-point comparisons in binary search convergence. */
10
+ const RELATIVE_EPSILON = 1e-14;
11
+ /**
12
+ * Counts how many pairwise averages (sorted[i] + sorted[j])/2 where i <= j are <= threshold.
13
+ *
14
+ * @param sorted Sorted array of values
15
+ * @param threshold Threshold to count against
16
+ * @returns Number of pairwise averages <= threshold
17
+ */
18
+ function countPairsLessOrEqual(sorted, threshold) {
19
+ const n = sorted.length;
20
+ let count = 0;
21
+ // j is not reset: as i increases, threshold decreases monotonically
22
+ let j = n - 1;
23
+ for (let i = 0; i < n; i++) {
24
+ const target = 2 * threshold - sorted[i];
25
+ while (j >= 0 && sorted[j] > target) {
26
+ j--;
27
+ }
28
+ if (j >= i) {
29
+ count += j - i + 1;
30
+ }
31
+ }
32
+ return count;
33
+ }
34
+ /**
35
+ * Finds the k-th smallest pairwise average using binary search.
36
+ *
37
+ * @param sorted Sorted array of values
38
+ * @param k 1-based rank of the desired quantile
39
+ * @returns The k-th smallest pairwise average
40
+ */
41
+ function findExactQuantile(sorted, k) {
42
+ const n = sorted.length;
43
+ const totalPairs = (n * (n + 1)) / 2;
44
+ if (n === 1)
45
+ return sorted[0];
46
+ if (k === 1)
47
+ return sorted[0];
48
+ if (k === totalPairs)
49
+ return sorted[n - 1];
50
+ const min = sorted[0];
51
+ const max = sorted[n - 1];
52
+ // Binary search on value range
53
+ let lo = min;
54
+ let hi = max;
55
+ while (hi - lo > RELATIVE_EPSILON * Math.max(1.0, Math.abs(lo), Math.abs(hi))) {
56
+ const mid = (lo + hi) / 2;
57
+ const count = countPairsLessOrEqual(sorted, mid);
58
+ if (count < k) {
59
+ lo = mid;
60
+ }
61
+ else {
62
+ hi = mid;
63
+ }
64
+ }
65
+ const target = (lo + hi) / 2;
66
+ // Extract candidates that are close to the target
67
+ const candidates = [];
68
+ for (let i = 0; i < n; i++) {
69
+ const threshold = 2 * target - sorted[i];
70
+ // Find left boundary using binary search
71
+ let left = i;
72
+ let right = n;
73
+ while (left < right) {
74
+ const m = Math.floor((left + right) / 2);
75
+ if (sorted[m] < threshold - RELATIVE_EPSILON) {
76
+ left = m + 1;
77
+ }
78
+ else {
79
+ right = m;
80
+ }
81
+ }
82
+ if (left < n &&
83
+ left >= i &&
84
+ Math.abs(sorted[left] - threshold) < RELATIVE_EPSILON * Math.max(1.0, Math.abs(threshold))) {
85
+ candidates.push((sorted[i] + sorted[left]) / 2);
86
+ }
87
+ if (left > i) {
88
+ const avgBefore = (sorted[i] + sorted[left - 1]) / 2;
89
+ if (avgBefore <= target + RELATIVE_EPSILON) {
90
+ candidates.push(avgBefore);
91
+ }
92
+ }
93
+ }
94
+ if (candidates.length === 0) {
95
+ return target;
96
+ }
97
+ candidates.sort((a, b) => a - b);
98
+ // Return the candidate that gives exactly k pairs <= it
99
+ for (const c of candidates) {
100
+ if (countPairsLessOrEqual(sorted, c) >= k) {
101
+ return c;
102
+ }
103
+ }
104
+ return target;
105
+ }
106
+ /**
107
+ * Finds both lower and upper quantile bounds for pairwise averages.
108
+ *
109
+ * @param sorted Sorted array of values
110
+ * @param kLo 1-based rank for lower bound
111
+ * @param kHi 1-based rank for upper bound
112
+ * @returns Tuple of [lower bound, upper bound]
113
+ */
114
+ function fastCenterQuantileBounds(sorted, kLo, kHi) {
115
+ const n = sorted.length;
116
+ const totalPairs = (n * (n + 1)) / 2;
117
+ // Clamp ranks to valid range
118
+ const clampedLo = Math.max(1, Math.min(kLo, totalPairs));
119
+ const clampedHi = Math.max(1, Math.min(kHi, totalPairs));
120
+ const lower = findExactQuantile(sorted, clampedLo);
121
+ const upper = findExactQuantile(sorted, clampedHi);
122
+ // Ensure lower <= upper
123
+ return lower > upper ? [upper, lower] : [lower, upper];
124
+ }
125
+ //# sourceMappingURL=fastCenterQuantiles.js.map