@visactor/vutils 1.0.25 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/REGRESSION.md +36 -0
- package/cjs/common/ascending.js +2 -1
- package/cjs/common/deviation.js +1 -2
- package/cjs/common/getType.js +2 -1
- package/cjs/common/index.d.ts +1 -0
- package/cjs/common/index.js +2 -1
- package/cjs/common/index.js.map +1 -1
- package/cjs/common/isFunction.js +1 -2
- package/cjs/common/isObject.js +2 -1
- package/cjs/common/isPrototype.js +1 -1
- package/cjs/common/isRegExp.js +1 -1
- package/cjs/common/isShallowEqual.js +1 -1
- package/cjs/common/isString.js +1 -1
- package/cjs/common/isType.js +1 -1
- package/cjs/common/regression-bootstrap.d.ts +14 -0
- package/cjs/common/regression-bootstrap.js +37 -0
- package/cjs/common/regression-bootstrap.js.map +1 -0
- package/cjs/common/regression-linear.d.ts +1 -0
- package/cjs/common/regression-linear.js +11 -29
- package/cjs/common/regression-linear.js.map +1 -1
- package/cjs/common/regression-lowess.d.ts +9 -8
- package/cjs/common/regression-lowess.js +109 -130
- package/cjs/common/regression-lowess.js.map +1 -1
- package/cjs/common/regression-polynomial.d.ts +1 -0
- package/cjs/common/regression-polynomial.js +11 -92
- package/cjs/common/regression-polynomial.js.map +1 -1
- package/cjs/common/regression-solver.d.ts +26 -0
- package/cjs/common/regression-solver.js +180 -0
- package/cjs/common/regression-solver.js.map +1 -0
- package/cjs/data-structure/bounds.js +1 -1
- package/cjs/data-structure/hashTable.js +1 -2
- package/cjs/data-structure/index.js +1 -1
- package/cjs/data-structure/matrix.js +1 -1
- package/cjs/data-structure/point.js +1 -1
- package/dist/index.js +471 -340
- package/dist/index.min.js +16 -16
- package/es/common/ascending.js +2 -1
- package/es/common/deviation.js +1 -2
- package/es/common/getType.js +2 -1
- package/es/common/index.d.ts +1 -0
- package/es/common/index.js +2 -0
- package/es/common/index.js.map +1 -1
- package/es/common/isFunction.js +1 -2
- package/es/common/isObject.js +2 -1
- package/es/common/isPrototype.js +1 -1
- package/es/common/isRegExp.js +1 -1
- package/es/common/isShallowEqual.js +1 -1
- package/es/common/isString.js +1 -1
- package/es/common/isType.js +1 -1
- package/es/common/regression-bootstrap.d.ts +14 -0
- package/es/common/regression-bootstrap.js +31 -0
- package/es/common/regression-bootstrap.js.map +1 -0
- package/es/common/regression-linear.d.ts +1 -0
- package/es/common/regression-linear.js +9 -27
- package/es/common/regression-linear.js.map +1 -1
- package/es/common/regression-lowess.d.ts +9 -8
- package/es/common/regression-lowess.js +106 -130
- package/es/common/regression-lowess.js.map +1 -1
- package/es/common/regression-polynomial.d.ts +1 -0
- package/es/common/regression-polynomial.js +9 -86
- package/es/common/regression-polynomial.js.map +1 -1
- package/es/common/regression-solver.d.ts +26 -0
- package/es/common/regression-solver.js +168 -0
- package/es/common/regression-solver.js.map +1 -0
- package/es/data-structure/bounds.js +1 -1
- package/es/data-structure/hashTable.js +1 -2
- package/es/data-structure/index.js +1 -1
- package/es/data-structure/matrix.js +1 -1
- package/es/data-structure/point.js +1 -1
- package/package.json +5 -4
package/es/common/ascending.js
CHANGED
package/es/common/deviation.js
CHANGED
package/es/common/getType.js
CHANGED
package/es/common/index.d.ts
CHANGED
package/es/common/index.js
CHANGED
package/es/common/index.js.map
CHANGED
|
@@ -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 { normalQuantile } from './normalQuantile';\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\nexport * from './correlation';\nexport * from './mean';\nexport * from './bootstrap';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/common/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/C,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,cAAc,SAAS,CAAC;AAExB,QAAQ;AACR,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,MAAM,UAAU,CAAC;AACzG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,SAAS;AACT,cAAc,UAAU,CAAC;AAEzB,WAAW;AACX,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM;AACN,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO;AACP,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEzC,QAAQ;AACR,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,sBAAsB;AACtB,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjD,cAAc;AACd,cAAc,eAAe,CAAC;AAE9B,eAAe;AACf,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAErD,gBAAgB;AAChB,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAErD,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AAEvB,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC","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 { normalQuantile } from './normalQuantile';\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\nexport * from './correlation';\nexport * from './mean';\nexport * from './bootstrap';\nexport * from './regression-bootstrap';\n"]}
|
package/es/common/isFunction.js
CHANGED
package/es/common/isObject.js
CHANGED
package/es/common/isPrototype.js
CHANGED
package/es/common/isRegExp.js
CHANGED
package/es/common/isString.js
CHANGED
package/es/common/isType.js
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type RegressionPoint } from './regression-solver';
|
|
2
|
+
/** 成对 percentile bootstrap;每次重采样仅拟合一次,固定原始坐标基底。 */
|
|
3
|
+
export declare function regressionBootstrap(data: readonly RegressionPoint[], options: {
|
|
4
|
+
method: 'linear' | 'polynomial';
|
|
5
|
+
degree?: number;
|
|
6
|
+
grid: readonly number[];
|
|
7
|
+
level: number;
|
|
8
|
+
resamples: number;
|
|
9
|
+
seed: number;
|
|
10
|
+
}): {
|
|
11
|
+
x: number;
|
|
12
|
+
lower: number;
|
|
13
|
+
upper: number;
|
|
14
|
+
}[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { randomLCG } from "./random";
|
|
2
|
+
|
|
3
|
+
import { quantileSorted } from "./quantileSorted";
|
|
4
|
+
|
|
5
|
+
import { fitRegression, regressionBasis, regressionPrediction } from "./regression-solver";
|
|
6
|
+
|
|
7
|
+
/** 成对 percentile bootstrap;每次重采样仅拟合一次,固定原始坐标基底。 */ export function regressionBootstrap(data, options) {
|
|
8
|
+
var _a;
|
|
9
|
+
const degree = "linear" === options.method ? 1 : null !== (_a = options.degree) && void 0 !== _a ? _a : NaN;
|
|
10
|
+
if ("linear" !== options.method && "polynomial" !== options.method || !Number.isInteger(degree) || degree < 1 || !data.length || data.some((p => !Number.isFinite(p.x) || !Number.isFinite(p.y))) || options.grid.some((x => !Number.isFinite(x))) || !(options.level > 0 && options.level < 1) || !Number.isInteger(options.resamples) || options.resamples < 1 || !Number.isInteger(options.seed) || options.seed < 0 || options.seed > 4294967295) throw new RangeError("Invalid paired regression bootstrap inputs");
|
|
11
|
+
if (data.length <= degree + 1) throw new RangeError("Regression bootstrap requires positive residual degrees of freedom");
|
|
12
|
+
const sorted = data.slice().sort(((a, b) => a.x - b.x || a.y - b.y)), basis = regressionBasis(sorted);
|
|
13
|
+
if (fitRegression(sorted, degree, basis).rank < degree + 1) throw new RangeError("Original regression design is rank deficient");
|
|
14
|
+
const random = randomLCG(options.seed), sample = new Array(sorted.length), values = options.grid.map((() => new Array(options.resamples)));
|
|
15
|
+
for (let b = 0; b < options.resamples; b++) {
|
|
16
|
+
for (let i = 0; i < sample.length; i++) sample[i] = sorted[Math.floor(random() * sorted.length)];
|
|
17
|
+
const model = fitRegression(sample, degree, basis);
|
|
18
|
+
for (let j = 0; j < options.grid.length; j++) {
|
|
19
|
+
const value = regressionPrediction(model, options.grid[j]);
|
|
20
|
+
if (!Number.isFinite(value)) throw new RangeError("Regression bootstrap prediction is not finite");
|
|
21
|
+
values[j][b] = value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const tail = (1 - options.level) / 2;
|
|
25
|
+
return options.grid.map(((x, j) => (values[j].sort(((a, b) => a - b)), {
|
|
26
|
+
x: x,
|
|
27
|
+
lower: quantileSorted(values[j], tail),
|
|
28
|
+
upper: quantileSorted(values[j], 1 - tail)
|
|
29
|
+
})));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=regression-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/regression-bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAwB,MAAM,qBAAqB,CAAC;AAEjH,mDAAmD;AACnD,MAAM,UAAU,mBAAmB,CACjC,IAAgC,EAChC,OAOC;;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,MAAM,mCAAI,GAAG,CAAC;IACvE,IACE,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,CAAC;QAChE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QACzB,MAAM,GAAG,CAAC;QACV,CAAC,IAAI,CAAC,MAAM;QACZ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QACzC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACpC,OAAO,CAAC,SAAS,GAAG,CAAC;QACrB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,OAAO,CAAC,IAAI,GAAG,CAAC;QAChB,OAAO,CAAC,IAAI,GAAG,UAAU,EACzB;QACA,MAAM,IAAI,UAAU,CAAC,4CAA4C,CAAC,CAAC;KACpE;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,EAAE;QAC7B,MAAM,IAAI,UAAU,CAAC,oEAAoE,CAAC,CAAC;KAC5F;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE;QAC1D,MAAM,IAAI,UAAU,CAAC,8CAA8C,CAAC,CAAC;KACtE;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAkB,MAAM,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAS,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;SAC1D;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBAC3B,MAAM,IAAI,UAAU,CAAC,+CAA+C,CAAC,CAAC;aACvE;YACD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;SACtB;KACF;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IACnG,CAAC,CAAC,CAAC;AACL,CAAC","file":"regression-bootstrap.js","sourcesContent":["import { randomLCG } from './random';\nimport { quantileSorted } from './quantileSorted';\nimport { fitRegression, regressionBasis, regressionPrediction, type RegressionPoint } from './regression-solver';\n\n/** 成对 percentile bootstrap;每次重采样仅拟合一次,固定原始坐标基底。 */\nexport function regressionBootstrap(\n data: readonly RegressionPoint[],\n options: {\n method: 'linear' | 'polynomial';\n degree?: number;\n grid: readonly number[];\n level: number;\n resamples: number;\n seed: number;\n }\n) {\n const degree = options.method === 'linear' ? 1 : options.degree ?? NaN;\n if (\n (options.method !== 'linear' && options.method !== 'polynomial') ||\n !Number.isInteger(degree) ||\n degree < 1 ||\n !data.length ||\n data.some(p => !Number.isFinite(p.x) || !Number.isFinite(p.y)) ||\n options.grid.some(x => !Number.isFinite(x)) ||\n !(options.level > 0 && options.level < 1) ||\n !Number.isInteger(options.resamples) ||\n options.resamples < 1 ||\n !Number.isInteger(options.seed) ||\n options.seed < 0 ||\n options.seed > 0xffffffff\n ) {\n throw new RangeError('Invalid paired regression bootstrap inputs');\n }\n if (data.length <= degree + 1) {\n throw new RangeError('Regression bootstrap requires positive residual degrees of freedom');\n }\n const sorted = data.slice().sort((a, b) => a.x - b.x || a.y - b.y);\n const basis = regressionBasis(sorted);\n if (fitRegression(sorted, degree, basis).rank < degree + 1) {\n throw new RangeError('Original regression design is rank deficient');\n }\n const random = randomLCG(options.seed);\n const sample = new Array<RegressionPoint>(sorted.length);\n const values = options.grid.map(() => new Array<number>(options.resamples));\n for (let b = 0; b < options.resamples; b++) {\n for (let i = 0; i < sample.length; i++) {\n sample[i] = sorted[Math.floor(random() * sorted.length)];\n }\n const model = fitRegression(sample, degree, basis);\n for (let j = 0; j < options.grid.length; j++) {\n const value = regressionPrediction(model, options.grid[j]);\n if (!Number.isFinite(value)) {\n throw new RangeError('Regression bootstrap prediction is not finite');\n }\n values[j][b] = value;\n }\n }\n const tail = (1 - options.level) / 2;\n return options.grid.map((x, j) => {\n values[j].sort((a, b) => a - b);\n return { x, lower: quantileSorted(values[j], tail), upper: quantileSorted(values[j], 1 - tail) };\n });\n}\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import isNil from "./isNil";
|
|
2
2
|
|
|
3
|
+
import { regressionPoints, fitRegression, regressionPrediction, regressionCoefficients, regressionGrid } from "./regression-solver";
|
|
4
|
+
|
|
3
5
|
import { computeLinearCIComponents, confidenceCriticalValue, confidenceHalfWidth, stdErrorsAt } from "./regression-utils";
|
|
4
6
|
|
|
5
7
|
/**
|
|
@@ -43,40 +45,20 @@ export function rSquared(data, x, y, uY, predict) {
|
|
|
43
45
|
|
|
44
46
|
export function regressionLinear(data, x = (d => d.x), y = (d => d.y), options) {
|
|
45
47
|
var _a;
|
|
46
|
-
const alpha = null !== (_a = null == options ? void 0 : options.alpha) && void 0 !== _a ? _a : .05;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
meanX2 += (xi * xi - meanX2) / n;
|
|
52
|
-
}));
|
|
53
|
-
const {a: a, b: b} = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2), predict = xx => a + b * xx, comps = computeLinearCIComponents(data, x, y, predict);
|
|
54
|
-
return {
|
|
48
|
+
const alpha = null !== (_a = null == options ? void 0 : options.alpha) && void 0 !== _a ? _a : .05, points = regressionPoints(data, x, y), model = fitRegression(points, 1), coef = regressionCoefficients(model), a = coef[0], b = coef[1], predict = xx => regressionPrediction(model, xx), comps = computeLinearCIComponents(data, x, y, predict);
|
|
49
|
+
let meanY = 0;
|
|
50
|
+
return points.forEach(((p, i) => {
|
|
51
|
+
meanY += (p.y - meanY) / (i + 1);
|
|
52
|
+
})), {
|
|
55
53
|
coef: {
|
|
56
54
|
a: a,
|
|
57
55
|
b: b
|
|
58
56
|
},
|
|
57
|
+
rank: model.rank,
|
|
59
58
|
predict: predict,
|
|
60
59
|
rSquared: rSquared(data, x, y, meanY, predict),
|
|
61
60
|
evaluateGrid: function(N) {
|
|
62
|
-
|
|
63
|
-
if (0 === comps.n || N <= 0) return out;
|
|
64
|
-
if (comps.min === comps.max) {
|
|
65
|
-
for (let i = 0; i < N; i++) out.push({
|
|
66
|
-
x: comps.min,
|
|
67
|
-
y: predict(comps.min)
|
|
68
|
-
});
|
|
69
|
-
return out;
|
|
70
|
-
}
|
|
71
|
-
const step = (comps.max - comps.min) / (N - 1);
|
|
72
|
-
for (let i = 0; i < N; i++) {
|
|
73
|
-
const px = i === N - 1 ? comps.max : comps.min + step * i;
|
|
74
|
-
out.push({
|
|
75
|
-
x: px,
|
|
76
|
-
y: predict(px)
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
return out;
|
|
61
|
+
return regressionGrid(comps.min, comps.max, N, predict);
|
|
80
62
|
},
|
|
81
63
|
confidenceInterval: function(N = 50) {
|
|
82
64
|
const out = [];
|
|
@@ -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 {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} 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 = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const m = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: m,\n lower: m - meanHalfWidth,\n upper: m + meanHalfWidth,\n predLower: m - predHalfWidth,\n predUpper: m + predHalfWidth\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 const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n out.push({\n x: px,\n mean: m,\n lower: m - meanHalfWidth,\n upper: m + meanHalfWidth,\n predLower: m - predHalfWidth,\n predUpper: m + predHalfWidth\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 {\n regressionPoints,\n fitRegression,\n regressionPrediction,\n regressionCoefficients,\n regressionGrid\n} from './regression-solver';\nimport {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} 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 const points = regressionPoints(data, x, y);\n const model = fitRegression(points, 1);\n const coef = regressionCoefficients(model);\n const a = coef[0];\n const b = coef[1];\n const predict = (xx: number) => regressionPrediction(model, xx);\n const comps = computeLinearCIComponents(data, x, y, predict);\n let meanY = 0;\n points.forEach((p, i) => {\n meanY += (p.y - meanY) / (i + 1);\n });\n\n function evaluateGrid(N: number) {\n return regressionGrid(comps.min, comps.max, N, predict);\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 = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const m = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: m,\n lower: m - meanHalfWidth,\n upper: m + meanHalfWidth,\n predLower: m - predHalfWidth,\n predUpper: m + predHalfWidth\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 const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n out.push({\n x: px,\n mean: m,\n lower: m - meanHalfWidth,\n upper: m + meanHalfWidth,\n predLower: m - predHalfWidth,\n predUpper: m + predHalfWidth\n });\n }\n return out;\n }\n\n return {\n coef: { a, b },\n rank: model.rank,\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,11 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* - degree: 0 (constant) or 1 (linear)
|
|
6
|
-
* - iterations: number of robustifying iterations
|
|
7
|
-
* - alpha: confidence level for CI
|
|
8
|
-
* - maxSamples: maximum number of points to use (default: 1000 for fast processing)
|
|
2
|
+
* 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
|
|
3
|
+
* delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
|
|
4
|
+
* predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
|
|
9
5
|
*/
|
|
10
6
|
export declare function regressionLowess(data: any[], x?: (d: any) => number, y?: (d: any) => number, options?: {
|
|
11
7
|
span?: number;
|
|
@@ -13,9 +9,10 @@ export declare function regressionLowess(data: any[], x?: (d: any) => number, y?
|
|
|
13
9
|
iterations?: number;
|
|
14
10
|
alpha?: number;
|
|
15
11
|
maxSamples?: number;
|
|
12
|
+
delta?: number;
|
|
16
13
|
}): {
|
|
17
14
|
predict: (x0: number | number[]) => number | number[];
|
|
18
|
-
evaluate:
|
|
15
|
+
evaluate: (x0: number | number[]) => number | number[];
|
|
19
16
|
evaluateGrid: (N: number) => {
|
|
20
17
|
x: number;
|
|
21
18
|
y: number;
|
|
@@ -28,5 +25,9 @@ export declare function regressionLowess(data: any[], x?: (d: any) => number, y?
|
|
|
28
25
|
predLower: number;
|
|
29
26
|
predUpper: number;
|
|
30
27
|
}[];
|
|
28
|
+
fitted: {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
}[];
|
|
31
32
|
};
|
|
32
33
|
export default regressionLowess;
|
|
@@ -1,152 +1,123 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { regressionPoints, regressionGrid, regressionBasis, normalizeRegression } from "./regression-solver";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
function tricube(u) {
|
|
6
|
-
const uu = Math.abs(u);
|
|
7
|
-
if (uu >= 1) return 0;
|
|
8
|
-
const t = 1 - uu * uu * uu;
|
|
9
|
-
return t * t * t;
|
|
10
|
-
}
|
|
3
|
+
import { median } from "./median";
|
|
11
4
|
|
|
12
|
-
|
|
13
|
-
* Stratified sampling to reduce data size while preserving distribution
|
|
14
|
-
*/ function stratifiedSample(sortedData, maxSamples) {
|
|
15
|
-
const n = sortedData.length;
|
|
16
|
-
if (n <= maxSamples) return sortedData;
|
|
17
|
-
const sampled = [], step = n / maxSamples;
|
|
18
|
-
// More aggressive sampling - use exact step size
|
|
19
|
-
for (let i = 0; i < maxSamples; i++) {
|
|
20
|
-
const idx = Math.min(Math.floor(i * step), n - 1);
|
|
21
|
-
sampled.push(sortedData[idx]);
|
|
22
|
-
}
|
|
23
|
-
return sampled;
|
|
24
|
-
}
|
|
5
|
+
import { computeLinearCIComponents, confidenceCriticalValue, confidenceHalfWidth, stdErrorsAt } from "./regression-utils";
|
|
25
6
|
|
|
26
7
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* - degree: 0 (constant) or 1 (linear)
|
|
31
|
-
* - iterations: number of robustifying iterations
|
|
32
|
-
* - alpha: confidence level for CI
|
|
33
|
-
* - maxSamples: maximum number of points to use (default: 1000 for fast processing)
|
|
8
|
+
* 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
|
|
9
|
+
* delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
|
|
10
|
+
* predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
|
|
34
11
|
*/ export function regressionLowess(data, x = (d => d.x), y = (d => d.y), options = {}) {
|
|
35
|
-
var _a;
|
|
36
|
-
const span = options.span
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
let left = 0, right = n;
|
|
12
|
+
var _a, _b, _c, _d, _e;
|
|
13
|
+
const span = null !== (_a = options.span) && void 0 !== _a ? _a : 2 / 3, degree = null !== (_b = options.degree) && void 0 !== _b ? _b : 1, iterations = null !== (_c = options.iterations) && void 0 !== _c ? _c : 3, delta = null !== (_d = options.delta) && void 0 !== _d ? _d : 0, alpha = null !== (_e = options.alpha) && void 0 !== _e ? _e : .05;
|
|
14
|
+
if (!(span > 0 && span <= 1) || !Number.isInteger(iterations) || iterations < 0 || !Number.isFinite(delta) || delta < 0 || 0 !== degree && 1 !== degree || null != options.maxSamples && (!Number.isInteger(options.maxSamples) || options.maxSamples < 2)) throw new RangeError("Invalid LOWESS span, degree, iterations, delta or maxSamples");
|
|
15
|
+
let pts = regressionPoints(data, x, y).sort(((a, b) => a.x - b.x || a.y - b.y));
|
|
16
|
+
if (null != options.maxSamples && pts.length > options.maxSamples) {
|
|
17
|
+
const full = pts, count = options.maxSamples;
|
|
18
|
+
pts = Array.from({
|
|
19
|
+
length: count
|
|
20
|
+
}, ((_, i) => full[Math.floor(i * (full.length - 1) / (count - 1))]));
|
|
21
|
+
}
|
|
22
|
+
const n = pts.length, ptsX = pts.map((p => p.x)), ptsY = pts.map((p => p.y)), basis = regressionBasis(pts), normalizedX = ptsX.map((v => normalizeRegression(v, basis.xCenter, basis.xScale))), normalizedY = ptsY.map((v => normalizeRegression(v, basis.yCenter, basis.yScale))), count = Math.min(n, Math.max(2, Math.floor(span * n + 1e-10)));
|
|
23
|
+
let robustWeights;
|
|
24
|
+
function exact(x0) {
|
|
25
|
+
if (!n) return 0;
|
|
26
|
+
const query = normalizeRegression(x0, basis.xCenter, basis.xScale);
|
|
27
|
+
// 找到连续的最近邻窗口;相等距离选择较小的 x(ties 的 y 已排序)。
|
|
28
|
+
let left = 0, right = n - count;
|
|
53
29
|
for (;left < right; ) {
|
|
54
|
-
const mid = left + right
|
|
55
|
-
|
|
30
|
+
const mid = left + right >>> 1, lowerDistance = x0 - ptsX[mid], upperDistance = ptsX[mid + count] - x0;
|
|
31
|
+
(Number.isFinite(lowerDistance) && Number.isFinite(upperDistance) ? lowerDistance > upperDistance : query - normalizedX[mid] > normalizedX[mid + count] - query) ? left = mid + 1 : right = mid;
|
|
56
32
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const actualStart = lo + 1, end = hi;
|
|
62
|
-
// Find max distance and compute weights in single pass
|
|
63
|
-
let maxDist = 0;
|
|
64
|
-
const windowSize = end - actualStart, distances = new Array(windowSize);
|
|
65
|
-
for (let i = actualStart; i < end; i++) {
|
|
66
|
-
const dist = Math.abs(ptsX[i] - x0);
|
|
67
|
-
distances[i - actualStart] = dist, dist > maxDist && (maxDist = dist);
|
|
33
|
+
let start = left, end = left + count;
|
|
34
|
+
if (ptsX[start] === ptsX[end - 1]) {
|
|
35
|
+
for (;start > 0 && ptsX[start - 1] === ptsX[start]; ) start--;
|
|
36
|
+
for (;end < n && ptsX[end] === ptsX[start]; ) end++;
|
|
68
37
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
for (let i =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
38
|
+
const rawRadius = Math.max(Math.abs(ptsX[start] - x0), Math.abs(ptsX[end - 1] - x0)), scaled = !Number.isFinite(rawRadius), radius = scaled ? Math.max(Math.abs(normalizedX[start] - query), Math.abs(normalizedX[end - 1] - query)) : rawRadius;
|
|
39
|
+
// 局部响应坐标不能由远处、未参与该邻域的观测决定精度。
|
|
40
|
+
let yMin = 1 / 0, yMax = -1 / 0;
|
|
41
|
+
for (let i = start; i < end; i++) yMin = Math.min(yMin, ptsY[i]), yMax = Math.max(yMax, ptsY[i]);
|
|
42
|
+
const yCenter = yMin / 2 + yMax / 2, yScale = Math.max(Math.abs(yMin - yCenter), Math.abs(yMax - yCenter)) || 1;
|
|
43
|
+
let sw = 0, sx = 0, sy = 0, sxx = 0, sxy = 0;
|
|
44
|
+
for (let i = start; i < end; i++) {
|
|
45
|
+
const z = 0 === radius ? 0 : (scaled ? normalizedX[i] - query : ptsX[i] - x0) / radius, u = Math.abs(z), t = u >= 1 ? 0 : 1 - u * u * u, w = t * t * t * (robustWeights ? robustWeights[i] : 1);
|
|
46
|
+
sw += w, sx += w * z;
|
|
47
|
+
const response = normalizeRegression(ptsY[i], yCenter, yScale);
|
|
48
|
+
sy += w * response, sxx += w * z * z, sxy += w * z * response;
|
|
76
49
|
}
|
|
77
|
-
if (0 ===
|
|
78
|
-
//
|
|
79
|
-
let
|
|
80
|
-
for (let i =
|
|
81
|
-
const
|
|
82
|
-
(
|
|
83
|
-
|
|
50
|
+
if (0 === sw) {
|
|
51
|
+
// 核边界零权重时使用最近有效观测的加权常数;等距离取均值。
|
|
52
|
+
let distance = 1 / 0, weight = 0, value = 0;
|
|
53
|
+
for (let i = 0; i < n; i++) {
|
|
54
|
+
const w = robustWeights ? robustWeights[i] : 1;
|
|
55
|
+
if (0 === w) continue;
|
|
56
|
+
const d = Math.abs(scaled ? normalizedX[i] - query : ptsX[i] - x0);
|
|
57
|
+
d < distance ? (distance = d, weight = w, value = ptsY[i]) : d === distance && (value = value * (weight / (weight + w)) + ptsY[i] * (w / (weight + w)),
|
|
58
|
+
weight += w);
|
|
84
59
|
}
|
|
85
|
-
|
|
60
|
+
if (0 === weight) throw new RangeError("LOWESS has no effective local observations");
|
|
61
|
+
return value;
|
|
86
62
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
63
|
+
const mx = sx / sw, my = sy / sw, variance = sxx / sw - mx * mx;
|
|
64
|
+
return yCenter + yScale * (my - (0 === degree || variance <= 32 * Number.EPSILON ? 0 : (sxy / sw - mx * my) / variance) * mx);
|
|
65
|
+
}
|
|
66
|
+
// delta 不删除观测。只减少局部回归求值位置,全部残差参与重加权。
|
|
67
|
+
const anchors = [];
|
|
68
|
+
for (let i = 0; i < n && (anchors.push(i), i !== n - 1); ) {
|
|
69
|
+
let next = i + 1;
|
|
70
|
+
if (delta > 0) for (;next + 1 < n && ptsX[next + 1] - ptsX[i] <= delta; ) next++;
|
|
71
|
+
// 重复 x 一起使用同一预测;端点不能丢失。
|
|
72
|
+
for (;next + 1 < n && ptsX[next + 1] === ptsX[next]; ) next++;
|
|
73
|
+
i = next;
|
|
74
|
+
}
|
|
75
|
+
let fits = new Array(n);
|
|
76
|
+
function fitObservations() {
|
|
77
|
+
const out = new Array(n);
|
|
78
|
+
for (let a = 0; a < anchors.length; a++) {
|
|
79
|
+
const index = anchors[a];
|
|
80
|
+
if (out[index] = exact(ptsX[index]), 0 === a) continue;
|
|
81
|
+
const previous = anchors[a - 1], rawWidth = ptsX[index] - ptsX[previous], width = Number.isFinite(rawWidth) ? rawWidth : normalizedX[index] - normalizedX[previous];
|
|
82
|
+
for (let i = previous + 1; i < index; i++) {
|
|
83
|
+
const t = 0 === width ? 0 : (Number.isFinite(rawWidth) ? ptsX[i] - ptsX[previous] : normalizedX[i] - normalizedX[previous]) / width;
|
|
84
|
+
out[i] = out[previous] * (1 - t) + out[index] * t;
|
|
85
|
+
}
|
|
91
86
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
for (let iteration = 0; iteration <= iterations && (fits = fitObservations(), iteration !== iterations); iteration++) {
|
|
90
|
+
const residuals = fits.map(((v, i) => {
|
|
91
|
+
const residual = ptsY[i] - v;
|
|
92
|
+
return Number.isFinite(residual) ? Math.abs(residual / basis.yScale) : Math.abs(normalizedY[i] - normalizeRegression(v, basis.yCenter, basis.yScale));
|
|
93
|
+
})), med = median(residuals.slice()), currentFits = fits;
|
|
94
|
+
robustWeights = residuals.map(((r, i) => {
|
|
95
|
+
if (0 === med) {
|
|
96
|
+
return r <= 64 * Number.EPSILON * (Math.max(Math.abs(ptsY[i]), Math.abs(currentFits[i])) / basis.yScale) ? 1 : 0;
|
|
97
|
+
}
|
|
98
|
+
const u = r / (6 * med);
|
|
99
|
+
return u >= 1 ? 0 : (1 - u * u) ** 2;
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
function predictSingle(x0) {
|
|
103
|
+
if (0 === delta || n < 2 || x0 < ptsX[0] || x0 > ptsX[n - 1]) return exact(x0);
|
|
104
|
+
let lo = 0, hi = n - 1;
|
|
105
|
+
for (;hi - lo > 1; ) {
|
|
106
|
+
const mid = lo + hi >>> 1;
|
|
107
|
+
ptsX[mid] <= x0 ? lo = mid : hi = mid;
|
|
97
108
|
}
|
|
98
|
-
|
|
99
|
-
|
|
109
|
+
if (ptsX[hi] === ptsX[lo]) return fits[lo];
|
|
110
|
+
const width = ptsX[hi] - ptsX[lo], t = Number.isFinite(width) ? (x0 - ptsX[lo]) / width : (normalizeRegression(x0, basis.xCenter, basis.xScale) - normalizedX[lo]) / (normalizedX[hi] - normalizedX[lo]);
|
|
111
|
+
return fits[lo] * (1 - t) + fits[hi] * t;
|
|
100
112
|
}
|
|
101
113
|
function predict(x0) {
|
|
102
|
-
|
|
103
|
-
const len = x0.length, out = new Array(len);
|
|
104
|
-
for (let i = 0; i < len; i++) out[i] = predictSingle(x0[i]);
|
|
105
|
-
return out;
|
|
106
|
-
}
|
|
107
|
-
return predictSingle(x0);
|
|
114
|
+
return Array.isArray(x0) ? x0.map(predictSingle) : predictSingle(x0);
|
|
108
115
|
}
|
|
109
116
|
return {
|
|
110
117
|
predict: predict,
|
|
111
118
|
evaluate: predict,
|
|
112
119
|
evaluateGrid: function(N) {
|
|
113
|
-
|
|
114
|
-
if (0 === n) return [];
|
|
115
|
-
const out = new Array(N), min = ptsX[0], max = ptsX[n - 1];
|
|
116
|
-
if (min === max) {
|
|
117
|
-
const v = predictSingle(min);
|
|
118
|
-
for (let i = 0; i < N; i++) out[i] = {
|
|
119
|
-
x: min,
|
|
120
|
-
y: v
|
|
121
|
-
};
|
|
122
|
-
return out;
|
|
123
|
-
}
|
|
124
|
-
const step = (max - min) / (N - 1);
|
|
125
|
-
// optionally add robust iterations
|
|
126
|
-
let robustWeights;
|
|
127
|
-
// Disable robustness iterations for large datasets to improve performance
|
|
128
|
-
// Users can override by setting iterations explicitly
|
|
129
|
-
const effectiveIterations = null != options.iterations ? iterations : n > 500 ? 0 : iterations;
|
|
130
|
-
if (effectiveIterations > 0) for (let iter = 0; iter < effectiveIterations; iter++) {
|
|
131
|
-
// compute fits - pre-allocate arrays
|
|
132
|
-
const fits = new Array(n), res = new Array(n);
|
|
133
|
-
for (let i = 0; i < n; i++) fits[i] = predictSingle(ptsX[i], robustWeights), res[i] = Math.abs(ptsY[i] - fits[i]);
|
|
134
|
-
// median absolute deviation
|
|
135
|
-
const med = res.slice().sort(((a, b) => a - b))[Math.floor(n / 2)] || 0;
|
|
136
|
-
robustWeights = new Array(n);
|
|
137
|
-
for (let i = 0; i < n; i++) {
|
|
138
|
-
const u = 0 === med ? 0 : res[i] / (6 * med), w = Math.abs(u) >= 1 ? 0 : (1 - u * u) * (1 - u * u);
|
|
139
|
-
robustWeights[i] = w;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
for (let i = 0; i < N; i++) {
|
|
143
|
-
const px = i === N - 1 ? max : min + step * i;
|
|
144
|
-
out[i] = {
|
|
145
|
-
x: px,
|
|
146
|
-
y: predictSingle(px, robustWeights)
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
return out;
|
|
120
|
+
return regressionGrid(ptsX[0], ptsX[n - 1], N, predictSingle);
|
|
150
121
|
},
|
|
151
122
|
confidenceInterval: function(N = 50) {
|
|
152
123
|
const out = [];
|
|
@@ -183,7 +154,12 @@ function tricube(u) {
|
|
|
183
154
|
});
|
|
184
155
|
}
|
|
185
156
|
return out;
|
|
186
|
-
}
|
|
157
|
+
},
|
|
158
|
+
// 节点值按 x 排序,重复观测仍保持其统计权重。
|
|
159
|
+
fitted: pts.map(((p, i) => ({
|
|
160
|
+
x: p.x,
|
|
161
|
+
y: fits[i]
|
|
162
|
+
})))
|
|
187
163
|
};
|
|
188
164
|
}
|
|
189
165
|
|