UNPKG

ziko

Version:

A versatile JavaScript library offering a rich set of Hyperscript Based UI components, advanced mathematical utilities, interactivity ,animations, client side routing and more ...

38 lines (34 loc) 1.44 kB
// Population Variance import { mean } from "../average/index.js"; export const variance = (...x) => { const n = x.length; if (n === 0) return NaN; const x_mean = mean(...x); return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / n; }; export const std = (...x) => Math.sqrt(variance(...x)); export const sample_variance = (...x) => { const n = x.length; if (n < 2) return NaN; const x_mean = mean(...x); return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / (n - 1); }; export const sample_std = (...x) => Math.sqrt(sample_variance(...x)); export const weighted_variance = (X, weights) => { const n = X.length; if (n === 0 || weights.length !== n) return NaN; const sw = weights.reduce((sum, w) => sum + w, 0); const mean = X.reduce((sum, x, i) => sum + x * weights[i], 0) / sw; return X.reduce((sum, x, i) => sum + weights[i] * (x - mean) ** 2, 0) / sw; }; export const weighted_std = (X, weights) => Math.sqrt(weighted_variance(X, weights)); export const rolling_variance = (X, windowSize) => { if (windowSize < 1 || X.length < windowSize) return []; let result = []; for (let i = 0; i <= X.length - windowSize; i++) { const w = X.slice(i, i + windowSize); result.push(sample_variance(w)); // usually sample variance for rolling } return result; }; export const rolling_std = (X, windowSize) => Math.sqrt(rolling_variance(X, windowSize));