2013年8月4日 星期日

用 PHP 計算樣本相關係數

今天看 "真希望老師這樣教統計" 越看越有趣, 其中相關係數的計算, 書裡講的都是關於母體的計算, 但現實例子大都是有限樣本, 這時就要考慮自由度減 1 問題. 所謂相關係數是指 X,Y 兩組數據之間的關連性 :

X,Y 的相關係數=(X,Y 的共變異數) / (X 的樣本標準差 * Y 的樣本標準差)

而所謂樣本共變異數則是 :

X,Y 的共變異數=X,Y 的離均差交乘積和 / (樣本數 - 1)

這裡在母體共變異數是不用減 1 的, 在樣本因自由度少 1 故要減 1.

      $X=Array(25,23,27,35,30);
      $Y=Array(35,27,36,45,42);
      $xavg=array_sum($X)/count($X); //X 平均值
      $yavg=array_sum($Y)/count($Y); //Y 平均值
      $xsum=array_sum($X);           //X 總和
      $ysum=array_sum($Y);           //Y 總和
      $x_square_sum=0;               //X 平方和累計
      $y_square_sum=0;               //Y 平方和累計
      $XMD=Array();                  //X 離均差
      $YMD=Array();                  //Y 離均差
      $mdcross_sum=0;                //X,Y 離均差交乘積和
      $count=count($X);              //元素個數
      for ($i=0; $i <$count; ++$i) {
           $xdif=(float)$X[$i]-$xavg; //X 離均差
           $ydif=(float)$Y[$i]-$yavg; //Y 離均差
           $XMD[$i]=$xdif;
           $YMD[$i]=$ydif;
           $mdcross_sum += $xdif*$ydif;       //X,Y 離均差交乘積和
           $xdif_square_sum += pow($xdif, 2); //X 離均差平方和
           $x_square_sum += pow($X[$i], 2);   //X 平方和累計
           $y_square_sum += pow($Y[$i], 2);   //Y 平方和累計
           } //end of for
      //計算樣本標準差 & 乘積
      $xstd=sqrt(($x_square_sum-pow($xsum,2)/$count)/($count-1));
      $ystd=sqrt(($y_square_sum-pow($ysum,2)/$count)/($count-1));
      $xystd=$xstd*$ystd; //兩標準差乘積
      //計算樣本共變異數
      $covar=$mdcross_sum/($count-1);
      //計算相關係數
      $corr=$covar/$xystd;  //答案是 0.94137554144354

其實同樣數據, 我用母體公式計算相關係數, 答案也是 0.94, 沒什麼差異.

參考網站 :
http://stat.nuk.edu.tw/prost/content2/statics_6.htm (樣本共變異數)
http://greenhornfinancefootnote.blogspot.tw/2007/08/blog-post_27.html  (樣本標準差)

沒有留言 :