diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mayachemtools/docs/modules/html/code/StatisticsUtil.html	Wed Jan 20 11:55:01 2016 -0500
@@ -0,0 +1,838 @@
+<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>