1
|
|
|
<?php declare(strict_types=1); |
2
|
|
|
|
3
|
|
|
namespace AlecRabbit\Tools\Internal; |
4
|
|
|
|
5
|
|
|
class TDistribution |
6
|
|
|
{ |
7
|
|
|
protected const T_VALUES = |
8
|
|
|
[ |
9
|
|
|
1 => [12.71, 31.82, 63.66, 127.3, 318.3, 636.6], |
10
|
|
|
2 => [4.303, 6.965, 9.925, 14.09, 22.33, 31.6], |
11
|
|
|
3 => [3.182, 4.541, 5.841, 7.453, 10.21, 12.92], |
12
|
|
|
4 => [2.776, 3.747, 4.604, 5.598, 7.173, 8.61], |
13
|
|
|
5 => [2.571, 3.365, 4.032, 4.773, 5.893, 6.869], |
14
|
|
|
6 => [2.447, 3.143, 3.707, 4.317, 5.208, 5.959], |
15
|
|
|
7 => [2.365, 2.998, 3.499, 4.029, 4.785, 5.408], |
16
|
|
|
8 => [2.306, 2.896, 3.355, 3.833, 4.501, 5.041], |
17
|
|
|
9 => [2.262, 2.821, 3.25, 3.69, 4.297, 4.781], |
18
|
|
|
10 => [2.228, 2.764, 3.169, 3.581, 4.144, 4.587], |
19
|
|
|
11 => [2.201, 2.718, 3.106, 3.497, 4.025, 4.437], |
20
|
|
|
12 => [2.179, 2.681, 3.055, 3.428, 3.93, 4.318], |
21
|
|
|
13 => [2.16, 2.65, 3.012, 3.372, 3.852, 4.221], |
22
|
|
|
14 => [2.145, 2.624, 2.977, 3.326, 3.787, 4.14], |
23
|
|
|
15 => [2.131, 2.602, 2.947, 3.286, 3.733, 4.073], |
24
|
|
|
16 => [2.12, 2.583, 2.921, 3.252, 3.686, 4.015], |
25
|
|
|
17 => [2.11, 2.567, 2.898, 3.222, 3.646, 3.965], |
26
|
|
|
18 => [2.101, 2.552, 2.878, 3.197, 3.61, 3.922], |
27
|
|
|
19 => [2.093, 2.539, 2.861, 3.174, 3.579, 3.883], |
28
|
|
|
20 => [2.086, 2.528, 2.845, 3.153, 3.552, 3.85], |
29
|
|
|
21 => [2.08, 2.518, 2.831, 3.135, 3.527, 3.819], |
30
|
|
|
22 => [2.074, 2.508, 2.819, 3.119, 3.505, 3.792], |
31
|
|
|
23 => [2.069, 2.5, 2.807, 3.104, 3.485, 3.767], |
32
|
|
|
24 => [2.064, 2.492, 2.797, 3.091, 3.467, 3.745], |
33
|
|
|
25 => [2.06, 2.485, 2.787, 3.078, 3.45, 3.725], |
34
|
|
|
26 => [2.056, 2.479, 2.779, 3.067, 3.435, 3.707], |
35
|
|
|
27 => [2.052, 2.473, 2.771, 3.057, 3.421, 3.69], |
36
|
|
|
28 => [2.048, 2.467, 2.763, 3.047, 3.408, 3.674], |
37
|
|
|
29 => [2.045, 2.462, 2.756, 3.038, 3.396, 3.659], |
38
|
|
|
30 => [2.042, 2.457, 2.75, 3.03, 3.385, 3.646], |
39
|
|
|
40 => [2.021, 2.423, 2.704, 2.971, 3.307, 3.551], |
40
|
|
|
50 => [2.009, 2.403, 2.678, 2.937, 3.261, 3.496], |
41
|
|
|
60 => [2, 2.39, 2.66, 2.915, 3.232, 3.46], |
42
|
|
|
80 => [1.99, 2.374, 2.639, 2.887, 3.195, 3.416], |
43
|
|
|
100 => [1.984, 2.364, 2.626, 2.871, 3.174, 3.39], |
44
|
|
|
120 => [1.98, 2.358, 2.617, 2.86, 3.16, 3.373], |
45
|
|
|
10000 => [1.96, 2.326, 2.576, 2.807, 3.09, 3.291], |
46
|
|
|
]; |
47
|
|
|
|
48
|
|
|
protected const P_VALUES = [ |
49
|
|
|
0 => 0.95, |
50
|
|
|
1 => 0.98, |
51
|
|
|
2 => 0.99, |
52
|
|
|
3 => 0.995, |
53
|
|
|
4 => 0.998, |
54
|
|
|
5 => 0.999, |
55
|
|
|
]; |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* @param int $numOfMeasurements |
59
|
|
|
* @param float $p |
60
|
|
|
* @return float |
61
|
|
|
*/ |
62
|
|
|
public static function tValue(int $numOfMeasurements, float $p = 0.95): float |
63
|
|
|
{ |
64
|
|
|
$x = array_search($p, self::P_VALUES, true); |
65
|
|
|
$y = self::getClosest($numOfMeasurements); |
66
|
|
|
return self::T_VALUES[$y][$x]; |
67
|
|
|
} |
68
|
|
|
|
69
|
|
|
/** |
70
|
|
|
* @param int $search |
71
|
|
|
* @return int |
72
|
|
|
*/ |
73
|
|
|
protected static function getClosest(int $search): int |
74
|
|
|
{ |
75
|
|
|
$closest = null; |
76
|
|
|
foreach (self::T_VALUES as $key => $item) { |
77
|
|
|
if ($closest === null || abs($search - $closest) > abs($key - $search)) { |
78
|
|
|
$closest = $key; |
79
|
|
|
} |
80
|
|
|
} |
81
|
|
|
return (int)$closest; |
82
|
|
|
} |
83
|
|
|
} |
84
|
|
|
|