【问题标题】:php statistics z-score normal distributionsphp统计z分数正态分布
【发布时间】:2011-11-05 16:03:57
【问题描述】:

如何使用 PHP 计算数字数组的 z 分数?我需要计算 z 分数,然后找到百分位数 (CDF)!我可以使用哪些 PHP 函数?谢谢!

【问题讨论】:

    标签: php statistics


    【解决方案1】:
    /* Mean */
    function mean($input_array)
    {
      $total = 0;
      foreach ($input_array as $value)
      {
        $total += $value;
      }
      return ($total / count($input_array));
    }
    
    /* Standard Deviation */
    function std($arr)
    {
      if (!count($arr))
      return 0;
      $mean = mean($arr);
      $sos = 0; // Sum of squares
      for ($i = 0; $i < count($arr); $i++)
      {
        $sos += ($arr[$i] - $mean) * ($arr[$i] - $mean);
      }
      return sqrt($sos / (count($arr) - 1));
    }
    
    /* Z Scores */
    function z($var, $arr)
    {
      return ($var -mean($arr)) / std($arr);
    }
    

    【讨论】:

      【解决方案2】:

      以下代码将很好地近似 CDF(Abramowitz & Stegun (1964))

      function normal_pdf($x) {
          return exp(-$x * $x / 4) / sqrt(2 * M_PI);
      }
      
      function normal_cdf($x) {
          $b = array(0.2316419, 0.319381530, -0.356563782, 1.781477937, -1.821255978, 1.330274429);
          $t = 1 / (1 + $b[0] * $x);
          $result = 0;
          for ($i = 1; $i < 6; $i++) {
              $result += $b[$i] * pow($t, $i);
          }
          return 1 - normal_pdf($x) * $result;
      }
      

      这假设一个标准正态分布。回想一下,要标准化,请使用z = (x - mean) / (standard deviation)

      【讨论】:

      • normal_cdf 函数不正确。它为 x 的某些值提供负值。
      【解决方案3】:

      PHP statistics extension 中的一些函数可以帮助您 — 您可能首先需要 stats_standard_deviation

      【讨论】:

      • 我似乎需要 stats_cdf_binomial 但该函数没有很好的文档记录..我什至不知道该函数的参数是什么..
      【解决方案4】:
      $control=array(15,7);
      $treatment=array(46,8);
      $confidence=number_format(cumnormdist(zscore($control, $treatment))*100,0);   
      
      function cr($t) 
      { 
          return $t[1]/$t[0]; 
      }
      
      function zscore($c, $t) 
      {
          $z = cr($t)-cr($c);
          $s = (cr($t)*(1-cr($t)))/$t[0] + (cr($c)*(1-cr($c)))/$c[0];
          return $z/sqrt($s);
      }
      
      function cumnormdist($x)
      {
        $b1 =  0.319381530;
        $b2 = -0.356563782;
        $b3 =  1.781477937;
        $b4 = -1.821255978;
        $b5 =  1.330274429;
        $p  =  0.2316419;
        $c  =  0.39894228;
      
        if($x >= 0.0) {
            $t = 1.0 / ( 1.0 + $p * $x );
            return (1.0 - $c * exp( -$x * $x / 2.0 ) * $t *
            ( $t *( $t * ( $t * ( $t * $b5 + $b4 ) + $b3 ) + $b2 ) + $b1 ));
        }
        else {
            $t = 1.0 / ( 1.0 - $p * $x );
            return ( $c * exp( -$x * $x / 2.0 ) * $t *
            ( $t *( $t * ( $t * ( $t * $b5 + $b4 ) + $b3 ) + $b2 ) + $b1 ));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-22
        • 1970-01-01
        • 2016-12-07
        • 2011-03-30
        • 2010-12-12
        • 2018-10-13
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多