- 论坛徽章:
- 0
|
下面是皮尔森相关系数的计算代码,是我copy的。它只是求两行的系数值的,但是我想求n行两两之间的相关系数。不知道怎么办了。- #!/usr/local/bin/perl -w
- @x=(110.869429,224.432417,135.254959,314.799695,59.180641,160.191048,52.39372,283.666241,186.943458,170.444396,156.968469,424.092255,108.10017,51.204317,156.07176075,114.350089,66.6382395,154.04725,109.046664,228.484335
- );
- @y=(17.327247,17.404148,18.458939,17.559107,16.760933,15.49883,16.692633,17.327166,18.539049,19.794257,16.585954,15.774536,18.639974,16.643166,17.98409575,15.085853,18.899189,15.530345,16.620445,14.616374
- );
- if($#x==$#y){
- $N = $#x;
- print "N = $N\n";
- $sum_sq_x = 0;
- $sum_sq_y = 0;
- $sum_coproduct = 0;
- $mean_x = $x[1];
- $mean_y = $y[1];
- for($i=2;$i<=$N;$i++){
- $sweep = ($i - 1.0) / $i;
- $delta_x = $x[$i] - $mean_x;
- $delta_y = $y[$i] - $mean_y;
- $sum_sq_x += $delta_x * $delta_x * $sweep;
- $sum_sq_y += $delta_y * $delta_y * $sweep;
- $sum_coproduct += $delta_x * $delta_y * $sweep;
- $mean_x += $delta_x / $i;
- $mean_y += $delta_y / $i;
- }
- $pop_sd_x = sqrt( $sum_sq_x );
- $pop_sd_y = sqrt( $sum_sq_y );
- $cov_x_y = $sum_coproduct;
- $correlation = $cov_x_y / ($pop_sd_x * $pop_sd_y);
- print "Calculate Pearson correlation euqals:\t$correlation\n";
- exit(0);
- }
- print "PASS!\n";
- exit(1);
复制代码 |
|