【问题标题】:z-Scores(standard deviation and mean) in PHPPHP中的z分数(标准差和平均值)
【发布时间】:2011-07-23 00:31:53
【问题描述】:

我正在尝试使用 PHP 计算 Z 分数。本质上,我正在寻找最有效的方法来计算数据集(PHP 数组)的平均值和标准差。有关如何在 PHP 中执行此操作的任何建议?

我正在尝试以最少的步骤完成此操作。

【问题讨论】:

    标签: php mean standard-deviation


    【解决方案1】:

    计算你可以做的平均值:

    $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) );
    }
    

    马上this page

    【讨论】:

    • stats_standard_deviation 中的“内置”php 返回的值与您提供的 sd() 函数不同。我使用 Excel STDDEV 进行了检查,它与您的相匹配,但有趣的是,stats_standard_deviation 似乎返回了 95% 的置信水平......与 Excel CONFIDENCE 函数返回的不完全一样,但非常接近。
    • 会不会是你忽略了设置 $sample=true ?
    • 这是因为 stats_standard_deviation() 默认计算 population 标准差,而 Excel STDEV 计算 sample 标准差。要获得相同的结果,您必须使用 Excel STDEVP 或使用 $sample = true 调用 stats_standard_deviation()。要了解样本与总体之间存在差异的原因,请参阅Bessel's correction
    • PHP stats_standard_deviation() 函数执行 C++ 代码,运行速度比用 PHP 代码编写的等效函数快得多。
    • @dankyi-anno-kwaku Stack Overflow 是一个仅限英文的网站。请注意不要链接到外语资源。
    【解决方案2】:

    如何使用内置的统计数据包,如stats_standard_deviationstats_harmonic_mean。我找不到标准均值的函数,但如果您对统计有所了解,我相信您可以使用内置函数找出答案。

    【讨论】:

    • 然后投赞成票 :-) 鉴于这是最好的答案(“最少的步骤”和(可能)“最有效的方式”)。 (也许有人对说 built-in 不满意;您必须执行“sudo pecl install stats”然后编辑 php.ini)
    • @DarrenCook 我想知道这个问题是否有作曲家更新。我对 pear/pecl 的痛点是作为重新分发的应用程序开发人员,您永远不知道客户何时/是否可以使用 pear。 Composer 正在帮助改变这一点:-) 只是我的 0.02 美元。 PS - 为你的摇滚乐点赞
    • 自从上次更新是在 2016 年 6 月 pecl.php.net/package/stats 之后,似乎不再维护 stats PECL 包
    【解决方案3】:
       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);
    }
    

    【讨论】:

      【解决方案4】:

      这与顶部答案中提到的 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));
      }
      

      【讨论】:

        【解决方案5】:

        这个话题很老了,但实际上我想你可以使用下面的函数轻松地从 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));
        }
        

        【讨论】:

          猜你喜欢
          • 2018-07-20
          • 2020-12-26
          • 1970-01-01
          • 2014-03-21
          • 1970-01-01
          • 2016-03-11
          • 1970-01-01
          相关资源
          最近更新 更多