view mayachemtools/docs/modules/html/code/StatisticsUtil.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
line wrap: on
line source

<html>
<head>
<title>MayaChemTools:Code:StatisticsUtil.pm</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
</head>
<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
<br/>
<center>
<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
</center>
<br/>
<pre>
<a name="package-StatisticsUtil-"></a>   1 <span class="k">package </span><span class="i">StatisticsUtil</span><span class="sc">;</span>
   2 <span class="c">#</span>
   3 <span class="c"># $RCSfile: StatisticsUtil.pm,v $</span>
   4 <span class="c"># $Date: 2015/02/28 20:47:18 $</span>
   5 <span class="c"># $Revision: 1.41 $</span>
   6 <span class="c">#</span>
   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
   8 <span class="c">#</span>
   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
  10 <span class="c">#</span>
  11 <span class="c"># This file is part of MayaChemTools.</span>
  12 <span class="c">#</span>
  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
  16 <span class="c"># later version.</span>
  17 <span class="c">#</span>
  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
  21 <span class="c"># details.</span>
  22 <span class="c">#</span>
  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
  27 <span class="c">#</span>
  28 
  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
  30 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
  31 
  32 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span>
  33 
  34 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span>
  35 <span class="i">@EXPORT</span> = <span class="q">qw(Average AverageDeviation Covariance Correlation Euclidean Factorial FactorialDivison GeometricMean Frequency HarmonicMean KLargest KSmallest Kurtosis Maximum Minimum Mean Median Mode PearsonCorrelation Permutations Product Range RSquare Skewness Sum SumOfSquares StandardDeviation StandardDeviationN  StandardError Standardize StandardScores StandardScoresN TrimMean Variance VarianceN)</span><span class="sc">;</span>
  36 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span>
  37 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span>
  38 
  39 <span class="c"># Compute the mean of an array of numbers</span>
<a name="Average-"></a>  40 <span class="k">sub </span><span class="m">Average</span> <span class="s">{</span>
  41   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  42   <span class="k">return</span> <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
  43 <span class="s">}</span>
  44 
  45 <span class="c"># Compute the average of the absolute deviation of an array of numbers: SUM( ABS(x[i] - Xmean) ) / n</span>
<a name="AverageDeviation-"></a>  46 <span class="k">sub </span><span class="m">AverageDeviation</span> <span class="s">{</span>
  47   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  48 
  49   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
  50     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
  51   <span class="s">}</span>
  52   <span class="k">my</span><span class="s">(</span><span class="i">$AverageDeviation</span><span class="cm">,</span> <span class="i">$Mean</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SumOfDeviations</span><span class="s">)</span><span class="sc">;</span>
  53 
  54   <span class="i">$AverageDeviation</span> = <span class="n">0</span><span class="sc">;</span>
  55   <span class="i">$Mean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
  56   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
  57     <span class="i">$SumOfDeviations</span> += <span class="k">abs</span><span class="s">(</span><span class="i">$Value</span> - <span class="i">$Mean</span><span class="s">)</span><span class="sc">;</span>
  58   <span class="s">}</span>
  59   <span class="i">$AverageDeviation</span> = <span class="i">$SumOfDeviations</span> / <span class="i">@$XArrayRef</span><span class="sc">;</span>
  60 
  61   <span class="k">return</span> <span class="i">$AverageDeviation</span><span class="sc">;</span>
  62 <span class="s">}</span>
  63 
  64 <span class="c"># Compute correlation coefficient between two arrays of numbers</span>
<a name="Correlation-"></a>  65 <span class="k">sub </span><span class="m">Correlation</span> <span class="s">{</span>
  66   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$YArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  67   <span class="k">return</span> <span class="i">PearsonCorrelation</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$YArrayRef</span><span class="s">)</span><span class="sc">;</span>
  68 <span class="s">}</span>
  69 
  70 <span class="c"># Compute the covariance between two arrays of numbers: SUM( (x[i] - Xmean) (y[i] - Ymean) ) / n</span>
<a name="Covariance-"></a>  71 <span class="k">sub </span><span class="m">Covariance</span> <span class="s">{</span>
  72   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$YArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  73 
  74   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@$XArrayRef</span> &amp;&amp; <span class="i">@$YArrayRef</span> &amp;&amp; <span class="s">(</span><span class="i">@$XArrayRef</span> == <span class="i">@$YArrayRef</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
  75     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
  76   <span class="s">}</span>
  77   <span class="k">my</span><span class="s">(</span><span class="i">$Covariance</span><span class="cm">,</span> <span class="i">$XMean</span><span class="cm">,</span> <span class="i">$YMean</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$ProductOfDeviations</span><span class="s">)</span><span class="sc">;</span>
  78 
  79   <span class="i">$Covariance</span> = <span class="n">0</span><span class="sc">;</span>
  80   <span class="i">$XMean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
  81   <span class="i">$YMean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$YArrayRef</span><span class="s">)</span><span class="sc">;</span>
  82   <span class="i">$ProductOfDeviations</span> = <span class="n">0</span><span class="sc">;</span>
  83   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">@$XArrayRef</span>}<span class="s">)</span> <span class="s">{</span>
  84     <span class="i">$ProductOfDeviations</span> += <span class="s">(</span><span class="s">(</span><span class="i">$XArrayRef</span>-&gt;[<span class="i">$Index</span>] - <span class="i">$XMean</span><span class="s">)</span> * <span class="s">(</span><span class="i">$YArrayRef</span>-&gt;[<span class="i">$Index</span>] - <span class="i">$YMean</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
  85   <span class="s">}</span>
  86   <span class="i">$Covariance</span> = <span class="i">$ProductOfDeviations</span> / <span class="i">@$XArrayRef</span><span class="sc">;</span>
  87   <span class="k">return</span> <span class="i">$Covariance</span><span class="sc">;</span>
  88 <span class="s">}</span>
  89 
  90 <span class="c"># Compute the euclidean distance of an array of numbers: SQRT( SUM( x[i] ** 2) )</span>
<a name="Euclidean-"></a>  91 <span class="k">sub </span><span class="m">Euclidean</span> <span class="s">{</span>
  92   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  93 
  94   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
  95     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
  96   <span class="s">}</span>
  97   <span class="k">my</span><span class="s">(</span><span class="i">$SumOfSquares</span><span class="s">)</span><span class="sc">;</span>
  98 
  99   <span class="i">$SumOfSquares</span> = <span class="i">SumOfSquares</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 100 
 101   <span class="k">return</span> <span class="k">sqrt</span> <span class="i">$SumOfSquares</span><span class="sc">;</span>
 102 <span class="s">}</span>
 103 
 104 <span class="c"># Compute factorial of a number...</span>
