USGS

Isis 3.0 Object Programmers' Reference

Home

MultivariateStatistics.cpp
Go to the documentation of this file.
1 
24 #include <float.h>
25 #include <string>
26 #include <iostream>
27 #include "MultivariateStatistics.h"
28 #include "IException.h"
29 
30 
31 namespace Isis {
37  Reset();
38  }
39 
42  p_x.Reset();
43  p_y.Reset();
44  p_sumxy = 0.0;
45 
46  p_validPixels = 0;
47  p_invalidPixels = 0;
48  p_totalPixels = 0;
49  }
50 
62  void MultivariateStatistics::AddData(const double *x, const double *y,
63  const unsigned int count) {
64  for(unsigned int i = 0; i < count; i++) {
65  double yVal = y[i];
66  double xVal = x[i];
67  p_totalPixels++;
68 
69  if(Isis::IsValidPixel(xVal) && Isis::IsValidPixel(yVal)) {
70  p_x.AddData(xVal);
71  p_y.AddData(yVal);
72  p_sumxy += xVal * yVal;
73  p_validPixels++;
74  }
75  else {
77  }
78  }
79  }
80 
89  void MultivariateStatistics::AddData(double x, double y, unsigned int count) {
90  p_totalPixels += count;
91 
92  if(IsValidPixel(x) && IsValidPixel(y)) {
93  p_sumxy += x * y * count;
94  p_validPixels += count;
95 
96  for (unsigned int i = 0; i < count; i++) {
97  p_x.AddData(x);
98  p_y.AddData(y);
99  }
100  }
101  else {
102  p_invalidPixels += count;
103  }
104  }
105 
118  void MultivariateStatistics::RemoveData(const double *x, const double *y,
119  const unsigned int count) {
120  for(unsigned int i = 0; i < count; i++) {
121  p_totalPixels--;
122 
123  if(Isis::IsValidPixel(x[i]) && Isis::IsValidPixel(y[i])) {
124  p_x.RemoveData(&x[i], 1);
125  p_y.RemoveData(&y[i], 1);
126  p_sumxy -= x[i] * y[i];
127  p_validPixels--;
128  }
129  else {
130  p_invalidPixels--;
131  }
132  }
133 
134  if(p_totalPixels < 0) {
135  std::string m = "You are removing non-existant data in [MultivariateStatistics::RemoveData]";
137  }
138  }
139 
147  if(p_validPixels <= 1) return Isis::NULL8;
148  double covar = p_sumxy - p_y.Average() * p_x.Sum() - p_x.Average() * p_y.Sum() +
149  p_x.Average() * p_y.Average() * (double)p_validPixels;
150  return covar / (double)(p_validPixels - 1);
151  }
152 
164 
165  if(p_validPixels <= 1) return Isis::NULL8;
166  double covar = Covariance();
167  double stdX = p_x.StandardDeviation();
168  double stdY = p_y.StandardDeviation();
169  if(stdX == 0.0 || stdX == Isis::NULL8) return Isis::NULL8;
170  if(stdY == 0.0 || stdY == Isis::NULL8) return Isis::NULL8;
171  if(covar == Isis::NULL8) return Isis::NULL8;
172  return covar / (stdX * stdY);
173  }
174 
181  return p_totalPixels;
182  }
183 
192  return p_validPixels;
193  }
194 
201  return p_invalidPixels;
202  }
203 
210  void MultivariateStatistics::LinearRegression(double &a, double &b) const {
211  // From Modern Elementary Statistics - 5th edition, Freund, pp 367
212  double denom = (double)p_validPixels * p_x.SumSquare() - p_x.Sum() * p_x.Sum();
213  if(denom == 0.0) {
214  std::string msg = "Unable to compute linear regression in Multivariate Statistics";
216  }
217  a = p_y.Sum() * p_x.SumSquare() - p_x.Sum() * p_sumxy;
218  a = a / denom;
219 
220  b = (double)p_validPixels * p_sumxy - p_x.Sum() * p_y.Sum();
221  b = b / denom;
222  }
223 
230  return p_sumxy;
231  }
232 
239  return p_x;
240  };
241 
248  return p_y;
249  };
250 }
251