@visactor/vutils 1.0.9 → 1.0.10

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 (59) hide show
  1. package/cjs/common/ecdf.d.ts +10 -0
  2. package/cjs/common/ecdf.js +52 -0
  3. package/cjs/common/ecdf.js.map +1 -0
  4. package/cjs/common/index.d.ts +5 -0
  5. package/cjs/common/index.js +4 -2
  6. package/cjs/common/index.js.map +1 -1
  7. package/cjs/common/interpolate.js +2 -1
  8. package/cjs/common/isPlainObject.js +1 -2
  9. package/cjs/common/isPrototype.js +2 -1
  10. package/cjs/common/isValidNumber.js +1 -1
  11. package/cjs/common/kde.d.ts +21 -0
  12. package/cjs/common/kde.js +126 -0
  13. package/cjs/common/kde.js.map +1 -0
  14. package/cjs/common/regression-linear.d.ts +31 -6
  15. package/cjs/common/regression-linear.js +97 -20
  16. package/cjs/common/regression-linear.js.map +1 -1
  17. package/cjs/common/regression-logistic.d.ts +20 -0
  18. package/cjs/common/regression-logistic.js +110 -0
  19. package/cjs/common/regression-logistic.js.map +1 -0
  20. package/cjs/common/regression-lowess.d.ts +21 -0
  21. package/cjs/common/regression-lowess.js +141 -0
  22. package/cjs/common/regression-lowess.js.map +1 -0
  23. package/cjs/common/regression-polynomial.d.ts +21 -0
  24. package/cjs/common/regression-polynomial.js +143 -0
  25. package/cjs/common/regression-polynomial.js.map +1 -0
  26. package/cjs/common/regression-utils.d.ts +20 -0
  27. package/cjs/common/regression-utils.js +76 -0
  28. package/cjs/common/regression-utils.js.map +1 -0
  29. package/dist/index.js +937 -36
  30. package/dist/index.min.js +1 -1
  31. package/es/common/ecdf.d.ts +10 -0
  32. package/es/common/ecdf.js +48 -0
  33. package/es/common/ecdf.js.map +1 -0
  34. package/es/common/index.d.ts +5 -0
  35. package/es/common/index.js +10 -1
  36. package/es/common/index.js.map +1 -1
  37. package/es/common/interpolate.js +2 -1
  38. package/es/common/isPlainObject.js +1 -2
  39. package/es/common/isPrototype.js +2 -1
  40. package/es/common/isValidNumber.js +1 -1
  41. package/es/common/kde.d.ts +21 -0
  42. package/es/common/kde.js +117 -0
  43. package/es/common/kde.js.map +1 -0
  44. package/es/common/regression-linear.d.ts +31 -6
  45. package/es/common/regression-linear.js +97 -18
  46. package/es/common/regression-linear.js.map +1 -1
  47. package/es/common/regression-logistic.d.ts +20 -0
  48. package/es/common/regression-logistic.js +105 -0
  49. package/es/common/regression-logistic.js.map +1 -0
  50. package/es/common/regression-lowess.d.ts +21 -0
  51. package/es/common/regression-lowess.js +136 -0
  52. package/es/common/regression-lowess.js.map +1 -0
  53. package/es/common/regression-polynomial.d.ts +21 -0
  54. package/es/common/regression-polynomial.js +134 -0
  55. package/es/common/regression-polynomial.js.map +1 -0
  56. package/es/common/regression-utils.d.ts +20 -0
  57. package/es/common/regression-utils.js +63 -0
  58. package/es/common/regression-utils.js.map +1 -0
  59. package/package.json +4 -4