<a name="Factorial-"></a> 105 <span class="k">sub </span><span class="m">Factorial</span> <span class="s">{</span>
 106   <span class="k">my</span><span class="s">(</span><span class="i">$Num</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 107 
 108   <span class="k">return</span> <span class="i">_Factorial</span><span class="s">(</span><span class="i">$Num</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 109 <span class="s">}</span>
 110 
 111 <span class="c"># Perform factorial division of two numbers...</span>
<a name="FactorialDivison-"></a> 112 <span class="k">sub </span><span class="m">FactorialDivison</span> <span class="s">{</span>
 113   <span class="k">my</span><span class="s">(</span><span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 114 
 115   <span class="c"># Only works for integer numbers...</span>
 116   <span class="k">if</span> <span class="s">(</span><span class="i">$Numerator</span> &lt;= <span class="n">0</span> || <span class="s">(</span><span class="i">$Numerator</span> != <span class="k">int</span><span class="s">(</span><span class="i">$Numerator</span><span class="s">)</span><span class="s">)</span> ||
 117      <span class="i">$Denominator</span> &lt;= <span class="n">0</span> || <span class="s">(</span><span class="i">$Denominator</span> != <span class="k">int</span><span class="s">(</span><span class="i">$Denominator</span><span class="s">)</span><span class="s">)</span> <span class="s">)</span> <span class="s">{</span>
 118     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 119   <span class="s">}</span>
 120   <span class="k">my</span><span class="s">(</span><span class="i">$LargerNum</span><span class="cm">,</span> <span class="i">$SmallerNum</span><span class="cm">,</span> <span class="i">$Result</span><span class="s">)</span><span class="sc">;</span>
 121   <span class="i">$LargerNum</span> = <span class="s">(</span><span class="i">$Numerator</span> &gt; <span class="i">$Denominator</span><span class="s">)</span> ? <span class="i">$Numerator</span> <span class="co">:</span> <span class="i">$Denominator</span><span class="sc">;</span>
 122   <span class="i">$SmallerNum</span> = <span class="s">(</span><span class="i">$Numerator</span> &lt; <span class="i">$Denominator</span><span class="s">)</span> ? <span class="i">$Numerator</span> <span class="co">:</span> <span class="i">$Denominator</span><span class="sc">;</span>
 123 
 124   <span class="i">$Result</span> = <span class="i">_Factorial</span><span class="s">(</span><span class="i">$LargerNum</span><span class="cm">,</span> <span class="i">$SmallerNum</span><span class="s">)</span><span class="sc">;</span>
 125   <span class="k">if</span> <span class="s">(</span><span class="i">$Numerator</span> &lt; <span class="i">$Denominator</span><span class="s">)</span> <span class="s">{</span>
 126     <span class="i">$Result</span> = <span class="n">1</span>/<span class="i">$Result</span><span class="sc">;</span>
 127   <span class="s">}</span>
 128   <span class="k">return</span> <span class="i">$Result</span><span class="sc">;</span>
 129 <span class="s">}</span>
 130 
 131 <span class="c"># Calculate factorial of a number upto a specific limit...</span>
<a name="_Factorial-"></a> 132 <span class="k">sub </span><span class="m">_Factorial</span> <span class="s">{</span>
 133   <span class="k">my</span><span class="s">(</span><span class="i">$Num</span><span class="cm">,</span> <span class="i">$Limit</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 134 
 135   <span class="c"># Only works for integer numbers...</span>
 136   <span class="k">if</span> <span class="s">(</span><span class="i">$Num</span> &lt;= <span class="n">0</span> || <span class="s">(</span><span class="i">$Num</span> != <span class="k">int</span><span class="s">(</span><span class="i">$Num</span><span class="s">)</span><span class="s">)</span> || <span class="i">$Limit</span> &lt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
 137     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 138   <span class="s">}</span>
 139 
 140   <span class="k">my</span><span class="s">(</span><span class="i">$Result</span><span class="s">)</span> = <span class="n">1</span><span class="sc">;</span>
 141 
 142   <span class="k">while</span> <span class="s">(</span><span class="i">$Num</span> &gt; <span class="i">$Limit</span><span class="s">)</span> <span class="s">{</span>
 143     <span class="i">$Result</span> *= <span class="i">$Num</span><span class="sc">;</span>
 144     <span class="i">$Num</span>--<span class="sc">;</span>
 145   <span class="s">}</span>
 146   <span class="k">return</span> <span class="i">$Result</span><span class="sc">;</span>
 147 <span class="s">}</span>
 148 
 149 <span class="c"># Generate all possible permuations or a specific permutations of items in an array</span>
 150 <span class="c"># and return a reference to an array containing array references to generated permuations...</span>
 151 <span class="c">#</span>
 152 <span class="c"># This alogrithm is based on the example provided by Mark Jason-Dominus, and is available</span>
 153 <span class="c"># at CPAN as mjd_permute standalone script.</span>
 154 <span class="c">#</span>
<a name="Permutations-"></a> 155 <span class="k">sub </span><span class="m">Permutations</span> <span class="s">{</span>
 156   <span class="k">my</span><span class="s">(</span><span class="i">@DataToPermute</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 157   <span class="k">my</span><span class="s">(</span><span class="i">$PermutationNum</span><span class="cm">,</span> <span class="i">$NumOfPermutations</span><span class="cm">,</span> <span class="i">@Permutations</span><span class="s">)</span><span class="sc">;</span>
 158 
 159   <span class="k">if</span> <span class="s">(</span>!<span class="i">@DataToPermute</span><span class="s">)</span> <span class="s">{</span>
 160     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 161   <span class="s">}</span>
 162 
 163   <span class="i">@Permutations</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 164   <span class="i">$NumOfPermutations</span> = <span class="i">Factorial</span><span class="s">(</span><span class="k">scalar</span> <span class="i">@DataToPermute</span><span class="s">)</span><span class="sc">;</span>
 165 
 166   <span class="k">for</span> <span class="s">(</span><span class="i">$PermutationNum</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$PermutationNum</span> &lt; <span class="i">$NumOfPermutations</span><span class="sc">;</span> <span class="i">$PermutationNum</span>++<span class="s">)</span> <span class="s">{</span>
 167     <span class="k">my</span> <span class="i">@Permutation</span> = <span class="i">@DataToPermute</span>[<span class="i">_PermutationNumToPermutation</span><span class="s">(</span><span class="i">$PermutationNum</span><span class="cm">,</span> <span class="i">$#DataToPermute</span><span class="s">)</span>]<span class="sc">;</span>
 168     <span class="k">push</span> <span class="i">@Permutations</span><span class="cm">,</span> \<span class="i">@Permutation</span><span class="sc">;</span>
 169   <span class="s">}</span>
 170 
 171   <span class="k">return</span> \<span class="i">@Permutations</span><span class="sc">;</span>
 172 <span class="s">}</span>
 173 
 174 <span class="c"># Generte Nth permutation for a collection of specific size...</span>
 175 <span class="c">#</span>
<a name="_PermutationNumToPermutation-"></a> 176 <span class="k">sub </span><span class="m">_PermutationNumToPermutation</span> <span class="s">{</span>
 177   <span class="k">my</span><span class="s">(</span><span class="i">$Num</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 178 
 179   <span class="k">return</span> <span class="i">_PatternToPermutation</span><span class="s">(</span><span class="i">_PermutationNumToPattern</span><span class="s">(</span><span class="i">$Num</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
 180 <span class="s">}</span>
 181 
 182 <span class="c"># Generate Nth pattern for a collection of specific size...</span>
 183 <span class="c">#</span>
<a name="_PermutationNumToPattern-"></a> 184 <span class="k">sub </span><span class="m">_PermutationNumToPattern</span> <span class="s">{</span>
 185   <span class="k">my</span><span class="s">(</span><span class="i">$Num</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 186   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">@Pattern</span><span class="s">)</span><span class="sc">;</span>
 187 
 188   <span class="i">$Index</span> = <span class="n">1</span><span class="sc">;</span>
 189 
 190   <span class="k">while</span> <span class="s">(</span><span class="i">$Index</span> &lt;= <span class="i">$Size</span> + <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
 191     <span class="k">push</span> <span class="i">@Pattern</span><span class="cm">,</span> <span class="i">$Num</span> % <span class="i">$Index</span><span class="sc">;</span>
 192     <span class="i">$Num</span> = <span class="k">int</span><span class="s">(</span><span class="i">$Num</span>/<span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 193     <span class="i">$Index</span>++<span class="sc">;</span>
 194   <span class="s">}</span>
 195 
 196   <span class="k">return</span> <span class="i">@Pattern</span><span class="sc">;</span>
 197 <span class="s">}</span>
 198 
 199 <span class="c"># Generate permutation of integers from pattern...</span>
 200 <span class="c">#</span>
<a name="_PatternToPermutation-"></a> 201 <span class="k">sub </span><span class="m">_PatternToPermutation</span> <span class="s">{</span>
 202   <span class="k">my</span><span class="s">(</span><span class="i">@Pattern</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 203   <span class="k">my</span><span class="s">(</span><span class="i">@Source</span><span class="cm">,</span> <span class="i">@Permutation</span><span class="s">)</span><span class="sc">;</span>
 204 
 205   <span class="i">@Source</span> = <span class="s">(</span><span class="n">0</span> .. <span class="i">$#Pattern</span><span class="s">)</span><span class="sc">;</span>
 206 
 207   <span class="k">while</span> <span class="s">(</span><span class="i">@Pattern</span><span class="s">)</span> <span class="s">{</span>
 208     <span class="k">push</span> <span class="i">@Permutation</span><span class="cm">,</span> <span class="k">splice</span><span class="s">(</span><span class="i">@Source</span><span class="cm">,</span> <span class="s">(</span><span class="k">pop</span> <span class="i">@Pattern</span><span class="s">)</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 209   <span class="s">}</span>
 210 
 211   <span class="k">return</span> <span class="i">@Permutation</span><span class="sc">;</span>
 212 <span class="s">}</span>
 213 
 214 <span class="c"># Compute the frequency of occurance of values in an array of numbers. Three different</span>
 215 <span class="c"># invocation methods are supported:</span>
 216 <span class="c">#</span>
 217 <span class="c"># Frequency(\@ArrayRef) : Using the smallest and largest values, group the numbers into</span>
 218 <span class="c"># 10 bins.</span>
 219 <span class="c">#</span>
 220 <span class="c"># Frequency(\@ArrayRef, $NumOfBins) : Using the smallest and largest values, group the</span>
 221 <span class="c"># numbers into specified bins.</span>
 222 <span class="c">#</span>
 223 <span class="c"># Frequency(\@ArrayRef, \@BinRange): Use bin range to goup the values into different bins.</span>
 224 <span class="c">#</span>
 225 <span class="c"># A hash array is returned with keys and values representing range and frequency values respectively.</span>
 226 <span class="c"># The frequency value for a specific key corresponds to all the values which are greater than</span>
 227 <span class="c"># the previous key and less than or equal to the current key. A key value representing maximum value is</span>
 228 <span class="c"># added for generating frequency distribution for specific number of bins, and whenever the maximum</span>
 229 <span class="c"># array value is greater than the maximum specified in bin range, it is also added to bin range.</span>
 230 <span class="c">#</span>
<a name="Frequency-"></a> 231 <span class="k">sub </span><span class="m">Frequency</span> <span class="s">{</span>
 232   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 233 
 234   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 235     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 236   <span class="s">}</span>
 237 
 238   <span class="k">my</span><span class="s">(</span><span class="i">$BinRange</span><span class="cm">,</span> <span class="i">$NumOfBins</span><span class="cm">,</span> <span class="i">$BinRangeSpecified</span><span class="s">)</span><span class="sc">;</span>
 239 
 240   <span class="i">$BinRangeSpecified</span> = <span class="n">0</span><span class="sc">;</span>
 241   <span class="i">$NumOfBins</span> = <span class="n">10</span><span class="sc">;</span>
 242   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 243     <span class="k">if</span> <span class="s">(</span><span class="k">ref</span><span class="s">(</span><span class="i">$_</span>[<span class="n">1</span>]<span class="s">)</span> <span class="k">eq</span> <span class="q">&#39;ARRAY&#39;</span><span class="s">)</span> <span class="s">{</span>
 244       <span class="i">$BinRange</span> = <span class="i">$_</span>[<span class="n">1</span>]<span class="sc">;</span>
 245       <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@$BinRange</span> &amp;&amp; <span class="s">(</span><span class="i">@$BinRange</span> &gt; <span class="n">1</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 246         <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 247       <span class="s">}</span>
 248       <span class="c"># Make sure the bin range contains values in increasing order...</span>
 249       <span class="k">my</span><span class="s">(</span><span class="i">$Index1</span><span class="cm">,</span> <span class="i">$Index2</span><span class="s">)</span><span class="sc">;</span>
 250       <span class="k">for</span> <span class="i">$Index1</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">@$BinRange</span>}<span class="s">)</span> <span class="s">{</span>
 251         <span class="k">for</span> <span class="i">$Index2</span> <span class="s">(</span><span class="s">(</span><span class="i">$Index1</span> + <span class="n">1</span><span class="s">)</span> .. <span class="i">$#</span>{<span class="i">@$BinRange</span>}<span class="s">)</span> <span class="s">{</span>
 252           <span class="k">if</span> <span class="s">(</span><span class="i">$BinRange</span>-&gt;[<span class="i">$Index1</span>] &gt;= <span class="i">$BinRange</span>-&gt;[<span class="i">$Index2</span>]<span class="s">)</span> <span class="s">{</span>
 253             <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 254           <span class="s">}</span>
 255         <span class="s">}</span>
 256       <span class="s">}</span>
 257       <span class="i">$BinRangeSpecified</span> = <span class="n">1</span><span class="sc">;</span>
 258     <span class="s">}</span>
 259     <span class="k">else</span> <span class="s">{</span>
 260       <span class="i">$NumOfBins</span> = <span class="i">$_</span>[<span class="n">1</span>]<span class="sc">;</span>
 261       <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfBins</span> &lt;= <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
 262         <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 263       <span class="s">}</span>
 264     <span class="s">}</span>
 265   <span class="s">}</span>
 266 
 267   <span class="c"># Setup range keys...</span>
 268   <span class="k">my</span><span class="s">(</span><span class="i">@RangeKeys</span><span class="s">)</span><span class="sc">;</span>
 269   <span class="i">@RangeKeys</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 270 
 271   <span class="k">my</span><span class="s">(</span><span class="i">$MinValue</span><span class="cm">,</span> <span class="i">$MaxValue</span><span class="s">)</span> = <span class="i">Range</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 272   <span class="k">if</span> <span class="s">(</span><span class="i">$BinRangeSpecified</span><span class="s">)</span> <span class="s">{</span>
 273     <span class="k">push</span> <span class="i">@RangeKeys</span><span class="cm">,</span> <span class="i">@$BinRange</span><span class="sc">;</span>
 274     <span class="k">if</span> <span class="s">(</span><span class="i">$MaxValue</span> &gt; <span class="i">$RangeKeys</span>[<span class="i">$#RangeKeys</span>]<span class="s">)</span> <span class="s">{</span>
 275       <span class="k">push</span> <span class="i">@RangeKeys</span><span class="cm">,</span> <span class="i">$MaxValue</span><span class="sc">;</span>
 276     <span class="s">}</span>
 277   <span class="s">}</span>
 278   <span class="k">else</span> <span class="s">{</span>
 279     <span class="k">my</span><span class="s">(</span><span class="i">$MinValue</span><span class="cm">,</span> <span class="i">$MaxValue</span><span class="s">)</span> = <span class="i">Range</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 280     <span class="k">my</span><span class="s">(</span><span class="i">$Interval</span><span class="s">)</span> = <span class="s">(</span><span class="i">$MaxValue</span> - <span class="i">$MinValue</span><span class="s">)</span>/<span class="i">$NumOfBins</span><span class="sc">;</span>
 281     <span class="k">my</span><span class="s">(</span><span class="i">$KeyValue</span><span class="s">)</span> = <span class="i">$MinValue</span> + <span class="i">$Interval</span><span class="sc">;</span>
 282     <span class="k">while</span> <span class="s">(</span><span class="i">$KeyValue</span>  &lt; <span class="i">$MaxValue</span><span class="s">)</span> <span class="s">{</span>
 283       <span class="k">push</span> <span class="i">@RangeKeys</span><span class="cm">,</span> <span class="i">$KeyValue</span><span class="sc">;</span>
 284       <span class="i">$KeyValue</span> += <span class="i">$Interval</span><span class="sc">;</span>
 285     <span class="s">}</span>
 286     <span class="k">push</span> <span class="i">@RangeKeys</span><span class="cm">,</span> <span class="i">$MaxValue</span><span class="sc">;</span>
 287   <span class="s">}</span>
 288 
 289   <span class="c">#Setup frequency hash array...</span>
 290   <span class="k">my</span><span class="s">(</span><span class="i">%FrequencyMap</span><span class="s">)</span><span class="sc">;</span>
 291   <span class="i">%FrequencyMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 292 
 293   <span class="i">%FrequencyMap</span> = <span class="k">map</span> <span class="s">{</span> <span class="i">$_</span> <span class="cm">=&gt;</span> <span class="n">0</span> <span class="s">}</span> <span class="i">@RangeKeys</span><span class="sc">;</span>
 294 
 295   <span class="c"># Count values...</span>
 296   <span class="k">my</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 297 
 298   <span class="j">VALUE:</span> <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 299       <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@RangeKeys</span><span class="s">)</span> <span class="s">{</span>
 300         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> &lt;= <span class="i">$Key</span><span class="s">)</span> <span class="s">{</span>
 301           <span class="i">$FrequencyMap</span>{<span class="i">$Key</span>} += <span class="n">1</span><span class="sc">;</span>
 302           <span class="k">next</span> <span class="j">VALUE</span><span class="sc">;</span>
 303         <span class="s">}</span>
 304       <span class="s">}</span>
 305   <span class="s">}</span>
 306   <span class="k">return</span> <span class="s">(</span><span class="i">%FrequencyMap</span><span class="s">)</span><span class="sc">;</span>
 307 <span class="s">}</span>
 308 
 309 <span class="c"># Compute the geometric mean of an array of numbers: NthROOT( PRODUCT(x[i]) )</span>
<a name="GeometricMean-"></a> 310 <span class="k">sub </span><span class="m">GeometricMean</span> <span class="s">{</span>
 311   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 312 
 313   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 314     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 315   <span class="s">}</span>
 316   <span class="k">my</span><span class="s">(</span><span class="i">$Mean</span><span class="cm">,</span> <span class="i">$Product</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 317   <span class="i">$Product</span> = <span class="n">1</span><span class="sc">;</span>
 318   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 319     <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> &lt;= <span class="n">0</span> <span class="s">)</span> <span class="s">{</span>
 320       <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 321     <span class="s">}</span>
 322     <span class="i">$Product</span> *= <span class="i">$Value</span><span class="sc">;</span>
 323   <span class="s">}</span>
 324   <span class="i">$Mean</span> = <span class="i">$Product</span> ** <span class="s">(</span><span class="n">1</span> / <span class="i">@$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 325   <span class="k">return</span> <span class="i">$Mean</span><span class="sc">;</span>
 326 <span class="s">}</span>
 327 
 328 <span class="c"># Compute the harmonic mean of an array of numbers: 1 / ( SUM(1/x[i]) / n )</span>
<a name="HarmonicMean-"></a> 329 <span class="k">sub </span><span class="m">HarmonicMean</span> <span class="s">{</span>
 330   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 331 
 332   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 333     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 334   <span class="s">}</span>
 335   <span class="k">my</span><span class="s">(</span><span class="i">$Mean</span><span class="cm">,</span> <span class="i">$Sum</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 336   <span class="i">$Sum</span> = <span class="n">0</span><span class="sc">;</span>
 337   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 338     <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> &lt;= <span class="n">0</span> <span class="s">)</span> <span class="s">{</span>
 339       <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 340     <span class="s">}</span>
 341     <span class="i">$Sum</span> += <span class="n">1</span>/<span class="i">$Value</span><span class="sc">;</span>
 342   <span class="s">}</span>
 343   <span class="i">$Mean</span> = <span class="n">1</span>/<span class="s">(</span><span class="i">$Sum</span>/<span class="i">@$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 344   <span class="k">return</span> <span class="i">$Mean</span><span class="sc">;</span>
 345 <span class="s">}</span>
 346 
 347 <span class="c"># Return the k-largest value from an array of numbers</span>
<a name="KLargest-"></a> 348 <span class="k">sub </span><span class="m">KLargest</span> <span class="s">{</span>
 349   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$K</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 350 
 351   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@$XArrayRef</span> &amp;&amp; <span class="s">(</span><span class="i">$K</span> &gt; <span class="n">0</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">$K</span> &lt;= <span class="i">@$XArrayRef</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 352     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 353   <span class="s">}</span>
 354   <span class="k">my</span><span class="s">(</span><span class="i">$KLargest</span><span class="cm">,</span> <span class="i">@SortedXArray</span><span class="s">)</span><span class="sc">;</span>
 355   <span class="i">@SortedXArray</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$b</span> &lt;=&gt; <span class="i">$a</span> <span class="s">}</span> <span class="i">@$XArrayRef</span><span class="sc">;</span>
 356   <span class="i">$KLargest</span> = <span class="i">$SortedXArray</span>[<span class="i">$K</span> - <span class="n">1</span>]<span class="sc">;</span>
 357   <span class="k">return</span> <span class="i">$KLargest</span><span class="sc">;</span>
 358 <span class="s">}</span>
 359 
 360 <span class="c"># Return the k-smallest value from an array of numbers</span>
<a name="KSmallest-"></a> 361 <span class="k">sub </span><span class="m">KSmallest</span> <span class="s">{</span>
 362   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$K</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 363 
 364   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@$XArrayRef</span> &amp;&amp; <span class="s">(</span><span class="i">$K</span> &gt; <span class="n">0</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">$K</span> &lt;= <span class="i">@$XArrayRef</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 365     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 366   <span class="s">}</span>
 367   <span class="k">my</span><span class="s">(</span><span class="i">$KSmallest</span><span class="cm">,</span> <span class="i">@SortedXArray</span><span class="s">)</span><span class="sc">;</span>
 368   <span class="i">@SortedXArray</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> &lt;=&gt; <span class="i">$b</span> <span class="s">}</span> <span class="i">@$XArrayRef</span><span class="sc">;</span>
 369   <span class="i">$KSmallest</span> = <span class="i">$SortedXArray</span>[<span class="i">$K</span> - <span class="n">1</span>]<span class="sc">;</span>
 370   <span class="k">return</span> <span class="i">$KSmallest</span><span class="sc">;</span>
 371 <span class="s">}</span>
 372 
 373 <span class="c"># Compute the kurtosis of an array of numbers:</span>
 374 <span class="c"># [ {n(n + 1)/(n - 1)(n - 2)(n - 3)}  SUM{ ((x[i] - Xmean)/STDDEV)^4 } ] - {3((n - 1)^2)}/{(n - 2)(n-3)}</span>
 375 <span class="c">#</span>
<a name="Kurtosis-"></a> 376 <span class="k">sub </span><span class="m">Kurtosis</span> <span class="s">{</span>
 377   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 378 
 379   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span> || <span class="s">(</span><span class="s">(</span><span class="i">@$XArrayRef</span> - <span class="n">3</span><span class="s">)</span> &lt;= <span class="n">0</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 380     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 381   <span class="s">}</span>
 382   <span class="k">my</span><span class="s">(</span><span class="i">$Kurtosis</span><span class="cm">,</span> <span class="i">$Mean</span><span class="cm">,</span> <span class="i">$StandardDeviation</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 383   <span class="i">$Mean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 384   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Mean</span><span class="s">)</span> <span class="s">{</span>
 385     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 386   <span class="s">}</span>
 387   <span class="i">$StandardDeviation</span> = <span class="i">StandardDeviation</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 388   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span> <span class="i">$StandardDeviation</span> &amp;&amp;  <span class="i">$StandardDeviation</span> != <span class="n">0</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 389     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 390   <span class="s">}</span>
 391 
 392   <span class="k">my</span><span class="s">(</span><span class="i">$SumOfScores</span><span class="cm">,</span> <span class="i">$SampleSize</span><span class="s">)</span><span class="sc">;</span>
 393   <span class="i">$SumOfScores</span> = <span class="n">0</span><span class="sc">;</span>
 394   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 395     <span class="i">$SumOfScores</span> += <span class="s">(</span><span class="s">(</span><span class="i">$Value</span> - <span class="i">$Mean</span><span class="s">)</span>/<span class="i">$StandardDeviation</span><span class="s">)</span> ** <span class="n">4</span><span class="sc">;</span>
 396   <span class="s">}</span>
 397   <span class="i">$SampleSize</span> = <span class="i">@$XArrayRef</span><span class="sc">;</span>
 398   <span class="i">$Kurtosis</span> = <span class="s">(</span><span class="s">(</span><span class="s">(</span><span class="i">$SampleSize</span> * <span class="s">(</span><span class="i">$SampleSize</span> + <span class="n">1</span><span class="s">)</span><span class="s">)</span>/<span class="s">(</span><span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">1</span><span class="s">)</span> * <span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">2</span><span class="s">)</span> * <span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">3</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> * <span class="i">$SumOfScores</span><span class="s">)</span> - <span class="s">(</span><span class="s">(</span><span class="n">3</span> * <span class="s">(</span><span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">1</span><span class="s">)</span> ** <span class="n">2</span><span class="s">)</span><span class="s">)</span>/<span class="s">(</span><span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">2</span><span class="s">)</span> * <span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">3</span><span class="s">)</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
 399   <span class="k">return</span> <span class="i">$Kurtosis</span><span class="sc">;</span>
 400 <span class="s">}</span>
 401 
 402 <span class="c"># Return the smallest value from an array of numbers</span>
<a name="Minimum-"></a> 403 <span class="k">sub </span><span class="m">Minimum</span> <span class="s">{</span>
 404   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 405   <span class="k">return</span> <span class="i">KSmallest</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 406 <span class="s">}</span>
 407 
 408 <span class="c"># Return the largest value from an array of numbers</span>
<a name="Maximum-"></a> 409 <span class="k">sub </span><span class="m">Maximum</span> <span class="s">{</span>
 410   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 411   <span class="k">return</span> <span class="i">KLargest</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 412 <span class="s">}</span>
 413 
 414 <span class="c"># Compute the mean of an array of numbers: SUM( x[i] ) / n</span>
<a name="Mean-"></a> 415 <span class="k">sub </span><span class="m">Mean</span> <span class="s">{</span>
 416   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 417 
 418   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 419     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 420   <span class="s">}</span>
 421   <span class="k">my</span><span class="s">(</span><span class="i">$Mean</span><span class="cm">,</span> <span class="i">$Sum</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 422   <span class="i">$Sum</span> = <span class="n">0</span><span class="sc">;</span>
 423   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 424     <span class="i">$Sum</span> += <span class="i">$Value</span><span class="sc">;</span>
 425   <span class="s">}</span>
 426   <span class="i">$Mean</span> = <span class="i">$Sum</span> / <span class="i">@$XArrayRef</span><span class="sc">;</span>
 427   <span class="k">return</span> <span class="i">$Mean</span><span class="sc">;</span>
 428 <span class="s">}</span>
 429 
 430 <span class="c"># Compute the median value of an array of numbers. For an even number array, it&#39;s</span>
 431 <span class="c"># the average of two middle values.</span>
 432 <span class="c">#</span>
 433 <span class="c"># For even values of n: Xsorted[(n - 1)/2 + 1]</span>
 434 <span class="c"># For odd values of n: (Xsorted[n/2] + Xsorted[n/2 + 1])/2</span>
 435 <span class="c">#</span>
<a name="Median-"></a> 436 <span class="k">sub </span><span class="m">Median</span> <span class="s">{</span>
 437   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 438 
 439   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 440     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 441   <span class="s">}</span>
 442   <span class="k">my</span><span class="s">(</span><span class="i">$Median</span><span class="cm">,</span> <span class="i">@SortedXArray</span><span class="s">)</span><span class="sc">;</span>
 443   <span class="i">$Median</span> = <span class="n">0</span><span class="sc">;</span>
 444   <span class="i">@SortedXArray</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> &lt;=&gt; <span class="i">$b</span> <span class="s">}</span> <span class="i">@$XArrayRef</span><span class="sc">;</span>
 445   <span class="k">if</span> <span class="s">(</span><span class="i">@$XArrayRef</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 446     <span class="k">my</span><span class="s">(</span><span class="i">$MidIndex</span><span class="s">)</span><span class="sc">;</span>
 447     <span class="i">$MidIndex</span> = <span class="k">int</span><span class="s">(</span><span class="i">@SortedXArray</span> - <span class="n">1</span><span class="s">)</span>/<span class="n">2</span><span class="sc">;</span>
 448     <span class="i">$Median</span> = <span class="i">$SortedXArray</span>[<span class="i">$MidIndex</span>]<span class="sc">;</span>
 449   <span class="s">}</span>
 450   <span class="k">else</span> <span class="s">{</span>
 451     <span class="c"># Even number array...</span>
 452     <span class="k">my</span><span class="s">(</span><span class="i">$MidPosition</span><span class="s">)</span><span class="sc">;</span>
 453     <span class="i">$MidPosition</span> = <span class="k">int</span><span class="s">(</span><span class="i">@SortedXArray</span> / <span class="n">2</span><span class="s">)</span><span class="sc">;</span>
 454     <span class="i">$Median</span> = <span class="s">(</span><span class="i">$SortedXArray</span>[<span class="i">$MidPosition</span> - <span class="n">1</span>] + <span class="i">$SortedXArray</span>[<span class="i">$MidPosition</span>]<span class="s">)</span> / <span class="n">2</span><span class="sc">;</span>
 455   <span class="s">}</span>
 456   <span class="k">return</span> <span class="i">$Median</span><span class="sc">;</span>
 457 <span class="s">}</span>
 458 
 459 <span class="c"># Return the most frequently occuring value in an array of numbers</span>
<a name="Mode-"></a> 460 <span class="k">sub </span><span class="m">Mode</span> <span class="s">{</span>
 461   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 462 
 463   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 464     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 465   <span class="s">}</span>
 466   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="cm">,</span> <span class="i">%ValueToCountMap</span><span class="cm">,</span> <span class="i">@CountList</span><span class="cm">,</span> <span class="i">@SortedCountList</span><span class="s">)</span><span class="sc">;</span>
 467   <span class="i">%ValueToCountMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 468   <span class="i">@CountList</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 469   <span class="i">@SortedCountList</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 470   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 471     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
 472       <span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>} += <span class="n">1</span><span class="sc">;</span>
 473     <span class="s">}</span>
 474     <span class="k">else</span> <span class="s">{</span>
 475       <span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>} = <span class="n">1</span><span class="sc">;</span>
 476     <span class="s">}</span>
 477   <span class="s">}</span>
 478   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%ValueToCountMap</span><span class="s">)</span> <span class="s">{</span>
 479     <span class="k">push</span> <span class="i">@CountList</span><span class="cm">,</span> <span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>}<span class="sc">;</span>
 480   <span class="s">}</span>
 481   <span class="i">@SortedCountList</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$b</span> &lt;=&gt; <span class="i">$a</span> <span class="s">}</span> <span class="i">@CountList</span><span class="sc">;</span>
 482 
 483   <span class="c"># Make sure the frequency of mode value is greater than one and check for</span>
 484   <span class="c"># multiple modes as well...</span>
 485   <span class="c">#</span>
 486   <span class="k">my</span><span class="s">(</span><span class="i">$ModeCount</span><span class="cm">,</span> <span class="i">$ModeValue</span><span class="s">)</span><span class="sc">;</span>
 487   <span class="i">$ModeCount</span> = <span class="i">$SortedCountList</span>[<span class="n">0</span>]<span class="sc">;</span>
 488   <span class="k">if</span> <span class="s">(</span><span class="i">$ModeCount</span> &lt;= <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
 489     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 490   <span class="s">}</span>
 491   <span class="c"># Get the first mode value...</span>
 492   <span class="j">VALUE:</span> <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%ValueToCountMap</span><span class="s">)</span> <span class="s">{</span>
 493     <span class="k">if</span> <span class="s">(</span><span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>} == <span class="i">$ModeCount</span><span class="s">)</span> <span class="s">{</span>
 494       <span class="i">$ModeValue</span> = <span class="i">$Value</span><span class="sc">;</span>
 495       <span class="c"># Set it to zero to skip it next time...</span>
 496       <span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>} = <span class="n">0</span><span class="sc">;</span>
 497       <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span>
 498     <span class="s">}</span>
 499   <span class="s">}</span>
 500 
 501   <span class="k">if</span> <span class="s">(</span><span class="k">wantarray</span><span class="s">)</span> <span class="s">{</span>
 502     <span class="c"># Retrieve all the modes...</span>
 503     <span class="k">my</span><span class="s">(</span><span class="i">@Modes</span><span class="cm">,</span> <span class="i">$Count</span><span class="s">)</span><span class="sc">;</span>
 504     <span class="i">@Modes</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 505     <span class="k">push</span> <span class="i">@Modes</span><span class="cm">,</span> <span class="i">$ModeValue</span><span class="sc">;</span>
 506     <span class="k">for</span> <span class="i">$Count</span> <span class="s">(</span><span class="i">@SortedCountList</span><span class="s">)</span> <span class="s">{</span>
 507       <span class="k">if</span> <span class="s">(</span><span class="i">$Count</span> == <span class="i">$ModeCount</span><span class="s">)</span> <span class="s">{</span>
 508       <span class="j">VALUE:</span> <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%ValueToCountMap</span><span class="s">)</span> <span class="s">{</span>
 509           <span class="k">if</span> <span class="s">(</span><span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>} == <span class="i">$ModeCount</span><span class="s">)</span> <span class="s">{</span>
 510             <span class="k">push</span> <span class="i">@Modes</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 511             <span class="c"># Set it to zero to skip it next time...</span>
 512             <span class="i">$ValueToCountMap</span>{<span class="i">$Value</span>} = <span class="n">0</span><span class="sc">;</span>
 513             <span class="k">last</span> <span class="j">VALUE</span><span class="sc">;</span>
 514           <span class="s">}</span>
 515         <span class="s">}</span>
 516       <span class="s">}</span>
 517     <span class="s">}</span>
 518     <span class="k">return</span> <span class="k">sort</span> <span class="s">{</span><span class="i">$b</span> &lt;=&gt; <span class="i">$a</span><span class="s">}</span> <span class="i">@Modes</span><span class="sc">;</span>
 519   <span class="s">}</span>
 520   <span class="k">else</span> <span class="s">{</span>
 521     <span class="k">return</span> <span class="i">$ModeValue</span><span class="sc">;</span>
 522   <span class="s">}</span>
 523 <span class="s">}</span>
 524 
 525 
 526 <span class="c"># Compute the Pearson correlation coefficient between two arrays of numbers:</span>
 527 <span class="c">#</span>
 528 <span class="c">#  SUM( (x[i] - Xmean)(y[i] - Ymean) ) / SQRT( SUM( (x[i] - Xmean)^2 )(SUM( (y[i] - Ymean)^2 ))   )</span>
 529 <span class="c">#</span>
 530 <span class="c"># It returns values in the range from -1.0 to 1.0</span>
