$value) { $sum += ($hasProbability ? $probabilities[$key] : 1) * ($value - $mean) ** 2; } return $hasProbability ? $sum : $sum / $count; } /** * Calculage empirical covariance. * * Example: ([4, 5, 9, 1, 3], [4, 5, 9, 1, 3]) * * @latex \sigma_{XY} = cov(X, Y) = \sum_{i = 1}^{N}\frac{\left(x_{i} - \bar{X}\right) \left(y_{i} - \bar{Y}\right)}{N - 1} * * @param array $x Values * @param array $y Values * @param float $meanX Mean * @param float $meanY Mean * * @return float * * @throws InvalidDimensionException * * @since 1.0.0 */ public static function empiricalCovariance(array $x, array $y, float $meanX = null, float $meanY = null) : float { $count = count($x); if ($count < 2) { throw new ZeroDevisionException(); } if ($count !== count($y)) { throw new InvalidDimensionException($count . 'x' . count($y)); } $xMean = $meanX !== null ? $meanX : Average::arithmeticMean($x); $yMean = $meanY !== null ? $meanY : Average::arithmeticMean($y); $sum = 0.0; for ($i = 0; $i < $count; ++$i) { $sum += ($x[$i] - $xMean) * ($y[$i] - $yMean); } return $sum / ($count - 1); } /** * Get interquartile range. * * @param array $x Dataset * * @return float * * @since 1.0.0 */ public static function getIQR(array $x) : float { return 0.0; } /** * Get mean deviation. * * @param array $x Values * @param float $mean Mean * * @return float * * @since 1.0.0 */ public static function meanDeviation(array $x, float $mean = null) : float { $mean = $mean !== null ? $mean : Average::arithmeticMean($x); $sum = 0.0; foreach ($x as $xi) { $sum += ($xi - $mean); } return $sum / count($x); } /** * Get mean absolute deviation. * * @param array $x Values * @param float $mean Mean * * @return float * * @since 1.0.0 */ public static function meanAbsoluteDeviation(array $x, float $mean = null) : float { $mean = $mean !== null ? $mean : Average::arithmeticMean($x); $sum = 0.0; foreach ($x as $xi) { $sum += abs($xi - $mean); } return $sum / count($x); } /** * Get squared mean deviation. * * @param array $x Values * @param float $mean Mean * * @return float * * @since 1.0.0 */ public static function squaredMeanDeviation(array $x, float $mean = null) : float { $mean = $mean !== null ? $mean : Average::arithmeticMean($x); $sum = 0.0; foreach ($x as $xi) { $sum += ($xi - $mean) ** 2; } return $sum / count($x); } }