@visactor/vutils 1.0.16 → 1.0.17

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 (57) hide show
  1. package/cjs/common/ascending.js +2 -1
  2. package/cjs/common/extent.js +1 -2
  3. package/cjs/common/index.js +2 -1
  4. package/cjs/common/isNull.js +1 -2
  5. package/cjs/common/isPlainObject.js +2 -1
  6. package/cjs/common/isShallowEqual.js +1 -1
  7. package/cjs/common/isString.js +1 -1
  8. package/cjs/common/isType.js +1 -1
  9. package/cjs/common/isUndefined.js +1 -1
  10. package/cjs/common/isValid.js +1 -1
  11. package/cjs/common/regression-linear.d.ts +4 -2
  12. package/cjs/common/regression-linear.js +4 -2
  13. package/cjs/common/regression-linear.js.map +1 -1
  14. package/cjs/common/regression-logistic.d.ts +3 -2
  15. package/cjs/common/regression-logistic.js +3 -3
  16. package/cjs/common/regression-logistic.js.map +1 -1
  17. package/cjs/common/regression-lowess.d.ts +2 -1
  18. package/cjs/common/regression-lowess.js +3 -2
  19. package/cjs/common/regression-lowess.js.map +1 -1
  20. package/cjs/common/regression-polynomial.d.ts +2 -1
  21. package/cjs/common/regression-polynomial.js +3 -3
  22. package/cjs/common/regression-polynomial.js.map +1 -1
  23. package/cjs/data-structure/bounds.js +1 -1
  24. package/cjs/data-structure/hashTable.js +1 -2
  25. package/cjs/data-structure/index.js +1 -1
  26. package/cjs/data-structure/matrix.js +1 -1
  27. package/cjs/data-structure/point.js +1 -1
  28. package/dist/index.js +13 -7
  29. package/dist/index.min.js +1 -1
  30. package/es/common/ascending.js +2 -1
  31. package/es/common/extent.js +1 -2
  32. package/es/common/index.js +2 -1
  33. package/es/common/isNull.js +1 -2
  34. package/es/common/isPlainObject.js +2 -1
  35. package/es/common/isShallowEqual.js +1 -1
  36. package/es/common/isString.js +1 -1
  37. package/es/common/isType.js +1 -1
  38. package/es/common/isUndefined.js +1 -1
  39. package/es/common/isValid.js +1 -1
  40. package/es/common/regression-linear.d.ts +4 -2
  41. package/es/common/regression-linear.js +4 -2
  42. package/es/common/regression-linear.js.map +1 -1
  43. package/es/common/regression-logistic.d.ts +3 -2
  44. package/es/common/regression-logistic.js +3 -3
  45. package/es/common/regression-logistic.js.map +1 -1
  46. package/es/common/regression-lowess.d.ts +2 -1
  47. package/es/common/regression-lowess.js +3 -2
  48. package/es/common/regression-lowess.js.map +1 -1
  49. package/es/common/regression-polynomial.d.ts +2 -1
  50. package/es/common/regression-polynomial.js +3 -3
  51. package/es/common/regression-polynomial.js.map +1 -1
  52. package/es/data-structure/bounds.js +1 -1
  53. package/es/data-structure/hashTable.js +1 -2
  54. package/es/data-structure/index.js +1 -1
  55. package/es/data-structure/matrix.js +1 -1
  56. package/es/data-structure/point.js +1 -1
  57. package/package.json +3 -3
@@ -6,4 +6,5 @@ function ascending(a, b) {
6
6
 
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: !0
9
- }), exports.ascending = void 0, exports.ascending = ascending;
9
+ }), exports.ascending = void 0, exports.ascending = ascending;
10
+ //# sourceMappingURL=ascending.js.map
@@ -26,5 +26,4 @@ const isFunction_1 = __importDefault(require("./isFunction")), isNil_1 = __impor
26
26
  return [ min, max ];
27
27
  };
28
28
 