<a name="PearsonCorrelation-"></a> 531 <span class="k">sub </span><span class="m">PearsonCorrelation</span> <span class="s">{</span>
 532   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$YArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 533 
 534   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@$XArrayRef</span> &amp;&amp; <span class="i">@$YArrayRef</span> &amp;&amp; <span class="s">(</span><span class="i">@$XArrayRef</span> == <span class="i">@$YArrayRef</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 535     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 536   <span class="s">}</span>
 537   <span class="k">my</span><span class="s">(</span><span class="i">$Correlation</span><span class="cm">,</span> <span class="i">$XMean</span><span class="cm">,</span> <span class="i">$YMean</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$XValueDeviation</span><span class="cm">,</span> <span class="i">$YValueDeviation</span><span class="cm">,</span> <span class="i">$SquareOfXDeviations</span><span class="cm">,</span> <span class="i">$SquareOfYDeviations</span><span class="cm">,</span> <span class="i">$ProductOfDeviations</span><span class="s">)</span><span class="sc">;</span>
 538 
 539   <span class="i">$Correlation</span> = <span class="n">0</span><span class="sc">;</span>
 540   <span class="i">$XMean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 541   <span class="i">$YMean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$YArrayRef</span><span class="s">)</span><span class="sc">;</span>
 542   <span class="i">$ProductOfDeviations</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$SquareOfXDeviations</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$SquareOfYDeviations</span> = <span class="n">0</span><span class="sc">;</span>
 543   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">@$XArrayRef</span>}<span class="s">)</span> <span class="s">{</span>
 544     <span class="i">$XValueDeviation</span> = <span class="i">$XArrayRef</span>-&gt;[<span class="i">$Index</span>] - <span class="i">$XMean</span><span class="sc">;</span>
 545     <span class="i">$YValueDeviation</span> = <span class="i">$YArrayRef</span>-&gt;[<span class="i">$Index</span>] - <span class="i">$YMean</span><span class="sc">;</span>
 546     <span class="i">$ProductOfDeviations</span> += <span class="s">(</span><span class="i">$XValueDeviation</span> * <span class="i">$YValueDeviation</span><span class="s">)</span><span class="sc">;</span>
 547     <span class="i">$SquareOfXDeviations</span> += <span class="i">$XValueDeviation</span> ** <span class="n">2</span><span class="sc">;</span>
 548     <span class="i">$SquareOfYDeviations</span> += <span class="i">$YValueDeviation</span> ** <span class="n">2</span><span class="sc">;</span>
 549   <span class="s">}</span>
 550   <span class="i">$Correlation</span> = <span class="i">$ProductOfDeviations</span> / <span class="k">sqrt</span><span class="s">(</span><span class="i">$SquareOfXDeviations</span> *  <span class="i">$SquareOfYDeviations</span><span class="s">)</span><span class="sc">;</span>
 551   <span class="k">return</span> <span class="i">$Correlation</span><span class="sc">;</span>
 552 <span class="s">}</span>
 553 
 554 <span class="c"># Return the smallest and largest values from an array of numbers</span>
