1 import { mean
} from
'rambda'
3 export const min
= (...args
: number[]): number =>
4 args
.reduce((minimum
, num
) => (minimum
< num
? minimum
: num
), Number.POSITIVE_INFINITY
)
6 export const max
= (...args
: number[]): number =>
7 args
.reduce((maximum
, num
) => (maximum
> num
? maximum
: num
), Number.NEGATIVE_INFINITY
)
9 // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree
10 export const nthPercentile
= (dataSet
: number[], percentile
: number): number => {
11 if (percentile
< 0 && percentile
> 100) {
12 throw new RangeError('Percentile is not between 0 and 100')
14 if (Array.isArray(dataSet
) && dataSet
.length
=== 0) {
17 const sortedDataSet
= dataSet
.slice().sort((a
, b
) => a
- b
)
18 if (percentile
=== 0 || sortedDataSet
.length
=== 1) {
19 return sortedDataSet
[0]
21 if (percentile
=== 100) {
22 return sortedDataSet
[sortedDataSet
.length
- 1]
24 const base
= (percentile
/ 100) * (sortedDataSet
.length
- 1)
25 const baseIndex
= Math.floor(base
)
26 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
27 if (sortedDataSet
[baseIndex
+ 1] != null) {
29 sortedDataSet
[baseIndex
] +
30 (base
- baseIndex
) * (sortedDataSet
[baseIndex
+ 1] - sortedDataSet
[baseIndex
])
33 return sortedDataSet
[baseIndex
]
37 * Computes the sample standard deviation of the given data set.
39 * @param dataSet - Data set.
40 * @param dataSetAverage - Average of the data set.
41 * @returns The sample standard deviation of the given data set.
42 * @see https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
45 export const stdDeviation
= (dataSet
: number[], dataSetAverage
: number = mean(dataSet
)): number => {
46 if (Array.isArray(dataSet
) && (dataSet
.length
=== 0 || dataSet
.length
=== 1)) {
50 dataSet
.reduce((accumulator
, num
) => accumulator
+ Math.pow(num
- dataSetAverage
, 2), 0) /