@@ -0,0 +1,10 @@
1
+ export interface ECDFEvaluator {
2
+ evaluate: (x: number | number[]) => number | number[];
3
+ evaluateGrid: (N: number) => {
4
+ x: number;
5
+ y: number;
6
+ }[];
7
+ n: number;
8
+ }
9
+ export declare function ecdf(data: number[]): ECDFEvaluator;
10
+ export default ecdf;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ function ecdf(data) {
4
+ const n = data.length, sorted = data.slice().sort(((a, b) => a - b));
5
+ function evaluateSingle(x) {
6
+ if (0 === n) return 0;
7
+ let lo = 0, hi = n;
8
+ for (;lo < hi; ) {
9
+ const mid = lo + hi >>> 1;
10
+ sorted[mid] <= x ? lo = mid + 1 : hi = mid;
11
+ }
12
+ return lo / n;
13
+ }
14
+ return {
15
+ evaluate: function(x) {
16
+ if (Array.isArray(x)) {
17
+ const out = [];
18
+ for (let i = 0; i < x.length; i++) out.push(evaluateSingle(x[i]));
19
+ return out;
20
+ }
21
+ return evaluateSingle(x);
22
+ },
23
+ evaluateGrid: function(N) {
24
+ const out = [];
25
+ if (N <= 0) return out;
26
+ if (0 === n) return out;
27
+ const min = sorted[0], max = sorted[n - 1];
28
+ if (min === max) {
29
+ for (let i = 0; i < N; i++) out.push({
30
+ x: min,
31
+ y: 1
32
+ });
33
+ return out;
34
+ }
35
+ const step = (max - min) / (N - 1);
36
+ for (let i = 0; i < N; i++) {
37
+ const x = i === N - 1 ? max : min + step * i;
38
+ out.push({
39
+ x: x,
40
+ y: evaluateSingle(x)
41
+ });
42
+ }
43
+ return out;
44
+ },
45
+ n: n
46
+ };
47
+ }
48
+
49
+ Object.defineProperty(exports, "__esModule", {
50
+ value: !0
51
+ }), exports.ecdf = void 0, exports.ecdf = ecdf, exports.default = ecdf;
52
+ //# sourceMappingURL=ecdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/ecdf.ts"],"names":[],"mappings":";;;AAeA,SAAgB,IAAI,CAAC,IAAc;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAElD,SAAS,cAAc,CAAC,CAAS;QAC/B,IAAI,CAAC,KAAK,CAAC,EAAE;YACX,OAAO,CAAC,CAAC;SACV;QAED,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,OAAO,EAAE,GAAG,EAAE,EAAE;YACd,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACpB,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;aACd;iBAAM;gBACL,EAAE,GAAG,GAAG,CAAC;aACV;SACF;QACD,OAAO,EAAE,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,SAAS,QAAQ,CAAC,CAAoB;QACpC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACpB,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChC;YACD,OAAO,GAAG,CAAC;SACZ;QACD,OAAO,cAAc,CAAC,CAAW,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,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,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;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;YAE7C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACvC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAAe;QACzB,YAAY;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AA/DD,oBA+DC;AAED,kBAAe,IAAI,CAAC","file":"ecdf.js","sourcesContent":["/**\n * Empirical Cumulative Distribution Function (ECDF)\n * Returns a factory that builds an evaluator over provided samples.\n * The evaluator exposes:\n * - evaluate(x:number) => proportion of samples <= x\n * - evaluate(xs:number[]) => number[]\n * - evaluateGrid(N:number) => { points: number[], cdf: number[] } over sample range\n */\n\nexport interface ECDFEvaluator {\n evaluate: (x: number | number[]) => number | number[];\n evaluateGrid: (N: number) => { x: number; y: number }[];\n n: number;\n}\n\nexport function ecdf(data: number[]): ECDFEvaluator {\n const n = data.length;\n const sorted = data.slice().sort((a, b) => a - b);\n\n function evaluateSingle(x: number) {\n if (n === 0) {\n return 0;\n }\n // count of values <= x (upper bound index)\n let lo = 0;\n let hi = n; // exclusive\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (sorted[mid] <= x) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return lo / n;\n }\n\n function evaluate(x: number | number[]) {\n if (Array.isArray(x)) {\n const out: number[] = [];\n for (let i = 0; i < x.length; i++) {\n out.push(evaluateSingle(x[i]));\n }\n return out;\n }\n return evaluateSingle(x 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 const min = sorted[0];\n const max = sorted[n - 1];\n if (min === max) {\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: 1 });\n }\n return out;\n }\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const x = i === N - 1 ? max : min + step * i;\n\n out.push({ x, y: evaluateSingle(x) });\n }\n return out;\n }\n\n return {\n evaluate: evaluate as any,\n evaluateGrid,\n n\n };\n}\n\nexport default ecdf;\n"]}
@@ -62,3 +62,8 @@ export * from './toPercent';
62
62
  export * from './zero';
63
63
  export * from './extent';
64
64
  export * from './regression-linear';
65
+ export * from './regression-logistic';
66
+ export * from './regression-lowess';
67
+ export * from './regression-polynomial';
68
+ export * from './kde';
69
+ export * from './ecdf';
@@ -521,5 +521,7 @@ Object.defineProperty(exports, "substitute", {
521
521
  }
522
522
  }), __exportStar(require("./random"), exports), __exportStar(require("./field"), exports),
523
523
  __exportStar(require("./toPercent"), exports), __exportStar(require("./zero"), exports),
