svelteplot 0.4.5-pr-208.3 → 0.4.5

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 (87) hide show
  1. package/dist/Mark.svelte +73 -87
  2. package/dist/Mark.svelte.d.ts +34 -37
  3. package/dist/helpers/colors.d.ts +1 -1
  4. package/dist/helpers/index.d.ts +2 -2
  5. package/dist/helpers/scales.d.ts +2 -2
  6. package/dist/helpers/scales.js +10 -21
  7. package/dist/helpers/typeChecks.d.ts +4 -4
  8. package/dist/marks/Area.svelte.d.ts +34 -37
  9. package/dist/marks/AreaX.svelte.d.ts +35 -38
  10. package/dist/marks/AreaY.svelte.d.ts +35 -38
  11. package/dist/marks/Arrow.svelte.d.ts +34 -37
  12. package/dist/marks/AxisX.svelte +2 -2
  13. package/dist/marks/AxisX.svelte.d.ts +36 -39
  14. package/dist/marks/AxisY.svelte.d.ts +35 -38
  15. package/dist/marks/BarX.svelte.d.ts +35 -38
  16. package/dist/marks/BarY.svelte.d.ts +34 -37
  17. package/dist/marks/BollingerX.svelte.d.ts +74 -2
  18. package/dist/marks/BollingerY.svelte.d.ts +74 -2
  19. package/dist/marks/Cell.svelte.d.ts +34 -37
  20. package/dist/marks/CustomMark.svelte.d.ts +81 -2
  21. package/dist/marks/DifferenceY.svelte.d.ts +67 -7
  22. package/dist/marks/Dot.svelte +1 -1
  23. package/dist/marks/Dot.svelte.d.ts +34 -37
  24. package/dist/marks/DotX.svelte.d.ts +34 -37
  25. package/dist/marks/DotY.svelte.d.ts +34 -37
  26. package/dist/marks/Geo.svelte.d.ts +34 -37
  27. package/dist/marks/GridX.svelte.d.ts +34 -37
  28. package/dist/marks/GridY.svelte.d.ts +34 -37
  29. package/dist/marks/Line.svelte.d.ts +36 -39
  30. package/dist/marks/LineX.svelte.d.ts +35 -38
  31. package/dist/marks/LineY.svelte.d.ts +35 -38
  32. package/dist/marks/Link.svelte.d.ts +34 -37
  33. package/dist/marks/Rect.svelte.d.ts +34 -37
  34. package/dist/marks/RuleX.svelte.d.ts +34 -37
  35. package/dist/marks/RuleY.svelte.d.ts +34 -37
  36. package/dist/marks/Spike.svelte.d.ts +34 -36
  37. package/dist/marks/Text.svelte.d.ts +34 -37
  38. package/dist/marks/TickX.svelte.d.ts +34 -37
  39. package/dist/marks/TickY.svelte.d.ts +34 -37
  40. package/dist/marks/Vector.svelte.d.ts +34 -37
  41. package/dist/marks/helpers/BaseAxisX.svelte +0 -10
  42. package/dist/marks/helpers/BaseAxisX.svelte.d.ts +0 -1
  43. package/dist/marks/helpers/RectPath.svelte.d.ts +63 -3
  44. package/dist/marks/helpers/Regression.svelte +1 -1
  45. package/dist/transforms/bollinger.d.ts +67 -1
  46. package/dist/transforms/group.d.ts +12 -4
  47. package/dist/transforms/interval.d.ts +124 -2
  48. package/dist/transforms/recordize.d.ts +4 -1
  49. package/dist/transforms/select.d.ts +434 -7
  50. package/dist/transforms/sort.d.ts +246 -3
  51. package/dist/transforms/stack.d.ts +23 -3
  52. package/dist/transforms/window.d.ts +130 -2
  53. package/dist/types/mark.d.ts +34 -37
  54. package/dist/types/scale.d.ts +0 -6
  55. package/package.json +128 -130
  56. package/dist/regression/exponential.d.ts +0 -17
  57. package/dist/regression/exponential.js +0 -56
  58. package/dist/regression/index.d.ts +0 -10
  59. package/dist/regression/index.js +0 -10
  60. package/dist/regression/linear.d.ts +0 -17
  61. package/dist/regression/linear.js +0 -59
  62. package/dist/regression/loess.d.ts +0 -14
  63. package/dist/regression/loess.js +0 -122
  64. package/dist/regression/logarithmic.d.ts +0 -20
  65. package/dist/regression/logarithmic.js +0 -60
  66. package/dist/regression/polynomial.d.ts +0 -21
  67. package/dist/regression/polynomial.js +0 -160
  68. package/dist/regression/power.d.ts +0 -18
  69. package/dist/regression/power.js +0 -56
  70. package/dist/regression/quadratic.d.ts +0 -19
  71. package/dist/regression/quadratic.js +0 -70
  72. package/dist/regression/types.d.ts +0 -4
  73. package/dist/regression/types.js +0 -1
  74. package/dist/regression/utils/determination.d.ts +0 -6
  75. package/dist/regression/utils/determination.js +0 -16
  76. package/dist/regression/utils/geometry.d.ts +0 -9
  77. package/dist/regression/utils/geometry.js +0 -12
  78. package/dist/regression/utils/interpose.d.ts +0 -6
  79. package/dist/regression/utils/interpose.js +0 -37
  80. package/dist/regression/utils/median.d.ts +0 -4
  81. package/dist/regression/utils/median.js +0 -8
  82. package/dist/regression/utils/ols.d.ts +0 -6
  83. package/dist/regression/utils/ols.js +0 -9
  84. package/dist/regression/utils/points.d.ts +0 -11
  85. package/dist/regression/utils/points.js +0 -45
  86. package/dist/transforms/dodge.d.ts +0 -17
  87. package/dist/transforms/dodge.js +0 -128
