]> git.donarmstrong.com Git - biopieces.git/blobdiff - code_perl/Maasha/Calc.pm
posished Calc::standard_deviation
[biopieces.git] / code_perl / Maasha / Calc.pm
index 7906b52d6654f32c49d50396d9ced5d863e31738..6f83fd09d06dceb3faa2fece3bdc905b425b73a0 100644 (file)
@@ -28,6 +28,7 @@ package Maasha::Calc;
 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
 
+use warnings;
 use strict;
 use Data::Dumper;
 use Storable qw( dclone );
@@ -58,6 +59,27 @@ sub is_a_number
 }
 
 
+sub commify
+{
+    # Martin A. Hansen, October 2009.
+
+    # Insert comma in long numbers.
+
+    my ( $num,   # number to commify
+       ) = @_;
+
+    # Returns a string.
+
+    my ( $copy );
+
+    $copy = $num;
+
+    $copy =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g;
+
+    return $copy;
+}
+
+
 sub dist_point2line
 {
     # Martin A. Hansen, June 2004.
@@ -175,7 +197,7 @@ sub median
     $num = scalar @{ $numbers };
 
     if ( $num % 2 == 0 ) {
-        $median = &mean( [ $numbers->[ $num / 2 ], $numbers->[ $num / 2 + 1 ] ] );
+        $median = mean( [ $numbers->[ $num / 2 ], $numbers->[ $num / 2 + 1 ] ] );
     } else {
         $median = $numbers->[ int( $num / 2 ) ];
     }
@@ -184,6 +206,39 @@ sub median
 }
 
 
+sub standard_deviation
+{
+    # Martin A. Hansen, September 2008
+
+    # Given a list of numbers calculate and return the standard deviation:
+    # http://en.wikipedia.org/wiki/Standard_deviation
+
+    my ( $numbers,   # list of numbers
+       ) = @_;
+
+    # Returns a float.
+
+    my ( $mean_num, $num, $dev, $dev_sum, $mean_dev, $std_dev );
+
+    $mean_num = mean( $numbers );
+
+    $dev_sum  = 0;
+
+    foreach $num ( @{ $numbers } )
+    {
+        $dev = ( $num - $mean_num ) ** 2;
+    
+        $dev_sum += $dev;
+    }
+
+    $mean_dev = $dev_sum / scalar @{ $numbers };
+
+    $std_dev  = sqrt( $mean_dev );
+
+    return $std_dev;
+}
+
+
 sub min
 {
     # Martin A. Hansen, August 2006.
@@ -316,6 +371,48 @@ sub sum
 }
 
 
+sub log10
+{
+    # Martin A. Hansen, August 2008.
+
+    # Calculate the log10 of a given number.
+
+    my ( $num,   # number
+       ) = @_;
+
+    # Returns a float.
+
+    return log( $num ) / log( 10 );
+}
+
+
+sub interpolate_linear
+{
+    # Martin A. Hansen, February 2010.
+
+    # Given two data points and an x value returns the
+    # interpolant (y).
+    #
+    # Formula for linear interpolation:
+    # http://en.wikipedia.org/wiki/Interpolation#Example
+
+    my ( $x1,
+         $y1,
+         $x2,
+         $y2,
+         $x
+       ) = @_;
+
+    # Returns a float
+
+    my ( $y );
+
+    $y = $y1 + ( $x - $x1 ) * ( ( $y2 - $y1 ) / ( $x2 - $x1 ) );
+
+    return $y;
+}
+
+
 sub overlap
 {
     # Martin A. Hansen, November 2003.