ChiSquaredTest.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. namespace MathPHP\Tests\Probability\Distribution\Continuous;
  3. use MathPHP\Probability\Distribution\Continuous\ChiSquared;
  4. class ChiSquaredTest extends \PHPUnit\Framework\TestCase
  5. {
  6. /**
  7. * @test pdf
  8. * @dataProvider dataProviderForPdf
  9. * @param float $x
  10. * @param int $k
  11. * @param float $pdf
  12. */
  13. public function testPdf(float $x, int $k, float $expectedPdf)
  14. {
  15. // Given
  16. $chiSquared = new ChiSquared($k);
  17. // When
  18. $pdf = $chiSquared->pdf($x);
  19. // Then
  20. $this->assertEqualsWithDelta($expectedPdf, $pdf, 0.00000001);
  21. }
  22. /**
  23. * @return array [x, k, pdf]
  24. * Generated with http://keisan.casio.com/exec/system/1180573196
  25. */
  26. public function dataProviderForPdf(): array
  27. {
  28. return [
  29. [0, 1, \INF],
  30. [1, 1, 0.2419707245191433497978],
  31. [2, 1, 0.1037768743551486758351],
  32. [3, 1, 0.05139344326792309227041],
  33. [4, 1, 0.02699548325659402597528],
  34. [5, 1, 0.0146449825619264871132],
  35. [6, 1, 0.008108695554940243370932],
  36. [7, 1, 0.004553342921640173367469],
  37. [8, 1, 0.002583373169261506732134],
  38. [0, 2, 0.5],
  39. [1, 2, 0.3032653298563167118019],
  40. [2, 2, 0.1839397205857211607978],
  41. [3, 2, 0.1115650800742149144666],
  42. [4, 2, 0.067667641618306345947],
  43. [5, 2, 0.04104249931194939758476],
  44. [6, 2, 0.02489353418393197148967],
  45. [7, 2, 0.01509869171115925036989],
  46. [8, 2, 0.009157819444367090146859],
  47. [0, 3, 0],
  48. [1, 3, 0.2419707245191433497978],
  49. [2, 3, 0.2075537487102973516701],
  50. [3, 3, 0.1541803298037692768112],
  51. [4, 3, 0.1079819330263761039011],
  52. [5, 3, 0.073224912809632435566],
  53. [6, 3, 0.04865217332964146022559],
  54. [7, 3, 0.03187340045148121357228],
  55. [8, 3, 0.02066698535409205385707],
  56. [0, 4, 0],
  57. [0, 5, 0],
  58. [1, 4, 0.151632664928158355901],
  59. [1, 5, 0.08065690817304778326594],
  60. [2, 3, 0.2075537487102973516701],
  61. [2.5, 1, 0.07228896],
  62. [2.5, 10, 0.01457239],
  63. [2.5, 15, 0.00032650],
  64. [6, 5, 0.09730435],
  65. [6, 20, 0.00135025],
  66. [17.66, 6, 0.00285129],
  67. [0.09, 6, 0.00048397],
  68. ];
  69. }
  70. /**
  71. * @test cdf
  72. * @dataProvider dataProviderForCdf
  73. * @param float $x
  74. * @param int $k
  75. * @param float $expectedCdf
  76. */
  77. public function testCdf(float $x, int $k, float $expectedCdf)
  78. {
  79. // Given
  80. $chiSquared = new ChiSquared($k);
  81. // When
  82. $cdf = $chiSquared->cdf($x);
  83. // Then
  84. $this->assertEqualsWithDelta($expectedCdf, $cdf, 0.000001);
  85. }
  86. /**
  87. * @return array [x, k, cdf]
  88. * Generated with http://keisan.casio.com/exec/system/1180573196
  89. */
  90. public function dataProviderForCdf(): array
  91. {
  92. return [
  93. [0, 1, 0],
  94. [1, 1, 0.6826894921370858971705],
  95. [2, 1, 0.8427007929497148693412],
  96. [3, 1, 0.9167354833364495981451],
  97. [4, 1, 0.9544997361036415855994],
  98. [5, 1, 0.9746526813225317360684],
  99. [6, 1, 0.9856941215645703604742],
  100. [7, 1, 0.991849028406497299687],
  101. [8, 1, 0.9953222650189527341621],
  102. [0, 2, 0],
  103. [1, 2, 0.3934693402873665763962],
  104. [2, 2, 0.6321205588285576784045],
  105. [3, 2, 0.7768698398515701710667],
  106. [4, 2, 0.864664716763387308106],
  107. [5, 2, 0.9179150013761012048305],
  108. [6, 2, 0.9502129316321360570207],
  109. [7, 2, 0.9698026165776814992602],
  110. [8, 2, 0.9816843611112658197063],
  111. [0, 3, 0],
  112. [1, 3, 0.1987480430987991975748],
  113. [2, 3, 0.427593295529120166001],
  114. [3, 3, 0.6083748237289110445226],
  115. [4, 3, 0.7385358700508893777972],
  116. [5, 3, 0.8282028557032668649364],
  117. [6, 3, 0.888389774905287440023],
  118. [7, 3, 0.9281022275035348725425],
  119. [8, 3, 0.9539882943107686264479],
  120. [0, 3, 0],
  121. [0, 4, 0],
  122. [0, 5, 0],
  123. [1, 4, 0.0902040104310498645943],
  124. [1, 5, 0.03743422675270363104292],
  125. [7.26, 15, 0.04997084177886489436453],
  126. [7.26, 12, 0.1600358165499511869596],
  127. [7.26, 1, 0.9929492708895772574712],
  128. [1, 30, 0],
  129. [1, 7, 0.005171463483484517736541],
  130. [4.6, 1, 0.9680280438223512895985],
  131. [4.6, 2, 0.8997411562771962662701],
  132. [4.6, 6, 0.4039611740679318029755],
  133. [4.6, 10, 0.0837507192794016330488],
  134. ];
  135. }
  136. /**
  137. * @test mean is k
  138. */
  139. public function testMean()
  140. {
  141. // Given
  142. $k = 5;
  143. $chiSquared = new ChiSquared($k);
  144. // When
  145. $mean = $chiSquared->mean();
  146. // Then
  147. $this->assertEquals($k, $mean);
  148. }
  149. /**
  150. * @test median
  151. * @dataProvider dataProviderForMedian
  152. * @param float $k
  153. * @param float $expected
  154. */
  155. public function testMedian(float $k, float $expected)
  156. {
  157. // Given
  158. $chiSquared = new ChiSquared($k);
  159. // When
  160. $median = $chiSquared->median();
  161. // Then
  162. $this->assertEqualsWithDelta($expected, $median, 0.00000001);
  163. }
  164. /**
  165. * @return array
  166. */
  167. public function dataProviderForMedian(): array
  168. {
  169. return [
  170. [1, 0.47050754458162],
  171. [2, 1.40466392318244],
  172. [3, 2.38149672306054],
  173. [4, 3.36968449931408],
  174. [5, 4.36252400548703],
  175. [20, 19.3407133058986],
  176. ];
  177. }
  178. /**
  179. * @test mode
  180. * @dataProvider dataProviderForMode
  181. * @param float $k
  182. * @param float $expected
  183. */
  184. public function testMode(float $k, float $expected)
  185. {
  186. // Given
  187. $chiSquared = new ChiSquared($k);
  188. // When
  189. $mode = $chiSquared->mode();
  190. // Then
  191. $this->assertEqualsWithDelta($expected, $mode, 0.00000001);
  192. }
  193. /**
  194. * @return array
  195. */
  196. public function dataProviderForMode(): array
  197. {
  198. return [
  199. [1, 0],
  200. [2, 0],
  201. [3, 1],
  202. [4, 2],
  203. [5, 3],
  204. [20, 18],
  205. ];
  206. }
  207. /**
  208. * @test variance
  209. * @dataProvider dataProviderForVariance
  210. * @param float $k
  211. * @param float $expected
  212. */
  213. public function testVariance(float $k, float $expected)
  214. {
  215. // Given
  216. $chiSquared = new ChiSquared($k);
  217. // When
  218. $variance = $chiSquared->variance();
  219. // Then
  220. $this->assertEqualsWithDelta($expected, $variance, 0.00000001);
  221. }
  222. /**
  223. * @return array
  224. */
  225. public function dataProviderForVariance(): array
  226. {
  227. return [
  228. [1, 2],
  229. [2, 4],
  230. [3, 6],
  231. [4, 8],
  232. [5, 10],
  233. [20, 40],
  234. ];
  235. }
  236. }