35 #ifndef OPENMS_MATH_STATISTICS_QUADRATICREGRESSION_H
36 #define OPENMS_MATH_STATISTICS_QUADRATICREGRESSION_H
42 #include "Wm5Vector2.h"
43 #include "Wm5LinearSystem.h"
46 using Wm5::LinearSystem;
58 template <
typename Iterator>
59 void computeRegression(Iterator x_begin, Iterator x_end,
63 template <
typename Iterator>
64 void computeRegressionWeighted(
65 Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin);
68 double eval(
double x)
const;
73 double getChiSquared()
const;
85 template <
typename Iterator>
86 double computeChiSquareWeighted(
87 Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin,
88 double a,
double b,
double c)
90 double chi_squared = 0.0;
91 Iterator xIter = x_begin;
92 Iterator yIter = y_begin;
93 Iterator wIter = w_begin;
94 for (; xIter != x_end; ++xIter, ++yIter, ++wIter)
98 double weigth = *wIter;
99 chi_squared += weigth * std::pow(y - a - b * x - c * x * x, 2);
107 template <
typename Iterator>
110 std::vector<double> weights(std::distance(x_begin, x_end), 1);
111 computeRegressionWeighted<Iterator>(x_begin, x_end, y_begin, weights.begin());
114 template <
typename Iterator>
116 Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin)
123 int numPoints =
static_cast<Int>(points.size());
124 double sumX = 0, sumXX = 0, sumXXX = 0, sumXXXX = 0;
125 double sumY = 0, sumXY = 0, sumXXY = 0;
128 Iterator wIter = w_begin;
129 for (
int i = 0; i < numPoints; ++i, ++wIter)
132 double x = points[i].X();
133 double y = points[i].Y();
134 double weight = *wIter;
137 sumXX += weight * x * x;
138 sumXXX += weight * x * x * x;
139 sumXXXX += weight * x * x * x * x;
142 sumXY += weight * x * y;
143 sumXXY += weight * x * x * y;
151 {sumX, sumXX, sumXXX},
152 {sumXX, sumXXX, sumXXXX}
160 double X[3] = {0, 0, 0};
162 bool nonsingular = Wm5::LinearSystem<double>().Solve3(A, B, X);
168 chi_squared_ = computeChiSquareWeighted(x_begin, x_end, y_begin, w_begin,
a_,
b_,
c_);
172 throw Exception::UnableToFit(__FILE__, __LINE__, __PRETTY_FUNCTION__,
"UnableToFit-QuadraticRegression",
"Could not fit a linear model to the data");
179 #endif // OPENMS_MATH_STATISTICS_QUADRATICREGRESSION_H
double c_
Definition: QuadraticRegression.h:78
std::vector< Wm5::Vector2d > iteratorRange2Wm5Vectors(Iterator x_begin, Iterator x_end, Iterator y_begin)
Copies the distance(x_begin,x_end) elements starting at x_begin and y_begin into the Wm5::Vector...
Definition: RegressionUtils.h:45
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:47
Definition: QuadraticRegression.h:52
double chi_squared_
Definition: QuadraticRegression.h:79
double b_
Definition: QuadraticRegression.h:77
void computeRegression(Iterator x_begin, Iterator x_end, Iterator y_begin)
Definition: QuadraticRegression.h:108
double a_
Definition: QuadraticRegression.h:76
void computeRegressionWeighted(Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin)
Definition: QuadraticRegression.h:115
Exception used if an error occurred while fitting a model to a given dataset.
Definition: Exception.h:662
int Int
Signed integer type.
Definition: Types.h:96