<a name="Range-"></a> 555 <span class="k">sub </span><span class="m">Range</span> <span class="s">{</span>
 556   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 557 
 558   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 559     <span class="k">return</span> <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="k">undef</span><span class="s">)</span><span class="sc">;</span>
 560   <span class="s">}</span>
 561   <span class="k">my</span><span class="s">(</span><span class="i">$Smallest</span><span class="cm">,</span> <span class="i">$Largest</span><span class="cm">,</span> <span class="i">@SortedXArray</span><span class="s">)</span><span class="sc">;</span>
 562   <span class="i">@SortedXArray</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> &lt;=&gt; <span class="i">$b</span> <span class="s">}</span> <span class="i">@$XArrayRef</span><span class="sc">;</span>
 563   <span class="i">$Smallest</span> = <span class="i">$SortedXArray</span>[<span class="n">0</span>]<span class="sc">;</span>
 564   <span class="i">$Largest</span> = <span class="i">$SortedXArray</span>[<span class="i">$#SortedXArray</span>]<span class="sc">;</span>
 565   <span class="k">return</span> <span class="s">(</span><span class="i">$Smallest</span><span class="cm">,</span> <span class="i">$Largest</span><span class="s">)</span><span class="sc">;</span>
 566 <span class="s">}</span>
 567 
 568 <span class="c"># Compute square of the Pearson correlation coefficient between two arrays of numbers.</span>
 569 <span class="c">#</span>
