ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
Binomial.php
Go to the documentation of this file.
1 <?php
2 
4 
8 
9 class Binomial
10 {
27  public static function distribution($value, $trials, $probability, $cumulative)
28  {
29  $value = Functions::flattenSingleValue($value);
30  $trials = Functions::flattenSingleValue($trials);
31  $probability = Functions::flattenSingleValue($probability);
32 
33  try {
34  $value = DistributionValidations::validateInt($value);
35  $trials = DistributionValidations::validateInt($trials);
36  $probability = DistributionValidations::validateProbability($probability);
37  $cumulative = DistributionValidations::validateBool($cumulative);
38  } catch (Exception $e) {
39  return $e->getMessage();
40  }
41 
42  if (($value < 0) || ($value > $trials)) {
43  return Functions::NAN();
44  }
45 
46  if ($cumulative) {
47  return self::calculateCumulativeBinomial($value, $trials, $probability);
48  }
49 
50  return Combinations::withoutRepetition($trials, $value) * $probability ** $value
51  * (1 - $probability) ** ($trials - $value);
52  }
53 
68  public static function range($trials, $probability, $successes, $limit = null)
69  {
70  $trials = Functions::flattenSingleValue($trials);
71  $probability = Functions::flattenSingleValue($probability);
72  $successes = Functions::flattenSingleValue($successes);
73  $limit = ($limit === null) ? $successes : Functions::flattenSingleValue($limit);
74 
75  try {
76  $trials = DistributionValidations::validateInt($trials);
77  $probability = DistributionValidations::validateProbability($probability);
78  $successes = DistributionValidations::validateInt($successes);
79  $limit = DistributionValidations::validateInt($limit);
80  } catch (Exception $e) {
81  return $e->getMessage();
82  }
83 
84  if (($successes < 0) || ($successes > $trials)) {
85  return Functions::NAN();
86  }
87  if (($limit < 0) || ($limit > $trials) || $limit < $successes) {
88  return Functions::NAN();
89  }
90 
91  $summer = 0;
92  for ($i = $successes; $i <= $limit; ++$i) {
93  $summer += Combinations::withoutRepetition($trials, $i) * $probability ** $i
94  * (1 - $probability) ** ($trials - $i);
95  }
96 
97  return $summer;
98  }
99 
118  public static function negative($failures, $successes, $probability)
119  {
120  $failures = Functions::flattenSingleValue($failures);
121  $successes = Functions::flattenSingleValue($successes);
122  $probability = Functions::flattenSingleValue($probability);
123 
124  try {
125  $failures = DistributionValidations::validateInt($failures);
126  $successes = DistributionValidations::validateInt($successes);
127  $probability = DistributionValidations::validateProbability($probability);
128  } catch (Exception $e) {
129  return $e->getMessage();
130  }
131 
132  if (($failures < 0) || ($successes < 1)) {
133  return Functions::NAN();
134  }
136  if (($failures + $successes - 1) <= 0) {
137  return Functions::NAN();
138  }
139  }
140 
141  return (Combinations::withoutRepetition($failures + $successes - 1, $successes - 1))
142  * ($probability ** $successes) * ((1 - $probability) ** $failures);
143  }
144 
157  public static function inverse($trials, $probability, $alpha)
158  {
159  $trials = Functions::flattenSingleValue($trials);
160  $probability = Functions::flattenSingleValue($probability);
161  $alpha = Functions::flattenSingleValue($alpha);
162 
163  try {
164  $trials = DistributionValidations::validateInt($trials);
165  $probability = DistributionValidations::validateProbability($probability);
167  } catch (Exception $e) {
168  return $e->getMessage();
169  }
170 
171  if ($trials < 0) {
172  return Functions::NAN();
173  } elseif (($alpha < 0.0) || ($alpha > 1.0)) {
174  return Functions::NAN();
175  }
176 
177  $successes = 0;
178  while ($successes <= $trials) {
179  $result = self::calculateCumulativeBinomial($successes, $trials, $probability);
180  if ($result >= $alpha) {
181  break;
182  }
183  ++$successes;
184  }
185 
186  return $successes;
187  }
188 
192  private static function calculateCumulativeBinomial(int $value, int $trials, float $probability)
193  {
194  $summer = 0;
195  for ($i = 0; $i <= $value; ++$i) {
196  $summer += Combinations::withoutRepetition($trials, $i) * $probability ** $i
197  * (1 - $probability) ** ($trials - $i);
198  }
199 
200  return $summer;
201  }
202 }
static negative($failures, $successes, $probability)
NEGBINOMDIST.
Definition: Binomial.php:118
static range($trials, $probability, $successes, $limit=null)
BINOM.DIST.RANGE.
Definition: Binomial.php:68
$result
static calculateCumulativeBinomial(int $value, int $trials, float $probability)
Definition: Binomial.php:192
static inverse($trials, $probability, $alpha)
CRITBINOM.
Definition: Binomial.php:157
$i
Definition: disco.tpl.php:19
static flattenSingleValue($value='')
Convert an array to a single scalar value by extracting the first element.
Definition: Functions.php:649
static distribution($value, $trials, $probability, $cumulative)
BINOMDIST.
Definition: Binomial.php:27
static getCompatibilityMode()
Return the current Compatibility Mode.
Definition: Functions.php:93