524
- __exportStar(require("./extent"), exports), __exportStar(require("./regression-linear"), exports);
525
- //# sourceMappingURL=index.js.map
524
+ __exportStar(require("./extent"), exports), __exportStar(require("./regression-linear"), exports),
525
+ __exportStar(require("./regression-logistic"), exports), __exportStar(require("./regression-lowess"), exports),
526
+ __exportStar(require("./regression-polynomial"), exports), __exportStar(require("./kde"), exports),
527
+ __exportStar(require("./ecdf"), exports);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// type check\nexport { default as isBoolean } from './isBoolean';\nexport { default as isFunction } from './isFunction';\nexport { default as isNil } from './isNil';\nexport { default as isNull } from './isNull';\nexport { default as isValid } from './isValid';\nexport { default as isObject } from './isObject';\nexport { default as isObjectLike } from './isObjectLike';\nexport { default as isPlainObject } from './isPlainObject';\nexport { default as isType } from './isType';\nexport { default as isUndefined } from './isUndefined';\nexport { default as isString } from './isString';\nexport { default as isArray } from './isArray';\nexport { default as isArrayLike } from './isArrayLike';\nexport { default as isDate } from './isDate';\nexport { default as isNumber } from './isNumber';\nexport { default as isNumeric } from './isNumeric';\nexport { default as isValidNumber } from './isValidNumber';\nexport { default as isValidUrl } from './isValidUrl';\nexport { default as isRegExp } from './isRegExp';\nexport { default as isBase64 } from './isBase64';\n\nexport { default as isEmpty } from './isEmpty';\n\n// object\nexport { default as get } from './get';\nexport { default as has } from './has';\nexport { default as clone } from './clone';\nexport { default as cloneDeep } from './cloneDeep';\nexport { default as merge, baseMerge } from './merge';\nexport { default as pick } from './pick';\nexport { default as pickWithout } from './pickWithout';\nexport { isEqual } from './isEqual';\nexport { isShallowEqual } from './isShallowEqual';\nexport * from './mixin';\n\n// array\nexport * from './array';\nexport { range } from './range';\nexport { ascending } from './ascending';\nexport * from './quantileSorted';\nexport { bisect, findZeroOfFunction, binaryFuzzySearch, binaryFuzzySearchInNumberRange } from './bisect';\nexport { deviation } from './deviation';\nexport { median } from './median';\nexport { variance } from './variance';\n\n// tick\nexport { tickStep } from './tickStep';\n\n// number\nexport * from './number';\n\n// function\nexport { default as constant } from './constant';\nexport { memoize } from './memoize';\n\n// pad\nexport { default as pad } from './pad';\nexport { default as truncate } from './truncate';\n\n// uuid\nexport { default as uuid } from './uuid';\n\n// clamp\nexport { default as clamp } from './clamp';\nexport { default as clampRange } from './clampRange';\nexport { clamper } from './clamper';\n\n// debounce & throttle\nexport { default as debounce } from './debounce';\nexport { default as throttle } from './throttle';\n\n// interpolate\nexport * from './interpolate';\n\n// type convert\nexport { toDate } from './toDate';\nexport { toNumber } from './toNumber';\nexport { toValidNumber } from './toValidNumber';\n\n// string\nexport { default as lowerFirst } from './lowerFirst';\nexport { default as upperFirst } from './upperFirst';\n\n// string format\nexport { default as substitute } from './substitute';\n\nexport * from './random';\nexport * from './field';\nexport * from './toPercent';\nexport * from './zero';\nexport * from './extent';\nexport * from './regression-linear';\n"]}
1
+ {"version":3,"sources":["../src/common/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// type check\nexport { default as isBoolean } from './isBoolean';\nexport { default as isFunction } from './isFunction';\nexport { default as isNil } from './isNil';\nexport { default as isNull } from './isNull';\nexport { default as isValid } from './isValid';\nexport { default as isObject } from './isObject';\nexport { default as isObjectLike } from './isObjectLike';\nexport { default as isPlainObject } from './isPlainObject';\nexport { default as isType } from './isType';\nexport { default as isUndefined } from './isUndefined';\nexport { default as isString } from './isString';\nexport { default as isArray } from './isArray';\nexport { default as isArrayLike } from './isArrayLike';\nexport { default as isDate } from './isDate';\nexport { default as isNumber } from './isNumber';\nexport { default as isNumeric } from './isNumeric';\nexport { default as isValidNumber } from './isValidNumber';\nexport { default as isValidUrl } from './isValidUrl';\nexport { default as isRegExp } from './isRegExp';\nexport { default as isBase64 } from './isBase64';\n\nexport { default as isEmpty } from './isEmpty';\n\n// object\nexport { default as get } from './get';\nexport { default as has } from './has';\nexport { default as clone } from './clone';\nexport { default as cloneDeep } from './cloneDeep';\nexport { default as merge, baseMerge } from './merge';\nexport { default as pick } from './pick';\nexport { default as pickWithout } from './pickWithout';\nexport { isEqual } from './isEqual';\nexport { isShallowEqual } from './isShallowEqual';\nexport * from './mixin';\n\n// array\nexport * from './array';\nexport { range } from './range';\nexport { ascending } from './ascending';\nexport * from './quantileSorted';\nexport { bisect, findZeroOfFunction, binaryFuzzySearch, binaryFuzzySearchInNumberRange } from './bisect';\nexport { deviation } from './deviation';\nexport { median } from './median';\nexport { variance } from './variance';\n\n// tick\nexport { tickStep } from './tickStep';\n\n// number\nexport * from './number';\n\n// function\nexport { default as constant } from './constant';\nexport { memoize } from './memoize';\n\n// pad\nexport { default as pad } from './pad';\nexport { default as truncate } from './truncate';\n\n// uuid\nexport { default as uuid } from './uuid';\n\n// clamp\nexport { default as clamp } from './clamp';\nexport { default as clampRange } from './clampRange';\nexport { clamper } from './clamper';\n\n// debounce & throttle\nexport { default as debounce } from './debounce';\nexport { default as throttle } from './throttle';\n\n// interpolate\nexport * from './interpolate';\n\n// type convert\nexport { toDate } from './toDate';\nexport { toNumber } from './toNumber';\nexport { toValidNumber } from './toValidNumber';\n\n// string\nexport { default as lowerFirst } from './lowerFirst';\nexport { default as upperFirst } from './upperFirst';\n\n// string format\nexport { default as substitute } from './substitute';\n\nexport * from './random';\nexport * from './field';\nexport * from './toPercent';\nexport * from './zero';\nexport * from './extent';\nexport * from './regression-linear';\nexport * from './regression-logistic';\nexport * from './regression-lowess';\nexport * from './regression-polynomial';\nexport * from './kde';\nexport * from './ecdf';\n"]}
@@ -51,4 +51,5 @@ function interpolateString(a, b) {
51
51
  });
