svelteplot 0.4.5-pr-208.4 → 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.
- package/dist/Mark.svelte +73 -87
- package/dist/Mark.svelte.d.ts +34 -37
- package/dist/helpers/colors.d.ts +1 -1
- package/dist/helpers/index.d.ts +2 -2
- package/dist/helpers/scales.d.ts +2 -2
- package/dist/helpers/scales.js +10 -21
- package/dist/helpers/typeChecks.d.ts +4 -4
- package/dist/marks/Area.svelte.d.ts +34 -37
- package/dist/marks/AreaX.svelte.d.ts +35 -38
- package/dist/marks/AreaY.svelte.d.ts +35 -38
- package/dist/marks/Arrow.svelte.d.ts +34 -37
- package/dist/marks/AxisX.svelte +2 -2
- package/dist/marks/AxisX.svelte.d.ts +36 -39
- package/dist/marks/AxisY.svelte.d.ts +35 -38
- package/dist/marks/BarX.svelte.d.ts +35 -38
- package/dist/marks/BarY.svelte.d.ts +34 -37
- package/dist/marks/BollingerX.svelte.d.ts +74 -2
- package/dist/marks/BollingerY.svelte.d.ts +74 -2
- package/dist/marks/Cell.svelte.d.ts +34 -37
- package/dist/marks/CustomMark.svelte.d.ts +81 -2
- package/dist/marks/DifferenceY.svelte.d.ts +67 -7
- package/dist/marks/Dot.svelte +1 -1
- package/dist/marks/Dot.svelte.d.ts +34 -37
- package/dist/marks/DotX.svelte.d.ts +34 -37
- package/dist/marks/DotY.svelte.d.ts +34 -37
- package/dist/marks/Geo.svelte.d.ts +34 -37
- package/dist/marks/GridX.svelte.d.ts +34 -37
- package/dist/marks/GridY.svelte.d.ts +34 -37
- package/dist/marks/Line.svelte.d.ts +36 -39
- package/dist/marks/LineX.svelte.d.ts +35 -38
- package/dist/marks/LineY.svelte.d.ts +35 -38
- package/dist/marks/Link.svelte.d.ts +34 -37
- package/dist/marks/Rect.svelte.d.ts +34 -37
- package/dist/marks/RuleX.svelte.d.ts +34 -37
- package/dist/marks/RuleY.svelte.d.ts +34 -37
- package/dist/marks/Spike.svelte.d.ts +34 -36
- package/dist/marks/Text.svelte.d.ts +34 -37
- package/dist/marks/TickX.svelte.d.ts +34 -37
- package/dist/marks/TickY.svelte.d.ts +34 -37
- package/dist/marks/Vector.svelte.d.ts +34 -37
- package/dist/marks/helpers/BaseAxisX.svelte +0 -10
- package/dist/marks/helpers/BaseAxisX.svelte.d.ts +0 -1
- package/dist/marks/helpers/RectPath.svelte.d.ts +63 -3
- package/dist/marks/helpers/Regression.svelte +1 -1
- package/dist/transforms/bollinger.d.ts +67 -1
- package/dist/transforms/group.d.ts +12 -4
- package/dist/transforms/interval.d.ts +124 -2
- package/dist/transforms/recordize.d.ts +4 -1
- package/dist/transforms/select.d.ts +434 -7
- package/dist/transforms/sort.d.ts +246 -3
- package/dist/transforms/stack.d.ts +23 -3
- package/dist/transforms/window.d.ts +130 -2
- package/dist/types/mark.d.ts +34 -37
- package/dist/types/scale.d.ts +0 -6
- package/package.json +128 -129
- package/dist/regression/exponential.d.ts +0 -17
- package/dist/regression/exponential.js +0 -56
- package/dist/regression/index.d.ts +0 -10
- package/dist/regression/index.js +0 -10
- package/dist/regression/linear.d.ts +0 -17
- package/dist/regression/linear.js +0 -59
- package/dist/regression/loess.d.ts +0 -14
- package/dist/regression/loess.js +0 -122
- package/dist/regression/logarithmic.d.ts +0 -20
- package/dist/regression/logarithmic.js +0 -60
- package/dist/regression/polynomial.d.ts +0 -21
- package/dist/regression/polynomial.js +0 -160
- package/dist/regression/power.d.ts +0 -18
- package/dist/regression/power.js +0 -56
- package/dist/regression/quadratic.d.ts +0 -19
- package/dist/regression/quadratic.js +0 -70
- package/dist/regression/types.d.ts +0 -4
- package/dist/regression/types.js +0 -1
- package/dist/regression/utils/determination.d.ts +0 -6
- package/dist/regression/utils/determination.js +0 -16
- package/dist/regression/utils/geometry.d.ts +0 -9
- package/dist/regression/utils/geometry.js +0 -12
- package/dist/regression/utils/interpose.d.ts +0 -6
- package/dist/regression/utils/interpose.js +0 -37
- package/dist/regression/utils/median.d.ts +0 -4
- package/dist/regression/utils/median.js +0 -8
- package/dist/regression/utils/ols.d.ts +0 -6
- package/dist/regression/utils/ols.js +0 -9
- package/dist/regression/utils/points.d.ts +0 -11
- package/dist/regression/utils/points.js +0 -45
- package/dist/transforms/dodge.d.ts +0 -17
- package/dist/transforms/dodge.js +0 -128
package/package.json
CHANGED
|
@@ -1,135 +1,134 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
"
|
|
10
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
49
|
-
|
|
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
|
-
"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
"d3-format": "^3.1.0",
|
|
120
|
-
"d3-geo": "^3.1.1",
|
|
121
|
-
"d3-interpolate": "^3.0.1",
|
|
122
|
-
"d3-path": "^3.1.0",
|
|
123
|
-
"d3-quadtree": "^3.0.1",
|
|
124
|
-
"d3-random": "^3.0.1",
|
|
125
|
-
"d3-scale": "^4.0.2",
|
|
126
|
-
"d3-scale-chromatic": "^3.1.0",
|
|
127
|
-
"d3-shape": "^3.2.0",
|
|
128
|
-
"d3-time": "^3.1.0",
|
|
129
|
-
"es-toolkit": "^1.39.10",
|
|
130
|
-
"fast-equals": "^5.2.2",
|
|
131
|
-
"interval-tree-1d": "^1.0.4",
|
|
132
|
-
"merge-deep": "^3.0.3",
|
|
133
|
-
"svelte": "5.38.7"
|
|
23
|
+
"./marks/*.svelte": {
|
|
24
|
+
"import": "./dist/marks/*.svelte"
|
|
25
|
+
},
|
|
26
|
+
"./transforms": {
|
|
27
|
+
"import": "./dist/transforms/index.js"
|
|
134
28
|
}
|
|
135
|
-
}
|
|
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';
|
package/dist/regression/index.js
DELETED
|
@@ -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>;
|
package/dist/regression/loess.js
DELETED
|
@@ -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
|
-
}
|