Guest User

pearsonCorrelation.pl

a guest
Oct 19th, 2011
871
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.56 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. open(QUERY, "<", $ARGV[0]) or die "Couldn't open query: $!";
  5. open (ANNOT, "<", $ARGV[1]) or die "Couldn't open csv: $!";
  6.  
  7. my @arrx;
  8. while (<QUERY>){
  9.     chomp;
  10.     my @arr = split("\t", $_);
  11.     shift @arr;
  12.     foreach my $ele (@arr){
  13.         push(@arrx, $ele);
  14.     }
  15. }
  16. my @x;
  17. my $i = 0;
  18. foreach my $elex (@arrx){
  19.     $x[1][$i]=$elex;
  20.     $i++;
  21. }
  22. my $numx = $i;
  23. my $nbdata = $i;
  24. my @mean;
  25. my %hash;
  26. while(<ANNOT>){
  27.     chomp;
  28.     if ($_ =~ /^#/){
  29.         next;
  30.     }
  31.     my @arry = split(/,/, $_);
  32.     my $gene_id = shift @arry;
  33.     my $i=0;
  34.     foreach my $eley (@arry){
  35.         $x[2][$i]=$eley;
  36.         $i++;
  37.     }
  38.     if ($i != $numx){
  39.         die "Arrays not the same size\n";
  40.     }
  41.     my $correl = correlation();
  42.     $hash{$gene_id}=$correl;
  43. }
  44. foreach my $key (sort {$hash{$b} <=> $hash{$a}} keys %hash){
  45.     print "$key\t$hash{$key}\n";
  46. }
  47. sub correlation {
  48.     $mean[1] = mean(1);
  49.     $mean[2] = mean(2);
  50.     my $ssxx = ss(1,1);
  51.     my $ssyy = ss(2,2);
  52.     my $ssxy = ss(1,2);
  53.     #print "$ssxx\t$ssyy\t$ssxy\n";
  54.     my $correl = correl($ssxx, $ssyy, $ssxy);
  55.     $correl = sprintf("%.4f\n", $correl);
  56.     return $correl;
  57.  
  58. }
  59. sub mean {
  60.  
  61.     my ($a)=@_;
  62.     my ($j,$sum)=(0,0);
  63.  
  64.     for ($j=0;$j<$nbdata;$j++){
  65.         $sum=$sum+$x[$a][$j];
  66.     }
  67.     my $mu=$sum/$nbdata;
  68.  
  69.     return $mu;
  70.  
  71. }
  72.  
  73.  
  74. sub ss{
  75.     my ($row, $col) = @_;
  76.     my $sum = 0;
  77.     for (my $i = 0; $i<$nbdata; $i++){
  78.         $sum += ($x[$row][$i]-$mean[$row])*($x[$col][$i]-$mean[$col]);
  79.     }
  80.     return $sum;
  81. }
  82. sub correl{
  83.     my ($ssxx, $ssyy, $ssxy) = @_;
  84.     my $sign = $ssxy/abs($ssxy);
  85.     my $correl = $sign*sqrt($ssxy*$ssxy/($ssxx*$ssyy));
  86.     return $correl;
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment