Skip to content
This repository has been archived by the owner on Apr 11, 2024. It is now read-only.

Producing a (larger) t-dist table for two-sided region testing; extended approach, related to #148 #194

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 87 additions & 10 deletions benchmark.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -1909,15 +1986,15 @@
}

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;
// Compute the sample standard deviation (estimate of the population standard deviation).
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;
Expand Down