All files / src/bases descriptive.ts

93.2% Statements 96/103
78.12% Branches 25/32
90% Functions 9/10
93.2% Lines 96/103

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 1041x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 1x 1x         1x 1x 76x 76x 76x 76x 1x 1x 4x 4x 4x 4x 4x 4x   4x 4x 4x 4x 4x 4x 1x 1x 4x 4x 4x 4x 36x 10x 36x 26x 26x 4x 4x 4x 4x 4x 26x 6x 6x 4x 4x 4x 4x 1x 1x 4x 4x 1x 1x 4x 4x 1x 1x 8x 8x 8x 8x     8x 8x 8x 1x 1x 4x 4x 4x 4x 1x 1x 8x 8x 8x 8x 8x 8x 1x  
type Group = `${"population" | "sample"}`;
 
 
 
 
export default class Descriptive {
    name: string;
    data: Array<number>;
    group: Group;
    rounded: number|false;
    size: number;
 
    constructor (name: string, data: Array<number>, group: Group, rounded: number|false = false) {
        this.name = name;
        this.data = data;
        this.group = group;
        this.size = data.length;
        this.rounded = rounded;
    }
 
    sum(): number {
        var sum = this.data.reduce((sum, value) => sum + value, 0);

        return this.rounded ? parseFloat(sum.toFixed(this.rounded)): sum;
    }
 
    mean(): number {
        var mean = this.data.reduce((sum, value) => sum + value, 0)/this.size;
 
        return this.rounded ? parseFloat(mean.toFixed(this.rounded)): mean;
    }
 
    median(): number {
        var dataCopy: Array<number> = this.data;
        var sortedData: Array<number> = dataCopy.sort((a, b) => a - b);
 
        var median: number = 0;
 
        if (this.size % 2 == 0) {
            median = (sortedData[(this.size/2) - 1] + sortedData[(this.size/2)])/2;
        } else {
            median = sortedData[(this.size+1)/2 - 1];
        }
 
        return median;
    }
 
    mode(): Array<number> {
        var counts: Record<number, number> = {};
        var modes: Array<number> = [];
 
        this.data.forEach((element) => {
            if (counts.hasOwnProperty(element)) {
                counts[element]++;
            } else {
                counts[element] = 1;
            }
        });
 
        var modeCount = Object.entries(counts).reduce((mode, current) => mode[1] < current[1] ? current: mode)[1];
 
        Object.entries(counts).forEach((count) => {
            if (count[1] == modeCount) {
                modes.push(Number(count[0]));
            }
        });
 
        return modes;
    }
 
    max(): number {
        return this.data.reduce((max, current) => current > max ? current: max);
    }
 
    min(): number {
        return this.data.reduce((min, current) => current < min ? current: min);
    }
 
    variance(): number {
        var variance = 0;
        if (this.group == "sample") {
            variance = this.sumOfSquareDeviations()/(this.size - 1);
        } else {
            variance = this.sumOfSquareDeviations()/(this.size);
        }
 
        return this.rounded ? parseFloat(variance.toFixed(this.rounded)): variance;
    }
 
    standardDeviation(): number {
        var standardDeviation = Math.sqrt(this.variance());
 
        return this.rounded ? parseFloat(standardDeviation.toFixed(this.rounded)): standardDeviation;
    }
 
    private sumOfSquareDeviations(): number {
        var squareDeviations = this.data.map((value) => Math.pow((value - this.mean()), 2));
 
        var sumOfSD = squareDeviations.reduce((sum, value) => sum + value, 0);
 
        return this.rounded ? parseFloat(sumOfSD.toFixed(this.rounded)): sumOfSD;
    }
}