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