mad.js (1850B)
1 import { flatten } from '../../utils/array.js'; 2 import { factory } from '../../utils/factory.js'; 3 import { improveErrorMessage } from './utils/improveErrorMessage.js'; 4 var name = 'mad'; 5 var dependencies = ['typed', 'abs', 'map', 'median', 'subtract']; 6 export var createMad = /* #__PURE__ */factory(name, dependencies, _ref => { 7 var { 8 typed, 9 abs, 10 map, 11 median, 12 subtract 13 } = _ref; 14 15 /** 16 * Compute the median absolute deviation of a matrix or a list with values. 17 * The median absolute deviation is defined as the median of the absolute 18 * deviations from the median. 19 * 20 * Syntax: 21 * 22 * math.mad(a, b, c, ...) 23 * math.mad(A) 24 * 25 * Examples: 26 * 27 * math.mad(10, 20, 30) // returns 10 28 * math.mad([1, 2, 3]) // returns 1 29 * math.mad([[1, 2, 3], [4, 5, 6]]) // returns 1.5 30 * 31 * See also: 32 * 33 * median, mean, std, abs 34 * 35 * @param {Array | Matrix} array 36 * A single matrix or multiple scalar values. 37 * @return {*} The median absolute deviation. 38 */ 39 return typed(name, { 40 // mad([a, b, c, d, ...]) 41 'Array | Matrix': _mad, 42 // mad(a, b, c, d, ...) 43 '...': function _(args) { 44 return _mad(args); 45 } 46 }); 47 48 function _mad(array) { 49 array = flatten(array.valueOf()); 50 51 if (array.length === 0) { 52 throw new Error('Cannot calculate median absolute deviation (mad) of an empty array'); 53 } 54 55 try { 56 var med = median(array); 57 return median(map(array, function (value) { 58 return abs(subtract(value, med)); 59 })); 60 } catch (err) { 61 if (err instanceof TypeError && err.message.indexOf('median') !== -1) { 62 throw new TypeError(err.message.replace('median', 'mad')); 63 } else { 64 throw improveErrorMessage(err, 'mad'); 65 } 66 } 67 } 68 });