From 5185b52c919910ba07473b31a8187bb9c4ab281a Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 23 Feb 2018 11:12:07 +0100 Subject: [PATCH] Added optional mean value Now it is possible to pass pre calculated means in case the arithmeticMean shouldn't be used --- Math/Statistic/MeasureOfDispersion.php | 53 +++++++++++++++----------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/Math/Statistic/MeasureOfDispersion.php b/Math/Statistic/MeasureOfDispersion.php index ea7e5b7ac..fb05e548c 100644 --- a/Math/Statistic/MeasureOfDispersion.php +++ b/Math/Statistic/MeasureOfDispersion.php @@ -54,6 +54,7 @@ class MeasureOfDispersion * Example: ([4, 5, 9, 1, 3]) * * @param array $values Values + * @param float $mean Mean * * @return float * @@ -61,9 +62,9 @@ class MeasureOfDispersion * * @since 1.0.0 */ - public static function empiricalVariationcoefficient(array $values) : float + public static function empiricalVariationcoefficient(array $values, float $mean = null) : float { - $mean = Average::arithmeticMean($values); + $mean = isset($mean) ? $mean : Average::arithmeticMean($values); if ($mean === 0) { throw new ZeroDevisionException(); @@ -78,14 +79,15 @@ class MeasureOfDispersion * Example: ([4, 5, 9, 1, 3]) * * @param array $values Values + * @param float $mean Mean * * @return float * * @since 1.0.0 */ - public static function standardDeviation(array $values) : float + public static function standardDeviation(array $values, float $mean = null) : float { - $mean = Average::arithmeticMean($values); + $mean = isset($mean) ? $mean : Average::arithmeticMean($values); $sum = 0.0; foreach ($values as $value) { @@ -101,6 +103,7 @@ class MeasureOfDispersion * Example: ([4, 5, 9, 1, 3]) * * @param array $values Values + * @param float $mean Mean * * @return float * @@ -108,7 +111,7 @@ class MeasureOfDispersion * * @since 1.0.0 */ - public static function sampleVariance(array $values) : float + public static function sampleVariance(array $values, float $mean = null) : float { $count = count($values); @@ -116,7 +119,7 @@ class MeasureOfDispersion throw new ZeroDevisionException(); } - return self::empiricalVariance($values) * $count / ($count - 1); + return self::empiricalVariance($values, [], $mean) * $count / ($count - 1); } /** @@ -126,6 +129,7 @@ class MeasureOfDispersion * * @param array $values Values * @param array $probabilities Probabilities + * @param float $mean Mean * * @return float * @@ -133,7 +137,7 @@ class MeasureOfDispersion * * @since 1.0.0 */ - public static function empiricalVariance(array $values, array $probabilities = []) : float + public static function empiricalVariance(array $values, array $probabilities = [], float $mean = null) : float { $count = count($values); $hasProbability = !empty($probabilities); @@ -142,7 +146,7 @@ class MeasureOfDispersion throw new ZeroDevisionException(); } - $mean = $hasProbability ? Average::weightedAverage($values, $probabilities) : Average::arithmeticMean($values); + $mean = $hasProbability ? Average::weightedAverage($values, $probabilities) : (isset($mean) ? $mean : Average::arithmeticMean($values);); $sum = 0; foreach ($values as $key => $value) { @@ -157,8 +161,10 @@ class MeasureOfDispersion * * Example: ([4, 5, 9, 1, 3], [4, 5, 9, 1, 3]) * - * @param array $x Values - * @param array $y Values + * @param array $x Values + * @param array $y Values + * @param array $meanX Mean + * @param array $meanY Mean * * @return float * @@ -166,7 +172,7 @@ class MeasureOfDispersion * * @since 1.0.0 */ - public static function empiricalCovariance(array $x, array $y) : float + public static function empiricalCovariance(array $x, array $y, float $meanX = null, float $meanY = null) : float { $count = count($x); @@ -178,8 +184,8 @@ class MeasureOfDispersion throw new InvalidDimensionException($count . 'x' . count($y)); } - $xMean = Average::arithmeticMean($x); - $yMean = Average::arithmeticMean($y); + $xMean = isset($meanX) ? $meanX : Average::arithmeticMean($x); + $yMean = isset($meanY) ? $meanY : Average::arithmeticMean($y); $sum = 0.0; @@ -207,15 +213,16 @@ class MeasureOfDispersion /** * Get mean deviation. * - * @param array $x Values + * @param array $x Values + * @param float $mean Mean * * @return float * * @since 1.0.0 */ - public static function meanDeviation(array $x) : float + public static function meanDeviation(array $x, float $mean = null) : float { - $mean = Average::arithmeticMean($x); + $mean = isset($mean) ? $mean : Average::arithmeticMean($x); $sum = 0.0; foreach ($x as $xi) { @@ -228,15 +235,16 @@ class MeasureOfDispersion /** * Get mean absolute deviation. * - * @param array $x Values + * @param array $x Values + * @param float $mean Mean * * @return float * * @since 1.0.0 */ - public static function meanAbsoluteDeviation(array $x) : float + public static function meanAbsoluteDeviation(array $x, float $mean = null) : float { - $mean = Average::arithmeticMean($x); + $mean = isset($mean) ? $mean : Average::arithmeticMean($x); $sum = 0.0; foreach ($x as $xi) { @@ -249,15 +257,16 @@ class MeasureOfDispersion /** * Get squared mean deviation. * - * @param array $x Values + * @param array $x Values + * @param float $mean Mean * * @return float * * @since 1.0.0 */ - public static function squaredMeanDeviation(array $x) : float + public static function squaredMeanDeviation(array $x, float $mean = null) : float { - $mean = Average::arithmeticMean($x); + $mean = isset($mean) ? $mean : Average::arithmeticMean($x); $sum = 0.0; foreach ($x as $xi) {