public function __construct(array $samples, array $stats = []) { if (count($samples) < 1) { throw new \LogicException('Cannot create a distribution with zero samples.'); } $this->samples = $samples; $this->closures = ['min' => function () { return min($this->samples); }, 'max' => function () { return max($this->samples); }, 'sum' => function () { return array_sum($this->samples); }, 'stdev' => function () { return Statistics::stdev($this->samples); }, 'mean' => function () { return Statistics::mean($this->samples); }, 'mode' => function () { return Statistics::kdeMode($this->samples); }, 'variance' => function () { return Statistics::variance($this->samples); }, 'rstdev' => function () { $mean = $this->getMean(); return $mean ? $this->getStdev() / $mean * 100 : 0; }]; if ($diff = array_diff(array_keys($stats), array_keys($this->closures))) { throw new \RuntimeException(sprintf('Unknown pre-computed stat(s) encountered: "%s"', implode('", "', $diff))); } $this->stats = $stats; }
public function testStandardError() { $stats = new Statistics(); $sets = $this->getSetData(); foreach ($sets as $name => $data) { $stats->set($name, $data['set']); $this->assertEquals($data['variance'], $stats->variance($name), 'Set ' . $name . ' variance()'); } }
public function testVariance() { // // Sample (default) // // // Integers // $values = [2, 4, 4, 4, 5, 5, 7, 9]; $sample = true; $result = Statistics::variance($values, $sample); $expected = 4.571429; $this->assertEquals($expected, $result, '', pow(10, -4)); // // Floats // $values = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]; $sample = true; $result = Statistics::variance($values, $sample); $expected = 1.428571; $this->assertEquals($expected, $result, '', pow(10, -4)); // // Population // // // Integers // $values = [2, 4, 4, 4, 5, 5, 7, 9]; $sample = false; $result = Statistics::variance($values, $sample); $expected = 4; $this->assertIdentical($expected, $result); // // Floats // $values = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]; $sample = false; $result = Statistics::variance($values, $sample); $expected = 1.25; $this->assertIdentical($expected, $result, '', pow(10, -4)); }