52
52
  }
53
53
 
54
- exports.interpolateString = interpolateString;
54
+ exports.interpolateString = interpolateString;
55
+ //# sourceMappingURL=interpolate.js.map
@@ -18,5 +18,4 @@ const isObjectLike_1 = __importDefault(require("./isObjectLike")), isType_1 = __
18
18
  return Object.getPrototypeOf(value) === proto;
19
19
  };
20
20
 
21
- exports.default = isPlainObject;
22
- //# sourceMappingURL=isPlainObject.js.map
21
+ exports.default = isPlainObject;
@@ -9,4 +9,5 @@ const objectProto = Object.prototype, isPrototype = function(value) {
9
9
  return value === ("function" == typeof Ctor && Ctor.prototype || objectProto);
10
10
  };
11
11
 
12
- exports.default = isPrototype;
12
+ exports.default = isPrototype;
13
+ //# sourceMappingURL=isPrototype.js.map
@@ -14,4 +14,4 @@ const isNumber_1 = __importDefault(require("./isNumber")), isValidNumber = value
14
14
  isNumber_1.default)(value) && Number.isFinite(value);
15
15
 
16
16
  exports.default = isValidNumber;
17
- //# sourceMappingURL=isValidNumber.js.map
17
+ //# sourceMappingURL=isValidNumber.js.map
@@ -0,0 +1,21 @@
1
+ export type Kernel = (u: number) => number;
2
+ export declare const gaussian: Kernel;
3
+ export declare const epanechnikov: Kernel;
4
+ export declare function scott(n: number, std: number, dim?: number): number;
5
+ export declare function silverman(n: number, std: number, dim?: number): number;
6
+ export interface KDEOptions {
7
+ kernel?: Kernel;
8
+ bandwidth?: number;
9
+ bandwidthMethod?: 'scott' | 'silverman';
10
+ }
11
+ export interface KDEEvaluator {
12
+ bandwidth: number;
13
+ kernel: Kernel;
14
+ evaluate: ((x: number) => number) & ((xs: number[]) => number[]);
15
+ evaluateGrid: (N: number) => {
16
+ x: number;
17
+ y: number;
18
+ }[];
19
+ }
20
+ export declare function kde(data: number[], options?: KDEOptions): KDEEvaluator;
21
+ export default kde;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.kde = exports.silverman = exports.scott = exports.epanechnikov = exports.gaussian = void 0;
6
+
7
+ const gaussian = u => 1 / Math.sqrt(2 * Math.PI) * Math.exp(-.5 * u * u);
8
+
9
+ exports.gaussian = gaussian;
10
+
11
+ const epanechnikov = u => Math.abs(u) <= 1 ? .75 * (1 - u * u) : 0;
12
+
13
+ function scott(n, std, dim = 1) {
14
+ return n <= 0 || 0 === std ? 0 : std * Math.pow(n, -1 / (dim + 4));
15
+ }
16
+
17
+ function silverman(n, std, dim = 1) {
18
+ if (n <= 0 || 0 === std) return 0;
19
+ return Math.pow(4 / (dim + 2), 1 / (dim + 4)) * std * Math.pow(n, -1 / (dim + 4));
20
+ }
21
+
22
+ function std(values) {
23
+ const n = values.length;
24
+ if (0 === n) return 0;
25
+ let mean = 0;
26
+ for (let i = 0; i < n; i++) mean += values[i];
27
+ mean /= n;
28
+ let s = 0;
29
+ for (let i = 0; i < n; i++) {
30
+ const d = values[i] - mean;
31
+ s += d * d;
32
+ }
33
+ return Math.sqrt(s / n);
34
+ }
35
+
36
+ function kde(data, options = {}) {
37
+ const n = data.length, kernel = options.kernel || exports.gaussian;
38
+ let h = options.bandwidth;
39
+ if (!h || h <= 0) {
40
+ const sd = std(data) || 0, method = options.bandwidthMethod || "scott";
41
+ h = "silverman" === method ? silverman(n, sd, 1) : scott(n, sd, 1);
42
+ }
43
+ if (!h || h <= 0) {
44
+ return {
45
+ bandwidth: 0,
46
+ kernel: kernel,
47
+ evaluate: x => {
48
+ if (Array.isArray(x)) {
49
+ const out = [];
50
+ for (let i = 0; i < x.length; i++) out.push(0);
51
+ return out;
52
+ }
53
+ return 0;
54
+ },
55
+ evaluateGrid: N => {
56
+ const out = [];
57
+ if (N <= 0) return out;
58
+ let min = 1 / 0, max = -1 / 0;
59
+ for (let j = 0; j < n; j++) {
60
+ const v = data[j];
61
+ v < min && (min = v), v > max && (max = v);
62
+ }
63
+ if (min === 1 / 0 || max === -1 / 0) {
64
+ for (let i = 0; i < N; i++) out.push({
65
+ x: 0,
66
+ y: 0
67
+ });
68
+ return out;
69
+ }
70
+ for (let i = 0; i < N; i++) out.push({
71
+ x: min,
72
+ y: 0
73
+ });
74
+ return out;
75
+ }
76
+ };
77
+ }
78
+ const invNh = 1 / (n * h);
79
+ function evalPoint(x) {
80
+ let sum = 0;
81
+ for (let j = 0; j < n; j++) sum += kernel((x - data[j]) / h);
82
+ return sum * invNh;
83
+ }
84
+ return {
85
+ bandwidth: h,
86
+ kernel: kernel,
87
+ evaluate: function(x) {
88
+ if (Array.isArray(x)) {
89
+ const out = [];
90
+ for (let i = 0; i < x.length; i++) out.push(evalPoint(x[i]));
91
+ return out;
92
+ }
93
+ return evalPoint(x);
94
+ },
95
+ evaluateGrid(N) {
96
+ const out = [];
97
+ if (N <= 0) return out;
98
+ let min = 1 / 0, max = -1 / 0;
99
+ for (let i = 0; i < n; i++) {
100
+ const v = data[i];
101
+ v < min && (min = v), v > max && (max = v);
102
+ }
103
+ if (min === 1 / 0 || max === -1 / 0) return out;
104
+ if (min === max) {
105
+ for (let i = 0; i < N; i++) out.push({
106
+ x: min,
107
+ y: evalPoint(min)
108
+ });
109
+ return out;
110
+ }
111
+ const step = (max - min) / (N - 1);
112
+ for (let i = 0; i < N; i++) {
113
+ const x = i === N - 1 ? max : min + step * i;
114
+ out.push({
115
+ x: x,
116
+ y: evalPoint(x)
117
+ });
118
+ }
119
+ return out;
120
+ }
121
+ };
122
+ }
123
+
124
+ exports.epanechnikov = epanechnikov, exports.scott = scott, exports.silverman = silverman,
125
+ exports.kde = kde, exports.default = kde;
126
+ //# sourceMappingURL=kde.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/kde.ts"],"names":[],"mappings":"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","file":"kde.js","sourcesContent":["/**\n * Kernel Density Estimation (KDE) utilities\n *\n * Exports:\n * - Kernel functions: gaussian, epanechnikov\n * - bandwidth selectors: scott, silverman\n * - kde: main function to compute density estimates at provided points\n */\n\nexport type Kernel = (u: number) => number;\n\n/** Gaussian kernel (standard normal) */\nexport const gaussian: Kernel = (u: number) => {\n const invSqrt2Pi = 1 / Math.sqrt(2 * Math.PI);\n return invSqrt2Pi * Math.exp(-0.5 * u * u);\n};\n\n/** Epanechnikov kernel (compact support) */\nexport const epanechnikov: Kernel = (u: number) => {\n const absu = Math.abs(u);\n return absu <= 1 ? 0.75 * (1 - u * u) : 0;\n};\n\n/**\n * Bandwidth selectors\n * - scott: h = n^{-1/(d+4)} * std\n * - silverman: h = ( (4/(d+2))^{1/(d+4)} ) * n^{-1/(d+4)} * std\n */\nexport function scott(n: number, std: number, dim = 1) {\n if (n <= 0 || std === 0) {\n return 0;\n }\n return std * Math.pow(n, -1 / (dim + 4));\n}\n\nexport function silverman(n: number, std: number, dim = 1) {\n if (n <= 0 || std === 0) {\n return 0;\n }\n const factor = Math.pow(4 / (dim + 2), 1 / (dim + 4));\n return factor * std * Math.pow(n, -1 / (dim + 4));\n}\n\nexport interface KDEOptions {\n kernel?: Kernel;\n bandwidth?: number; // fixed bandwidth\n bandwidthMethod?: 'scott' | 'silverman';\n // if bandwidth not provided, compute from data using method\n}\n\n/**\n * Compute standard deviation for numeric array\n */\nfunction std(values: number[]) {\n const n = values.length;\n if (n === 0) {\n return 0;\n }\n let mean = 0;\n for (let i = 0; i < n; i++) {\n mean += values[i];\n }\n mean /= n;\n let s = 0;\n for (let i = 0; i < n; i++) {\n const d = values[i] - mean;\n s += d * d;\n }\n return Math.sqrt(s / n);\n}\n\nexport interface KDEEvaluator {\n bandwidth: number;\n kernel: Kernel;\n /**\n * Evaluate density at a single point or array of points.\n * - If given a number, returns a number.\n * - If given an array, returns an array aligned with input.\n */\n evaluate: ((x: number) => number) & ((xs: number[]) => number[]);\n /**\n * Produce N uniformly spaced points across the data range and evaluate densities.\n * Returns an array { x: number, y: number }[].\n */\n evaluateGrid: (N: number) => { x: number; y: number }[];\n}\n\n/**\n * Factory: create a KDE evaluator for given data and options.\n * Usage: const model = kde(data, options); model.evaluate(x) or model.evaluate([x1,x2])\n */\nexport function kde(data: number[], options: KDEOptions = {}): KDEEvaluator {\n const n = data.length;\n const kernel = options.kernel || gaussian;\n\n let h = options.bandwidth;\n if (!h || h <= 0) {\n const sd = std(data) || 0;\n const method = options.bandwidthMethod || 'scott';\n if (method === 'silverman') {\n h = silverman(n, sd, 1);\n } else {\n h = scott(n, sd, 1);\n }\n }\n\n // if still zero (constant data), evaluator returns zeros\n if (!h || h <= 0) {\n const zerosEval = (x: number | number[]) => {\n if (Array.isArray(x)) {\n const out: number[] = [];\n for (let i = 0; i < x.length; i++) {\n out.push(0);\n }\n return out;\n }\n return 0;\n };\n const zerosGrid = (N: number) => {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n // compute data min (use data range if available)\n let min = Infinity;\n let max = -Infinity;\n for (let j = 0; j < n; j++) {\n const v = data[j];\n if (v < min) {\n min = v;\n }\n if (v > max) {\n max = v;\n }\n }\n if (min === Infinity || max === -Infinity) {\n for (let i = 0; i < N; i++) {\n out.push({ x: 0, y: 0 });\n }\n return out;\n }\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: 0 });\n }\n return out;\n };\n return {\n bandwidth: 0,\n kernel,\n evaluate: zerosEval as any,\n evaluateGrid: zerosGrid\n };\n }\n\n const invNh = 1 / (n * h);\n\n function evalPoint(x: number) {\n let sum = 0;\n for (let j = 0; j < n; j++) {\n sum += kernel((x - data[j]) / h);\n }\n return sum * invNh;\n }\n\n function evaluate(x: number | number[]) {\n if (Array.isArray(x)) {\n const out: number[] = [];\n for (let i = 0; i < x.length; i++) {\n out.push(evalPoint(x[i]));\n }\n return out;\n }\n return evalPoint(x as number);\n }\n\n return {\n bandwidth: h,\n kernel,\n evaluate: evaluate as any,\n evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n // compute data range\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < n; i++) {\n const v = data[i];\n if (v < min) {\n min = v;\n }\n if (v > max) {\n max = v;\n }\n }\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n if (min === max) {\n // single point repeated\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: evalPoint(min) });\n }\n return out;\n }\n\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const x = i === N - 1 ? max : min + step * i;\n out.push({ x, y: evalPoint(x) });\n }\n return out;\n }\n };\n}\n\nexport default kde;\n"]}
@@ -1,8 +1,33 @@
1
- export declare function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number): number[];
2
- export declare function visitPoints(data: any[], x: (datum: any) => number, y: (datum: any) => number, callback: (x: number, y: number, index: number) => void): void;
3
- export declare function rSquared(data: any[], x: (datum: any) => number, y: (datum: any) => number, uY: number, predict: (x: number) => number): number;
4
- export declare function regressionLinear(data: any[], x?: (datum: any) => number, y?: (datum: any) => number): {
5
- coef: number[];
6
- predict: (x: number) => number;
1
+ export declare function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number): {
2
+ a: number;
3
+ b: number;
4
+ };
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
+ 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): {
8
+ coef: {
9
+ a: number;
10
+ b: number;
11
+ };
12
+ predict: (xx: number) => number;
7
13
  rSquared: number;
14
+ evaluateGrid: (N: number) => {
15
+ x: number;
16
+ y: number;
17
+ }[];
18
+ confidenceInterval: (N?: number, alpha?: number) => {
19
+ x: number;
20
+ mean: number;
21
+ lower: number;
22
+ upper: number;
23
+ predLower: number;
24
+ predUpper: number;
25
+ }[];
26
+ };
27
+ declare const _default: {
28
+ ordinaryLeastSquares: typeof ordinaryLeastSquares;
29
+ visitPoints: typeof visitPoints;
30
+ rSquared: typeof rSquared;
31
+ regressionLinear: typeof regressionLinear;
8
32
  };
