"use strict"; /** * @license * Copyright 2018 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ Object.defineProperty(exports, "__esModule", { value: true }); var test_util_1 = require("../test_util"); function jarqueBeraNormalityTest(values) { // https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test var n = values.length; var s = skewness(values); var k = kurtosis(values); var jb = n / 6 * (Math.pow(s, 2) + 0.25 * Math.pow(k - 3, 2)); // JB test requires 2-degress of freedom from Chi-Square @ 0.95: // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm var CHI_SQUARE_2DEG = 5.991; if (jb > CHI_SQUARE_2DEG) { throw new Error("Invalid p-value for JB: " + jb); } } exports.jarqueBeraNormalityTest = jarqueBeraNormalityTest; function expectArrayInMeanStdRange(actual, expectedMean, expectedStdDev, epsilon) { if (epsilon == null) { epsilon = test_util_1.testEpsilon(); } var actualMean = mean(actual); test_util_1.expectNumbersClose(actualMean, expectedMean, epsilon); test_util_1.expectNumbersClose(standardDeviation(actual, actualMean), expectedStdDev, epsilon); } exports.expectArrayInMeanStdRange = expectArrayInMeanStdRange; function mean(values) { var sum = 0; for (var i = 0; i < values.length; i++) { sum += values[i]; } return sum / values.length; } function standardDeviation(values, mean) { var squareDiffSum = 0; for (var i = 0; i < values.length; i++) { var diff = values[i] - mean; squareDiffSum += diff * diff; } return Math.sqrt(squareDiffSum / values.length); } function kurtosis(values) { // https://en.wikipedia.org/wiki/Kurtosis var valuesMean = mean(values); var n = values.length; var sum2 = 0; var sum4 = 0; for (var i = 0; i < n; i++) { var v = values[i] - valuesMean; sum2 += Math.pow(v, 2); sum4 += Math.pow(v, 4); } return (1 / n) * sum4 / Math.pow((1 / n) * sum2, 2); } function skewness(values) { // https://en.wikipedia.org/wiki/Skewness var valuesMean = mean(values); var n = values.length; var sum2 = 0; var sum3 = 0; for (var i = 0; i < n; i++) { var v = values[i] - valuesMean; sum2 += Math.pow(v, 2); sum3 += Math.pow(v, 3); } return (1 / n) * sum3 / Math.pow((1 / (n - 1)) * sum2, 3 / 2); } //# sourceMappingURL=rand_util.js.map