42 #include "Wm5Vector2.h"
43 #include "Wm5ApprLineFit2.h"
44 #include "Wm5LinearSystem.h"
82 stand_dev_residuals_(0),
84 stand_error_slope_(0),
116 template <
typename Iterator>
117 void computeRegression(
double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin,
bool compute_goodness =
true);
141 template <
typename Iterator>
142 void computeRegressionWeighted(
double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin,
bool compute_goodness =
true);
145 double getIntercept()
const;
147 double getSlope()
const;
149 double getXIntercept()
const;
151 double getLower()
const;
153 double getUpper()
const;
155 double getTValue()
const;
157 double getRSquared()
const;
159 double getStandDevRes()
const;
161 double getMeanRes()
const;
163 double getStandErrSlope()
const;
165 double getChiSquared()
const;
167 double getRSD()
const;
198 void computeGoodness_(
const std::vector<Wm5::Vector2d>& points,
double confidence_interval_P);
201 template <
typename Iterator>
202 double computeChiSquare(Iterator x_begin, Iterator x_end, Iterator y_begin,
double slope,
double intercept);
205 template <
typename Iterator>
206 double computeWeightedChiSquare(Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin,
double slope,
double intercept);
221 double computePointY(
double x,
double slope,
double intercept)
223 return slope * x + intercept;
229 template <
typename Iterator>
232 double chi_squared = 0.0;
233 Iterator xIter = x_begin;
234 Iterator yIter = y_begin;
235 for (; xIter != x_end; ++xIter, ++yIter)
237 chi_squared += std::pow(*yIter - computePointY(*xIter, slope, intercept), 2);
244 template <
typename Iterator>
247 double chi_squared = 0.0;
248 Iterator xIter = x_begin;
249 Iterator yIter = y_begin;
250 Iterator wIter = w_begin;
251 for (; xIter != x_end; ++xIter, ++yIter, ++wIter)
253 chi_squared += *wIter * std::pow(*yIter - computePointY(*xIter, slope, intercept), 2);
259 template <
typename Iterator>
267 bool pass = Wm5::HeightLineFit2<double>(
static_cast<int>(points.size()), &points.front(),
slope_,
intercept_);
272 if (compute_goodness && points.size() > 2)
computeGoodness_(points, confidence_interval_P);
277 "UnableToFit-LinearRegression",
String(
"Could not fit a linear model to the data (") + points.size() +
" points).");
281 template <
typename Iterator>
290 int numPoints =
static_cast<int>(points.size());
291 double sumX = 0, sumY = 0;
292 double sumXX = 0, sumXY = 0;
294 Iterator wIter = w_begin;
296 for (
int i = 0; i < numPoints; ++i, ++wIter)
298 sumX += (*wIter) * points[i].X();
299 sumY += (*wIter) * points[i].Y();
300 sumXX += (*wIter) * points[i].X() * points[i].X();
301 sumXY += (*wIter) * points[i].X() * points[i].Y();
317 bool nonsingular = Wm5::LinearSystem<double>().Solve2(A, B, X);
327 if (compute_goodness && points.size() > 2)
computeGoodness_(points, confidence_interval_P);
332 "UnableToFit-LinearRegression",
"Could not fit a linear model to the data");