33
+ export default _default;
@@ -10,41 +10,118 @@ Object.defineProperty(exports, "__esModule", {
10
10
  value: !0
11
11
  }), exports.regressionLinear = exports.rSquared = exports.visitPoints = exports.ordinaryLeastSquares = void 0;
12
12
 
13
- const isNil_1 = __importDefault(require("./isNil"));
13
+ const isNil_1 = __importDefault(require("./isNil")), regression_utils_1 = require("./regression-utils");
14
14
 
15
15
  function ordinaryLeastSquares(uX, uY, uXY, uX2) {
16
- const delta = uX2 - uX * uX, slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta;
17
- return [ uY - slope * uX, slope ];
16
+ const denom = uX2 - uX * uX;
17
+ if (Math.abs(denom) < Number.EPSILON) return {
18
+ a: uY,
19
+ b: 0
20
+ };
21
+ const b = (uXY - uX * uY) / denom;
22
+ return {
23
+ a: uY - b * uX,
24
+ b: b
25
+ };
18
26
  }
19
27
 
20
28
  function visitPoints(data, x, y, callback) {
21
- let u, v, i = -1;
22
- data.forEach((d => {
23
- u = x(d), v = y(d), !(0, isNil_1.default)(u) && (u = +u) >= u && !(0, isNil_1.default)(v) && (v = +v) >= v && callback(u, v, ++i);
24
- }));
29
+ for (let i = 0; i < data.length; i++) {
30
+ const d = data[i];
31
+ let xi = x(d), yi = y(d);
32
+ !(0, isNil_1.default)(xi) && (xi = +xi) >= xi && !(0, isNil_1.default)(yi) && (yi = +yi) >= yi && callback(xi, yi, i);
33
+ }
25
34
  }
