【发布时间】:2011-07-23 00:31:53
【问题描述】:
我正在尝试使用 PHP 计算 Z 分数。本质上,我正在寻找最有效的方法来计算数据集(PHP 数组)的平均值和标准差。有关如何在 PHP 中执行此操作的任何建议?
我正在尝试以最少的步骤完成此操作。
【问题讨论】:
标签: php mean standard-deviation
我正在尝试使用 PHP 计算 Z 分数。本质上,我正在寻找最有效的方法来计算数据集(PHP 数组)的平均值和标准差。有关如何在 PHP 中执行此操作的任何建议?
我正在尝试以最少的步骤完成此操作。
【问题讨论】:
标签: php mean standard-deviation
计算你可以做的平均值:
$mean = array_sum($array)/count($array)
标准差是这样的:
// Function to calculate square of value - mean
function sd_square($x, $mean) { return pow($x - $mean,2); }
// Function to calculate standard deviation (uses sd_square)
function sd($array) {
// square root of sum of squares devided by N-1
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)-1) );
}
【讨论】:
sd() 函数不同。我使用 Excel STDDEV 进行了检查,它与您的相匹配,但有趣的是,stats_standard_deviation 似乎返回了 95% 的置信水平......与 Excel CONFIDENCE 函数返回的不完全一样,但非常接近。
如何使用内置的统计数据包,如stats_standard_deviation 和stats_harmonic_mean。我找不到标准均值的函数,但如果您对统计有所了解,我相信您可以使用内置函数找出答案。
【讨论】:
function standard_deviation($aValues)
{
$fMean = array_sum($aValues) / count($aValues);
//print_r($fMean);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$size = count($aValues) - 1;
return (float) sqrt($fVariance)/sqrt($size);
}
【讨论】:
这与顶部答案中提到的 php 页面中的 std dev 代码相同,但现代化了一点,没有单行数组魔术和单独的辅助函数:
/**
* Calculates the standard deviation of an array of numbers.
* @param array $array The array of numbers to calculate the standard deviation of.
* @return float The standard deviation of the numbers in the given array.
*/
function calculateStdDev(array $array): float
{
$size = count($array);
$mean = array_sum($array) / $size;
$squares = array_map(function ($x) use ($mean) {
return pow($x - $mean, 2);
}, $array);
return sqrt(array_sum($squares) / ($size - 1));
}
【讨论】:
这个话题很老了,但实际上我想你可以使用下面的函数轻松地从 Excel 中获取 STDEV.P 函数的替代品。
function stdev_p($arr) {
$arr2 = array();
$mean = array_sum($arr)/count($arr);
for ($x = 0; $x <count($arr); $x++) {
$arr2[$x] = pow($arr[$x] - $mean,2);
}
return sqrt(array_sum($arr2)/count($arr));
}
【讨论】: