StudentTTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. <?php
  2. namespace MathPHP\Tests\Probability\Distribution\Continuous;
  3. use MathPHP\Probability\Distribution\Continuous\StudentT;
  4. class StudentTTest extends \PHPUnit\Framework\TestCase
  5. {
  6. /**
  7. * @test pdf
  8. * @dataProvider dataProviderForPdf
  9. * @param float $t
  10. * @param float $ν
  11. * @param float $expected
  12. */
  13. public function testPdf(float $t, float $ν, float $expected)
  14. {
  15. // Given
  16. $studentT = new StudentT($ν);
  17. // When
  18. $pdf = $studentT->pdf($t);
  19. // Then
  20. $this->assertEqualsWithDelta($expected, $pdf, 0.0000001);
  21. }
  22. /**
  23. * @return array [t, ν, pdf]
  24. * Generated with R dt(t, ν) from package stats
  25. */
  26. public function dataProviderForPdf(): array
  27. {
  28. return [
  29. [-4, 1, 0.01872411],
  30. [-3, 1, 0.03183099],
  31. [-2, 1, 0.06366198],
  32. [-1, 1, 0.1591549],
  33. [0, 1, 0.3183099],
  34. [1, 1, 0.1591549],
  35. [2, 1, 0.06366198],
  36. [3, 1, 0.03183099],
  37. [4, 1, 0.01872411],
  38. [5, 1, 0.01224269],
  39. [10, 1, 0.003151583],
  40. [-4, 2, 0.01309457],
  41. [-3, 2, 0.02741012],
  42. [-2, 2, 0.06804138],
  43. [-1, 2, 0.1924501],
  44. [0, 2, 0.3535534],
  45. [1, 2, 0.1924501],
  46. [2, 2, 0.06804138],
  47. [3, 2, 0.02741012],
  48. [4, 2, 0.01309457],
  49. [5, 2, 0.007127781],
  50. [10, 2, 0.0009707329],
  51. [-4, 6, 0.004054578],
  52. [-3, 6, 0.01549193],
  53. [-2, 6, 0.06403612],
  54. [-1, 6, 0.2231423],
  55. [0, 6, 0.3827328],
  56. [1, 6, 0.2231423],
  57. [2, 6, 0.06403612],
  58. [3, 6, 0.01549193],
  59. [4, 6, 0.004054578],
  60. [5, 6, 0.001220841],
  61. [10, 6, 1.651408e-05],
  62. [-10, 10, 7.284686e-07],
  63. [-5, 10, 0.0003960011],
  64. [-2, 10, 0.06114577],
  65. [-1, 10, 0.230362],
  66. [0, 10, 0.3891084],
  67. [1, 10, 0.230362],
  68. [2, 10, 0.06114577],
  69. [5, 10, 0.0003960011],
  70. [10, 10, 7.284686e-07],
  71. [-10, 20, 2.660085e-09],
  72. [-5, 20, 7.898911e-05],
  73. [-2, 20, 0.05808722],
  74. [-1, 20, 0.2360456],
  75. [0, 20, 0.3939886],
  76. [1, 20, 0.2360456],
  77. [2, 20, 0.05808722],
  78. [5, 20, 7.898911e-05],
  79. [-10, 20, 2.660085e-09],
  80. [0, 50, 0.3969527],
  81. [1, 50, 0.2395711],
  82. [5, 50, 1.283547e-05],
  83. [0, 100, 0.3979462],
  84. [1, 100, 0.2407659],
  85. [5, 100, 5.080058e-06],
  86. [0, 200, 0.3984439],
  87. [1, 200, 0.2413671],
  88. [5, 200, 2.88097e-06],
  89. [0, 250, 0.3985435],
  90. [1, 250, 0.2414876],
  91. [5, 250, 2.545035e-06],
  92. [0, 300, 0.39861],
  93. [1, 300, 0.241568],
  94. [5, 300, 2.338036e-06],
  95. [0, 301, 0.3986111],
  96. [0, 302, 0.3986122],
  97. [0, 303, 0.3986133],
  98. [0, 305, 0.3986154],
  99. [0, 310, 0.3986207],
  100. [0, 320, 0.3986307],
  101. [1, 320, 0.2415931],
  102. [5, 320, 2.276028e-06],
  103. [5, 320, 2.276028e-06],
  104. [5, 325, 2.261896e-06],
  105. [5, 330, 2.248256e-06],
  106. [5, 331, 2.245584e-06],
  107. [5, 332, 2.242931e-06],
  108. [5, 333, 2.240297e-06],
  109. [5, 334, 2.23768e-06],
  110. [5, 335, 2.235082e-06],
  111. [0, 341, 0.3986499],
  112. [0, 351, 0.3986582],
  113. [0, 361, 0.3986661],
  114. [0, 371, 0.3986735],
  115. [0, 381, 0.3986806],
  116. [0, 400, 0.398693],
  117. [0, 500, 0.3987429],
  118. [1, 500, 0.241729],
  119. [2, 500, 0.05417883],
  120. [3, 500, 0.004569562],
  121. [5, 500, 1.962337e-06],
  122. [0, 1000, 0.3988426],
  123. [1, 1000, 0.2418498],
  124. [2, 1000, 0.05408517],
  125. [3, 1000, 0.004500625],
  126. [5, 1000, 1.712012e-06],
  127. [0, 1200, 0.3988592],
  128. [1, 1200, 0.2418699],
  129. [2, 1200, 0.05406951],
  130. [3, 1200, 0.004489151],
  131. [5, 1200, 1.672771e-06],
  132. [0, 1500, 0.3988758],
  133. [1, 1500, 0.2418901],
  134. [2, 1500, 0.05405383],
  135. [3, 1500, 0.004477681],
  136. [5, 1500, 1.634218e-06],
  137. [5, 1000, 1.712012233e-06],
  138. [1E9, 2, 1e-27],
  139. ];
  140. }
  141. /**
  142. * @test Github issue 429 - pdf - produced incorrect value of 0
  143. *
  144. * R Reference:
  145. * > library(stats)
  146. * > v <- 341
  147. * > t <- 0
  148. * > dt(t, v)
  149. * [1] 0.3986499
  150. */
  151. public function testBugIssue429StudentTPdf()
  152. {
  153. // Given
  154. $v = 341;
  155. $studentT = new StudentT($v);
  156. // When
  157. $t = 0;
  158. $pdf = $studentT->pdf($t);
  159. // Then
  160. $expected = 0.3986499;
  161. $this->assertEqualsWithDelta($expected, $pdf, 0.001);
  162. }
  163. /**
  164. * @test cdf
  165. * @dataProvider dataProviderForCdf
  166. * @param float $t
  167. * @param float $ν
  168. * @param float $expected
  169. */
  170. public function testCdf(float $t, float $ν, float $expected)
  171. {
  172. // Given
  173. $studentT = new StudentT($ν);
  174. // When
  175. $cdf = $studentT->cdf($t);
  176. // Then
  177. $this->assertEqualsWithDelta($expected, $cdf, 0.0000001);
  178. }
  179. /**
  180. * @return array [t, ν, cdf]
  181. * Generated with R pt(t, ν) from package stats
  182. */
  183. public function dataProviderForCdf(): array
  184. {
  185. return [
  186. [-4, 1, 0.07797913],
  187. [-3, 1, 0.1024164],
  188. [-2, 1, 0.1475836],
  189. [-1, 1, 0.25],
  190. [0, 1, 0.5],
  191. [1, 1, 0.75],
  192. [2, 1, 0.8524164],
  193. [3, 1, 0.8975836],
  194. [4, 1, 0.9220209],
  195. [5, 1, 0.937167],
  196. [10, 1, 0.9682745],
  197. [-4, 2, 0.02859548],
  198. [-3, 2, 0.04773298],
  199. [-2, 2, 0.09175171],
  200. [-1, 2, 0.2113249],
  201. [0, 2, 0.5],
  202. [1, 2, 0.7886751],
  203. [2, 2, 0.9082483],
  204. [3, 2, 0.952267],
  205. [4, 2, 0.9714045],
  206. [5, 2, 0.9811252],
  207. [10, 2, 0.9950738],
  208. [-4, 6, 0.003559489],
  209. [-3, 6, 0.0120041],
  210. [-2, 6, 0.04621316],
  211. [-1, 6, 0.1779588],
  212. [0, 6, 0.5],
  213. [1, 6, 0.8220412],
  214. [2, 6, 0.9537868],
  215. [3, 6, 0.9879959],
  216. [4, 6, 0.9964405],
  217. [5, 6, 0.9987738],
  218. [10, 6, 0.999971],
  219. [-2, 3, 0.06966298],
  220. [0.1, 2, 0.5352673],
  221. [2.9, 2, 0.9494099],
  222. [3.9, 6, 0.996008],
  223. [\INF, 6, 1],
  224. [-\INF, 6, 0],
  225. [0, \INF, 0.5],
  226. [1, \INF, 0.841344746],
  227. [1, 5E5, 0.841344504097939],
  228. [1.5E50, 1, 1],
  229. ];
  230. }
  231. /**
  232. * @test mean
  233. * @dataProvider dataProviderForMean
  234. * @param float $ν
  235. * @param float $μ
  236. */
  237. public function testMean(float $ν, float $μ)
  238. {
  239. // Given
  240. $studentT = new StudentT($ν);
  241. // When
  242. $mean = $studentT->mean();
  243. // Then
  244. $this->assertEquals($μ, $mean);
  245. }
  246. /**
  247. * @return array [ν, μ]
  248. */
  249. public function dataProviderForMean(): array
  250. {
  251. return [
  252. [2, 0],
  253. [3, 0],
  254. ];
  255. }
  256. /**
  257. * @test mean is not a number when ν is less than or equal to 1
  258. */
  259. public function testMeanNan()
  260. {
  261. // Given
  262. $ν = 1;
  263. $studentT = new StudentT($ν);
  264. // When
  265. $mean = $studentT->mean();
  266. // Then
  267. $this->assertNan($mean);
  268. }
  269. /**
  270. * @test median
  271. * @dataProvider dataProviderForMedianAndMode
  272. * @param float $ν
  273. * @param float $expected
  274. */
  275. public function testMedian(float $ν, float $expected)
  276. {
  277. // Given
  278. $studentT = new StudentT($ν);
  279. // When
  280. $median = $studentT->median();
  281. // Then
  282. $this->assertEquals($expected, $median);
  283. }
  284. /**
  285. * @test mode
  286. * @dataProvider dataProviderForMedianAndMode
  287. * @param float $ν
  288. * @param float $expected
  289. */
  290. public function testMode(float $ν, float $expected)
  291. {
  292. // Given
  293. $studentT = new StudentT($ν);
  294. // When
  295. $mode = $studentT->mode();
  296. // Then
  297. $this->assertEquals($expected, $mode);
  298. }
  299. /**
  300. * @return array [ν, μ]
  301. */
  302. public function dataProviderForMedianAndMode(): array
  303. {
  304. return [
  305. [1, 0],
  306. [2, 0],
  307. [3, 0],
  308. [4, 0],
  309. ];
  310. }
  311. /**
  312. * @test variance
  313. * @dataProvider dataProviderForVariance
  314. * @param float $ν
  315. * @param float $expected
  316. */
  317. public function testVariance(float $ν, float $expected)
  318. {
  319. // Given
  320. $studentT = new StudentT($ν);
  321. // When
  322. $variance = $studentT->variance();
  323. // Then
  324. $this->assertEquals($expected, $variance);
  325. }
  326. /**
  327. * @return array [ν, μ]
  328. */
  329. public function dataProviderForVariance(): array
  330. {
  331. return [
  332. [1.1, \INF],
  333. [1.5, \INF],
  334. [2, \INF],
  335. [3, 3],
  336. [4, 2],
  337. [5, 5 / 3],
  338. ];
  339. }
  340. /**
  341. * @test variance is not a number when ν ≤ 1
  342. * @dataProvider dataProviderForVarianceNan
  343. * @param float $ν
  344. */
  345. public function testVarianceNan(float $ν)
  346. {
  347. // Given
  348. $studentT = new StudentT($ν);
  349. // When
  350. $variance = $studentT->variance();
  351. // Then
  352. $this->assertNan($variance);
  353. }
  354. /**
  355. * @return array [ν, μ]
  356. */
  357. public function dataProviderForVarianceNan(): array
  358. {
  359. return [
  360. [0.1],
  361. [0.5],
  362. [0.9],
  363. [1],
  364. ];
  365. }
  366. /**
  367. * @test inverse
  368. * @dataProvider dataProviderForInverse
  369. * @param float $p
  370. * @param float $ν
  371. * @param float $x
  372. */
  373. public function testInverse(float $p, float $ν, float $x)
  374. {
  375. // Given
  376. $studentT = new StudentT($ν);
  377. // When
  378. $inverse = $studentT->inverse($p);
  379. // Then
  380. $this->assertEqualsWithDelta($x, $inverse, 0.00001);
  381. }
  382. /**
  383. * Generated with R qt(c(p), ν)
  384. * @return array [p, ν, x]
  385. */
  386. public function dataProviderForInverse(): array
  387. {
  388. return [
  389. [0.90, 1, 3.077684],
  390. [0.90, 2, 1.885618],
  391. [0.90, 3, 1.637744],
  392. [0.90, 4, 1.533206],
  393. [0.90, 5, 1.475884],
  394. [0.90, 10, 1.372184],
  395. [0.90, 20, 1.325341],
  396. [0.90, 50, 1.298714],
  397. [0.90, 100, 1.290075],
  398. [0.95, 1, 6.313752],
  399. [0.95, 2, 2.919986],
  400. [0.95, 3, 2.353363],
  401. [0.95, 4, 2.131847],
  402. [0.95, 5, 2.015048],
  403. [0.95, 10, 1.812461],
  404. [0.95, 20, 1.724718],
  405. [0.95, 50, 1.675905],
  406. [0.95, 100, 1.660234],
  407. [0.99, 1, 31.82052],
  408. [0.99, 2, 6.964557],
  409. [0.99, 3, 4.540703],
  410. [0.99, 4, 3.746947],
  411. [0.99, 5, 3.36493],
  412. [0.99, 10, 2.763769],
  413. [0.99, 20, 2.527977],
  414. [0.99, 50, 2.403272],
  415. [0.99, 100, 2.364217],
  416. [0.6, 1, 0.3249197],
  417. [0.6, 2, 0.2886751],
  418. ];
  419. }
  420. }