-export const stdDeviation = (dataSet: number[]): number => {
- let totalDataSet = 0;
- for (const data of dataSet) {
- totalDataSet += data;
- }
- const dataSetMean = totalDataSet / dataSet.length;
- let totalGeometricDeviation = 0;
- for (const data of dataSet) {
- const deviation = data - dataSetMean;
- totalGeometricDeviation += deviation * deviation;
- }
- return Math.sqrt(totalGeometricDeviation / dataSet.length);
-};
+/**
+ * Computes the sample standard deviation of the given data set.
+ *
+ * @param dataSet - Data set.
+ * @param dataSetAverage - Average of the data set.
+ * @returns The sample standard deviation of the given data set.
+ * @see https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
+ * @internal
+ */
+export const stdDeviation = (dataSet: number[], dataSetAverage: number = mean(dataSet)): number => {
+ if (Array.isArray(dataSet) && (dataSet.length === 0 || dataSet.length === 1)) {
+ return 0
+ }
+ return Math.sqrt(
+ dataSet.reduce((accumulator, num) => accumulator + Math.pow(num - dataSetAverage, 2), 0) /
+ (dataSet.length - 1)
+ )
+}