<a name="RSquare-"></a> 570 <span class="k">sub </span><span class="m">RSquare</span> <span class="s">{</span>
 571   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$YArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 572   <span class="k">my</span><span class="s">(</span><span class="i">$RSquare</span><span class="cm">,</span> <span class="i">$Correlation</span><span class="s">)</span><span class="sc">;</span>
 573 
 574   <span class="i">$RSquare</span> = <span class="k">undef</span><span class="sc">;</span>
 575   <span class="i">$Correlation</span> = <span class="i">PearsonCorrelation</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$YArrayRef</span><span class="s">)</span><span class="sc">;</span>
 576   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$Correlation</span><span class="s">)</span> <span class="s">{</span>
 577     <span class="i">$RSquare</span> = <span class="i">$Correlation</span> ** <span class="n">2</span><span class="sc">;</span>
 578   <span class="s">}</span>
 579   <span class="k">return</span> <span class="i">$RSquare</span><span class="sc">;</span>
 580 <span class="s">}</span>
 581 
 582 <span class="c"># Compute the skewness of an array of numbers:</span>
 583 <span class="c">#  {n/(n - 1)(n - 2)} SUM{ ((x[i] - Xmean)/STDDEV)^3 }</span>
 584 <span class="c">#</span>
<a name="Skewness-"></a> 585 <span class="k">sub </span><span class="m">Skewness</span> <span class="s">{</span>
 586   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 587 
 588   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span> || <span class="s">(</span><span class="s">(</span><span class="i">@$XArrayRef</span> - <span class="n">2</span><span class="s">)</span> &lt;= <span class="n">0</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 589     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 590   <span class="s">}</span>
 591   <span class="k">my</span><span class="s">(</span><span class="i">$Skewness</span><span class="cm">,</span> <span class="i">$Mean</span><span class="cm">,</span> <span class="i">$StandardDeviation</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 592   <span class="i">$Mean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 593   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Mean</span><span class="s">)</span> <span class="s">{</span>
 594     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 595   <span class="s">}</span>
 596   <span class="i">$StandardDeviation</span> = <span class="i">StandardDeviation</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 597   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span> <span class="i">$StandardDeviation</span> &amp;&amp;  <span class="i">$StandardDeviation</span> != <span class="n">0</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 598     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 599   <span class="s">}</span>
 600 
 601   <span class="k">my</span><span class="s">(</span><span class="i">$SumOfScores</span><span class="cm">,</span> <span class="i">$SampleSize</span><span class="s">)</span><span class="sc">;</span>
 602   <span class="i">$SumOfScores</span> = <span class="n">0</span><span class="sc">;</span>
 603   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 604     <span class="i">$SumOfScores</span> += <span class="s">(</span><span class="s">(</span><span class="i">$Value</span> - <span class="i">$Mean</span><span class="s">)</span>/<span class="i">$StandardDeviation</span><span class="s">)</span> ** <span class="n">3</span><span class="sc">;</span>
 605   <span class="s">}</span>
 606   <span class="i">$SampleSize</span> = <span class="i">@$XArrayRef</span><span class="sc">;</span>
 607   <span class="i">$Skewness</span> = <span class="s">(</span><span class="i">$SampleSize</span>/<span class="s">(</span><span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">1</span><span class="s">)</span> * <span class="s">(</span><span class="i">$SampleSize</span> - <span class="n">2</span><span class="s">)</span> <span class="s">)</span><span class="s">)</span> * <span class="i">$SumOfScores</span><span class="sc">;</span>
 608   <span class="k">return</span> <span class="i">$Skewness</span><span class="sc">;</span>
 609 <span class="s">}</span>
 610 
 611 <span class="c"># Compute the standard deviation of an array of numbers</span>
<a name="StandardDeviation-"></a> 612 <span class="k">sub </span><span class="m">StandardDeviation</span> <span class="s">{</span>
 613   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 614   <span class="k">return</span> <span class="i">_CalculateStandardDeviation</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">2</span><span class="s">)</span><span class="sc">;</span>
 615 <span class="s">}</span>
 616 
 617 <span class="c"># Compute the standard deviation of an array of numbers representing entire population</span>
<a name="StandardDeviationN-"></a> 618 <span class="k">sub </span><span class="m">StandardDeviationN</span> <span class="s">{</span>
 619   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 620   <span class="k">return</span> <span class="i">_CalculateStandardDeviation</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 621 <span class="s">}</span>
 622 
 623 <span class="c"># Compute the standard deviation of an array of numbers.</span>
 624 <span class="c"># Mode 1: SQRT ( SUM( (x[i] - mean)^2 ) / n )</span>
 625 <span class="c"># Mode 2: SQRT ( SUM( (x[i] - mean)^2 ) / (n - 1) )</span>
 626 <span class="c">#</span>
<a name="_CalculateStandardDeviation-"></a> 627 <span class="k">sub </span><span class="m">_CalculateStandardDeviation</span> <span class="s">{</span>
 628   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 629 
 630   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 631     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 632   <span class="s">}</span>
 633   <span class="k">my</span><span class="s">(</span><span class="i">$StandardDeviation</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SquareOfDeviations</span><span class="cm">,</span> <span class="i">$Mean</span><span class="cm">,</span> <span class="i">$N</span><span class="s">)</span><span class="sc">;</span>
 634 
 635   <span class="i">$StandardDeviation</span> = <span class="n">0</span><span class="sc">;</span>
 636   <span class="i">$Mean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 637   <span class="i">$SquareOfDeviations</span> = <span class="n">0</span><span class="sc">;</span>
 638   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 639     <span class="i">$SquareOfDeviations</span> += <span class="s">(</span><span class="i">$Value</span> - <span class="i">$Mean</span><span class="s">)</span> ** <span class="n">2</span><span class="sc">;</span>
 640   <span class="s">}</span>
 641   <span class="i">$N</span> = <span class="s">(</span><span class="i">$Mode</span> == <span class="n">1</span><span class="s">)</span> ? <span class="i">@$XArrayRef</span> <span class="co">:</span> <span class="s">(</span><span class="i">@$XArrayRef</span> - <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 642   <span class="i">$StandardDeviation</span> =  <span class="k">sqrt</span><span class="s">(</span><span class="i">$SquareOfDeviations</span> / <span class="i">$N</span><span class="s">)</span><span class="sc">;</span>
 643 
 644   <span class="k">return</span> <span class="i">$StandardDeviation</span><span class="sc">;</span>
 645 <span class="s">}</span>
 646 
 647 <span class="c"># Compute the standard error using standard deviation and sample size</span>
