Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
29 / 29 |
|
100.00% |
8 / 8 |
CRAP | |
100.00% |
1 / 1 |
TDistribution | |
100.00% |
29 / 29 |
|
100.00% |
8 / 8 |
20 | |
100.00% |
1 / 1 |
getMean | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getMedian | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getMode | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getSkewness | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getVariance | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
2 | |||
getStandardDeviation | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
2 | |||
getExKurtosis | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
3 | |||
getCdf | |
100.00% |
22 / 22 |
|
100.00% |
1 / 1 |
9 |
1 | <?php |
2 | /** |
3 | * Jingga |
4 | * |
5 | * PHP Version 8.1 |
6 | * |
7 | * @package phpOMS\Math\Stochastic\Distribution |
8 | * @copyright Dennis Eichhorn |
9 | * @license OMS License 2.0 |
10 | * @version 1.0.0 |
11 | * @link https://jingga.app |
12 | */ |
13 | declare(strict_types=1); |
14 | |
15 | namespace phpOMS\Math\Stochastic\Distribution; |
16 | |
17 | /** |
18 | * T distribution. |
19 | * |
20 | * Test the similarity of two means |
21 | * |
22 | * @package phpOMS\Math\Stochastic\Distribution |
23 | * @license OMS License 2.0 |
24 | * @link https://jingga.app |
25 | * @since 1.0.0 |
26 | */ |
27 | final class TDistribution |
28 | { |
29 | /** |
30 | * T table. |
31 | * |
32 | * [degrees of freedom = df] |
33 | * |
34 | * @var array<int, array<string, float>> |
35 | * @since 1.0.0 |
36 | */ |
37 | public const TABLE = [ |
38 | 1 => ['0' => 0.000, '0.5' => 1.000, '0.6' => 1.376, '0.7' => 1.963, '0.8' => 3.078, '0.9' => 6.314, '0.95' => 12.71, '0.98' => 31.82, '0.99' => 63.66, '0.998' => 318.31, '0.999' => 636.62,], |
39 | 2 => ['0' => 0.000, '0.5' => 0.816, '0.6' => 1.061, '0.7' => 1.386, '0.8' => 1.886, '0.9' => 2.920, '0.95' => 4.303, '0.98' => 6.965, '0.99' => 9.925, '0.998' => 22.327, '0.999' => 31.599,], |
40 | 3 => ['0' => 0.000, '0.5' => 0.765, '0.6' => 0.978, '0.7' => 1.250, '0.8' => 1.638, '0.9' => 2.353, '0.95' => 3.182, '0.98' => 4.541, '0.99' => 5.841, '0.998' => 10.215, '0.999' => 12.924,], |
41 | 4 => ['0' => 0.000, '0.5' => 0.741, '0.6' => 0.941, '0.7' => 1.190, '0.8' => 1.533, '0.9' => 2.132, '0.95' => 2.776, '0.98' => 3.747, '0.99' => 4.604, '0.998' => 7.173, '0.999' => 8.610,], |
42 | 5 => ['0' => 0.000, '0.5' => 0.727, '0.6' => 0.920, '0.7' => 1.156, '0.8' => 1.476, '0.9' => 2.015, '0.95' => 2.571, '0.98' => 3.365, '0.99' => 4.032, '0.998' => 5.893, '0.999' => 6.869,], |
43 | 6 => ['0' => 0.000, '0.5' => 0.718, '0.6' => 0.906, '0.7' => 1.134, '0.8' => 1.440, '0.9' => 1.943, '0.95' => 2.447, '0.98' => 3.143, '0.99' => 3.707, '0.998' => 5.208, '0.999' => 5.959,], |
44 | 7 => ['0' => 0.000, '0.5' => 0.711, '0.6' => 0.896, '0.7' => 1.119, '0.8' => 1.415, '0.9' => 1.895, '0.95' => 2.365, '0.98' => 2.998, '0.99' => 3.499, '0.998' => 4.785, '0.999' => 5.408,], |
45 | 8 => ['0' => 0.000, '0.5' => 0.706, '0.6' => 0.889, '0.7' => 1.108, '0.8' => 1.397, '0.9' => 1.860, '0.95' => 2.306, '0.98' => 2.896, '0.99' => 3.355, '0.998' => 4.501, '0.999' => 5.041,], |
46 | 9 => ['0' => 0.000, '0.5' => 0.703, '0.6' => 0.883, '0.7' => 1.100, '0.8' => 1.383, '0.9' => 1.833, '0.95' => 2.262, '0.98' => 2.821, '0.99' => 3.250, '0.998' => 4.297, '0.999' => 4.781,], |
47 | 10 => ['0' => 0.000, '0.5' => 0.700, '0.6' => 0.879, '0.7' => 1.093, '0.8' => 1.372, '0.9' => 1.812, '0.95' => 2.228, '0.98' => 2.764, '0.99' => 3.169, '0.998' => 4.144, '0.999' => 4.587,], |
48 | 11 => ['0' => 0.000, '0.5' => 0.697, '0.6' => 0.876, '0.7' => 1.088, '0.8' => 1.363, '0.9' => 1.796, '0.95' => 2.201, '0.98' => 2.718, '0.99' => 3.106, '0.998' => 4.025, '0.999' => 4.437,], |
49 | 12 => ['0' => 0.000, '0.5' => 0.695, '0.6' => 0.873, '0.7' => 1.083, '0.8' => 1.356, '0.9' => 1.782, '0.95' => 2.179, '0.98' => 2.681, '0.99' => 3.055, '0.998' => 3.930, '0.999' => 4.318,], |
50 | 13 => ['0' => 0.000, '0.5' => 0.694, '0.6' => 0.870, '0.7' => 1.079, '0.8' => 1.350, '0.9' => 1.771, '0.95' => 2.160, '0.98' => 2.650, '0.99' => 3.012, '0.998' => 3.852, '0.999' => 4.221,], |
51 | 14 => ['0' => 0.000, '0.5' => 0.692, '0.6' => 0.868, '0.7' => 1.076, '0.8' => 1.345, '0.9' => 1.761, '0.95' => 2.145, '0.98' => 2.624, '0.99' => 2.977, '0.998' => 3.787, '0.999' => 4.140,], |
52 | 15 => ['0' => 0.000, '0.5' => 0.691, '0.6' => 0.866, '0.7' => 1.074, '0.8' => 1.341, '0.9' => 1.753, '0.95' => 2.131, '0.98' => 2.602, '0.99' => 2.947, '0.998' => 3.733, '0.999' => 4.073,], |
53 | 16 => ['0' => 0.000, '0.5' => 0.690, '0.6' => 0.865, '0.7' => 1.071, '0.8' => 1.337, '0.9' => 1.746, '0.95' => 2.120, '0.98' => 2.583, '0.99' => 2.921, '0.998' => 3.686, '0.999' => 4.015,], |
54 | 17 => ['0' => 0.000, '0.5' => 0.689, '0.6' => 0.863, '0.7' => 1.069, '0.8' => 1.333, '0.9' => 1.740, '0.95' => 2.110, '0.98' => 2.567, '0.99' => 2.898, '0.998' => 3.646, '0.999' => 3.965,], |
55 | 18 => ['0' => 0.000, '0.5' => 0.688, '0.6' => 0.862, '0.7' => 1.067, '0.8' => 1.330, '0.9' => 1.734, '0.95' => 2.101, '0.98' => 2.552, '0.99' => 2.878, '0.998' => 3.610, '0.999' => 3.922,], |
56 | 19 => ['0' => 0.000, '0.5' => 0.688, '0.6' => 0.861, '0.7' => 1.066, '0.8' => 1.328, '0.9' => 1.729, '0.95' => 2.093, '0.98' => 2.539, '0.99' => 2.861, '0.998' => 3.579, '0.999' => 3.883,], |
57 | 20 => ['0' => 0.000, '0.5' => 0.687, '0.6' => 0.860, '0.7' => 1.064, '0.8' => 1.325, '0.9' => 1.725, '0.95' => 2.086, '0.98' => 2.528, '0.99' => 2.845, '0.998' => 3.552, '0.999' => 3.850,], |
58 | 21 => ['0' => 0.000, '0.5' => 0.686, '0.6' => 0.859, '0.7' => 1.063, '0.8' => 1.323, '0.9' => 1.721, '0.95' => 2.080, '0.98' => 2.518, '0.99' => 2.831, '0.998' => 3.527, '0.999' => 3.819,], |
59 | 22 => ['0' => 0.000, '0.5' => 0.686, '0.6' => 0.858, '0.7' => 1.061, '0.8' => 1.321, '0.9' => 1.717, '0.95' => 2.074, '0.98' => 2.508, '0.99' => 2.819, '0.998' => 3.505, '0.999' => 3.792,], |
60 | 23 => ['0' => 0.000, '0.5' => 0.685, '0.6' => 0.858, '0.7' => 1.060, '0.8' => 1.319, '0.9' => 1.714, '0.95' => 2.069, '0.98' => 2.500, '0.99' => 2.807, '0.998' => 3.485, '0.999' => 3.768,], |
61 | 24 => ['0' => 0.000, '0.5' => 0.685, '0.6' => 0.857, '0.7' => 1.059, '0.8' => 1.318, '0.9' => 1.711, '0.95' => 2.064, '0.98' => 2.492, '0.99' => 2.797, '0.998' => 3.467, '0.999' => 3.745,], |
62 | 25 => ['0' => 0.000, '0.5' => 0.684, '0.6' => 0.856, '0.7' => 1.058, '0.8' => 1.316, '0.9' => 1.708, '0.95' => 2.060, '0.98' => 2.485, '0.99' => 2.787, '0.998' => 3.450, '0.999' => 3.725,], |
63 | 26 => ['0' => 0.000, '0.5' => 0.684, '0.6' => 0.856, '0.7' => 1.058, '0.8' => 1.315, '0.9' => 1.706, '0.95' => 2.056, '0.98' => 2.479, '0.99' => 2.779, '0.998' => 3.435, '0.999' => 3.707,], |
64 | 27 => ['0' => 0.000, '0.5' => 0.684, '0.6' => 0.855, '0.7' => 1.057, '0.8' => 1.314, '0.9' => 1.703, '0.95' => 2.052, '0.98' => 2.473, '0.99' => 2.771, '0.998' => 3.421, '0.999' => 3.690,], |
65 | 28 => ['0' => 0.000, '0.5' => 0.683, '0.6' => 0.855, '0.7' => 1.056, '0.8' => 1.313, '0.9' => 1.701, '0.95' => 2.048, '0.98' => 2.467, '0.99' => 2.763, '0.998' => 3.408, '0.999' => 3.674,], |
66 | 29 => ['0' => 0.000, '0.5' => 0.683, '0.6' => 0.854, '0.7' => 1.055, '0.8' => 1.311, '0.9' => 1.699, '0.95' => 2.045, '0.98' => 2.462, '0.99' => 2.756, '0.998' => 3.396, '0.999' => 3.659,], |
67 | 30 => ['0' => 0.000, '0.5' => 0.683, '0.6' => 0.854, '0.7' => 1.055, '0.8' => 1.310, '0.9' => 1.697, '0.95' => 2.042, '0.98' => 2.457, '0.99' => 2.750, '0.998' => 3.385, '0.999' => 3.646,], |
68 | 40 => ['0' => 0.000, '0.5' => 0.681, '0.6' => 0.851, '0.7' => 1.050, '0.8' => 1.303, '0.9' => 1.684, '0.95' => 2.021, '0.98' => 2.423, '0.99' => 2.704, '0.998' => 3.307, '0.999' => 3.551,], |
69 | 60 => ['0' => 0.000, '0.5' => 0.679, '0.6' => 0.848, '0.7' => 1.045, '0.8' => 1.296, '0.9' => 1.671, '0.95' => 2.000, '0.98' => 2.390, '0.99' => 2.660, '0.998' => 3.232, '0.999' => 3.460,], |
70 | 80 => ['0' => 0.000, '0.5' => 0.678, '0.6' => 0.846, '0.7' => 1.043, '0.8' => 1.292, '0.9' => 1.664, '0.95' => 1.990, '0.98' => 2.374, '0.99' => 2.639, '0.998' => 3.195, '0.999' => 3.416,], |
71 | 100 => ['0' => 0.000, '0.5' => 0.677, '0.6' => 0.845, '0.7' => 1.042, '0.8' => 1.290, '0.9' => 1.660, '0.95' => 1.984, '0.98' => 2.364, '0.99' => 2.626, '0.998' => 3.174, '0.999' => 3.390,], |
72 | 1000 => ['0' => 0.000, '0.5' => 0.675, '0.6' => 0.842, '0.7' => 1.037, '0.8' => 1.282, '0.9' => 1.646, '0.95' => 1.962, '0.98' => 2.330, '0.99' => 2.581, '0.998' => 3.098, '0.999' => 3.300,], |
73 | ]; |
74 | |
75 | /** |
76 | * Get expected value. |
77 | * |
78 | * @return int |
79 | * |
80 | * @since 1.0.0 |
81 | */ |
82 | public static function getMean() : int |
83 | { |
84 | return 0; |
85 | } |
86 | |
87 | /** |
88 | * Get median. |
89 | * |
90 | * @return int |
91 | * |
92 | * @since 1.0.0 |
93 | */ |
94 | public static function getMedian() : int |
95 | { |
96 | return 0; |
97 | } |
98 | |
99 | /** |
100 | * Get mode. |
101 | * |
102 | * @return int |
103 | * |
104 | * @since 1.0.0 |
105 | */ |
106 | public static function getMode() : int |
107 | { |
108 | return 0; |
109 | } |
110 | |
111 | /** |
112 | * Get skewness. |
113 | * |
114 | * @return int |
115 | * |
116 | * @since 1.0.0 |
117 | */ |
118 | public static function getSkewness() : int |
119 | { |
120 | return 0; |
121 | } |
122 | |
123 | /** |
124 | * Get variance. |
125 | * |
126 | * @param int $nu Degrees of freedom |
127 | * |
128 | * @return float |
129 | * |
130 | * @since 1.0.0 |
131 | */ |
132 | public static function getVariance(int $nu) : float |
133 | { |
134 | return $nu < 3 ? \PHP_FLOAT_MAX : $nu / ($nu - 2); |
135 | } |
136 | |
137 | /** |
138 | * Get standard deviation. |
139 | * |
140 | * @param int $nu Degrees of freedom |
141 | * |
142 | * @return float |
143 | * |
144 | * @since 1.0.0 |
145 | */ |
146 | public static function getStandardDeviation(int $nu) : float |
147 | { |
148 | return $nu < 3 ? \PHP_FLOAT_MAX : \sqrt(self::getVariance($nu)); |
149 | } |
150 | |
151 | /** |
152 | * Get Ex. kurtosis. |
153 | * |
154 | * @param float $nu Degrees of freedom |
155 | * |
156 | * @return float |
157 | * |
158 | * @since 1.0.0 |
159 | */ |
160 | public static function getExKurtosis(float $nu) : float |
161 | { |
162 | return $nu < 5 && $nu > 2 ? \PHP_FLOAT_MAX : 6 / ($nu - 4); |
163 | } |
164 | |
165 | /** |
166 | * Get cumulative distribution function. |
167 | * |
168 | * @param float $x Value |
169 | * @param int $degrees Degrees of freedom |
170 | * @param int $tails Tails (1 or 2) |
171 | * |
172 | * @return float |
173 | * |
174 | * @since 1.0.0 |
175 | */ |
176 | public static function getCdf(float $x, int $degrees, int $tails = 1) : float |
177 | { |
178 | if ($x < 0.0 || $degrees < 1 || $tails < 1 || $tails > 2) { |
179 | return 0.0; |
180 | } |
181 | |
182 | /** |
183 | * "AS 3" by B E Cooper of the Atlas Computer Laboratory |
184 | * Ellis Horwood Ltd.; W. Sussex, England |
185 | */ |
186 | $term = $degrees; |
187 | $theta = \atan2($x, \sqrt($term)); |
188 | $cos = \cos($theta); |
189 | $sin = \sin($theta); |
190 | $sum = 0.0; |
191 | |
192 | if ($degrees % 2 === 1) { |
193 | $i = 3; |
194 | $term = $cos; |
195 | } else { |
196 | $i = 2; |
197 | $term = 1; |
198 | } |
199 | |
200 | $sum = $term; |
201 | while ($i < $degrees) { |
202 | $term *= $cos ** 2 * ($i - 1) / $i; |
203 | $sum += $term; |
204 | $i += 2; |
205 | } |
206 | |
207 | $sum *= $sin; |
208 | |
209 | if ($degrees % 2 === 1) { |
210 | $sum = 2 / \M_PI * ($sum + $theta); |
211 | } |
212 | |
213 | $t = 0.5 * (1 + $sum); |
214 | |
215 | return $tails === 1 ? \abs($t) : 1 - \abs(1 - $t - $t); |
216 | } |
217 | } |