KSquare Utilities
StatisticalFunctions.h
Go to the documentation of this file.
1 /* StatisticalFunctions.h -- Basic Statistical Functions
2  * Copyright (C) 1994-2014 Kurt Kramer
3  * For conditions of distribution and use, see copyright notice in KKB.h
4  */
5 
6 #ifndef _KKU_STATISTICALFUNCTIONS_
7 #define _KKU_STATISTICALFUNCTIONS_
8 #include <math.h>
9 #include "KKBaseTypes.h"
10 
11 namespace KKB
12 {
13  template<typename T >
14  void CalcMeanAndStdDev (const vector<T>& v,
15  T& mean,
16  T& stdDev
17  )
18  {
19  typedef long double uld;
20 
21  if (v.size () < 1)
22  {
23  mean = T (0);
24  stdDev = T (0);
25  return;
26  }
27 
28  kkuint32 idx;
29  T total = T(0);
30 
31  for (idx = 0; idx < v.size (); idx++)
32  total = total + v[idx];
33 
34  mean = total / T (v.size ());
35 
36  uld deltaSqrTotal = 0.0;
37  uld deltaSquared = 0.0;
38  uld delta = 0.0;
39 
40 
41  for (idx = 0; idx < v.size (); idx++)
42  {
43  delta = (uld)fabs (mean - v[idx]);
46  }
47 
48  uld varience = deltaSqrTotal / (uld)(v.size ());
49 
50  stdDev = (T)sqrt (varience);
51 
52  return;
53  } /* CalcMeanAndStdDev */
54 
55 
56 
57  template<typename T >
58  void CalcVectorStats (const vector<T>& v,
59  T& total,
60  T& mean,
61  T& stdDev,
62  T& min,
63  T& max
64  )
65  {
66  typedef long double uld;
67 
68  total = 0;
69 
70  if (v.size () < 1)
71  {
72  mean = T (0);
73  stdDev = T (0);
74  min = 0.0;
75  max = 0.0;
76  return;
77  }
78 
79  kkuint32 idx;
80  total = T(0);
81 
82  min = max = v[0];
83 
84  for (idx = 0; idx < v.size (); idx++)
85  {
86  total = total + v[idx];
87  if (v[idx] < min) min = v[idx];
88  if (v[idx] > max) max = v[idx];
89  }
90 
91  mean = total / T (v.size ());
92 
93  uld deltaSqrTotal = 0.0;
94  uld deltaSquared = 0.0;
95  uld delta = 0.0;
96 
97  for (idx = 0; idx < v.size (); idx++)
98  {
99  delta = (uld)fabs (mean - v[idx]);
102  }
103 
104  uld varience = deltaSqrTotal / (uld)(v.size ());
105 
106  stdDev = (T)sqrt (varience);
107 
108  return;
109  } /* CalcMeanAndStdDev */
110 
111 
112  // Quadrat-Valance Methods, page 44
113  template<typename T >
114  T CalcBQV (const vector<T>& v,
115  kkint32 blockSize
116  )
117  {
118  //typedef long double uld;
119 
120  kkint32 zed = 0;
121  kkint32 x = 0;
122 
123  double totalSquare = (T)0.0;
124 
125  double divisorFactor = 1.0 / pow(2.0, blockSize);
126 
127  while (zed < (kkint32)(v.size () - 2 * blockSize))
128  {
129  T plusSide = (T)0.0;
130  T minusSide = (T)0.0;
131 
132  double delta = 0.0;
133 
134  for (x = 0; x < blockSize; x++)
135  {
136  delta += v[zed];
137  zed++;
138  }
139 
140  for (x = 0; x < blockSize; x++)
141  {
142  delta -= v[zed];
143  zed++;
144  }
145 
146  double deltaSquared = delta * delta;
147 
148 
150  }
151 
152 
153  double result = pow (2.0, blockSize) * totalSquare / zed;
154 
155  return (T)result;
156  } /* CalcBQV */
157 
158 
159 
160 
161 
162  // Quadrat-Valance Methods, page 44
163  template<typename T >
164  T CalcPQV (const vector<T>& v,
165  kkint32 distance
166  )
167  {
168  //typedef long double uld;
169 
170  kkint32 x = 0;
171  kkint32 y = x + distance;
172 
173  double totalDeltaSquared = 0.0;
174 
175  while (y < (kkint32)v.size ())
176  {
177  T delta = v[x] - v[y];
178  double deltaSquared = delta * delta;
180 
181  x++;
182  y++;
183  }
184 
185  double result = totalDeltaSquared / (2 * (v.size () - distance));
186 
187  return (T)result;
188  } /* CalcPQV */
189 
190 
191 
192 
193 
194  // Quadrat-Valance Methods, page 113
195  template<typename T >
196  T CalcTTLQC (const vector<T>& v,
197  kkint32 b
198  )
199  {
200  kkint32 i = 0;
201  kkint32 n = (kkint32)v.size ();
202 
203  double squareSun = 0.0;
204 
205  vector<T> sumArray (v.size (), (T)0.0);
206  sumArray[0] = v[0];
207  for (i = 1; i < n; i++)
208  sumArray[i] = sumArray[i - 1] + v[i];
209 
210  kkint32 end = n + 1 - (2 * b);
211 
212  for (i = 0; i < end; i++)
213  {
214  T plusSide = sumArray[i + b - 1];
215  T minusSide = sumArray[i + b + b - 1] - sumArray[i + b - 1];
217  double deltaSquared = delta * delta;
219  }
220 
221  double divisor = 2.0 * (double)b * ((double)n + 1.0 - 2.0 * (double)b);
222 
223  double result = squareSun / divisor;
224 
225  return (T)result;
226  } /* CalcTTLQC */
227 
228 
229 
230 
231 
232 
233  // Quadrat-Valance Methods, page 113
234  template<typename T >
235  T Calc3TTLQC (const vector<T>& v,
236  kkint32 b
237  )
238  {
239  kkint32 i = 0;
240  kkint32 n = (kkint32)v.size ();
241 
242  double squareSun = 0.0;
243 
244  vector<T> sumArray (v.size (), (T)0.0);
245  sumArray[0] = v[0];
246  for (i = 1; i < n; i++)
247  sumArray[i] = sumArray[i - 1] + v[i];
248 
249  kkint32 end = n + 1 - (3 * b);
250 
251  for (i = 0; i < end; i++)
252  {
253  T plusSide = sumArray[i + b - 1];
254  T minusSide = 2 * sumArray[i + b + b - 1];
255  T plusSide2 = sumArray[i + 2 * b];
256 
258  double deltaSquared = delta * delta;
260  }
261 
262  double divisor = 8.0 * (double)b * ((double)n + 1.0 - 3.0 * (double)b);
263 
264  double result = squareSun / divisor;
265 
266  return (T)result;
267  } /* Calc3TTLQC */
268 
269 
270 
271  // As defined by Andrew Remsen
272  // also look at http://www.pmel.noaa.gov/pubs/outstand/stab1646/statistics.shtml
273  float LLoydsIndexOfPatchiness (const KKB::VectorInt& bins);
274 
275 
276 
277 
278 
279  float McNemarsTest (kkint32 size,
280  const bool* classedCorrectly1,
281  const bool* classedCorrectly2
282  );
283 
284 
285  float PairedTTest (const KKB::VectorFloat& set1,
286  const KKB::VectorFloat& set2
287  );
288 
289 }
290 
291 #endif
T CalcTTLQC(const vector< T > &v, kkint32 b)
__int32 kkint32
Definition: KKBaseTypes.h:88
float McNemarsTest(kkint32 size, const bool *classedCorrectly1, const bool *classedCorrectly2)
std::vector< int > VectorInt
Definition: KKBaseTypes.h:138
T Calc3TTLQC(const vector< T > &v, kkint32 b)
T CalcBQV(const vector< T > &v, kkint32 blockSize)
KKTHread * KKTHreadPtr
std::vector< float > VectorFloat
Definition: KKBaseTypes.h:149
void CalcMeanAndStdDev(const vector< T > &v, T &mean, T &stdDev)
float PairedTTest(const KKB::VectorFloat &set1, const KKB::VectorFloat &set2)
float LLoydsIndexOfPatchiness(const KKB::VectorInt &bins)
T CalcPQV(const vector< T > &v, kkint32 distance)
void CalcVectorStats(const vector< T > &v, T &total, T &mean, T &stdDev, T &min, T &max)