@stvy/fund-indicators 1.0.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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/.pnpm/jstat@1.9.6/node_modules/jstat/dist/jstat.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/Utils/LinkedList.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/Utils/FixedSizeLinkedList.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/config.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/Utils/NumberFormatter.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/indicator/indicator.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/moving_averages/SMA.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/moving_averages/EMA.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/moving_averages/WMA.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/moving_averages/WEMA.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/moving_averages/MACD.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/Utils/AverageGain.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/Utils/AverageLoss.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/oscillators/RSI.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/Utils/SD.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/volatility/BollingerBands.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/moving_averages/WilderSmoothing.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/directionalmovement/MinusDM.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/directionalmovement/PlusDM.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/directionalmovement/TrueRange.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/directionalmovement/ADX.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/directionalmovement/ATR.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/momentum/ROC.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/momentum/PSAR.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/momentum/Stochastic.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/momentum/WilliamsR.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/oscillators/CCI.js", "../../node_modules/.pnpm/technicalindicators@3.1.0/node_modules/technicalindicators/lib/momentum/StochasticRSI.js", "../../src/technical.ts", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/add_to_mean.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/chunk.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/make_matrix.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/numeric_sort.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/unique_count_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/ckmeans.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sum.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/mean.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sum_nth_power_deviations.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_variance.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_standard_deviation.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/coefficient_of_variation.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/combinations.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/combinations_replacement.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/combine_means.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/combine_variances.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/max.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/min.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/equal_interval_breaks.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/extent.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/extent_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/geometric_mean.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/harmonic_mean.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/quantile_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/quickselect.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/quantile.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/interquartile_range.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/jenks_breaks.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/jenks_matrices.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/jenks.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/linear_regression.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/linear_regression_line.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/log_average.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/max_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sum_simple.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/mean_simple.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/median.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/median_absolute_deviation.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/median_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/min_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/mode_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/mode.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/mode_fast.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/permutations_heap.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/product.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/quantile_rank_sorted.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/quantile_rank.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/r_squared.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/root_mean_square.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/shuffle_in_place.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/shuffle.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_covariance.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_correlation.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_kurtosis.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_rank_correlation.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_skewness.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sample_with_replacement.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/variance.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/standard_deviation.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/subtract_from_mean.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/t_test.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/t_test_two_sample.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/wilcoxon_rank_sum.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/epsilon.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/relative_error.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/approx_equal.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/bayesian_classifier.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/bernoulli_distribution.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/binomial_distribution.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/sign.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/bisect.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/chi_squared_distribution_table.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/chi_squared_goodness_of_fit.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/cumulative_std_logistic_probability.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/standard_normal_table.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/cumulative_std_normal_probability.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/error_function.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/factorial.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/gamma.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/gammaln.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/inverse_error_function.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/euclidean_distance.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/k_means_cluster.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/kernel_density_estimation.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/logit.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/perceptron.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/permutation_test.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/poisson_distribution.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/probit.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/silhouette.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/silhouette_metric.js", "../../node_modules/.pnpm/simple-statistics@7.8.9/node_modules/simple-statistics/src/z_score.js", "../../src/risk.ts", "../../src/statistics.ts", "../../src/dca.ts", "../../src/pattern.ts"],
4
+ "sourcesContent": ["(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, <tom@math.ucla.edu>,\n // and comes from his hypergeometric test calculator at\n // <http://www.math.ucla.edu/~tom/distributions/Hypergeometric.html>.\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i<arguments.length;i++){\n var array = [1];\n matrixRows[i]= array.concat(arguments[i]);\n }\n return jStat(matrixRows);\n\n },\n\n builddxmatrix: function builddxmatrix() {\n //Paramters will be passed in as such\n //([array1,array2,...]\n var matrixRows = new Array(arguments[0].length);\n for(var i=0;i<arguments[0].length;i++){\n var array = [1]\n matrixRows[i]= array.concat(arguments[0][i]);\n }\n return jStat(matrixRows);\n\n },\n\n buildjxmatrix: function buildjxmatrix(jMat) {\n //Builds from jStat Matrix\n var pass = new Array(jMat.length)\n for(var i=0;i<jMat.length;i++){\n pass[i] = jMat[i];\n }\n return jStat.builddxmatrix(pass);\n\n },\n\n buildymatrix: function buildymatrix(array){\n return jStat(array).transpose();\n },\n\n buildjymatrix: function buildjymatrix(jMat){\n return jMat.transpose();\n },\n\n matrixmult: function matrixmult(A,B){\n var i, j, k, result, sum;\n if (A.cols() == B.rows()) {\n if(B.rows()>1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i<beta.length;i++){\n sds=Math.sqrt(compile.anova.mse * Math.abs(covar[i][i]));\n ts= Math.abs(beta[i] / sds);\n ps= jStat.ttest(ts, jMatY.length - jMatX[0].length - 1, sides);\n\n compile.stats[i]=[beta[i], sds, ts, ps];\n }\n\n compile.regress = beta;\n return compile;\n },\n\n xtranspx: function xtranspx(jMatX){\n return jStat.matrixmult(jMatX.transpose(),jMatX);\n },\n\n\n xtranspxinv: function xtranspxinv(jMatX){\n var inner = jStat.matrixmult(jMatX.transpose(),jMatX);\n var innerinv = jStat.inv(inner);\n return innerinv;\n },\n\n jMatYBar: function jMatYBar(jMatX, beta) {\n var yBar = jStat.matrixmult(jMatX, beta);\n return new jStat(yBar);\n },\n\n residuals: function residuals(jMatY, jMatYBar) {\n return jStat.matrixsubtract(jMatY, jMatYBar);\n },\n\n ssr: function ssr(jMatYBar, yAverage) {\n var ssr = 0;\n for(var i = 0; i < jMatYBar.length; i++) {\n ssr += Math.pow(jMatYBar[i] - yAverage, 2);\n }\n return ssr;\n },\n\n sse: function sse(jMatY, jMatYBar) {\n var sse = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sse += Math.pow(jMatY[i] - jMatYBar[i], 2);\n }\n return sse;\n },\n\n sst: function sst(jMatY, yAverage) {\n var sst = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sst += Math.pow(jMatY[i] - yAverage, 2);\n }\n return sst;\n },\n\n matrixsubtract: function matrixsubtract(A,B){\n var ans = new Array(A.length);\n for(var i=0;i<A.length;i++){\n ans[i] = new Array(A[i].length);\n for(var j=0;j<A[i].length;j++){\n ans[i][j]=A[i][j]-B[i][j];\n }\n }\n return jStat(ans);\n }\n});\n // Make it compatible with previous version.\n jStat.jStat = jStat;\n\n return jStat;\n});\n", "class Item {\n constructor(data, prev, next) {\n this.next = next;\n if (next)\n next.prev = this;\n this.prev = prev;\n if (prev)\n prev.next = this;\n this.data = data;\n }\n}\nexport class LinkedList {\n constructor() {\n this._length = 0;\n }\n get head() {\n return this._head && this._head.data;\n }\n get tail() {\n return this._tail && this._tail.data;\n }\n get current() {\n return this._current && this._current.data;\n }\n get length() {\n return this._length;\n }\n push(data) {\n this._tail = new Item(data, this._tail);\n if (this._length === 0) {\n this._head = this._tail;\n this._current = this._head;\n this._next = this._head;\n }\n this._length++;\n }\n pop() {\n var tail = this._tail;\n if (this._length === 0) {\n return;\n }\n this._length--;\n if (this._length === 0) {\n this._head = this._tail = this._current = this._next = undefined;\n return tail.data;\n }\n this._tail = tail.prev;\n this._tail.next = undefined;\n if (this._current === tail) {\n this._current = this._tail;\n this._next = undefined;\n }\n return tail.data;\n }\n shift() {\n var head = this._head;\n if (this._length === 0) {\n return;\n }\n this._length--;\n if (this._length === 0) {\n this._head = this._tail = this._current = this._next = undefined;\n return head.data;\n }\n this._head = this._head.next;\n if (this._current === head) {\n this._current = this._head;\n this._next = this._current.next;\n }\n return head.data;\n }\n unshift(data) {\n this._head = new Item(data, undefined, this._head);\n if (this._length === 0) {\n this._tail = this._head;\n this._next = this._head;\n }\n this._length++;\n }\n unshiftCurrent() {\n var current = this._current;\n if (current === this._head || this._length < 2) {\n return current && current.data;\n }\n // remove\n if (current === this._tail) {\n this._tail = current.prev;\n this._tail.next = undefined;\n this._current = this._tail;\n }\n else {\n current.next.prev = current.prev;\n current.prev.next = current.next;\n this._current = current.prev;\n }\n this._next = this._current.next;\n // unshift\n current.next = this._head;\n current.prev = undefined;\n this._head.prev = current;\n this._head = current;\n return current.data;\n }\n removeCurrent() {\n var current = this._current;\n if (this._length === 0) {\n return;\n }\n this._length--;\n if (this._length === 0) {\n this._head = this._tail = this._current = this._next = undefined;\n return current.data;\n }\n if (current === this._tail) {\n this._tail = current.prev;\n this._tail.next = undefined;\n this._current = this._tail;\n }\n else if (current === this._head) {\n this._head = current.next;\n this._head.prev = undefined;\n this._current = this._head;\n }\n else {\n current.next.prev = current.prev;\n current.prev.next = current.next;\n this._current = current.prev;\n }\n this._next = this._current.next;\n return current.data;\n }\n resetCursor() {\n this._current = this._next = this._head;\n return this;\n }\n next() {\n var next = this._next;\n if (next !== undefined) {\n this._next = next.next;\n this._current = next;\n return next.data;\n }\n }\n}\n", "/**\n * Created by AAravindan on 5/7/16.\n */\nimport { LinkedList } from './LinkedList';\nexport default class FixedSizeLinkedList extends LinkedList {\n constructor(size, maintainHigh, maintainLow, maintainSum) {\n super();\n this.size = size;\n this.maintainHigh = maintainHigh;\n this.maintainLow = maintainLow;\n this.maintainSum = maintainSum;\n this.totalPushed = 0;\n this.periodHigh = 0;\n this.periodLow = Infinity;\n this.periodSum = 0;\n if (!size || typeof size !== 'number') {\n throw ('Size required and should be a number.');\n }\n this._push = this.push;\n this.push = function (data) {\n this.add(data);\n this.totalPushed++;\n };\n }\n add(data) {\n if (this.length === this.size) {\n this.lastShift = this.shift();\n this._push(data);\n //TODO: FInd a better way\n if (this.maintainHigh)\n if (this.lastShift == this.periodHigh)\n this.calculatePeriodHigh();\n if (this.maintainLow)\n if (this.lastShift == this.periodLow)\n this.calculatePeriodLow();\n if (this.maintainSum) {\n this.periodSum = this.periodSum - this.lastShift;\n }\n }\n else {\n this._push(data);\n }\n //TODO: FInd a better way\n if (this.maintainHigh)\n if (this.periodHigh <= data)\n (this.periodHigh = data);\n if (this.maintainLow)\n if (this.periodLow >= data)\n (this.periodLow = data);\n if (this.maintainSum) {\n this.periodSum = this.periodSum + data;\n }\n }\n *iterator() {\n this.resetCursor();\n while (this.next()) {\n yield this.current;\n }\n }\n calculatePeriodHigh() {\n this.resetCursor();\n if (this.next())\n this.periodHigh = this.current;\n while (this.next()) {\n if (this.periodHigh <= this.current) {\n this.periodHigh = this.current;\n }\n ;\n }\n ;\n }\n calculatePeriodLow() {\n this.resetCursor();\n if (this.next())\n this.periodLow = this.current;\n while (this.next()) {\n if (this.periodLow >= this.current) {\n this.periodLow = this.current;\n }\n ;\n }\n ;\n }\n}\n", "let config = {};\nexport function setConfig(key, value) {\n config[key] = value;\n}\nexport function getConfig(key) {\n return config[key];\n}\n", "import { getConfig } from '../config';\nexport function format(v) {\n let precision = getConfig('precision');\n if (precision) {\n return parseFloat(v.toPrecision(precision));\n }\n return v;\n}\n", "import { format as nf } from '../Utils/NumberFormatter';\nexport class IndicatorInput {\n}\nexport class AllInputs {\n}\nexport class Indicator {\n constructor(input) {\n this.format = input.format || nf;\n }\n static reverseInputs(input) {\n if (input.reversedInput) {\n input.values ? input.values.reverse() : undefined;\n input.open ? input.open.reverse() : undefined;\n input.high ? input.high.reverse() : undefined;\n input.low ? input.low.reverse() : undefined;\n input.close ? input.close.reverse() : undefined;\n input.volume ? input.volume.reverse() : undefined;\n input.timestamp ? input.timestamp.reverse() : undefined;\n }\n }\n getResult() {\n return this.result;\n }\n}\n", "//STEP 1. Import Necessary indicator or rather last step\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { LinkedList } from '../Utils/LinkedList';\n//STEP 2. Create the input for the indicator, mandatory should be in the constructor\nexport class MAInput extends IndicatorInput {\n constructor(period, values) {\n super();\n this.period = period;\n this.values = values;\n }\n}\n//STEP3. Add class based syntax with export\nexport class SMA extends Indicator {\n constructor(input) {\n super(input);\n this.period = input.period;\n this.price = input.values;\n var genFn = (function* (period) {\n var list = new LinkedList();\n var sum = 0;\n var counter = 1;\n var current = yield;\n var result;\n list.push(0);\n while (true) {\n if (counter < period) {\n counter++;\n list.push(current);\n sum = sum + current;\n }\n else {\n sum = sum - list.shift() + current;\n result = ((sum) / period);\n list.push(current);\n }\n current = yield result;\n }\n });\n this.generator = genFn(this.period);\n this.generator.next();\n this.result = [];\n this.price.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value !== undefined) {\n this.result.push(this.format(result.value));\n }\n });\n }\n nextValue(price) {\n var result = this.generator.next(price).value;\n if (result != undefined)\n return this.format(result);\n }\n ;\n}\nSMA.calculate = sma;\nexport function sma(input) {\n Indicator.reverseInputs(input);\n var result = new SMA(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n//STEP 6. Run the tests\n", "import { Indicator } from '../indicator/indicator';\nimport { SMA } from './SMA';\nexport class EMA extends Indicator {\n constructor(input) {\n super(input);\n var period = input.period;\n var priceArray = input.values;\n var exponent = (2 / (period + 1));\n var sma;\n this.result = [];\n sma = new SMA({ period: period, values: [] });\n var genFn = (function* () {\n var tick = yield;\n var prevEma;\n while (true) {\n if (prevEma !== undefined && tick !== undefined) {\n prevEma = ((tick - prevEma) * exponent) + prevEma;\n tick = yield prevEma;\n }\n else {\n tick = yield;\n prevEma = sma.nextValue(tick);\n if (prevEma)\n tick = yield prevEma;\n }\n }\n });\n this.generator = genFn();\n this.generator.next();\n this.generator.next();\n priceArray.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value != undefined) {\n this.result.push(this.format(result.value));\n }\n });\n }\n nextValue(price) {\n var result = this.generator.next(price).value;\n if (result != undefined)\n return this.format(result);\n }\n ;\n}\nEMA.calculate = ema;\nexport function ema(input) {\n Indicator.reverseInputs(input);\n var result = new EMA(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n", "\"use strict\";\nimport { Indicator } from '../indicator/indicator';\nimport { LinkedList } from '../Utils/LinkedList';\nexport class WMA extends Indicator {\n constructor(input) {\n super(input);\n var period = input.period;\n var priceArray = input.values;\n this.result = [];\n this.generator = (function* () {\n let data = new LinkedList();\n let denominator = period * (period + 1) / 2;\n while (true) {\n if ((data.length) < period) {\n data.push(yield);\n }\n else {\n data.resetCursor();\n let result = 0;\n for (let i = 1; i <= period; i++) {\n result = result + (data.next() * i / (denominator));\n }\n var next = yield result;\n data.shift();\n data.push(next);\n }\n }\n })();\n this.generator.next();\n priceArray.forEach((tick, index) => {\n var result = this.generator.next(tick);\n if (result.value != undefined) {\n this.result.push(this.format(result.value));\n }\n });\n }\n //STEP 5. REMOVE GET RESULT FUNCTION\n nextValue(price) {\n var result = this.generator.next(price).value;\n if (result != undefined)\n return this.format(result);\n }\n ;\n}\nWMA.calculate = wma;\n;\nexport function wma(input) {\n Indicator.reverseInputs(input);\n var result = new WMA(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n", "import { Indicator } from '../indicator/indicator';\nimport { SMA } from './SMA';\nexport class WEMA extends Indicator {\n constructor(input) {\n super(input);\n var period = input.period;\n var priceArray = input.values;\n var exponent = 1 / period;\n var sma;\n this.result = [];\n sma = new SMA({ period: period, values: [] });\n var genFn = (function* () {\n var tick = yield;\n var prevEma;\n while (true) {\n if (prevEma !== undefined && tick !== undefined) {\n prevEma = ((tick - prevEma) * exponent) + prevEma;\n tick = yield prevEma;\n }\n else {\n tick = yield;\n prevEma = sma.nextValue(tick);\n if (prevEma !== undefined)\n tick = yield prevEma;\n }\n }\n });\n this.generator = genFn();\n this.generator.next();\n this.generator.next();\n priceArray.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value != undefined) {\n this.result.push(this.format(result.value));\n }\n });\n }\n nextValue(price) {\n var result = this.generator.next(price).value;\n if (result != undefined)\n return this.format(result);\n }\n ;\n}\nWEMA.calculate = wema;\nexport function wema(input) {\n Indicator.reverseInputs(input);\n var result = new WEMA(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n", "/**\n * Created by AAravindan on 5/4/16.\n */\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { SMA } from './SMA';\nimport { EMA } from './EMA';\nexport class MACDInput extends IndicatorInput {\n constructor(values) {\n super();\n this.values = values;\n this.SimpleMAOscillator = true;\n this.SimpleMASignal = true;\n }\n}\nexport class MACDOutput {\n}\nexport class MACD extends Indicator {\n constructor(input) {\n super(input);\n var oscillatorMAtype = input.SimpleMAOscillator ? SMA : EMA;\n var signalMAtype = input.SimpleMASignal ? SMA : EMA;\n var fastMAProducer = new oscillatorMAtype({ period: input.fastPeriod, values: [], format: (v) => { return v; } });\n var slowMAProducer = new oscillatorMAtype({ period: input.slowPeriod, values: [], format: (v) => { return v; } });\n var signalMAProducer = new signalMAtype({ period: input.signalPeriod, values: [], format: (v) => { return v; } });\n var format = this.format;\n this.result = [];\n this.generator = (function* () {\n var index = 0;\n var tick;\n var MACD, signal, histogram, fast, slow;\n while (true) {\n if (index < input.slowPeriod) {\n tick = yield;\n fast = fastMAProducer.nextValue(tick);\n slow = slowMAProducer.nextValue(tick);\n index++;\n continue;\n }\n if (fast && slow) { //Just for typescript to be happy\n MACD = fast - slow;\n signal = signalMAProducer.nextValue(MACD);\n }\n histogram = MACD - signal;\n tick = yield ({\n //fast : fast,\n //slow : slow,\n MACD: format(MACD),\n signal: signal ? format(signal) : undefined,\n histogram: isNaN(histogram) ? undefined : format(histogram)\n });\n fast = fastMAProducer.nextValue(tick);\n slow = slowMAProducer.nextValue(tick);\n }\n })();\n this.generator.next();\n input.values.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value != undefined) {\n this.result.push(result.value);\n }\n });\n }\n nextValue(price) {\n var result = this.generator.next(price).value;\n return result;\n }\n ;\n}\nMACD.calculate = macd;\nexport function macd(input) {\n Indicator.reverseInputs(input);\n var result = new MACD(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\nexport class AvgGainInput extends IndicatorInput {\n}\nexport class AverageGain extends Indicator {\n constructor(input) {\n super(input);\n let values = input.values;\n let period = input.period;\n let format = this.format;\n this.generator = (function* (period) {\n var currentValue = yield;\n var counter = 1;\n var gainSum = 0;\n var avgGain;\n var gain;\n var lastValue = currentValue;\n currentValue = yield;\n while (true) {\n gain = currentValue - lastValue;\n gain = gain > 0 ? gain : 0;\n if (gain > 0) {\n gainSum = gainSum + gain;\n }\n if (counter < period) {\n counter++;\n }\n else if (avgGain === undefined) {\n avgGain = gainSum / period;\n }\n else {\n avgGain = ((avgGain * (period - 1)) + gain) / period;\n }\n lastValue = currentValue;\n avgGain = (avgGain !== undefined) ? format(avgGain) : undefined;\n currentValue = yield avgGain;\n }\n })(period);\n this.generator.next();\n this.result = [];\n values.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value !== undefined) {\n this.result.push(result.value);\n }\n });\n }\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\nAverageGain.calculate = averagegain;\nexport function averagegain(input) {\n Indicator.reverseInputs(input);\n var result = new AverageGain(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\nexport class AvgLossInput extends IndicatorInput {\n}\nexport class AverageLoss extends Indicator {\n constructor(input) {\n super(input);\n let values = input.values;\n let period = input.period;\n let format = this.format;\n this.generator = (function* (period) {\n var currentValue = yield;\n var counter = 1;\n var lossSum = 0;\n var avgLoss;\n var loss;\n var lastValue = currentValue;\n currentValue = yield;\n while (true) {\n loss = lastValue - currentValue;\n loss = loss > 0 ? loss : 0;\n if (loss > 0) {\n lossSum = lossSum + loss;\n }\n if (counter < period) {\n counter++;\n }\n else if (avgLoss === undefined) {\n avgLoss = lossSum / period;\n }\n else {\n avgLoss = ((avgLoss * (period - 1)) + loss) / period;\n }\n lastValue = currentValue;\n avgLoss = (avgLoss !== undefined) ? format(avgLoss) : undefined;\n currentValue = yield avgLoss;\n }\n })(period);\n this.generator.next();\n this.result = [];\n values.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value !== undefined) {\n this.result.push(result.value);\n }\n });\n }\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\nAverageLoss.calculate = averageloss;\nexport function averageloss(input) {\n Indicator.reverseInputs(input);\n var result = new AverageLoss(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "/**\n * Created by AAravindan on 5/5/16.\n */\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { AverageGain } from '../Utils/AverageGain';\nimport { AverageLoss } from '../Utils/AverageLoss';\nexport class RSIInput extends IndicatorInput {\n}\nexport class RSI extends Indicator {\n constructor(input) {\n super(input);\n var period = input.period;\n var values = input.values;\n var GainProvider = new AverageGain({ period: period, values: [] });\n var LossProvider = new AverageLoss({ period: period, values: [] });\n let count = 1;\n this.generator = (function* (period) {\n var current = yield;\n var lastAvgGain, lastAvgLoss, RS, currentRSI;\n while (true) {\n lastAvgGain = GainProvider.nextValue(current);\n lastAvgLoss = LossProvider.nextValue(current);\n if ((lastAvgGain !== undefined) && (lastAvgLoss !== undefined)) {\n if (lastAvgLoss === 0) {\n currentRSI = 100;\n }\n else if (lastAvgGain === 0) {\n currentRSI = 0;\n }\n else {\n RS = lastAvgGain / lastAvgLoss;\n RS = isNaN(RS) ? 0 : RS;\n currentRSI = parseFloat((100 - (100 / (1 + RS))).toFixed(2));\n }\n }\n count++;\n current = yield currentRSI;\n }\n })(period);\n this.generator.next();\n this.result = [];\n values.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value !== undefined) {\n this.result.push(result.value);\n }\n });\n }\n ;\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\nRSI.calculate = rsi;\nexport function rsi(input) {\n Indicator.reverseInputs(input);\n var result = new RSI(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { IndicatorInput, Indicator } from '../indicator/indicator';\nimport { SMA } from '../moving_averages/SMA';\nimport LinkedList from '../Utils/FixedSizeLinkedList';\n/**\n * Created by AAravindan on 5/7/16.\n */\n\"use strict\";\nexport class SDInput extends IndicatorInput {\n}\n;\nexport class SD extends Indicator {\n constructor(input) {\n super(input);\n var period = input.period;\n var priceArray = input.values;\n var sma = new SMA({ period: period, values: [], format: (v) => { return v; } });\n this.result = [];\n this.generator = (function* () {\n var tick;\n var mean;\n var currentSet = new LinkedList(period);\n ;\n tick = yield;\n var sd;\n while (true) {\n currentSet.push(tick);\n mean = sma.nextValue(tick);\n if (mean) {\n let sum = 0;\n for (let x of currentSet.iterator()) {\n sum = sum + (Math.pow((x - mean), 2));\n }\n sd = Math.sqrt(sum / (period));\n }\n tick = yield sd;\n }\n })();\n this.generator.next();\n priceArray.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value != undefined) {\n this.result.push(this.format(result.value));\n }\n });\n }\n nextValue(price) {\n var nextResult = this.generator.next(price);\n if (nextResult.value != undefined)\n return this.format(nextResult.value);\n }\n ;\n}\nSD.calculate = sd;\nexport function sd(input) {\n Indicator.reverseInputs(input);\n var result = new SD(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "\"use strict\";\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { SMA } from '../moving_averages/SMA';\nimport { SD } from '../Utils/SD';\nexport class BollingerBandsInput extends IndicatorInput {\n}\n;\nexport class BollingerBandsOutput extends IndicatorInput {\n}\n;\nexport class BollingerBands extends Indicator {\n constructor(input) {\n super(input);\n var period = input.period;\n var priceArray = input.values;\n var stdDev = input.stdDev;\n var format = this.format;\n var sma, sd;\n this.result = [];\n sma = new SMA({ period: period, values: [], format: (v) => { return v; } });\n sd = new SD({ period: period, values: [], format: (v) => { return v; } });\n this.generator = (function* () {\n var result;\n var tick;\n var calcSMA;\n var calcsd;\n tick = yield;\n while (true) {\n calcSMA = sma.nextValue(tick);\n calcsd = sd.nextValue(tick);\n if (calcSMA) {\n let middle = format(calcSMA);\n let upper = format(calcSMA + (calcsd * stdDev));\n let lower = format(calcSMA - (calcsd * stdDev));\n let pb = format((tick - lower) / (upper - lower));\n result = {\n middle: middle,\n upper: upper,\n lower: lower,\n pb: pb\n };\n }\n tick = yield result;\n }\n })();\n this.generator.next();\n priceArray.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value != undefined) {\n this.result.push(result.value);\n }\n });\n }\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\nBollingerBands.calculate = bollingerbands;\nexport function bollingerbands(input) {\n Indicator.reverseInputs(input);\n var result = new BollingerBands(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { Indicator } from '../indicator/indicator';\nimport { LinkedList } from '../Utils/LinkedList';\n//STEP3. Add class based syntax with export\nexport class WilderSmoothing extends Indicator {\n constructor(input) {\n super(input);\n this.period = input.period;\n this.price = input.values;\n var genFn = (function* (period) {\n var list = new LinkedList();\n var sum = 0;\n var counter = 1;\n var current = yield;\n var result = 0;\n while (true) {\n if (counter < period) {\n counter++;\n sum = sum + current;\n result = undefined;\n }\n else if (counter == period) {\n counter++;\n sum = sum + current;\n result = sum;\n }\n else {\n result = result - (result / period) + current;\n }\n current = yield result;\n }\n });\n this.generator = genFn(this.period);\n this.generator.next();\n this.result = [];\n this.price.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value != undefined) {\n this.result.push(this.format(result.value));\n }\n });\n }\n nextValue(price) {\n var result = this.generator.next(price).value;\n if (result != undefined)\n return this.format(result);\n }\n ;\n}\nWilderSmoothing.calculate = wildersmoothing;\nexport function wildersmoothing(input) {\n Indicator.reverseInputs(input);\n var result = new WilderSmoothing(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n//STEP 6. Run the tests\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/8/16.\n */\n\"use strict\";\nexport class MDMInput extends IndicatorInput {\n}\n;\nexport class MDM extends Indicator {\n constructor(input) {\n super(input);\n var lows = input.low;\n var highs = input.high;\n var format = this.format;\n if (lows.length != highs.length) {\n throw ('Inputs(low,high) not of equal size');\n }\n this.result = [];\n this.generator = (function* () {\n var minusDm;\n var current = yield;\n var last;\n while (true) {\n if (last) {\n let upMove = (current.high - last.high);\n let downMove = (last.low - current.low);\n minusDm = format((downMove > upMove && downMove > 0) ? downMove : 0);\n }\n last = current;\n current = yield minusDm;\n }\n })();\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index]\n });\n if (result.value !== undefined)\n this.result.push(result.value);\n });\n }\n ;\n static calculate(input) {\n Indicator.reverseInputs(input);\n var result = new MDM(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n }\n ;\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/8/16.\n */\nexport class PDMInput extends IndicatorInput {\n}\n;\nexport class PDM extends Indicator {\n constructor(input) {\n super(input);\n var lows = input.low;\n var highs = input.high;\n var format = this.format;\n if (lows.length != highs.length) {\n throw ('Inputs(low,high) not of equal size');\n }\n this.result = [];\n this.generator = (function* () {\n var plusDm;\n var current = yield;\n var last;\n while (true) {\n if (last) {\n let upMove = (current.high - last.high);\n let downMove = (last.low - current.low);\n plusDm = format((upMove > downMove && upMove > 0) ? upMove : 0);\n }\n last = current;\n current = yield plusDm;\n }\n })();\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index]\n });\n if (result.value !== undefined)\n this.result.push(result.value);\n });\n }\n ;\n static calculate(input) {\n Indicator.reverseInputs(input);\n var result = new PDM(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n }\n ;\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/8/16.\n */\n/**\n * Created by AAravindan on 5/8/16.\n */\n\"use strict\";\nexport class TrueRangeInput extends IndicatorInput {\n}\n;\nexport class TrueRange extends Indicator {\n constructor(input) {\n super(input);\n var lows = input.low;\n var highs = input.high;\n var closes = input.close;\n var format = this.format;\n if (lows.length != highs.length) {\n throw ('Inputs(low,high) not of equal size');\n }\n this.result = [];\n this.generator = (function* () {\n var current = yield;\n var previousClose, result;\n while (true) {\n if (previousClose === undefined) {\n previousClose = current.close;\n current = yield result;\n }\n result = Math.max(current.high - current.low, isNaN(Math.abs(current.high - previousClose)) ? 0 : Math.abs(current.high - previousClose), isNaN(Math.abs(current.low - previousClose)) ? 0 : Math.abs(current.low - previousClose));\n previousClose = current.close;\n if (result != undefined) {\n result = format(result);\n }\n current = yield result;\n }\n })();\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index],\n close: closes[index]\n });\n if (result.value != undefined) {\n this.result.push(result.value);\n }\n });\n }\n ;\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\nTrueRange.calculate = truerange;\nexport function truerange(input) {\n Indicator.reverseInputs(input);\n var result = new TrueRange(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { WilderSmoothing } from '../moving_averages/WilderSmoothing';\nimport { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { MDM } from './MinusDM';\nimport { PDM } from './PlusDM';\nimport { TrueRange } from './TrueRange';\nimport { WEMA } from '../moving_averages/WEMA';\nexport class ADXInput extends IndicatorInput {\n}\n;\nexport class ADXOutput extends IndicatorInput {\n}\n;\nexport class ADX extends Indicator {\n constructor(input) {\n super(input);\n var lows = input.low;\n var highs = input.high;\n var closes = input.close;\n var period = input.period;\n var format = this.format;\n var plusDM = new PDM({\n high: [],\n low: []\n });\n var minusDM = new MDM({\n high: [],\n low: []\n });\n var emaPDM = new WilderSmoothing({ period: period, values: [], format: (v) => { return v; } });\n var emaMDM = new WilderSmoothing({ period: period, values: [], format: (v) => { return v; } });\n var emaTR = new WilderSmoothing({ period: period, values: [], format: (v) => { return v; } });\n var emaDX = new WEMA({ period: period, values: [], format: (v) => { return v; } });\n var tr = new TrueRange({\n low: [],\n high: [],\n close: [],\n });\n if (!((lows.length === highs.length) && (highs.length === closes.length))) {\n throw ('Inputs(low,high, close) not of equal size');\n }\n this.result = [];\n ADXOutput;\n this.generator = (function* () {\n var tick = yield;\n var index = 0;\n var lastATR, lastAPDM, lastAMDM, lastPDI, lastMDI, lastDX, smoothedDX;\n lastATR = 0;\n lastAPDM = 0;\n lastAMDM = 0;\n while (true) {\n let calcTr = tr.nextValue(tick);\n let calcPDM = plusDM.nextValue(tick);\n let calcMDM = minusDM.nextValue(tick);\n if (calcTr === undefined) {\n tick = yield;\n continue;\n }\n let lastATR = emaTR.nextValue(calcTr);\n let lastAPDM = emaPDM.nextValue(calcPDM);\n let lastAMDM = emaMDM.nextValue(calcMDM);\n if ((lastATR != undefined) && (lastAPDM != undefined) && (lastAMDM != undefined)) {\n lastPDI = (lastAPDM) * 100 / lastATR;\n lastMDI = (lastAMDM) * 100 / lastATR;\n let diDiff = Math.abs(lastPDI - lastMDI);\n let diSum = (lastPDI + lastMDI);\n lastDX = (diDiff / diSum) * 100;\n smoothedDX = emaDX.nextValue(lastDX);\n // console.log(tick.high.toFixed(2), tick.low.toFixed(2), tick.close.toFixed(2) , calcTr.toFixed(2), calcPDM.toFixed(2), calcMDM.toFixed(2), lastATR.toFixed(2), lastAPDM.toFixed(2), lastAMDM.toFixed(2), lastPDI.toFixed(2), lastMDI.toFixed(2), diDiff.toFixed(2), diSum.toFixed(2), lastDX.toFixed(2));\n }\n tick = yield { adx: smoothedDX, pdi: lastPDI, mdi: lastMDI };\n }\n })();\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index],\n close: closes[index]\n });\n if (result.value != undefined && result.value.adx != undefined) {\n this.result.push({ adx: format(result.value.adx), pdi: format(result.value.pdi), mdi: format(result.value.mdi) });\n }\n });\n }\n ;\n ;\n nextValue(price) {\n let result = this.generator.next(price).value;\n if (result != undefined && result.adx != undefined) {\n return { adx: this.format(result.adx), pdi: this.format(result.pdi), mdi: this.format(result.mdi) };\n }\n }\n ;\n}\nADX.calculate = adx;\nexport function adx(input) {\n Indicator.reverseInputs(input);\n var result = new ADX(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/8/16.\n */\n\"use strict\";\nimport { WEMA } from '../moving_averages/WEMA';\nimport { TrueRange } from './TrueRange';\nexport class ATRInput extends IndicatorInput {\n}\n;\nexport class ATR extends Indicator {\n constructor(input) {\n super(input);\n var lows = input.low;\n var highs = input.high;\n var closes = input.close;\n var period = input.period;\n var format = this.format;\n if (!((lows.length === highs.length) && (highs.length === closes.length))) {\n throw ('Inputs(low,high, close) not of equal size');\n }\n var trueRange = new TrueRange({\n low: [],\n high: [],\n close: []\n });\n var wema = new WEMA({ period: period, values: [], format: (v) => { return v; } });\n this.result = [];\n this.generator = (function* () {\n var tick = yield;\n var avgTrueRange, trange;\n ;\n while (true) {\n trange = trueRange.nextValue({\n low: tick.low,\n high: tick.high,\n close: tick.close\n });\n if (trange === undefined) {\n avgTrueRange = undefined;\n }\n else {\n avgTrueRange = wema.nextValue(trange);\n }\n tick = yield avgTrueRange;\n }\n })();\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index],\n close: closes[index]\n });\n if (result.value !== undefined) {\n this.result.push(format(result.value));\n }\n });\n }\n ;\n nextValue(price) {\n return this.generator.next(price).value;\n }\n ;\n}\nATR.calculate = atr;\nexport function atr(input) {\n Indicator.reverseInputs(input);\n var result = new ATR(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\nimport LinkedList from '../Utils/FixedSizeLinkedList';\nexport class ROCInput extends IndicatorInput {\n}\nexport class ROC extends Indicator {\n constructor(input) {\n super(input);\n var period = input.period;\n var priceArray = input.values;\n this.result = [];\n this.generator = (function* () {\n let index = 1;\n var pastPeriods = new LinkedList(period);\n ;\n var tick = yield;\n var roc;\n while (true) {\n pastPeriods.push(tick);\n if (index < period) {\n index++;\n }\n else {\n roc = ((tick - pastPeriods.lastShift) / (pastPeriods.lastShift)) * 100;\n }\n tick = yield roc;\n }\n })();\n this.generator.next();\n priceArray.forEach((tick) => {\n var result = this.generator.next(tick);\n if (result.value != undefined && (!isNaN(result.value))) {\n this.result.push(this.format(result.value));\n }\n });\n }\n nextValue(price) {\n var nextResult = this.generator.next(price);\n if (nextResult.value != undefined && (!isNaN(nextResult.value))) {\n return this.format(nextResult.value);\n }\n }\n ;\n}\nROC.calculate = roc;\n;\nexport function roc(input) {\n Indicator.reverseInputs(input);\n var result = new ROC(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { IndicatorInput, Indicator } from '../indicator/indicator';\n\"use strict\";\n/*\n There seems to be a few interpretations of the rules for this regarding which prices.\n I mean the english from which periods are included. The wording does seem to\n introduce some discrepancy so maybe that is why. I want to put the author's\n own description here to reassess this later.\n ----------------------------------------------------------------------------------------\n For the first day of entry the SAR is the previous Significant Point\n\n If long the SP is the lowest price reached while in the previous short trade\n If short the SP is the highest price reached while in the previous long trade\n\n If long:\n Find the difference between the highest price made while in the trade and the SAR for today.\n Multiple the difference by the AF and ADD the result to today's SAR to obtain the SAR for tomorrow.\n Use 0.02 for the first AF and increase it by 0.02 on every day that a new high for the trade is made.\n If a new high is not made continue to use the AF as last increased. Do not increase the AF above .20\n\n Never move the SAR for tomorrow ABOVE the previous day's LOW or today's LOW.\n If the SAR is calculated to be ABOVE the previous day's LOW or today's LOW then use the lower low between today and the previous day as the new SAR.\n Make the next day's calculations based on this SAR.\n\n If short:\n Find the difference between the lowest price made while in the trade and the SAR for today.\n Multiple the difference by the AF and SUBTRACT the result to today's SAR to obtain the SAR for tomorrow.\n Use 0.02 for the first AF and increase it by 0.02 on every day that a new high for the trade is made.\n If a new high is not made continue to use the AF as last increased. Do not increase the AF above .20\n\n Never move the SAR for tomorrow BELOW the previous day's HIGH or today's HIGH.\n If the SAR is calculated to be BELOW the previous day's HIGH or today's HIGH then use the higher high between today and the previous day as the new SAR. Make the next day's calculations based on this SAR.\n ----------------------------------------------------------------------------------------\n*/\nexport class PSARInput extends IndicatorInput {\n}\n;\nexport class PSAR extends Indicator {\n constructor(input) {\n super(input);\n let highs = input.high || [];\n let lows = input.low || [];\n var genFn = function* (step, max) {\n let curr, extreme, sar, furthest;\n let up = true;\n let accel = step;\n let prev = yield;\n while (true) {\n if (curr) {\n sar = sar + accel * (extreme - sar);\n if (up) {\n sar = Math.min(sar, furthest.low, prev.low);\n if (curr.high > extreme) {\n extreme = curr.high;\n accel = Math.min(accel + step, max);\n }\n ;\n }\n else {\n sar = Math.max(sar, furthest.high, prev.high);\n if (curr.low < extreme) {\n extreme = curr.low;\n accel = Math.min(accel + step, max);\n }\n }\n if ((up && curr.low < sar) || (!up && curr.high > sar)) {\n accel = step;\n sar = extreme;\n up = !up;\n extreme = !up ? curr.low : curr.high;\n }\n }\n else {\n // Randomly setup start values? What is the trend on first tick??\n sar = prev.low;\n extreme = prev.high;\n }\n furthest = prev;\n if (curr)\n prev = curr;\n curr = yield sar;\n }\n };\n this.result = [];\n this.generator = genFn(input.step, input.max);\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index],\n });\n if (result.value !== undefined) {\n this.result.push(result.value);\n }\n });\n }\n ;\n nextValue(input) {\n let nextResult = this.generator.next(input);\n if (nextResult.value !== undefined)\n return nextResult.value;\n }\n ;\n}\nPSAR.calculate = psar;\nexport function psar(input) {\n Indicator.reverseInputs(input);\n var result = new PSAR(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { IndicatorInput, Indicator } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/10/16.\n */\n\"use strict\";\nimport LinkedList from '../Utils/FixedSizeLinkedList';\nimport { SMA } from '../moving_averages/SMA';\nexport class StochasticInput extends IndicatorInput {\n}\n;\nexport class StochasticOutput {\n}\n;\nexport class Stochastic extends Indicator {\n constructor(input) {\n super(input);\n let lows = input.low;\n let highs = input.high;\n let closes = input.close;\n let period = input.period;\n let signalPeriod = input.signalPeriod;\n let format = this.format;\n if (!((lows.length === highs.length) && (highs.length === closes.length))) {\n throw ('Inputs(low,high, close) not of equal size');\n }\n this.result = [];\n //%K = (Current Close - Lowest Low)/(Highest High - Lowest Low) * 100\n //%D = 3-day SMA of %K\n //\n //Lowest Low = lowest low for the look-back period\n //Highest High = highest high for the look-back period\n //%K is multiplied by 100 to move the decimal point two places\n this.generator = (function* () {\n let index = 1;\n let pastHighPeriods = new LinkedList(period, true, false);\n let pastLowPeriods = new LinkedList(period, false, true);\n let dSma = new SMA({\n period: signalPeriod,\n values: [],\n format: (v) => { return v; }\n });\n let k, d;\n var tick = yield;\n while (true) {\n pastHighPeriods.push(tick.high);\n pastLowPeriods.push(tick.low);\n if (index < period) {\n index++;\n tick = yield;\n continue;\n }\n let periodLow = pastLowPeriods.periodLow;\n k = (tick.close - periodLow) / (pastHighPeriods.periodHigh - periodLow) * 100;\n k = isNaN(k) ? 0 : k; //This happens when the close, high and low are same for the entire period; Bug fix for \n d = dSma.nextValue(k);\n tick = yield {\n k: format(k),\n d: (d !== undefined) ? format(d) : undefined\n };\n }\n })();\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index],\n close: closes[index]\n });\n if (result.value !== undefined) {\n this.result.push(result.value);\n }\n });\n }\n ;\n nextValue(input) {\n let nextResult = this.generator.next(input);\n if (nextResult.value !== undefined)\n return nextResult.value;\n }\n ;\n}\nStochastic.calculate = stochastic;\nexport function stochastic(input) {\n Indicator.reverseInputs(input);\n var result = new Stochastic(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { IndicatorInput, Indicator } from '../indicator/indicator';\nimport LinkedList from '../Utils/FixedSizeLinkedList';\nexport class WilliamsRInput extends IndicatorInput {\n}\n;\nexport class WilliamsR extends Indicator {\n constructor(input) {\n super(input);\n let lows = input.low;\n let highs = input.high;\n let closes = input.close;\n let period = input.period;\n let format = this.format;\n if (!((lows.length === highs.length) && (highs.length === closes.length))) {\n throw ('Inputs(low,high, close) not of equal size');\n }\n this.result = [];\n //%R = (Highest High - Close)/(Highest High - Lowest Low) * -100\n //Lowest Low = lowest low for the look-back period\n //Highest High = highest high for the look-back period\n //%R is multiplied by -100 correct the inversion and move the decimal.\n this.generator = (function* () {\n let index = 1;\n let pastHighPeriods = new LinkedList(period, true, false);\n let pastLowPeriods = new LinkedList(period, false, true);\n let periodLow;\n let periodHigh;\n var tick = yield;\n let williamsR;\n while (true) {\n pastHighPeriods.push(tick.high);\n pastLowPeriods.push(tick.low);\n if (index < period) {\n index++;\n tick = yield;\n continue;\n }\n periodLow = pastLowPeriods.periodLow;\n periodHigh = pastHighPeriods.periodHigh;\n williamsR = format((periodHigh - tick.close) / (periodHigh - periodLow) * -100);\n tick = yield williamsR;\n }\n })();\n this.generator.next();\n lows.forEach((low, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index],\n close: closes[index]\n });\n if (result.value !== undefined) {\n this.result.push(result.value);\n }\n });\n }\n ;\n nextValue(price) {\n var nextResult = this.generator.next(price);\n if (nextResult.value != undefined)\n return this.format(nextResult.value);\n }\n ;\n}\nWilliamsR.calculate = williamsr;\nexport function williamsr(input) {\n Indicator.reverseInputs(input);\n var result = new WilliamsR(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { Indicator, IndicatorInput } from '../indicator/indicator';\nimport { SMA } from '../moving_averages/SMA';\nimport LinkedList from '../Utils/FixedSizeLinkedList';\nexport class CCIInput extends IndicatorInput {\n}\n;\nexport class CCI extends Indicator {\n constructor(input) {\n super(input);\n var lows = input.low;\n var highs = input.high;\n var closes = input.close;\n var period = input.period;\n var format = this.format;\n let constant = .015;\n var currentTpSet = new LinkedList(period);\n ;\n var tpSMACalculator = new SMA({ period: period, values: [], format: (v) => { return v; } });\n if (!((lows.length === highs.length) && (highs.length === closes.length))) {\n throw ('Inputs(low,high, close) not of equal size');\n }\n this.result = [];\n this.generator = (function* () {\n var tick = yield;\n while (true) {\n let tp = (tick.high + tick.low + tick.close) / 3;\n currentTpSet.push(tp);\n let smaTp = tpSMACalculator.nextValue(tp);\n let meanDeviation = null;\n let cci;\n let sum = 0;\n if (smaTp != undefined) {\n //First, subtract the most recent 20-period average of the typical price from each period's typical price. \n //Second, take the absolute values of these numbers.\n //Third,sum the absolute values. \n for (let x of currentTpSet.iterator()) {\n sum = sum + (Math.abs(x - smaTp));\n }\n //Fourth, divide by the total number of periods (20). \n meanDeviation = sum / period;\n cci = (tp - smaTp) / (constant * meanDeviation);\n }\n tick = yield cci;\n }\n })();\n this.generator.next();\n lows.forEach((tick, index) => {\n var result = this.generator.next({\n high: highs[index],\n low: lows[index],\n close: closes[index]\n });\n if (result.value != undefined) {\n this.result.push(result.value);\n }\n });\n }\n ;\n ;\n nextValue(price) {\n let result = this.generator.next(price).value;\n if (result != undefined) {\n return result;\n }\n }\n ;\n}\nCCI.calculate = cci;\nexport function cci(input) {\n Indicator.reverseInputs(input);\n var result = new CCI(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "import { IndicatorInput, Indicator } from '../indicator/indicator';\n/**\n * Created by AAravindan on 5/10/16.\n */\n\"use strict\";\nimport { SMA } from '../moving_averages/SMA';\nimport { RSI } from '../oscillators/RSI';\nimport { Stochastic } from '../momentum/Stochastic';\nexport class StochasticRsiInput extends IndicatorInput {\n}\n;\nexport class StochasticRSIOutput {\n}\n;\nexport class StochasticRSI extends Indicator {\n constructor(input) {\n super(input);\n let closes = input.values;\n let rsiPeriod = input.rsiPeriod;\n let stochasticPeriod = input.stochasticPeriod;\n let kPeriod = input.kPeriod;\n let dPeriod = input.dPeriod;\n let format = this.format;\n this.result = [];\n this.generator = (function* () {\n let index = 1;\n let rsi = new RSI({ period: rsiPeriod, values: [] });\n let stochastic = new Stochastic({ period: stochasticPeriod, high: [], low: [], close: [], signalPeriod: kPeriod });\n let dSma = new SMA({\n period: dPeriod,\n values: [],\n format: (v) => { return v; }\n });\n let lastRSI, stochasticRSI, d, result;\n var tick = yield;\n while (true) {\n lastRSI = rsi.nextValue(tick);\n if (lastRSI !== undefined) {\n var stochasticInput = { high: lastRSI, low: lastRSI, close: lastRSI };\n stochasticRSI = stochastic.nextValue(stochasticInput);\n if (stochasticRSI !== undefined && stochasticRSI.d !== undefined) {\n d = dSma.nextValue(stochasticRSI.d);\n if (d !== undefined)\n result = {\n stochRSI: stochasticRSI.k,\n k: stochasticRSI.d,\n d: d\n };\n }\n }\n tick = yield result;\n }\n })();\n this.generator.next();\n closes.forEach((tick, index) => {\n var result = this.generator.next(tick);\n if (result.value !== undefined) {\n this.result.push(result.value);\n }\n });\n }\n ;\n nextValue(input) {\n let nextResult = this.generator.next(input);\n if (nextResult.value !== undefined)\n return nextResult.value;\n }\n ;\n}\nStochasticRSI.calculate = stochasticrsi;\nexport function stochasticrsi(input) {\n Indicator.reverseInputs(input);\n var result = new StochasticRSI(input).result;\n if (input.reversedInput) {\n result.reverse();\n }\n Indicator.reverseInputs(input);\n return result;\n}\n;\n", "/**\n * \u6280\u672F\u6307\u6807\u6A21\u5757 - \u8D8B\u52BF\u3001\u52A8\u91CF\u3001\u9707\u8361\u3001\u901A\u9053\u7C7B\u6307\u6807\n * \u57FA\u4E8E technicalindicators \u5E93\uFF0C\u6240\u6709\u51FD\u6570\u63A5\u6536\u51C0\u503C\u5E8F\u5217\u4F5C\u4E3A\u8F93\u5165\n */\n\nimport {\n SMA as TI_SMA,\n EMA as TI_EMA,\n WMA as TI_WMA,\n MACD as TI_MACD,\n RSI as TI_RSI,\n Stochastic as TI_Stochastic,\n BollingerBands as TI_BB,\n ADX as TI_ADX,\n CCI as TI_CCI,\n ROC as TI_ROC,\n WilliamsR as TI_WR,\n StochasticRSI as TI_StochRSI,\n ATR as TI_ATR,\n PSAR as TI_SAR,\n VWAP as TI_VWAP,\n} from 'technicalindicators';\n\nimport {\n NavSeries,\n MAResult,\n MACDResult,\n BollingerResult,\n ChannelResult,\n RSIResult,\n KDJResult,\n ADXResult,\n SARResult,\n MACrossSignal,\n MAAlignmentResult,\n} from './types';\n\n// ============================================================\n// \u8F85\u52A9\u51FD\u6570\n// ============================================================\n\n/** \u5C06\u51C0\u503C\u5E8F\u5217\u8F6C\u4E3A high/low/close \u683C\u5F0F\uFF08\u57FA\u91D1\u51C0\u503C\u6CA1\u6709\u65E5\u5185\u9AD8\u4F4E\uFF0C\u4E09\u8005\u76F8\u540C\uFF09 */\nfunction navToHLC(nav: NavSeries) {\n return nav.map((v) => ({ high: v, low: v, close: v }));\n}\n\n/** \u5BF9\u9F50\u6570\u7EC4\u957F\u5EA6\uFF1A\u524D\u8865 null \u4F7F\u5176\u4E0E\u8F93\u5165\u7B49\u957F */\nfunction padLeft(arr: (number | undefined)[], totalLen: number): (number | null)[] {\n const padLen = totalLen - arr.length;\n const result: (number | null)[] = new Array(padLen).fill(null);\n for (const v of arr) {\n result.push(v ?? null);\n }\n return result;\n}\n\n/** \u5B89\u5168\u53D6\u6570\u7EC4\u6700\u540E\u4E00\u4E2A\u975E null \u503C */\nfunction lastNonNull(arr: (number | null | undefined)[]): number | null {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (arr[i] != null) return arr[i]!;\n }\n return null;\n}\n\n// ============================================================\n// \u79FB\u52A8\u5747\u7EBF\n// ============================================================\n\n/** \u7B80\u5355\u79FB\u52A8\u5E73\u5747\u7EBF (SMA) */\nexport function sma(nav: NavSeries, period: number): MAResult {\n const raw = TI_SMA.calculate({ values: nav, period });\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n/** \u6307\u6570\u79FB\u52A8\u5E73\u5747\u7EBF (EMA) */\nexport function ema(nav: NavSeries, period: number): MAResult {\n const raw = TI_EMA.calculate({ values: nav, period });\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period, type: 'EMA' };\n}\n\n/** \u52A0\u6743\u79FB\u52A8\u5E73\u5747\u7EBF (WMA) */\nexport function wma(nav: NavSeries, period: number): MAResult {\n const raw = TI_WMA.calculate({ values: nav, period });\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period, type: 'WMA' };\n}\n\n/** \u53CC\u91CD\u6307\u6570\u79FB\u52A8\u5E73\u5747\u7EBF (DEMA) */\nexport function dema(nav: NavSeries, period: number): MAResult {\n // DEMA = 2*EMA - EMA(EMA)\n const ema1 = TI_EMA.calculate({ values: nav, period });\n const ema1Padded = padLeft(ema1, nav.length);\n\n // \u53D6\u975Enull\u90E8\u5206\u505A\u7B2C\u4E8C\u6B21EMA\n const ema1Values = ema1.filter((v): v is number => v !== undefined);\n const ema2 = TI_EMA.calculate({ values: ema1Values, period });\n\n const values: (number | null)[] = new Array(nav.length).fill(null);\n const offset = nav.length - ema1Values.length;\n for (let i = 0; i < ema2.length; i++) {\n const idx = offset + i;\n if (idx < nav.length && ema2[i] != null && ema1Padded[idx] != null) {\n values[idx] = 2 * ema1Padded[idx]! - ema2[i]!;\n }\n }\n return { values, current: lastNonNull(values), period, type: 'DEMA' };\n}\n\n/** \u4E09\u91CD\u6307\u6570\u79FB\u52A8\u5E73\u5747\u7EBF (TEMA) */\nexport function tema(nav: NavSeries, period: number): MAResult {\n const ema1Raw = TI_EMA.calculate({ values: nav, period });\n const ema1Vals = ema1Raw.filter((v): v is number => v !== undefined);\n const ema2Raw = TI_EMA.calculate({ values: ema1Vals, period });\n const ema2Vals = ema2Raw.filter((v): v is number => v !== undefined);\n const ema3Raw = TI_EMA.calculate({ values: ema2Vals, period });\n\n // \u5C06\u4E09\u5C42 EMA \u5168\u90E8\u586B\u5145\u5230\u4E0E nav \u7B49\u957F\n const ema1Padded = padLeft(ema1Raw, nav.length);\n // ema2 \u7684\u8D77\u59CB\u4F4D\u7F6E\u76F8\u5BF9 ema1 \u53C8\u504F\u79FB\u4E86\u4E00\u622A\n const offset2 = nav.length - ema1Vals.length;\n const ema2Full: (number | null)[] = new Array(nav.length).fill(null);\n for (let i = 0; i < ema2Raw.length; i++) {\n const idx = offset2 + i;\n if (idx < nav.length) ema2Full[idx] = ema2Raw[i] ?? null;\n }\n // ema3 \u7684\u8D77\u59CB\u4F4D\u7F6E\u76F8\u5BF9 ema2 \u53C8\u504F\u79FB\u4E86\u4E00\u622A\n const offset3 = offset2 + (ema1Vals.length - ema2Vals.length);\n const ema3Full: (number | null)[] = new Array(nav.length).fill(null);\n for (let i = 0; i < ema3Raw.length; i++) {\n const idx = offset3 + i;\n if (idx < nav.length) ema3Full[idx] = ema3Raw[i] ?? null;\n }\n\n // TEMA = 3*EMA1 - 3*EMA2 + EMA3\n const values: (number | null)[] = new Array(nav.length).fill(null);\n for (let i = 0; i < nav.length; i++) {\n const v1 = ema1Padded[i];\n const v2 = ema2Full[i];\n const v3 = ema3Full[i];\n if (v1 != null && v2 != null && v3 != null) {\n values[i] = 3 * v1 - 3 * v2 + v3;\n }\n }\n return { values, current: lastNonNull(values), period, type: 'TEMA' };\n}\n\n/** \u8003\u592B\u66FC\u81EA\u9002\u5E94\u5747\u7EBF (KAMA) - \u624B\u52A8\u5B9E\u73B0 */\nexport function kama(nav: NavSeries, period: number = 10, fast: number = 2, slow: number = 30): MAResult {\n const fastSC = 2 / (fast + 1);\n const slowSC = 2 / (slow + 1);\n const values: (number | null)[] = new Array(nav.length).fill(null);\n\n if (nav.length <= period) return { values, current: null, period, type: 'KAMA' };\n\n values[period] = nav[period];\n\n for (let i = period + 1; i < nav.length; i++) {\n // direction: \u5F53\u524D\u503C\u4E0Eperiod\u524D\u7684\u503C\u7684\u7EDD\u5BF9\u5DEE\n const direction = Math.abs(nav[i] - nav[i - period]);\n // volatility: period\u5185\u76F8\u90BB\u5DEE\u503C\u7EDD\u5BF9\u503C\u4E4B\u548C\n let volatility = 0;\n for (let j = i - period + 1; j <= i; j++) {\n volatility += Math.abs(nav[j] - nav[j - 1]);\n }\n // efficiency ratio\n const er = volatility === 0 ? 0 : direction / volatility;\n // smoothing constant\n const sc = Math.pow(er * (fastSC - slowSC) + slowSC, 2);\n // KAMA\n const prevKama = values[i - 1]!;\n values[i] = prevKama + sc * (nav[i] - prevKama);\n }\n\n return { values, current: lastNonNull(values), period, type: 'KAMA' };\n}\n\n// ============================================================\n// MACD\n// ============================================================\n\n/**\n * MACD \u6307\u6807\uFF08DIF / DEA / \u67F1\u72B6\u7EBF\uFF09\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param fastPeriod \u5FEB\u7EBF\u5468\u671F\uFF08\u9ED8\u8BA412\uFF09\n * @param slowPeriod \u6162\u7EBF\u5468\u671F\uFF08\u9ED8\u8BA426\uFF09\n * @param signalPeriod \u4FE1\u53F7\u7EBF\u5468\u671F\uFF08\u9ED8\u8BA49\uFF09\n */\nexport function macd(\n nav: NavSeries,\n fastPeriod: number = 12,\n slowPeriod: number = 26,\n signalPeriod: number = 9\n): MACDResult {\n const raw = TI_MACD.calculate({\n values: nav,\n fastPeriod,\n slowPeriod,\n signalPeriod,\n SimpleMAOscillator: false,\n SimpleMASignal: false,\n });\n\n const dif = padLeft(raw.map((r) => r.MACD), nav.length);\n const dea = padLeft(raw.map((r) => r.signal), nav.length);\n const histogram = padLeft(raw.map((r) => r.histogram), nav.length);\n\n return {\n dif,\n dea,\n histogram,\n currentDIF: lastNonNull(dif),\n currentDEA: lastNonNull(dea),\n currentHistogram: lastNonNull(histogram),\n };\n}\n\n// ============================================================\n// RSI\n// ============================================================\n\n/** RSI\uFF08\u76F8\u5BF9\u5F3A\u5F31\u6307\u6807\uFF09 */\nexport function rsi(nav: NavSeries, period: number = 14): RSIResult {\n const raw = TI_RSI.calculate({ values: nav, period });\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period };\n}\n\n// ============================================================\n// KDJ\uFF08\u968F\u673A\u6307\u6807\uFF0C\u542B J \u503C\uFF09\n// ============================================================\n\n/**\n * KDJ \u6307\u6807\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param kPeriod K \u5468\u671F\uFF08\u9ED8\u8BA49\uFF09\n * @param kSmooth K \u5E73\u6ED1\u56E0\u5B50\uFF08\u9ED8\u8BA43\uFF09\n * @param dPeriod D \u5468\u671F\uFF08\u9ED8\u8BA43\uFF09\n */\nexport function kdj(nav: NavSeries, kPeriod: number = 9, kSmooth: number = 3, dPeriod: number = 3): KDJResult {\n const hlc = navToHLC(nav);\n const raw = TI_Stochastic.calculate({\n high: hlc.map((h) => h.high),\n low: hlc.map((h) => h.low),\n close: hlc.map((h) => h.close),\n period: kPeriod,\n signalPeriod: dPeriod,\n });\n\n const kArr = padLeft(raw.map((r) => r.k), nav.length);\n const dArr = padLeft(raw.map((r) => r.d), nav.length);\n\n // J = 3K - 2D\n const jArr: (number | null)[] = kArr.map((kVal, i) => {\n const dVal = dArr[i];\n if (kVal != null && dVal != null) return 3 * kVal - 2 * dVal;\n return null;\n });\n\n return {\n k: kArr,\n d: dArr,\n j: jArr,\n currentK: lastNonNull(kArr),\n currentD: lastNonNull(dArr),\n currentJ: lastNonNull(jArr),\n };\n}\n\n// ============================================================\n// \u5E03\u6797\u5E26\n// ============================================================\n\n/**\n * \u5E03\u6797\u5E26 (Bollinger Bands)\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param period \u5747\u7EBF\u5468\u671F\uFF08\u9ED8\u8BA420\uFF09\n * @param stdDev \u6807\u51C6\u5DEE\u500D\u6570\uFF08\u9ED8\u8BA42\uFF09\n */\nexport function bollingerBands(nav: NavSeries, period: number = 20, stdDev: number = 2): BollingerResult {\n const raw = TI_BB.calculate({ values: nav, period, stdDev });\n\n const middle = padLeft(raw.map((r) => r.middle), nav.length);\n const upper = padLeft(raw.map((r) => r.upper), nav.length);\n const lower = padLeft(raw.map((r) => r.lower), nav.length);\n\n // \u8BA1\u7B97\u5E26\u5BBD\u548C %B\n const bandwidth: (number | null)[] = [];\n const percentB: (number | null)[] = [];\n\n for (let i = 0; i < nav.length; i++) {\n const m = middle[i];\n const u = upper[i];\n const l = lower[i];\n if (m != null && u != null && l != null) {\n bandwidth.push((u - l) / m);\n percentB.push(u === l ? 0.5 : (nav[i] - l) / (u - l));\n } else {\n bandwidth.push(null);\n percentB.push(null);\n }\n }\n\n return { middle, upper, lower, bandwidth, percentB };\n}\n\n// ============================================================\n// \u5510\u5947\u5B89\u901A\u9053 (Donchian Channel)\n// ============================================================\n\n/**\n * \u5510\u5947\u5B89\u901A\u9053\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param period \u56DE\u770B\u5468\u671F\uFF08\u9ED8\u8BA420\uFF09\n */\nexport function donchianChannel(nav: NavSeries, period: number = 20): ChannelResult {\n const upper: (number | null)[] = [];\n const lower: (number | null)[] = [];\n const middle: (number | null)[] = [];\n\n for (let i = 0; i < nav.length; i++) {\n if (i < period - 1) {\n upper.push(null);\n lower.push(null);\n middle.push(null);\n continue;\n }\n const slice = nav.slice(i - period + 1, i + 1);\n const high = Math.max(...slice);\n const low = Math.min(...slice);\n upper.push(high);\n lower.push(low);\n middle.push((high + low) / 2);\n }\n\n return { upper, lower, middle };\n}\n\n// ============================================================\n// \u80AF\u7279\u7EB3\u901A\u9053 (Keltner Channel)\n// ============================================================\n\n/**\n * \u80AF\u7279\u7EB3\u901A\u9053\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param emaPeriod EMA \u5468\u671F\uFF08\u9ED8\u8BA420\uFF09\n * @param atrPeriod ATR \u5468\u671F\uFF08\u9ED8\u8BA410\uFF09\n * @param multiplier ATR \u500D\u6570\uFF08\u9ED8\u8BA42\uFF09\n */\nexport function keltnerChannel(\n nav: NavSeries,\n emaPeriod: number = 20,\n atrPeriod: number = 10,\n multiplier: number = 2\n): ChannelResult {\n const emaResult = ema(nav, emaPeriod);\n const atrResult = atr(nav, atrPeriod);\n\n const upper: (number | null)[] = [];\n const lower: (number | null)[] = [];\n\n for (let i = 0; i < nav.length; i++) {\n const e = emaResult.values[i];\n const a = atrResult.values[i];\n if (e != null && a != null) {\n upper.push(e + multiplier * a);\n lower.push(e - multiplier * a);\n } else {\n upper.push(null);\n lower.push(null);\n }\n }\n\n return { upper, lower, middle: emaResult.values };\n}\n\n// ============================================================\n// ADX\uFF08\u5E73\u5747\u8D8B\u5411\u6307\u6807\uFF09\n// ============================================================\n\n/** ADX + DI */\nexport function adx(nav: NavSeries, period: number = 14): ADXResult {\n const hlc = navToHLC(nav);\n const raw = TI_ADX.calculate({\n high: hlc.map((h) => h.high),\n low: hlc.map((h) => h.low),\n close: hlc.map((h) => h.close),\n period,\n });\n\n const adxArr = padLeft(raw.map((r) => r.adx), nav.length);\n const plusDI = padLeft(raw.map((r) => r.pdi), nav.length);\n const minusDI = padLeft(raw.map((r) => r.mdi), nav.length);\n\n return {\n adx: adxArr,\n plusDI,\n minusDI,\n currentADX: lastNonNull(adxArr),\n };\n}\n\n// ============================================================\n// ATR\uFF08\u5E73\u5747\u771F\u5B9E\u6CE2\u5E45 - \u57FA\u4E8E\u51C0\u503C\u8FD1\u4F3C\uFF09\n// ============================================================\n\n/** ATR \u8FD1\u4F3C\u503C\uFF08\u57FA\u91D1\u51C0\u503C\u65E0\u65E5\u5185\u9AD8\u4F4E\uFF0C\u7528\u65E5\u6DA8\u8DCC\u5E45\u7EDD\u5BF9\u503C\u8FD1\u4F3C\uFF09 */\nexport function atr(nav: NavSeries, period: number = 14): MAResult {\n const hlc = navToHLC(nav);\n const raw = TI_ATR.calculate({\n high: hlc.map((h) => h.high),\n low: hlc.map((h) => h.low),\n close: hlc.map((h) => h.close),\n period,\n });\n\n // \u7531\u4E8E\u51C0\u503C\u65E0\u65E5\u5185\u6CE2\u52A8\uFF0CATR \u9000\u5316\u4E3A EMA(|\u0394P|)\n // \u8FD9\u91CC\u76F4\u63A5\u7528\u6280\u672F\u5E93\u8F93\u51FA\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// CCI\uFF08\u5546\u54C1\u901A\u9053\u6307\u6570\uFF09\n// ============================================================\n\n/** CCI */\nexport function cci(nav: NavSeries, period: number = 20): MAResult {\n const hlc = navToHLC(nav);\n const raw = TI_CCI.calculate({\n high: hlc.map((h) => h.high),\n low: hlc.map((h) => h.low),\n close: hlc.map((h) => h.close),\n period,\n });\n\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// ROC\uFF08\u53D8\u52A8\u7387\uFF09\n// ============================================================\n\n/** ROC */\nexport function roc(nav: NavSeries, period: number = 12): MAResult {\n const raw = TI_ROC.calculate({ values: nav, period });\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// \u52A8\u91CF\u6307\u6807 (Momentum)\n// ============================================================\n\n/** \u52A8\u91CF\u6307\u6807 = \u5F53\u524D\u51C0\u503C - N\u65E5\u524D\u51C0\u503C */\nexport function momentum(nav: NavSeries, period: number = 10): MAResult {\n const values: (number | null)[] = [];\n for (let i = 0; i < nav.length; i++) {\n if (i < period) {\n values.push(null);\n } else {\n values.push(nav[i] - nav[i - period]);\n }\n }\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// Williams %R\uFF08\u5A01\u5EC9\u6307\u6807\uFF09\n// ============================================================\n\n/** Williams %R */\nexport function williamsR(nav: NavSeries, period: number = 14): MAResult {\n const hlc = navToHLC(nav);\n const raw = TI_WR.calculate({\n high: hlc.map((h) => h.high),\n low: hlc.map((h) => h.low),\n close: hlc.map((h) => h.close),\n period,\n });\n\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// Stochastic RSI\n// ============================================================\n\n/** \u968F\u673A RSI */\nexport function stochasticRSI(\n nav: NavSeries,\n rsiPeriod: number = 14,\n stochPeriod: number = 14,\n kPeriod: number = 3,\n dPeriod: number = 3\n): KDJResult {\n const raw = TI_StochRSI.calculate({\n values: nav,\n rsiPeriod,\n stochasticPeriod: stochPeriod,\n kPeriod,\n dPeriod,\n });\n\n const k = padLeft(raw.map((r) => r.k), nav.length);\n const d = padLeft(raw.map((r) => r.d), nav.length);\n const j: (number | null)[] = k.map((kVal, i) => {\n const dVal = d[i];\n return kVal != null && dVal != null ? 3 * kVal - 2 * dVal : null;\n });\n\n return { k, d, j, currentK: lastNonNull(k), currentD: lastNonNull(d), currentJ: lastNonNull(j) };\n}\n\n// ============================================================\n// SAR\uFF08\u629B\u7269\u7EBF\u8F6C\u5411\uFF09\n// ============================================================\n\n/**\n * SAR \u629B\u7269\u7EBF\u8F6C\u5411\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param step \u52A0\u901F\u56E0\u5B50\u6B65\u957F\uFF08\u9ED8\u8BA40.02\uFF09\n * @param max \u6700\u5927\u52A0\u901F\u56E0\u5B50\uFF08\u9ED8\u8BA40.2\uFF09\n */\nexport function sar(nav: NavSeries, step: number = 0.02, max: number = 0.2): SARResult {\n const hlc = navToHLC(nav);\n const raw = TI_SAR.calculate({\n high: hlc.map((h) => h.high),\n low: hlc.map((h) => h.low),\n step,\n max,\n });\n\n const values = padLeft(raw, nav.length);\n return { values, current: lastNonNull(values) };\n}\n\n// ============================================================\n// TRIX\uFF08\u4E09\u91CD\u5E73\u6ED1\u6307\u6570\uFF09\n// ============================================================\n\n/** TRIX = \u4E09\u91CD EMA \u7684\u53D8\u5316\u7387 */\nexport function trix(nav: NavSeries, period: number = 12): MAResult {\n const ema1 = TI_EMA.calculate({ values: nav, period });\n const ema1Vals = ema1.filter((v): v is number => v !== undefined);\n const ema2 = TI_EMA.calculate({ values: ema1Vals, period });\n const ema2Vals = ema2.filter((v): v is number => v !== undefined);\n const ema3 = TI_EMA.calculate({ values: ema2Vals, period });\n\n const values: (number | null)[] = new Array(nav.length).fill(null);\n const offset = nav.length - ema3.length;\n\n for (let i = 1; i < ema3.length; i++) {\n const prev = ema3[i - 1];\n const curr = ema3[i];\n if (prev != null && curr != null && prev !== 0) {\n values[offset + i] = ((curr - prev) / prev) * 100;\n }\n }\n\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// DPO\uFF08\u53BB\u8D8B\u52BF\u4EF7\u683C\u9707\u8361\u5668\uFF09\n// ============================================================\n\n/** DPO = \u51C0\u503C - N/2+1 \u65E5\u524D\u7684 SMA */\nexport function dpo(nav: NavSeries, period: number = 20): MAResult {\n const smaResult = sma(nav, period);\n const shift = Math.floor(period / 2) + 1;\n const values: (number | null)[] = [];\n\n for (let i = 0; i < nav.length; i++) {\n const smaIdx = i + shift;\n if (smaIdx < nav.length && smaResult.values[smaIdx] != null) {\n values.push(nav[i] - smaResult.values[smaIdx]!);\n } else {\n values.push(null);\n }\n }\n\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// \u5747\u7EBF\u504F\u79BB\u5EA6 (BIAS / \u4E56\u79BB\u7387)\n// ============================================================\n\n/** \u4E56\u79BB\u7387 = (\u51C0\u503C - MA) / MA * 100 */\nexport function bias(nav: NavSeries, period: number = 20): MAResult {\n const maResult = sma(nav, period);\n const values: (number | null)[] = [];\n\n for (let i = 0; i < nav.length; i++) {\n const m = maResult.values[i];\n if (m != null && m !== 0) {\n values.push(((nav[i] - m) / m) * 100);\n } else {\n values.push(null);\n }\n }\n\n return { values, current: lastNonNull(values), period, type: 'SMA' };\n}\n\n// ============================================================\n// \u51C0\u503C\u767E\u5206\u4F4D\n// ============================================================\n\n/**\n * \u51C0\u503C\u767E\u5206\u4F4D - \u5F53\u524D\u51C0\u503C\u5728\u5386\u53F2\u533A\u95F4\u4E2D\u6240\u5904\u7684\u767E\u5206\u4F4D\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param lookback \u56DE\u770B\u7A97\u53E3\uFF08\u9ED8\u8BA4\u5168\u90E8\u5386\u53F2\uFF09\n * @returns 0-100 \u7684\u767E\u5206\u4F4D\u503C\n */\nexport function navPercentile(nav: NavSeries, lookback?: number): number {\n const window = lookback ? nav.slice(-lookback) : nav;\n const current = nav[nav.length - 1];\n const sorted = [...window].sort((a, b) => a - b);\n let rank = 0;\n for (const v of sorted) {\n if (v < current) rank++;\n else if (v === current) rank += 0.5;\n }\n return (rank / sorted.length) * 100;\n}\n\n// ============================================================\n// \u5747\u7EBF\u4EA4\u53C9\u4FE1\u53F7\u68C0\u6D4B\n// ============================================================\n\n/** \u68C0\u6D4B\u77ED\u671F\u5747\u7EBF\u4E0E\u957F\u671F\u5747\u7EBF\u7684\u4EA4\u53C9\u4FE1\u53F7 */\nexport function detectCrossSignal(\n fastMA: MAResult,\n slowMA: MAResult,\n lookback: number = 5\n): MACrossSignal {\n const fVals = fastMA.values;\n const sVals = slowMA.values;\n const len = Math.min(fVals.length, sVals.length);\n\n for (let i = len - 1; i >= Math.max(1, len - lookback); i--) {\n const fCurr = fVals[i];\n const fPrev = fVals[i - 1];\n const sCurr = sVals[i];\n const sPrev = sVals[i - 1];\n if (fCurr == null || fPrev == null || sCurr == null || sPrev == null) continue;\n\n // \u91D1\u53C9\uFF1A\u5FEB\u7EBF\u4ECE\u4E0B\u65B9\u7A7F\u8D8A\u6162\u7EBF\n if (fPrev <= sPrev && fCurr > sCurr) {\n return { type: 'golden_cross', index: i, fastValue: fCurr, slowValue: sCurr };\n }\n // \u6B7B\u53C9\uFF1A\u5FEB\u7EBF\u4ECE\u4E0A\u65B9\u7A7F\u8D8A\u6162\u7EBF\n if (fPrev >= sPrev && fCurr < sCurr) {\n return { type: 'death_cross', index: i, fastValue: fCurr, slowValue: sCurr };\n }\n }\n\n return { type: 'none', index: -1, fastValue: 0, slowValue: 0 };\n}\n\n// ============================================================\n// \u5747\u7EBF\u6392\u5217\u72B6\u6001\n// ============================================================\n\n/**\n * \u68C0\u6D4B\u5747\u7EBF\u591A\u7A7A\u6392\u5217\n * @param maList \u4ECE\u77ED\u671F\u5230\u957F\u671F\u6392\u5217\u7684\u5747\u7EBF\u7ED3\u679C\u5217\u8868\n */\nexport function detectMAAlignment(maList: MAResult[]): MAAlignmentResult {\n const maValues = maList.map((m) => m.current ?? 0);\n const allValid = maList.every((m) => m.current != null);\n\n if (!allValid) {\n return { alignment: 'neutral', maValues, divergence: 0 };\n }\n\n // \u591A\u5934\u6392\u5217\uFF1A\u77ED\u671F > \u957F\u671F\uFF08\u9012\u51CF\uFF09\n let isBullish = true;\n let isBearish = true;\n for (let i = 1; i < maValues.length; i++) {\n if (maValues[i] >= maValues[i - 1]) isBullish = false;\n if (maValues[i] <= maValues[i - 1]) isBearish = false;\n }\n\n // \u8BA1\u7B97\u53D1\u6563\u5EA6\uFF08\u6807\u51C6\u5DEE\uFF09\n const mean = maValues.reduce((a, b) => a + b, 0) / maValues.length;\n const variance = maValues.reduce((sum, v) => sum + (v - mean) ** 2, 0) / maValues.length;\n const divergence = Math.sqrt(variance);\n\n const alignment = isBullish ? 'bullish' : isBearish ? 'bearish' : 'neutral';\n return { alignment, maValues, divergence };\n}\n\n// ============================================================\n// Mass Index\uFF08\u8D28\u91CF\u6307\u6570\uFF09\n// ============================================================\n\n/**\n * Mass Index - \u57FA\u4E8E EMA \u7684\u6CE2\u52A8\u8303\u56F4\u6BD4\u7387\u7D2F\u79EF\uFF0C\u7528\u4E8E\u8BC6\u522B\u53D8\u76D8\u70B9\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param emaPeriod EMA \u5468\u671F\uFF08\u9ED8\u8BA49\uFF09\n * @param sumPeriod \u7D2F\u79EF\u5468\u671F\uFF08\u9ED8\u8BA425\uFF09\n */\nexport function massIndex(nav: NavSeries, emaPeriod: number = 9, sumPeriod: number = 25): MAResult {\n // \u7531\u4E8E\u51C0\u503C\u6CA1\u6709 high/low\uFF0C\u4F7F\u7528 EMA \u7684\u53D8\u5316\u5E45\u5EA6\u8FD1\u4F3C\n const ema1 = TI_EMA.calculate({ values: nav, period: emaPeriod });\n const ema1Vals = ema1.filter((v): v is number => v !== undefined);\n const ema2 = TI_EMA.calculate({ values: ema1Vals, period: emaPeriod });\n\n const ratios: number[] = [];\n for (let i = 0; i < ema2.length; i++) {\n const e1 = ema1Vals[i + (ema1Vals.length - ema2.length)];\n const e2 = ema2[i];\n if (e1 != null && e2 != null && e2 !== 0) {\n ratios.push(e1 / e2);\n } else {\n ratios.push(1);\n }\n }\n\n const values: (number | null)[] = new Array(nav.length).fill(null);\n const offset = nav.length - ratios.length;\n\n for (let i = sumPeriod - 1; i < ratios.length; i++) {\n let sum = 0;\n for (let j = i - sumPeriod + 1; j <= i; j++) {\n sum += ratios[j];\n }\n values[offset + i] = sum;\n }\n\n return { values, current: lastNonNull(values), period: sumPeriod, type: 'SMA' };\n}\n", "/**\n * When adding a new value to a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the new\n * value to add.\n *\n * @since 2.5.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} newValue the added value\n * @returns {number} the new mean\n *\n * @example\n * addToMean(14, 5, 53); // => 20.5\n */\nfunction addToMean(mean, n, newValue) {\n return mean + (newValue - mean) / (n + 1);\n}\n\nexport default addToMean;\n", "/**\n * Split an array into chunks of a specified size. This function\n * has the same behavior as [PHP's array_chunk](http://php.net/manual/en/function.array-chunk.php)\n * function, and thus will insert smaller-sized chunks at the end if\n * the input size is not divisible by the chunk size.\n *\n * `x` is expected to be an array, and `chunkSize` a number.\n * The `x` array can contain any kind of data.\n *\n * @param {Array} x a sample\n * @param {number} chunkSize size of each output array. must be a positive integer\n * @returns {Array<Array>} a chunked array\n * @throws {Error} if chunk size is less than 1 or not an integer\n * @example\n * chunk([1, 2, 3, 4, 5, 6], 2);\n * // => [[1, 2], [3, 4], [5, 6]]\n */\nfunction chunk(x, chunkSize) {\n // a list of result chunks, as arrays in an array\n const output = [];\n\n // `chunkSize` must be zero or higher - otherwise the loop below,\n // in which we call `start += chunkSize`, will loop infinitely.\n // So, we'll detect and throw in that case to indicate\n // invalid input.\n if (chunkSize < 1) {\n throw new Error(\"chunk size must be a positive number\");\n }\n\n if (Math.floor(chunkSize) !== chunkSize) {\n throw new Error(\"chunk size must be an integer\");\n }\n\n // `start` is the index at which `.slice` will start selecting\n // new array elements\n for (let start = 0; start < x.length; start += chunkSize) {\n // for each chunk, slice that part of the array and add it\n // to the output. The `.slice` function does not change\n // the original array.\n output.push(x.slice(start, start + chunkSize));\n }\n return output;\n}\n\nexport default chunk;\n", "/**\n * Create a new column x row matrix.\n *\n * @private\n * @param {number} columns\n * @param {number} rows\n * @return {Array<Array<number>>} matrix\n * @example\n * makeMatrix(10, 10);\n */\nfunction makeMatrix(columns, rows) {\n const matrix = [];\n for (let i = 0; i < columns; i++) {\n const column = [];\n for (let j = 0; j < rows; j++) {\n column.push(0);\n }\n matrix.push(column);\n }\n return matrix;\n}\n\nexport default makeMatrix;\n", "/**\n * Sort an array of numbers by their numeric value, ensuring that the\n * array is not changed in place.\n *\n * This is necessary because the default behavior of .sort\n * in JavaScript is to sort arrays as string values\n *\n * [1, 10, 12, 102, 20].sort()\n * // output\n * [1, 10, 102, 12, 20]\n *\n * @param {Array<number>} x input array\n * @return {Array<number>} sorted array\n * @private\n * @example\n * numericSort([3, 2, 1]) // => [1, 2, 3]\n */\nfunction numericSort(x) {\n return (\n x\n // ensure the array is not changed in-place\n .slice()\n // comparator function that treats input as numeric\n .sort(function (a, b) {\n return a - b;\n })\n );\n}\n\nexport default numericSort;\n", "/**\n * For a sorted input, counting the number of unique values\n * is possible in constant time and constant memory. This is\n * a simple implementation of the algorithm.\n *\n * Values are compared with `===`, so objects and non-primitive objects\n * are not handled in any special way.\n *\n * @param {Array<*>} x an array of any kind of value\n * @returns {number} count of unique values\n * @example\n * uniqueCountSorted([1, 2, 3]); // => 3\n * uniqueCountSorted([1, 1, 1]); // => 1\n */\nfunction uniqueCountSorted(x) {\n let uniqueValueCount = 0;\n let lastSeenValue;\n for (let i = 0; i < x.length; i++) {\n if (i === 0 || x[i] !== lastSeenValue) {\n lastSeenValue = x[i];\n uniqueValueCount++;\n }\n }\n return uniqueValueCount;\n}\n\nexport default uniqueCountSorted;\n", "import makeMatrix from \"./make_matrix.js\";\nimport numericSort from \"./numeric_sort.js\";\nimport uniqueCountSorted from \"./unique_count_sorted.js\";\n\n/**\n * Generates incrementally computed values based on the sums and sums of\n * squares for the data array\n *\n * @private\n * @param {number} j\n * @param {number} i\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n * @return {number}\n * @example\n * ssq(0, 1, [-1, 0, 2], [1, 1, 5]);\n */\nfunction ssq(j, i, sums, sumsOfSquares) {\n let sji; // s(j, i)\n if (j > 0) {\n const muji = (sums[i] - sums[j - 1]) / (i - j + 1); // mu(j, i)\n sji =\n sumsOfSquares[i] - sumsOfSquares[j - 1] - (i - j + 1) * muji * muji;\n } else {\n sji = sumsOfSquares[i] - (sums[i] * sums[i]) / (i + 1);\n }\n if (sji < 0) {\n return 0;\n }\n return sji;\n}\n\n/**\n * Function that recursively divides and conquers computations\n * for cluster j\n *\n * @private\n * @param {number} iMin Minimum index in cluster to be computed\n * @param {number} iMax Maximum index in cluster to be computed\n * @param {number} cluster Index of the cluster currently being computed\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n */\nfunction fillMatrixColumn(\n iMin,\n iMax,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n) {\n if (iMin > iMax) {\n return;\n }\n\n // Start at midpoint between iMin and iMax\n const i = Math.floor((iMin + iMax) / 2);\n\n matrix[cluster][i] = matrix[cluster - 1][i - 1];\n backtrackMatrix[cluster][i] = i;\n\n let jlow = cluster; // the lower end for j\n\n if (iMin > cluster) {\n jlow = Math.max(jlow, backtrackMatrix[cluster][iMin - 1] || 0);\n }\n jlow = Math.max(jlow, backtrackMatrix[cluster - 1][i] || 0);\n\n let jhigh = i - 1; // the upper end for j\n if (iMax < matrix[0].length - 1) {\n /* c8 ignore start */\n jhigh = Math.min(jhigh, backtrackMatrix[cluster][iMax + 1] || 0);\n /* c8 ignore end */\n }\n\n let sji;\n let sjlowi;\n let ssqjlow;\n let ssqj;\n for (let j = jhigh; j >= jlow; --j) {\n sji = ssq(j, i, sums, sumsOfSquares);\n\n if (sji + matrix[cluster - 1][jlow - 1] >= matrix[cluster][i]) {\n break;\n }\n\n // Examine the lower bound of the cluster border\n sjlowi = ssq(jlow, i, sums, sumsOfSquares);\n\n ssqjlow = sjlowi + matrix[cluster - 1][jlow - 1];\n\n if (ssqjlow < matrix[cluster][i]) {\n // Shrink the lower bound\n matrix[cluster][i] = ssqjlow;\n backtrackMatrix[cluster][i] = jlow;\n }\n jlow++;\n\n ssqj = sji + matrix[cluster - 1][j - 1];\n if (ssqj < matrix[cluster][i]) {\n matrix[cluster][i] = ssqj;\n backtrackMatrix[cluster][i] = j;\n }\n }\n\n fillMatrixColumn(\n iMin,\n i - 1,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n fillMatrixColumn(\n i + 1,\n iMax,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n}\n\n/**\n * Initializes the main matrices used in Ckmeans and kicks\n * off the divide and conquer cluster computation strategy\n *\n * @private\n * @param {Array<number>} data sorted array of values\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n */\nfunction fillMatrices(data, matrix, backtrackMatrix) {\n const nValues = matrix[0].length;\n\n // Shift values by the median to improve numeric stability\n const shift = data[Math.floor(nValues / 2)];\n\n // Cumulative sum and cumulative sum of squares for all values in data array\n const sums = [];\n const sumsOfSquares = [];\n\n // Initialize first column in matrix & backtrackMatrix\n for (let i = 0, shiftedValue; i < nValues; ++i) {\n shiftedValue = data[i] - shift;\n if (i === 0) {\n sums.push(shiftedValue);\n sumsOfSquares.push(shiftedValue * shiftedValue);\n } else {\n sums.push(sums[i - 1] + shiftedValue);\n sumsOfSquares.push(\n sumsOfSquares[i - 1] + shiftedValue * shiftedValue\n );\n }\n\n // Initialize for cluster = 0\n matrix[0][i] = ssq(0, i, sums, sumsOfSquares);\n backtrackMatrix[0][i] = 0;\n }\n\n // Initialize the rest of the columns\n let iMin;\n for (let cluster = 1; cluster < matrix.length; ++cluster) {\n if (cluster < matrix.length - 1) {\n iMin = cluster;\n } else {\n // No need to compute matrix[K-1][0] ... matrix[K-1][N-2]\n iMin = nValues - 1;\n }\n\n fillMatrixColumn(\n iMin,\n nValues - 1,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n }\n}\n\n/**\n * Ckmeans clustering is an improvement on heuristic-based clustering\n * approaches like Jenks. The algorithm was developed in\n * [Haizhou Wang and Mingzhou Song](http://journal.r-project.org/archive/2011-2/RJournal_2011-2_Wang+Song.pdf)\n * as a [dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming) approach\n * to the problem of clustering numeric data into groups with the least\n * within-group sum-of-squared-deviations.\n *\n * Minimizing the difference within groups - what Wang & Song refer to as\n * `withinss`, or within sum-of-squares, means that groups are optimally\n * homogenous within and the data is split into representative groups.\n * This is very useful for visualization, where you may want to represent\n * a continuous variable in discrete color or style groups. This function\n * can provide groups that emphasize differences between data.\n *\n * Being a dynamic approach, this algorithm is based on two matrices that\n * store incrementally-computed values for squared deviations and backtracking\n * indexes.\n *\n * This implementation is based on Ckmeans 3.4.6, which introduced a new divide\n * and conquer approach that improved runtime from O(kn^2) to O(kn log(n)).\n *\n * Unlike the [original implementation](https://cran.r-project.org/web/packages/Ckmeans.1d.dp/index.html),\n * this implementation does not include any code to automatically determine\n * the optimal number of clusters: this information needs to be explicitly\n * provided.\n *\n * ### References\n * _Ckmeans.1d.dp: Optimal k-means Clustering in One Dimension by Dynamic\n * Programming_ Haizhou Wang and Mingzhou Song ISSN 2073-4859\n *\n * from The R Journal Vol. 3/2, December 2011\n * @param {Array<number>} x input data, as an array of number values\n * @param {number} nClusters number of desired classes. This cannot be\n * greater than the number of values in the data array.\n * @returns {Array<Array<number>>} clustered input\n * @throws {Error} if the number of requested clusters is higher than the size of the data\n * @example\n * ckmeans([-1, 2, -1, 2, 4, 5, 6, -1, 2, -1], 3);\n * // The input, clustered into groups of similar numbers.\n * //= [[-1, -1, -1, -1], [2, 2, 2], [4, 5, 6]]);\n */\nfunction ckmeans(x, nClusters) {\n if (nClusters > x.length) {\n throw new Error(\n \"cannot generate more classes than there are data values\"\n );\n }\n\n const sorted = numericSort(x);\n // we'll use this as the maximum number of clusters\n const uniqueCount = uniqueCountSorted(sorted);\n\n // if all of the input values are identical, there's one cluster\n // with all of the input in it.\n if (uniqueCount === 1) {\n return [sorted];\n }\n\n // named 'S' originally\n const matrix = makeMatrix(nClusters, sorted.length);\n // named 'J' originally\n const backtrackMatrix = makeMatrix(nClusters, sorted.length);\n\n // This is a dynamic programming way to solve the problem of minimizing\n // within-cluster sum of squares. It's similar to linear regression\n // in this way, and this calculation incrementally computes the\n // sum of squares that are later read.\n fillMatrices(sorted, matrix, backtrackMatrix);\n\n // The real work of Ckmeans clustering happens in the matrix generation:\n // the generated matrices encode all possible clustering combinations, and\n // once they're generated we can solve for the best clustering groups\n // very quickly.\n const clusters = [];\n let clusterRight = backtrackMatrix[0].length - 1;\n\n // Backtrack the clusters from the dynamic programming matrix. This\n // starts at the bottom-right corner of the matrix (if the top-left is 0, 0),\n // and moves the cluster target with the loop.\n for (let cluster = backtrackMatrix.length - 1; cluster >= 0; cluster--) {\n const clusterLeft = backtrackMatrix[cluster][clusterRight];\n\n // fill the cluster from the sorted input by taking a slice of the\n // array. the backtrack matrix makes this easy - it stores the\n // indexes where the cluster should start and end.\n clusters[cluster] = sorted.slice(clusterLeft, clusterRight + 1);\n\n if (cluster > 0) {\n clusterRight = clusterLeft - 1;\n }\n }\n\n return clusters;\n}\n\nexport default ckmeans;\n", "/**\n * Our default sum is the [Kahan-Babuska algorithm](https://pdfs.semanticscholar.org/1760/7d467cda1d0277ad272deb2113533131dc09.pdf).\n * This method is an improvement over the classical\n * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm).\n * It aims at computing the sum of a list of numbers while correcting for\n * floating-point errors. Traditionally, sums are calculated as many\n * successive additions, each one with its own floating-point roundoff. These\n * losses in precision add up as the number of numbers increases. This alternative\n * algorithm is more accurate than the simple way of calculating sums by simple\n * addition.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sum([1, 2, 3]); // => 6\n */\nfunction sum(x) {\n // If the array is empty, we needn't bother computing its sum\n if (x.length === 0) {\n return 0;\n }\n\n // Initializing the sum as the first number in the array\n let sum = x[0];\n\n // Keeping track of the floating-point error correction\n let correction = 0;\n\n let transition;\n\n if (typeof sum !== \"number\") {\n return Number.NaN;\n }\n\n for (let i = 1; i < x.length; i++) {\n if (typeof x[i] !== \"number\") {\n return Number.NaN;\n }\n transition = sum + x[i];\n\n // Here we need to update the correction in a different fashion\n // if the new absolute value is greater than the absolute sum\n if (Math.abs(sum) >= Math.abs(x[i])) {\n correction += sum - transition + x[i];\n } else {\n correction += x[i] - transition + sum;\n }\n\n sum = transition;\n }\n\n // Returning the corrected sum\n return sum + correction;\n}\n\nexport default sum;\n", "import sum from \"./sum.js\";\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction mean(x) {\n if (x.length === 0) {\n throw new Error(\"mean requires at least one data point\");\n }\n\n return sum(x) / x.length;\n}\n\nexport default mean;\n", "import mean from \"./mean.js\";\n\n/**\n * The sum of deviations to the Nth power.\n * When n=2 it's the sum of squared deviations.\n * When n=3 it's the sum of cubed deviations.\n *\n * @param {Array<number>} x\n * @param {number} n power\n * @returns {number} sum of nth power deviations\n *\n * @example\n * var input = [1, 2, 3];\n * // since the variance of a set is the mean squared\n * // deviations, we can calculate that with sumNthPowerDeviations:\n * sumNthPowerDeviations(input, 2) / input.length;\n */\nfunction sumNthPowerDeviations(x, n) {\n const meanValue = mean(x);\n let sum = 0;\n let tempValue;\n let i;\n\n // This is an optimization: when n is 2 (we're computing a number squared),\n // multiplying the number by itself is significantly faster than using\n // the Math.pow method.\n if (n === 2) {\n for (i = 0; i < x.length; i++) {\n tempValue = x[i] - meanValue;\n sum += tempValue * tempValue;\n }\n } else {\n for (i = 0; i < x.length; i++) {\n sum += Math.pow(x[i] - meanValue, n);\n }\n }\n\n return sum;\n}\n\nexport default sumNthPowerDeviations;\n", "import sumNthPowerDeviations from \"./sum_nth_power_deviations.js\";\n\n/**\n * The [sample variance](https://en.wikipedia.org/wiki/Variance#Sample_variance)\n * is the sum of squared deviations from the mean. The sample variance\n * is distinguished from the variance by the usage of [Bessel's Correction](https://en.wikipedia.org/wiki/Bessel's_correction):\n * instead of dividing the sum of squared deviations by the length of the input,\n * it is divided by the length minus one. This corrects the bias in estimating\n * a value from a set that you don't know if full.\n *\n * References:\n * * [Wolfram MathWorld on Sample Variance](http://mathworld.wolfram.com/SampleVariance.html)\n *\n * @param {Array<number>} x a sample of two or more data points\n * @throws {Error} if the length of x is less than 2\n * @return {number} sample variance\n * @example\n * sampleVariance([1, 2, 3, 4, 5]); // => 2.5\n */\nfunction sampleVariance(x) {\n if (x.length < 2) {\n throw new Error(\"sampleVariance requires at least two data points\");\n }\n\n const sumSquaredDeviationsValue = sumNthPowerDeviations(x, 2);\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n const besselsCorrection = x.length - 1;\n\n // Find the mean value of that list\n return sumSquaredDeviationsValue / besselsCorrection;\n}\n\nexport default sampleVariance;\n", "import sampleVariance from \"./sample_variance.js\";\n\n/**\n * The [sample standard deviation](http://en.wikipedia.org/wiki/Standard_deviation#Sample_standard_deviation)\n * is the square root of the sample variance.\n *\n * @param {Array<number>} x input array\n * @returns {number} sample standard deviation\n * @example\n * sampleStandardDeviation([2, 4, 4, 4, 5, 5, 7, 9]).toFixed(2);\n * // => '2.14'\n */\nfunction sampleStandardDeviation(x) {\n const sampleVarianceX = sampleVariance(x);\n return Math.sqrt(sampleVarianceX);\n}\n\nexport default sampleStandardDeviation;\n", "import mean from \"./mean.js\";\nimport sampleStandardDeviation from \"./sample_standard_deviation.js\";\n\n/**\n * The`coefficient of variation`_ is the ratio of the standard deviation to the mean.\n * .._`coefficient of variation`: https://en.wikipedia.org/wiki/Coefficient_of_variation\n *\n *\n * @param {Array} x input\n * @returns {number} coefficient of variation\n * @example\n * coefficientOfVariation([1, 2, 3, 4]).toFixed(3); // => 0.516\n * coefficientOfVariation([1, 2, 3, 4, 5]).toFixed(3); // => 0.527\n * coefficientOfVariation([-1, 0, 1, 2, 3, 4]).toFixed(3); // => 1.247\n */\nfunction coefficientOfVariation(x) {\n return sampleStandardDeviation(x) / mean(x);\n}\n\nexport default coefficientOfVariation;\n", "/**\n * Implementation of Combinations\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * https://en.wikipedia.org/wiki/Combination\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinations([1, 2, 3], 2); // => [[1,2], [1,3], [2,3]]\n */\n\nfunction combinations(x, k) {\n let i;\n let subI;\n const combinationList = [];\n let subsetCombinations;\n let next;\n\n for (i = 0; i < x.length; i++) {\n if (k === 1) {\n combinationList.push([x[i]]);\n } else {\n subsetCombinations = combinations(x.slice(i + 1, x.length), k - 1);\n for (subI = 0; subI < subsetCombinations.length; subI++) {\n next = subsetCombinations[subI];\n next.unshift(x[i]);\n combinationList.push(next);\n }\n }\n }\n return combinationList;\n}\n\nexport default combinations;\n", "/**\n * Implementation of [Combinations](https://en.wikipedia.org/wiki/Combination) with replacement\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * 'With replacement' means that a given element can be chosen multiple times.\n * Unlike permutation, order doesn't matter for combinations.\n *\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinationsReplacement([1, 2], 2); // => [[1, 1], [1, 2], [2, 2]]\n */\nfunction combinationsReplacement(x, k) {\n const combinationList = [];\n\n for (let i = 0; i < x.length; i++) {\n if (k === 1) {\n // If we're requested to find only one element, we don't need\n // to recurse: just push `x[i]` onto the list of combinations.\n combinationList.push([x[i]]);\n } else {\n // Otherwise, recursively find combinations, given `k - 1`. Note that\n // we request `k - 1`, so if you were looking for k=3 combinations, we're\n // requesting k=2. This -1 gets reversed in the for loop right after this\n // code, since we concatenate `x[i]` onto the selected combinations,\n // bringing `k` back up to your requested level.\n // This recursion may go many levels deep, since it only stops once\n // k=1.\n const subsetCombinations = combinationsReplacement(\n x.slice(i, x.length),\n k - 1\n );\n\n for (let j = 0; j < subsetCombinations.length; j++) {\n combinationList.push([x[i]].concat(subsetCombinations[j]));\n }\n }\n }\n\n return combinationList;\n}\n\nexport default combinationsReplacement;\n", "/**\n * When combining two lists of values for which one already knows the means,\n * one does not have to necessary recompute the mean of the combined lists in\n * linear time. They can instead use this function to compute the combined\n * mean by providing the mean & number of values of the first list and the mean\n * & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineMeans(5, 3, 4, 3); // => 4.5\n */\nfunction combineMeans(mean1, n1, mean2, n2) {\n return (mean1 * n1 + mean2 * n2) / (n1 + n2);\n}\n\nexport default combineMeans;\n", "import combineMeans from \"./combine_means.js\";\n\n/**\n * When combining two lists of values for which one already knows the variances,\n * one does not have to necessary recompute the variance of the combined lists\n * in linear time. They can instead use this function to compute the combined\n * variance by providing the variance, mean & number of values of the first list\n * and the variance, mean & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} variance1 variance of the first list\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} variance2 variance of the second list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineVariances(14 / 3, 5, 3, 8 / 3, 4, 3); // => 47 / 12\n */\nfunction combineVariances(variance1, mean1, n1, variance2, mean2, n2) {\n const newMean = combineMeans(mean1, n1, mean2, n2);\n\n return (\n (n1 * (variance1 + Math.pow(mean1 - newMean, 2)) +\n n2 * (variance2 + Math.pow(mean2 - newMean, 2))) /\n (n1 + n2)\n );\n}\n\nexport default combineVariances;\n", "/**\n * This computes the maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * max([1, 2, 3, 4]);\n * // => 4\n */\nfunction max(x) {\n if (x.length === 0) {\n throw new Error(\"max requires at least one data point\");\n }\n\n let value = x[0];\n for (let i = 1; i < x.length; i++) {\n if (x[i] > value) {\n value = x[i];\n }\n }\n return value;\n}\n\nexport default max;\n", "/**\n * The min is the lowest number in the array.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} minimum value\n * @example\n * min([1, 5, -10, 100, 2]); // => -10\n */\nfunction min(x) {\n if (x.length === 0) {\n throw new Error(\"min requires at least one data point\");\n }\n\n let value = x[0];\n for (let i = 1; i < x.length; i++) {\n if (x[i] < value) {\n value = x[i];\n }\n }\n return value;\n}\n\nexport default min;\n", "import max from \"./max.js\";\nimport min from \"./min.js\";\n\n/**\n * Given an array of x, this will find the extent of the\n * x and return an array of breaks that can be used\n * to categorize the x into a number of classes. The\n * returned array will always be 1 longer than the number of\n * classes because it includes the minimum value.\n *\n * @param {Array<number>} x an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * @example\n * equalIntervalBreaks([1, 2, 3, 4, 5, 6], 4); // => [1, 2.25, 3.5, 4.75, 6]\n */\nfunction equalIntervalBreaks(x, nClasses) {\n if (x.length < 2) {\n return x;\n }\n\n const theMin = min(x);\n const theMax = max(x);\n\n // the first break will always be the minimum value\n // in the xset\n const breaks = [theMin];\n\n // The size of each break is the full range of the x\n // divided by the number of classes requested\n const breakSize = (theMax - theMin) / nClasses;\n\n // In the case of nClasses = 1, this loop won't run\n // and the returned breaks will be [min, max]\n for (let i = 1; i < nClasses; i++) {\n breaks.push(breaks[0] + breakSize * i);\n }\n\n // the last break will always be the\n // maximum.\n breaks.push(theMax);\n\n return breaks;\n}\n\nexport default equalIntervalBreaks;\n", "/**\n * This computes the minimum & maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {Array<number>} minimum & maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * extent([1, 2, 3, 4]);\n * // => [1, 4]\n */\nfunction extent(x) {\n if (x.length === 0) {\n throw new Error(\"extent requires at least one data point\");\n }\n\n let min = x[0];\n let max = x[0];\n for (let i = 1; i < x.length; i++) {\n if (x[i] > max) {\n max = x[i];\n }\n if (x[i] < min) {\n min = x[i];\n }\n }\n return [min, max];\n}\n\nexport default extent;\n", "/**\n * The extent is the lowest & highest number in the array. With a sorted array,\n * the first element in the array is always the lowest while the last element is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {Array<number>} minimum & maximum value\n * @example\n * extentSorted([-100, -10, 1, 2, 5]); // => [-100, 5]\n */\nfunction extentSorted(x) {\n return [x[0], x[x.length - 1]];\n}\n\nexport default extentSorted;\n", "/**\n * The [Geometric Mean](https://en.wikipedia.org/wiki/Geometric_mean) is\n * a mean function that is more useful for numbers in different\n * ranges.\n *\n * This is the nth root of the input numbers multiplied by each other.\n *\n * The geometric mean is often useful for\n * **[proportional growth](https://en.wikipedia.org/wiki/Geometric_mean#Proportional_growth)**: given\n * growth rates for multiple years, like _80%, 16.66% and 42.85%_, a simple\n * mean will incorrectly estimate an average growth rate, whereas a geometric\n * mean will correctly estimate a growth rate that, over those years,\n * will yield the same end value.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * var growthRates = [1.80, 1.166666, 1.428571];\n * var averageGrowth = ss.geometricMean(growthRates);\n * var averageGrowthRates = [averageGrowth, averageGrowth, averageGrowth];\n * var startingValue = 10;\n * var startingValueMean = 10;\n * growthRates.forEach(function(rate) {\n * startingValue *= rate;\n * });\n * averageGrowthRates.forEach(function(rate) {\n * startingValueMean *= rate;\n * });\n * startingValueMean === startingValue;\n */\nfunction geometricMean(x) {\n if (x.length === 0) {\n throw new Error(\"geometricMean requires at least one data point\");\n }\n\n // the starting value.\n let value = 1;\n\n for (let i = 0; i < x.length; i++) {\n // the geometric mean is only valid for positive numbers\n if (x[i] < 0) {\n throw new Error(\n \"geometricMean requires only non-negative numbers as input\"\n );\n }\n\n // repeatedly multiply the value by each number\n value *= x[i];\n }\n\n return Math.pow(value, 1 / x.length);\n}\n\nexport default geometricMean;\n", "/**\n * The [Harmonic Mean](https://en.wikipedia.org/wiki/Harmonic_mean) is\n * a mean function typically used to find the average of rates.\n * This mean is calculated by taking the reciprocal of the arithmetic mean\n * of the reciprocals of the input numbers.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} harmonic mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * harmonicMean([2, 3]).toFixed(2) // => '2.40'\n */\nfunction harmonicMean(x) {\n if (x.length === 0) {\n throw new Error(\"harmonicMean requires at least one data point\");\n }\n\n let reciprocalSum = 0;\n\n for (let i = 0; i < x.length; i++) {\n // the harmonic mean is only valid for positive numbers\n if (x[i] <= 0) {\n throw new Error(\n \"harmonicMean requires only positive numbers as input\"\n );\n }\n\n reciprocalSum += 1 / x[i];\n }\n\n // divide n by the reciprocal sum\n return x.length / reciprocalSum;\n}\n\nexport default harmonicMean;\n", "/**\n * This is the internal implementation of quantiles: when you know\n * that the order is sorted, you don't need to re-sort it, and the computations\n * are faster.\n *\n * This implements the linear interpolation method (type=7 in R/numpy),\n * which is the default in numpy.percentile and R's quantile.\n *\n * @param {Array<number>} x sample of one or more data points\n * @param {number} p desired quantile: a number between 0 to 1, inclusive\n * @returns {number} quantile value\n * @throws {Error} if p ix outside of the range from 0 to 1\n * @throws {Error} if x is empty\n * @example\n * quantileSorted([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantileSorted(x, p) {\n // Use (n-1) * p for index, matching numpy's linear method (type=7)\n const idx = (x.length - 1) * p;\n if (x.length === 0) {\n throw new Error(\"quantile requires at least one data point.\");\n } else if (p < 0 || p > 1) {\n throw new Error(\"quantiles must be between 0 and 1\");\n } else if (p === 1) {\n // If p is 1, directly return the last element\n return x[x.length - 1];\n } else if (p === 0) {\n // If p is 0, directly return the first element\n return x[0];\n } else if (idx % 1 !== 0) {\n // If idx is not integer, interpolate linearly between floor and ceil\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n const fraction = idx - lower;\n return x[lower] + fraction * (x[upper] - x[lower]);\n } else {\n // If idx is integer, type=7 returns the value at that index\n return x[idx];\n }\n}\n\nexport default quantileSorted;\n", "/**\n * Rearrange items in `arr` so that all items in `[left, k]` range are the smallest.\n * The `k`-th element will have the `(k - left + 1)`-th smallest value in `[left, right]`.\n *\n * Implements Floyd-Rivest selection algorithm https://en.wikipedia.org/wiki/Floyd-Rivest_algorithm\n *\n * @param {Array<number>} arr input array\n * @param {number} k pivot index\n * @param {number} [left] left index\n * @param {number} [right] right index\n * @returns {void} mutates input array\n * @example\n * var arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39];\n * quickselect(arr, 8);\n * // = [39, 28, 28, 33, 21, 12, 22, 50, 53, 56, 59, 65, 90, 77, 95]\n */\nfunction quickselect(arr, k, left, right) {\n left = left || 0;\n right = right || arr.length - 1;\n\n while (right > left) {\n // 600 and 0.5 are arbitrary constants chosen in the original paper to minimize execution time\n if (right - left > 600) {\n const n = right - left + 1;\n const m = k - left + 1;\n const z = Math.log(n);\n const s = 0.5 * Math.exp((2 * z) / 3);\n let sd = 0.5 * Math.sqrt((z * s * (n - s)) / n);\n if (m - n / 2 < 0) sd *= -1;\n const newLeft = Math.max(left, Math.floor(k - (m * s) / n + sd));\n const newRight = Math.min(\n right,\n Math.floor(k + ((n - m) * s) / n + sd)\n );\n quickselect(arr, k, newLeft, newRight);\n }\n\n const t = arr[k];\n let i = left;\n let j = right;\n\n swap(arr, left, k);\n if (arr[right] > t) swap(arr, left, right);\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (arr[i] < t) i++;\n while (arr[j] > t) j--;\n }\n\n if (arr[left] === t) swap(arr, left, j);\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\nfunction swap(arr, i, j) {\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\nexport default quickselect;\n", "import quantileSorted from \"./quantile_sorted.js\";\nimport quickselect from \"./quickselect.js\";\n\n/**\n * The [quantile](https://en.wikipedia.org/wiki/Quantile):\n * this is a population quantile, since we assume to know the entire\n * dataset in this library. This implementation uses linear interpolation,\n * equivalent to R's type=7 and numpy's default percentile method.\n *\n * Sample is a one-dimensional array of numbers,\n * and p is either a decimal number from 0 to 1 or an array of decimal\n * numbers from 0 to 1.\n * In terms of a k/q quantile, p = k/q - it's just dealing with fractions or dealing\n * with decimal values.\n * When p is an array, the result of the function is also an array containing the appropriate\n * quantiles in input order\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {Array<number> | number} p the desired quantile, as a number between 0 and 1\n * @returns {number} quantile\n * @example\n * quantile([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantile(x, p) {\n const copy = x.slice();\n\n if (Array.isArray(p)) {\n // rearrange elements so that each element corresponding to a requested\n // quantile is on a place it would be if the array was fully sorted\n multiQuantileSelect(copy, p);\n // Initialize the result array\n const results = [];\n // For each requested quantile\n for (let i = 0; i < p.length; i++) {\n results[i] = quantileSorted(copy, p[i]);\n }\n return results;\n } else {\n const idx = quantileIndex(copy.length, p);\n quantileSelect(copy, idx, 0, copy.length - 1);\n return quantileSorted(copy, p);\n }\n}\n\nfunction quantileSelect(arr, k, left, right) {\n if (k % 1 === 0) {\n quickselect(arr, k, left, right);\n } else {\n k = Math.floor(k);\n quickselect(arr, k, left, right);\n quickselect(arr, k + 1, k + 1, right);\n }\n}\n\nfunction multiQuantileSelect(arr, p) {\n const indices = [0];\n for (let i = 0; i < p.length; i++) {\n indices.push(quantileIndex(arr.length, p[i]));\n }\n indices.push(arr.length - 1);\n indices.sort(compare);\n\n const stack = [0, indices.length - 1];\n\n while (stack.length) {\n const r = Math.ceil(stack.pop());\n const l = Math.floor(stack.pop());\n if (r - l <= 1) continue;\n\n const m = Math.floor((l + r) / 2);\n quantileSelect(\n arr,\n indices[m],\n Math.floor(indices[l]),\n Math.ceil(indices[r])\n );\n\n stack.push(l, m, m, r);\n }\n}\n\nfunction compare(a, b) {\n return a - b;\n}\n\nfunction quantileIndex(len, p) {\n // Use (n-1) * p to match numpy's linear method (type=7)\n const idx = (len - 1) * p;\n if (p === 1) {\n // If p is 1, directly return the last index\n return len - 1;\n } else if (p === 0) {\n // If p is 0, directly return the first index\n return 0;\n } else if (idx % 1 !== 0) {\n // If index is not integer, keep the fractional position so we can\n // select both surrounding order statistics for interpolation.\n return idx;\n } else {\n // If index is integer, return that exact position.\n return idx;\n }\n}\n\nexport default quantile;\n", "import quantile from \"./quantile.js\";\n\n/**\n * The [Interquartile range](http://en.wikipedia.org/wiki/Interquartile_range) is\n * a measure of statistical dispersion, or how scattered, spread, or\n * concentrated a distribution is. It's computed as the difference between\n * the third quartile and first quartile.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @returns {number} interquartile range: the span between lower and upper quartile,\n * 0.25 and 0.75\n * @example\n * interquartileRange([0, 1, 2, 3]); // => 2\n */\nfunction interquartileRange(x) {\n // Interquartile range is the span between the upper quartile,\n // at `0.75`, and lower quartile, `0.25`\n const q1 = quantile(x, 0.75);\n const q2 = quantile(x, 0.25);\n\n if (typeof q1 === \"number\" && typeof q2 === \"number\") {\n return q1 - q2;\n }\n}\n\nexport default interquartileRange;\n", "/*\n * Pull Breaks Values for Jenks\n *\n * the second part of the jenks recipe: take the calculated matrices\n * and derive an array of n breaks.\n *\n * @private\n */\nfunction jenksBreaks(data, lowerClassLimits, nClasses) {\n let k = data.length;\n const kclass = [];\n let countNum = nClasses;\n\n // the calculation of classes will never include the upper\n // bound, so we need to explicitly set it\n kclass[nClasses] = data[data.length - 1];\n\n // the lowerClassLimits matrix is used as indices into itself\n // here: the `k` variable is reused in each iteration.\n while (countNum > 0) {\n kclass[countNum - 1] = data[lowerClassLimits[k][countNum] - 1];\n k = lowerClassLimits[k][countNum] - 1;\n countNum--;\n }\n\n return kclass;\n}\n\nexport default jenksBreaks;\n", "/*\n * Compute Matrices for Jenks\n *\n * Compute the matrices required for Jenks breaks. These matrices\n * can be used for any classing of data with `classes <= nClasses`\n *\n * @private\n */\nfunction jenksMatrices(data, nClasses) {\n // in the original implementation, these matrices are referred to\n // as `LC` and `OP`\n //\n // * lowerClassLimits (LC): optimal lower class limits\n // * varianceCombinations (OP): optimal variance combinations for all classes\n const lowerClassLimits = [];\n const varianceCombinations = [];\n // loop counters\n let i;\n let j;\n // the variance, as computed at each step in the calculation\n let variance = 0;\n\n // Initialize and fill each matrix with zeroes\n for (i = 0; i < data.length + 1; i++) {\n const tmp1 = [];\n const tmp2 = [];\n // despite these arrays having the same values, we need\n // to keep them separate so that changing one does not change\n // the other\n for (j = 0; j < nClasses + 1; j++) {\n tmp1.push(0);\n tmp2.push(0);\n }\n lowerClassLimits.push(tmp1);\n varianceCombinations.push(tmp2);\n }\n\n for (i = 1; i < nClasses + 1; i++) {\n lowerClassLimits[1][i] = 1;\n varianceCombinations[1][i] = 0;\n // in the original implementation, 9999999 is used but\n // since Javascript has `Infinity`, we use that.\n for (j = 2; j < data.length + 1; j++) {\n varianceCombinations[j][i] = Number.POSITIVE_INFINITY;\n }\n }\n\n for (let l = 2; l < data.length + 1; l++) {\n // `SZ` originally. this is the sum of the values seen thus\n // far when calculating variance.\n let sum = 0;\n // `ZSQ` originally. the sum of squares of values seen\n // thus far\n let sumSquares = 0;\n // `WT` originally. This is the number of\n let w = 0;\n // `IV` originally\n let i4 = 0;\n\n // in several instances, you could say `Math.pow(x, 2)`\n // instead of `x * x`, but this is slower in some browsers\n // introduces an unnecessary concept.\n for (let m = 1; m < l + 1; m++) {\n // `III` originally\n const lowerClassLimit = l - m + 1;\n const val = data[lowerClassLimit - 1];\n\n // here we're estimating variance for each potential classing\n // of the data, for each potential number of classes. `w`\n // is the number of data points considered so far.\n w++;\n\n // increase the current sum and sum-of-squares\n sum += val;\n sumSquares += val * val;\n\n // the variance at this point in the sequence is the difference\n // between the sum of squares and the total x 2, over the number\n // of samples.\n variance = sumSquares - (sum * sum) / w;\n\n i4 = lowerClassLimit - 1;\n\n if (i4 !== 0) {\n for (j = 2; j < nClasses + 1; j++) {\n // if adding this element to an existing class\n // will increase its variance beyond the limit, break\n // the class at this point, setting the `lowerClassLimit`\n // at this point.\n if (\n varianceCombinations[l][j] >=\n variance + varianceCombinations[i4][j - 1]\n ) {\n lowerClassLimits[l][j] = lowerClassLimit;\n varianceCombinations[l][j] =\n variance + varianceCombinations[i4][j - 1];\n }\n }\n }\n }\n\n lowerClassLimits[l][1] = 1;\n varianceCombinations[l][1] = variance;\n }\n\n // return the two matrices. for just providing breaks, only\n // `lowerClassLimits` is needed, but variances can be useful to\n // evaluate goodness of fit.\n return {\n lowerClassLimits: lowerClassLimits,\n varianceCombinations: varianceCombinations\n };\n}\n\nexport default jenksMatrices;\n", "import jenksBreaks from \"./jenks_breaks.js\";\nimport jenksMatrices from \"./jenks_matrices.js\";\n\n/**\n * The **[jenks natural breaks optimization](http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization)**\n * is an algorithm commonly used in cartography and visualization to decide\n * upon groupings of data values that minimize variance within themselves\n * and maximize variation between themselves.\n *\n * For instance, cartographers often use jenks in order to choose which\n * values are assigned to which colors in a [choropleth](https://en.wikipedia.org/wiki/Choropleth_map)\n * map.\n *\n * @param {Array<number>} data input data, as an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * // split data into 3 break points\n * jenks([1, 2, 4, 5, 7, 9, 10, 20], 3) // = [1, 7, 20, 20]\n */\nfunction jenks(data, nClasses) {\n if (nClasses > data.length) {\n return null;\n }\n\n // sort data in numerical order, since this is expected\n // by the matrices function\n data = data.slice().sort(function (a, b) {\n return a - b;\n });\n\n // get our basic matrices\n const matrices = jenksMatrices(data, nClasses);\n // we only need lower class limits here\n const lowerClassLimits = matrices.lowerClassLimits;\n\n // extract nClasses out of the computed matrices\n return jenksBreaks(data, lowerClassLimits, nClasses);\n}\n\nexport default jenks;\n", "/**\n * [Simple linear regression](http://en.wikipedia.org/wiki/Simple_linear_regression)\n * is a simple way to find a fitted line\n * between a set of coordinates. This algorithm finds the slope and y-intercept of a regression line\n * using the least sum of squares.\n *\n * @param {Array<Array<number>>} data an array of two-element of arrays,\n * like `[[0, 1], [2, 3]]`\n * @returns {Object} object containing slope and intersect of regression line\n * @example\n * linearRegression([[0, 0], [1, 1]]); // => { m: 1, b: 0 }\n */\nfunction linearRegression(data) {\n let m;\n let b;\n\n // Store data length in a local variable to reduce\n // repeated object property lookups\n const dataLength = data.length;\n\n //if there's only one point, arbitrarily choose a slope of 0\n //and a y-intercept of whatever the y of the initial point is\n if (dataLength === 1) {\n m = 0;\n b = data[0][1];\n } else {\n // Initialize our sums and scope the `m` and `b`\n // variables that define the line.\n let sumX = 0;\n let sumY = 0;\n let sumXX = 0;\n let sumXY = 0;\n\n // Use local variables to grab point values\n // with minimal object property lookups\n let point;\n let x;\n let y;\n\n // Gather the sum of all x values, the sum of all\n // y values, and the sum of x^2 and (x*y) for each\n // value.\n //\n // In math notation, these would be SS_x, SS_y, SS_xx, and SS_xy\n for (let i = 0; i < dataLength; i++) {\n point = data[i];\n x = point[0];\n y = point[1];\n\n sumX += x;\n sumY += y;\n\n sumXX += x * x;\n sumXY += x * y;\n }\n\n // `m` is the slope of the regression line\n m =\n (dataLength * sumXY - sumX * sumY) /\n (dataLength * sumXX - sumX * sumX);\n\n // `b` is the y-intercept of the line.\n b = sumY / dataLength - (m * sumX) / dataLength;\n }\n\n // Return both values as an object.\n return {\n m: m,\n b: b\n };\n}\n\nexport default linearRegression;\n", "/**\n * Given the output of `linearRegression`: an object\n * with `m` and `b` values indicating slope and intercept,\n * respectively, generate a line function that translates\n * x values into y values.\n *\n * @param {Object} mb object with `m` and `b` members, representing\n * slope and intersect of desired line\n * @returns {Function} method that computes y-value at any given\n * x-value on the line.\n * @example\n * var l = linearRegressionLine(linearRegression([[0, 0], [1, 1]]));\n * l(0) // = 0\n * l(2) // = 2\n * linearRegressionLine({ b: 0, m: 1 })(1); // => 1\n * linearRegressionLine({ b: 1, m: 1 })(1); // => 2\n */\nfunction linearRegressionLine(mb /*: { b: number, m: number }*/) {\n // Return a function that computes a `y` value for each\n // x value it is given, based on the values of `b` and `a`\n // that we just computed.\n return function (x) {\n return mb.b + mb.m * x;\n };\n}\n\nexport default linearRegressionLine;\n", "/**\n * The [log average](https://en.wikipedia.org/wiki/https://en.wikipedia.org/wiki/Geometric_mean#Relationship_with_logarithms)\n * is an equivalent way of computing the geometric mean of an array suitable for large or small products.\n *\n * It's found by calculating the average logarithm of the elements and exponentiating.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n */\nfunction logAverage(x) {\n if (x.length === 0) {\n throw new Error(\"logAverage requires at least one data point\");\n }\n\n let value = 0;\n for (let i = 0; i < x.length; i++) {\n if (x[i] < 0) {\n throw new Error(\n \"logAverage requires only non-negative numbers as input\"\n );\n }\n value += Math.log(x[i]);\n }\n\n return Math.exp(value / x.length);\n}\n\nexport default logAverage;\n", "/**\n * The maximum is the highest number in the array. With a sorted array,\n * the last element in the array is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} maximum value\n * @example\n * maxSorted([-100, -10, 1, 2, 5]); // => 5\n */\nfunction maxSorted(x) {\n return x[x.length - 1];\n}\n\nexport default maxSorted;\n", "/**\n * The simple [sum](https://en.wikipedia.org/wiki/Summation) of an array\n * is the result of adding all numbers together, starting from zero.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sumSimple([1, 2, 3]); // => 6\n */\nfunction sumSimple(x) {\n let value = 0;\n for (let i = 0; i < x.length; i++) {\n if (typeof x[i] !== \"number\") {\n return Number.NaN;\n }\n value += x[i];\n }\n return value;\n}\n\nexport default sumSimple;\n", "import sumSimple from \"./sum_simple.js\";\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The simple mean uses the successive addition method internally\n * to calculate it's result. Errors in floating-point addition are\n * not accounted for, so if precision is required, the standard {@link mean}\n * method should be used instead.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction meanSimple(x) {\n if (x.length === 0) {\n throw new Error(\"meanSimple requires at least one data point\");\n }\n\n return sumSimple(x) / x.length;\n}\n\nexport default meanSimple;\n", "import quantile from \"./quantile.js\";\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} x input\n * @returns {number} median value\n * @example\n * median([10, 2, 5, 100, 2, 1]); // => 3.5\n */\nfunction median(x) {\n return +quantile(x, 0.5);\n}\n\nexport default median;\n", "import median from \"./median.js\";\n\n/**\n * The [Median Absolute Deviation](http://en.wikipedia.org/wiki/Median_absolute_deviation) is\n * a robust measure of statistical\n * dispersion. It is more resilient to outliers than the standard deviation.\n *\n * @param {Array<number>} x input array\n * @returns {number} median absolute deviation\n * @example\n * medianAbsoluteDeviation([1, 1, 2, 2, 4, 6, 9]); // => 1\n */\nfunction medianAbsoluteDeviation(x) {\n const medianValue = median(x);\n const medianAbsoluteDeviations = [];\n\n // Make a list of absolute deviations from the median\n for (let i = 0; i < x.length; i++) {\n medianAbsoluteDeviations.push(Math.abs(x[i] - medianValue));\n }\n\n // Find the median value of that list\n return median(medianAbsoluteDeviations);\n}\n\nexport default medianAbsoluteDeviation;\n", "import quantileSorted from \"./quantile_sorted.js\";\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} sorted input\n * @returns {number} median value\n * @example\n * medianSorted([10, 2, 5, 100, 2, 1]); // => 52.5\n */\nfunction medianSorted(sorted) {\n return quantileSorted(sorted, 0.5);\n}\n\nexport default medianSorted;\n", "/**\n * The minimum is the lowest number in the array. With a sorted array,\n * the first element in the array is always the smallest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} minimum value\n * @example\n * minSorted([-100, -10, 1, 2, 5]); // => -100\n */\nfunction minSorted(x) {\n return x[0];\n}\n\nexport default minSorted;\n", "/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)` because the input is sorted.\n *\n * @param {Array<number>} sorted a sample of one or more data points\n * @returns {number} mode\n * @throws {Error} if sorted is empty\n * @example\n * modeSorted([0, 0, 1]); // => 0\n */\nfunction modeSorted(sorted) {\n // Handle edge cases:\n // The mode of an empty list is undefined\n if (sorted.length === 0) {\n throw new Error(\"mode requires at least one data point\");\n }\n if (sorted.length === 1) {\n return sorted[0];\n }\n\n // This assumes it is dealing with an array of size > 1, since size\n // 0 and 1 are handled immediately. Hence it starts at index 1 in the\n // array.\n let last = sorted[0];\n // store the mode as we find new modes\n let value = Number.NaN;\n // store how many times we've seen the mode\n let maxSeen = 0;\n // how many times the current candidate for the mode\n // has been seen\n let seenThis = 1;\n\n // end at sorted.length + 1 to fix the case in which the mode is\n // the highest number that occurs in the sequence. the last iteration\n // compares sorted[i], which is undefined, to the highest number\n // in the series\n for (let i = 1; i < sorted.length + 1; i++) {\n // we're seeing a new number pass by\n if (sorted[i] !== last) {\n // the last number is the new mode since we saw it more\n // often than the old one\n if (seenThis > maxSeen) {\n maxSeen = seenThis;\n value = last;\n }\n seenThis = 1;\n last = sorted[i];\n // if this isn't a new number, it's one more occurrence of\n // the potential mode\n } else {\n seenThis++;\n }\n }\n return value;\n}\n\nexport default modeSorted;\n", "import modeSorted from \"./mode_sorted.js\";\nimport numericSort from \"./numeric_sort.js\";\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n log(n))` because it needs to sort the array internally\n * before running an `O(n)` search to find the mode.\n *\n * @param {Array<number>} x input\n * @returns {number} mode\n * @example\n * mode([0, 0, 1]); // => 0\n */\nfunction mode(x) {\n // Sorting the array lets us iterate through it below and be sure\n // that every time we see a new number it's new and we'll never\n // see the same number twice\n return modeSorted(numericSort(x));\n}\n\nexport default mode;\n", "/* globals Map: false */\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * modeFast uses a Map object to keep track of the mode, instead of the approach\n * used with `mode`, a sorted array. As a result, it is faster\n * than `mode` and supports any data type that can be compared with `==`.\n * It also requires a\n * [JavaScript environment with support for Map](https://kangax.github.io/compat-table/es6/#test-Map),\n * and will throw an error if Map is not available.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * @param {Array<*>} x a sample of one or more data points\n * @returns {?*} mode\n * @throws {ReferenceError} if the JavaScript environment doesn't support Map\n * @throws {Error} if x is empty\n * @example\n * modeFast(['rabbits', 'rabbits', 'squirrels']); // => 'rabbits'\n */\nfunction modeFast(x) {\n // This index will reflect the incidence of different values, indexing\n // them like\n // { value: count }\n const index = new Map();\n\n // A running `mode` and the number of times it has been encountered.\n let mode;\n let modeCount = 0;\n\n for (let i = 0; i < x.length; i++) {\n let newCount = index.get(x[i]);\n if (newCount === undefined) {\n newCount = 1;\n } else {\n newCount++;\n }\n if (newCount > modeCount) {\n mode = x[i];\n modeCount = newCount;\n }\n index.set(x[i], newCount);\n }\n\n if (modeCount === 0) {\n throw new Error(\"mode requires at last one data point\");\n }\n\n return mode;\n}\n\nexport default modeFast;\n", "/**\n * Implementation of [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)\n * for generating permutations.\n *\n * @param {Array} elements any type of data\n * @returns {Array<Array>} array of permutations\n */\nfunction permutationsHeap(elements) {\n const indexes = new Array(elements.length);\n const permutations = [elements.slice()];\n\n for (let i = 0; i < elements.length; i++) {\n indexes[i] = 0;\n }\n\n for (let i = 0; i < elements.length; ) {\n if (indexes[i] < i) {\n // At odd indexes, swap from indexes[i] instead\n // of from the beginning of the array\n let swapFrom = 0;\n if (i % 2 !== 0) {\n swapFrom = indexes[i];\n }\n\n // swap between swapFrom and i, using\n // a temporary variable as storage.\n const temp = elements[swapFrom];\n elements[swapFrom] = elements[i];\n elements[i] = temp;\n\n permutations.push(elements.slice());\n indexes[i]++;\n i = 0;\n } else {\n indexes[i] = 0;\n i++;\n }\n }\n\n return permutations;\n}\n\nexport default permutationsHeap;\n", "/**\n * The [product](https://en.wikipedia.org/wiki/Product_(mathematics)) of an array\n * is the result of multiplying all numbers together, starting using one as the multiplicative identity.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} product of all input numbers\n * @example\n * product([1, 2, 3, 4]); // => 24\n */\nfunction product(x) {\n let value = 1;\n for (let i = 0; i < x.length; i++) {\n value *= x[i];\n }\n return value;\n}\n\nexport default product;\n", "/* eslint no-bitwise: 0 */\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. With a sorted array, leveraging binary search, we can find\n * this information in logarithmic time.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRankSorted([1, 2, 3, 4], 3); // => 0.75\n * quantileRankSorted([1, 2, 3, 3, 4], 3); // => 0.7\n * quantileRankSorted([1, 2, 3, 4], 6); // => 1\n * quantileRankSorted([1, 2, 3, 3, 5], 4); // => 0.8\n */\nfunction quantileRankSorted(x, value) {\n // Value is lesser than any value in the array\n if (value < x[0]) {\n return 0;\n }\n\n // Value is greater than any value in the array\n if (value > x[x.length - 1]) {\n return 1;\n }\n\n let l = lowerBound(x, value);\n\n // Value is not in the array\n if (x[l] !== value) {\n return l / x.length;\n }\n\n l++;\n\n const u = upperBound(x, value);\n\n // The value exists only once in the array\n if (u === l) {\n return l / x.length;\n }\n\n // Here, we are basically computing the mean of the range of indices\n // containing our searched value. But, instead, of initializing an\n // array and looping over it, there is a dedicated math formula that\n // we apply below to get the result.\n const r = u - l + 1;\n const sum = (r * (u + l)) / 2;\n const mean = sum / r;\n\n return mean / x.length;\n}\n\nfunction lowerBound(x, value) {\n let mid = 0;\n let lo = 0;\n let hi = x.length;\n\n while (lo < hi) {\n mid = (lo + hi) >>> 1;\n\n if (value <= x[mid]) {\n hi = mid;\n } else {\n lo = -~mid;\n }\n }\n\n return lo;\n}\n\nfunction upperBound(x, value) {\n let mid = 0;\n let lo = 0;\n let hi = x.length;\n\n while (lo < hi) {\n mid = (lo + hi) >>> 1;\n\n if (value >= x[mid]) {\n lo = -~mid;\n } else {\n hi = mid;\n }\n }\n\n return lo;\n}\n\nexport default quantileRankSorted;\n", "import numericSort from \"./numeric_sort.js\";\nimport quantileRankSorted from \"./quantile_rank_sorted.js\";\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. It will copy and sort your array before each run, so\n * if you know your array is already sorted, you should use `quantileRankSorted`\n * instead.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRank([4, 3, 1, 2], 3); // => 0.75\n * quantileRank([4, 3, 2, 3, 1], 3); // => 0.7\n * quantileRank([2, 4, 1, 3], 6); // => 1\n * quantileRank([5, 3, 1, 2, 3], 4); // => 0.8\n */\nfunction quantileRank(x, value) {\n // Cloning and sorting the array\n const sortedCopy = numericSort(x);\n\n return quantileRankSorted(sortedCopy, value);\n}\n\nexport default quantileRank;\n", "/**\n * The [R Squared](http://en.wikipedia.org/wiki/Coefficient_of_determination)\n * value of data compared with a function `f`\n * is the sum of the squared differences between the prediction\n * and the actual value.\n *\n * @param {Array<Array<number>>} x input data: this should be doubly-nested\n * @param {Function} func function called on `[i][0]` values within the dataset\n * @returns {number} r-squared value\n * @example\n * var samples = [[0, 0], [1, 1]];\n * var regressionLine = linearRegressionLine(linearRegression(samples));\n * rSquared(samples, regressionLine); // = 1 this line is a perfect fit\n */\nfunction rSquared(x, func) {\n if (x.length < 2) {\n return 1;\n }\n\n // Compute the average y value for the actual\n // data set in order to compute the\n // _total sum of squares_\n let sum = 0;\n for (let i = 0; i < x.length; i++) {\n sum += x[i][1];\n }\n const average = sum / x.length;\n\n // Compute the total sum of squares - the\n // squared difference between each point\n // and the average of all points.\n let sumOfSquares = 0;\n for (let j = 0; j < x.length; j++) {\n sumOfSquares += Math.pow(average - x[j][1], 2);\n }\n\n // Finally estimate the error: the squared\n // difference between the estimate and the actual data\n // value at each point.\n let err = 0;\n for (let k = 0; k < x.length; k++) {\n err += Math.pow(x[k][1] - func(x[k][0]), 2);\n }\n\n // As the error grows larger, its ratio to the\n // sum of squares increases and the r squared\n // value grows lower.\n return 1 - err / sumOfSquares;\n}\n\nexport default rSquared;\n", "/**\n * The Root Mean Square (RMS) is\n * a mean function used as a measure of the magnitude of a set\n * of numbers, regardless of their sign.\n * This is the square root of the mean of the squares of the\n * input numbers.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x a sample of one or more data points\n * @returns {number} root mean square\n * @throws {Error} if x is empty\n * @example\n * rootMeanSquare([-1, 1, -1, 1]); // => 1\n */\nfunction rootMeanSquare(x) {\n if (x.length === 0) {\n throw new Error(\"rootMeanSquare requires at least one data point\");\n }\n\n let sumOfSquares = 0;\n for (let i = 0; i < x.length; i++) {\n sumOfSquares += Math.pow(x[i], 2);\n }\n\n return Math.sqrt(sumOfSquares / x.length);\n}\n\nexport default rootMeanSquare;\n", "/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * in-place - which means that it **will change the order of the original\n * array by reference**.\n *\n * This is an algorithm that generates a random [permutation](https://en.wikipedia.org/wiki/Permutation)\n * of a set.\n *\n * @param {Array} x sample of one or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @returns {Array} x\n * @example\n * var x = [1, 2, 3, 4];\n * shuffleInPlace(x);\n * // x is shuffled to a value like [2, 1, 4, 3]\n */\nfunction shuffleInPlace(x, randomSource) {\n // a custom random number source can be provided if you want to use\n // a fixed seed or another random number generator, like\n // [random-js](https://www.npmjs.org/package/random-js)\n randomSource = randomSource || Math.random;\n\n // store the current length of the x to determine\n // when no elements remain to shuffle.\n let length = x.length;\n\n // temporary is used to hold an item when it is being\n // swapped between indices.\n let temporary;\n\n // The index to swap at each stage.\n let index;\n\n // While there are still items to shuffle\n while (length > 0) {\n // choose a random index within the subset of the array\n // that is not yet shuffled\n index = Math.floor(randomSource() * length--);\n\n // store the value that we'll move temporarily\n temporary = x[length];\n\n // swap the value at `x[length]` with `x[index]`\n x[length] = x[index];\n x[index] = temporary;\n }\n\n return x;\n}\n\nexport default shuffleInPlace;\n", "import shuffleInPlace from \"./shuffle_in_place.js\";\n\n/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * is a fast way to create a random permutation of a finite set. This is\n * a function around `shuffle_in_place` that adds the guarantee that\n * it will not modify its input.\n *\n * @param {Array} x sample of 0 or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} shuffled version of input\n * @example\n * var shuffled = shuffle([1, 2, 3, 4]);\n * shuffled; // = [2, 3, 1, 4] or any other random permutation\n */\nfunction shuffle(x, randomSource) {\n // slice the original array so that it is not modified\n const sample = x.slice();\n\n // and then shuffle that shallow-copied array, in place\n return shuffleInPlace(sample, randomSource);\n}\n\nexport default shuffle;\n", "import shuffle from \"./shuffle.js\";\n\n/**\n * Create a [simple random sample](http://en.wikipedia.org/wiki/Simple_random_sample)\n * from a given array of `n` elements.\n *\n * The sampled values will be in any order, not necessarily the order\n * they appear in the input.\n *\n * @param {Array<any>} x input array. can contain any type\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} subset of n elements in original array\n *\n * @example\n * var values = [1, 2, 4, 5, 6, 7, 8, 9];\n * sample(values, 3); // returns 3 random values, like [2, 5, 8];\n */\nfunction sample(x, n, randomSource) {\n // shuffle the original array using a fisher-yates shuffle\n const shuffled = shuffle(x, randomSource);\n\n // and then return a subset of it - the first `n` elements.\n return shuffled.slice(0, n);\n}\n\nexport default sample;\n", "import mean from \"./mean.js\";\n\n/**\n * [Sample covariance](https://en.wikipedia.org/wiki/Sample_mean_and_covariance) of two datasets:\n * how much do the two datasets move together?\n * x and y are two datasets, represented as arrays of numbers.\n *\n * @param {Array<number>} x a sample of two or more data points\n * @param {Array<number>} y a sample of two or more data points\n * @throws {Error} if x and y do not have equal lengths\n * @throws {Error} if x or y have length of one or less\n * @returns {number} sample covariance\n * @example\n * sampleCovariance([1, 2, 3, 4, 5, 6], [6, 5, 4, 3, 2, 1]); // => -3.5\n */\nfunction sampleCovariance(x, y) {\n // The two datasets must have the same length which must be more than 1\n if (x.length !== y.length) {\n throw new Error(\"sampleCovariance requires samples with equal lengths\");\n }\n\n if (x.length < 2) {\n throw new Error(\n \"sampleCovariance requires at least two data points in each sample\"\n );\n }\n\n // determine the mean of each dataset so that we can judge each\n // value of the dataset fairly as the difference from the mean. this\n // way, if one dataset is [1, 2, 3] and [2, 3, 4], their covariance\n // does not suffer because of the difference in absolute values\n const xmean = mean(x);\n const ymean = mean(y);\n let sum = 0;\n\n // for each pair of values, the covariance increases when their\n // difference from the mean is associated - if both are well above\n // or if both are well below\n // the mean, the covariance increases significantly.\n for (let i = 0; i < x.length; i++) {\n sum += (x[i] - xmean) * (y[i] - ymean);\n }\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n const besselsCorrection = x.length - 1;\n\n // the covariance is weighted by the length of the datasets.\n return sum / besselsCorrection;\n}\n\nexport default sampleCovariance;\n", "import sampleCovariance from \"./sample_covariance.js\";\nimport sampleStandardDeviation from \"./sample_standard_deviation.js\";\n\n/**\n * The [correlation](http://en.wikipedia.org/wiki/Correlation_and_dependence) is\n * a measure of how correlated two datasets are, between -1 and 1\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample correlation\n * @example\n * sampleCorrelation([1, 2, 3, 4, 5, 6], [2, 2, 3, 4, 5, 60]).toFixed(2);\n * // => '0.69'\n */\nfunction sampleCorrelation(x, y) {\n const cov = sampleCovariance(x, y);\n const xstd = sampleStandardDeviation(x);\n const ystd = sampleStandardDeviation(y);\n\n return cov / xstd / ystd;\n}\n\nexport default sampleCorrelation;\n", "import mean from \"./mean.js\";\n\n/**\n * [Kurtosis](http://en.wikipedia.org/wiki/Kurtosis) is\n * a measure of the heaviness of a distribution's tails relative to its\n * variance. The kurtosis value can be positive or negative, or even undefined.\n *\n * Implementation is based on Fisher's excess kurtosis definition and uses\n * unbiased moment estimators. This is the version found in Excel and available\n * in several statistical packages, including SAS and SciPy.\n *\n * @param {Array<number>} x a sample of 4 or more data points\n * @returns {number} sample kurtosis\n * @throws {Error} if x has length less than 4\n * @example\n * sampleKurtosis([1, 2, 2, 3, 5]); // => 1.4555765595463122\n */\nfunction sampleKurtosis(x) {\n const n = x.length;\n\n if (n < 4) {\n throw new Error(\"sampleKurtosis requires at least four data points\");\n }\n\n const meanValue = mean(x);\n let tempValue;\n let secondCentralMoment = 0;\n let fourthCentralMoment = 0;\n\n for (let i = 0; i < n; i++) {\n tempValue = x[i] - meanValue;\n secondCentralMoment += tempValue * tempValue;\n fourthCentralMoment += tempValue * tempValue * tempValue * tempValue;\n }\n\n return (\n ((n - 1) / ((n - 2) * (n - 3))) *\n ((n * (n + 1) * fourthCentralMoment) /\n (secondCentralMoment * secondCentralMoment) -\n 3 * (n - 1))\n );\n}\n\nexport default sampleKurtosis;\n", "import sampleCorrelation from \"./sample_correlation.js\";\n\n/**\n * The [rank correlation](https://en.wikipedia.org/wiki/Rank_correlation) is\n * a measure of the strength of monotonic relationship between two arrays\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample rank correlation\n */\nfunction sampleRankCorrelation(x, y) {\n const xIndexes = x\n .map((value, index) => [value, index])\n .sort((a, b) => a[0] - b[0])\n .map((pair) => pair[1]);\n const yIndexes = y\n .map((value, index) => [value, index])\n .sort((a, b) => a[0] - b[0])\n .map((pair) => pair[1]);\n\n // At this step, we have an array of indexes\n // that map from sorted numbers to their original indexes. We reverse\n // that so that it is an array of the sorted destination index.\n const xRanks = Array(xIndexes.length);\n const yRanks = Array(xIndexes.length);\n for (let i = 0; i < xIndexes.length; i++) {\n xRanks[xIndexes[i]] = i;\n yRanks[yIndexes[i]] = i;\n }\n\n return sampleCorrelation(xRanks, yRanks);\n}\n\nexport default sampleRankCorrelation;\n", "import mean from \"./mean.js\";\n\n/**\n * [Skewness](http://en.wikipedia.org/wiki/Skewness) is\n * a measure of the extent to which a probability distribution of a\n * real-valued random variable \"leans\" to one side of the mean.\n * The skewness value can be positive or negative, or even undefined.\n *\n * Implementation is based on the adjusted Fisher-Pearson standardized\n * moment coefficient, which is the version found in Excel and several\n * statistical packages including Minitab, SAS and SPSS.\n *\n * @since 4.1.0\n * @param {Array<number>} x a sample of 3 or more data points\n * @returns {number} sample skewness\n * @throws {Error} if x has length less than 3\n * @example\n * sampleSkewness([2, 4, 6, 3, 1]); // => 0.590128656384365\n */\nfunction sampleSkewness(x) {\n if (x.length < 3) {\n throw new Error(\"sampleSkewness requires at least three data points\");\n }\n\n const meanValue = mean(x);\n let tempValue;\n let sumSquaredDeviations = 0;\n let sumCubedDeviations = 0;\n\n for (let i = 0; i < x.length; i++) {\n tempValue = x[i] - meanValue;\n sumSquaredDeviations += tempValue * tempValue;\n sumCubedDeviations += tempValue * tempValue * tempValue;\n }\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n const besselsCorrection = x.length - 1;\n\n // Find the mean value of that list\n const theSampleStandardDeviation = Math.sqrt(\n sumSquaredDeviations / besselsCorrection\n );\n\n const n = x.length;\n const cubedS = Math.pow(theSampleStandardDeviation, 3);\n\n return (n * sumCubedDeviations) / ((n - 1) * (n - 2) * cubedS);\n}\n\nexport default sampleSkewness;\n", "/**\n * Sampling with replacement is a type of sampling that allows the same\n * item to be picked out of a population more than once.\n *\n * @param {Array<*>} x an array of any kind of value\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} n sampled items from the population\n * @example\n * var values = [1, 2, 3, 4];\n * sampleWithReplacement(values, 2); // returns 2 random values, like [2, 4];\n */\nfunction sampleWithReplacement(x, n, randomSource) {\n if (x.length === 0) {\n return [];\n }\n\n // a custom random number source can be provided if you want to use\n // a fixed seed or another random number generator, like\n // [random-js](https://www.npmjs.org/package/random-js)\n randomSource = randomSource || Math.random;\n\n const length = x.length;\n const sample = [];\n\n for (let i = 0; i < n; i++) {\n const index = Math.floor(randomSource() * length);\n\n sample.push(x[index]);\n }\n\n return sample;\n}\n\nexport default sampleWithReplacement;\n", "import sumNthPowerDeviations from \"./sum_nth_power_deviations.js\";\n\n/**\n * The [variance](http://en.wikipedia.org/wiki/Variance)\n * is the sum of squared deviations from the mean.\n *\n * This is an implementation of variance, not sample variance:\n * see the `sampleVariance` method if you want a sample measure.\n *\n * @param {Array<number>} x a population of one or more data points\n * @returns {number} variance: a value greater than or equal to zero.\n * zero indicates that all values are identical.\n * @throws {Error} if x's length is 0\n * @example\n * variance([1, 2, 3, 4, 5, 6]); // => 2.9166666666666665\n */\nfunction variance(x) {\n if (x.length === 0) {\n throw new Error(\"variance requires at least one data point\");\n }\n\n // Find the mean of squared deviations between the\n // mean value and each value.\n return sumNthPowerDeviations(x, 2) / x.length;\n}\n\nexport default variance;\n", "import variance from \"./variance.js\";\n\n/**\n * The [standard deviation](http://en.wikipedia.org/wiki/Standard_deviation)\n * is the square root of the variance. This is also known as the population\n * standard deviation. It's useful for measuring the amount\n * of variation or dispersion in a set of values.\n *\n * Standard deviation is only appropriate for full-population knowledge: for\n * samples of a population, {@link sampleStandardDeviation} is\n * more appropriate.\n *\n * @param {Array<number>} x input\n * @returns {number} standard deviation\n * @example\n * variance([2, 4, 4, 4, 5, 5, 7, 9]); // => 4\n * standardDeviation([2, 4, 4, 4, 5, 5, 7, 9]); // => 2\n */\nfunction standardDeviation(x) {\n if (x.length === 1) {\n return 0;\n }\n const v = variance(x);\n return Math.sqrt(v);\n}\n\nexport default standardDeviation;\n", "/**\n * When removing a value from a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the value to remove.\n *\n * @since 3.0.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} value the value to remove\n * @returns {number} the new mean\n *\n * @example\n * subtractFromMean(20.5, 6, 53); // => 14\n */\nfunction subtractFromMean(mean, n, value) {\n return (mean * n - value) / (n - 1);\n}\n\nexport default subtractFromMean;\n", "import mean from \"./mean.js\";\nimport standardDeviation from \"./standard_deviation.js\";\n\n/**\n * This is to compute [a one-sample t-test](https://en.wikipedia.org/wiki/Student%27s_t-test#One-sample_t-test), comparing the mean\n * of a sample to a known value, x.\n *\n * in this case, we're trying to determine whether the\n * population mean is equal to the value that we know, which is `x`\n * here. Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {number} expectedValue expected value of the population mean\n * @returns {number} value\n * @example\n * tTest([1, 2, 3, 4, 5, 6], 3.385).toFixed(2); // => '0.16'\n */\nfunction tTest(x, expectedValue) {\n // The mean of the sample\n const sampleMean = mean(x);\n\n // The standard deviation of the sample\n const sd = standardDeviation(x);\n\n // Square root the length of the sample\n const rootN = Math.sqrt(x.length);\n\n // returning the t value\n return (sampleMean - expectedValue) / (sd / rootN);\n}\n\nexport default tTest;\n", "import mean from \"./mean.js\";\nimport sampleVariance from \"./sample_variance.js\";\n\n/**\n * This is to compute [two sample t-test](http://en.wikipedia.org/wiki/Student's_t-test).\n * Tests whether \"mean(X)-mean(Y) = difference\", (\n * in the most common case, we often have `difference == 0` to test if two samples\n * are likely to be taken from populations with the same mean value) with\n * no prior knowledge on standard deviations of both samples\n * other than the fact that they have the same standard deviation.\n *\n * Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * `diff` can be omitted if it equals 0.\n *\n * [This is used to reject](https://en.wikipedia.org/wiki/Exclusion_of_the_null_hypothesis)\n * a null hypothesis that the two populations that have been sampled into\n * `sampleX` and `sampleY` are equal to each other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @param {number} [difference=0]\n * @returns {number|null} test result\n *\n * @example\n * tTestTwoSample([1, 2, 3, 4], [3, 4, 5, 6], 0); // => -2.1908902300206643\n */\nfunction tTestTwoSample(sampleX, sampleY, difference) {\n const n = sampleX.length;\n const m = sampleY.length;\n\n // If either sample doesn't actually have any values, we can't\n // compute this at all, so we return `null`.\n if (!n || !m) {\n return null;\n }\n\n // default difference (mu) is zero\n if (!difference) {\n difference = 0;\n }\n\n const meanX = mean(sampleX);\n const meanY = mean(sampleY);\n const sampleVarianceX = sampleVariance(sampleX);\n const sampleVarianceY = sampleVariance(sampleY);\n\n if (\n typeof meanX === \"number\" &&\n typeof meanY === \"number\" &&\n typeof sampleVarianceX === \"number\" &&\n typeof sampleVarianceY === \"number\"\n ) {\n const weightedVariance =\n ((n - 1) * sampleVarianceX + (m - 1) * sampleVarianceY) /\n (n + m - 2);\n\n return (\n (meanX - meanY - difference) /\n Math.sqrt(weightedVariance * (1 / n + 1 / m))\n );\n }\n}\n\nexport default tTestTwoSample;\n", "/**\n * This function calculates the Wilcoxon rank sum statistic for the first sample\n * with respect to the second. The Wilcoxon rank sum test is a non-parametric\n * alternative to the t-test which is equivalent to the\n * [Mann-Whitney U test](https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test).\n * The statistic is calculated by pooling all the observations together, ranking them,\n * and then summing the ranks associated with one of the samples. If this rank sum is\n * sufficiently large or small we reject the hypothesis that the two samples come\n * from the same distribution in favor of the alternative that one is shifted with\n * respect to the other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @returns {number} rank sum for sampleX\n *\n * @example\n * wilcoxonRankSum([1, 4, 8], [9, 12, 15]); // => 6\n */\nfunction wilcoxonRankSum(sampleX, sampleY) {\n if (!sampleX.length || !sampleY.length) {\n throw new Error(\"Neither sample can be empty\");\n }\n\n const pooledSamples = sampleX\n .map((x) => ({ label: \"x\", value: x }))\n .concat(sampleY.map((y) => ({ label: \"y\", value: y })))\n .sort((a, b) => a.value - b.value);\n\n for (let rank = 0; rank < pooledSamples.length; rank++) {\n pooledSamples[rank].rank = rank;\n }\n\n let tiedRanks = [pooledSamples[0].rank];\n for (let i = 1; i < pooledSamples.length; i++) {\n if (pooledSamples[i].value === pooledSamples[i - 1].value) {\n tiedRanks.push(pooledSamples[i].rank);\n if (i === pooledSamples.length - 1) {\n replaceRanksInPlace(pooledSamples, tiedRanks);\n }\n } else if (tiedRanks.length > 1) {\n replaceRanksInPlace(pooledSamples, tiedRanks);\n } else {\n tiedRanks = [pooledSamples[i].rank];\n }\n }\n\n function replaceRanksInPlace(pooledSamples, tiedRanks) {\n const average = (tiedRanks[0] + tiedRanks[tiedRanks.length - 1]) / 2;\n for (let i = 0; i < tiedRanks.length; i++) {\n pooledSamples[tiedRanks[i]].rank = average;\n }\n }\n\n let rankSum = 0;\n\n for (let i = 0; i < pooledSamples.length; i++) {\n const sample = pooledSamples[i];\n if (sample.label === \"x\") {\n rankSum += sample.rank + 1;\n }\n }\n\n return rankSum;\n}\n\nexport default wilcoxonRankSum;\n", "/**\n * We use `ε`, epsilon, as a stopping criterion when we want to iterate\n * until we're \"close enough\". Epsilon is a very small number: for\n * simple statistics, that number is **0.0001**\n *\n * This is used in calculations like the binomialDistribution, in which\n * the process of finding a value is [iterative](https://en.wikipedia.org/wiki/Iterative_method):\n * it progresses until it is close enough.\n *\n * Below is an example of using epsilon in [gradient descent](https://en.wikipedia.org/wiki/Gradient_descent),\n * where we're trying to find a local minimum of a function's derivative,\n * given by the `fDerivative` method.\n *\n * @example\n * // From calculation, we expect that the local minimum occurs at x=9/4\n * var x_old = 0;\n * // The algorithm starts at x=6\n * var x_new = 6;\n * var stepSize = 0.01;\n *\n * function fDerivative(x) {\n * return 4 * Math.pow(x, 3) - 9 * Math.pow(x, 2);\n * }\n *\n * // The loop runs until the difference between the previous\n * // value and the current value is smaller than epsilon - a rough\n * // meaure of 'close enough'\n * while (Math.abs(x_new - x_old) > ss.epsilon) {\n * x_old = x_new;\n * x_new = x_old - stepSize * fDerivative(x_old);\n * }\n *\n * console.log('Local minimum occurs at', x_new);\n */\nconst epsilon = 0.0001;\n\nexport default epsilon;\n", "/**\n * Relative error.\n *\n * This is more difficult to calculate than it first appears [1,2]. The usual\n * formula for the relative error between an actual value A and an expected\n * value E is `|(A-E)/E|`, but:\n *\n * 1. If the expected value is 0, any other value has infinite relative error,\n * which is counter-intuitive: if the expected voltage is 0, getting 1/10th\n * of a volt doesn't feel like an infinitely large error.\n *\n * 2. This formula does not satisfy the mathematical definition of a metric [3].\n * [4] solved this problem by defining the relative error as `|ln(|A/E|)|`,\n * but that formula only works if all values are positive: for example, it\n * reports the relative error of -10 and 10 as 0.\n *\n * Our implementation sticks with convention and returns:\n *\n * - 0 if the actual and expected values are both zero\n * - Infinity if the actual value is non-zero and the expected value is zero\n * - `|(A-E)/E|` in all other cases\n *\n * [1] https://math.stackexchange.com/questions/677852/how-to-calculate-relative-error-when-true-value-is-zero\n * [2] https://en.wikipedia.org/wiki/Relative_change_and_difference\n * [3] https://en.wikipedia.org/wiki/Metric_(mathematics)#Definition\n * [4] F.W.J. Olver: \"A New Approach to Error Arithmetic.\" SIAM Journal on\n * Numerical Analysis, 15(2), 1978, 10.1137/0715024.\n *\n * @param {number} actual The actual value.\n * @param {number} expected The expected value.\n * @return {number} The relative error.\n */\nfunction relativeError(actual, expected) {\n // These lines are actually covered by tests, but it seems\n // like c8 has a bug that marks them as not covered.\n /* c8 ignore start */\n if (actual === 0 && expected === 0) {\n return 0;\n }\n /* c8 ignore end */\n return Math.abs((actual - expected) / expected);\n}\n\nexport default relativeError;\n", "import epsilon from \"./epsilon.js\";\nimport relativeError from \"./relative_error.js\";\n\n/**\n * Approximate equality.\n *\n * @param {number} actual The value to be tested.\n * @param {number} expected The reference value.\n * @param {number} tolerance The acceptable relative difference.\n * @return {boolean} Whether numbers are within tolerance.\n */\nfunction approxEqual(actual, expected, tolerance = epsilon) {\n return relativeError(actual, expected) <= tolerance;\n}\n\nexport default approxEqual;\n", "/**\n * [Bayesian Classifier](http://en.wikipedia.org/wiki/Naive_Bayes_classifier)\n *\n * This is a naïve bayesian classifier that takes\n * singly-nested objects.\n *\n * @class\n * @example\n * var bayes = new BayesianClassifier();\n * bayes.train({\n * species: 'Cat'\n * }, 'animal');\n * var result = bayes.score({\n * species: 'Cat'\n * })\n * // result\n * // {\n * // animal: 1\n * // }\n */\nclass BayesianClassifier {\n /*:: totalCount: number */\n /*:: data: Object */\n constructor() {\n // The number of items that are currently\n // classified in the model\n this.totalCount = 0;\n // Every item classified in the model\n this.data = {};\n }\n\n /**\n * Train the classifier with a new item, which has a single\n * dimension of Javascript literal keys and values.\n *\n * @param {Object} item an object with singly-deep properties\n * @param {string} category the category this item belongs to\n * @return {undefined} adds the item to the classifier\n */\n train(item, category) {\n // If the data object doesn't have any values\n // for this category, create a new object for it.\n if (!this.data[category]) {\n this.data[category] = {};\n }\n\n // Iterate through each key in the item.\n for (const k in item) {\n const v = item[k];\n // Initialize the nested object `data[category][k][item[k]]`\n // with an object of keys that equal 0.\n if (this.data[category][k] === undefined) {\n this.data[category][k] = {};\n }\n if (this.data[category][k][v] === undefined) {\n this.data[category][k][v] = 0;\n }\n\n // And increment the key for this key/value combination.\n this.data[category][k][v]++;\n }\n\n // Increment the number of items classified\n this.totalCount++;\n }\n\n /**\n * Generate a score of how well this item matches all\n * possible categories based on its attributes\n *\n * @param {Object} item an item in the same format as with train\n * @returns {Object} of probabilities that this item belongs to a\n * given category.\n */\n score(item) {\n // Initialize an empty array of odds per category.\n const odds = {};\n let category;\n // Iterate through each key in the item,\n // then iterate through each category that has been used\n // in previous calls to `.train()`\n for (const k in item) {\n const v = item[k];\n for (category in this.data) {\n // Create an empty object for storing key - value combinations\n // for this category.\n odds[category] = {};\n\n // If this item doesn't even have a property, it counts for nothing,\n // but if it does have the property that we're looking for from\n // the item to categorize, it counts based on how popular it is\n // versus the whole population.\n if (this.data[category][k]) {\n odds[category][k + \"_\" + v] =\n (this.data[category][k][v] || 0) / this.totalCount;\n } else {\n odds[category][k + \"_\" + v] = 0;\n }\n }\n }\n\n // Set up a new object that will contain sums of these odds by category\n const oddsSums = {};\n\n for (category in odds) {\n // Tally all of the odds for each category-combination pair -\n // the non-existence of a category does not add anything to the\n // score.\n oddsSums[category] = 0;\n for (const combination in odds[category]) {\n oddsSums[category] += odds[category][combination];\n }\n }\n\n return oddsSums;\n }\n}\n\nexport default BayesianClassifier;\n", "/**\n * The [Bernoulli distribution](http://en.wikipedia.org/wiki/Bernoulli_distribution)\n * is the probability discrete\n * distribution of a random variable which takes value 1 with success\n * probability `p` and value 0 with failure\n * probability `q` = 1 - `p`. It can be used, for example, to represent the\n * toss of a coin, where \"1\" is defined to mean \"heads\" and \"0\" is defined\n * to mean \"tails\" (or vice versa). It is\n * a special case of a Binomial Distribution\n * where `n` = 1.\n *\n * @param {number} p input value, between 0 and 1 inclusive\n * @returns {number[]} values of bernoulli distribution at this point\n * @throws {Error} if p is outside 0 and 1\n * @example\n * bernoulliDistribution(0.3); // => [0.7, 0.3]\n */\nfunction bernoulliDistribution(p) /*: number[] */ {\n // Check that `p` is a valid probability (0 ≤ p ≤ 1)\n if (p < 0 || p > 1) {\n throw new Error(\n \"bernoulliDistribution requires probability to be between 0 and 1 inclusive\"\n );\n }\n\n return [1 - p, p];\n}\n\nexport default bernoulliDistribution;\n", "import epsilon from \"./epsilon.js\";\n\n/**\n * The [Binomial Distribution](http://en.wikipedia.org/wiki/Binomial_distribution) is the discrete probability\n * distribution of the number of successes in a sequence of n independent yes/no experiments, each of which yields\n * success with probability `probability`. Such a success/failure experiment is also called a Bernoulli experiment or\n * Bernoulli trial; when trials = 1, the Binomial Distribution is a Bernoulli Distribution.\n *\n * @param {number} trials number of trials to simulate\n * @param {number} probability\n * @returns {number[]} output\n */\nfunction binomialDistribution(trials, probability) /*: ?number[] */ {\n // Check that `p` is a valid probability (0 ≤ p ≤ 1),\n // that `n` is an integer, strictly positive.\n if (probability < 0 || probability > 1 || trials <= 0 || trials % 1 !== 0) {\n return undefined;\n }\n\n // We initialize `x`, the random variable, and `accumulator`, an accumulator\n // for the cumulative distribution function to 0. `distribution_functions`\n // is the object we'll return with the `probability_of_x` and the\n // `cumulativeProbability_of_x`, as well as the calculated mean &\n // variance. We iterate until the `cumulativeProbability_of_x` is\n // within `epsilon` of 1.0.\n let x = 0;\n let cumulativeProbability = 0;\n const cells = [];\n let binomialCoefficient = 1;\n\n // This algorithm iterates through each potential outcome,\n // until the `cumulativeProbability` is very close to 1, at\n // which point we've defined the vast majority of outcomes\n do {\n // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n cells[x] =\n binomialCoefficient *\n Math.pow(probability, x) *\n Math.pow(1 - probability, trials - x);\n cumulativeProbability += cells[x];\n x++;\n binomialCoefficient = (binomialCoefficient * (trials - x + 1)) / x;\n // when the cumulativeProbability is nearly 1, we've calculated\n // the useful range of this distribution\n } while (cumulativeProbability < 1 - epsilon);\n\n return cells;\n}\n\nexport default binomialDistribution;\n", "/**\n * [Sign](https://en.wikipedia.org/wiki/Sign_function) is a function\n * that extracts the sign of a real number\n *\n * @param {number} x input value\n * @returns {number} sign value either 1, 0 or -1\n * @throws {TypeError} if the input argument x is not a number\n * @private\n *\n * @example\n * sign(2); // => 1\n */\nfunction sign(x) {\n if (typeof x === \"number\") {\n if (x < 0) {\n return -1;\n } else if (x === 0) {\n return 0;\n } else {\n return 1;\n }\n } else {\n throw new TypeError(\"not a number\");\n }\n}\n\nexport default sign;\n", "import sign from \"./sign.js\";\n\n/**\n * [Bisection method](https://en.wikipedia.org/wiki/Bisection_method) is a root-finding\n * method that repeatedly bisects an interval to find the root.\n *\n * This function returns a numerical approximation to the exact value.\n *\n * @param {Function} func input function\n * @param {number} start - start of interval\n * @param {number} end - end of interval\n * @param {number} maxIterations - the maximum number of iterations\n * @param {number} errorTolerance - the error tolerance\n * @returns {number} estimated root value\n * @throws {TypeError} Argument func must be a function\n *\n * @example\n * bisect(Math.cos,0,4,100,0.003); // => 1.572265625\n */\nfunction bisect(func, start, end, maxIterations, errorTolerance) {\n if (typeof func !== \"function\")\n throw new TypeError(\"func must be a function\");\n\n for (let i = 0; i < maxIterations; i++) {\n const output = (start + end) / 2;\n\n if (\n func(output) === 0 ||\n Math.abs((end - start) / 2) < errorTolerance\n ) {\n return output;\n }\n\n if (sign(func(output)) === sign(func(start))) {\n start = output;\n } else {\n end = output;\n }\n }\n\n throw new Error(\"maximum number of iterations exceeded\");\n}\n\nexport default bisect;\n", "/**\n * **Percentage Points of the χ2 (Chi-Squared) Distribution**\n *\n * The [χ2 (Chi-Squared) Distribution](http://en.wikipedia.org/wiki/Chi-squared_distribution) is used in the common\n * chi-squared tests for goodness of fit of an observed distribution to a theoretical one, the independence of two\n * criteria of classification of qualitative data, and in confidence interval estimation for a population standard\n * deviation of a normal distribution from a sample standard deviation.\n *\n * Values from Appendix 1, Table III of William W. Hines & Douglas C. Montgomery, \"Probability and Statistics in\n * Engineering and Management Science\", Wiley (1980).\n */\nconst chiSquaredDistributionTable = {\n 1: {\n 0.995: 0,\n 0.99: 0,\n 0.975: 0,\n 0.95: 0,\n 0.9: 0.02,\n 0.5: 0.45,\n 0.1: 2.71,\n 0.05: 3.84,\n 0.025: 5.02,\n 0.01: 6.63,\n 0.005: 7.88\n },\n 2: {\n 0.995: 0.01,\n 0.99: 0.02,\n 0.975: 0.05,\n 0.95: 0.1,\n 0.9: 0.21,\n 0.5: 1.39,\n 0.1: 4.61,\n 0.05: 5.99,\n 0.025: 7.38,\n 0.01: 9.21,\n 0.005: 10.6\n },\n 3: {\n 0.995: 0.07,\n 0.99: 0.11,\n 0.975: 0.22,\n 0.95: 0.35,\n 0.9: 0.58,\n 0.5: 2.37,\n 0.1: 6.25,\n 0.05: 7.81,\n 0.025: 9.35,\n 0.01: 11.34,\n 0.005: 12.84\n },\n 4: {\n 0.995: 0.21,\n 0.99: 0.3,\n 0.975: 0.48,\n 0.95: 0.71,\n 0.9: 1.06,\n 0.5: 3.36,\n 0.1: 7.78,\n 0.05: 9.49,\n 0.025: 11.14,\n 0.01: 13.28,\n 0.005: 14.86\n },\n 5: {\n 0.995: 0.41,\n 0.99: 0.55,\n 0.975: 0.83,\n 0.95: 1.15,\n 0.9: 1.61,\n 0.5: 4.35,\n 0.1: 9.24,\n 0.05: 11.07,\n 0.025: 12.83,\n 0.01: 15.09,\n 0.005: 16.75\n },\n 6: {\n 0.995: 0.68,\n 0.99: 0.87,\n 0.975: 1.24,\n 0.95: 1.64,\n 0.9: 2.2,\n 0.5: 5.35,\n 0.1: 10.65,\n 0.05: 12.59,\n 0.025: 14.45,\n 0.01: 16.81,\n 0.005: 18.55\n },\n 7: {\n 0.995: 0.99,\n 0.99: 1.25,\n 0.975: 1.69,\n 0.95: 2.17,\n 0.9: 2.83,\n 0.5: 6.35,\n 0.1: 12.02,\n 0.05: 14.07,\n 0.025: 16.01,\n 0.01: 18.48,\n 0.005: 20.28\n },\n 8: {\n 0.995: 1.34,\n 0.99: 1.65,\n 0.975: 2.18,\n 0.95: 2.73,\n 0.9: 3.49,\n 0.5: 7.34,\n 0.1: 13.36,\n 0.05: 15.51,\n 0.025: 17.53,\n 0.01: 20.09,\n 0.005: 21.96\n },\n 9: {\n 0.995: 1.73,\n 0.99: 2.09,\n 0.975: 2.7,\n 0.95: 3.33,\n 0.9: 4.17,\n 0.5: 8.34,\n 0.1: 14.68,\n 0.05: 16.92,\n 0.025: 19.02,\n 0.01: 21.67,\n 0.005: 23.59\n },\n 10: {\n 0.995: 2.16,\n 0.99: 2.56,\n 0.975: 3.25,\n 0.95: 3.94,\n 0.9: 4.87,\n 0.5: 9.34,\n 0.1: 15.99,\n 0.05: 18.31,\n 0.025: 20.48,\n 0.01: 23.21,\n 0.005: 25.19\n },\n 11: {\n 0.995: 2.6,\n 0.99: 3.05,\n 0.975: 3.82,\n 0.95: 4.57,\n 0.9: 5.58,\n 0.5: 10.34,\n 0.1: 17.28,\n 0.05: 19.68,\n 0.025: 21.92,\n 0.01: 24.72,\n 0.005: 26.76\n },\n 12: {\n 0.995: 3.07,\n 0.99: 3.57,\n 0.975: 4.4,\n 0.95: 5.23,\n 0.9: 6.3,\n 0.5: 11.34,\n 0.1: 18.55,\n 0.05: 21.03,\n 0.025: 23.34,\n 0.01: 26.22,\n 0.005: 28.3\n },\n 13: {\n 0.995: 3.57,\n 0.99: 4.11,\n 0.975: 5.01,\n 0.95: 5.89,\n 0.9: 7.04,\n 0.5: 12.34,\n 0.1: 19.81,\n 0.05: 22.36,\n 0.025: 24.74,\n 0.01: 27.69,\n 0.005: 29.82\n },\n 14: {\n 0.995: 4.07,\n 0.99: 4.66,\n 0.975: 5.63,\n 0.95: 6.57,\n 0.9: 7.79,\n 0.5: 13.34,\n 0.1: 21.06,\n 0.05: 23.68,\n 0.025: 26.12,\n 0.01: 29.14,\n 0.005: 31.32\n },\n 15: {\n 0.995: 4.6,\n 0.99: 5.23,\n 0.975: 6.27,\n 0.95: 7.26,\n 0.9: 8.55,\n 0.5: 14.34,\n 0.1: 22.31,\n 0.05: 25,\n 0.025: 27.49,\n 0.01: 30.58,\n 0.005: 32.8\n },\n 16: {\n 0.995: 5.14,\n 0.99: 5.81,\n 0.975: 6.91,\n 0.95: 7.96,\n 0.9: 9.31,\n 0.5: 15.34,\n 0.1: 23.54,\n 0.05: 26.3,\n 0.025: 28.85,\n 0.01: 32,\n 0.005: 34.27\n },\n 17: {\n 0.995: 5.7,\n 0.99: 6.41,\n 0.975: 7.56,\n 0.95: 8.67,\n 0.9: 10.09,\n 0.5: 16.34,\n 0.1: 24.77,\n 0.05: 27.59,\n 0.025: 30.19,\n 0.01: 33.41,\n 0.005: 35.72\n },\n 18: {\n 0.995: 6.26,\n 0.99: 7.01,\n 0.975: 8.23,\n 0.95: 9.39,\n 0.9: 10.87,\n 0.5: 17.34,\n 0.1: 25.99,\n 0.05: 28.87,\n 0.025: 31.53,\n 0.01: 34.81,\n 0.005: 37.16\n },\n 19: {\n 0.995: 6.84,\n 0.99: 7.63,\n 0.975: 8.91,\n 0.95: 10.12,\n 0.9: 11.65,\n 0.5: 18.34,\n 0.1: 27.2,\n 0.05: 30.14,\n 0.025: 32.85,\n 0.01: 36.19,\n 0.005: 38.58\n },\n 20: {\n 0.995: 7.43,\n 0.99: 8.26,\n 0.975: 9.59,\n 0.95: 10.85,\n 0.9: 12.44,\n 0.5: 19.34,\n 0.1: 28.41,\n 0.05: 31.41,\n 0.025: 34.17,\n 0.01: 37.57,\n 0.005: 40\n },\n 21: {\n 0.995: 8.03,\n 0.99: 8.9,\n 0.975: 10.28,\n 0.95: 11.59,\n 0.9: 13.24,\n 0.5: 20.34,\n 0.1: 29.62,\n 0.05: 32.67,\n 0.025: 35.48,\n 0.01: 38.93,\n 0.005: 41.4\n },\n 22: {\n 0.995: 8.64,\n 0.99: 9.54,\n 0.975: 10.98,\n 0.95: 12.34,\n 0.9: 14.04,\n 0.5: 21.34,\n 0.1: 30.81,\n 0.05: 33.92,\n 0.025: 36.78,\n 0.01: 40.29,\n 0.005: 42.8\n },\n 23: {\n 0.995: 9.26,\n 0.99: 10.2,\n 0.975: 11.69,\n 0.95: 13.09,\n 0.9: 14.85,\n 0.5: 22.34,\n 0.1: 32.01,\n 0.05: 35.17,\n 0.025: 38.08,\n 0.01: 41.64,\n 0.005: 44.18\n },\n 24: {\n 0.995: 9.89,\n 0.99: 10.86,\n 0.975: 12.4,\n 0.95: 13.85,\n 0.9: 15.66,\n 0.5: 23.34,\n 0.1: 33.2,\n 0.05: 36.42,\n 0.025: 39.36,\n 0.01: 42.98,\n 0.005: 45.56\n },\n 25: {\n 0.995: 10.52,\n 0.99: 11.52,\n 0.975: 13.12,\n 0.95: 14.61,\n 0.9: 16.47,\n 0.5: 24.34,\n 0.1: 34.28,\n 0.05: 37.65,\n 0.025: 40.65,\n 0.01: 44.31,\n 0.005: 46.93\n },\n 26: {\n 0.995: 11.16,\n 0.99: 12.2,\n 0.975: 13.84,\n 0.95: 15.38,\n 0.9: 17.29,\n 0.5: 25.34,\n 0.1: 35.56,\n 0.05: 38.89,\n 0.025: 41.92,\n 0.01: 45.64,\n 0.005: 48.29\n },\n 27: {\n 0.995: 11.81,\n 0.99: 12.88,\n 0.975: 14.57,\n 0.95: 16.15,\n 0.9: 18.11,\n 0.5: 26.34,\n 0.1: 36.74,\n 0.05: 40.11,\n 0.025: 43.19,\n 0.01: 46.96,\n 0.005: 49.65\n },\n 28: {\n 0.995: 12.46,\n 0.99: 13.57,\n 0.975: 15.31,\n 0.95: 16.93,\n 0.9: 18.94,\n 0.5: 27.34,\n 0.1: 37.92,\n 0.05: 41.34,\n 0.025: 44.46,\n 0.01: 48.28,\n 0.005: 50.99\n },\n 29: {\n 0.995: 13.12,\n 0.99: 14.26,\n 0.975: 16.05,\n 0.95: 17.71,\n 0.9: 19.77,\n 0.5: 28.34,\n 0.1: 39.09,\n 0.05: 42.56,\n 0.025: 45.72,\n 0.01: 49.59,\n 0.005: 52.34\n },\n 30: {\n 0.995: 13.79,\n 0.99: 14.95,\n 0.975: 16.79,\n 0.95: 18.49,\n 0.9: 20.6,\n 0.5: 29.34,\n 0.1: 40.26,\n 0.05: 43.77,\n 0.025: 46.98,\n 0.01: 50.89,\n 0.005: 53.67\n },\n 40: {\n 0.995: 20.71,\n 0.99: 22.16,\n 0.975: 24.43,\n 0.95: 26.51,\n 0.9: 29.05,\n 0.5: 39.34,\n 0.1: 51.81,\n 0.05: 55.76,\n 0.025: 59.34,\n 0.01: 63.69,\n 0.005: 66.77\n },\n 50: {\n 0.995: 27.99,\n 0.99: 29.71,\n 0.975: 32.36,\n 0.95: 34.76,\n 0.9: 37.69,\n 0.5: 49.33,\n 0.1: 63.17,\n 0.05: 67.5,\n 0.025: 71.42,\n 0.01: 76.15,\n 0.005: 79.49\n },\n 60: {\n 0.995: 35.53,\n 0.99: 37.48,\n 0.975: 40.48,\n 0.95: 43.19,\n 0.9: 46.46,\n 0.5: 59.33,\n 0.1: 74.4,\n 0.05: 79.08,\n 0.025: 83.3,\n 0.01: 88.38,\n 0.005: 91.95\n },\n 70: {\n 0.995: 43.28,\n 0.99: 45.44,\n 0.975: 48.76,\n 0.95: 51.74,\n 0.9: 55.33,\n 0.5: 69.33,\n 0.1: 85.53,\n 0.05: 90.53,\n 0.025: 95.02,\n 0.01: 100.42,\n 0.005: 104.22\n },\n 80: {\n 0.995: 51.17,\n 0.99: 53.54,\n 0.975: 57.15,\n 0.95: 60.39,\n 0.9: 64.28,\n 0.5: 79.33,\n 0.1: 96.58,\n 0.05: 101.88,\n 0.025: 106.63,\n 0.01: 112.33,\n 0.005: 116.32\n },\n 90: {\n 0.995: 59.2,\n 0.99: 61.75,\n 0.975: 65.65,\n 0.95: 69.13,\n 0.9: 73.29,\n 0.5: 89.33,\n 0.1: 107.57,\n 0.05: 113.14,\n 0.025: 118.14,\n 0.01: 124.12,\n 0.005: 128.3\n },\n 100: {\n 0.995: 67.33,\n 0.99: 70.06,\n 0.975: 74.22,\n 0.95: 77.93,\n 0.9: 82.36,\n 0.5: 99.33,\n 0.1: 118.5,\n 0.05: 124.34,\n 0.025: 129.56,\n 0.01: 135.81,\n 0.005: 140.17\n }\n};\n\nexport default chiSquaredDistributionTable;\n", "import chiSquaredDistributionTable from \"./chi_squared_distribution_table.js\";\nimport mean from \"./mean.js\";\n\n/**\n * The [χ2 (Chi-Squared) Goodness-of-Fit Test](http://en.wikipedia.org/wiki/Goodness_of_fit#Pearson.27s_chi-squared_test)\n * uses a measure of goodness of fit which is the sum of differences between observed and expected outcome frequencies\n * (that is, counts of observations), each squared and divided by the number of observations expected given the\n * hypothesized distribution. The resulting χ2 statistic, `chiSquared`, can be compared to the chi-squared distribution\n * to determine the goodness of fit. In order to determine the degrees of freedom of the chi-squared distribution, one\n * takes the total number of observed frequencies and subtracts the number of estimated parameters. The test statistic\n * follows, approximately, a chi-square distribution with (k − c) degrees of freedom where `k` is the number of non-empty\n * cells and `c` is the number of estimated parameters for the distribution.\n *\n * @param {Array<number>} data\n * @param {Function} distributionType a function that returns a point in a distribution:\n * for instance, binomial, bernoulli, or poisson\n * @param {number} significance\n * @returns {number} chi squared goodness of fit\n * @example\n * // Data from Poisson goodness-of-fit example 10-19 in William W. Hines & Douglas C. Montgomery,\n * // \"Probability and Statistics in Engineering and Management Science\", Wiley (1980).\n * var data1019 = [\n * 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n * 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n * 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n * 2, 2, 2, 2, 2, 2, 2, 2, 2,\n * 3, 3, 3, 3\n * ];\n * ss.chiSquaredGoodnessOfFit(data1019, ss.poissonDistribution, 0.05); //= false\n */\nfunction chiSquaredGoodnessOfFit(data, distributionType, significance) {\n // Estimate from the sample data, a weighted mean.\n const inputMean = mean(data);\n // Calculated value of the χ2 statistic.\n let chiSquared = 0;\n // Number of hypothesized distribution parameters estimated, expected to be supplied in the distribution test.\n // Lose one degree of freedom for estimating `lambda` from the sample data.\n const c = 1;\n // The hypothesized distribution.\n // Generate the hypothesized distribution.\n const hypothesizedDistribution = distributionType(inputMean);\n const observedFrequencies = [];\n const expectedFrequencies = [];\n\n // Create an array holding a histogram from the sample data, of\n // the form `{ value: numberOfOcurrences }`\n for (let i = 0; i < data.length; i++) {\n if (observedFrequencies[data[i]] === undefined) {\n observedFrequencies[data[i]] = 0;\n }\n observedFrequencies[data[i]]++;\n }\n\n // The histogram we created might be sparse - there might be gaps\n // between values. So we iterate through the histogram, making\n // sure that instead of undefined, gaps have 0 values.\n for (let i = 0; i < observedFrequencies.length; i++) {\n if (observedFrequencies[i] === undefined) {\n observedFrequencies[i] = 0;\n }\n }\n\n // Create an array holding a histogram of expected data given the\n // sample size and hypothesized distribution.\n for (const k in hypothesizedDistribution) {\n if (k in observedFrequencies) {\n expectedFrequencies[+k] = hypothesizedDistribution[k] * data.length;\n }\n }\n\n // Working backward through the expected frequencies, collapse classes\n // if less than three observations are expected for a class.\n // This transformation is applied to the observed frequencies as well.\n for (let k = expectedFrequencies.length - 1; k >= 0; k--) {\n if (expectedFrequencies[k] < 3) {\n expectedFrequencies[k - 1] += expectedFrequencies[k];\n expectedFrequencies.pop();\n\n observedFrequencies[k - 1] += observedFrequencies[k];\n observedFrequencies.pop();\n }\n }\n\n // Iterate through the squared differences between observed & expected\n // frequencies, accumulating the `chiSquared` statistic.\n for (let k = 0; k < observedFrequencies.length; k++) {\n chiSquared +=\n Math.pow(observedFrequencies[k] - expectedFrequencies[k], 2) /\n expectedFrequencies[k];\n }\n\n // Calculate degrees of freedom for this test and look it up in the\n // `chiSquaredDistributionTable` in order to\n // accept or reject the goodness-of-fit of the hypothesized distribution.\n // Degrees of freedom, calculated as (number of class intervals -\n // number of hypothesized distribution parameters estimated - 1)\n const degreesOfFreedom = observedFrequencies.length - c - 1;\n return (\n chiSquaredDistributionTable[degreesOfFreedom][significance] < chiSquared\n );\n}\n\nexport default chiSquaredGoodnessOfFit;\n", "/**\n * **[Logistic Cumulative Distribution Function](https://en.wikipedia.org/wiki/Logistic_distribution)**\n *\n * @param {number} x\n * @returns {number} cumulative standard logistic probability\n */\nfunction cumulativeStdLogisticProbability(x) {\n return 1 / (Math.exp(-x) + 1);\n}\n\nexport default cumulativeStdLogisticProbability;\n", "const SQRT_2PI = Math.sqrt(2 * Math.PI);\n\nfunction cumulativeDistribution(z) {\n let sum = z;\n let tmp = z;\n\n // 15 iterations are enough for 4-digit precision\n for (let i = 1; i < 15; i++) {\n tmp *= (z * z) / (2 * i + 1);\n sum += tmp;\n }\n return (\n Math.round((0.5 + (sum / SQRT_2PI) * Math.exp((-z * z) / 2)) * 1e4) /\n 1e4\n );\n}\n\n/**\n * A standard normal table, also called the unit normal table or Z table,\n * is a mathematical table for the values of Φ (phi), which are the values of\n * the [cumulative distribution function](https://en.wikipedia.org/wiki/Normal_distribution#Cumulative_distribution_function)\n * of the normal distribution. It is used to find the probability that a\n * statistic is observed below, above, or between values on the standard\n * normal distribution, and by extension, any normal distribution.\n */\nconst standardNormalTable = [];\n\nfor (let z = 0; z <= 3.09; z += 0.01) {\n standardNormalTable.push(cumulativeDistribution(z));\n}\n\nexport default standardNormalTable;\n", "import standardNormalTable from \"./standard_normal_table.js\";\n\n/**\n * **[Cumulative Standard Normal Probability](http://en.wikipedia.org/wiki/Standard_normal_table)**\n *\n * Since probability tables cannot be\n * printed for every normal distribution, as there are an infinite variety\n * of normal distributions, it is common practice to convert a normal to a\n * standard normal and then use the standard normal table to find probabilities.\n *\n * You can use `.5 + .5 * errorFunction(x / Math.sqrt(2))` to calculate the probability\n * instead of looking it up in a table.\n *\n * @param {number} z\n * @returns {number} cumulative standard normal probability\n */\nfunction cumulativeStdNormalProbability(z) {\n // Calculate the position of this value.\n const absZ = Math.abs(z);\n // Each row begins with a different\n // significant digit: 0.5, 0.6, 0.7, and so on. Each value in the table\n // corresponds to a range of 0.01 in the input values, so the value is\n // multiplied by 100.\n const index = Math.min(\n Math.round(absZ * 100),\n standardNormalTable.length - 1\n );\n\n // The index we calculate must be in the table as a positive value,\n // but we still pay attention to whether the input is positive\n // or negative, and flip the output value as a last step.\n if (z >= 0) {\n return standardNormalTable[index];\n } else {\n // due to floating-point arithmetic, values in the table with\n // 4 significant figures can nevertheless end up as repeating\n // fractions when they're computed here.\n return Math.round((1 - standardNormalTable[index]) * 1e4) / 1e4;\n }\n}\n\nexport default cumulativeStdNormalProbability;\n", "/**\n * **[Gaussian error function](http://en.wikipedia.org/wiki/Error_function)**\n *\n * The `errorFunction(x/(sd * Math.sqrt(2)))` is the probability that a value in a\n * normal distribution with standard deviation sd is within x of the mean.\n *\n * This function returns a numerical approximation to the exact value.\n * It uses Horner's method to evaluate the polynomial of τ (tau).\n *\n * @param {number} x input\n * @return {number} error estimation\n * @example\n * errorFunction(1).toFixed(2); // => '0.84'\n */\nfunction errorFunction(x) {\n const t = 1 / (1 + 0.5 * Math.abs(x));\n const tau =\n t *\n Math.exp(\n -x * x +\n ((((((((0.17087277 * t - 0.82215223) * t + 1.48851587) * t -\n 1.13520398) *\n t +\n 0.27886807) *\n t -\n 0.18628806) *\n t +\n 0.09678418) *\n t +\n 0.37409196) *\n t +\n 1.00002368) *\n t -\n 1.26551223\n );\n if (x >= 0) {\n return 1 - tau;\n } else {\n return tau - 1;\n }\n}\n\nexport default errorFunction;\n", "/**\n * A [Factorial](https://en.wikipedia.org/wiki/Factorial), usually written n!, is the product of all positive\n * integers less than or equal to n. Often factorial is implemented\n * recursively, but this iterative approach is significantly faster\n * and simpler.\n *\n * @param {number} n input, must be an integer number 1 or greater\n * @returns {number} factorial: n!\n * @throws {Error} if n is less than 0 or not an integer\n * @example\n * factorial(5); // => 120\n */\nfunction factorial(n) {\n // factorial is mathematically undefined for negative numbers\n if (n < 0) {\n throw new Error(\"factorial requires a non-negative value\");\n }\n\n if (Math.floor(n) !== n) {\n throw new Error(\"factorial requires an integer input\");\n }\n\n // typically you'll expand the factorial function going down, like\n // 5! = 5 * 4 * 3 * 2 * 1. This is going in the opposite direction,\n // counting from 2 up to the number in question, and since anything\n // multiplied by 1 is itself, the loop only needs to start at 2.\n let accumulator = 1;\n for (let i = 2; i <= n; i++) {\n // for each number up to and including the number `n`, multiply\n // the accumulator my that number.\n accumulator *= i;\n }\n return accumulator;\n}\n\nexport default factorial;\n", "import factorial from \"./factorial.js\";\n\n/**\n * Compute the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Nemes' approximation.\n * The gamma of n is equivalent to (n-1)!, but unlike the factorial function, gamma is defined for all real n except zero\n * and negative integers (where NaN is returned). Note, the gamma function is also well-defined for complex numbers,\n * though this implementation currently does not handle complex numbers as input values.\n * Nemes' approximation is defined [here](https://arxiv.org/abs/1003.6020) as Theorem 2.2.\n * Negative values use [Euler's reflection formula](https://en.wikipedia.org/wiki/Gamma_function#Properties) for computation.\n *\n * @param {number} n Any real number except for zero and negative integers.\n * @returns {number} The gamma of the input value.\n *\n * @example\n * gamma(11.5); // 11899423.084037038\n * gamma(-11.5); // 2.29575810481609e-8\n * gamma(5); // 24\n */\nfunction gamma(n) {\n if (Number.isInteger(n)) {\n if (n <= 0) {\n // gamma not defined for zero or negative integers\n return Number.NaN;\n } else {\n // use factorial for integer inputs\n return factorial(n - 1);\n }\n }\n\n // Decrement n, because approximation is defined for n - 1\n n--;\n\n if (n < 0) {\n // Use Euler's reflection formula for negative inputs\n // see: https://en.wikipedia.org/wiki/Gamma_function#Properties\n return Math.PI / (Math.sin(Math.PI * -n) * gamma(-n));\n } else {\n // Nemes' expansion approximation\n const seriesCoefficient =\n Math.pow(n / Math.E, n) * Math.sqrt(2 * Math.PI * (n + 1 / 6));\n\n const seriesDenom = n + 1 / 4;\n\n const seriesExpansion =\n 1 +\n 1 / 144 / Math.pow(seriesDenom, 2) -\n 1 / 12960 / Math.pow(seriesDenom, 3) -\n 257 / 207360 / Math.pow(seriesDenom, 4) -\n 52 / 2612736 / Math.pow(seriesDenom, 5) +\n 5741173 / 9405849600 / Math.pow(seriesDenom, 6) +\n 37529 / 18811699200 / Math.pow(seriesDenom, 7);\n\n return seriesCoefficient * seriesExpansion;\n }\n}\n\nexport default gamma;\n", "// Define series coefficients\nconst COEFFICIENTS = [\n 0.99999999999999709182, 57.156235665862923517, -59.597960355475491248,\n 14.136097974741747174, -0.49191381609762019978, 0.33994649984811888699e-4,\n 0.46523628927048575665e-4, -0.98374475304879564677e-4,\n 0.15808870322491248884e-3, -0.21026444172410488319e-3,\n 0.2174396181152126432e-3, -0.16431810653676389022e-3,\n 0.84418223983852743293e-4, -0.2619083840158140867e-4,\n 0.36899182659531622704e-5\n];\n\nconst g = 607 / 128;\nconst LOGSQRT2PI = Math.log(Math.sqrt(2 * Math.PI));\n\n/**\n * Compute the logarithm of the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Lanczos' approximation.\n * This function takes as input any real-value n greater than 0.\n * This function is useful for values of n too large for the normal gamma function (n > 165).\n * The code is based on Lanczo's Gamma approximation, defined [here](http://my.fit.edu/~gabdo/gamma.txt).\n *\n * @param {number} n Any real number greater than zero.\n * @returns {number} The logarithm of gamma of the input value.\n *\n * @example\n * gammaln(500); // 2605.1158503617335\n * gammaln(2.4); // 0.21685932244884043\n */\nfunction gammaln(n) {\n // Return infinity if value not in domain\n if (n <= 0) {\n return Number.POSITIVE_INFINITY;\n }\n\n // Decrement n, because approximation is defined for n - 1\n n--;\n\n // Create series approximation\n let a = COEFFICIENTS[0];\n\n for (let i = 1; i < 15; i++) {\n a += COEFFICIENTS[i] / (n + i);\n }\n\n const tmp = g + 0.5 + n;\n\n // Return natural logarithm of gamma(n)\n return LOGSQRT2PI + Math.log(a) - tmp + (n + 0.5) * Math.log(tmp);\n}\n\nexport default gammaln;\n", "/**\n * The Inverse [Gaussian error function](http://en.wikipedia.org/wiki/Error_function)\n * returns a numerical approximation to the value that would have caused\n * `errorFunction()` to return x.\n *\n * @param {number} x value of error function\n * @returns {number} estimated inverted value\n */\nfunction inverseErrorFunction(x) {\n const a = (8 * (Math.PI - 3)) / (3 * Math.PI * (4 - Math.PI));\n\n const inv = Math.sqrt(\n Math.sqrt(\n Math.pow(2 / (Math.PI * a) + Math.log(1 - x * x) / 2, 2) -\n Math.log(1 - x * x) / a\n ) -\n (2 / (Math.PI * a) + Math.log(1 - x * x) / 2)\n );\n\n if (x >= 0) {\n return inv;\n } else {\n return -inv;\n }\n}\n\nexport default inverseErrorFunction;\n", "/**\n * Calculate Euclidean distance between two points.\n * @param {Array<number>} left First N-dimensional point.\n * @param {Array<number>} right Second N-dimensional point.\n * @returns {number} Distance.\n */\nfunction euclideanDistance(left, right) {\n let sum = 0;\n for (let i = 0; i < left.length; i++) {\n const diff = left[i] - right[i];\n sum += diff * diff;\n }\n return Math.sqrt(sum);\n}\n\nexport default euclideanDistance;\n", "import euclideanDistance from \"./euclidean_distance.js\";\nimport makeMatrix from \"./make_matrix.js\";\nimport sample from \"./sample.js\";\n\n/**\n * @typedef {Object} kMeansReturn\n * @property {Array<number>} labels The labels.\n * @property {Array<Array<number>>} centroids The cluster centroids.\n */\n\n/**\n * Perform k-means clustering.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points to be clustered.\n * @param {number} numCluster How many clusters to create.\n * @param {Function} randomSource An optional entropy source that generates uniform values in [0, 1).\n * @return {kMeansReturn} Labels (same length as data) and centroids (same length as numCluster).\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n *\n * @example\n * kMeansCluster([[0.0, 0.5], [1.0, 0.5]], 2); // => {labels: [0, 1], centroids: [[0.0, 0.5], [1.0 0.5]]}\n */\nfunction kMeansCluster(points, numCluster, randomSource = Math.random) {\n let oldCentroids = null;\n let newCentroids = sample(points, numCluster, randomSource);\n let labels = null;\n let change = Number.MAX_VALUE;\n while (change !== 0) {\n labels = labelPoints(points, newCentroids);\n oldCentroids = newCentroids;\n newCentroids = calculateCentroids(points, labels, numCluster);\n change = calculateChange(newCentroids, oldCentroids);\n }\n return {\n labels: labels,\n centroids: newCentroids\n };\n}\n\n/**\n * Label each point according to which centroid it is closest to.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<Array<number>>} centroids Current centroids.\n * @return {Array<number>} Group labels.\n */\nfunction labelPoints(points, centroids) {\n return points.map((p) => {\n let minDist = Number.MAX_VALUE;\n let label = -1;\n for (let i = 0; i < centroids.length; i++) {\n const dist = euclideanDistance(p, centroids[i]);\n if (dist < minDist) {\n minDist = dist;\n label = i;\n }\n }\n return label;\n });\n}\n\n/**\n * Calculate centroids for points given labels.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<number>} labels Which groups points belong to.\n * @param {number} numCluster Number of clusters being created.\n * @return {Array<Array<number>>} Centroid for each group.\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n */\nfunction calculateCentroids(points, labels, numCluster) {\n // Initialize accumulators.\n const dimension = points[0].length;\n const centroids = makeMatrix(numCluster, dimension);\n const counts = Array(numCluster).fill(0);\n\n // Add points to centroids' accumulators and count points per centroid.\n const numPoints = points.length;\n for (let i = 0; i < numPoints; i++) {\n const point = points[i];\n const label = labels[i];\n const current = centroids[label];\n for (let j = 0; j < dimension; j++) {\n current[j] += point[j];\n }\n counts[label] += 1;\n }\n\n // Rescale centroids, checking for any that have no points.\n for (let i = 0; i < numCluster; i++) {\n if (counts[i] === 0) {\n throw new Error(`Centroid ${i} has no friends`);\n }\n const centroid = centroids[i];\n for (let j = 0; j < dimension; j++) {\n centroid[j] /= counts[i];\n }\n }\n\n return centroids;\n}\n\n/**\n * Calculate the difference between old centroids and new centroids.\n *\n * @private\n * @param {Array<Array<number>>} left One list of centroids.\n * @param {Array<Array<number>>} right Another list of centroids.\n * @return {number} Distance between centroids.\n */\nfunction calculateChange(left, right) {\n let total = 0;\n for (let i = 0; i < left.length; i++) {\n total += euclideanDistance(left[i], right[i]);\n }\n return total;\n}\n\nexport default kMeansCluster;\n", "import interquartileRange from \"./interquartile_range.js\";\nimport stddev from \"./sample_standard_deviation.js\";\n\nconst SQRT_2PI = Math.sqrt(2 * Math.PI);\n\n/**\n * [Well-known kernels](https://en.wikipedia.org/wiki/Kernel_(statistics)#Kernel_functions_in_common_use)\n * @private\n */\nconst kernels = {\n /**\n * The gaussian kernel.\n * @private\n */\n gaussian: function (u) {\n return Math.exp(-0.5 * u * u) / SQRT_2PI;\n }\n};\n\n/**\n * Well known bandwidth selection methods\n * @private\n */\nconst bandwidthMethods = {\n /**\n * The [\"normal reference distribution\"\n * rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html),\n * a commonly used version of [Silverman's\n * rule-of-thumb](https://en.wikipedia.org/wiki/Kernel_density_estimation#A_rule-of-thumb_bandwidth_estimator).\n * @private\n */\n nrd: function (x) {\n let s = stddev(x);\n const iqr = interquartileRange(x);\n if (typeof iqr === \"number\") {\n s = Math.min(s, iqr / 1.34);\n }\n return 1.06 * s * Math.pow(x.length, -0.2);\n }\n};\n\n/**\n * [Kernel density estimation](https://en.wikipedia.org/wiki/Kernel_density_estimation)\n * is a useful tool for, among other things, estimating the shape of the\n * underlying probability distribution from a sample.\n *\n * @name kernelDensityEstimation\n * @param X sample values\n * @param kernel The kernel function to use. If a function is provided, it should return non-negative values and integrate to 1. Defaults to 'gaussian'.\n * @param bandwidthMethod The \"bandwidth selection\" method to use, or a fixed bandwidth value. Defaults to \"nrd\", the commonly-used [\"normal reference distribution\" rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html).\n * @returns {Function} An estimated [probability density function](https://en.wikipedia.org/wiki/Probability_density_function) for the given sample. The returned function runs in `O(X.length)`.\n */\nfunction kernelDensityEstimation(X, kernel, bandwidthMethod) {\n let kernelFn;\n if (kernel === undefined) {\n kernelFn = kernels.gaussian;\n } else if (typeof kernel === \"string\") {\n if (!kernels[kernel]) {\n throw new Error('Unknown kernel \"' + kernel + '\"');\n }\n kernelFn = kernels[kernel];\n } else {\n kernelFn = kernel;\n }\n\n let bandwidth;\n if (typeof bandwidthMethod === \"undefined\") {\n bandwidth = bandwidthMethods.nrd(X);\n } else if (typeof bandwidthMethod === \"string\") {\n if (!bandwidthMethods[bandwidthMethod]) {\n throw new Error(\n 'Unknown bandwidth method \"' + bandwidthMethod + '\"'\n );\n }\n bandwidth = bandwidthMethods[bandwidthMethod](X);\n } else {\n bandwidth = bandwidthMethod;\n }\n\n return function (x) {\n let i = 0;\n let sum = 0;\n for (i = 0; i < X.length; i++) {\n sum += kernelFn((x - X[i]) / bandwidth);\n }\n return sum / bandwidth / X.length;\n };\n}\n\nexport default kernelDensityEstimation;\n", "/**\n * The [Logit](https://en.wikipedia.org/wiki/Logit)\n * is the inverse of cumulativeStdLogisticProbability,\n * and is also known as the logistic quantile function.\n *\n * @param {number} p\n * @returns {number} logit\n */\nfunction logit(p) {\n if (p <= 0 || p >= 1) {\n throw new Error(\"p must be strictly between zero and one\");\n }\n return Math.log(p / (1 - p));\n}\n\nexport default logit;\n", "/**\n * This is a single-layer [Perceptron Classifier](http://en.wikipedia.org/wiki/Perceptron) that takes\n * arrays of numbers and predicts whether they should be classified\n * as either 0 or 1 (negative or positive examples).\n * @class\n * @example\n * // Create the model\n * var p = new PerceptronModel();\n * // Train the model with input with a diagonal boundary.\n * for (var i = 0; i < 5; i++) {\n * p.train([1, 1], 1);\n * p.train([0, 1], 0);\n * p.train([1, 0], 0);\n * p.train([0, 0], 0);\n * }\n * p.predict([0, 0]); // 0\n * p.predict([0, 1]); // 0\n * p.predict([1, 0]); // 0\n * p.predict([1, 1]); // 1\n */\nclass PerceptronModel {\n /*:: bias: number */\n /*:: weights: Array<number> */\n constructor() {\n // The weights, or coefficients of the model;\n // weights are only populated when training with data.\n this.weights = [];\n // The bias term, or intercept; it is also a weight but\n // it's stored separately for convenience as it is always\n // multiplied by one.\n this.bias = 0;\n }\n /**\n * **Predict**: Use an array of features with the weight array and bias\n * to predict whether an example is labeled 0 or 1.\n *\n * @param {Array<number>} features an array of features as numbers\n * @returns {number} 1 if the score is over 0, otherwise 0\n */\n predict(features) {\n // Only predict if previously trained\n // on the same size feature array(s).\n if (features.length !== this.weights.length) {\n return null;\n }\n\n // Calculate the sum of features times weights,\n // with the bias added (implicitly times one).\n let score = 0;\n for (let i = 0; i < this.weights.length; i++) {\n score += this.weights[i] * features[i];\n }\n score += this.bias;\n\n // Classify as 1 if the score is over 0, otherwise 0.\n if (score > 0) {\n return 1;\n } else {\n return 0;\n }\n }\n\n /**\n * **Train** the classifier with a new example, which is\n * a numeric array of features and a 0 or 1 label.\n *\n * @param {Array<number>} features an array of features as numbers\n * @param {number} label either 0 or 1\n * @returns {PerceptronModel} this\n */\n train(features, label) {\n // Require that only labels of 0 or 1 are considered.\n if (label !== 0 && label !== 1) {\n return null;\n }\n // The length of the feature array determines\n // the length of the weight array.\n // The perceptron will continue learning as long as\n // it keeps seeing feature arrays of the same length.\n // When it sees a new data shape, it initializes.\n if (features.length !== this.weights.length) {\n this.weights = features;\n this.bias = 1;\n }\n // Make a prediction based on current weights.\n const prediction = this.predict(features);\n // Update the weights if the prediction is wrong.\n if (typeof prediction === \"number\" && prediction !== label) {\n const gradient = label - prediction;\n for (let i = 0; i < this.weights.length; i++) {\n this.weights[i] += gradient * features[i];\n }\n this.bias += gradient;\n }\n return this;\n }\n}\n\nexport default PerceptronModel;\n", "import mean from \"./mean.js\";\nimport shuffleInPlace from \"./shuffle_in_place.js\";\n\n/**\n * Conducts a [permutation test](https://en.wikipedia.org/wiki/Resampling_(statistics)#Permutation_tests)\n * to determine if two data sets are *significantly* different from each other, using\n * the difference of means between the groups as the test statistic.\n * The function allows for the following hypotheses:\n * - two_tail = Null hypothesis: the two distributions are equal.\n * - greater = Null hypothesis: observations from sampleX tend to be smaller than those from sampleY.\n * - less = Null hypothesis: observations from sampleX tend to be greater than those from sampleY.\n * [Learn more about one-tail vs two-tail tests.](https://en.wikipedia.org/wiki/One-_and_two-tailed_tests)\n *\n * @param {Array<number>} sampleX first dataset (e.g. treatment data)\n * @param {Array<number>} sampleY second dataset (e.g. control data)\n * @param {string} alternative alternative hypothesis, either 'two_sided' (default), 'greater', or 'less'\n * @param {number} k number of values in permutation distribution.\n * @param {Function} [randomSource=Math.random] an optional entropy source\n * @returns {number} p-value The probability of observing the difference between groups (as or more extreme than what we did), assuming the null hypothesis.\n *\n * @example\n * var control = [2, 5, 3, 6, 7, 2, 5];\n * var treatment = [20, 5, 13, 12, 7, 2, 2];\n * permutationTest(control, treatment); // ~0.1324\n */\nfunction permutationTest(sampleX, sampleY, alternative, k, randomSource) {\n // Set default arguments\n if (k === undefined) {\n k = 10000;\n }\n if (alternative === undefined) {\n alternative = \"two_side\";\n }\n if (\n alternative !== \"two_side\" &&\n alternative !== \"greater\" &&\n alternative !== \"less\"\n ) {\n throw new Error(\n \"`alternative` must be either 'two_side', 'greater', or 'less'.\"\n );\n }\n\n // get means for each sample\n const meanX = mean(sampleX);\n const meanY = mean(sampleY);\n\n // calculate initial test statistic. This will be our point of comparison with\n // the generated test statistics.\n const testStatistic = meanX - meanY;\n\n // create test-statistic distribution\n const testStatDsn = new Array(k);\n\n // combine datsets so we can easily shuffle later\n const allData = sampleX.concat(sampleY);\n const midIndex = Math.floor(allData.length / 2);\n\n for (let i = 0; i < k; i++) {\n // 1. shuffle data assignments\n shuffleInPlace(allData, randomSource);\n const permLeft = allData.slice(0, midIndex);\n const permRight = allData.slice(midIndex, allData.length);\n\n // 2.re-calculate test statistic\n const permTestStatistic = mean(permLeft) - mean(permRight);\n\n // 3. store test statistic to build test statistic distribution\n testStatDsn[i] = permTestStatistic;\n }\n\n // Calculate p-value depending on alternative\n // For this test, we calculate the percentage of 'extreme' test statistics (subject to our hypothesis)\n // more info on permutation test p-value calculations: https://onlinecourses.science.psu.edu/stat464/node/35\n let numExtremeTStats = 0;\n if (alternative === \"two_side\") {\n for (let i = 0; i <= k; i++) {\n if (Math.abs(testStatDsn[i]) >= Math.abs(testStatistic)) {\n numExtremeTStats += 1;\n }\n }\n } else if (alternative === \"greater\") {\n for (let i = 0; i <= k; i++) {\n if (testStatDsn[i] >= testStatistic) {\n numExtremeTStats += 1;\n }\n }\n } else {\n // alternative === 'less'\n for (let i = 0; i <= k; i++) {\n /* c8 ignore start */\n if (testStatDsn[i] <= testStatistic) {\n numExtremeTStats += 1;\n }\n /* c8 ignore end */\n }\n }\n\n return numExtremeTStats / k;\n}\n\nexport default permutationTest;\n", "import epsilon from \"./epsilon.js\";\n\n/**\n * The [Poisson Distribution](http://en.wikipedia.org/wiki/Poisson_distribution)\n * is a discrete probability distribution that expresses the probability\n * of a given number of events occurring in a fixed interval of time\n * and/or space if these events occur with a known average rate and\n * independently of the time since the last event.\n *\n * The Poisson Distribution is characterized by the strictly positive\n * mean arrival or occurrence rate, `λ`.\n *\n * @param {number} lambda location poisson distribution\n * @returns {number[]} values of poisson distribution at that point\n */\nfunction poissonDistribution(lambda) /*: ?number[] */ {\n // Check that lambda is strictly positive\n if (lambda <= 0) {\n return undefined;\n }\n\n // our current place in the distribution\n let x = 0;\n // and we keep track of the current cumulative probability, in\n // order to know when to stop calculating chances.\n let cumulativeProbability = 0;\n // the calculated cells to be returned\n const cells = [];\n let factorialX = 1;\n\n // This algorithm iterates through each potential outcome,\n // until the `cumulativeProbability` is very close to 1, at\n // which point we've defined the vast majority of outcomes\n do {\n // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n cells[x] = (Math.exp(-lambda) * Math.pow(lambda, x)) / factorialX;\n cumulativeProbability += cells[x];\n x++;\n factorialX *= x;\n // when the cumulativeProbability is nearly 1, we've calculated\n // the useful range of this distribution\n } while (cumulativeProbability < 1 - epsilon);\n\n return cells;\n}\n\nexport default poissonDistribution;\n", "import epsilon from \"./epsilon.js\";\nimport inverseErrorFunction from \"./inverse_error_function.js\";\n\n/**\n * The [Probit](http://en.wikipedia.org/wiki/Probit)\n * is the inverse of cumulativeStdNormalProbability(),\n * and is also known as the normal quantile function.\n *\n * It returns the number of standard deviations from the mean\n * where the p'th quantile of values can be found in a normal distribution.\n * So, for example, probit(0.5 + 0.6827/2) ≈ 1 because 68.27% of values are\n * normally found within 1 standard deviation above or below the mean.\n *\n * @param {number} p\n * @returns {number} probit\n */\nfunction probit(p) {\n if (p === 0) {\n p = epsilon;\n } else if (p >= 1) {\n p = 1 - epsilon;\n }\n return Math.sqrt(2) * inverseErrorFunction(2 * p - 1);\n}\n\nexport default probit;\n", "import euclideanDistance from \"./euclidean_distance.js\";\nimport makeMatrix from \"./make_matrix.js\";\nimport max from \"./max.js\";\n\n/**\n * Calculate the [silhouette values](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for clustered data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<number>} The silhouette value for each point.\n *\n * @example\n * silhouette([[0.25], [0.75]], [0, 0]); // => [1.0, 1.0]\n */\nfunction silhouette(points, labels) {\n if (points.length !== labels.length) {\n throw new Error(\"must have exactly as many labels as points\");\n }\n const groupings = createGroups(labels);\n const distances = calculateAllDistances(points);\n const result = [];\n for (let i = 0; i < points.length; i++) {\n let s = 0;\n if (groupings[labels[i]].length > 1) {\n const a = meanDistanceFromPointToGroup(\n i,\n groupings[labels[i]],\n distances\n );\n const b = meanDistanceToNearestGroup(\n i,\n labels,\n groupings,\n distances\n );\n s = (b - a) / Math.max(a, b);\n }\n result.push(s);\n }\n return result;\n}\n\n/**\n * Create a lookup table mapping group IDs to point IDs.\n *\n * @private\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<Array<number>>} An array of length G, each of whose entries is an array\n * containing the indices of the points in that group.\n */\nfunction createGroups(labels) {\n const numGroups = 1 + max(labels);\n const result = Array(numGroups);\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n if (result[label] === undefined) {\n result[label] = [];\n }\n result[label].push(i);\n }\n return result;\n}\n\n/**\n * Create a lookup table of all inter-point distances.\n *\n * @private\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @return {Array<Array<number>>} A symmetric square array of inter-point distances\n * (zero on the diagonal).\n */\nfunction calculateAllDistances(points) {\n const numPoints = points.length;\n const result = makeMatrix(numPoints, numPoints);\n for (let i = 0; i < numPoints; i++) {\n for (let j = 0; j < i; j++) {\n result[i][j] = euclideanDistance(points[i], points[j]);\n result[j][i] = result[i][j];\n }\n }\n return result;\n}\n\n/**\n * Calculate the mean distance between this point and all the points in the\n * nearest group (as determined by which point in another group is closest).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} labels Labels of points.\n * @param {Array<Array<number>>} groupings An array whose entries are arrays\n * containing the indices of the points in that group.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the nearest\n * group.\n */\nfunction meanDistanceToNearestGroup(which, labels, groupings, distances) {\n const label = labels[which];\n let result = Number.MAX_VALUE;\n for (let i = 0; i < groupings.length; i++) {\n if (i !== label) {\n const d = meanDistanceFromPointToGroup(\n which,\n groupings[i],\n distances\n );\n if (d < result) {\n result = d;\n }\n }\n }\n return result;\n}\n\n/**\n * Calculate the mean distance between a point and all the points in a group\n * (possibly its own).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} group The indices of all the points in the group in\n * question.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the\n * specified group.\n */\nfunction meanDistanceFromPointToGroup(which, group, distances) {\n let total = 0;\n for (let i = 0; i < group.length; i++) {\n total += distances[which][group[i]];\n }\n return total / group.length;\n}\n\nexport default silhouette;\n", "import max from \"./max.js\";\nimport silhouette from \"./silhouette.js\";\n\n/**\n * Calculate the [silhouette metric](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for a set of N-dimensional points arranged in groups. The metric is the largest\n * individual silhouette value for the data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {number} The silhouette metric for the groupings.\n *\n * @example\n * silhouetteMetric([[0.25], [0.75]], [0, 0]); // => 1.0\n */\nfunction silhouetteMetric(points, labels) {\n const values = silhouette(points, labels);\n return max(values);\n}\n\nexport default silhouetteMetric;\n", "/**\n * The [Z-Score, or Standard Score](http://en.wikipedia.org/wiki/Standard_score).\n *\n * The standard score is the number of standard deviations an observation\n * or datum is above or below the mean. Thus, a positive standard score\n * represents a datum above the mean, while a negative standard score\n * represents a datum below the mean. It is a dimensionless quantity\n * obtained by subtracting the population mean from an individual raw\n * score and then dividing the difference by the population standard\n * deviation.\n *\n * The z-score is only defined if one knows the population parameters;\n * if one only has a sample set, then the analogous computation with\n * sample mean and sample standard deviation yields the\n * Student's t-statistic.\n *\n * @param {number} x\n * @param {number} mean\n * @param {number} standardDeviation\n * @return {number} z score\n * @example\n * zScore(78, 80, 5); // => -0.4\n */\nfunction zScore(x, mean, standardDeviation) {\n return (x - mean) / standardDeviation;\n}\n\nexport default zScore;\n", "/**\n * \u98CE\u9669\u4E0E\u7EE9\u6548\u6307\u6807\u6A21\u5757\n * \u5305\u542B\uFF1A\u6CE2\u52A8\u7387\u3001\u6700\u5927\u56DE\u64A4\u3001VaR\u3001CVaR\u3001\u590F\u666E\u6BD4\u7387\u3001\u7D22\u63D0\u8BFA\u3001\u5361\u5C14\u739B\u3001\u7279\u96F7\u8BFA\u3001Omega \u7B49\n */\n\nimport * as ss from 'simple-statistics';\nimport { jStat } from 'jstat';\nimport {\n NavSeries,\n ReturnSeries,\n DateSeries,\n DrawdownResult,\n RiskMetrics,\n PerformanceMetrics,\n BenchmarkMetrics,\n} from './types';\n\n// ============================================================\n// \u8F85\u52A9\u51FD\u6570\n// ============================================================\n\nconst TRADING_DAYS_PER_YEAR = 242; // A\u80A1\u5E74\u4EA4\u6613\u65E5\u6570\n\n/** \u51C0\u503C\u5E8F\u5217 \u2192 \u65E5\u6536\u76CA\u7387\u5E8F\u5217 */\nexport function navToReturns(nav: NavSeries): ReturnSeries {\n const returns: ReturnSeries = [];\n for (let i = 1; i < nav.length; i++) {\n returns.push((nav[i] - nav[i - 1]) / nav[i - 1]);\n }\n return returns;\n}\n\n/** \u65E5\u6536\u76CA\u7387 \u2192 \u5E74\u5316\u6536\u76CA\u7387\uFF08\u51E0\u4F55\u5E73\u5747\uFF09 */\nexport function annualizeReturn(dailyReturns: ReturnSeries): number {\n if (dailyReturns.length === 0) return 0;\n // \u51E0\u4F55\u5E74\u5316 = (1 + \u7D2F\u8BA1\u6536\u76CA) ^ (242/n) - 1\n const cumulative = dailyReturns.reduce((acc, r) => acc * (1 + r), 1);\n const years = dailyReturns.length / TRADING_DAYS_PER_YEAR;\n if (years <= 0 || cumulative <= 0) return 0;\n return Math.pow(cumulative, 1 / years) - 1;\n}\n\n/** \u7D2F\u8BA1\u6536\u76CA\u7387 */\nexport function totalReturn(nav: NavSeries): number {\n if (nav.length < 2) return 0;\n return (nav[nav.length - 1] - nav[0]) / nav[0];\n}\n\n// ============================================================\n// \u6CE2\u52A8\u7387\n// ============================================================\n\n/** \u5E74\u5316\u6CE2\u52A8\u7387 */\nexport function annualizedVolatility(returns: ReturnSeries): number {\n if (returns.length < 2) return 0;\n return ss.standardDeviation(returns) * Math.sqrt(TRADING_DAYS_PER_YEAR);\n}\n\n/** \u4E0B\u884C\u6CE2\u52A8\u7387\uFF08\u5E74\u5316\uFF09\uFF0C\u53EA\u8BA1\u7B97\u8D1F\u6536\u76CA */\nexport function downsideVolatility(returns: ReturnSeries, riskFreeRate: number = 0): number {\n const downsideReturns = returns.filter((r) => r < riskFreeRate / TRADING_DAYS_PER_YEAR);\n if (downsideReturns.length < 2) return 0;\n // \u5BF9\u4F4E\u4E8E\u65E0\u98CE\u9669\u5229\u7387\u7684\u6536\u76CA\u8BA1\u7B97\u6807\u51C6\u5DEE\n const deviations = downsideReturns.map((r) => Math.pow(r - riskFreeRate / TRADING_DAYS_PER_YEAR, 2));\n const meanSqDev = deviations.reduce((a, b) => a + b, 0) / returns.length; // \u6CE8\u610F\u5206\u6BCD\u7528\u603B\u5929\u6570\n return Math.sqrt(meanSqDev) * Math.sqrt(TRADING_DAYS_PER_YEAR);\n}\n\n/**\n * \u6EDA\u52A8\u6CE2\u52A8\u7387\n * @param returns \u65E5\u6536\u76CA\u7387\n * @param window \u6EDA\u52A8\u7A97\u53E3\u5927\u5C0F\n */\nexport function rollingVolatility(returns: ReturnSeries, window: number = 20): (number | null)[] {\n const result: (number | null)[] = [];\n for (let i = 0; i < returns.length; i++) {\n if (i < window - 1) {\n result.push(null);\n } else {\n const slice = returns.slice(i - window + 1, i + 1);\n result.push(ss.standardDeviation(slice) * Math.sqrt(TRADING_DAYS_PER_YEAR));\n }\n }\n return result;\n}\n\n/**\n * \u6CE2\u52A8\u7387\u9525 - \u4E0D\u540C\u65F6\u95F4\u7A97\u53E3\u7684\u6CE2\u52A8\u7387\u5206\u4F4D\u6570\u5206\u5E03\n * @param returns \u65E5\u6536\u76CA\u7387\n * @param windows \u8981\u5206\u6790\u7684\u65F6\u95F4\u7A97\u53E3\u5217\u8868\n * @param quantiles \u8981\u8BA1\u7B97\u7684\u5206\u4F4D\u6570\u5217\u8868\n */\nexport function volatilityCone(\n returns: ReturnSeries,\n windows: number[] = [5, 10, 20, 60, 120],\n quantiles: number[] = [0.1, 0.25, 0.5, 0.75, 0.9]\n): Map<number, Map<number, number>> {\n const cone = new Map<number, Map<number, number>>();\n\n for (const w of windows) {\n const vols: number[] = [];\n for (let i = w - 1; i < returns.length; i++) {\n const slice = returns.slice(i - w + 1, i + 1);\n vols.push(ss.standardDeviation(slice) * Math.sqrt(TRADING_DAYS_PER_YEAR));\n }\n const sorted = [...vols].sort((a, b) => a - b);\n const qMap = new Map<number, number>();\n for (const q of quantiles) {\n qMap.set(q, ss.quantileSorted(sorted, q));\n }\n cone.set(w, qMap);\n }\n\n return cone;\n}\n\n// ============================================================\n// \u6700\u5927\u56DE\u64A4\n// ============================================================\n\n/**\n * \u6700\u5927\u56DE\u64A4\u5206\u6790\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param dates \u53EF\u9009\u65E5\u671F\u5E8F\u5217\n */\nexport function maxDrawdown(nav: NavSeries, dates?: DateSeries): DrawdownResult {\n if (nav.length < 2) {\n return {\n maxDrawdown: 0, peakIndex: 0, troughIndex: 0,\n peakDate: null, troughDate: null, recoveryDate: null,\n durationDays: 0, recoveryDays: null, drawdownSeries: [],\n };\n }\n\n const drawdownSeries: number[] = [];\n let peak = nav[0];\n let peakIdx = 0;\n let maxDD = 0;\n let maxPeakIdx = 0;\n let maxTroughIdx = 0;\n\n for (let i = 0; i < nav.length; i++) {\n if (nav[i] > peak) {\n peak = nav[i];\n peakIdx = i;\n }\n const dd = (nav[i] - peak) / peak;\n drawdownSeries.push(dd);\n if (dd < maxDD) {\n maxDD = dd;\n maxPeakIdx = peakIdx;\n maxTroughIdx = i;\n }\n }\n\n // \u5BFB\u627E\u6062\u590D\u70B9\n let recoveryIdx: number | null = null;\n const peakValue = nav[maxPeakIdx];\n for (let i = maxTroughIdx + 1; i < nav.length; i++) {\n if (nav[i] >= peakValue) {\n recoveryIdx = i;\n break;\n }\n }\n\n return {\n maxDrawdown: maxDD,\n peakIndex: maxPeakIdx,\n troughIndex: maxTroughIdx,\n peakDate: dates ? dates[maxPeakIdx] ?? null : null,\n troughDate: dates ? dates[maxTroughIdx] ?? null : null,\n recoveryDate: recoveryIdx != null && dates ? dates[recoveryIdx] ?? null : null,\n durationDays: maxTroughIdx - maxPeakIdx,\n recoveryDays: recoveryIdx != null ? recoveryIdx - maxTroughIdx : null,\n drawdownSeries,\n };\n}\n\n/**\n * \u6700\u5927\u56DE\u64A4\u6301\u7EED\u5929\u6570\uFF08\u4ECE\u5CF0\u9876\u5230\u4E0B\u4E00\u6B21\u521B\u65B0\u9AD8\uFF09\n */\nexport function maxDrawdownDuration(nav: NavSeries): number {\n let maxDuration = 0;\n let currentDuration = 0;\n let peak = nav[0];\n\n for (let i = 0; i < nav.length; i++) {\n if (nav[i] >= peak) {\n peak = nav[i];\n currentDuration = 0;\n } else {\n currentDuration++;\n maxDuration = Math.max(maxDuration, currentDuration);\n }\n }\n return maxDuration;\n}\n\n// ============================================================\n// VaR / CVaR\n// ============================================================\n\n/**\n * VaR\uFF08\u5728\u9669\u4EF7\u503C\uFF09\n * @param returns \u65E5\u6536\u76CA\u7387\n * @param confidence \u7F6E\u4FE1\u5EA6\uFF08\u9ED8\u8BA4 0.95\uFF09\n * @param method \u8BA1\u7B97\u65B9\u6CD5\uFF1A'historical'\uFF08\u5386\u53F2\u6A21\u62DF\uFF09| 'parametric'\uFF08\u53C2\u6570\u6CD5/\u6B63\u6001\u5047\u8BBE\uFF09\n */\nexport function calculateVaR(\n returns: ReturnSeries,\n confidence: number = 0.95,\n method: 'historical' | 'parametric' = 'historical'\n): number {\n if (returns.length < 2) return 0;\n\n if (method === 'historical') {\n const sorted = [...returns].sort((a, b) => a - b);\n return ss.quantileSorted(sorted, 1 - confidence);\n } else {\n // \u53C2\u6570\u6CD5\uFF08\u6B63\u6001\u5206\u5E03\u5047\u8BBE\uFF09\n const mean = ss.mean(returns);\n const std = ss.standardDeviation(returns);\n const z = jStat.normal.inv(1 - confidence, 0, 1);\n return mean + z * std;\n }\n}\n\n/**\n * CVaR / Expected Shortfall\uFF08\u6761\u4EF6\u5728\u9669\u4EF7\u503C / \u9884\u671F\u4E8F\u635F\uFF09\n * @param returns \u65E5\u6536\u76CA\u7387\n * @param confidence \u7F6E\u4FE1\u5EA6\uFF08\u9ED8\u8BA4 0.95\uFF09\n */\nexport function calculateCVaR(returns: ReturnSeries, confidence: number = 0.95): number {\n if (returns.length < 2) return 0;\n const varValue = calculateVaR(returns, confidence, 'historical');\n const tailReturns = returns.filter((r) => r <= varValue);\n if (tailReturns.length === 0) return varValue;\n return ss.mean(tailReturns);\n}\n\n// ============================================================\n// \u98CE\u9669\u6307\u6807\u6C47\u603B\n// ============================================================\n\n/**\n * \u4E00\u6B21\u6027\u8BA1\u7B97\u6240\u6709\u98CE\u9669\u6307\u6807\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param riskFreeRate \u5E74\u5316\u65E0\u98CE\u9669\u5229\u7387\uFF08\u9ED8\u8BA4 0.025 = 2.5%\uFF09\n */\nexport function riskMetrics(nav: NavSeries, riskFreeRate: number = 0.025): RiskMetrics {\n const returns = navToReturns(nav);\n const dd = maxDrawdown(nav);\n\n return {\n annualizedVolatility: annualizedVolatility(returns),\n downsideVolatility: downsideVolatility(returns, riskFreeRate),\n maxDrawdown: dd.maxDrawdown,\n maxDrawdownDuration: maxDrawdownDuration(nav),\n var95: calculateVaR(returns, 0.95),\n var99: calculateVaR(returns, 0.99),\n cvar95: calculateCVaR(returns, 0.95),\n cvar99: calculateCVaR(returns, 0.99),\n };\n}\n\n// ============================================================\n// \u7EE9\u6548\u6307\u6807\n// ============================================================\n\n/**\n * \u590F\u666E\u6BD4\u7387 = (\u5E74\u5316\u6536\u76CA - \u65E0\u98CE\u9669\u5229\u7387) / \u5E74\u5316\u6CE2\u52A8\u7387\n */\nexport function sharpeRatio(nav: NavSeries, riskFreeRate: number = 0.025): number {\n const returns = navToReturns(nav);\n const annReturn = annualizeReturn(returns);\n const annVol = annualizedVolatility(returns);\n if (annVol === 0) return 0;\n return (annReturn - riskFreeRate) / annVol;\n}\n\n/**\n * \u7D22\u63D0\u8BFA\u6BD4\u7387 = (\u5E74\u5316\u6536\u76CA - \u65E0\u98CE\u9669\u5229\u7387) / \u4E0B\u884C\u6CE2\u52A8\u7387\n */\nexport function sortinoRatio(nav: NavSeries, riskFreeRate: number = 0.025): number {\n const returns = navToReturns(nav);\n const annReturn = annualizeReturn(returns);\n const dv = downsideVolatility(returns, riskFreeRate);\n if (dv === 0) return 0;\n return (annReturn - riskFreeRate) / dv;\n}\n\n/**\n * \u5361\u5C14\u739B\u6BD4\u7387 = \u5E74\u5316\u6536\u76CA / |\u6700\u5927\u56DE\u64A4|\n */\nexport function calmarRatio(nav: NavSeries): number {\n const returns = navToReturns(nav);\n const annReturn = annualizeReturn(returns);\n const dd = maxDrawdown(nav);\n if (dd.maxDrawdown === 0) return 0;\n return annReturn / Math.abs(dd.maxDrawdown);\n}\n\n/**\n * \u7279\u96F7\u8BFA\u6BD4\u7387 = (\u5E74\u5316\u6536\u76CA - \u65E0\u98CE\u9669\u5229\u7387) / Beta\n * @param nav \u57FA\u91D1\u51C0\u503C\n * @param benchmarkNav \u57FA\u51C6\u51C0\u503C\n * @param riskFreeRate \u65E0\u98CE\u9669\u5229\u7387\n */\nexport function treynorRatio(\n nav: NavSeries,\n benchmarkNav: NavSeries,\n riskFreeRate: number = 0.025\n): number | null {\n const fundReturns = navToReturns(nav);\n const benchReturns = navToReturns(benchmarkNav);\n const minLen = Math.min(fundReturns.length, benchReturns.length);\n const fRet = fundReturns.slice(-minLen);\n const bRet = benchReturns.slice(-minLen);\n\n const beta = calculateBeta(fRet, bRet);\n if (beta === 0) return null;\n\n const annReturn = annualizeReturn(fRet);\n return (annReturn - riskFreeRate) / beta;\n}\n\n/**\n * Omega \u6BD4\u7387 = \u52A0\u6743\u4E0A\u884C\u6536\u76CA / \u52A0\u6743\u4E0B\u884C\u4E8F\u635F\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param threshold \u9608\u503C\uFF08\u9ED8\u8BA4 0\uFF09\n */\nexport function omegaRatio(nav: NavSeries, threshold: number = 0): number {\n const returns = navToReturns(nav);\n const dailyThreshold = threshold / TRADING_DAYS_PER_YEAR;\n\n let gains = 0;\n let losses = 0;\n for (const r of returns) {\n if (r > dailyThreshold) gains += r - dailyThreshold;\n else losses += dailyThreshold - r;\n }\n\n if (losses === 0) return gains > 0 ? Infinity : 0;\n return gains / losses;\n}\n\n/** \u80DC\u7387 = \u6B63\u6536\u76CA\u5929\u6570 / \u603B\u5929\u6570 */\nexport function winRate(returns: ReturnSeries): number {\n if (returns.length === 0) return 0;\n const wins = returns.filter((r) => r > 0).length;\n return wins / returns.length;\n}\n\n/** \u76C8\u4E8F\u6BD4 = \u5E73\u5747\u76C8\u5229 / \u5E73\u5747\u4E8F\u635F\u7684\u7EDD\u5BF9\u503C */\nexport function profitLossRatio(returns: ReturnSeries): number {\n const wins = returns.filter((r) => r > 0);\n const losses = returns.filter((r) => r < 0);\n if (losses.length === 0) return wins.length > 0 ? Infinity : 0;\n const avgWin = wins.length > 0 ? ss.mean(wins) : 0;\n const avgLoss = Math.abs(ss.mean(losses));\n if (avgLoss === 0) return 0;\n return avgWin / avgLoss;\n}\n\n/** \u5229\u6DA6\u56E0\u5B50 = \u603B\u76C8\u5229 / \u603B\u4E8F\u635F */\nexport function profitFactor(returns: ReturnSeries): number {\n const totalWins = returns.filter((r) => r > 0).reduce((a, b) => a + b, 0);\n const totalLosses = Math.abs(returns.filter((r) => r < 0).reduce((a, b) => a + b, 0));\n if (totalLosses === 0) return totalWins > 0 ? Infinity : 0;\n return totalWins / totalLosses;\n}\n\n/** \u6700\u5927\u8FDE\u7EED\u76C8\u5229/\u4E8F\u635F\u5929\u6570 */\nexport function consecutiveWinLoss(returns: ReturnSeries): { maxWins: number; maxLosses: number } {\n let maxWins = 0, maxLosses = 0;\n let curWins = 0, curLosses = 0;\n\n for (const r of returns) {\n if (r > 0) {\n curWins++;\n curLosses = 0;\n maxWins = Math.max(maxWins, curWins);\n } else if (r < 0) {\n curLosses++;\n curWins = 0;\n maxLosses = Math.max(maxLosses, curLosses);\n } else {\n curWins = 0;\n curLosses = 0;\n }\n }\n\n return { maxWins, maxLosses };\n}\n\n/**\n * \u4E00\u6B21\u6027\u8BA1\u7B97\u6240\u6709\u7EE9\u6548\u6307\u6807\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param riskFreeRate \u5E74\u5316\u65E0\u98CE\u9669\u5229\u7387\n */\nexport function performanceMetrics(nav: NavSeries, riskFreeRate: number = 0.025): PerformanceMetrics {\n const returns = navToReturns(nav);\n const consec = consecutiveWinLoss(returns);\n const dd = maxDrawdown(nav);\n const annReturn = annualizeReturn(returns);\n const annVol = annualizedVolatility(returns);\n const dv = downsideVolatility(returns, riskFreeRate);\n\n return {\n totalReturn: totalReturn(nav),\n annualizedReturn: annReturn,\n sharpeRatio: annVol > 0 ? (annReturn - riskFreeRate) / annVol : 0,\n sortinoRatio: dv > 0 ? (annReturn - riskFreeRate) / dv : 0,\n calmarRatio: dd.maxDrawdown !== 0 ? annReturn / Math.abs(dd.maxDrawdown) : 0,\n treynorRatio: null, // \u9700\u8981\u57FA\u51C6\u6570\u636E\uFF0C\u5355\u72EC\u8BA1\u7B97\n omegaRatio: omegaRatio(nav),\n winRate: winRate(returns),\n profitLossRatio: profitLossRatio(returns),\n profitFactor: profitFactor(returns),\n maxConsecutiveWins: consec.maxWins,\n maxConsecutiveLosses: consec.maxLosses,\n };\n}\n\n// ============================================================\n// \u76F8\u5BF9\u57FA\u51C6\u6307\u6807\uFF08Alpha / Beta / \u8DDF\u8E2A\u8BEF\u5DEE / \u4FE1\u606F\u6BD4\u7387\uFF09\n// ============================================================\n\n/** Beta \u7CFB\u6570 */\nexport function calculateBeta(fundReturns: ReturnSeries, benchmarkReturns: ReturnSeries): number {\n const minLen = Math.min(fundReturns.length, benchmarkReturns.length);\n const f = fundReturns.slice(-minLen);\n const b = benchmarkReturns.slice(-minLen);\n const cov = ss.sampleCovariance(f, b);\n const bVar = ss.variance(b);\n return bVar > 0 ? cov / bVar : 0;\n}\n\n/** Alpha\uFF08\u5E74\u5316\u8D85\u989D\u6536\u76CA\uFF09 */\nexport function calculateAlpha(\n fundReturns: ReturnSeries,\n benchmarkReturns: ReturnSeries,\n riskFreeRate: number = 0.025\n): number {\n const minLen = Math.min(fundReturns.length, benchmarkReturns.length);\n const f = fundReturns.slice(-minLen);\n const b = benchmarkReturns.slice(-minLen);\n\n const fAnnReturn = annualizeReturn(f);\n const bAnnReturn = annualizeReturn(b);\n const beta = calculateBeta(f, b);\n\n return fAnnReturn - (riskFreeRate + beta * (bAnnReturn - riskFreeRate));\n}\n\n/** \u8DDF\u8E2A\u8BEF\u5DEE\uFF08\u5E74\u5316\uFF09 */\nexport function trackingError(fundReturns: ReturnSeries, benchmarkReturns: ReturnSeries): number {\n const minLen = Math.min(fundReturns.length, benchmarkReturns.length);\n const f = fundReturns.slice(-minLen);\n const b = benchmarkReturns.slice(-minLen);\n\n const excessReturns = f.map((r, i) => r - b[i]);\n return ss.standardDeviation(excessReturns) * Math.sqrt(TRADING_DAYS_PER_YEAR);\n}\n\n/** \u4FE1\u606F\u6BD4\u7387 = \u8D85\u989D\u6536\u76CA / \u8DDF\u8E2A\u8BEF\u5DEE */\nexport function informationRatio(\n fundReturns: ReturnSeries,\n benchmarkReturns: ReturnSeries\n): number {\n const minLen = Math.min(fundReturns.length, benchmarkReturns.length);\n const f = fundReturns.slice(-minLen);\n const b = benchmarkReturns.slice(-minLen);\n\n const excessReturns = f.map((r, i) => r - b[i]);\n const meanExcess = ss.mean(excessReturns) * TRADING_DAYS_PER_YEAR;\n const te = ss.standardDeviation(excessReturns) * Math.sqrt(TRADING_DAYS_PER_YEAR);\n\n return te > 0 ? meanExcess / te : 0;\n}\n\n/**\n * \u4E00\u6B21\u6027\u8BA1\u7B97\u6240\u6709\u76F8\u5BF9\u57FA\u51C6\u6307\u6807\n * @param fundNav \u57FA\u91D1\u51C0\u503C\u5E8F\u5217\n * @param benchmarkNav \u57FA\u51C6\u51C0\u503C\u5E8F\u5217\uFF08\u5982\u6CAA\u6DF1300\u51C0\u503C\uFF09\n * @param riskFreeRate \u5E74\u5316\u65E0\u98CE\u9669\u5229\u7387\n */\nexport function benchmarkMetrics(\n fundNav: NavSeries,\n benchmarkNav: NavSeries,\n riskFreeRate: number = 0.025\n): BenchmarkMetrics {\n const fundReturns = navToReturns(fundNav);\n const benchReturns = navToReturns(benchmarkNav);\n const minLen = Math.min(fundReturns.length, benchReturns.length);\n const f = fundReturns.slice(-minLen);\n const b = benchReturns.slice(-minLen);\n\n const beta = calculateBeta(f, b);\n const alpha = calculateAlpha(f, b, riskFreeRate);\n const te = trackingError(f, b);\n const ir = te > 0 ? informationRatio(f, b) : 0;\n const corr = ss.sampleCorrelation(f, b);\n\n // R\u00B2 = correlation\u00B2\n const rSquared = corr * corr;\n\n return {\n alpha,\n beta,\n trackingError: te,\n informationRatio: ir,\n correlation: corr,\n rSquared,\n };\n}\n", "/**\n * \u7EDF\u8BA1\u7279\u5F81\u6A21\u5757\n * \u5305\u542B\uFF1A\u504F\u5EA6\u3001\u5CF0\u5EA6\u3001\u8D6B\u65AF\u7279\u6307\u6570\u3001\u81EA\u76F8\u5173\u3001Jarque-Bera \u68C0\u9A8C\u7B49\n */\n\nimport * as ss from 'simple-statistics';\nimport { NavSeries, ReturnSeries, StatisticalFeatures, HurstResult, AutocorrelationResult } from './types';\nimport { navToReturns } from './risk';\n\n// ============================================================\n// \u7EDF\u8BA1\u7279\u5F81\u6C47\u603B\n// ============================================================\n\n/**\n * \u8BA1\u7B97\u6536\u76CA\u7387\u7684\u5B8C\u6574\u7EDF\u8BA1\u7279\u5F81\n * @param nav \u51C0\u503C\u5E8F\u5217\uFF08\u81EA\u52A8\u8F6C\u6362\u4E3A\u6536\u76CA\u7387\uFF09\n */\nexport function statisticalFeatures(nav: NavSeries): StatisticalFeatures {\n const returns = navToReturns(nav);\n if (returns.length < 4) {\n return {\n mean: 0, median: 0, stdDev: 0, skewness: 0, kurtosis: 0,\n min: 0, max: 0, range: 0, coefficientOfVariation: 0, jarqueBera: 0,\n };\n }\n\n const mean = ss.mean(returns);\n const median = ss.median(returns);\n const stdDev = ss.standardDeviation(returns);\n const skewness = ss.sampleSkewness(returns);\n const kurtosis = ss.sampleKurtosis(returns);\n const min = ss.min(returns);\n const max = ss.max(returns);\n const range = max - min;\n const coefficientOfVariation = mean !== 0 ? stdDev / Math.abs(mean) : 0;\n\n // Jarque-Bera \u68C0\u9A8C = n/6 * (S\u00B2 + K\u00B2/4)\n const n = returns.length;\n const jarqueBera = (n / 6) * (skewness * skewness + (kurtosis * kurtosis) / 4);\n\n return {\n mean, median, stdDev, skewness, kurtosis,\n min, max, range, coefficientOfVariation, jarqueBera,\n };\n}\n\n/**\n * \u8BA1\u7B97\u51C0\u503C\u5E8F\u5217\uFF08\u800C\u975E\u6536\u76CA\u7387\uFF09\u7684\u7EDF\u8BA1\u7279\u5F81\n * @param nav \u51C0\u503C\u5E8F\u5217\n */\nexport function navStatisticalFeatures(nav: NavSeries): StatisticalFeatures {\n if (nav.length < 4) {\n return {\n mean: 0, median: 0, stdDev: 0, skewness: 0, kurtosis: 0,\n min: 0, max: 0, range: 0, coefficientOfVariation: 0, jarqueBera: 0,\n };\n }\n\n const mean = ss.mean(nav);\n const median = ss.median(nav);\n const stdDev = ss.standardDeviation(nav);\n const skewness = ss.sampleSkewness(nav);\n const kurtosis = ss.sampleKurtosis(nav);\n const min = ss.min(nav);\n const max = ss.max(nav);\n const range = max - min;\n const coefficientOfVariation = mean !== 0 ? stdDev / Math.abs(mean) : 0;\n const n = nav.length;\n const jarqueBera = (n / 6) * (skewness * skewness + (kurtosis * kurtosis) / 4);\n\n return {\n mean, median, stdDev, skewness, kurtosis,\n min, max, range, coefficientOfVariation, jarqueBera,\n };\n}\n\n// ============================================================\n// \u8D6B\u65AF\u7279\u6307\u6570 (R/S Analysis)\n// ============================================================\n\n/**\n * \u8D6B\u65AF\u7279\u6307\u6570 - \u901A\u8FC7 R/S \u5206\u6790\uFF08\u91CD\u6781\u5DEE\u5206\u6790\uFF09\u8BA1\u7B97\n *\n * \u7ED3\u679C\u89E3\u8BFB\uFF1A\n * - H > 0.5\uFF1A\u8D8B\u52BF\u6027\uFF08persistent\uFF09\uFF0C\u8FC7\u53BB\u6DA8\u672A\u6765\u5927\u6982\u7387\u7EE7\u7EED\u6DA8\n * - H < 0.5\uFF1A\u5747\u503C\u56DE\u5F52\uFF08anti-persistent\uFF09\uFF0C\u8FC7\u53BB\u6DA8\u672A\u6765\u5927\u6982\u7387\u56DE\u843D\n * - H \u2248 0.5\uFF1A\u968F\u673A\u6E38\u8D70\uFF0C\u65E0\u53EF\u9884\u6D4B\u6027\n *\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param minWindowSize \u6700\u5C0F\u7A97\u53E3\u5927\u5C0F\uFF08\u9ED8\u8BA416\uFF09\n * @param maxWindowSize \u6700\u5927\u7A97\u53E3\u5927\u5C0F\uFF08\u9ED8\u8BA4\u4E3A\u5E8F\u5217\u957F\u5EA6\u76841/2\uFF09\n * @param numPoints \u91C7\u6837\u70B9\u6570\uFF08\u9ED8\u8BA410\uFF09\n */\nexport function hurstExponent(\n nav: NavSeries,\n minWindowSize: number = 16,\n maxWindowSize?: number,\n numPoints: number = 10\n): HurstResult {\n const returns = navToReturns(nav);\n const n = returns.length;\n\n if (n < minWindowSize * 2) {\n return {\n hurstExponent: 0.5,\n interpretation: 'random_walk',\n dataPoints: [],\n rSquared: 0,\n };\n }\n\n const maxWin = maxWindowSize ?? Math.floor(n / 2);\n const dataPoints: { logN: number; logRS: number }[] = [];\n\n // \u751F\u6210\u4E0D\u540C\u7A97\u53E3\u5927\u5C0F\uFF08\u5BF9\u6570\u7B49\u95F4\u8DDD\uFF09\n const logMin = Math.log(minWindowSize);\n const logMax = Math.log(maxWin);\n\n for (let p = 0; p < numPoints; p++) {\n const logWindowSize = logMin + (p / (numPoints - 1)) * (logMax - logMin);\n const windowSize = Math.floor(Math.exp(logWindowSize));\n\n if (windowSize < 2 || windowSize > n) continue;\n\n // \u5C06\u6570\u636E\u5206\u4E3A\u591A\u4E2A\u5927\u5C0F\u4E3A windowSize \u7684\u5B50\u533A\u95F4\n const numSubPeriods = Math.floor(n / windowSize);\n if (numSubPeriods < 1) continue;\n\n let totalRS = 0;\n let validCount = 0;\n\n for (let s = 0; s < numSubPeriods; s++) {\n const start = s * windowSize;\n const subPeriod = returns.slice(start, start + windowSize);\n\n const mean = ss.mean(subPeriod);\n const std = ss.standardDeviation(subPeriod);\n\n if (std === 0) continue;\n\n // \u8BA1\u7B97\u7D2F\u79EF\u504F\u5DEE\u5E8F\u5217\n const cumDeviations: number[] = [];\n let cumDev = 0;\n for (const r of subPeriod) {\n cumDev += r - mean;\n cumDeviations.push(cumDev);\n }\n\n // R = max(cumDev) - min(cumDev)\n const range = Math.max(...cumDeviations) - Math.min(...cumDeviations);\n // S = \u6807\u51C6\u5DEE\n const rs = range / std;\n totalRS += rs;\n validCount++;\n }\n\n if (validCount > 0) {\n const avgRS = totalRS / validCount;\n dataPoints.push({ logN: Math.log(windowSize), logRS: Math.log(avgRS) });\n }\n }\n\n if (dataPoints.length < 3) {\n return {\n hurstExponent: 0.5,\n interpretation: 'random_walk',\n dataPoints,\n rSquared: 0,\n };\n }\n\n // \u5BF9 log(N) \u548C log(R/S) \u505A\u7EBF\u6027\u56DE\u5F52\uFF0C\u659C\u7387\u5373\u4E3A Hurst \u6307\u6570\n const regressionData = dataPoints.map((d) => [d.logN, d.logRS] as [number, number]);\n const regression = ss.linearRegression(regressionData);\n const H = regression.m;\n\n // \u8BA1\u7B97 R\u00B2\n const predicted = dataPoints.map((d) => regression.m * d.logN + regression.b);\n const actual = dataPoints.map((d) => d.logRS);\n const meanActual = ss.mean(actual);\n const ssTotal = actual.reduce((sum, v) => sum + (v - meanActual) ** 2, 0);\n const ssResidual = actual.reduce((sum, v, i) => sum + (v - predicted[i]) ** 2, 0);\n const rSquared = ssTotal > 0 ? 1 - ssResidual / ssTotal : 0;\n\n // \u5224\u65AD\u7ED3\u679C\n let interpretation: HurstResult['interpretation'];\n if (H > 0.55) interpretation = 'trending';\n else if (H < 0.45) interpretation = 'mean_reverting';\n else interpretation = 'random_walk';\n\n return {\n hurstExponent: Math.max(0, Math.min(1, H)), // \u9650\u5236\u5728 [0, 1]\n interpretation,\n dataPoints,\n rSquared,\n };\n}\n\n// ============================================================\n// \u81EA\u76F8\u5173\u5206\u6790\n// ============================================================\n\n/**\n * \u8BA1\u7B97\u6536\u76CA\u7387\u5E8F\u5217\u7684\u81EA\u76F8\u5173\u7CFB\u6570\uFF08ACF\uFF09\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param maxLag \u6700\u5927\u6EDE\u540E\u9636\u6570\uFF08\u9ED8\u8BA420\uFF09\n */\nexport function autocorrelation(nav: NavSeries, maxLag: number = 20): AutocorrelationResult {\n const returns = navToReturns(nav);\n const n = returns.length;\n\n if (n < maxLag + 2) {\n maxLag = Math.max(1, n - 2);\n }\n\n const mean = ss.mean(returns);\n const variance = returns.reduce((sum, r) => sum + (r - mean) ** 2, 0) / n;\n\n const coefficients: number[] = [];\n\n for (let lag = 0; lag <= maxLag; lag++) {\n if (variance === 0) {\n coefficients.push(lag === 0 ? 1 : 0);\n continue;\n }\n let cov = 0;\n for (let i = 0; i < n - lag; i++) {\n cov += (returns[i] - mean) * (returns[i + lag] - mean);\n }\n cov /= n;\n coefficients.push(cov / variance);\n }\n\n // \u5224\u65AD\u8D8B\u52BF\u6301\u7EED\u6027\uFF08\u57FA\u4E8E lag=1 \u7684\u81EA\u76F8\u5173\u7CFB\u6570\uFF09\n let interpretation: AutocorrelationResult['interpretation'];\n const lag1 = coefficients.length > 1 ? coefficients[1] : 0;\n if (lag1 > 0.05) interpretation = 'persistent';\n else if (lag1 < -0.05) interpretation = 'anti_persistent';\n else interpretation = 'no_correlation';\n\n return { coefficients, maxLag, interpretation };\n}\n\n/**\n * Ljung-Box \u68C0\u9A8C - \u68C0\u6D4B\u81EA\u76F8\u5173\u7684\u7EDF\u8BA1\u663E\u8457\u6027\n * @param returns \u6536\u76CA\u7387\u5E8F\u5217\n * @param maxLag \u6700\u5927\u6EDE\u540E\u9636\u6570\n * @returns Q \u7EDF\u8BA1\u91CF\u548C p \u503C\u8FD1\u4F3C\n */\nexport function ljungBoxTest(returns: ReturnSeries, maxLag: number = 10): { qStatistic: number; approximatePValue: number } {\n const n = returns.length;\n const mean = ss.mean(returns);\n const variance = returns.reduce((sum, r) => sum + (r - mean) ** 2, 0) / n;\n\n if (variance === 0) return { qStatistic: 0, approximatePValue: 1 };\n\n // \u8BA1\u7B97\u5404\u6EDE\u540E\u671F\u7684\u81EA\u76F8\u5173\u7CFB\u6570\n const acf: number[] = [];\n for (let k = 1; k <= maxLag; k++) {\n let cov = 0;\n for (let i = 0; i < n - k; i++) {\n cov += (returns[i] - mean) * (returns[i + k] - mean);\n }\n cov /= n;\n acf.push(cov / variance);\n }\n\n // Q = n(n+2) * \u03A3(\u03C1k\u00B2 / (n-k))\n let q = 0;\n for (let k = 0; k < maxLag; k++) {\n q += (acf[k] * acf[k]) / (n - k - 1);\n }\n q *= n * (n + 2);\n\n // p-value \u8FD1\u4F3C\uFF08\u5361\u65B9\u5206\u5E03\uFF0C\u81EA\u7531\u5EA6=maxLag\uFF09\n // \u4F7F\u7528\u7B80\u5316\u7684\u6B63\u6001\u8FD1\u4F3C\n const df = maxLag;\n const z = Math.pow(q / df, 1 / 3) - (1 - 2 / (9 * df));\n const se = Math.sqrt(2 / (9 * df));\n const zScore = z / se;\n\n // \u8FD1\u4F3C p-value\uFF08\u4F7F\u7528\u6B63\u6001\u5206\u5E03\u8FD1\u4F3C\u5361\u65B9\u5206\u5E03\u7684\u7ACB\u65B9\u6839\u53D8\u6362\uFF09\n const pValue = 1 - normalCDF(zScore);\n\n return { qStatistic: q, approximatePValue: Math.max(0, Math.min(1, pValue)) };\n}\n\n/** \u6807\u51C6\u6B63\u6001\u5206\u5E03 CDF \u8FD1\u4F3C */\nfunction normalCDF(x: number): number {\n // Abramowitz and Stegun approximation\n const a1 = 0.254829592;\n const a2 = -0.284496736;\n const a3 = 1.421413741;\n const a4 = -1.453152027;\n const a5 = 1.061405429;\n const p = 0.3275911;\n\n const sign = x < 0 ? -1 : 1;\n x = Math.abs(x) / Math.sqrt(2);\n const t = 1.0 / (1.0 + p * x);\n const y = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);\n return 0.5 * (1.0 + sign * y);\n}\n\n// ============================================================\n// \u6536\u76CA\u7387\u5206\u5E03\u7279\u5F81\n// ============================================================\n\n/**\n * \u6536\u76CA\u7387\u5206\u4F4D\u6570\u5206\u6790\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param quantiles \u8981\u8BA1\u7B97\u7684\u5206\u4F4D\u6570\u5217\u8868\n */\nexport function returnQuantiles(\n nav: NavSeries,\n quantiles: number[] = [0.01, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99]\n): Map<number, number> {\n const returns = navToReturns(nav);\n const sorted = [...returns].sort((a, b) => a - b);\n const result = new Map<number, number>();\n for (const q of quantiles) {\n result.set(q, ss.quantileSorted(sorted, q));\n }\n return result;\n}\n\n/**\n * \u504F\u5EA6\u7684\u6EDA\u52A8\u8BA1\u7B97\n * @param returns \u6536\u76CA\u7387\u5E8F\u5217\n * @param window \u6EDA\u52A8\u7A97\u53E3\n */\nexport function rollingSkewness(returns: ReturnSeries, window: number = 60): (number | null)[] {\n const result: (number | null)[] = [];\n for (let i = 0; i < returns.length; i++) {\n if (i < window - 1) {\n result.push(null);\n } else {\n const slice = returns.slice(i - window + 1, i + 1);\n result.push(ss.sampleSkewness(slice));\n }\n }\n return result;\n}\n\n/**\n * \u5CF0\u5EA6\u7684\u6EDA\u52A8\u8BA1\u7B97\n * @param returns \u6536\u76CA\u7387\u5E8F\u5217\n * @param window \u6EDA\u52A8\u7A97\u53E3\n */\nexport function rollingKurtosis(returns: ReturnSeries, window: number = 60): (number | null)[] {\n const result: (number | null)[] = [];\n for (let i = 0; i < returns.length; i++) {\n if (i < window - 1) {\n result.push(null);\n } else {\n const slice = returns.slice(i - window + 1, i + 1);\n result.push(ss.sampleKurtosis(slice));\n }\n }\n return result;\n}\n\n// ============================================================\n// GARCH(1,1) \u6CE2\u52A8\u7387\u9884\u6D4B\uFF08\u7B80\u5316\u5B9E\u73B0\uFF09\n// ============================================================\n\n/**\n * GARCH(1,1) \u6CE2\u52A8\u7387\u9884\u6D4B - \u7B80\u5316\u7248\n * \u4F7F\u7528\u77E9\u4F30\u8BA1\u6CD5\u8FD1\u4F3C\u53C2\u6570\uFF0C\u975E\u6700\u5927\u4F3C\u7136\u4F30\u8BA1\n *\n * @param returns \u6536\u76CA\u7387\u5E8F\u5217\n * @returns \u6761\u4EF6\u65B9\u5DEE\u5E8F\u5217\u548C\u9884\u6D4B\u7684\u4E0B\u4E00\u671F\u65B9\u5DEE\n */\nexport function garch11(returns: ReturnSeries): {\n conditionalVariance: number[];\n nextPeriodForecast: number;\n omega: number;\n alpha: number;\n beta: number;\n} {\n const n = returns.length;\n if (n < 30) {\n const v = ss.variance(returns);\n return {\n conditionalVariance: new Array(n).fill(v),\n nextPeriodForecast: v,\n omega: v * 0.1,\n alpha: 0.1,\n beta: 0.8,\n };\n }\n\n // \u7B80\u5316\u53C2\u6570\u4F30\u8BA1\uFF08\u77E9\u4F30\u8BA1\u6CD5\uFF09\n const unconditionalVar = ss.variance(returns);\n\n // \u7528\u6536\u76CA\u7387\u5E73\u65B9\u7684\u81EA\u76F8\u5173\u6765\u4F30\u8BA1 alpha + beta\n const squaredReturns = returns.map((r) => r * r);\n const meanSquared = ss.mean(squaredReturns);\n\n // \u4F30\u8BA1\u4E00\u9636\u81EA\u76F8\u5173\n let autocov = 0;\n for (let i = 0; i < n - 1; i++) {\n autocov += (squaredReturns[i] - meanSquared) * (squaredReturns[i + 1] - meanSquared);\n }\n autocov /= n;\n const autoCorr = meanSquared > 0 ? autocov / (ss.variance(squaredReturns)) : 0;\n\n // \u7B80\u5316\u7684\u53C2\u6570\u4F30\u8BA1\n const alphaBeta = Math.max(0.5, Math.min(0.99, autoCorr + 0.8));\n const alpha = Math.max(0.01, Math.min(0.3, (1 - alphaBeta) * 2));\n const beta = alphaBeta - alpha;\n const omega = unconditionalVar * (1 - alpha - beta);\n\n // \u9012\u5F52\u8BA1\u7B97\u6761\u4EF6\u65B9\u5DEE\n const conditionalVariance: number[] = [unconditionalVar];\n for (let i = 1; i < n; i++) {\n const prevVar = conditionalVariance[i - 1];\n const newVar = omega + alpha * returns[i - 1] * returns[i - 1] + beta * prevVar;\n conditionalVariance.push(Math.max(newVar, 1e-10));\n }\n\n // \u9884\u6D4B\u4E0B\u4E00\u671F\n const lastVar = conditionalVariance[n - 1];\n const lastReturn = returns[n - 1];\n const nextPeriodForecast = omega + alpha * lastReturn * lastReturn + beta * lastVar;\n\n return { conditionalVariance, nextPeriodForecast, omega, alpha, beta };\n}\n", "/**\n * \u5B9A\u6295\u4E0E\u76C8\u4E8F\u5206\u6790\u6A21\u5757\n * \u5305\u542B\uFF1A\u5B9A\u6295\u6A21\u62DF\u3001\u5E73\u5747\u6210\u672C\u3001IRR \u8BA1\u7B97\u3001\u6B62\u76C8\u6B62\u635F\u4FE1\u53F7\u3001\u5B89\u5168\u8FB9\u9645\u7B49\n */\n\nimport { NavSeries, DateSeries, DCAConfig, DCAResult, TakeProfitStopLossSignal } from './types';\n\n// ============================================================\n// \u5B9A\u6295\u6A21\u62DF\n// ============================================================\n\n/**\n * \u5B9A\u6295\u7B56\u7565\u6A21\u62DF\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param config \u5B9A\u6295\u914D\u7F6E\n * @param dates \u53EF\u9009\u65E5\u671F\u5E8F\u5217\n */\nexport function simulateDCA(nav: NavSeries, config: DCAConfig, dates?: DateSeries): DCAResult {\n const { amount, interval = 1, startIndex = 0 } = config;\n\n let totalInvested = 0;\n let totalShares = 0;\n const investmentDates: number[] = [];\n const valueHistory: number[] = [];\n\n for (let i = startIndex; i < nav.length; i += interval) {\n const navPrice = nav[i];\n if (navPrice <= 0) continue;\n\n const shares = amount / navPrice;\n totalShares += shares;\n totalInvested += amount;\n investmentDates.push(i);\n\n // \u5F53\u524D\u6301\u4ED3\u5E02\u503C\n const currentValue = totalShares * navPrice;\n valueHistory.push(currentValue);\n }\n\n if (totalInvested === 0 || totalShares === 0) {\n return {\n totalInvestments: 0,\n totalInvested: 0,\n currentValue: 0,\n totalShares: 0,\n averageCost: 0,\n currentNav: 0,\n returnRate: 0,\n profitLoss: 0,\n irr: null,\n investmentDates,\n valueHistory,\n };\n }\n\n const currentNav = nav[nav.length - 1];\n const currentValue = totalShares * currentNav;\n const averageCost = totalInvested / totalShares;\n const returnRate = (currentValue - totalInvested) / totalInvested;\n const profitLoss = currentValue - totalInvested;\n\n // \u8BA1\u7B97 IRR\n const irr = calculateIRR(nav, investmentDates, amount, totalShares, currentNav);\n\n return {\n totalInvestments: investmentDates.length,\n totalInvested,\n currentValue,\n totalShares,\n averageCost,\n currentNav,\n returnRate,\n profitLoss,\n irr,\n investmentDates,\n valueHistory,\n };\n}\n\n// ============================================================\n// IRR \u8BA1\u7B97\uFF08\u5185\u90E8\u6536\u76CA\u7387\uFF09\n// ============================================================\n\n/**\n * \u8BA1\u7B97\u5B9A\u6295\u7684\u5185\u90E8\u6536\u76CA\u7387 (IRR)\n * \u4F7F\u7528\u725B\u987F\u8FED\u4EE3\u6CD5\u6C42\u89E3\n */\nfunction calculateIRR(\n nav: NavSeries,\n investmentDates: number[],\n amount: number,\n totalShares: number,\n currentNav: number\n): number | null {\n if (investmentDates.length < 2) return null;\n\n // \u6784\u5EFA\u73B0\u91D1\u6D41\uFF1A\u6BCF\u6B21\u5B9A\u6295\u4E3A\u8D1F\u73B0\u91D1\u6D41\uFF0C\u6700\u540E\u8D4E\u56DE\u4E3A\u6B63\u73B0\u91D1\u6D41\n // \u4EE5\u7B2C\u4E00\u4E2A\u5B9A\u6295\u65E5\u4E3A\u57FA\u51C6\u65E5 (day 0)\n const baseDay = investmentDates[0];\n const cashFlows: { day: number; amount: number }[] = [];\n\n for (const d of investmentDates) {\n cashFlows.push({ day: d - baseDay, amount: -amount });\n }\n // \u6700\u7EC8\u8D4E\u56DE\uFF08\u5047\u8BBE\u5168\u90E8\u8D4E\u56DE\uFF09\n const lastDay = nav.length - 1 - baseDay;\n cashFlows.push({ day: lastDay, amount: totalShares * currentNav });\n\n // NPV \u51FD\u6570\uFF1ANPV(r) = \u03A3 CFi / (1+r)^(ti/T)\n // T = \u4E00\u5E74\u7684\u4EA4\u6613\u65E5\u6570\n const T = 242;\n\n function npv(r: number): number {\n let sum = 0;\n for (const cf of cashFlows) {\n const t = cf.day / T;\n if (t === 0) sum += cf.amount;\n else sum += cf.amount / Math.pow(1 + r, t);\n }\n return sum;\n }\n\n // NPV \u7684\u5BFC\u6570\n function npvDerivative(r: number): number {\n let sum = 0;\n for (const cf of cashFlows) {\n const t = cf.day / T;\n if (t <= 0) continue;\n sum -= (t * cf.amount) / Math.pow(1 + r, t + 1);\n }\n return sum;\n }\n\n // \u725B\u987F\u8FED\u4EE3\u6CD5\u6C42 IRR\n let r = 0.1; // \u521D\u59CB\u731C\u6D4B 10%\n const maxIterations = 100;\n const tolerance = 1e-8;\n\n for (let i = 0; i < maxIterations; i++) {\n const f = npv(r);\n const fPrime = npvDerivative(r);\n\n if (Math.abs(fPrime) < 1e-12) break;\n\n const newR = r - f / fPrime;\n\n if (Math.abs(newR - r) < tolerance) {\n return newR;\n }\n\n r = newR;\n\n // \u9632\u6B62\u53D1\u6563\n if (r < -0.99) r = -0.99;\n if (r > 10) r = 10;\n }\n\n // \u5982\u679C\u725B\u987F\u6CD5\u4E0D\u6536\u655B\uFF0C\u5C1D\u8BD5\u4E8C\u5206\u6CD5\n return bisectionIRR(npv);\n}\n\n/** \u4E8C\u5206\u6CD5\u6C42 IRR\uFF08\u5907\u7528\uFF09 */\nfunction bisectionIRR(npv: (r: number) => number): number | null {\n let low = -0.99;\n let high = 10;\n const tolerance = 1e-6;\n const maxIterations = 200;\n\n let fLow = npv(low);\n let fHigh = npv(high);\n\n // \u68C0\u67E5\u662F\u5426\u6709\u6839\n if (fLow * fHigh > 0) return null;\n\n for (let i = 0; i < maxIterations; i++) {\n const mid = (low + high) / 2;\n const fMid = npv(mid);\n\n if (Math.abs(fMid) < tolerance || (high - low) / 2 < tolerance) {\n return mid;\n }\n\n if (fLow * fMid < 0) {\n high = mid;\n fHigh = fMid;\n } else {\n low = mid;\n fLow = fMid;\n }\n }\n\n return (low + high) / 2;\n}\n\n// ============================================================\n// \u6B62\u76C8\u6B62\u635F\u4FE1\u53F7\n// ============================================================\n\n/**\n * \u6B62\u76C8\u6B62\u635F\u4FE1\u53F7\u68C0\u6D4B\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param costPrice \u6301\u4ED3\u6210\u672C\u4EF7\n * @param takeProfitThreshold \u6B62\u76C8\u9608\u503C\uFF08\u5982 0.30 = \u76C8\u5229 30% \u6B62\u76C8\uFF09\n * @param stopLossThreshold \u6B62\u635F\u9608\u503C\uFF08\u5982 -0.15 = \u4E8F\u635F 15% \u6B62\u635F\uFF09\n */\nexport function takeProfitStopLoss(\n nav: NavSeries,\n costPrice: number,\n takeProfitThreshold: number = 0.3,\n stopLossThreshold: number = -0.15\n): TakeProfitStopLossSignal {\n const currentNav = nav[nav.length - 1];\n const currentPnL = (currentNav - costPrice) / costPrice;\n\n return {\n takeProfitTriggered: currentPnL >= takeProfitThreshold,\n stopLossTriggered: currentPnL <= stopLossThreshold,\n currentPnL,\n distanceToTakeProfit: takeProfitThreshold - currentPnL,\n distanceToStopLoss: currentPnL - stopLossThreshold,\n };\n}\n\n/**\n * \u52A8\u6001\u6B62\u76C8\u6B62\u635F\uFF08\u8DDF\u8E2A\u6B62\u76C8\uFF09\n * \u5F53\u51C0\u503C\u521B\u65B0\u9AD8\u540E\u56DE\u64A4\u4E00\u5B9A\u6BD4\u4F8B\u65F6\u89E6\u53D1\u6B62\u76C8\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param trailPercent \u8DDF\u8E2A\u6B62\u76C8\u6BD4\u4F8B\uFF08\u5982 0.10 = \u4ECE\u6700\u9AD8\u70B9\u56DE\u64A4 10% \u89E6\u53D1\uFF09\n * @param costPrice \u6301\u4ED3\u6210\u672C\u4EF7\n */\nexport function trailingStop(\n nav: NavSeries,\n trailPercent: number = 0.1,\n costPrice?: number\n): {\n triggered: boolean;\n peakNav: number;\n currentNav: number;\n drawdownFromPeak: number;\n profitFromCost: number;\n} {\n let peakNav = nav[0];\n for (const v of nav) {\n if (v > peakNav) peakNav = v;\n }\n\n const currentNav = nav[nav.length - 1];\n const drawdownFromPeak = (peakNav - currentNav) / peakNav;\n const profitFromCost = costPrice ? (currentNav - costPrice) / costPrice : 0;\n\n return {\n triggered: drawdownFromPeak >= trailPercent && currentNav > (costPrice ?? 0),\n peakNav,\n currentNav,\n drawdownFromPeak,\n profitFromCost,\n };\n}\n\n// ============================================================\n// \u5B89\u5168\u8FB9\u9645\u4E0E\u4F30\u503C\u5206\u6790\n// ============================================================\n\n/**\n * \u5B89\u5168\u8FB9\u9645 - \u5F53\u524D\u51C0\u503C\u76F8\u5BF9\u5386\u53F2\u6700\u9AD8\u70B9\u7684\u56DE\u64A4\u5E45\u5EA6\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @returns \u56DE\u64A4\u6BD4\u4F8B\uFF080-1\uFF0C\u5982 0.25 = \u56DE\u64A4 25%\uFF09\n */\nexport function safetyMargin(nav: NavSeries): number {\n const peak = Math.max(...nav);\n const current = nav[nav.length - 1];\n return (peak - current) / peak;\n}\n\n/**\n * \u5F53\u524D\u51C0\u503C\u76F8\u5BF9\u5386\u53F2\u6700\u9AD8\u70B9\u548C\u6700\u4F4E\u70B9\u7684\u4F4D\u7F6E\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @returns 0-1 \u4E4B\u95F4\u7684\u4F4D\u7F6E\u503C\uFF080 = \u5386\u53F2\u6700\u4F4E\uFF0C1 = \u5386\u53F2\u6700\u9AD8\uFF09\n */\nexport function pricePosition(nav: NavSeries): number {\n const peak = Math.max(...nav);\n const trough = Math.min(...nav);\n const current = nav[nav.length - 1];\n if (peak === trough) return 0.5;\n return (current - trough) / (peak - trough);\n}\n\n/**\n * \u667A\u80FD\u5B9A\u6295\u8C03\u6574\u7CFB\u6570\n * \u6839\u636E\u5F53\u524D\u51C0\u503C\u76F8\u5BF9\u5747\u7EBF\u7684\u4F4D\u7F6E\uFF0C\u8C03\u6574\u5B9A\u6295\u91D1\u989D\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param maPeriod \u53C2\u8003\u5747\u7EBF\u5468\u671F\uFF08\u9ED8\u8BA4 250 \u65E5\uFF09\n * @param maxMultiplier \u6700\u5927\u500D\u6570\uFF08\u9ED8\u8BA4 2.0\uFF09\n * @param minMultiplier \u6700\u5C0F\u500D\u6570\uFF08\u9ED8\u8BA4 0.5\uFF09\n * @returns \u5B9A\u6295\u8C03\u6574\u500D\u6570\uFF081.0 = \u6807\u51C6\u91D1\u989D\uFF09\n */\nexport function smartDCAMultiplier(\n nav: NavSeries,\n maPeriod: number = 250,\n maxMultiplier: number = 2.0,\n minMultiplier: number = 0.5\n): number {\n if (nav.length < maPeriod) return 1.0;\n\n const recent = nav.slice(-maPeriod);\n const ma = recent.reduce((a, b) => a + b, 0) / maPeriod;\n const current = nav[nav.length - 1];\n const deviation = (current - ma) / ma; // \u6B63\u6570=\u9AD8\u4E8E\u5747\u7EBF\uFF0C\u8D1F\u6570=\u4F4E\u4E8E\u5747\u7EBF\n\n // \u4F4E\u4E8E\u5747\u7EBF\u65F6\u589E\u52A0\u5B9A\u6295\uFF0C\u9AD8\u4E8E\u5747\u7EBF\u65F6\u51CF\u5C11\n // deviation = -0.2 \u2192 multiplier = 1.4\n // deviation = +0.2 \u2192 multiplier = 0.6\n const multiplier = 1.0 - deviation * 4;\n\n return Math.max(minMultiplier, Math.min(maxMultiplier, multiplier));\n}\n\n// ============================================================\n// \u5206\u6279\u5EFA\u4ED3/\u51CF\u4ED3\u7B56\u7565\n// ============================================================\n\n/**\n * \u5206\u6279\u5EFA\u4ED3\u4FE1\u53F7\n * \u5F53\u51C0\u503C\u8DCC\u5230\u5386\u53F2\u5206\u4F4D\u4EE5\u4E0B\u65F6\u5206\u6279\u4E70\u5165\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param levels \u5206\u6279\u4E70\u5165\u7684\u5206\u4F4D\u9608\u503C\u5217\u8868\uFF08\u5982 [0.3, 0.2, 0.1] = 30%\u300120%\u300110%\u5206\u4F4D\u5404\u4E70\u4E00\u6B21\uFF09\n * @returns \u5F53\u524D\u89E6\u53D1\u7684\u4E70\u5165\u5C42\u7EA7\uFF080 = \u4E0D\u89E6\u53D1\uFF0C1 = \u7B2C\u4E00\u5C42\uFF0C2 = \u7B2C\u4E8C\u5C42...\uFF09\n */\nexport function tieredBuySignal(nav: NavSeries, levels: number[] = [0.3, 0.2, 0.1]): number {\n const sorted = [...nav].sort((a, b) => a - b);\n const current = nav[nav.length - 1];\n\n // \u8BA1\u7B97\u5F53\u524D\u51C0\u503C\u7684\u5206\u4F4D\n let rank = 0;\n for (const v of sorted) {\n if (v < current) rank++;\n else if (v === current) rank += 0.5;\n }\n const percentile = rank / sorted.length;\n\n // \u4ECE\u6700\u6FC0\u8FDB\u5230\u6700\u4FDD\u5B88\u68C0\u67E5\n for (let i = 0; i < levels.length; i++) {\n if (percentile <= levels[i]) return levels.length - i;\n }\n return 0;\n}\n\n/**\n * \u5206\u6279\u6B62\u76C8\u4FE1\u53F7\n * \u5F53\u51C0\u503C\u6DA8\u5230\u5386\u53F2\u5206\u4F4D\u4EE5\u4E0A\u65F6\u5206\u6279\u5356\u51FA\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param levels \u5206\u6279\u5356\u51FA\u7684\u5206\u4F4D\u9608\u503C\u5217\u8868\uFF08\u5982 [0.7, 0.8, 0.9] = 70%\u300180%\u300190%\u5206\u4F4D\u5404\u5356\u4E00\u6B21\uFF09\n * @returns \u5F53\u524D\u89E6\u53D1\u7684\u5356\u51FA\u5C42\u7EA7\n */\nexport function tieredSellSignal(nav: NavSeries, levels: number[] = [0.7, 0.8, 0.9]): number {\n const sorted = [...nav].sort((a, b) => a - b);\n const current = nav[nav.length - 1];\n\n let rank = 0;\n for (const v of sorted) {\n if (v < current) rank++;\n else if (v === current) rank += 0.5;\n }\n const percentile = rank / sorted.length;\n\n for (let i = levels.length - 1; i >= 0; i--) {\n if (percentile >= levels[i]) return i + 1;\n }\n return 0;\n}\n\n// ============================================================\n// \u56DE\u6D4B\u8F85\u52A9\n// ============================================================\n\n/**\n * \u8BA1\u7B97\u4E00\u6BB5\u6301\u4ED3\u7684\u6536\u76CA\u660E\u7EC6\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param buyIndex \u4E70\u5165\u65E5\u7D22\u5F15\n * @param sellIndex \u5356\u51FA\u65E5\u7D22\u5F15\uFF08\u9ED8\u8BA4\u5230\u6700\u540E\u4E00\u5929\uFF09\n * @param amount \u6295\u5165\u91D1\u989D\n */\nexport function positionPnL(\n nav: NavSeries,\n buyIndex: number,\n sellIndex?: number,\n amount: number = 10000\n): {\n buyNav: number;\n sellNav: number;\n shares: number;\n cost: number;\n value: number;\n pnl: number;\n returnRate: number;\n holdDays: number;\n annualizedReturn: number;\n} {\n const sell = sellIndex ?? nav.length - 1;\n const buyNav = nav[buyIndex];\n const sellNav = nav[sell];\n const shares = amount / buyNav;\n const value = shares * sellNav;\n const pnl = value - amount;\n const returnRate = pnl / amount;\n const holdDays = sell - buyIndex;\n const annualizedReturn = holdDays > 0 ? Math.pow(1 + returnRate, 242 / holdDays) - 1 : 0;\n\n return {\n buyNav,\n sellNav,\n shares,\n cost: amount,\n value,\n pnl,\n returnRate,\n holdDays,\n annualizedReturn,\n };\n}\n", "/**\n * \u5F62\u6001\u8BC6\u522B\u6A21\u5757\n * \u5305\u542B\uFF1A\u652F\u6491/\u963B\u529B\u4F4D\u3001\u53CC\u5E95/\u53CC\u9876\u3001\u7F3A\u53E3\u8BC6\u522B\u3001\u8D8B\u52BF\u5F3A\u5EA6\u7B49\n */\n\nimport { NavSeries, SupportResistanceResult, DoubleBottomTopResult, GapResult } from './types';\n\n// ============================================================\n// \u652F\u6491\u4F4D / \u963B\u529B\u4F4D\n// ============================================================\n\n/**\n * \u57FA\u4E8E\u51C0\u503C\u5BC6\u96C6\u533A\u8BC6\u522B\u652F\u6491\u4F4D\u548C\u963B\u529B\u4F4D\n * \u4F7F\u7528\u6838\u5BC6\u5EA6\u4F30\u8BA1\uFF08KDE\uFF09\u601D\u60F3\uFF0C\u627E\u5230\u51C0\u503C\u9891\u7E41\u51FA\u73B0\u7684\u4EF7\u4F4D\n *\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param tolerance \u4EF7\u683C\u5BB9\u5DEE\u6BD4\u4F8B\uFF08\u5982 0.02 = 2%\u4EE5\u5185\u7684\u89C6\u4E3A\u540C\u4E00\u4EF7\u4F4D\uFF09\n * @param minTouches \u6700\u5C11\u89E6\u53CA\u6B21\u6570\uFF08\u9ED8\u8BA43\uFF09\n */\nexport function supportResistance(\n nav: NavSeries,\n tolerance: number = 0.02,\n minTouches: number = 3\n): SupportResistanceResult {\n if (nav.length < 10) {\n return { supports: [], resistances: [] };\n }\n\n const current = nav[nav.length - 1];\n\n // \u7EDF\u8BA1\u6BCF\u4E2A\u4EF7\u4F4D\u9644\u8FD1\u7684\u89E6\u53CA\u6B21\u6570\n const levelMap = new Map<number, number>();\n\n for (let i = 0; i < nav.length; i++) {\n // \u5BFB\u627E\u5C40\u90E8\u6781\u503C\uFF08\u5C40\u90E8\u6700\u9AD8\u70B9\u548C\u6700\u4F4E\u70B9\uFF09\n const isLocalHigh = (i > 0 && i < nav.length - 1) &&\n nav[i] >= nav[i - 1] && nav[i] >= nav[i + 1];\n const isLocalLow = (i > 0 && i < nav.length - 1) &&\n nav[i] <= nav[i - 1] && nav[i] <= nav[i + 1];\n\n if (isLocalHigh || isLocalLow) {\n // \u5408\u5E76\u76F8\u8FD1\u4EF7\u4F4D\n let merged = false;\n for (const [level, count] of levelMap.entries()) {\n if (Math.abs(nav[i] - level) / level < tolerance) {\n levelMap.set(level, count + 1);\n merged = true;\n break;\n }\n }\n if (!merged) {\n levelMap.set(nav[i], 1);\n }\n }\n }\n\n // \u4E5F\u8003\u8651\u51C0\u503C\u5E8F\u5217\u4E2D\u51FA\u73B0\u9891\u7387\u9AD8\u7684\u4EF7\u4F4D\n for (const price of nav) {\n let merged = false;\n for (const [level, count] of levelMap.entries()) {\n if (Math.abs(price - level) / level < tolerance) {\n levelMap.set(level, count + 1);\n merged = true;\n break;\n }\n }\n if (!merged) {\n levelMap.set(price, 1);\n }\n }\n\n // \u8FC7\u6EE4\u5E76\u6392\u5E8F\n const validLevels = Array.from(levelMap.entries())\n .filter(([, touches]) => touches >= minTouches)\n .map(([level, touches]) => ({\n level,\n touches,\n strength: touches / nav.length,\n }))\n .sort((a, b) => b.strength - a.strength);\n\n // \u5206\u4E3A\u652F\u6491\u4F4D\uFF08\u4F4E\u4E8E\u5F53\u524D\u4EF7\uFF09\u548C\u963B\u529B\u4F4D\uFF08\u9AD8\u4E8E\u5F53\u524D\u4EF7\uFF09\n const supports = validLevels\n .filter((l) => l.level < current)\n .sort((a, b) => b.level - a.level); // \u6700\u8FD1\u7684\u652F\u6491\u4F4D\u6392\u524D\u9762\n\n const resistances = validLevels\n .filter((l) => l.level > current)\n .sort((a, b) => a.level - b.level); // \u6700\u8FD1\u7684\u963B\u529B\u4F4D\u6392\u524D\u9762\n\n return { supports, resistances };\n}\n\n// ============================================================\n// \u53CC\u5E95 (W\u5E95) / \u53CC\u9876 (M\u5934) \u8BC6\u522B\n// ============================================================\n\n/**\n * \u53CC\u5E95/\u53CC\u9876\u5F62\u6001\u8BC6\u522B\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param lookback \u56DE\u770B\u5929\u6570\uFF08\u9ED8\u8BA460\uFF09\n * @param tolerance \u4E24\u5E95/\u9876\u4E4B\u95F4\u7684\u4EF7\u683C\u5BB9\u5DEE\u6BD4\u4F8B\uFF08\u9ED8\u8BA40.03 = 3%\uFF09\n * @param minDistance \u4E24\u4E2A\u5E95/\u9876\u4E4B\u95F4\u7684\u6700\u5C0F\u95F4\u9694\u5929\u6570\uFF08\u9ED8\u8BA410\uFF09\n */\nexport function doubleBottomTop(\n nav: NavSeries,\n lookback: number = 60,\n tolerance: number = 0.03,\n minDistance: number = 10\n): DoubleBottomTopResult {\n const noResult: DoubleBottomTopResult = {\n type: 'none',\n firstPointIndex: null,\n secondPointIndex: null,\n necklineIndex: null,\n necklinePrice: null,\n breakout: false,\n confidence: 0,\n };\n\n if (nav.length < lookback || lookback < minDistance * 2) return noResult;\n\n const window = nav.slice(-lookback);\n const offset = nav.length - lookback;\n\n // \u5BFB\u627E\u5C40\u90E8\u6781\u503C\n const localMins: { index: number; value: number }[] = [];\n const localMaxs: { index: number; value: number }[] = [];\n\n for (let i = 2; i < window.length - 2; i++) {\n if (window[i] <= window[i - 1] && window[i] <= window[i + 1] &&\n window[i] <= window[i - 2] && window[i] <= window[i + 2]) {\n localMins.push({ index: i, value: window[i] });\n }\n if (window[i] >= window[i - 1] && window[i] >= window[i + 1] &&\n window[i] >= window[i - 2] && window[i] >= window[i + 2]) {\n localMaxs.push({ index: i, value: window[i] });\n }\n }\n\n // \u68C0\u6D4B\u53CC\u5E95\uFF08W\u5E95\uFF09\n for (let i = 0; i < localMins.length; i++) {\n for (let j = i + 1; j < localMins.length; j++) {\n const first = localMins[i];\n const second = localMins[j];\n const distance = second.index - first.index;\n\n if (distance < minDistance) continue;\n\n const priceDiff = Math.abs(first.value - second.value) / first.value;\n if (priceDiff > tolerance) continue;\n\n // \u627E\u4E24\u5E95\u4E4B\u95F4\u7684\u9888\u7EBF\uFF08\u6700\u9AD8\u70B9\uFF09\n const between = window.slice(first.index, second.index + 1);\n const neckValue = Math.max(...between);\n const neckIdx = first.index + between.indexOf(neckValue);\n\n // \u68C0\u67E5\u662F\u5426\u7A81\u7834\u9888\u7EBF\n const currentPrice = window[window.length - 1];\n const breakout = currentPrice > neckValue;\n\n // \u8BA1\u7B97\u4FE1\u53F7\u5F3A\u5EA6\n const similarity = 1 - priceDiff / tolerance;\n const distanceFactor = Math.min(1, distance / lookback * 2);\n const confidence = (similarity * 0.6 + distanceFactor * 0.4) * (breakout ? 1 : 0.7);\n\n return {\n type: 'double_bottom',\n firstPointIndex: offset + first.index,\n secondPointIndex: offset + second.index,\n necklineIndex: offset + neckIdx,\n necklinePrice: neckValue,\n breakout,\n confidence,\n };\n }\n }\n\n // \u68C0\u6D4B\u53CC\u9876\uFF08M\u5934\uFF09\n for (let i = 0; i < localMaxs.length; i++) {\n for (let j = i + 1; j < localMaxs.length; j++) {\n const first = localMaxs[i];\n const second = localMaxs[j];\n const distance = second.index - first.index;\n\n if (distance < minDistance) continue;\n\n const priceDiff = Math.abs(first.value - second.value) / first.value;\n if (priceDiff > tolerance) continue;\n\n // \u627E\u4E24\u9876\u4E4B\u95F4\u7684\u9888\u7EBF\uFF08\u6700\u4F4E\u70B9\uFF09\n const between = window.slice(first.index, second.index + 1);\n const neckValue = Math.min(...between);\n const neckIdx = first.index + between.indexOf(neckValue);\n\n // \u68C0\u67E5\u662F\u5426\u8DCC\u7834\u9888\u7EBF\n const currentPrice = window[window.length - 1];\n const breakout = currentPrice < neckValue;\n\n const similarity = 1 - priceDiff / tolerance;\n const distanceFactor = Math.min(1, distance / lookback * 2);\n const confidence = (similarity * 0.6 + distanceFactor * 0.4) * (breakout ? 1 : 0.7);\n\n return {\n type: 'double_top',\n firstPointIndex: offset + first.index,\n secondPointIndex: offset + second.index,\n necklineIndex: offset + neckIdx,\n necklinePrice: neckValue,\n breakout,\n confidence,\n };\n }\n }\n\n return noResult;\n}\n\n// ============================================================\n// \u7F3A\u53E3\u8BC6\u522B\n// ============================================================\n\n/**\n * \u51C0\u503C\u7F3A\u53E3\u8BC6\u522B\uFF08\u5206\u7EA2\u3001\u4F30\u503C\u8C03\u6574\u7B49\u5BFC\u81F4\u7684\u51C0\u503C\u8DF3\u53D8\uFF09\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param threshold \u7F3A\u53E3\u9608\u503C\u767E\u5206\u6BD4\uFF08\u9ED8\u8BA40.02 = 2%\uFF09\n */\nexport function detectGaps(nav: NavSeries, threshold: number = 0.02): GapResult[] {\n const gaps: GapResult[] = [];\n\n for (let i = 1; i < nav.length; i++) {\n const change = (nav[i] - nav[i - 1]) / nav[i - 1];\n const absChange = Math.abs(change);\n\n if (absChange >= threshold) {\n const isGapUp = change > 0;\n const gapTop = isGapUp ? nav[i] : nav[i - 1];\n const gapBottom = isGapUp ? nav[i - 1] : nav[i];\n\n // \u68C0\u67E5\u7F3A\u53E3\u662F\u5426\u5DF2\u56DE\u8865\n let filled = false;\n let filledIndex: number | null = null;\n\n if (isGapUp) {\n // \u5411\u4E0A\u7F3A\u53E3\uFF1A\u540E\u7EED\u51C0\u503C\u8DCC\u56DE\u7F3A\u53E3\u4E0B\u6CBF\u5373\u4E3A\u56DE\u8865\n for (let j = i + 1; j < nav.length; j++) {\n if (nav[j] <= gapBottom) {\n filled = true;\n filledIndex = j;\n break;\n }\n }\n } else {\n // \u5411\u4E0B\u7F3A\u53E3\uFF1A\u540E\u7EED\u51C0\u503C\u6DA8\u56DE\u7F3A\u53E3\u4E0A\u6CBF\u5373\u4E3A\u56DE\u8865\n for (let j = i + 1; j < nav.length; j++) {\n if (nav[j] >= gapTop) {\n filled = true;\n filledIndex = j;\n break;\n }\n }\n }\n\n gaps.push({\n type: isGapUp ? 'gap_up' : 'gap_down',\n startIndex: i - 1,\n endIndex: i,\n gapTop,\n gapBottom,\n gapSize: absChange,\n filled,\n filledIndex,\n });\n }\n }\n\n return gaps;\n}\n\n// ============================================================\n// \u8D8B\u52BF\u5F3A\u5EA6\u8BC4\u4F30\n// ============================================================\n\n/**\n * \u8D8B\u52BF\u5F3A\u5EA6\u8BC4\u5206\uFF080-100\uFF09\n * \u7EFC\u5408\u591A\u4E2A\u7EF4\u5EA6\u8BC4\u4F30\u5F53\u524D\u8D8B\u52BF\u7684\u5F3A\u5F31\n *\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param period \u8BC4\u4F30\u5468\u671F\uFF08\u9ED8\u8BA420\u5929\uFF09\n */\nexport function trendStrength(nav: NavSeries, period: number = 20): number {\n if (nav.length < period + 10) return 50;\n\n const recent = nav.slice(-period);\n const returns: number[] = [];\n for (let i = 1; i < recent.length; i++) {\n returns.push((recent[i] - recent[i - 1]) / recent[i - 1]);\n }\n\n // 1. \u65B9\u5411\u4E00\u81F4\u6027\uFF08\u6B63\u6536\u76CA\u5929\u6570\u5360\u6BD4\uFF09\n const positiveDays = returns.filter((r) => r > 0).length;\n const directionScore = (positiveDays / returns.length) * 100;\n\n // 2. \u7EBF\u6027\u56DE\u5F52\u62DF\u5408\u5EA6 (R\u00B2)\n const indices = returns.map((_, i) => i);\n const meanY = returns.reduce((a, b) => a + b, 0) / returns.length;\n const meanX = indices.reduce((a, b) => a + b, 0) / indices.length;\n\n let ssXY = 0, ssXX = 0, ssYY = 0;\n for (let i = 0; i < returns.length; i++) {\n ssXY += (indices[i] - meanX) * (returns[i] - meanY);\n ssXX += (indices[i] - meanX) ** 2;\n ssYY += (returns[i] - meanY) ** 2;\n }\n const rSquared = ssXX > 0 && ssYY > 0 ? (ssXY * ssXY) / (ssXX * ssYY) : 0;\n const fitScore = rSquared * 100;\n\n // 3. \u8FDE\u7EED\u4E0A\u6DA8/\u4E0B\u8DCC\u5929\u6570\n let maxStreak = 0;\n let currentStreak = 0;\n for (const r of returns) {\n if (r > 0) { currentStreak++; maxStreak = Math.max(maxStreak, currentStreak); }\n else currentStreak = 0;\n }\n const streakScore = Math.min(100, (maxStreak / returns.length) * 200);\n\n // \u7EFC\u5408\u8BC4\u5206\uFF08\u52A0\u6743\uFF09\n return directionScore * 0.4 + fitScore * 0.35 + streakScore * 0.25;\n}\n\n// ============================================================\n// \u5934\u80A9\u5F62\u6001\u8BC6\u522B\n// ============================================================\n\n/**\n * \u5934\u80A9\u5F62\u6001\u8BC6\u522B\uFF08\u7B80\u5316\u7248\uFF09\n * @param nav \u51C0\u503C\u5E8F\u5217\n * @param lookback \u56DE\u770B\u5929\u6570\n * @returns \u5934\u80A9\u9876/\u5E95\u5F62\u6001\u4FE1\u606F\n */\nexport function headAndShoulders(\n nav: NavSeries,\n lookback: number = 90\n): {\n type: 'head_and_shoulders_top' | 'head_and_shoulders_bottom' | 'none';\n leftShoulder: { index: number; value: number } | null;\n head: { index: number; value: number } | null;\n rightShoulder: { index: number; value: number } | null;\n neckline: number | null;\n confidence: number;\n} {\n const noResult = {\n type: 'none' as const,\n leftShoulder: null,\n head: null,\n rightShoulder: null,\n neckline: null,\n confidence: 0,\n };\n\n if (nav.length < lookback) return noResult;\n const window = nav.slice(-lookback);\n\n // \u5BFB\u627E\u5C40\u90E8\u6781\u503C\n const peaks: { index: number; value: number }[] = [];\n const troughs: { index: number; value: number }[] = [];\n\n for (let i = 3; i < window.length - 3; i++) {\n const isPeak = window[i] > window[i - 1] && window[i] > window[i + 1] &&\n window[i] > window[i - 2] && window[i] > window[i + 2] &&\n window[i] > window[i - 3] && window[i] > window[i + 3];\n const isTrough = window[i] < window[i - 1] && window[i] < window[i + 1] &&\n window[i] < window[i - 2] && window[i] < window[i + 2] &&\n window[i] < window[i - 3] && window[i] < window[i + 3];\n\n if (isPeak) peaks.push({ index: i, value: window[i] });\n if (isTrough) troughs.push({ index: i, value: window[i] });\n }\n\n // \u68C0\u67E5\u5934\u80A9\u9876\uFF1A\u4E09\u4E2A\u5CF0\uFF0C\u4E2D\u95F4\u6700\u9AD8\uFF0C\u4E24\u4FA7\u76F8\u8FD1\n if (peaks.length >= 3) {\n for (let i = 0; i < peaks.length - 2; i++) {\n const left = peaks[i];\n const head = peaks[i + 1];\n const right = peaks[i + 2];\n\n // \u5934\u90E8\u5FC5\u987B\u9AD8\u4E8E\u4E24\u80A9\n if (head.value <= left.value || head.value <= right.value) continue;\n\n // \u4E24\u80A9\u9AD8\u5EA6\u76F8\u8FD1\uFF08\u5BB9\u5DEE5%\uFF09\n const shoulderDiff = Math.abs(left.value - right.value) / left.value;\n if (shoulderDiff > 0.05) continue;\n\n // \u5934\u90E8\u9AD8\u4E8E\u80A9\u90E8\u81F3\u5C113%\n const headPremium = (head.value - (left.value + right.value) / 2) / ((left.value + right.value) / 2);\n if (headPremium < 0.03) continue;\n\n // \u9888\u7EBF = \u4E24\u80A9\u4E4B\u95F4\u7684\u6700\u4F4E\u70B9\n const between = window.slice(left.index, right.index + 1);\n const neckline = Math.min(...between);\n\n const confidence = Math.min(1, (1 - shoulderDiff / 0.05) * 0.5 + Math.min(headPremium / 0.1, 1) * 0.5);\n\n return {\n type: 'head_and_shoulders_top',\n leftShoulder: { index: nav.length - lookback + left.index, value: left.value },\n head: { index: nav.length - lookback + head.index, value: head.value },\n rightShoulder: { index: nav.length - lookback + right.index, value: right.value },\n neckline,\n confidence,\n };\n }\n }\n\n // \u68C0\u67E5\u5934\u80A9\u5E95\uFF08\u53CD\u8F6C\u5934\u80A9\uFF09\n if (troughs.length >= 3) {\n for (let i = 0; i < troughs.length - 2; i++) {\n const left = troughs[i];\n const head = troughs[i + 1];\n const right = troughs[i + 2];\n\n if (head.value >= left.value || head.value >= right.value) continue;\n\n const shoulderDiff = Math.abs(left.value - right.value) / left.value;\n if (shoulderDiff > 0.05) continue;\n\n const headDiscount = ((left.value + right.value) / 2 - head.value) / ((left.value + right.value) / 2);\n if (headDiscount < 0.03) continue;\n\n const between = window.slice(left.index, right.index + 1);\n const neckline = Math.max(...between);\n\n const confidence = Math.min(1, (1 - shoulderDiff / 0.05) * 0.5 + Math.min(headDiscount / 0.1, 1) * 0.5);\n\n return {\n type: 'head_and_shoulders_bottom',\n leftShoulder: { index: nav.length - lookback + left.index, value: left.value },\n head: { index: nav.length - lookback + head.index, value: head.value },\n rightShoulder: { index: nav.length - lookback + right.index, value: right.value },\n neckline,\n confidence,\n };\n }\n }\n\n return noResult;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["require_jstat", "__commonJSMin", "exports", "module", "window", "factory", "jStat", "Math", "undefined", "concat", "slice", "toString", "calcRdx", "n", "m", "val", "isArray", "arg", "isFunction", "isNumber", "num", "toVector", "arr", "args", "i", "fn", "obj", "j", "index", "submat", "ind", "column", "a", "nrow", "res", "row", "objArr", "rows", "cols", "func", "toAlter", "ncol", "col", "retZero", "retOne", "retIdent", "size", "min", "max", "length", "hival", "step", "current", "cnt", "start", "end", "rl", "_slice", "list", "rcSlice", "colSlice", "rowSlice", "A", "B", "nl", "ml", "diagArray", "mat", "t", "jProto", "funcs", "passfunc", "self", "results", "ascNum", "b", "clip", "sum", "mean", "tmp", "prod", "low", "high", "hash", "_arr", "logs", "meanOfLogs", "arrlen", "diffs", "arrLen", "distinctNumbers", "numberCounts", "number", "sortedDistinctNumbers", "numberRanks", "currentRank", "count", "first", "last", "rank", "maxCount", "numMaxCount", "mode_arr", "flag", "sumsqerr", "samples", "dev", "median", "quantilesArray", "alphap", "betap", "sortedArray", "quantileVals", "aleph", "k", "gamma", "exclusive", "realIndex", "frac", "score", "kind", "counter", "len", "strict", "value", "binCnt", "binWidth", "bins", "arr1", "arr2", "u", "v", "arr1Len", "sq_dev", "mu", "sigma", "skewSum", "fullbool", "tmpthis", "callbackFunction", "argsToPass", "curriedFunction", "vector", "x", "cof", "ser", "xx", "y", "x0", "x2", "xp", "gl", "gl0", "p", "q", "fact", "xden", "xnum", "z", "yi", "aln", "ap", "del", "c", "d", "h", "ITMAX", "an", "fpmin", "qab", "qap", "qam", "m2", "aa", "a1", "EPS", "gln", "err", "pp", "lna1", "afac", "isneg", "dd", "ty", "b1", "lna", "lnb", "al", "w", "bt", "shape", "oalph", "a2", "f", "newthis", "vals", "fnfunc", "alpha", "beta", "df1", "df2", "x1", "local", "scale", "dof", "rate", "ncp", "tol", "min_iterations", "flip", "prob", "lastvalue", "std", "dof2", "betinc", "eps", "a0", "b0", "m9", "c9", "betacdf", "s", "r", "N", "scaledPDF", "samplesDone", "scaledCDF", "factor", "l", "sumarr", "L", "lam", "U", "V", "slam", "loglam", "invalpha", "vr", "us", "laplaceSign", "tukeyWprob", "rr", "cc", "nleg", "ihalf", "C1", "C2", "C3", "bb", "wlar", "wincr1", "wincr2", "xleg", "aleg", "qsqz", "pr_w", "wincr", "blb", "binc", "bub", "einsum", "cc1", "wi", "elsum", "jj", "ac", "qexpo", "pplus", "pminus", "rinsum", "tukeyQinv", "p0", "q0", "p1", "q1", "p2", "q2", "p3", "q3", "p4", "q4", "c1", "c2", "c3", "c4", "c5", "vmax", "ps", "nmeans", "df", "nlegq", "ihalfq", "eps1", "eps2", "dhaf", "dquar", "deigh", "dlarg", "ulen1", "ulen2", "ulen3", "ulen4", "xlegq", "alegq", "f2", "f2lf", "f21", "ff4", "ulen", "ans", "otsum", "twa1", "t1", "wprb", "rotsum", "maxiter", "valx0", "valx1", "iter", "xabs", "push", "isUsable", "nrescols", "rescols", "left", "right", "nnorm", "newarr", "result", "det", "determinant", "submatrix", "sign", "maug", "pivot", "temp", "y2", "maxrow", "parts", "matrix_mode", "R", "T", "xv", "xk", "range", "qr2", "R_I", "I", "Aj", "cAi", "Ij", "cIi", "qr_solve", "array_mode", "QR", "Q", "attrs", "Q1", "R1", "RI", "Q2", "condition", "e", "ev", "maxim", "theta", "t_j", "u_j", "order", "k1", "k2", "u_j1", "k3", "k4", "h1", "X", "pos", "h_min", "g", "y1", "F", "dF", "dl", "temp1", "D", "temp2", "Y", "Bt", "C", "Vt", "sides", "zscore", "tscore", "expVar", "sample", "sampMean", "sampSampMean", "tmpargs", "unexpVar", "anovafscore", "fscore", "mean1", "mean2", "n1", "n2", "sd", "qscore", "arrays", "means", "change", "pvalue", "differenceOfProportions", "pooled", "se", "sub_regress", "exog", "var_count", "modelList", "endog_index", "exog_index", "ols", "endog", "nobs", "df_model", "df_resid", "coef", "predict", "resid", "ybar", "SSE", "SSR", "SST", "R2", "t_test", "model", "subModelList", "sigmaHat", "seBetaHat", "mod", "tStatistic", "pValue", "leftppf", "interval95", "F_test", "F_statistic", "fcdf", "ols_wrap", "ttest", "ftest", "adjust_R2", "matrixRows", "array", "jMat", "pass", "jMatX", "jMatY", "innerinv", "xtransp", "next", "compile", "jMatYBar", "yAverage", "covar", "sds", "ts", "inner", "yBar", "ssr", "sse", "sst", "Item", "data", "prev", "next", "LinkedList", "tail", "head", "current", "FixedSizeLinkedList", "LinkedList", "size", "maintainHigh", "maintainLow", "maintainSum", "data", "config", "getConfig", "key", "config", "format", "v", "precision", "getConfig", "IndicatorInput", "Indicator", "input", "format", "SMA", "Indicator", "input", "genFn", "period", "list", "LinkedList", "sum", "counter", "current", "result", "tick", "price", "sma", "EMA", "Indicator", "input", "period", "priceArray", "exponent", "sma", "SMA", "genFn", "tick", "prevEma", "result", "price", "ema", "WMA", "Indicator", "input", "period", "priceArray", "data", "LinkedList", "denominator", "result", "i", "next", "tick", "index", "price", "wma", "WEMA", "Indicator", "input", "period", "priceArray", "exponent", "sma", "SMA", "genFn", "tick", "prevEma", "result", "price", "wema", "MACD", "Indicator", "input", "oscillatorMAtype", "SMA", "EMA", "signalMAtype", "fastMAProducer", "v", "slowMAProducer", "signalMAProducer", "format", "index", "tick", "signal", "histogram", "fast", "slow", "result", "price", "macd", "AverageGain", "Indicator", "input", "values", "period", "format", "currentValue", "counter", "gainSum", "avgGain", "gain", "lastValue", "tick", "result", "price", "averagegain", "AverageLoss", "Indicator", "input", "values", "period", "format", "currentValue", "counter", "lossSum", "avgLoss", "loss", "lastValue", "tick", "result", "price", "averageloss", "RSI", "Indicator", "input", "period", "values", "GainProvider", "AverageGain", "LossProvider", "AverageLoss", "count", "current", "lastAvgGain", "lastAvgLoss", "RS", "currentRSI", "tick", "result", "price", "rsi", "SD", "Indicator", "input", "period", "priceArray", "sma", "SMA", "v", "tick", "mean", "currentSet", "FixedSizeLinkedList", "sd", "sum", "x", "result", "price", "nextResult", "BollingerBands", "Indicator", "input", "period", "priceArray", "stdDev", "format", "sma", "sd", "SMA", "v", "SD", "result", "tick", "calcSMA", "calcsd", "middle", "upper", "lower", "pb", "price", "bollingerbands", "WilderSmoothing", "Indicator", "input", "genFn", "period", "list", "LinkedList", "sum", "counter", "current", "result", "tick", "price", "wildersmoothing", "MDM", "_MDM", "Indicator", "input", "lows", "highs", "format", "minusDm", "current", "last", "upMove", "downMove", "tick", "index", "result", "price", "PDM", "_PDM", "Indicator", "input", "lows", "highs", "format", "plusDm", "current", "last", "upMove", "downMove", "tick", "index", "result", "price", "TrueRange", "Indicator", "input", "lows", "highs", "closes", "format", "current", "previousClose", "result", "tick", "index", "price", "truerange", "ADXOutput", "IndicatorInput", "ADX", "Indicator", "input", "lows", "highs", "closes", "period", "format", "plusDM", "PDM", "minusDM", "MDM", "emaPDM", "WilderSmoothing", "v", "emaMDM", "emaTR", "emaDX", "WEMA", "tr", "TrueRange", "tick", "index", "lastATR", "lastAPDM", "lastAMDM", "lastPDI", "lastMDI", "lastDX", "smoothedDX", "calcTr", "calcPDM", "calcMDM", "diDiff", "diSum", "result", "price", "adx", "ATR", "Indicator", "input", "lows", "highs", "closes", "period", "format", "trueRange", "TrueRange", "wema", "WEMA", "v", "tick", "avgTrueRange", "trange", "index", "result", "price", "atr", "ROC", "Indicator", "input", "period", "priceArray", "index", "pastPeriods", "FixedSizeLinkedList", "tick", "roc", "result", "price", "nextResult", "PSAR", "Indicator", "input", "highs", "lows", "genFn", "step", "max", "curr", "extreme", "sar", "furthest", "up", "accel", "prev", "tick", "index", "result", "nextResult", "psar", "Stochastic", "Indicator", "input", "lows", "highs", "closes", "period", "signalPeriod", "format", "index", "pastHighPeriods", "FixedSizeLinkedList", "pastLowPeriods", "dSma", "SMA", "v", "k", "d", "tick", "periodLow", "result", "nextResult", "stochastic", "WilliamsR", "Indicator", "input", "lows", "highs", "closes", "period", "format", "index", "pastHighPeriods", "FixedSizeLinkedList", "pastLowPeriods", "periodLow", "periodHigh", "tick", "williamsR", "low", "result", "price", "nextResult", "williamsr", "CCI", "Indicator", "input", "lows", "highs", "closes", "period", "format", "constant", "currentTpSet", "FixedSizeLinkedList", "tpSMACalculator", "SMA", "v", "tick", "tp", "smaTp", "meanDeviation", "cci", "sum", "x", "index", "result", "price", "StochasticRSI", "Indicator", "input", "closes", "rsiPeriod", "stochasticPeriod", "kPeriod", "dPeriod", "format", "index", "rsi", "RSI", "stochastic", "Stochastic", "dSma", "SMA", "v", "lastRSI", "stochasticRSI", "d", "result", "tick", "stochasticInput", "nextResult", "stochasticrsi", "navToHLC", "nav", "v", "padLeft", "arr", "totalLen", "padLen", "result", "lastNonNull", "i", "sma", "period", "raw", "SMA", "values", "ema", "EMA", "wma", "WMA", "dema", "ema1", "ema1Padded", "ema1Values", "ema2", "offset", "idx", "tema", "ema1Raw", "ema1Vals", "ema2Raw", "ema2Vals", "ema3Raw", "offset2", "ema2Full", "offset3", "ema3Full", "v1", "v2", "v3", "kama", "fast", "slow", "fastSC", "slowSC", "direction", "volatility", "j", "er", "sc", "prevKama", "macd", "fastPeriod", "slowPeriod", "signalPeriod", "MACD", "dif", "r", "dea", "histogram", "rsi", "RSI", "kdj", "kPeriod", "kSmooth", "dPeriod", "hlc", "Stochastic", "h", "kArr", "dArr", "jArr", "kVal", "dVal", "bollingerBands", "stdDev", "BollingerBands", "middle", "upper", "lower", "bandwidth", "percentB", "m", "u", "l", "donchianChannel", "slice", "high", "low", "keltnerChannel", "emaPeriod", "atrPeriod", "multiplier", "emaResult", "atrResult", "atr", "e", "a", "adx", "ADX", "adxArr", "plusDI", "minusDI", "ATR", "cci", "CCI", "roc", "ROC", "momentum", "williamsR", "WilliamsR", "stochasticRSI", "rsiPeriod", "stochPeriod", "StochasticRSI", "k", "d", "sar", "step", "max", "PSAR", "trix", "ema3", "prev", "curr", "dpo", "smaResult", "shift", "smaIdx", "bias", "maResult", "navPercentile", "lookback", "window", "current", "sorted", "b", "rank", "detectCrossSignal", "fastMA", "slowMA", "fVals", "sVals", "len", "fCurr", "fPrev", "sCurr", "sPrev", "detectMAAlignment", "maList", "maValues", "isBullish", "isBearish", "mean", "variance", "sum", "divergence", "massIndex", "sumPeriod", "ratios", "e1", "e2", "sum", "x", "let", "correction", "transition", "i", "mean", "sumNthPowerDeviations", "n", "const", "meanValue", "tempValue", "sampleVariance", "sumSquaredDeviationsValue", "besselsCorrection", "sampleStandardDeviation", "sampleVarianceX", "max", "x", "value", "i", "min", "quantileSorted", "x", "p", "const", "idx", "lower", "upper", "fraction", "quickselect", "arr", "k", "left", "right", "n", "m", "z", "s", "sd", "newLeft", "newRight", "t", "i", "j", "swap", "tmp", "quantile", "copy", "multiQuantileSelect", "results", "quantileIndex", "quantileSelect", "indices", "compare", "stack", "r", "l", "a", "b", "len", "linearRegression", "data", "let", "m", "b", "dataLength", "sumX", "sumY", "sumXX", "sumXY", "point", "x", "y", "i", "median", "x", "quantile", "sampleCovariance", "x", "y", "xmean", "mean", "ymean", "sum", "i", "const", "besselsCorrection", "sampleCorrelation", "cov", "xstd", "sampleStandardDeviation", "ystd", "sampleKurtosis", "n", "meanValue", "tempValue", "secondCentralMoment", "fourthCentralMoment", "sampleSkewness", "x", "meanValue", "mean", "tempValue", "sumSquaredDeviations", "sumCubedDeviations", "i", "const", "besselsCorrection", "theSampleStandardDeviation", "n", "cubedS", "variance", "x", "sumNthPowerDeviations", "standardDeviation", "const", "v", "BayesianClassifier", "item", "category", "k", "const", "v", "odds", "oddsSums", "combination", "const", "SQRT_2PI", "cumulativeDistribution", "z", "sum", "tmp", "i", "standardNormalTable", "const", "g", "LOGSQRT2PI", "const", "SQRT_2PI", "PerceptronModel", "features", "score", "i", "label", "const", "prediction", "gradient", "import_jstat", "TRADING_DAYS_PER_YEAR", "navToReturns", "nav", "returns", "i", "annualizeReturn", "dailyReturns", "cumulative", "acc", "r", "years", "totalReturn", "annualizedVolatility", "standardDeviation", "downsideVolatility", "riskFreeRate", "downsideReturns", "meanSqDev", "a", "b", "rollingVolatility", "window", "result", "slice", "volatilityCone", "windows", "quantiles", "cone", "w", "vols", "sorted", "qMap", "q", "quantileSorted", "maxDrawdown", "dates", "drawdownSeries", "peak", "peakIdx", "maxDD", "maxPeakIdx", "maxTroughIdx", "dd", "recoveryIdx", "peakValue", "maxDrawdownDuration", "maxDuration", "currentDuration", "calculateVaR", "confidence", "method", "mean", "std", "z", "calculateCVaR", "varValue", "tailReturns", "riskMetrics", "sharpeRatio", "annReturn", "annVol", "sortinoRatio", "dv", "calmarRatio", "treynorRatio", "benchmarkNav", "fundReturns", "benchReturns", "minLen", "fRet", "bRet", "beta", "calculateBeta", "omegaRatio", "threshold", "dailyThreshold", "gains", "losses", "winRate", "profitLossRatio", "wins", "avgWin", "avgLoss", "profitFactor", "totalWins", "totalLosses", "consecutiveWinLoss", "maxWins", "maxLosses", "curWins", "curLosses", "performanceMetrics", "consec", "benchmarkReturns", "cov", "sampleCovariance", "bVar", "variance", "calculateAlpha", "f", "fAnnReturn", "bAnnReturn", "trackingError", "excessReturns", "informationRatio", "meanExcess", "te", "benchmarkMetrics", "fundNav", "alpha", "ir", "corr", "sampleCorrelation", "rSquared", "statisticalFeatures", "nav", "returns", "navToReturns", "mean", "median", "stdDev", "standardDeviation", "skewness", "sampleSkewness", "kurtosis", "sampleKurtosis", "min", "max", "range", "coefficientOfVariation", "jarqueBera", "navStatisticalFeatures", "hurstExponent", "minWindowSize", "maxWindowSize", "numPoints", "n", "maxWin", "dataPoints", "logMin", "logMax", "p", "logWindowSize", "windowSize", "numSubPeriods", "totalRS", "validCount", "s", "start", "subPeriod", "std", "cumDeviations", "cumDev", "r", "rs", "avgRS", "regressionData", "d", "regression", "linearRegression", "H", "predicted", "actual", "meanActual", "ssTotal", "sum", "v", "ssResidual", "i", "rSquared", "interpretation", "autocorrelation", "maxLag", "variance", "coefficients", "lag", "cov", "lag1", "ljungBoxTest", "acf", "k", "q", "df", "z", "se", "zScore", "pValue", "normalCDF", "x", "a1", "a2", "a3", "a4", "a5", "sign", "t", "y", "returnQuantiles", "quantiles", "sorted", "a", "b", "result", "quantileSorted", "rollingSkewness", "window", "slice", "rollingKurtosis", "garch11", "unconditionalVar", "squaredReturns", "meanSquared", "autocov", "autoCorr", "alphaBeta", "alpha", "beta", "omega", "conditionalVariance", "prevVar", "newVar", "lastVar", "lastReturn", "nextPeriodForecast", "simulateDCA", "nav", "config", "dates", "amount", "interval", "startIndex", "totalInvested", "totalShares", "investmentDates", "valueHistory", "i", "navPrice", "shares", "currentValue", "currentNav", "averageCost", "returnRate", "profitLoss", "irr", "calculateIRR", "baseDay", "cashFlows", "d", "lastDay", "T", "npv", "r", "sum", "cf", "t", "npvDerivative", "maxIterations", "tolerance", "f", "fPrime", "newR", "bisectionIRR", "low", "high", "fLow", "fHigh", "mid", "fMid", "takeProfitStopLoss", "costPrice", "takeProfitThreshold", "stopLossThreshold", "currentPnL", "trailingStop", "trailPercent", "peakNav", "v", "drawdownFromPeak", "profitFromCost", "safetyMargin", "peak", "current", "pricePosition", "trough", "smartDCAMultiplier", "maPeriod", "maxMultiplier", "minMultiplier", "ma", "a", "b", "multiplier", "tieredBuySignal", "levels", "sorted", "rank", "percentile", "tieredSellSignal", "positionPnL", "buyIndex", "sellIndex", "sell", "buyNav", "sellNav", "value", "pnl", "holdDays", "annualizedReturn", "supportResistance", "nav", "tolerance", "minTouches", "current", "levelMap", "i", "isLocalHigh", "isLocalLow", "merged", "level", "count", "price", "validLevels", "touches", "a", "b", "supports", "l", "resistances", "doubleBottomTop", "lookback", "minDistance", "noResult", "window", "offset", "localMins", "localMaxs", "j", "first", "second", "distance", "priceDiff", "between", "neckValue", "neckIdx", "breakout", "similarity", "distanceFactor", "confidence", "detectGaps", "threshold", "gaps", "change", "absChange", "isGapUp", "gapTop", "gapBottom", "filled", "filledIndex", "trendStrength", "period", "recent", "returns", "directionScore", "r", "indices", "_", "meanY", "meanX", "ssXY", "ssXX", "ssYY", "fitScore", "maxStreak", "currentStreak", "streakScore", "headAndShoulders", "peaks", "troughs", "isPeak", "isTrough", "left", "head", "right", "shoulderDiff", "headPremium", "neckline", "headDiscount"]
7
+ }