26
35
 
27
36
  function rSquared(data, x, y, uY, predict) {
28
- let SSE = 0, SST = 0;
29
- return visitPoints(data, x, y, ((dx, dy) => {
30
- const sse = dy - predict(dx), sst = dy - uY;
31
- SSE += sse * sse, SST += sst * sst;
32
- })), 1 - SSE / SST;
37
+ let ssr = 0, sst = 0;
38
+ for (let i = 0; i < data.length; i++) {
39
+ const d = data[i];
40
+ let yi = y(d);
41
+ if (!(0, isNil_1.default)(yi) && (yi = +yi) >= yi) {
42
+ const r = yi - predict(x(d));
43
+ ssr += r * r;
44
+ const t = yi - uY;
45
+ sst += t * t;
46
+ }
47
+ }
48
+ return 0 === sst ? 0 : 1 - ssr / sst;
33
49
  }
34
50
 
35
- function regressionLinear(data, x = (datum => datum.x), y = (datum => datum.y)) {
36
- let X = 0, Y = 0, XY = 0, X2 = 0, n = 0;
37
- visitPoints(data, x, y, ((dx, dy) => {
38
- ++n, X += (dx - X) / n, Y += (dy - Y) / n, XY += (dx * dy - XY) / n, X2 += (dx * dx - X2) / n;
51
+ function regressionLinear(data, x = (d => d.x), y = (d => d.y)) {
52
+ let n = 0, meanX = 0, meanY = 0, meanXY = 0, meanX2 = 0;
53
+ visitPoints(data, x, y, ((xi, yi) => {
54
+ n++, meanX += (xi - meanX) / n, meanY += (yi - meanY) / n, meanXY += (xi * yi - meanXY) / n,
55
+ meanX2 += (xi * xi - meanX2) / n;
39
56
  }));
40
- const coef = ordinaryLeastSquares(X, Y, XY, X2), predict = x => coef[0] + coef[1] * x;
57
+ const {a: a, b: b} = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2), predict = xx => a + b * xx, comps = (0,
58
+ regression_utils_1.computeLinearCIComponents)(data, x, y, predict);
41
59
  return {
42
- coef: coef,
60
+ coef: {
61
+ a: a,
62
+ b: b
63
+ },
43
64
  predict: predict,
44
- rSquared: rSquared(data, x, y, Y, predict)
65
+ rSquared: rSquared(data, x, y, meanY, predict),
66
+ evaluateGrid: function(N) {
67
+ const out = [];
68
+ if (0 === comps.n || N <= 0) return out;
69
+ if (comps.min === comps.max) {
70
+ for (let i = 0; i < N; i++) out.push({
71
+ x: comps.min,
72
+ y: predict(comps.min)
73
+ });
74
+ return out;
75
+ }
76
+ const step = (comps.max - comps.min) / (N - 1);
77
+ for (let i = 0; i < N; i++) {
78
+ const px = i === N - 1 ? comps.max : comps.min + step * i;
79
+ out.push({
80
+ x: px,
81
+ y: predict(px)
82
+ });
83
+ }
84
+ return out;
85
+ },
86
+ confidenceInterval: function(N = 50, alpha = .05) {
87
+ const out = [];
88
+ if (0 === comps.n || N <= 0) return out;
89
+ const z = (0, regression_utils_1.invNorm)(1 - alpha / 2);
90
+ if (comps.min === comps.max) {
91
+ const m = predict(comps.min), errs = (0, regression_utils_1.stdErrorsAt)(comps.min, comps);
92
+ for (let i = 0; i < N; i++) out.push({
93
+ x: comps.min,
94
+ mean: m,
95
+ lower: m - z * errs.seMean,
96
+ upper: m + z * errs.seMean,
97
+ predLower: m - z * errs.sePred,
98
+ predUpper: m + z * errs.sePred
99
+ });
100
+ return out;
101
+ }
102
+ const step = (comps.max - comps.min) / (N - 1);
103
+ for (let i = 0; i < N; i++) {
104
+ const px = i === N - 1 ? comps.max : comps.min + step * i, m = predict(px), errs = (0,
105
+ regression_utils_1.stdErrorsAt)(px, comps);
106
+ out.push({
107
+ x: px,
108
+ mean: m,
109
+ lower: m - z * errs.seMean,
110
+ upper: m + z * errs.seMean,
111
+ predLower: m - z * errs.sePred,
112
+ predUpper: m + z * errs.sePred
113
+ });
114
+ }
115
+ return out;
116
+ }
45
117
  };
46
118
  }
47
119
 
48
120
  exports.ordinaryLeastSquares = ordinaryLeastSquares, exports.visitPoints = visitPoints,
49
- exports.rSquared = rSquared, exports.regressionLinear = regressionLinear;
121
+ exports.rSquared = rSquared, exports.regressionLinear = regressionLinear, exports.default = {
122
+ ordinaryLeastSquares: ordinaryLeastSquares,
123
+ visitPoints: visitPoints,
124
+ rSquared: rSquared,
125
+ regressionLinear: regressionLinear
126
+ };
50
127
  //# sourceMappingURL=regression-linear.js.map
@@ -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';\n/* Adapted from vega by University of Washington Interactive Data Lab\n * https://vega.github.io/vega/\n * Licensed under the BSD-3-Clause\n\n * url: https://github.com/vega/vega/blob/main/packages/vega-statistics/src/regression/ols.js\n * License: https://github.com/vega/vega/blob/main/LICENSE\n * @license\n */\nexport function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number) {\n const delta = uX2 - uX * uX;\n const slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta;\n const intercept = uY - slope * uX;\n\n return [intercept, slope];\n}\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nexport function visitPoints(\n data: any[],\n x: (datum: any) => number,\n y: (datum: any) => number,\n callback: (x: number, y: number, index: number) => void\n) {\n let i = -1;\n let u;\n let v;\n\n data.forEach(d => {\n u = x(d);\n v = y(d);\n if (!isNil(u) && (u = +u) >= u && !isNil(v) && (v = +v) >= v) {\n callback(u, v, ++i);\n }\n });\n}\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nexport function rSquared(\n data: any[],\n x: (datum: any) => number,\n y: (datum: any) => number,\n uY: number,\n predict: (x: number) => number\n) {\n let SSE = 0;\n let SST = 0;\n\n visitPoints(data, x, y, (dx, dy) => {\n const sse = dy - predict(dx);\n const sst = dy - uY;\n\n SSE += sse * sse;\n SST += sst * sst;\n });\n\n return 1 - SSE / SST;\n}\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nexport function regressionLinear(\n data: any[],\n x: (datum: any) => number = datum => datum.x,\n y: (datum: any) => number = datum => datum.y\n) {\n let X = 0;\n let Y = 0;\n let XY = 0;\n let X2 = 0;\n let n = 0;\n\n visitPoints(data, x, y, (dx, dy) => {\n ++n;\n X += (dx - X) / n;\n Y += (dy - Y) / n;\n XY += (dx * dy - XY) / n;\n X2 += (dx * dx - X2) / n;\n });\n\n const coef = ordinaryLeastSquares(X, Y, XY, X2);\n const predict = (x: number) => coef[0] + coef[1] * x;\n\n return {\n coef: coef,\n predict: predict,\n rSquared: rSquared(data, x, y, Y, predict)\n };\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(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"]}
@@ -0,0 +1,20 @@
1
+ export declare function regressionLogistic(data: any[], x?: (d: any) => number, y?: (d: any) => number, options?: {
2
+ maxIteration?: number;
3
+ tol?: number;
4
+ }): {
5
+ coef: number[];
6
+ predict: (xx: number) => number;
7
+ evaluateGrid: (N: number) => {
8
+ x: number;
9
+ y: number;
10
+ }[];
11
+ confidenceInterval: (N?: number, alpha?: number) => {
12
+ x: number;
13
+ mean: number;
14
+ lower: number;
15
+ upper: number;
16
+ predLower: number;
17
+ predUpper: number;
18
+ }[];
19
+ };
20
+ export default regressionLogistic;