2 * Computes the average of the given data set.
4 * @param dataSet - Data set.
5 * @returns The average of the given data set.
8 export const average
= (dataSet
: number[]): number => {
9 if (Array.isArray(dataSet
) && dataSet
.length
=== 0) {
11 } else if (Array.isArray(dataSet
) && dataSet
.length
=== 1) {
14 return dataSet
.reduce((accumulator
, nb
) => accumulator
+ nb
, 0) / dataSet
.length
18 * Computes the median of the given data set.
20 * @param dataSet - Data set.
21 * @returns The median of the given data set.
24 export const median
= (dataSet
: number[]): number => {
25 if (Array.isArray(dataSet
) && dataSet
.length
=== 0) {
27 } else if (Array.isArray(dataSet
) && dataSet
.length
=== 1) {
30 const sortedDataSet
= dataSet
.slice().sort((a
, b
) => a
- b
)
32 (sortedDataSet
[(sortedDataSet
.length
- 1) >> 1] + sortedDataSet
[sortedDataSet
.length
>> 1]) / 2
36 // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree
37 export const nthPercentile
= (dataSet
: number[], percentile
: number): number => {
38 if (percentile
< 0 && percentile
> 100) {
39 throw new RangeError('Percentile is not between 0 and 100')
41 if (Array.isArray(dataSet
) && dataSet
.length
=== 0) {
44 const sortedDataSet
= dataSet
.slice().sort((a
, b
) => a
- b
)
45 if (percentile
=== 0 || sortedDataSet
.length
=== 1) {
46 return sortedDataSet
[0]
48 if (percentile
=== 100) {
49 return sortedDataSet
[sortedDataSet
.length
- 1]
51 const percentileIndexBase
= (percentile
/ 100) * (sortedDataSet
.length
- 1)
52 const percentileIndexInteger
= Math.floor(percentileIndexBase
)
53 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
54 if (sortedDataSet
[percentileIndexInteger
+ 1] != null) {
56 sortedDataSet
[percentileIndexInteger
] +
57 (percentileIndexBase
- percentileIndexInteger
) *
58 (sortedDataSet
[percentileIndexInteger
+ 1] - sortedDataSet
[percentileIndexInteger
])
61 return sortedDataSet
[percentileIndexInteger
]
65 * Computes the sample standard deviation of the given data set.
67 * @param dataSet - Data set.
68 * @param dataSetAverage - Average of the data set.
69 * @returns The sample standard deviation of the given data set.
70 * @see https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
73 export const stdDeviation
= (
75 dataSetAverage
: number = average(dataSet
)
77 if (Array.isArray(dataSet
) && (dataSet
.length
=== 0 || dataSet
.length
=== 1)) {
81 dataSet
.reduce((accumulator
, num
) => accumulator
+ Math.pow(num
- dataSetAverage
, 2), 0) /