pragmastat 3.1.29 → 3.1.32

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 CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  This is a TypeScript implementation of 'Pragmastat: Pragmatic Statistical Toolkit', which presents a toolkit of statistical procedures that provide reliable results across diverse real-world distributions, with ready-to-use implementations and detailed explanations.
4
4
 
5
- - PDF manual for this version: [pragmastat-v3.1.29.pdf](https://github.com/AndreyAkinshin/pragmastat/releases/download/v3.1.29/pragmastat-v3.1.29.pdf)
6
- - Markdown manual for this version: [pragmastat-v3.1.29.md](https://github.com/AndreyAkinshin/pragmastat/releases/download/v3.1.29/pragmastat-v3.1.29.md)
7
- - Source code for this version: [pragmastat/ts/v3.1.29](https://github.com/AndreyAkinshin/pragmastat/tree/v3.1.29/ts)
5
+ - PDF manual for this version: [pragmastat-v3.1.32.pdf](https://github.com/AndreyAkinshin/pragmastat/releases/download/v3.1.32/pragmastat-v3.1.32.pdf)
6
+ - Markdown manual for this version: [pragmastat-v3.1.32.md](https://github.com/AndreyAkinshin/pragmastat/releases/download/v3.1.32/pragmastat-v3.1.32.md)
7
+ - Source code for this version: [pragmastat/ts/v3.1.32](https://github.com/AndreyAkinshin/pragmastat/tree/v3.1.32/ts)
8
8
  - Latest online manual: https://pragmastat.dev
9
9
  - Manual DOI: [10.5281/zenodo.17236778](https://doi.org/10.5281/zenodo.17236778)
10
10
 
@@ -13,7 +13,7 @@ This is a TypeScript implementation of 'Pragmastat: Pragmatic Statistical Toolki
13
13
  Install from npm:
14
14
 
15
15
  ```bash
16
- npm i pragmastat@3.1.29
16
+ npm i pragmastat@3.1.32
17
17
  ```
18
18
 
19
19
  ## Demo
@@ -23,6 +23,7 @@ export declare function spread(x: number[]): number;
23
23
  export declare function relSpread(x: number[]): number;
24
24
  /**
25
25
  * Calculate the Shift - median of all pairwise differences (x[i] - y[j])
26
+ * Uses fast O((m + n) * log(precision)) algorithm.
26
27
  * @param x First sample
27
28
  * @param y Second sample
28
29
  * @returns The shift estimate
@@ -1 +1 @@
1
- {"version":3,"file":"estimators.d.ts","sourceRoot":"","sources":["../src/estimators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAa7C;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAgBtD;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBtD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAa1D"}
1
+ {"version":3,"file":"estimators.d.ts","sourceRoot":"","sources":["../src/estimators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAa7C;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAStD;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBtD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAa1D"}
@@ -13,6 +13,7 @@ exports.disparity = disparity;
13
13
  const utils_1 = require("./utils");
14
14
  const fastCenter_1 = require("./fastCenter");
15
15
  const fastSpread_1 = require("./fastSpread");
16
+ const fastShift_1 = require("./fastShift");
16
17
  /**
17
18
  * Calculate the Center - median of all pairwise averages (x[i] + x[j])/2
18
19
  * Uses fast O(n log n) algorithm.
@@ -49,6 +50,7 @@ function relSpread(x) {
49
50
  }
50
51
  /**
51
52
  * Calculate the Shift - median of all pairwise differences (x[i] - y[j])
53
+ * Uses fast O((m + n) * log(precision)) algorithm.
52
54
  * @param x First sample
53
55
  * @param y Second sample
54
56
  * @returns The shift estimate
@@ -59,13 +61,7 @@ function shift(x, y) {
59
61
  if (nx === 0 || ny === 0) {
60
62
  throw new Error('Input arrays cannot be empty');
61
63
  }
62
- const pairwiseDifferences = [];
63
- for (let i = 0; i < nx; i++) {
64
- for (let j = 0; j < ny; j++) {
65
- pairwiseDifferences.push(x[i] - y[j]);
66
- }
67
- }
68
- return (0, utils_1.median)(pairwiseDifferences);
64
+ return (0, fastShift_1.fastShift)(x, y, [0.5], false)[0];
69
65
  }
70
66
  /**
71
67
  * Calculate the Ratio - median of all pairwise ratios (x[i] / y[j])
@@ -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,20 @@
1
+ /**
2
+ * Fast O((m + n) * log(precision)) implementation for computing quantiles
3
+ * of all pairwise differences {x_i - y_j}.
4
+ *
5
+ * Based on binary search with two-pointer counting algorithm.
6
+ * Internal implementation - not part of public API.
7
+ */
8
+ /**
9
+ * Computes quantiles of all pairwise differences { x_i - y_j }.
10
+ * Time: O((m + n) * log(precision)) per quantile. Space: O(1).
11
+ *
12
+ * @param x First array of numeric values
13
+ * @param y Second array of numeric values
14
+ * @param p Probabilities in [0, 1]
15
+ * @param assumeSorted If false, arrays will be sorted
16
+ * @returns Array of quantile values corresponding to probabilities in p
17
+ * @internal
18
+ */
19
+ export declare function fastShift(x: number[], y: number[], p: number[], assumeSorted?: boolean): number[];
20
+ //# sourceMappingURL=fastShift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastShift.d.ts","sourceRoot":"","sources":["../src/fastShift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,MAAM,EAAE,EACX,CAAC,EAAE,MAAM,EAAE,EACX,CAAC,EAAE,MAAM,EAAE,EACX,YAAY,GAAE,OAAe,GAC5B,MAAM,EAAE,CAwEV"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Fast O((m + n) * log(precision)) implementation for computing quantiles
4
+ * of all pairwise differences {x_i - y_j}.
5
+ *
6
+ * Based on binary search with two-pointer counting algorithm.
7
+ * Internal implementation - not part of public API.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.fastShift = fastShift;
11
+ /**
12
+ * Computes quantiles of all pairwise differences { x_i - y_j }.
13
+ * Time: O((m + n) * log(precision)) per quantile. Space: O(1).
14
+ *
15
+ * @param x First array of numeric values
16
+ * @param y Second array of numeric values
17
+ * @param p Probabilities in [0, 1]
18
+ * @param assumeSorted If false, arrays will be sorted
19
+ * @returns Array of quantile values corresponding to probabilities in p
20
+ * @internal
21
+ */
22
+ function fastShift(x, y, p, assumeSorted = false) {
23
+ if (!x || !y || !p) {
24
+ throw new Error('All inputs must be non-null');
25
+ }
26
+ if (x.length === 0 || y.length === 0) {
27
+ throw new Error('x and y must be non-empty');
28
+ }
29
+ // Validate probabilities
30
+ for (const pk of p) {
31
+ if (isNaN(pk) || pk < 0.0 || pk > 1.0) {
32
+ throw new Error('Probabilities must be within [0, 1]');
33
+ }
34
+ }
35
+ // Sort if needed
36
+ const xs = assumeSorted ? x : [...x].sort((a, b) => a - b);
37
+ const ys = assumeSorted ? y : [...y].sort((a, b) => a - b);
38
+ // Check for NaN in data
39
+ for (const xi of xs) {
40
+ if (isNaN(xi)) {
41
+ throw new Error('NaN values found in x');
42
+ }
43
+ }
44
+ for (const yj of ys) {
45
+ if (isNaN(yj)) {
46
+ throw new Error('NaN values found in y');
47
+ }
48
+ }
49
+ const m = xs.length;
50
+ const n = ys.length;
51
+ const total = m * n;
52
+ // Type-7 quantile: h = 1 + (n-1)*p, then interpolate between floor(h) and ceil(h)
53
+ const requiredRanks = new Set();
54
+ const interpolationParams = [];
55
+ for (let i = 0; i < p.length; i++) {
56
+ const h = 1.0 + (total - 1) * p[i];
57
+ let lowerRank = Math.floor(h);
58
+ let upperRank = Math.ceil(h);
59
+ const weight = h - lowerRank;
60
+ if (lowerRank < 1)
61
+ lowerRank = 1;
62
+ if (upperRank > total)
63
+ upperRank = total;
64
+ interpolationParams.push({ lowerRank, upperRank, weight });
65
+ requiredRanks.add(lowerRank);
66
+ requiredRanks.add(upperRank);
67
+ }
68
+ // Compute values for required ranks
69
+ const rankValues = new Map();
70
+ for (const rank of Array.from(requiredRanks).sort((a, b) => a - b)) {
71
+ rankValues.set(rank, selectKthPairwiseDiff(xs, ys, rank));
72
+ }
73
+ // Interpolate to get final quantile values
74
+ const result = [];
75
+ for (const { lowerRank, upperRank, weight } of interpolationParams) {
76
+ const lower = rankValues.get(lowerRank);
77
+ const upper = rankValues.get(upperRank);
78
+ result.push(weight === 0.0 ? lower : (1.0 - weight) * lower + weight * upper);
79
+ }
80
+ return result;
81
+ }
82
+ /**
83
+ * Binary search in [min_diff, max_diff] that snaps to actual discrete values.
84
+ * Avoids materializing all m*n differences.
85
+ */
86
+ function selectKthPairwiseDiff(x, y, k) {
87
+ const m = x.length;
88
+ const n = y.length;
89
+ const total = m * n;
90
+ if (k < 1 || k > total) {
91
+ throw new Error(`k must be between 1 and ${total}`);
92
+ }
93
+ let searchMin = x[0] - y[n - 1];
94
+ let searchMax = x[m - 1] - y[0];
95
+ if (isNaN(searchMin) || isNaN(searchMax)) {
96
+ throw new Error('NaN in input values');
97
+ }
98
+ const maxIterations = 128; // Sufficient for double precision convergence
99
+ let prevMin = -Infinity;
100
+ let prevMax = Infinity;
101
+ for (let iter = 0; iter < maxIterations && searchMin !== searchMax; iter++) {
102
+ const mid = midpoint(searchMin, searchMax);
103
+ const { countLessOrEqual, closestBelow, closestAbove } = countAndNeighbors(x, y, mid);
104
+ if (closestBelow === closestAbove) {
105
+ return closestBelow;
106
+ }
107
+ // No progress means we're stuck between two discrete values
108
+ if (searchMin === prevMin && searchMax === prevMax) {
109
+ return countLessOrEqual >= k ? closestBelow : closestAbove;
110
+ }
111
+ prevMin = searchMin;
112
+ prevMax = searchMax;
113
+ if (countLessOrEqual >= k) {
114
+ searchMax = closestBelow;
115
+ }
116
+ else {
117
+ searchMin = closestAbove;
118
+ }
119
+ }
120
+ if (searchMin !== searchMax) {
121
+ throw new Error('Convergence failure (pathological input)');
122
+ }
123
+ return searchMin;
124
+ }
125
+ /**
126
+ * Two-pointer algorithm: counts pairs where x[i] - y[j] <= threshold, and tracks
127
+ * the closest actual differences on either side of threshold.
128
+ */
129
+ function countAndNeighbors(x, y, threshold) {
130
+ const m = x.length;
131
+ const n = y.length;
132
+ let count = 0;
133
+ let maxBelow = -Infinity;
134
+ let minAbove = Infinity;
135
+ let j = 0;
136
+ for (let i = 0; i < m; i++) {
137
+ // Move j forward while x[i] - y[j] > threshold
138
+ while (j < n && x[i] - y[j] > threshold) {
139
+ j++;
140
+ }
141
+ // Count elements where x[i] - y[j] <= threshold
142
+ count += n - j;
143
+ // Track the closest differences on either side of threshold
144
+ if (j < n) {
145
+ const diff = x[i] - y[j];
146
+ if (diff > maxBelow)
147
+ maxBelow = diff;
148
+ }
149
+ if (j > 0) {
150
+ const diff = x[i] - y[j - 1];
151
+ if (diff < minAbove)
152
+ minAbove = diff;
153
+ }
154
+ }
155
+ // Fallback to actual min/max if no boundaries found
156
+ if (!isFinite(maxBelow)) {
157
+ maxBelow = x[0] - y[n - 1];
158
+ }
159
+ if (!isFinite(minAbove)) {
160
+ minAbove = x[m - 1] - y[0];
161
+ }
162
+ return {
163
+ countLessOrEqual: count,
164
+ closestBelow: maxBelow,
165
+ closestAbove: minAbove,
166
+ };
167
+ }
168
+ /**
169
+ * Compute midpoint avoiding overflow
170
+ */
171
+ function midpoint(a, b) {
172
+ return a + (b - a) * 0.5;
173
+ }
174
+ //# sourceMappingURL=fastShift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastShift.js","sourceRoot":"","sources":["../src/fastShift.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pragmastat",
3
- "version": "3.1.29",
3
+ "version": "3.1.32",
4
4
  "description": "Pragmastat: Pragmatic Statistical Toolkit",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",