package/package.json CHANGED
@@ -1,136 +1,134 @@
1
1
  {
2
- "name": "svelteplot",
3
- "version": "0.4.5-pr-208.3",
4
- "license": "ISC",
5
- "author": {
6
- "name": "Gregor Aisch",
7
- "email": "gka@users.noreply.github.com"
2
+ "name": "svelteplot",
3
+ "version": "0.4.5",
4
+ "license": "ISC",
5
+ "author": {
6
+ "name": "Gregor Aisch",
7
+ "email": "gka@users.noreply.github.com"
8
+ },
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "svelte": "./dist/index.js"
8
13
  },
9
- "scripts": {
10
- "dev": "vite dev",
11
- "build": "vite build",
12
- "preview": "vite preview",
13
- "test": "npm run test:unit",
14
- "test:visual": "node scripts/visual-regression.js",
15
- "vr:report": "node scripts/vr-report.js",
16
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
17
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
18
- "lint": "prettier --check src && eslint src",
19
- "format": "prettier --write .",
20
- "test:unit": "vitest",
21
- "prepack": "npx svelte-package",
22
- "release-next": "npm version prerelease --preid next && npm publish && git push && git push --tags && sleep 1 && npm dist-tag add svelteplot@$(npm view . version) next",
23
- "docs": "npm run build && cd build && rsync --recursive . vis4.net:svelteplot/alpha0/",
24
- "screenshots": "node screenshot-examples.js",
25
- "check-js-extensions": "node scripts/check-js-extensions.js src"
14
+ "./*.js": {
15
+ "import": "./dist/*.js"
26
16
  },
27
- "exports": {
28
- ".": {
29
- "types": "./dist/index.d.ts",
30
- "svelte": "./dist/index.js"
31
- },
32
- "./*.js": {
33
- "import": "./dist/*.js"
34
- },
35
- "./*.svelte": {
36
- "import": "./dist/*.svelte"
37
- },
38
- "./core/*.svelte": {
39
- "import": "./dist/core/*.svelte"
40
- },
41
- "./marks/*.svelte": {
42
- "import": "./dist/marks/*.svelte"
43
- },
44
- "./transforms": {
45
- "import": "./dist/transforms/index.js"
46
- }
17
+ "./*.svelte": {
18
+ "import": "./dist/*.svelte"
47
19
  },
48
- "main": "./dist/index.js",
49
- "files": [
50
- "dist",
51
- "!dist/**/*.test.*",
52
- "!dist/**/*.spec.*"
53
- ],
54
- "devDependencies": {
55
- "@aitodotai/json-stringify-pretty-compact": "^1.3.0",
56
- "@emotion/css": "^11.13.5",
57
- "@sveltejs/adapter-auto": "^6.1.0",
58
- "@sveltejs/adapter-static": "^3.0.9",
59
- "@sveltejs/eslint-config": "^8.3.4",
60
- "@sveltejs/kit": "^2.37.0",
61
- "@sveltejs/package": "^2.5.0",
62
- "@sveltejs/vite-plugin-svelte": "5.1.1",
63
- "@sveltepress/theme-default": "^6.0.4",
64
- "@sveltepress/twoslash": "^1.2.2",
65
- "@sveltepress/vite": "^1.2.2",
66
- "@testing-library/svelte": "^5.2.8",
67
- "@testing-library/user-event": "^14.6.1",
68
- "@types/d3-array": "^3.2.1",
69
- "@types/d3-color": "^3.1.3",
70
- "@types/d3-dsv": "^3.0.7",
71
- "@types/d3-geo": "^3.1.0",
72
- "@types/d3-interpolate": "^3.0.4",
73
- "@types/d3-path": "^3.1.1",
74
- "@types/d3-quadtree": "^3.0.6",
75
- "@types/d3-random": "^3.0.3",
76
- "@types/d3-scale": "^4.0.9",
77
- "@types/d3-scale-chromatic": "^3.1.0",
78
- "@types/d3-shape": "^3.1.7",
79
- "@types/geojson": "^7946.0.16",
80
- "@types/topojson": "^3.2.6",
81
- "@types/topojson-client": "^3.1.5",
82
- "@typescript-eslint/eslint-plugin": "^8.42.0",
83
- "@typescript-eslint/parser": "^8.42.0",
84
- "csstype": "^3.1.3",
85
- "d3-dsv": "^3.0.1",
86
- "d3-fetch": "^3.0.1",
87
- "d3-force": "^3.0.0",
88
- "eslint": "^9.34.0",
89
- "eslint-config-prettier": "^10.1.8",
90
- "eslint-plugin-svelte": "3.12.1",
91
- "jsdom": "^26.1.0",
92
- "prettier": "^3.6.2",
93
- "prettier-plugin-svelte": "^3.4.0",
94
- "puppeteer": "^24.19.0",
95
- "remark-code-extra": "^1.0.1",
96
- "remark-code-frontmatter": "^1.0.0",
97
- "resize-observer-polyfill": "^1.5.1",
98
- "sass": "^1.92.0",
99
- "svelte-check": "^4.3.1",
100
- "svelte-eslint-parser": "1.3.1",
101
- "svelte-highlight": "^7.8.4",
102
- "svg-path-parser": "^1.1.0",
103
- "topojson-client": "^3.1.0",
104
- "ts-essentials": "^10.1.1",
105
- "tslib": "^2.8.1",
106
- "typedoc": "^0.28.12",
107
- "typedoc-plugin-markdown": "^4.8.1",
108
- "typescript": "^5.9.2",
109
- "vite": "^6.3.5",
110
- "vitest": "^3.2.4",
111
- "vitest-matchmedia-mock": "^2.0.3",
112
- "yoctocolors": "^2.1.2"
20
+ "./core/*.svelte": {
21
+ "import": "./dist/core/*.svelte"
113
22
  },
114
- "types": "./dist/index.d.ts",
115
- "type": "module",
116
- "dependencies": {
117
- "@gka/d3-regression": "^1.3.10-pr48",
118
- "d3-array": "^3.2.4",
119
- "d3-color": "^3.1.0",
120
- "d3-format": "^3.1.0",
121
- "d3-geo": "^3.1.1",
122
- "d3-interpolate": "^3.0.1",
123
- "d3-path": "^3.1.0",
124
- "d3-quadtree": "^3.0.1",
125
- "d3-random": "^3.0.1",
126
- "d3-scale": "^4.0.2",
127
- "d3-scale-chromatic": "^3.1.0",
128
- "d3-shape": "^3.2.0",
129
- "d3-time": "^3.1.0",
130
- "es-toolkit": "^1.39.10",
131
- "fast-equals": "^5.2.2",
132
- "interval-tree-1d": "^1.0.4",
133
- "merge-deep": "^3.0.3",
134
- "svelte": "5.38.7"
23
+ "./marks/*.svelte": {
24
+ "import": "./dist/marks/*.svelte"
25
+ },
26
+ "./transforms": {
27
+ "import": "./dist/transforms/index.js"
135
28
  }
136
- }
29
+ },
30
+ "main": "./dist/index.js",
31
+ "files": [
32
+ "dist",
33
+ "!dist/**/*.test.*",
34
+ "!dist/**/*.spec.*"
35
+ ],
36
+ "devDependencies": {
37
+ "@aitodotai/json-stringify-pretty-compact": "^1.3.0",
38
+ "@emotion/css": "^11.13.5",
39
+ "@sveltejs/adapter-auto": "^6.1.0",
40
+ "@sveltejs/adapter-static": "^3.0.9",
41
+ "@sveltejs/eslint-config": "^8.3.4",
42
+ "@sveltejs/kit": "^2.37.0",
43
+ "@sveltejs/package": "^2.5.0",
44
+ "@sveltejs/vite-plugin-svelte": "5.1.1",
45
+ "@sveltepress/theme-default": "^6.0.4",
46
+ "@sveltepress/twoslash": "^1.2.2",
47
+ "@sveltepress/vite": "^1.2.2",
48
+ "@testing-library/svelte": "^5.2.8",
49
+ "@testing-library/user-event": "^14.6.1",
50
+ "@types/d3-array": "^3.2.1",
51
+ "@types/d3-color": "^3.1.3",
52
+ "@types/d3-dsv": "^3.0.7",
53
+ "@types/d3-geo": "^3.1.0",
54
+ "@types/d3-interpolate": "^3.0.4",
55
+ "@types/d3-path": "^3.1.1",
56
+ "@types/d3-quadtree": "^3.0.6",
57
+ "@types/d3-random": "^3.0.3",
58
+ "@types/d3-scale": "^4.0.9",
59
+ "@types/d3-scale-chromatic": "^3.1.0",
60
+ "@types/d3-shape": "^3.1.7",
61
+ "@types/geojson": "^7946.0.16",
62
+ "@types/topojson": "^3.2.6",
63
+ "@types/topojson-client": "^3.1.5",
64
+ "@typescript-eslint/eslint-plugin": "^8.42.0",
65
+ "@typescript-eslint/parser": "^8.42.0",
66
+ "csstype": "^3.1.3",
67
+ "d3-dsv": "^3.0.1",
68
+ "d3-fetch": "^3.0.1",
69
+ "d3-force": "^3.0.0",
70
+ "eslint": "^9.34.0",
71
+ "eslint-config-prettier": "^10.1.8",
72
+ "eslint-plugin-svelte": "3.12.1",
73
+ "jsdom": "^26.1.0",
74
+ "prettier": "^3.6.2",
75
+ "prettier-plugin-svelte": "^3.4.0",
76
+ "puppeteer": "^24.19.0",
77
+ "remark-code-extra": "^1.0.1",
78
+ "remark-code-frontmatter": "^1.0.0",
79
+ "resize-observer-polyfill": "^1.5.1",
80
+ "sass": "^1.92.0",
81
+ "svelte-check": "^4.3.1",
82
+ "svelte-eslint-parser": "1.3.1",
83
+ "svelte-highlight": "^7.8.4",
84
+ "svg-path-parser": "^1.1.0",
85
+ "topojson-client": "^3.1.0",
86
+ "ts-essentials": "^10.1.1",
87
+ "tslib": "^2.8.1",
88
+ "typedoc": "^0.28.12",
89
+ "typedoc-plugin-markdown": "^4.8.1",
90
+ "typescript": "^5.9.2",
91
+ "vite": "^6.3.5",
92
+ "vitest": "^3.2.4",
93
+ "vitest-matchmedia-mock": "^2.0.3",
94
+ "yoctocolors": "^2.1.2"
95
+ },
96
+ "types": "./dist/index.d.ts",
97
+ "type": "module",
98
+ "dependencies": {
99
+ "d3-array": "^3.2.4",
100
+ "d3-color": "^3.1.0",
101
+ "d3-format": "^3.1.0",
102
+ "d3-geo": "^3.1.1",
103
+ "d3-interpolate": "^3.0.1",
104
+ "d3-path": "^3.1.0",
105
+ "d3-quadtree": "^3.0.1",
106
+ "d3-random": "^3.0.1",
107
+ "d3-regression": "^1.3.10",
108
+ "d3-scale": "^4.0.2",
109
+ "d3-scale-chromatic": "^3.1.0",
110
+ "d3-shape": "^3.2.0",
111
+ "d3-time": "^3.1.0",
112
+ "es-toolkit": "^1.39.10",
113
+ "fast-equals": "^5.2.2",
114
+ "merge-deep": "^3.0.3",
115
+ "svelte": "5.38.7"
116
+ },
117
+ "scripts": {
118
+ "dev": "vite dev",
119
+ "build": "vite build",
120
+ "preview": "vite preview",
121
+ "test": "npm run test:unit",
122
+ "test:visual": "node scripts/visual-regression.js",
123
+ "vr:report": "node scripts/vr-report.js",
124
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
125
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
126
+ "lint": "prettier --check src && eslint src",
127
+ "format": "prettier --write .",
128
+ "test:unit": "vitest",
129
+ "release-next": "npm version prerelease --preid next && npm publish && git push && git push --tags && sleep 1 && npm dist-tag add svelteplot@$(npm view . version) next",
130
+ "docs": "npm run build && cd build && rsync --recursive . vis4.net:svelteplot/alpha0/",
131
+ "screenshots": "node screenshot-examples.js",
132
+ "check-js-extensions": "node scripts/check-js-extensions.js src"
133
+ }
134
+ }
@@ -1,17 +0,0 @@
1
- import type { PredictFunction, Domain, DataPoint, Accessor } from './types.js';
2
- export type ExponentialOutput = [DataPoint, DataPoint] & {
3
- a: number;
4
- b: number;
5
- predict: PredictFunction;
6
- rSquared: number;
7
- };
8
- export interface ExponentialRegression<T> {
9
- (data: T[]): ExponentialOutput;
10
- domain(): Domain;
11
- domain(arr: Domain): this;
12
- x(): Accessor<T>;
13
- x(fn: Accessor<T>): this;
14
- y(): Accessor<T>;
15
- y(fn: Accessor<T>): this;
16
- }
17
- export default function exponential<T = DataPoint>(): ExponentialRegression<T>;
@@ -1,56 +0,0 @@
1
- /**
2
- * Adapted from https://github.com/HarryStevens/d3-regression
3
- */
4
- import { determination } from './utils/determination.js';
5
- import { interpose } from './utils/interpose.js';
6
- import { ols } from './utils/ols.js';
7
- import { visitPoints } from './utils/points.js';
8
- export default function exponential() {
9
- let y = (d) => d[1], x = (d) => d[0], domain;
10
- const exponentialRegression = function (data) {
11
- let n = 0, Y = 0, YL = 0, XY = 0, XYL = 0, X2Y = 0, xmin = domain ? +domain[0] : Infinity, xmax = domain ? +domain[1] : -Infinity;
12
- visitPoints(data, x, y, (dx, dy) => {
13
- const ly = Math.log(dy), xy = dx * dy;
14
- ++n;
15
- Y += (dy - Y) / n;
16
- XY += (xy - XY) / n;
17
- X2Y += (dx * xy - X2Y) / n;
18
- YL += (dy * ly - YL) / n;
19
- XYL += (xy * ly - XYL) / n;
20
- if (!domain) {
21
- if (dx < xmin)
22
- xmin = dx;
23
- if (dx > xmax)
24
- xmax = dx;
25
- }
26
- });
27
- let [a, b] = ols(XY / Y, YL / Y, XYL / Y, X2Y / Y);
28
- a = Math.exp(a);
29
- const fn = (xx) => a * Math.exp(b * xx);
30
- const out = interpose(xmin, xmax, fn);
31
- out.a = a;
32
- out.b = b;
33
- out.predict = fn;
34
- out.rSquared = determination(data, x, y, Y, fn);
35
- return out;
36
- };
37
- exponentialRegression.domain = function (arr) {
38
- if (!arguments.length)
39
- return domain;
40
- domain = arr;
41
- return exponentialRegression;
42
- };
43
- exponentialRegression.x = function (fn) {
44
- if (!arguments.length)
45
- return x;
46
- x = fn;
47
- return exponentialRegression;
48
- };
49
- exponentialRegression.y = function (fn) {
50
- if (!arguments.length)
51
- return y;
52
- y = fn;
53
- return exponentialRegression;
54
- };
55
- return exponentialRegression;
56
- }
@@ -1,10 +0,0 @@
1
- /**
2
- * Adapted from https://github.com/HarryStevens/d3-regression
3
- */
4
- export { default as regressionLinear } from './linear.js';
5
- export { default as regressionPoly } from './polynomial.js';
6
- export { default as regressionExp } from './exponential.js';
7
- export { default as regressionLog } from './logarithmic.js';
8
- export { default as regressionPow } from './power.js';
9
- export { default as regressionQuad } from './quadratic.js';
10
- export { default as regressionLoess } from './loess.js';
@@ -1,10 +0,0 @@
1
- /**
2
- * Adapted from https://github.com/HarryStevens/d3-regression
3
- */
4
- export { default as regressionLinear } from './linear.js';
5
- export { default as regressionPoly } from './polynomial.js';
6
- export { default as regressionExp } from './exponential.js';
7
- export { default as regressionLog } from './logarithmic.js';
8
- export { default as regressionPow } from './power.js';
9
- export { default as regressionQuad } from './quadratic.js';
10
- export { default as regressionLoess } from './loess.js';
@@ -1,17 +0,0 @@
1
- import type { PredictFunction, Accessor, DataPoint, Domain } from './types.js';
2
- export type LinearOutput = [DataPoint, DataPoint] & {
3
- a: number;
4
- b: number;
5
- predict: PredictFunction;
6
- rSquared: number;
7
- };
8
- export interface LinearRegression<T> {
9
- (data: T[]): LinearOutput;
10
- domain(): Domain;
11
- domain(arr: Domain): this;
12
- x(): Accessor<T>;
13
- x(fn: Accessor<T>): this;
14
- y(): Accessor<T>;
15
- y(fn: Accessor<T>): this;
16
- }
17
- export default function linear<T = DataPoint>(): LinearRegression<T>;
@@ -1,59 +0,0 @@
1
- /**
2
- * Adapted from https://github.com/HarryStevens/d3-regression
3
- */
4
- import { determination } from './utils/determination.js';
5
- import { ols } from './utils/ols.js';
6
- import { visitPoints } from './utils/points.js';
7
- export default function linear() {
8
- let x = (d) => d[0], y = (d) => d[1], domain;
9
- const linearRegression = function (data) {
10
- let n = 0, X = 0, // sum of x
11
- Y = 0, // sum of y
12
- XY = 0, // sum of x*y
13
- X2 = 0, // sum of x*x
14
- xmin = domain ? +domain[0] : Infinity, xmax = domain ? +domain[1] : -Infinity;
15
- visitPoints(data, x, y, (dx, dy) => {
16
- ++n;
17
- X += (dx - X) / n;
18
- Y += (dy - Y) / n;
19
- XY += (dx * dy - XY) / n;
20
- X2 += (dx * dx - X2) / n;
21
- if (!domain) {
22
- if (dx < xmin)
23
- xmin = dx;
24
- if (dx > xmax)
25
- xmax = dx;
26
- }
27
- });
28
- const [intercept, slope] = ols(X, Y, XY, X2);
29
- const fn = (xx) => slope * xx + intercept;
30
- const out = [
31
- [xmin, fn(xmin)],
32
- [xmax, fn(xmax)]
33
- ];
34
- out.a = slope;
35
- out.b = intercept;
36
- out.predict = fn;
37
- out.rSquared = determination(data, x, y, Y, fn);
38
- return out;
39
- };
40
- linearRegression.domain = function (arr) {
41
- if (!arguments.length)
42
- return domain;
43
- domain = arr;
44
- return linearRegression;
45
- };
46
- linearRegression.x = function (fn) {
47
- if (!arguments.length)
48
- return x;
49
- x = fn;
50
- return linearRegression;
51
- };
52
- linearRegression.y = function (fn) {
53
- if (!arguments.length)
54
- return y;
55
- y = fn;
56
- return linearRegression;
57
- };
58
- return linearRegression;
59
- }
@@ -1,14 +0,0 @@
1
- /**
2
- * Adapted from https://github.com/HarryStevens/d3-regression
3
- */
4
- import type { Accessor, DataPoint } from './types.js';
5
- export interface LoessRegression<T> {
6
- (data: T[]): DataPoint[];
7
- bandwidth(): number;
8
- bandwidth(bw: number): this;
9
- x(): Accessor<T>;
10
- x(fn: Accessor<T>): this;
11
- y(): Accessor<T>;
12
- y(fn: Accessor<T>): this;
13
- }
14
- export default function loess<T = DataPoint>(): LoessRegression<T>;
@@ -1,122 +0,0 @@
1
- /**
2
- * Adapted from https://github.com/HarryStevens/d3-regression
3
- */
4
- // Adapted from science.js by Jason Davies
5
- // License: https://github.com/jasondavies/science.js/blob/master/LICENSE
6
- // Source: https://github.com/jasondavies/science.js/blob/master/src/stats/loess.js
7
- // Adapted from vega-statistics by Jeffrey Heer
8
- // License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE
9
- // Source: https://github.com/vega/vega/blob/f21cb8792b4e0cbe2b1a3fd44b0f5db370dbaadb/packages/vega-statistics/src/regression/loess.js
10
- import { median } from './utils/median.js';
11
- import { ols } from './utils/ols.js';
12
- import { points } from './utils/points.js';
13
- const maxiters = 2, epsilon = 1e-12;
14
- export default function loess() {
15
- let x = (d) => d[0], y = (d) => d[1], bandwidth = 0.3;
16
- const loessRegression = function loessRegression(data) {
17
- const [xv, yv, ux, uy] = points(data, (dd) => x(dd), (dd) => y(dd), true);
18
- const n = xv.length;
19
- const bw = Math.max(2, ~~(bandwidth * n)); // # of nearest neighbors
20
- const yhat = new Float64Array(n);
21
- const residuals = new Float64Array(n);
22
- const robustWeights = new Float64Array(n).fill(1);
23
- for (let iter = -1; ++iter <= maxiters;) {
24
- const interval = [0, bw - 1];
25
- for (let i = 0; i < n; ++i) {
26
- const dx = xv[i];
27
- const i0 = interval[0];
28
- const i1 = interval[1];
29
- const edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;
30
- let W = 0, X = 0, Y = 0, XY = 0, X2 = 0;
31
- const denom = 1 / Math.abs(xv[edge] - dx || 1);
32
- for (let k = i0; k <= i1; ++k) {
33
- const xk = xv[k];
34
- const yk = yv[k];
35
- const w = tricube(Math.abs(dx - xk) * denom) * robustWeights[k];
36
- const xkw = xk * w;
37
- W += w;
38
- X += xkw;
39
- Y += yk * w;
40
- XY += yk * xkw;
41
- X2 += xk * xkw;
42
- }
43
- // Linear regression fit
44
- const [a, b] = ols(X / W, Y / W, XY / W, X2 / W);
45
- yhat[i] = a + b * dx;
46
- residuals[i] = Math.abs(yv[i] - yhat[i]);
47
- updateInterval(xv, i + 1, interval);
48
- }
49
- if (iter === maxiters) {
50
- break;
51
- }
52
- const medianResidual = median(residuals);
53
- if (Math.abs(medianResidual) < epsilon)
54
- break;
55
- for (let i = 0, arg, w; i < n; ++i) {
56
- arg = residuals[i] / (6 * medianResidual);
57
- // Default to epsilon (rather than zero) for large deviations
58
- // Keeping weights tiny but non-zero prevents singularites
59
- robustWeights[i] = arg >= 1 ? epsilon : (w = 1 - arg * arg) * w;
60
- }
61
- }
62
- return output(xv, yhat, ux, uy);
63
- };
64
- loessRegression.bandwidth = function (bw) {
65
- if (!arguments.length)
66
- return bandwidth;
67
- bandwidth = bw;
68
- return loessRegression;
69
- };
70
- loessRegression.x = function (fn) {
71
- if (!arguments.length)
72
- return x;
73
- x = fn;
74
- return loessRegression;
75
- };
76
- loessRegression.y = function (fn) {
77
- if (!arguments.length)
78
- return y;
79
- y = fn;
80
- return loessRegression;
81
- };
82
- return loessRegression;
83
- }
84
- // Weighting kernel for local regression
85
- function tricube(x) {
86
- return (x = 1 - x * x * x) * x * x;
87
- }
88
- // Advance sliding window interval of nearest neighbors
89
- function updateInterval(xv, i, interval) {
90
- let val = xv[i], left = interval[0], right = interval[1] + 1;
91
- if (right >= xv.length)
92
- return;
93
- // Step right if distance to new right edge is <= distance to old left edge
94
- // Step when distance is equal to ensure movement over duplicate x values
95
- while (i > left && xv[right] - val <= val - xv[left]) {
96
- interval[0] = ++left;
97
- interval[1] = right;
98
- ++right;
99
- }
100
- }
101
- // Generate smoothed output points
102
- // Average points with repeated x values
103
- function output(xv, yhat, ux, uy) {
104
- const n = xv.length, out = [];
105
- let i = 0, cnt = 0, prev = [], v;
106
- for (; i < n; ++i) {
107
- v = xv[i] + ux;
108
- if (prev[0] === v) {
109
- // Average output values via online update
110
- prev[1] += (yhat[i] - prev[1]) / ++cnt;
111
- }
112
- else {
113
- // Add new output point
114
- cnt = 0;
115
- prev[1] += uy;
116
- prev = [v, yhat[i]];
117
- out.push(prev);
118
- }
119
- }
120
- prev[1] += uy;
121
- return out;
122
- }
@@ -1,20 +0,0 @@
1
- import type { PredictFunction, DataPoint, Accessor, Domain } from './types.js';
2
- type LogarithmicOutput = [DataPoint, DataPoint] & {
3
- a: number;
4
- b: number;
5
- predict: PredictFunction;
6
- rSquared: number;
7
- };
8
- export interface LogarithmicRegression<T> {
9
- (data: T[]): LogarithmicOutput;
10
- domain(): Domain;
11
- domain(arr: Domain): this;
12
- x(): Accessor<T>;
13
- x(fn: Accessor<T>): this;
14
- y(): Accessor<T>;
15
- y(fn: Accessor<T>): this;
16
- base(): number;
17
- base(b: number): this;
18
- }
19
- export default function logarithmic<T = DataPoint>(): LogarithmicRegression<T>;
20
- export {};
@@ -1,60 +0,0 @@
1
- /**
2
- * Adapted from https://github.com/HarryStevens/d3-regression
3
- */
4
- import { determination } from './utils/determination.js';
5
- import { interpose } from './utils/interpose.js';
6
- import { ols } from './utils/ols.js';
7
- import { visitPoints } from './utils/points.js';
8
- export default function logarithmic() {
9
- let x = (d) => d[0], y = (d) => d[1], base = Math.E, domain;
10
- const logarithmicRegression = function (data) {
11
- let n = 0, X = 0, Y = 0, XY = 0, X2 = 0, xmin = domain ? +domain[0] : Infinity, xmax = domain ? +domain[1] : -Infinity, lb = Math.log(base);
12
- visitPoints(data, x, y, (dx, dy) => {
13
- const lx = Math.log(dx) / lb;
14
- ++n;
15
- X += (lx - X) / n;
16
- Y += (dy - Y) / n;
17
- XY += (lx * dy - XY) / n;
18
- X2 += (lx * lx - X2) / n;
19
- if (!domain) {
20
- if (dx < xmin)
21
- xmin = dx;
22
- if (dx > xmax)
23
- xmax = dx;
24
- }
25
- });
26
- const [intercept, slope] = ols(X, Y, XY, X2);
27
- const fn = (xx) => (slope * Math.log(xx)) / lb + intercept;
28
- const out = interpose(xmin, xmax, fn);
29
- out.a = slope;
30
- out.b = intercept;
31
- out.predict = fn;
32
- out.rSquared = determination(data, x, y, Y, fn);
33
- return out;
34
- };
35
- logarithmicRegression.domain = function (arr) {
36
- if (!arguments.length)
37
- return domain;
38
- domain = arr;
39
- return logarithmicRegression;
40
- };
41
- logarithmicRegression.x = function (fn) {
42
- if (!arguments.length)
43
- return x;
44
- x = fn;
45
- return logarithmicRegression;
46
- };
47
- logarithmicRegression.y = function (fn) {
48
- if (!arguments.length)
49
- return y;
50
- y = fn;
51
- return logarithmicRegression;
52
- };
53
- logarithmicRegression.base = function (b) {
54
- if (!arguments.length)
55
- return base;
56
- base = b;
57
- return logarithmicRegression;
58
- };
59
- return logarithmicRegression;
60
- }