BinomialTest.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace MathPHP\Tests\Probability\Distribution\Discrete;
  3. use MathPHP\Probability\Distribution\Discrete\Binomial;
  4. class BinomialTest extends \PHPUnit\Framework\TestCase
  5. {
  6. /**
  7. * @test pmf
  8. * @dataProvider dataProviderForPmf
  9. * @param int $n
  10. * @param int $r
  11. * @param float $p
  12. * @param float $expectedPmf
  13. */
  14. public function testPmf(int $n, int $r, float $p, float $expectedPmf)
  15. {
  16. // Given
  17. $binomial = new Binomial($n, $p);
  18. // When
  19. $pdf = $binomial->pmf($r);
  20. // Then
  21. $this->assertEqualsWithDelta($expectedPmf, $pdf, 0.0000001);
  22. }
  23. /**
  24. * @return array [n, r, p, pmf]
  25. * Data created with R dbinom(x, r, p)
  26. */
  27. public function dataProviderForPmf(): array
  28. {
  29. return [
  30. [2, 1, 0.5, 0.5],
  31. [2, 1, 0.4, 0.48],
  32. [6, 2, 0.7, 0.059535],
  33. [8, 7, 0.83, 0.3690503],
  34. [10, 5, 0.85, 0.008490856],
  35. [50, 48, 0.97, 0.2555182],
  36. [5, 4, 1, 0.0],
  37. [12, 4, 0.2, 0.1328756],
  38. [1000, 600, 0.65, 0.000117808],
  39. [700, 500, 0.75, 0.003307635],
  40. [600, 400, 0.75, 1.026813e-06],
  41. [400, 200, 0.4, 1.134711e-05],
  42. [300, 100, 0.4, 0.002852069],
  43. [200, 30, 0.14, 0.07261467],
  44. [190, 95, 0.56, 0.0145733],
  45. [175, 165, 0.97, 0.02215201],
  46. [150, 65, 0.36, 0.01190476],
  47. [145, 129, 0.87, 0.0811693],
  48. [100, 35, 0.36, 0.08160685],
  49. ];
  50. }
  51. /**
  52. * @test cdf
  53. * @dataProvider dataProviderForCdf
  54. * @param int $n
  55. * @param int $r
  56. * @param float $p
  57. * @param float $expectedCdf
  58. */
  59. public function testCdf(int $n, int $r, float $p, float $expectedCdf)
  60. {
  61. // Given
  62. $binomial = new Binomial($n, $p);
  63. // When
  64. $cdf = $binomial->cdf($r);
  65. // Then
  66. $this->assertEqualsWithDelta($expectedCdf, $cdf, 0.0000001);
  67. }
  68. /**
  69. * @return array [n, r, p, cdf]
  70. * Data created with R pbinom(x, n, p)
  71. */
  72. public function dataProviderForCdf(): array
  73. {
  74. return [
  75. [2, 1, 0.5, 0.75],
  76. [2, 1, 0.4, 0.84],
  77. [6, 2, 0.7, 0.07047],
  78. [8, 7, 0.83, 0.7747708],
  79. [10, 5, 0.85, 0.009874091],
  80. [50, 48, 0.97, 0.4447201],
  81. [5, 4, 1, 0.0],
  82. [12, 4, 0.2, 0.9274445],
  83. [1000, 600, 0.65, 0.0005712963],
  84. [700, 500, 0.75, 0.01723671],
  85. [600, 400, 0.75, 2.971822e-06],
  86. [400, 200, 0.4, 0.9999788],
  87. [300, 100, 0.4, 0.01021691],
  88. [200, 30, 0.14, 0.701047],
  89. [190, 95, 0.56, 0.05595475],
  90. [175, 165, 0.97, 0.03934616],
  91. [150, 65, 0.36, 0.9736608],
  92. [145, 129, 0.87, 0.7932707],
  93. [100, 35, 0.36, 0.4623937],
  94. ];
  95. }
  96. /**
  97. * @test mean
  98. * @dataProvider dataProviderForMean
  99. * @param int $n
  100. * @param float $p
  101. * @param float $μ
  102. */
  103. public function testMean(int $n, float $p, float $μ)
  104. {
  105. // Given
  106. $binomial = new Binomial($n, $p);
  107. // When
  108. $mean = $binomial->mean();
  109. // Then
  110. $this->assertEqualsWithDelta($μ, $mean, 0.000001);
  111. }
  112. /**
  113. * @return array
  114. */
  115. public function dataProviderForMean(): array
  116. {
  117. return [
  118. [0, 0, 0],
  119. [0, 1, 0],
  120. [5, 0, 0],
  121. [1, 1, 1],
  122. [1, 0.5, 0.5],
  123. [10, 0.2, 2],
  124. ];
  125. }
  126. /**
  127. * @test variance
  128. * @dataProvider dataProviderForVariance
  129. * @param int $n
  130. * @param float $p
  131. * @param float $σ²
  132. */
  133. public function testVariance(int $n, float $p, float $σ²)
  134. {
  135. // Given
  136. $binomial = new Binomial($n, $p);
  137. // When
  138. $variance = $binomial->variance();
  139. // Then
  140. $this->assertEqualsWithDelta($σ², $variance, 0.000001);
  141. }
  142. /**
  143. * @return array
  144. */
  145. public function dataProviderForVariance(): array
  146. {
  147. return [
  148. [0, 0, 0],
  149. [0, 1, 0],
  150. [5, 0, 0],
  151. [1, 1, 0],
  152. [1, 0.5, .25],
  153. [5, 0.4, 1.2],
  154. [10, 0.2, 1.6],
  155. ];
  156. }
  157. }