<a name="StandardError-"></a> 648 <span class="k">sub </span><span class="m">StandardError</span> <span class="s">{</span>
 649   <span class="k">my</span><span class="s">(</span><span class="i">$StandardDeviation</span><span class="cm">,</span> <span class="i">$Count</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 650 
 651   <span class="k">if</span> <span class="s">(</span><span class="i">$Count</span> &lt;= <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 652     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 653   <span class="s">}</span>
 654   <span class="k">my</span><span class="s">(</span><span class="i">$StandardError</span><span class="s">)</span><span class="sc">;</span>
 655   <span class="i">$StandardError</span> = <span class="i">$StandardDeviation</span> / <span class="k">sqrt</span><span class="s">(</span><span class="i">$Count</span><span class="s">)</span><span class="sc">;</span>
 656 
 657   <span class="k">return</span> <span class="i">$StandardError</span><span class="sc">;</span>
 658 <span class="s">}</span>
 659 
 660 <span class="c"># Standardize the value using mean and standard deviation</span>
<a name="Standardize-"></a> 661 <span class="k">sub </span><span class="m">Standardize</span> <span class="s">{</span>
 662   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="cm">,</span> <span class="i">$Mean</span><span class="cm">,</span> <span class="i">$StandardDeviation</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 663 
 664   <span class="k">if</span> <span class="s">(</span><span class="i">$StandardDeviation</span> &lt;= <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 665     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 666   <span class="s">}</span>
 667   <span class="k">my</span><span class="s">(</span><span class="i">$StandardizedValue</span><span class="s">)</span><span class="sc">;</span>
 668   <span class="i">$StandardizedValue</span> = <span class="s">(</span><span class="i">$Value</span> - <span class="i">$Mean</span><span class="s">)</span>/<span class="i">$StandardDeviation</span><span class="sc">;</span>
 669 
 670   <span class="k">return</span> <span class="i">$StandardizedValue</span><span class="sc">;</span>
 671 <span class="s">}</span>
 672 
 673 <span class="c"># Compute the standard deviation above the mean for an array of numbers.</span>
<a name="StandardScores-"></a> 674 <span class="k">sub </span><span class="m">StandardScores</span> <span class="s">{</span>
 675   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 676   <span class="k">return</span> <span class="i">_CalculateStandardScores</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">2</span><span class="s">)</span><span class="sc">;</span>
 677 <span class="s">}</span>
 678 
 679 <span class="c"># Compute the standard deviation above the mean for an array of numbers representing entire population</span>
<a name="StandardScoresN-"></a> 680 <span class="k">sub </span><span class="m">StandardScoresN</span> <span class="s">{</span>
 681   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 682   <span class="k">return</span> <span class="i">_CalculateStandardScores</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 683 <span class="s">}</span>
 684 
 685 <span class="c"># Compute the standard deviation above the mean for an array of numbers.</span>
 686 <span class="c"># Mode 1:  (x[i] - mean) / n</span>
 687 <span class="c"># Mode 2:  (x[i] - mean) / (n - 1)</span>
 688 <span class="c">#</span>
<a name="_CalculateStandardScores-"></a> 689 <span class="k">sub </span><span class="m">_CalculateStandardScores</span> <span class="s">{</span>
 690   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 691 
 692   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 693     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 694   <span class="s">}</span>
 695   <span class="k">my</span><span class="s">(</span><span class="i">@StandardScores</span><span class="cm">,</span> <span class="i">$Mean</span><span class="cm">,</span> <span class="i">$StandardDeviation</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 696 
 697   <span class="i">$Mean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 698   <span class="i">$StandardDeviation</span> = <span class="i">_CalculateStandardDeviation</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span><span class="sc">;</span>
 699   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$StandardDeviation</span><span class="s">)</span> &amp;&amp; <span class="i">$StandardDeviation</span> &gt; <span class="n">0</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 700     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 701   <span class="s">}</span>
 702   <span class="i">@StandardScores</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 703   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 704     <span class="k">push</span> <span class="i">@StandardScores</span><span class="cm">,</span> <span class="s">(</span><span class="i">$Value</span> - <span class="i">$Mean</span><span class="s">)</span>/<span class="i">$StandardDeviation</span><span class="sc">;</span>
 705   <span class="s">}</span>
 706 
 707   <span class="k">return</span> <span class="i">@StandardScores</span><span class="sc">;</span>
 708 <span class="s">}</span>
 709 
 710 <span class="c"># Compute the product of an array of numbers</span>
