UNPKG

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