From 237d5a626673c2c1b8d998a003ebefda7304628e Mon Sep 17 00:00:00 2001 From: Ger Hobbelt Date: Thu, 21 Dec 2017 02:11:17 +0100 Subject: [PATCH] Producing a (larger) t-dist table for two-sided region testing, using the table data published in the t-dist wikipedia page: https://en.wikipedia.org/wiki/Student%27s_t-distribution. See 'Analysis' comment at issue #148. This commit also adds a few more URLs to reference pages for other bits of the statistics calculus' math background. --- benchmark.js | 97 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 87 insertions(+), 10 deletions(-) diff --git a/benchmark.js b/benchmark.js index efab8f68..c4519f90 100644 --- a/benchmark.js +++ b/benchmark.js @@ -68,16 +68,93 @@ /** * T-Distribution two-tailed critical values for 95% confidence. - * For more info see http://www.itl.nist.gov/div898/handbook/eda/section3/eda3672.htm. + * For more info see + * - https://www.cliffsnotes.com/study-guides/statistics/principles-of-testing/one-and-twotailed-tests + * - https://en.wikipedia.org/wiki/One-_and_two-tailed_tests + * - https://en.wikipedia.org/wiki/Student%27s_t-distribution + * - http://www.itl.nist.gov/div898/handbook/eda/section3/eda3672.htm (WARNING: the table listed there is for ONE-SIDED regions!) */ - var tTable = { - '1': 12.706, '2': 4.303, '3': 3.182, '4': 2.776, '5': 2.571, '6': 2.447, - '7': 2.365, '8': 2.306, '9': 2.262, '10': 2.228, '11': 2.201, '12': 2.179, - '13': 2.16, '14': 2.145, '15': 2.131, '16': 2.12, '17': 2.11, '18': 2.101, - '19': 2.093, '20': 2.086, '21': 2.08, '22': 2.074, '23': 2.069, '24': 2.064, - '25': 2.06, '26': 2.056, '27': 2.052, '28': 2.048, '29': 2.045, '30': 2.042, - 'infinity': 1.96 + var tTableMaster = { + // One-sided 75% 80% 85% 90% 95% 97.5% 99% 99.5% 99.75% 99.9% 99.95% + // Two-sided 50% 60% 70% 80% 90% 95% 98% 99% 99.5% 99.8% 99.9% + '1': [1.000, 1.376, 1.963, 3.078, 6.314, 12.71, 31.82, 63.66, 127.3, 318.3, 636.6], + '2': [0.816, 1.080, 1.386, 1.886, 2.920, 4.303, 6.965, 9.925, 14.09, 22.33, 31.60], + '3': [0.765, 0.978, 1.250, 1.638, 2.353, 3.182, 4.541, 5.841, 7.453, 10.21, 12.92], + '4': [0.741, 0.941, 1.190, 1.533, 2.132, 2.776, 3.747, 4.604, 5.598, 7.173, 8.610], + '5': [0.727, 0.920, 1.156, 1.476, 2.015, 2.571, 3.365, 4.032, 4.773, 5.893, 6.869], + '6': [0.718, 0.906, 1.134, 1.440, 1.943, 2.447, 3.143, 3.707, 4.317, 5.208, 5.959], + '7': [0.711, 0.896, 1.119, 1.415, 1.895, 2.365, 2.998, 3.499, 4.029, 4.785, 5.408], + '8': [0.706, 0.889, 1.108, 1.397, 1.860, 2.306, 2.896, 3.355, 3.833, 4.501, 5.041], + '9': [0.703, 0.883, 1.100, 1.383, 1.833, 2.262, 2.821, 3.250, 3.690, 4.297, 4.781], + '10': [0.700, 0.879, 1.093, 1.372, 1.812, 2.228, 2.764, 3.169, 3.581, 4.144, 4.587], + '11': [0.697, 0.876, 1.088, 1.363, 1.796, 2.201, 2.718, 3.106, 3.497, 4.025, 4.437], + '12': [0.695, 0.873, 1.083, 1.356, 1.782, 2.179, 2.681, 3.055, 3.428, 3.930, 4.318], + '13': [0.694, 0.870, 1.079, 1.350, 1.771, 2.160, 2.650, 3.012, 3.372, 3.852, 4.221], + '14': [0.692, 0.868, 1.076, 1.345, 1.761, 2.145, 2.624, 2.977, 3.326, 3.787, 4.140], + '15': [0.691, 0.866, 1.074, 1.341, 1.753, 2.131, 2.602, 2.947, 3.286, 3.733, 4.073], + '16': [0.690, 0.865, 1.071, 1.337, 1.746, 2.120, 2.583, 2.921, 3.252, 3.686, 4.015], + '17': [0.689, 0.863, 1.069, 1.333, 1.740, 2.110, 2.567, 2.898, 3.222, 3.646, 3.965], + '18': [0.688, 0.862, 1.067, 1.330, 1.734, 2.101, 2.552, 2.878, 3.197, 3.610, 3.922], + '19': [0.688, 0.861, 1.066, 1.328, 1.729, 2.093, 2.539, 2.861, 3.174, 3.579, 3.883], + '20': [0.687, 0.860, 1.064, 1.325, 1.725, 2.086, 2.528, 2.845, 3.153, 3.552, 3.850], + '21': [0.686, 0.859, 1.063, 1.323, 1.721, 2.080, 2.518, 2.831, 3.135, 3.527, 3.819], + '22': [0.686, 0.858, 1.061, 1.321, 1.717, 2.074, 2.508, 2.819, 3.119, 3.505, 3.792], + '23': [0.685, 0.858, 1.060, 1.319, 1.714, 2.069, 2.500, 2.807, 3.104, 3.485, 3.767], + '24': [0.685, 0.857, 1.059, 1.318, 1.711, 2.064, 2.492, 2.797, 3.091, 3.467, 3.745], + '25': [0.684, 0.856, 1.058, 1.316, 1.708, 2.060, 2.485, 2.787, 3.078, 3.450, 3.725], + '26': [0.684, 0.856, 1.058, 1.315, 1.706, 2.056, 2.479, 2.779, 3.067, 3.435, 3.707], + '27': [0.684, 0.855, 1.057, 1.314, 1.703, 2.052, 2.473, 2.771, 3.057, 3.421, 3.690], + '28': [0.683, 0.855, 1.056, 1.313, 1.701, 2.048, 2.467, 2.763, 3.047, 3.408, 3.674], + '29': [0.683, 0.854, 1.055, 1.311, 1.699, 2.045, 2.462, 2.756, 3.038, 3.396, 3.659], + '30': [0.683, 0.854, 1.055, 1.310, 1.697, 2.042, 2.457, 2.750, 3.030, 3.385, 3.646], + '40': [0.681, 0.851, 1.050, 1.303, 1.684, 2.021, 2.423, 2.704, 2.971, 3.307, 3.551], + '50': [0.679, 0.849, 1.047, 1.299, 1.676, 2.009, 2.403, 2.678, 2.937, 3.261, 3.496], + '60': [0.679, 0.848, 1.045, 1.296, 1.671, 2.000, 2.390, 2.660, 2.915, 3.232, 3.460], + '80': [0.678, 0.846, 1.043, 1.292, 1.664, 1.990, 2.374, 2.639, 2.887, 3.195, 3.416], + '100': [0.677, 0.845, 1.042, 1.290, 1.660, 1.984, 2.364, 2.626, 2.871, 3.174, 3.390], + '120': [0.677, 0.845, 1.041, 1.289, 1.658, 1.980, 2.358, 2.617, 2.860, 3.160, 3.373], + 'infinity': [0.674, 0.842, 1.036, 1.282, 1.645, 1.960, 2.326, 2.576, 2.807, 3.090, 3.291], }; + var tTable = function (t) { + var j = 5; // index for p=0.05 for two-sided region + var rv = { + infinity: t.infinity[j] + }; + var i1, v1; + var todo1 = []; + + for (var i = 1; i <= 120; i++) { + var v = (t[i] && t[i][j]); + // when the entry doesn't exist in the master table, approximate: + if (!v) { + // prep for linear interpolation within the lookup table: this is a simple approximation + // of the t-values. + todo1.push(i, i1, v1); + } else { + // exec linear interpolation for those entries where this is the END edge: + for (var k = 0, kl = todo1.length; k < kl; k += 3) { + var i2 = todo1[k]; + var ia = todo1[k + 1]; + var va = todo1[k + 2]; + var d = i - ia; + var r = i - i2; + var vx = (va * r + v * (d - r)) / d; + rv[i2] = vx; + } + todo1.length = 0; + + // this is the START edge for future 'todo' entries: + i1 = i; + v1 = v; + + rv[i] = v; + } + } + return rv; + }(tTableMaster); + if (0) { + console.log('tTable:', tTable); + } /** * Critical Mann-Whitney U-values for 95% confidence. @@ -1909,7 +1986,7 @@ } if (!done) { - // Compute the sample mean (estimate of the population mean). + // Compute the sample mean (estimate of the population mean). See also https://en.wikipedia.org/wiki/Student%27s_t-distribution mean = getMean(sample); // Compute the sample variance (estimate of the population variance). variance = _.reduce(sample, varOf, 0) / (size - 1) || 0; @@ -1917,7 +1994,7 @@ sd = sqrt(variance); // Compute the standard error of the mean (a.k.a. the standard deviation of the sampling distribution of the sample mean). sem = sd / sqrt(size); - // Compute the degrees of freedom. + // Compute the degrees of freedom. See https://en.wikipedia.org/wiki/Degrees_of_freedom_%28statistics%29#In_probability_distributions df = size - 1; // Compute the critical value. critical = tTable[Math.round(df) || 1] || tTable.infinity;