<a name="Product-"></a> 711 <span class="k">sub </span><span class="m">Product</span> <span class="s">{</span>
 712   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 713 
 714   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 715     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 716   <span class="s">}</span>
 717   <span class="k">my</span><span class="s">(</span><span class="i">$Product</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 718   <span class="i">$Product</span> = <span class="n">1</span><span class="sc">;</span>
 719   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 720     <span class="i">$Product</span> *= <span class="i">$Value</span><span class="sc">;</span>
 721   <span class="s">}</span>
 722   <span class="k">return</span> <span class="i">$Product</span><span class="sc">;</span>
 723 <span class="s">}</span>
 724 
 725 <span class="c"># Compute the sum of an array of numbers</span>
<a name="Sum-"></a> 726 <span class="k">sub </span><span class="m">Sum</span> <span class="s">{</span>
 727   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 728 
 729   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 730     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 731   <span class="s">}</span>
 732   <span class="k">my</span><span class="s">(</span><span class="i">$Sum</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 733   <span class="i">$Sum</span> = <span class="n">0</span><span class="sc">;</span>
 734   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 735     <span class="i">$Sum</span> += <span class="i">$Value</span><span class="sc">;</span>
 736   <span class="s">}</span>
 737   <span class="k">return</span> <span class="i">$Sum</span><span class="sc">;</span>
 738 <span class="s">}</span>
 739 
 740 <span class="c"># Compute the sum of squares of an array of numbers</span>