29
- exports.extent = extent;
30
- //# sourceMappingURL=extent.js.map
29
+ exports.extent = extent;
@@ -524,4 +524,5 @@ __exportStar(require("./toPercent"), exports), __exportStar(require("./zero"), e
524
524
  __exportStar(require("./extent"), exports), __exportStar(require("./regression-linear"), exports),
525
525
  __exportStar(require("./regression-logistic"), exports), __exportStar(require("./regression-lowess"), exports),
526
526
  __exportStar(require("./regression-polynomial"), exports), __exportStar(require("./kde"), exports),
527
- __exportStar(require("./ecdf"), exports);
527
+ __exportStar(require("./ecdf"), exports);
528
+ //# sourceMappingURL=index.js.map
@@ -6,5 +6,4 @@ Object.defineProperty(exports, "__esModule", {
6
6
 
7
7
  const isNull = value => null === value;
8
8
 
9
- exports.default = isNull;
10
- //# sourceMappingURL=isNull.js.map
9
+ exports.default = isNull;
@@ -18,4 +18,5 @@ const isObjectLike_1 = __importDefault(require("./isObjectLike")), isType_1 = __
18
18
  return Object.getPrototypeOf(value) === proto;
19
19
  };
20
20
 
21
- exports.default = isPlainObject;
21
+ exports.default = isPlainObject;
22
+ //# sourceMappingURL=isPlainObject.js.map
@@ -31,4 +31,4 @@ function isShallowEqual(objA, objB) {
31
31
  }
32
32
 
33
33
  exports.isShallowEqual = isShallowEqual;
34
- //# sourceMappingURL=isShallowEqual.js.map
34
+ //# sourceMappingURL=isShallowEqual.js.map
@@ -16,4 +16,4 @@ const isType_1 = __importDefault(require("./isType")), isString = (value, fuzzy
16
16
  };
17
17
 
18
18
  exports.default = isString;
19
- //# sourceMappingURL=isString.js.map
19
+ //# sourceMappingURL=isString.js.map
@@ -7,4 +7,4 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const isType = (value, type) => Object.prototype.toString.call(value) === `[object ${type}]`;
8
8
 
9
9
  exports.default = isType;
10
- //# sourceMappingURL=isType.js.map
10
+ //# sourceMappingURL=isType.js.map
@@ -7,4 +7,4 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const isUndefined = value => void 0 === value;
8
8
 
9
9
  exports.default = isUndefined;
10
- //# sourceMappingURL=isUndefined.js.map
10
+ //# sourceMappingURL=isUndefined.js.map
@@ -7,4 +7,4 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const isValid = value => null != value;
8
8
 
9
9
  exports.default = isValid;
10
- //# sourceMappingURL=isValid.js.map
10
+ //# sourceMappingURL=isValid.js.map
@@ -4,7 +4,9 @@ export declare function ordinaryLeastSquares(uX: number, uY: number, uXY: number
4
4
  };
5
5
  export declare function visitPoints(data: any[], x: (d: any) => number, y: (d: any) => number, callback: (x: number, y: number, index: number) => void): void;
6
6
  export declare function rSquared(data: any[], x: (d: any) => number, y: (d: any) => number, uY: number, predict: (x: number) => number): number;
7
- export declare function regressionLinear(data: any[], x?: (d: any) => number, y?: (d: any) => number): {
7
+ export declare function regressionLinear(data: any[], x?: (d: any) => number, y?: (d: any) => number, options?: {
8
+ alpha?: number;
9
+ }): {
8
10
  coef: {
9
11
  a: number;
10
12
  b: number;
@@ -15,7 +17,7 @@ export declare function regressionLinear(data: any[], x?: (d: any) => number, y?
15
17
  x: number;
16
18
  y: number;
17
19
  }[];
18
- confidenceInterval: (N?: number, alpha?: number) => {
20
+ confidenceInterval: (N?: number) => {
19
21
  x: number;
20
22
  mean: number;
21
23
  lower: number;
@@ -48,7 +48,9 @@ function rSquared(data, x, y, uY, predict) {
48
48
  return 0 === sst ? 0 : 1 - ssr / sst;
49
49
  }
50
50
 
51
- function regressionLinear(data, x = (d => d.x), y = (d => d.y)) {
51
+ function regressionLinear(data, x = (d => d.x), y = (d => d.y), options) {
52
+ var _a;
53
+ const alpha = null !== (_a = null == options ? void 0 : options.alpha) && void 0 !== _a ? _a : .05;
52
54
  let n = 0, meanX = 0, meanY = 0, meanXY = 0, meanX2 = 0;
53
55
  visitPoints(data, x, y, ((xi, yi) => {
54
56
  n++, meanX += (xi - meanX) / n, meanY += (yi - meanY) / n, meanXY += (xi * yi - meanXY) / n,
@@ -83,7 +85,7 @@ function regressionLinear(data, x = (d => d.x), y = (d => d.y)) {
83
85
  }
84
86
  return out;
85
87
  },
86
- confidenceInterval: function(N = 50, alpha = .05) {
88
+ confidenceInterval: function(N = 50) {
87
89
  const out = [];
88
90
  if (0 === comps.n || N <= 0) return out;
89
91
  const z = (0, regression_utils_1.invNorm)(1 - alpha / 2);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-linear.ts"],"names":[],"mappings":"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","file":"regression-linear.js","sourcesContent":["import isNil from './isNil';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\n/**\n * Linear regression utilities (single clean implementation).\n * Exports: ordinaryLeastSquares, visitPoints, rSquared, regressionLinear\n */\n\nexport function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number) {\n const denom = uX2 - uX * uX;\n if (Math.abs(denom) < Number.EPSILON) {\n return { a: uY, b: 0 };\n }\n const b = (uXY - uX * uY) / denom;\n const a = uY - b * uX;\n return { a, b };\n}\n\nexport function visitPoints(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n callback: (x: number, y: number, index: number) => void\n) {\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let xi = x(d);\n let yi = y(d);\n if (!isNil(xi) && (xi = +xi) >= xi && !isNil(yi) && (yi = +yi) >= yi) {\n callback(xi, yi, i);\n }\n }\n}\n\nexport function rSquared(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n uY: number,\n predict: (x: number) => number\n) {\n let ssr = 0;\n let sst = 0;\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let yi = y(d);\n if (!isNil(yi) && (yi = +yi) >= yi) {\n const p = predict(x(d));\n const r = yi - p;\n ssr += r * r;\n const t = yi - uY;\n sst += t * t;\n }\n }\n return sst === 0 ? 0 : 1 - ssr / sst;\n}\n\nexport function regressionLinear(data: any[], x: (d: any) => number = d => d.x, y: (d: any) => number = d => d.y) {\n // accumulate online means (sufficient statistics)\n let n = 0;\n let meanX = 0;\n let meanY = 0;\n let meanXY = 0;\n let meanX2 = 0;\n\n visitPoints(data, x, y, (xi, yi) => {\n n++;\n meanX += (xi - meanX) / n;\n meanY += (yi - meanY) / n;\n meanXY += (xi * yi - meanXY) / n;\n meanX2 += (xi * xi - meanX2) / n;\n });\n\n const { a, b } = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2);\n const predict = (xx: number) => a + b * xx;\n\n const comps = computeLinearCIComponents(data, x, y, predict);\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (comps.n === 0 || N <= 0) {\n return out;\n }\n if (comps.min === comps.max) {\n for (let i = 0; i < N; i++) {\n out.push({ x: comps.min, y: predict(comps.min) });\n }\n return out;\n }\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n out.push({ x: px, y: predict(px) });\n }\n return out;\n }\n\n function confidenceInterval(N: number = 50, alpha: number = 0.05) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n if (comps.n === 0 || N <= 0) {\n return out;\n }\n const z = invNorm(1 - alpha / 2);\n if (comps.min === comps.max) {\n const m = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: m,\n lower: m - z * errs.seMean,\n upper: m + z * errs.seMean,\n predLower: m - z * errs.sePred,\n predUpper: m + z * errs.sePred\n });\n }\n return out;\n }\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const m = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: m,\n lower: m - z * errs.seMean,\n upper: m + z * errs.seMean,\n predLower: m - z * errs.sePred,\n predUpper: m + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n coef: { a, b },\n predict,\n rSquared: rSquared(data, x, y, meanY, predict),\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default {\n ordinaryLeastSquares,\n visitPoints,\n rSquared,\n regressionLinear\n};\n"]}
1
+ {"version":3,"sources":["../src/common/regression-linear.ts"],"names":[],"mappings":"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","file":"regression-linear.js","sourcesContent":["import isNil from './isNil';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\n/**\n * Linear regression utilities (single clean implementation).\n * Exports: ordinaryLeastSquares, visitPoints, rSquared, regressionLinear\n */\n\nexport function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number) {\n const denom = uX2 - uX * uX;\n if (Math.abs(denom) < Number.EPSILON) {\n return { a: uY, b: 0 };\n }\n const b = (uXY - uX * uY) / denom;\n const a = uY - b * uX;\n return { a, b };\n}\n\nexport function visitPoints(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n callback: (x: number, y: number, index: number) => void\n) {\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let xi = x(d);\n let yi = y(d);\n if (!isNil(xi) && (xi = +xi) >= xi && !isNil(yi) && (yi = +yi) >= yi) {\n callback(xi, yi, i);\n }\n }\n}\n\nexport function rSquared(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n uY: number,\n predict: (x: number) => number\n) {\n let ssr = 0;\n let sst = 0;\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let yi = y(d);\n if (!isNil(yi) && (yi = +yi) >= yi) {\n const p = predict(x(d));\n const r = yi - p;\n ssr += r * r;\n const t = yi - uY;\n sst += t * t;\n }\n }\n return sst === 0 ? 0 : 1 - ssr / sst;\n}\n\nexport function regressionLinear(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options?: {\n alpha?: number;\n }\n) {\n const alpha = options?.alpha ?? 0.05;\n // accumulate online means (sufficient statistics)\n let n = 0;\n let meanX = 0;\n let meanY = 0;\n let meanXY = 0;\n let meanX2 = 0;\n\n visitPoints(data, x, y, (xi, yi) => {\n n++;\n meanX += (xi - meanX) / n;\n meanY += (yi - meanY) / n;\n meanXY += (xi * yi - meanXY) / n;\n meanX2 += (xi * xi - meanX2) / n;\n });\n\n const { a, b } = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2);\n const predict = (xx: number) => a + b * xx;\n\n const comps = computeLinearCIComponents(data, x, y, predict);\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (comps.n === 0 || N <= 0) {\n return out;\n }\n if (comps.min === comps.max) {\n for (let i = 0; i < N; i++) {\n out.push({ x: comps.min, y: predict(comps.min) });\n }\n return out;\n }\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n out.push({ x: px, y: predict(px) });\n }\n return out;\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n if (comps.n === 0 || N <= 0) {\n return out;\n }\n const z = invNorm(1 - alpha / 2);\n if (comps.min === comps.max) {\n const m = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: m,\n lower: m - z * errs.seMean,\n upper: m + z * errs.seMean,\n predLower: m - z * errs.sePred,\n predUpper: m + z * errs.sePred\n });\n }\n return out;\n }\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const m = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: m,\n lower: m - z * errs.seMean,\n upper: m + z * errs.seMean,\n predLower: m - z * errs.sePred,\n predUpper: m + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n coef: { a, b },\n predict,\n rSquared: rSquared(data, x, y, meanY, predict),\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default {\n ordinaryLeastSquares,\n visitPoints,\n rSquared,\n regressionLinear\n};\n"]}
@@ -1,14 +1,15 @@
1
1
  export declare function regressionLogistic(data: any[], x?: (d: any) => number, y?: (d: any) => number, options?: {
2
2
  maxIteration?: number;
3
3
  tol?: number;
4
+ alpha?: number;
4
5
  }): {
5
6
  coef: number[];
6
- predict: (xx: number) => number;
7
+ predict: (_x: number) => number;
7
8
  evaluateGrid: (N: number) => {
8
9
  x: number;
9
10
  y: number;
10
11
  }[];
11
- confidenceInterval: (N?: number, alpha?: number) => {
12
+ confidenceInterval: (N?: number) => {
12
13
  x: number;
13
14
  mean: number;
14
15
  lower: number;
@@ -7,8 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const regression_linear_1 = require("./regression-linear"), regression_utils_1 = require("./regression-utils");
8
8
 
9
9
  function regressionLogistic(data, x = (d => d.x), y = (d => d.y), options) {
10
- var _a, _b;
11
- const maxIter = null !== (_a = null == options ? void 0 : options.maxIteration) && void 0 !== _a ? _a : 25, tol = null !== (_b = null == options ? void 0 : options.tol) && void 0 !== _b ? _b : 1e-6, xs = [], ys = [];
10
+ var _a, _b, _c;
11
+ const maxIter = null !== (_a = null == options ? void 0 : options.maxIteration) && void 0 !== _a ? _a : 25, tol = null !== (_b = null == options ? void 0 : options.tol) && void 0 !== _b ? _b : 1e-6, alpha = null !== (_c = null == options ? void 0 : options.alpha) && void 0 !== _c ? _c : .05, xs = [], ys = [];
12
12
  (0, regression_linear_1.visitPoints)(data, x, y, ((dx, dy) => {
13
13
  xs.push(dx), ys.push(dy ? 1 : 0);
14
14
  }));
@@ -70,7 +70,7 @@ function regressionLogistic(data, x = (d => d.x), y = (d => d.y), options) {
70
70
  }
71
71
  return out;
72
72
  },
73
- confidenceInterval: function(N = 50, alpha = .05) {
73
+ confidenceInterval: function(N = 50) {
74
74
  const out = [];
75
75
  if (N <= 0) return out;
76
76
  const comps = (0, regression_utils_1.computeLinearCIComponents)(data, x, y, predict);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-logistic.ts"],"names":[],"mappings":"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","file":"regression-logistic.js","sourcesContent":["import { visitPoints } from './regression-linear';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\n/**\n * Simple logistic regression (binary) using Newton-Raphson (IRLS).\n * Returns { coef, predict, evaluateGrid }\n * - coef: [intercept, beta]\n * - predict(x): probability p(y=1|x)\n */\nexport function regressionLogistic(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options?: { maxIteration?: number; tol?: number }\n) {\n const maxIter = options?.maxIteration ?? 25;\n const tol = options?.tol ?? 1e-6;\n // build arrays\n const xs: number[] = [];\n const ys: number[] = [];\n visitPoints(data, x, y, (dx, dy) => {\n xs.push(dx);\n ys.push(dy ? 1 : 0);\n });\n\n const n = xs.length;\n if (n === 0) {\n return {\n coef: [0, 0],\n predict: (_x: number) => 0,\n evaluateGrid: (N: number) => [] as { x: number; y: number }[],\n confidenceInterval: (N: number = 50) =>\n [] as { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[]\n };\n }\n\n // initial coef via linear regression rough guess\n let intercept = 0;\n let beta = 0;\n\n for (let iter = 0; iter < maxIter; iter++) {\n const p: number[] = new Array(n);\n let converged = true;\n for (let i = 0; i < n; i++) {\n const z = intercept + beta * xs[i];\n const pi = 1 / (1 + Math.exp(-z));\n p[i] = pi;\n }\n\n // compute gradient and hessian\n let g0 = 0;\n let g1 = 0;\n let h00 = 0;\n let h01 = 0;\n let h11 = 0;\n for (let i = 0; i < n; i++) {\n const wi = p[i] * (1 - p[i]);\n const diff = ys[i] - p[i];\n g0 += diff;\n g1 += diff * xs[i];\n h00 += wi;\n h01 += wi * xs[i];\n h11 += wi * xs[i] * xs[i];\n }\n\n // solve 2x2 system H * delta = g\n const det = h00 * h11 - h01 * h01;\n if (Math.abs(det) < 1e-12) {\n break;\n }\n const delta0 = (h11 * g0 - h01 * g1) / det;\n const delta1 = (-h01 * g0 + h00 * g1) / det;\n\n intercept += delta0;\n beta += delta1;\n\n if (Math.abs(delta0) > tol || Math.abs(delta1) > tol) {\n converged = false;\n }\n if (converged) {\n break;\n }\n }\n\n const predict = (xx: number) => {\n const z = intercept + beta * xx;\n return 1 / (1 + Math.exp(-z));\n };\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n let min = Infinity;\n let max = -Infinity;\n visitPoints(data, x, y, dx => {\n if (dx < min) {\n min = dx;\n }\n if (dx > max) {\n max = dx;\n }\n });\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n if (min === max) {\n const v = predict(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\n }\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n out.push({ x: px, y: predict(px) });\n }\n return out;\n }\n\n function confidenceInterval(N: number = 50, alpha: number = 0.05) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, predict);\n if (comps.n === 0) {\n return out;\n }\n\n const z = Math.abs(invNorm(1 - alpha / 2));\n if (comps.min === comps.max) {\n const v = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - z * errs.seMean,\n upper: v + z * errs.seMean,\n predLower: v - z * errs.sePred,\n predUpper: v + z * errs.sePred\n });\n }\n return out;\n }\n\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const yh = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: yh,\n lower: yh - z * errs.seMean,\n upper: yh + z * errs.seMean,\n predLower: yh - z * errs.sePred,\n predUpper: yh + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n coef: [intercept, beta],\n predict,\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default regressionLogistic;\n"]}
1
+ {"version":3,"sources":["../src/common/regression-logistic.ts"],"names":[],"mappings":"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","file":"regression-logistic.js","sourcesContent":["import { visitPoints } from './regression-linear';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\n/**\n * Simple logistic regression (binary) using Newton-Raphson (IRLS).\n * Returns { coef, predict, evaluateGrid }\n * - coef: [intercept, beta]\n * - predict(x): probability p(y=1|x)\n */\nexport function regressionLogistic(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options?: { maxIteration?: number; tol?: number; alpha?: number }\n) {\n const maxIter = options?.maxIteration ?? 25;\n const tol = options?.tol ?? 1e-6;\n const alpha = options?.alpha ?? 0.05;\n // build arrays\n const xs: number[] = [];\n const ys: number[] = [];\n visitPoints(data, x, y, (dx, dy) => {\n xs.push(dx);\n ys.push(dy ? 1 : 0);\n });\n\n const n = xs.length;\n if (n === 0) {\n return {\n coef: [0, 0],\n predict: (_x: number) => 0,\n evaluateGrid: (N: number) => [] as { x: number; y: number }[],\n confidenceInterval: (N: number = 50) =>\n [] as { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[]\n };\n }\n\n // initial coef via linear regression rough guess\n let intercept = 0;\n let beta = 0;\n\n for (let iter = 0; iter < maxIter; iter++) {\n const p: number[] = new Array(n);\n let converged = true;\n for (let i = 0; i < n; i++) {\n const z = intercept + beta * xs[i];\n const pi = 1 / (1 + Math.exp(-z));\n p[i] = pi;\n }\n\n // compute gradient and hessian\n let g0 = 0;\n let g1 = 0;\n let h00 = 0;\n let h01 = 0;\n let h11 = 0;\n for (let i = 0; i < n; i++) {\n const wi = p[i] * (1 - p[i]);\n const diff = ys[i] - p[i];\n g0 += diff;\n g1 += diff * xs[i];\n h00 += wi;\n h01 += wi * xs[i];\n h11 += wi * xs[i] * xs[i];\n }\n\n // solve 2x2 system H * delta = g\n const det = h00 * h11 - h01 * h01;\n if (Math.abs(det) < 1e-12) {\n break;\n }\n const delta0 = (h11 * g0 - h01 * g1) / det;\n const delta1 = (-h01 * g0 + h00 * g1) / det;\n\n intercept += delta0;\n beta += delta1;\n\n if (Math.abs(delta0) > tol || Math.abs(delta1) > tol) {\n converged = false;\n }\n if (converged) {\n break;\n }\n }\n\n const predict = (xx: number) => {\n const z = intercept + beta * xx;\n return 1 / (1 + Math.exp(-z));\n };\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n let min = Infinity;\n let max = -Infinity;\n visitPoints(data, x, y, dx => {\n if (dx < min) {\n min = dx;\n }\n if (dx > max) {\n max = dx;\n }\n });\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n if (min === max) {\n const v = predict(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\n }\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n out.push({ x: px, y: predict(px) });\n }\n return out;\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, predict);\n if (comps.n === 0) {\n return out;\n }\n\n const z = Math.abs(invNorm(1 - alpha / 2));\n if (comps.min === comps.max) {\n const v = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - z * errs.seMean,\n upper: v + z * errs.seMean,\n predLower: v - z * errs.sePred,\n predUpper: v + z * errs.sePred\n });\n }\n return out;\n }\n\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const yh = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: yh,\n lower: yh - z * errs.seMean,\n upper: yh + z * errs.seMean,\n predLower: yh - z * errs.sePred,\n predUpper: yh + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n coef: [intercept, beta],\n predict,\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default regressionLogistic;\n"]}
@@ -2,6 +2,7 @@ export declare function regressionLowess(data: any[], x?: (d: any) => number, y?
2
2
  span?: number;
3
3
  degree?: 1 | 0;
4
4
  iterations?: number;
5
+ alpha?: number;
5
6
  }): {
6
7
  predict: (x0: number | number[]) => number | number[];
7
8
  evaluate: any;
@@ -9,7 +10,7 @@ export declare function regressionLowess(data: any[], x?: (d: any) => number, y?
9
10
  x: number;
10
11
  y: number;
11
12
  }[];
12
- confidenceInterval: (N?: number, alpha?: number) => {
13
+ confidenceInterval: (N?: number) => {
13
14
  x: number;
14
15
  mean: number;
15
16
  lower: number;
@@ -14,7 +14,8 @@ function tricube(u) {
14
14
  }
15
15
 
16
16
  function regressionLowess(data, x = (d => d.x), y = (d => d.y), options = {}) {
17
- const span = options.span || .3, degree = 0 === options.degree ? 0 : 1, iterations = null == options.iterations ? 2 : options.iterations, ptsX = [], ptsY = [];
17
+ var _a;
18
+ const span = options.span || .3, degree = 0 === options.degree ? 0 : 1, alpha = null !== (_a = null == options ? void 0 : options.alpha) && void 0 !== _a ? _a : .05, iterations = null == options.iterations ? 2 : options.iterations, ptsX = [], ptsY = [];
18
19
  (0, regression_linear_1.visitPoints)(data, x, y, ((dx, dy) => {
19
20
  ptsX.push(dx), ptsY.push(dy);
20
21
  }));
@@ -97,7 +98,7 @@ function regressionLowess(data, x = (d => d.x), y = (d => d.y), options = {}) {
97
98
  }
98
99
  return out;
99
100
  },
100
- confidenceInterval: function(N = 50, alpha = .05) {
101
+ confidenceInterval: function(N = 50) {
101
102
  const out = [];
102
103
  if (N <= 0) return out;
103
104
  if (0 === n) return out;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-lowess.ts"],"names":[],"mappings":";;;AAAA,2DAAkD;AAClD,yDAAqF;AAErF,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC,EAAE;QACX,OAAO,CAAC,CAAC;KACV;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AASD,SAAgB,gBAAgB,CAC9B,IAAW,EACX,IAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAChC,IAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAChC,UAAkE,EAAE;IAEpE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAEvE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAA,+BAAW,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,SAAS,aAAa,CAAC,EAAU,EAAE,aAAwB;QACzD,IAAI,CAAC,KAAK,CAAC,EAAE;YACX,OAAO,CAAC,CAAC;SACV;QAED,MAAM,KAAK,GAAoC,EAAE,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;SACtD;QACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAGvC,MAAM,CAAC,GAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACzB,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC;YACtD,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,aAAa,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;gBAC/C,EAAE,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;aAC1B;YACD,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACV,IAAI,IAAI,EAAE,CAAC;SACZ;QAED,IAAI,IAAI,KAAK,CAAC,EAAE;YAEd,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3B;QAED,IAAI,MAAM,KAAK,CAAC,EAAE;YAChB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAChC;YACD,OAAO,CAAC,GAAG,IAAI,CAAC;SACjB;QAGD,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChB,EAAE,IAAI,EAAE,CAAC;YACT,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACd,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACd,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpB,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;SACrB;QAED,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;QACvE,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QACxC,OAAO,SAAS,GAAG,KAAK,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,SAAS,OAAO,CAAC,EAAqB;QACpC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACrB,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAClC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChC;YACD,OAAO,GAAG,CAAC;SACZ;QACD,OAAO,aAAa,CAAC,EAAY,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,YAAY,CAAC,CAAS;QAC7B,MAAM,GAAG,GAA+B,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,EAAE;YACV,OAAO,GAAG,CAAC;SACZ;QACD,IAAI,CAAC,KAAK,CAAC,EAAE;YACX,OAAO,GAAG,CAAC;SACZ;QACD,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE;gBACjB,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;aACf;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE;gBACjB,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;aACf;SACF;QACD,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aAC5B;YACD,OAAO,GAAG,CAAC;SACZ;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAGnC,IAAI,aAAmC,CAAC;QACxC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,UAAU,EAAE,IAAI,EAAE,EAAE;YAE5C,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;aAClD;YAED,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACvC;YAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,aAAa,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3D,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACtB;SACF;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;SAC1D;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,EAAE,QAAgB,IAAI;QAC9D,MAAM,GAAG,GAAsG,EAAE,CAAC;QAElH,IAAI,CAAC,IAAI,CAAC,EAAE;YACV,OAAO,GAAG,CAAC;SACZ;QACD,IAAI,CAAC,KAAK,CAAC,EAAE;YACX,OAAO,GAAG,CAAC;SACZ;QAGD,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE;gBACjB,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;aACf;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE;gBACjB,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;aACf;SACF;QACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE;YACzC,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,KAAK,GAAG,IAAA,4CAAyB,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE;YACjB,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,0BAAO,EAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,IAAA,8BAAW,EAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,GAAG,CAAC,IAAI,CAAC;oBACP,CAAC,EAAE,KAAK,CAAC,GAAG;oBACZ,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;oBAC1B,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;oBAC1B,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;oBAC9B,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;iBAC/B,CAAC,CAAC;aACJ;YACD,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;YAC9C,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAA,8BAAW,EAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC;gBACP,CAAC,EAAE,EAAE;gBACL,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAC3B,KAAK,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAC3B,SAAS,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAC/B,SAAS,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;aAChC,CAAC,CAAC;SACJ;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,OAAc;QACxB,YAAY;QACZ,kBAAkB;KACnB,CAAC;AACJ,CAAC;AA/ND,4CA+NC;AAED,kBAAe,gBAAgB,CAAC","file":"regression-lowess.js","sourcesContent":["import { visitPoints } from './regression-linear';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\nfunction tricube(u: number) {\n const uu = Math.abs(u);\n if (uu >= 1) {\n return 0;\n }\n const t = 1 - uu * uu * uu;\n return t * t * t;\n}\n\n/**\n * Simple lowess implementation (univariate x)\n * options:\n * - span: fraction of points used in local regression (0,1]\n * - degree: 0 (constant) or 1 (linear)\n * - iterations: number of robustifying iterations\n */\nexport function regressionLowess(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: { span?: number; degree?: 1 | 0; iterations?: number } = {}\n) {\n const span = options.span || 0.3;\n const degree = options.degree === 0 ? 0 : 1;\n const iterations = options.iterations == null ? 2 : options.iterations;\n\n const ptsX: number[] = [];\n const ptsY: number[] = [];\n visitPoints(data, x, y, (dx, dy) => {\n ptsX.push(dx);\n ptsY.push(dy);\n });\n\n const n = ptsX.length;\n function predictSingle(x0: number, robustWeights?: number[]) {\n if (n === 0) {\n return 0;\n }\n // compute distances and select nearest m points\n const dists: { idx: number; dist: number }[] = [];\n for (let i = 0; i < n; i++) {\n dists.push({ idx: i, dist: Math.abs(ptsX[i] - x0) });\n }\n dists.sort((a, b) => a.dist - b.dist);\n const m = Math.max(2, Math.min(n, Math.floor(span * n)));\n const maxDist = dists[m - 1].dist || 0;\n\n // compute weights\n const w: number[] = new Array(m);\n let sumw = 0;\n for (let i = 0; i < m; i++) {\n const idx = dists[i].idx;\n const u = maxDist === 0 ? 0 : dists[i].dist / maxDist;\n let wi = tricube(u);\n if (robustWeights && robustWeights[idx] != null) {\n wi *= robustWeights[idx];\n }\n w[i] = wi;\n sumw += wi;\n }\n\n if (sumw === 0) {\n // fallback to nearest y\n return ptsY[dists[0].idx];\n }\n\n if (degree === 0) {\n let s = 0;\n for (let i = 0; i < m; i++) {\n s += w[i] * ptsY[dists[i].idx];\n }\n return s / sumw;\n }\n\n // weighted linear regression on local points\n let sw = 0;\n let sx = 0;\n let sy = 0;\n let sxx = 0;\n let sxy = 0;\n for (let i = 0; i < m; i++) {\n const idx = dists[i].idx;\n const xi = ptsX[idx];\n const yi = ptsY[idx];\n const wi = w[i];\n sw += wi;\n sx += wi * xi;\n sy += wi * yi;\n sxx += wi * xi * xi;\n sxy += wi * xi * yi;\n }\n\n const meanX = sx / sw;\n const meanY = sy / sw;\n const denom = sxx - sx * meanX;\n const slope = Math.abs(denom) < 1e-12 ? 0 : (sxy - sx * meanY) / denom;\n const intercept = meanY - slope * meanX;\n return intercept + slope * x0;\n }\n\n function predict(x0: number | number[]) {\n if (Array.isArray(x0)) {\n const out: number[] = [];\n for (let i = 0; i < x0.length; i++) {\n out.push(predictSingle(x0[i]));\n }\n return out;\n }\n return predictSingle(x0 as number);\n }\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < n; i++) {\n if (ptsX[i] < min) {\n min = ptsX[i];\n }\n if (ptsX[i] > max) {\n max = ptsX[i];\n }\n }\n if (min === max) {\n const v = predictSingle(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\n }\n const step = (max - min) / (N - 1);\n\n // optionally add robust iterations\n let robustWeights: number[] | undefined;\n for (let iter = 0; iter < iterations; iter++) {\n // compute fits\n const fits: number[] = [];\n for (let i = 0; i < n; i++) {\n fits.push(predictSingle(ptsX[i], robustWeights));\n }\n // compute residuals\n const res: number[] = [];\n for (let i = 0; i < n; i++) {\n res.push(Math.abs(ptsY[i] - fits[i]));\n }\n // median absolute deviation\n const sortedRes = res.slice().sort((a, b) => a - b);\n const med = sortedRes[Math.floor(n / 2)] || 0;\n robustWeights = new Array(n);\n for (let i = 0; i < n; i++) {\n const u = med === 0 ? 0 : res[i] / (6 * med);\n const w = Math.abs(u) >= 1 ? 0 : (1 - u * u) * (1 - u * u);\n robustWeights[i] = w;\n }\n }\n\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n out.push({ x: px, y: predictSingle(px, robustWeights) });\n }\n return out;\n }\n\n function confidenceInterval(N: number = 50, alpha: number = 0.05) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n\n // use data x-range\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < n; i++) {\n if (ptsX[i] < min) {\n min = ptsX[i];\n }\n if (ptsX[i] > max) {\n max = ptsX[i];\n }\n }\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, (xx: number) => predictSingle(xx));\n if (comps.n === 0) {\n return out;\n }\n\n const z = Math.abs(invNorm(1 - alpha / 2));\n if (comps.min === comps.max) {\n const v = predictSingle(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - z * errs.seMean,\n upper: v + z * errs.seMean,\n predLower: v - z * errs.sePred,\n predUpper: v + z * errs.sePred\n });\n }\n return out;\n }\n\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n const yh = predictSingle(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: yh,\n lower: yh - z * errs.seMean,\n upper: yh + z * errs.seMean,\n predLower: yh - z * errs.sePred,\n predUpper: yh + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n predict,\n evaluate: predict as any,\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default regressionLowess;\n"]}
1
+ {"version":3,"sources":["../src/common/regression-lowess.ts"],"names":[],"mappings":"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","file":"regression-lowess.js","sourcesContent":["import { visitPoints } from './regression-linear';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\nfunction tricube(u: number) {\n const uu = Math.abs(u);\n if (uu >= 1) {\n return 0;\n }\n const t = 1 - uu * uu * uu;\n return t * t * t;\n}\n\n/**\n * Simple lowess implementation (univariate x)\n * options:\n * - span: fraction of points used in local regression (0,1]\n * - degree: 0 (constant) or 1 (linear)\n * - iterations: number of robustifying iterations\n */\nexport function regressionLowess(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: { span?: number; degree?: 1 | 0; iterations?: number; alpha?: number } = {}\n) {\n const span = options.span || 0.3;\n const degree = options.degree === 0 ? 0 : 1;\n const alpha = options?.alpha ?? 0.05;\n const iterations = options.iterations == null ? 2 : options.iterations;\n\n const ptsX: number[] = [];\n const ptsY: number[] = [];\n visitPoints(data, x, y, (dx, dy) => {\n ptsX.push(dx);\n ptsY.push(dy);\n });\n\n const n = ptsX.length;\n function predictSingle(x0: number, robustWeights?: number[]) {\n if (n === 0) {\n return 0;\n }\n // compute distances and select nearest m points\n const dists: { idx: number; dist: number }[] = [];\n for (let i = 0; i < n; i++) {\n dists.push({ idx: i, dist: Math.abs(ptsX[i] - x0) });\n }\n dists.sort((a, b) => a.dist - b.dist);\n const m = Math.max(2, Math.min(n, Math.floor(span * n)));\n const maxDist = dists[m - 1].dist || 0;\n\n // compute weights\n const w: number[] = new Array(m);\n let sumw = 0;\n for (let i = 0; i < m; i++) {\n const idx = dists[i].idx;\n const u = maxDist === 0 ? 0 : dists[i].dist / maxDist;\n let wi = tricube(u);\n if (robustWeights && robustWeights[idx] != null) {\n wi *= robustWeights[idx];\n }\n w[i] = wi;\n sumw += wi;\n }\n\n if (sumw === 0) {\n // fallback to nearest y\n return ptsY[dists[0].idx];\n }\n\n if (degree === 0) {\n let s = 0;\n for (let i = 0; i < m; i++) {\n s += w[i] * ptsY[dists[i].idx];\n }\n return s / sumw;\n }\n\n // weighted linear regression on local points\n let sw = 0;\n let sx = 0;\n let sy = 0;\n let sxx = 0;\n let sxy = 0;\n for (let i = 0; i < m; i++) {\n const idx = dists[i].idx;\n const xi = ptsX[idx];\n const yi = ptsY[idx];\n const wi = w[i];\n sw += wi;\n sx += wi * xi;\n sy += wi * yi;\n sxx += wi * xi * xi;\n sxy += wi * xi * yi;\n }\n\n const meanX = sx / sw;\n const meanY = sy / sw;\n const denom = sxx - sx * meanX;\n const slope = Math.abs(denom) < 1e-12 ? 0 : (sxy - sx * meanY) / denom;\n const intercept = meanY - slope * meanX;\n return intercept + slope * x0;\n }\n\n function predict(x0: number | number[]) {\n if (Array.isArray(x0)) {\n const out: number[] = [];\n for (let i = 0; i < x0.length; i++) {\n out.push(predictSingle(x0[i]));\n }\n return out;\n }\n return predictSingle(x0 as number);\n }\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < n; i++) {\n if (ptsX[i] < min) {\n min = ptsX[i];\n }\n if (ptsX[i] > max) {\n max = ptsX[i];\n }\n }\n if (min === max) {\n const v = predictSingle(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\n }\n const step = (max - min) / (N - 1);\n\n // optionally add robust iterations\n let robustWeights: number[] | undefined;\n for (let iter = 0; iter < iterations; iter++) {\n // compute fits\n const fits: number[] = [];\n for (let i = 0; i < n; i++) {\n fits.push(predictSingle(ptsX[i], robustWeights));\n }\n // compute residuals\n const res: number[] = [];\n for (let i = 0; i < n; i++) {\n res.push(Math.abs(ptsY[i] - fits[i]));\n }\n // median absolute deviation\n const sortedRes = res.slice().sort((a, b) => a - b);\n const med = sortedRes[Math.floor(n / 2)] || 0;\n robustWeights = new Array(n);\n for (let i = 0; i < n; i++) {\n const u = med === 0 ? 0 : res[i] / (6 * med);\n const w = Math.abs(u) >= 1 ? 0 : (1 - u * u) * (1 - u * u);\n robustWeights[i] = w;\n }\n }\n\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n out.push({ x: px, y: predictSingle(px, robustWeights) });\n }\n return out;\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n\n // use data x-range\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < n; i++) {\n if (ptsX[i] < min) {\n min = ptsX[i];\n }\n if (ptsX[i] > max) {\n max = ptsX[i];\n }\n }\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, (xx: number) => predictSingle(xx));\n if (comps.n === 0) {\n return out;\n }\n\n const z = Math.abs(invNorm(1 - alpha / 2));\n if (comps.min === comps.max) {\n const v = predictSingle(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - z * errs.seMean,\n upper: v + z * errs.seMean,\n predLower: v - z * errs.sePred,\n predUpper: v + z * errs.sePred\n });\n }\n return out;\n }\n\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n const yh = predictSingle(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: yh,\n lower: yh - z * errs.seMean,\n upper: yh + z * errs.seMean,\n predLower: yh - z * errs.sePred,\n predUpper: yh + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n predict,\n evaluate: predict as any,\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default regressionLowess;\n"]}
@@ -1,5 +1,6 @@
1
1
  export declare function regressionPolynomial(data: any[], x?: (d: any) => number, y?: (d: any) => number, options?: {
2
2
  degree?: number;
3
+ alpah?: number;
3
4
  }): {
4
5
  degree: number;
5
6
  coef: number[];
@@ -9,7 +10,7 @@ export declare function regressionPolynomial(data: any[], x?: (d: any) => number
9
10
  x: number;
10
11
  y: number;
11
12
  }[];
12
- confidenceInterval(N?: number, alpha?: number): {
13
+ confidenceInterval(N?: number): {
13
14
  x: number;
14
15
  mean: number;
15
16
  lower: number;
@@ -45,10 +45,10 @@ function solveLinearSystem(A, b) {
45
45
  }
46
46
 
47
47
  function regressionPolynomial(data, x = (d => d.x), y = (d => d.y), options = {}) {
48
- var _a;
48
+ var _a, _b;
49
49
  let degree = null !== (_a = options.degree) && void 0 !== _a ? _a : 0;
50
50
  degree < 0 && (degree = 0);
51
- const m = degree + 1, sums = new Array(2 * degree + 1).fill(0);
51
+ const alpha = null !== (_b = options.alpah) && void 0 !== _b ? _b : .5, m = degree + 1, sums = new Array(2 * degree + 1).fill(0);
52
52
  (0, regression_linear_1.visitPoints)(data, x, y, ((dx, dy) => {
53
53
  let xp = 1;
54
54
  for (let k = 0; k < sums.length; k++) sums[k] += xp, xp *= dx;
@@ -103,7 +103,7 @@ function regressionPolynomial(data, x = (d => d.x), y = (d => d.y), options = {}
103
103
  }
104
104
  return out;
105
105
  },
106
- confidenceInterval(N = 50, alpha = .05) {
106
+ confidenceInterval(N = 50) {
107
107
  const out = [];
108
108
  if (N <= 0) return out;
109
109
  const comps = (0, regression_utils_1.computeLinearCIComponents)(data, x, y, predict);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-polynomial.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA4D;AAC5D,oDAA4B;AAC5B,yDAAqF;AAErF,SAAS,iBAAiB,CAAC,CAAa,EAAE,CAAW;IAEnD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAEnB,MAAM,CAAC,GAAe,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACjB;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAE1B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG,MAAM,EAAE;gBACd,MAAM,GAAG,CAAC,CAAC;gBACX,MAAM,GAAG,CAAC,CAAC;aACZ;SACF;QACD,IAAI,MAAM,KAAK,CAAC,EAAE;YAChB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;SACjB;QAGD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;YAE7B,MAAM,GAAG,GAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC;SACZ;QAGD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAC/B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7B;QACD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAGZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,EAAE;gBACX,SAAS;aACV;YACD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,MAAM,KAAK,CAAC,EAAE;gBAChB,SAAS;aACV;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC/B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7B;YACD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACb;KACF;IAED,MAAM,CAAC,GAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAChB;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,oBAAoB,CAClC,IAAW,EACX,IAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAChC,IAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAChC,UAA+B,EAAE;;IAEjC,IAAI,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,CAAC,CAAC;IACjC,IAAI,MAAM,GAAG,CAAC,EAAE;QACd,MAAM,GAAG,CAAC,CAAC;KACZ;IACD,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IACrB,MAAM,IAAI,GAAa,IAAI,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzD,IAAA,+BAAW,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACjC,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACd,EAAE,IAAI,EAAE,CAAC;SACV;IACH,CAAC,CAAC,CAAC;IAGH,MAAM,CAAC,GAAe,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACvB;KACF;IAED,MAAM,CAAC,GAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,IAAA,+BAAW,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACjC,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YAChB,EAAE,IAAI,EAAE,CAAC;SACV;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE;QAC7B,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,EAAE,IAAI,EAAE,CAAC;SACV;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,IAAI;QACJ,OAAO;QACP,QAAQ,EAAE,IAAA,4BAAQ,EAChB,IAAI,EACJ,CAAC,EACD,CAAC,EACD,CAAC,GAAG,EAAE;YAEJ,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,IAAA,+BAAW,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE;gBAClC,GAAG,IAAI,EAAE,CAAC;gBACV,GAAG,EAAE,CAAC;YACR,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;QACnC,CAAC,CAAC,EAAE,EACJ,OAAO,CACR;QACD,YAAY,CAAC,CAAS;YACpB,MAAM,GAAG,GAA+B,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,EAAE;gBACV,OAAO,GAAG,CAAC;aACZ;YAED,IAAI,GAAG,GAAG,QAAQ,CAAC;YACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;YACpB,IAAA,+BAAW,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC3B,IAAI,CAAC,IAAA,eAAK,EAAC,EAAE,CAAC,EAAE;oBACd,IAAI,EAAE,GAAG,GAAG,EAAE;wBACZ,GAAG,GAAG,EAAE,CAAC;qBACV;oBACD,IAAI,EAAE,GAAG,GAAG,EAAE;wBACZ,GAAG,GAAG,EAAE,CAAC;qBACV;iBACF;YACH,CAAC,CAAC,CAAC;YACH,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE;gBACzC,OAAO,GAAG,CAAC;aACZ;YACD,IAAI,GAAG,KAAK,GAAG,EAAE;gBACf,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBAC5B;gBACD,OAAO,GAAG,CAAC;aACZ;YACD,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;gBAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACrC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,kBAAkB,CAAC,IAAY,EAAE,EAAE,QAAgB,IAAI;YACrD,MAAM,GAAG,GAAsG,EAAE,CAAC;YAElH,IAAI,CAAC,IAAI,CAAC,EAAE;gBACV,OAAO,GAAG,CAAC;aACZ;YAED,MAAM,KAAK,GAAG,IAAA,4CAAyB,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7D,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE;gBACjB,OAAO,GAAG,CAAC;aACZ;YAED,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,0BAAO,EAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAA,8BAAW,EAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1B,GAAG,CAAC,IAAI,CAAC;wBACP,CAAC,EAAE,KAAK,CAAC,GAAG;wBACZ,IAAI,EAAE,CAAC;wBACP,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;wBAC1B,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;wBAC1B,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;wBAC9B,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;qBAC/B,CAAC,CAAC;iBACJ;gBACD,OAAO,GAAG,CAAC;aACZ;YAED,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;gBAC1D,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM,IAAI,GAAG,IAAA,8BAAW,EAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACpC,GAAG,CAAC,IAAI,CAAC;oBACP,CAAC,EAAE,EAAE;oBACL,IAAI,EAAE,EAAE;oBACR,KAAK,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;oBAC3B,KAAK,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;oBAC3B,SAAS,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;oBAC/B,SAAS,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;iBAChC,CAAC,CAAC;aACJ;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAxJD,oDAwJC;AAED,kBAAe,oBAAoB,CAAC","file":"regression-polynomial.js","sourcesContent":["import { visitPoints, rSquared } from './regression-linear';\nimport isNil from './isNil';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\nfunction solveLinearSystem(A: number[][], b: number[]): number[] {\n // Gaussian elimination with partial pivoting\n const n = b.length;\n // clone\n const M: number[][] = new Array(n);\n for (let i = 0; i < n; i++) {\n M[i] = A[i].slice();\n M[i].push(b[i]);\n }\n\n for (let k = 0; k < n; k++) {\n // find pivot\n let maxRow = k;\n let maxVal = Math.abs(M[k][k]);\n for (let i = k + 1; i < n; i++) {\n const v = Math.abs(M[i][k]);\n if (v > maxVal) {\n maxVal = v;\n maxRow = i;\n }\n }\n if (maxRow !== k) {\n const tmp = M[k];\n M[k] = M[maxRow];\n M[maxRow] = tmp;\n }\n\n // singular check\n if (Math.abs(M[k][k]) < 1e-12) {\n // return least squares fallback zeros\n const res: number[] = new Array(n).fill(0);\n return res;\n }\n\n // normalize row\n for (let j = k + 1; j <= n; j++) {\n M[k][j] = M[k][j] / M[k][k];\n }\n M[k][k] = 1;\n\n // eliminate\n for (let i = 0; i < n; i++) {\n if (i === k) {\n continue;\n }\n const factor = M[i][k];\n if (factor === 0) {\n continue;\n }\n for (let j = k + 1; j <= n; j++) {\n M[i][j] -= factor * M[k][j];\n }\n M[i][k] = 0;\n }\n }\n\n const x: number[] = new Array(n);\n for (let i = 0; i < n; i++) {\n x[i] = M[i][n];\n }\n return x;\n}\n\nexport function regressionPolynomial(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: { degree?: number } = {}\n) {\n let degree = options.degree ?? 0;\n if (degree < 0) {\n degree = 0;\n }\n const m = degree + 1;\n const sums: number[] = new Array(2 * degree + 1).fill(0);\n\n visitPoints(data, x, y, (dx, dy) => {\n let xp = 1;\n for (let k = 0; k < sums.length; k++) {\n sums[k] += xp;\n xp *= dx;\n }\n });\n\n // build normal matrix\n const A: number[][] = new Array(m);\n for (let i = 0; i < m; i++) {\n A[i] = new Array(m).fill(0);\n for (let j = 0; j < m; j++) {\n A[i][j] = sums[i + j];\n }\n }\n\n const B: number[] = new Array(m).fill(0);\n visitPoints(data, x, y, (dx, dy) => {\n let xp = 1;\n for (let k = 0; k < m; k++) {\n B[k] += dy * xp;\n xp *= dx;\n }\n });\n\n const coef = solveLinearSystem(A, B);\n\n const predict = (xx: number) => {\n let xp = 1;\n let v = 0;\n for (let k = 0; k < coef.length; k++) {\n v += coef[k] * xp;\n xp *= xx;\n }\n return v;\n };\n\n return {\n degree,\n coef,\n predict,\n rSquared: rSquared(\n data,\n x,\n y,\n (() => {\n // compute mean y\n let sum = 0;\n let cnt = 0;\n visitPoints(data, x, y, (_dx, dy) => {\n sum += dy;\n cnt++;\n });\n return cnt === 0 ? 0 : sum / cnt;\n })(),\n predict\n ),\n evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n // compute range\n let min = Infinity;\n let max = -Infinity;\n visitPoints(data, x, y, dx => {\n if (!isNil(dx)) {\n if (dx < min) {\n min = dx;\n }\n if (dx > max) {\n max = dx;\n }\n }\n });\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n if (min === max) {\n const v = predict(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\n }\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n out.push({ x: px, y: predict(px) });\n }\n return out;\n },\n confidenceInterval(N: number = 50, alpha: number = 0.05) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, predict);\n if (comps.n === 0) {\n return out;\n }\n\n const z = Math.abs(invNorm(1 - alpha / 2));\n if (comps.min === comps.max) {\n const v = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - z * errs.seMean,\n upper: v + z * errs.seMean,\n predLower: v - z * errs.sePred,\n predUpper: v + z * errs.sePred\n });\n }\n return out;\n }\n\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const yh = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: yh,\n lower: yh - z * errs.seMean,\n upper: yh + z * errs.seMean,\n predLower: yh - z * errs.sePred,\n predUpper: yh + z * errs.sePred\n });\n }\n return out;\n }\n };\n}\n\nexport default regressionPolynomial;\n"]}
1
+ {"version":3,"sources":["../src/common/regression-polynomial.ts"],"names":[],"mappings":"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","file":"regression-polynomial.js","sourcesContent":["import { visitPoints, rSquared } from './regression-linear';\nimport isNil from './isNil';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\nfunction solveLinearSystem(A: number[][], b: number[]): number[] {\n // Gaussian elimination with partial pivoting\n const n = b.length;\n // clone\n const M: number[][] = new Array(n);\n for (let i = 0; i < n; i++) {\n M[i] = A[i].slice();\n M[i].push(b[i]);\n }\n\n for (let k = 0; k < n; k++) {\n // find pivot\n let maxRow = k;\n let maxVal = Math.abs(M[k][k]);\n for (let i = k + 1; i < n; i++) {\n const v = Math.abs(M[i][k]);\n if (v > maxVal) {\n maxVal = v;\n maxRow = i;\n }\n }\n if (maxRow !== k) {\n const tmp = M[k];\n M[k] = M[maxRow];\n M[maxRow] = tmp;\n }\n\n // singular check\n if (Math.abs(M[k][k]) < 1e-12) {\n // return least squares fallback zeros\n const res: number[] = new Array(n).fill(0);\n return res;\n }\n\n // normalize row\n for (let j = k + 1; j <= n; j++) {\n M[k][j] = M[k][j] / M[k][k];\n }\n M[k][k] = 1;\n\n // eliminate\n for (let i = 0; i < n; i++) {\n if (i === k) {\n continue;\n }\n const factor = M[i][k];\n if (factor === 0) {\n continue;\n }\n for (let j = k + 1; j <= n; j++) {\n M[i][j] -= factor * M[k][j];\n }\n M[i][k] = 0;\n }\n }\n\n const x: number[] = new Array(n);\n for (let i = 0; i < n; i++) {\n x[i] = M[i][n];\n }\n return x;\n}\n\nexport function regressionPolynomial(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: { degree?: number; alpah?: number } = {}\n) {\n let degree = options.degree ?? 0;\n if (degree < 0) {\n degree = 0;\n }\n const alpha = options.alpah ?? 0.5;\n const m = degree + 1;\n const sums: number[] = new Array(2 * degree + 1).fill(0);\n\n visitPoints(data, x, y, (dx, dy) => {\n let xp = 1;\n for (let k = 0; k < sums.length; k++) {\n sums[k] += xp;\n xp *= dx;\n }\n });\n\n // build normal matrix\n const A: number[][] = new Array(m);\n for (let i = 0; i < m; i++) {\n A[i] = new Array(m).fill(0);\n for (let j = 0; j < m; j++) {\n A[i][j] = sums[i + j];\n }\n }\n\n const B: number[] = new Array(m).fill(0);\n visitPoints(data, x, y, (dx, dy) => {\n let xp = 1;\n for (let k = 0; k < m; k++) {\n B[k] += dy * xp;\n xp *= dx;\n }\n });\n\n const coef = solveLinearSystem(A, B);\n\n const predict = (xx: number) => {\n let xp = 1;\n let v = 0;\n for (let k = 0; k < coef.length; k++) {\n v += coef[k] * xp;\n xp *= xx;\n }\n return v;\n };\n\n return {\n degree,\n coef,\n predict,\n rSquared: rSquared(\n data,\n x,\n y,\n (() => {\n // compute mean y\n let sum = 0;\n let cnt = 0;\n visitPoints(data, x, y, (_dx, dy) => {\n sum += dy;\n cnt++;\n });\n return cnt === 0 ? 0 : sum / cnt;\n })(),\n predict\n ),\n evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n // compute range\n let min = Infinity;\n let max = -Infinity;\n visitPoints(data, x, y, dx => {\n if (!isNil(dx)) {\n if (dx < min) {\n min = dx;\n }\n if (dx > max) {\n max = dx;\n }\n }\n });\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n if (min === max) {\n const v = predict(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\n }\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n out.push({ x: px, y: predict(px) });\n }\n return out;\n },\n confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, predict);\n if (comps.n === 0) {\n return out;\n }\n\n const z = Math.abs(invNorm(1 - alpha / 2));\n if (comps.min === comps.max) {\n const v = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - z * errs.seMean,\n upper: v + z * errs.seMean,\n predLower: v - z * errs.sePred,\n predUpper: v + z * errs.sePred\n });\n }\n return out;\n }\n\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const yh = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: yh,\n lower: yh - z * errs.seMean,\n upper: yh + z * errs.seMean,\n predLower: yh - z * errs.sePred,\n predUpper: yh + z * errs.sePred\n });\n }\n return out;\n }\n };\n}\n\nexport default regressionPolynomial;\n"]}
@@ -169,4 +169,4 @@ class OBBBounds extends Bounds {
169
169
  }
170
170
 
171
171
  exports.OBBBounds = OBBBounds;
172
- //# sourceMappingURL=bounds.js.map
172
+ //# sourceMappingURL=bounds.js.map
@@ -111,5 +111,4 @@ class HashTable {
111
111
  toImmutableMap() {}
112
112
  }
113
113
 
114
- exports.HashTable = HashTable;
115
- //# sourceMappingURL=hashTable.js.map
114
+ exports.HashTable = HashTable;
@@ -19,4 +19,4 @@ Object.defineProperty(exports, "__esModule", {
19
19
  value: !0
20
20
  }), __exportStar(require("./hashTable"), exports), __exportStar(require("./point"), exports),
21
21
  __exportStar(require("./bounds"), exports), __exportStar(require("./matrix"), exports);
22
- //# sourceMappingURL=index.js.map
22
+ //# sourceMappingURL=index.js.map
@@ -110,4 +110,4 @@ function normalTransform(out, origin, x, y, scaleX, scaleY, angle, rotateCenter)
110
110
  }
111
111
 
112
112
  exports.Matrix = Matrix, exports.normalTransform = normalTransform;
113
- //# sourceMappingURL=matrix.js.map
113
+ //# sourceMappingURL=matrix.js.map
@@ -78,4 +78,4 @@ class PolarPoint {
78
78
  }
79
79
 
80
80
  exports.PolarPoint = PolarPoint;
81
- //# sourceMappingURL=point.js.map
81
+ //# sourceMappingURL=point.js.map
package/dist/index.js CHANGED
@@ -1840,7 +1840,9 @@
1840
1840
  }
1841
1841
  return sst === 0 ? 0 : 1 - ssr / sst;
1842
1842
  }
1843
- function regressionLinear(data, x = d => d.x, y = d => d.y) {
1843
+ function regressionLinear(data, x = d => d.x, y = d => d.y, options) {
1844
+ var _a;
1845
+ const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.05;
1844
1846
  let n = 0;
1845
1847
  let meanX = 0;
1846
1848
  let meanY = 0;
@@ -1874,7 +1876,7 @@
1874
1876
  }
1875
1877
  return out;
1876
1878
  }
1877
- function confidenceInterval(N = 50, alpha = 0.05) {
1879
+ function confidenceInterval(N = 50) {
1878
1880
  const out = [];
1879
1881
  if (comps.n === 0 || N <= 0) {
1880
1882
  return out;
@@ -1921,9 +1923,10 @@
1921
1923
  }
1922
1924
 
1923
1925
  function regressionLogistic(data, x = d => d.x, y = d => d.y, options) {
1924
- var _a, _b;
1926
+ var _a, _b, _c;
1925
1927
  const maxIter = (_a = options === null || options === void 0 ? void 0 : options.maxIteration) !== null && _a !== void 0 ? _a : 25;
1926
1928
  const tol = (_b = options === null || options === void 0 ? void 0 : options.tol) !== null && _b !== void 0 ? _b : 1e-6;
1929
+ const alpha = (_c = options === null || options === void 0 ? void 0 : options.alpha) !== null && _c !== void 0 ? _c : 0.05;
1927
1930
  const xs = [];
1928
1931
  const ys = [];
1929
1932
  visitPoints(data, x, y, (dx, dy) => {
@@ -2014,7 +2017,7 @@
2014
2017
  }
2015
2018
  return out;
2016
2019
  }
2017
- function confidenceInterval(N = 50, alpha = 0.05) {
2020
+ function confidenceInterval(N = 50) {
2018
2021
  const out = [];
2019
2022
  if (N <= 0) {
2020
2023
  return out;
@@ -2072,8 +2075,10 @@
2072
2075
  return t * t * t;
2073
2076
  }
2074
2077
  function regressionLowess(data, x = d => d.x, y = d => d.y, options = {}) {
2078
+ var _a;
2075
2079
  const span = options.span || 0.3;
2076
2080
  const degree = options.degree === 0 ? 0 : 1;
2081
+ const alpha = (_a = options === null || options === void 0 ? void 0 : options.alpha) !== null && _a !== void 0 ? _a : 0.05;
2077
2082
  const iterations = options.iterations == null ? 2 : options.iterations;
2078
2083
  const ptsX = [];
2079
2084
  const ptsY = [];
@@ -2199,7 +2204,7 @@
2199
2204
  }
2200
2205
  return out;
2201
2206
  }
2202
- function confidenceInterval(N = 50, alpha = 0.05) {
2207
+ function confidenceInterval(N = 50) {
2203
2208
  const out = [];
2204
2209
  if (N <= 0) {
2205
2210
  return out;
@@ -2315,11 +2320,12 @@
2315
2320
  return x;
2316
2321
  }
2317
2322
  function regressionPolynomial(data, x = d => d.x, y = d => d.y, options = {}) {
2318
- var _a;
2323
+ var _a, _b;
2319
2324
  let degree = (_a = options.degree) !== null && _a !== void 0 ? _a : 0;
2320
2325
  if (degree < 0) {
2321
2326
  degree = 0;
2322
2327
  }
2328
+ const alpha = (_b = options.alpah) !== null && _b !== void 0 ? _b : 0.5;
2323
2329
  const m = degree + 1;
2324
2330
  const sums = new Array(2 * degree + 1).fill(0);
2325
2331
  visitPoints(data, x, y, (dx, dy) => {
@@ -2401,7 +2407,7 @@
2401
2407
  }
2402
2408
  return out;
2403
2409
  },
2404
- confidenceInterval(N = 50, alpha = 0.05) {
2410
+ confidenceInterval(N = 50) {
2405
2411
  const out = [];
2406
2412
  if (N <= 0) {
2407
2413
  return out;