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