<a name="SumOfSquares-"></a> 741 <span class="k">sub </span><span class="m">SumOfSquares</span> <span class="s">{</span>
 742   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 743 
 744   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 745     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 746   <span class="s">}</span>
 747   <span class="k">my</span><span class="s">(</span><span class="i">$SumOfSquares</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 748   <span class="i">$SumOfSquares</span> = <span class="n">0</span><span class="sc">;</span>
 749   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 750     <span class="i">$SumOfSquares</span> += <span class="i">$Value</span> ** <span class="n">2</span><span class="sc">;</span>
 751   <span class="s">}</span>
 752   <span class="k">return</span> <span class="i">$SumOfSquares</span><span class="sc">;</span>
 753 <span class="s">}</span>
 754 
 755 <span class="c"># Compute the mean of an array of numbers by excluding a fraction of</span>
 756 <span class="c"># numbers from the top and bottom of the data set.</span>
<a name="TrimMean-"></a> 757 <span class="k">sub </span><span class="m">TrimMean</span> <span class="s">{</span>
 758   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$FractionToExclude</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 759 
 760   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@$XArrayRef</span> &amp;&amp; <span class="i">$FractionToExclude</span> &gt; <span class="n">0</span> &amp;&amp; <span class="i">$FractionToExclude</span> &lt;= <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 761     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 762   <span class="s">}</span>
 763   <span class="k">my</span><span class="s">(</span><span class="i">$NumberToExclude</span><span class="s">)</span><span class="sc">;</span>
 764   <span class="i">$NumberToExclude</span> = <span class="k">int</span><span class="s">(</span><span class="i">@$XArrayRef</span> * <span class="i">$FractionToExclude</span><span class="s">)</span><span class="sc">;</span>
 765   <span class="i">$NumberToExclude</span> = <span class="s">(</span><span class="i">$NumberToExclude</span> % <span class="n">2</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumberToExclude</span> - <span class="n">1</span><span class="s">)</span> <span class="co">:</span> <span class="i">$NumberToExclude</span><span class="sc">;</span>
 766   <span class="k">if</span> <span class="s">(</span><span class="i">$NumberToExclude</span> == <span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 767     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 768   <span class="s">}</span>
 769   <span class="k">my</span><span class="s">(</span><span class="i">$Mean</span><span class="cm">,</span> <span class="i">$Sum</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$FirstIndex</span><span class="cm">,</span> <span class="i">$LastIndex</span><span class="s">)</span><span class="sc">;</span>
 770   <span class="i">$FirstIndex</span> = <span class="i">$NumberToExclude</span>/<span class="n">2</span><span class="sc">;</span>
 771   <span class="i">$LastIndex</span> = <span class="i">@$XArrayRef</span> - <span class="s">(</span><span class="i">$NumberToExclude</span>/<span class="n">2</span><span class="s">)</span> - <span class="n">1</span><span class="sc">;</span>
 772   <span class="i">$Sum</span> = <span class="n">0</span><span class="sc">;</span>
 773   <span class="k">my</span><span class="s">(</span><span class="i">@SortedXArray</span><span class="s">)</span><span class="sc">;</span>
 774   <span class="i">@SortedXArray</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> &lt;=&gt; <span class="i">$b</span> <span class="s">}</span> <span class="i">@$XArrayRef</span><span class="sc">;</span>
 775   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="i">$FirstIndex</span> .. <span class="i">$LastIndex</span><span class="s">)</span> <span class="s">{</span>
 776     <span class="i">$Sum</span> += <span class="i">$SortedXArray</span>[<span class="i">$Index</span>]<span class="sc">;</span>
 777   <span class="s">}</span>
 778   <span class="i">$Mean</span> = <span class="i">$Sum</span>/<span class="s">(</span><span class="i">@SortedXArray</span> - <span class="i">$NumberToExclude</span><span class="s">)</span><span class="sc">;</span>
 779   <span class="k">return</span> <span class="i">$Mean</span><span class="sc">;</span>
 780 <span class="s">}</span>
 781 
 782 <span class="c"># Compute the variance of an array of numbers</span>
<a name="Variance-"></a> 783 <span class="k">sub </span><span class="m">Variance</span> <span class="s">{</span>
 784   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 785   <span class="k">return</span> <span class="i">_CalculateVariance</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">2</span><span class="s">)</span><span class="sc">;</span>
 786 <span class="s">}</span>
 787 
 788 <span class="c"># Compute the variance of an array of numbers representing entire population</span>
<a name="VarianceN-"></a> 789 <span class="k">sub </span><span class="m">VarianceN</span> <span class="s">{</span>
 790   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 791   <span class="k">return</span> <span class="i">_CalculateVariance</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 792 <span class="s">}</span>
 793 
 794 <span class="c"># Compute the variance of an array of numbers:</span>
 795 <span class="c"># Mode 1: SUM( (x[i] - Xmean)^2  / n )</span>
 796 <span class="c"># Mode 2: SUM( (x[i] - Xmean)^2  / (n - 1) )</span>
 797 <span class="c">#</span>
<a name="_CalculateVariance-"></a> 798 <span class="k">sub </span><span class="m">_CalculateVariance</span> <span class="s">{</span>
 799   <span class="k">my</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 800 
 801   <span class="k">if</span> <span class="s">(</span>!<span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 802     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 803   <span class="s">}</span>
 804   <span class="k">my</span><span class="s">(</span><span class="i">$Variance</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SquareOfDeviations</span><span class="cm">,</span> <span class="i">$Mean</span><span class="cm">,</span> <span class="i">$N</span><span class="s">)</span><span class="sc">;</span>
 805 
 806   <span class="i">$Variance</span> = <span class="n">0</span><span class="sc">;</span>
 807   <span class="i">$Mean</span> = <span class="i">Mean</span><span class="s">(</span><span class="i">$XArrayRef</span><span class="s">)</span><span class="sc">;</span>
 808   <span class="i">$SquareOfDeviations</span> = <span class="n">0</span><span class="sc">;</span>
 809   <span class="k">foreach</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@$XArrayRef</span><span class="s">)</span> <span class="s">{</span>
 810     <span class="i">$SquareOfDeviations</span> += <span class="s">(</span><span class="i">$Value</span> - <span class="i">$Mean</span><span class="s">)</span> ** <span class="n">2</span><span class="sc">;</span>
 811   <span class="s">}</span>
 812   <span class="i">$N</span> = <span class="s">(</span><span class="i">$Mode</span> == <span class="n">1</span><span class="s">)</span> ? <span class="i">@$XArrayRef</span> <span class="co">:</span> <span class="s">(</span><span class="i">@$XArrayRef</span> - <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 813   <span class="i">$Variance</span> =  <span class="i">$SquareOfDeviations</span> / <span class="i">$N</span><span class="sc">;</span>
 814 
 815   <span class="k">return</span> <span class="i">$Variance</span><span class="sc">;</span>
 816 <span class="s">}</span>
 817 
<a name="EOF-"></a></pre>
<p>&nbsp;</p>
<br />
<center>
<img src="../../../images/h2o2.png">
</center>
</body>
</html>