dpth 0.1.0
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/LICENSE +21 -0
- package/README.md +198 -0
- package/dist/agent-sdk.d.ts +157 -0
- package/dist/agent-sdk.d.ts.map +1 -0
- package/dist/agent-sdk.js +367 -0
- package/dist/agent-sdk.js.map +1 -0
- package/dist/correlation.d.ts +94 -0
- package/dist/correlation.d.ts.map +1 -0
- package/dist/correlation.js +463 -0
- package/dist/correlation.js.map +1 -0
- package/dist/economics.d.ts +203 -0
- package/dist/economics.d.ts.map +1 -0
- package/dist/economics.js +510 -0
- package/dist/economics.js.map +1 -0
- package/dist/embed.d.ts +81 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +270 -0
- package/dist/embed.js.map +1 -0
- package/dist/entity.d.ts +76 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/entity.js +327 -0
- package/dist/entity.js.map +1 -0
- package/dist/fallback.d.ts +104 -0
- package/dist/fallback.d.ts.map +1 -0
- package/dist/fallback.js +359 -0
- package/dist/fallback.js.map +1 -0
- package/dist/federation.d.ts +224 -0
- package/dist/federation.d.ts.map +1 -0
- package/dist/federation.js +377 -0
- package/dist/federation.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/temporal.d.ts +95 -0
- package/dist/temporal.d.ts.map +1 -0
- package/dist/temporal.js +257 -0
- package/dist/temporal.js.map +1 -0
- package/dist/types.d.ts +157 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dpth.io Correlation Engine
|
|
3
|
+
*
|
|
4
|
+
* The magic sauce. Automatically discovers relationships between metrics
|
|
5
|
+
* across different data sources without explicit configuration.
|
|
6
|
+
*
|
|
7
|
+
* Key capabilities:
|
|
8
|
+
* - Pearson correlation for contemporaneous relationships
|
|
9
|
+
* - Cross-correlation for lagged/causal relationships
|
|
10
|
+
* - Anomaly detection via statistical analysis
|
|
11
|
+
* - Significance testing to filter noise
|
|
12
|
+
*/
|
|
13
|
+
// ─── Metric Store ────────────────────────────────────
|
|
14
|
+
/** In-memory metric store */
|
|
15
|
+
const metrics = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* Register a metric for correlation analysis
|
|
18
|
+
*/
|
|
19
|
+
export function registerMetric(metric) {
|
|
20
|
+
metrics.set(metric.id, metric);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Add data points to a metric
|
|
24
|
+
*/
|
|
25
|
+
export function addMetricPoints(metricId, points) {
|
|
26
|
+
const metric = metrics.get(metricId);
|
|
27
|
+
if (!metric)
|
|
28
|
+
return;
|
|
29
|
+
metric.points.push(...points);
|
|
30
|
+
// Keep sorted by timestamp
|
|
31
|
+
metric.points.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get a metric by ID
|
|
35
|
+
*/
|
|
36
|
+
export function getMetric(id) {
|
|
37
|
+
return metrics.get(id);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* List all metrics
|
|
41
|
+
*/
|
|
42
|
+
export function listMetrics() {
|
|
43
|
+
return Array.from(metrics.values());
|
|
44
|
+
}
|
|
45
|
+
// ─── Statistical Helpers ─────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Calculate mean of values
|
|
48
|
+
*/
|
|
49
|
+
function mean(values) {
|
|
50
|
+
if (values.length === 0)
|
|
51
|
+
return 0;
|
|
52
|
+
return values.reduce((a, b) => a + b, 0) / values.length;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Calculate standard deviation
|
|
56
|
+
*/
|
|
57
|
+
function stdDev(values) {
|
|
58
|
+
if (values.length < 2)
|
|
59
|
+
return 0;
|
|
60
|
+
const avg = mean(values);
|
|
61
|
+
const squareDiffs = values.map(v => Math.pow(v - avg, 2));
|
|
62
|
+
return Math.sqrt(mean(squareDiffs));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Calculate Pearson correlation coefficient
|
|
66
|
+
*/
|
|
67
|
+
function pearsonCorrelation(x, y) {
|
|
68
|
+
if (x.length !== y.length || x.length < 3)
|
|
69
|
+
return 0;
|
|
70
|
+
const n = x.length;
|
|
71
|
+
const meanX = mean(x);
|
|
72
|
+
const meanY = mean(y);
|
|
73
|
+
let numerator = 0;
|
|
74
|
+
let denomX = 0;
|
|
75
|
+
let denomY = 0;
|
|
76
|
+
for (let i = 0; i < n; i++) {
|
|
77
|
+
const dx = x[i] - meanX;
|
|
78
|
+
const dy = y[i] - meanY;
|
|
79
|
+
numerator += dx * dy;
|
|
80
|
+
denomX += dx * dx;
|
|
81
|
+
denomY += dy * dy;
|
|
82
|
+
}
|
|
83
|
+
const denominator = Math.sqrt(denomX * denomY);
|
|
84
|
+
if (denominator === 0)
|
|
85
|
+
return 0;
|
|
86
|
+
return numerator / denominator;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Calculate statistical significance (p-value approximation)
|
|
90
|
+
* Uses t-distribution approximation for correlation significance
|
|
91
|
+
*/
|
|
92
|
+
function correlationSignificance(r, n) {
|
|
93
|
+
if (n < 4 || Math.abs(r) >= 1)
|
|
94
|
+
return 1;
|
|
95
|
+
const t = r * Math.sqrt((n - 2) / (1 - r * r));
|
|
96
|
+
const df = n - 2;
|
|
97
|
+
// Approximation of two-tailed p-value
|
|
98
|
+
// Using normal approximation for large df
|
|
99
|
+
const p = 2 * (1 - normalCDF(Math.abs(t)));
|
|
100
|
+
return p;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Normal CDF approximation
|
|
104
|
+
*/
|
|
105
|
+
function normalCDF(x) {
|
|
106
|
+
const a1 = 0.254829592;
|
|
107
|
+
const a2 = -0.284496736;
|
|
108
|
+
const a3 = 1.421413741;
|
|
109
|
+
const a4 = -1.453152027;
|
|
110
|
+
const a5 = 1.061405429;
|
|
111
|
+
const p = 0.3275911;
|
|
112
|
+
const sign = x < 0 ? -1 : 1;
|
|
113
|
+
x = Math.abs(x) / Math.sqrt(2);
|
|
114
|
+
const t = 1.0 / (1.0 + p * x);
|
|
115
|
+
const y = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);
|
|
116
|
+
return 0.5 * (1.0 + sign * y);
|
|
117
|
+
}
|
|
118
|
+
// ─── Time Alignment ──────────────────────────────────
|
|
119
|
+
/**
|
|
120
|
+
* Align two metrics to the same time points using interpolation
|
|
121
|
+
*/
|
|
122
|
+
function alignMetrics(metricA, metricB, lagDays = 0) {
|
|
123
|
+
// Get overlapping time range
|
|
124
|
+
const pointsA = metricA.points;
|
|
125
|
+
const pointsB = metricB.points;
|
|
126
|
+
if (pointsA.length < 2 || pointsB.length < 2) {
|
|
127
|
+
return { valuesA: [], valuesB: [], timestamps: [] };
|
|
128
|
+
}
|
|
129
|
+
const startA = pointsA[0].timestamp.getTime();
|
|
130
|
+
const endA = pointsA[pointsA.length - 1].timestamp.getTime();
|
|
131
|
+
const startB = pointsB[0].timestamp.getTime() + lagDays * 86400000;
|
|
132
|
+
const endB = pointsB[pointsB.length - 1].timestamp.getTime() + lagDays * 86400000;
|
|
133
|
+
const start = Math.max(startA, startB);
|
|
134
|
+
const end = Math.min(endA, endB);
|
|
135
|
+
if (start >= end) {
|
|
136
|
+
return { valuesA: [], valuesB: [], timestamps: [] };
|
|
137
|
+
}
|
|
138
|
+
// Sample at daily intervals
|
|
139
|
+
const dayMs = 86400000;
|
|
140
|
+
const valuesA = [];
|
|
141
|
+
const valuesB = [];
|
|
142
|
+
const timestamps = [];
|
|
143
|
+
for (let t = start; t <= end; t += dayMs) {
|
|
144
|
+
const valueA = interpolateAt(pointsA, t);
|
|
145
|
+
const valueB = interpolateAt(pointsB, t - lagDays * dayMs);
|
|
146
|
+
if (valueA !== null && valueB !== null) {
|
|
147
|
+
valuesA.push(valueA);
|
|
148
|
+
valuesB.push(valueB);
|
|
149
|
+
timestamps.push(new Date(t));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { valuesA, valuesB, timestamps };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Linear interpolation at a specific timestamp
|
|
156
|
+
*/
|
|
157
|
+
function interpolateAt(points, timestamp) {
|
|
158
|
+
if (points.length === 0)
|
|
159
|
+
return null;
|
|
160
|
+
// Find surrounding points
|
|
161
|
+
let before = null;
|
|
162
|
+
let after = null;
|
|
163
|
+
for (const point of points) {
|
|
164
|
+
const t = point.timestamp.getTime();
|
|
165
|
+
if (t <= timestamp) {
|
|
166
|
+
before = point;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
after = point;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!before && !after)
|
|
174
|
+
return null;
|
|
175
|
+
if (!before)
|
|
176
|
+
return after.value;
|
|
177
|
+
if (!after)
|
|
178
|
+
return before.value;
|
|
179
|
+
// Linear interpolation
|
|
180
|
+
const t1 = before.timestamp.getTime();
|
|
181
|
+
const t2 = after.timestamp.getTime();
|
|
182
|
+
const ratio = (timestamp - t1) / (t2 - t1);
|
|
183
|
+
return before.value + ratio * (after.value - before.value);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Calculate correlation between two metrics
|
|
187
|
+
*/
|
|
188
|
+
export function calculateCorrelation(metricIdA, metricIdB, lagDays = 0) {
|
|
189
|
+
const metricA = metrics.get(metricIdA);
|
|
190
|
+
const metricB = metrics.get(metricIdB);
|
|
191
|
+
if (!metricA || !metricB)
|
|
192
|
+
return null;
|
|
193
|
+
const { valuesA, valuesB } = alignMetrics(metricA, metricB, lagDays);
|
|
194
|
+
if (valuesA.length < 10)
|
|
195
|
+
return null; // Need minimum sample size
|
|
196
|
+
const correlation = pearsonCorrelation(valuesA, valuesB);
|
|
197
|
+
const pValue = correlationSignificance(correlation, valuesA.length);
|
|
198
|
+
return {
|
|
199
|
+
metricA: metricIdA,
|
|
200
|
+
metricB: metricIdB,
|
|
201
|
+
correlation,
|
|
202
|
+
lagDays,
|
|
203
|
+
pValue,
|
|
204
|
+
sampleSize: valuesA.length,
|
|
205
|
+
direction: correlation >= 0 ? 'positive' : 'negative',
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Find all correlations for a metric
|
|
210
|
+
*/
|
|
211
|
+
export function findCorrelations(query) {
|
|
212
|
+
const results = [];
|
|
213
|
+
const minCorrelation = query.minCorrelation ?? 0.5;
|
|
214
|
+
const maxLag = query.maxLagDays ?? 30;
|
|
215
|
+
const targetMetric = metrics.get(query.metricId);
|
|
216
|
+
if (!targetMetric)
|
|
217
|
+
return results;
|
|
218
|
+
for (const [id, metric] of metrics) {
|
|
219
|
+
if (id === query.metricId)
|
|
220
|
+
continue;
|
|
221
|
+
// Check different lag values
|
|
222
|
+
for (let lag = 0; lag <= maxLag; lag++) {
|
|
223
|
+
const result = calculateCorrelation(query.metricId, id, lag);
|
|
224
|
+
if (result && Math.abs(result.correlation) >= minCorrelation && result.pValue < 0.05) {
|
|
225
|
+
results.push(result);
|
|
226
|
+
}
|
|
227
|
+
// Also check negative lag (B leads A)
|
|
228
|
+
if (lag > 0) {
|
|
229
|
+
const reverseResult = calculateCorrelation(id, query.metricId, lag);
|
|
230
|
+
if (reverseResult && Math.abs(reverseResult.correlation) >= minCorrelation && reverseResult.pValue < 0.05) {
|
|
231
|
+
// Flip the result to show from perspective of query metric
|
|
232
|
+
results.push({
|
|
233
|
+
...reverseResult,
|
|
234
|
+
metricA: query.metricId,
|
|
235
|
+
metricB: id,
|
|
236
|
+
lagDays: -lag, // Negative lag means target is lagging
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Sort by absolute correlation strength
|
|
243
|
+
results.sort((a, b) => Math.abs(b.correlation) - Math.abs(a.correlation));
|
|
244
|
+
// Deduplicate (keep strongest correlation per metric pair)
|
|
245
|
+
const seen = new Set();
|
|
246
|
+
const deduped = [];
|
|
247
|
+
for (const result of results) {
|
|
248
|
+
const key = [result.metricA, result.metricB].sort().join(':');
|
|
249
|
+
if (!seen.has(key)) {
|
|
250
|
+
seen.add(key);
|
|
251
|
+
deduped.push(result);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return deduped.slice(0, query.limit ?? 20);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Discover all significant correlations in the system
|
|
258
|
+
*/
|
|
259
|
+
export function discoverAllCorrelations(minCorrelation = 0.6, maxLagDays = 14) {
|
|
260
|
+
const allResults = [];
|
|
261
|
+
const metricList = Array.from(metrics.keys());
|
|
262
|
+
for (let i = 0; i < metricList.length; i++) {
|
|
263
|
+
for (let j = i + 1; j < metricList.length; j++) {
|
|
264
|
+
// Check contemporaneous
|
|
265
|
+
const result = calculateCorrelation(metricList[i], metricList[j], 0);
|
|
266
|
+
if (result && Math.abs(result.correlation) >= minCorrelation && result.pValue < 0.05) {
|
|
267
|
+
allResults.push(result);
|
|
268
|
+
}
|
|
269
|
+
// Check lagged relationships
|
|
270
|
+
for (let lag = 1; lag <= maxLagDays; lag++) {
|
|
271
|
+
const laggedAB = calculateCorrelation(metricList[i], metricList[j], lag);
|
|
272
|
+
if (laggedAB && Math.abs(laggedAB.correlation) >= minCorrelation && laggedAB.pValue < 0.05) {
|
|
273
|
+
allResults.push(laggedAB);
|
|
274
|
+
}
|
|
275
|
+
const laggedBA = calculateCorrelation(metricList[j], metricList[i], lag);
|
|
276
|
+
if (laggedBA && Math.abs(laggedBA.correlation) >= minCorrelation && laggedBA.pValue < 0.05) {
|
|
277
|
+
allResults.push(laggedBA);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Sort and deduplicate
|
|
283
|
+
allResults.sort((a, b) => Math.abs(b.correlation) - Math.abs(a.correlation));
|
|
284
|
+
return allResults;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Detect anomalies in a metric using z-score
|
|
288
|
+
*/
|
|
289
|
+
export function detectAnomalies(metricId, threshold = 2.5) {
|
|
290
|
+
const metric = metrics.get(metricId);
|
|
291
|
+
if (!metric || metric.points.length < 10)
|
|
292
|
+
return [];
|
|
293
|
+
const values = metric.points.map(p => p.value);
|
|
294
|
+
const avg = mean(values);
|
|
295
|
+
const std = stdDev(values);
|
|
296
|
+
if (std === 0)
|
|
297
|
+
return [];
|
|
298
|
+
const anomalies = [];
|
|
299
|
+
for (const point of metric.points) {
|
|
300
|
+
const zScore = Math.abs((point.value - avg) / std);
|
|
301
|
+
if (zScore >= threshold) {
|
|
302
|
+
anomalies.push({
|
|
303
|
+
metricId,
|
|
304
|
+
timestamp: point.timestamp,
|
|
305
|
+
value: point.value,
|
|
306
|
+
expected: avg,
|
|
307
|
+
stdDeviations: zScore,
|
|
308
|
+
severity: zScore >= 4 ? 'high' : zScore >= 3 ? 'medium' : 'low',
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return anomalies;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Detect all anomalies across all metrics
|
|
316
|
+
*/
|
|
317
|
+
export function discoverAllAnomalies(threshold = 2.5) {
|
|
318
|
+
const allAnomalies = [];
|
|
319
|
+
for (const metricId of metrics.keys()) {
|
|
320
|
+
const anomalies = detectAnomalies(metricId, threshold);
|
|
321
|
+
allAnomalies.push(...anomalies);
|
|
322
|
+
}
|
|
323
|
+
// Sort by severity and recency
|
|
324
|
+
allAnomalies.sort((a, b) => {
|
|
325
|
+
const severityOrder = { high: 3, medium: 2, low: 1 };
|
|
326
|
+
const severityDiff = severityOrder[b.severity] - severityOrder[a.severity];
|
|
327
|
+
if (severityDiff !== 0)
|
|
328
|
+
return severityDiff;
|
|
329
|
+
return b.timestamp.getTime() - a.timestamp.getTime();
|
|
330
|
+
});
|
|
331
|
+
return allAnomalies;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Detect trend in a metric using linear regression
|
|
335
|
+
*/
|
|
336
|
+
export function detectTrend(metricId, periodDays = 30) {
|
|
337
|
+
const metric = metrics.get(metricId);
|
|
338
|
+
if (!metric || metric.points.length < 5)
|
|
339
|
+
return null;
|
|
340
|
+
// Filter to period
|
|
341
|
+
const cutoff = Date.now() - periodDays * 86400000;
|
|
342
|
+
const recentPoints = metric.points.filter(p => p.timestamp.getTime() >= cutoff);
|
|
343
|
+
if (recentPoints.length < 5)
|
|
344
|
+
return null;
|
|
345
|
+
// Linear regression
|
|
346
|
+
const n = recentPoints.length;
|
|
347
|
+
const x = recentPoints.map((_, i) => i);
|
|
348
|
+
const y = recentPoints.map(p => p.value);
|
|
349
|
+
const meanX = mean(x);
|
|
350
|
+
const meanY = mean(y);
|
|
351
|
+
let numerator = 0;
|
|
352
|
+
let denominator = 0;
|
|
353
|
+
for (let i = 0; i < n; i++) {
|
|
354
|
+
numerator += (x[i] - meanX) * (y[i] - meanY);
|
|
355
|
+
denominator += (x[i] - meanX) * (x[i] - meanX);
|
|
356
|
+
}
|
|
357
|
+
const slope = denominator !== 0 ? numerator / denominator : 0;
|
|
358
|
+
const intercept = meanY - slope * meanX;
|
|
359
|
+
// Calculate R-squared
|
|
360
|
+
let ssRes = 0;
|
|
361
|
+
let ssTot = 0;
|
|
362
|
+
for (let i = 0; i < n; i++) {
|
|
363
|
+
const predicted = intercept + slope * x[i];
|
|
364
|
+
ssRes += Math.pow(y[i] - predicted, 2);
|
|
365
|
+
ssTot += Math.pow(y[i] - meanY, 2);
|
|
366
|
+
}
|
|
367
|
+
const rSquared = ssTot !== 0 ? 1 - ssRes / ssTot : 0;
|
|
368
|
+
// Calculate percent change
|
|
369
|
+
const firstValue = recentPoints[0].value;
|
|
370
|
+
const lastValue = recentPoints[recentPoints.length - 1].value;
|
|
371
|
+
const changePercent = firstValue !== 0 ? ((lastValue - firstValue) / firstValue) * 100 : 0;
|
|
372
|
+
// Determine direction (need significant slope and R²)
|
|
373
|
+
let direction = 'stable';
|
|
374
|
+
if (rSquared > 0.3 && Math.abs(changePercent) > 5) {
|
|
375
|
+
direction = slope > 0 ? 'up' : 'down';
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
metricId,
|
|
379
|
+
direction,
|
|
380
|
+
slope,
|
|
381
|
+
rSquared,
|
|
382
|
+
changePercent,
|
|
383
|
+
period: {
|
|
384
|
+
start: recentPoints[0].timestamp,
|
|
385
|
+
end: recentPoints[recentPoints.length - 1].timestamp,
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
// ─── Pattern Conversion ──────────────────────────────
|
|
390
|
+
/**
|
|
391
|
+
* Convert correlation results to Pattern format
|
|
392
|
+
*/
|
|
393
|
+
export function correlationToPattern(result) {
|
|
394
|
+
const isCausal = result.lagDays !== 0;
|
|
395
|
+
const data = {
|
|
396
|
+
type: isCausal ? 'causation' : 'correlation',
|
|
397
|
+
metricA: result.metricA,
|
|
398
|
+
metricB: result.metricB,
|
|
399
|
+
coefficient: result.correlation,
|
|
400
|
+
lagDays: result.lagDays,
|
|
401
|
+
sampleSize: result.sampleSize,
|
|
402
|
+
};
|
|
403
|
+
const metricA = metrics.get(result.metricA);
|
|
404
|
+
const metricB = metrics.get(result.metricB);
|
|
405
|
+
let summary;
|
|
406
|
+
if (isCausal) {
|
|
407
|
+
const direction = result.correlation > 0 ? 'increases' : 'decreases';
|
|
408
|
+
summary = `${metricA?.name || result.metricA} ${direction} → ${metricB?.name || result.metricB} follows ${Math.abs(result.lagDays)} days later`;
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
const direction = result.correlation > 0 ? 'move together' : 'move opposite';
|
|
412
|
+
summary = `${metricA?.name || result.metricA} and ${metricB?.name || result.metricB} ${direction} (r=${result.correlation.toFixed(2)})`;
|
|
413
|
+
}
|
|
414
|
+
return {
|
|
415
|
+
id: `corr_${result.metricA}_${result.metricB}_${result.lagDays}`,
|
|
416
|
+
type: isCausal ? 'causation' : 'correlation',
|
|
417
|
+
confidence: 1 - result.pValue,
|
|
418
|
+
significance: 1 / Math.max(result.pValue, 0.001),
|
|
419
|
+
entities: [],
|
|
420
|
+
metrics: [result.metricA, result.metricB],
|
|
421
|
+
data,
|
|
422
|
+
discoveredAt: new Date(),
|
|
423
|
+
lastValidated: new Date(),
|
|
424
|
+
validationCount: 1,
|
|
425
|
+
summary,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Convert anomaly result to Pattern format
|
|
430
|
+
*/
|
|
431
|
+
export function anomalyToPattern(result) {
|
|
432
|
+
const metric = metrics.get(result.metricId);
|
|
433
|
+
const data = {
|
|
434
|
+
type: 'anomaly',
|
|
435
|
+
metric: result.metricId,
|
|
436
|
+
value: result.value,
|
|
437
|
+
expected: result.expected,
|
|
438
|
+
stdDeviations: result.stdDeviations,
|
|
439
|
+
timestamp: result.timestamp,
|
|
440
|
+
};
|
|
441
|
+
const direction = result.value > result.expected ? 'spike' : 'drop';
|
|
442
|
+
const summary = `Unusual ${direction} in ${metric?.name || result.metricId}: ${result.value.toFixed(1)} vs expected ${result.expected.toFixed(1)}`;
|
|
443
|
+
return {
|
|
444
|
+
id: `anom_${result.metricId}_${result.timestamp.getTime()}`,
|
|
445
|
+
type: 'anomaly',
|
|
446
|
+
confidence: Math.min(result.stdDeviations / 5, 1),
|
|
447
|
+
significance: result.stdDeviations,
|
|
448
|
+
entities: [],
|
|
449
|
+
metrics: [result.metricId],
|
|
450
|
+
data,
|
|
451
|
+
discoveredAt: new Date(),
|
|
452
|
+
lastValidated: new Date(),
|
|
453
|
+
validationCount: 1,
|
|
454
|
+
summary,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Clear all metrics (for testing)
|
|
459
|
+
*/
|
|
460
|
+
export function clearMetrics() {
|
|
461
|
+
metrics.clear();
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.js","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"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"}
|