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>
|