00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef OPENMS_MATH_STATISTICS_LINEARREGRESSION_H
00036 #define OPENMS_MATH_STATISTICS_LINEARREGRESSION_H
00037
00038 #include <OpenMS/CONCEPT/Types.h>
00039 #include <OpenMS/CONCEPT/Exception.h>
00040
00041 #include <iostream>
00042 #include <vector>
00043 #include <gsl/gsl_fit.h>
00044 #include <gsl/gsl_statistics.h>
00045 #include <gsl/gsl_cdf.h>
00046
00047 namespace OpenMS
00048 {
00049 namespace Math
00050 {
00069 class OPENMS_DLLAPI LinearRegression
00070 {
00071 public:
00072
00074 LinearRegression() :
00075 intercept_(0),
00076 slope_(0),
00077 x_intercept_(0),
00078 lower_(0),
00079 upper_(0),
00080 t_star_(0),
00081 r_squared_(0),
00082 stand_dev_residuals_(0),
00083 mean_residuals_(0),
00084 stand_error_slope_(0),
00085 chi_squared_(0),
00086 rsd_(0)
00087 {
00088 }
00089
00091 virtual ~LinearRegression()
00092 {
00093 }
00094
00111 template <typename Iterator>
00112 void computeRegression(double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin);
00113
00129 template <typename Iterator>
00130 void computeRegressionNoIntercept(double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin);
00131
00148 template <typename Iterator>
00149 void computeRegressionWeighted(double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin);
00150
00151
00153 DoubleReal getIntercept() const;
00155 DoubleReal getSlope() const;
00157 DoubleReal getXIntercept() const;
00159 DoubleReal getLower() const;
00161 DoubleReal getUpper() const;
00163 DoubleReal getTValue() const;
00165 DoubleReal getRSquared() const;
00167 DoubleReal getStandDevRes() const;
00169 DoubleReal getMeanRes() const;
00171 DoubleReal getStandErrSlope() const;
00173 DoubleReal getChiSquared() const;
00175 DoubleReal getRSD() const;
00176
00177 protected:
00178
00180 double intercept_;
00182 double slope_;
00184 double x_intercept_;
00186 double lower_;
00188 double upper_;
00190 double t_star_;
00192 double r_squared_;
00194 double stand_dev_residuals_;
00196 double mean_residuals_;
00198 double stand_error_slope_;
00200 double chi_squared_;
00202 double rsd_;
00203
00204
00206 void computeGoodness_(double * X, double * Y, int N, double confidence_interval_P);
00207
00209 template <typename Iterator>
00210 void iteratorRange2Arrays_(Iterator x_begin, Iterator x_end, Iterator y_begin, double * x_array, double * y_array);
00211
00213 template <typename Iterator>
00214 void iteratorRange3Arrays_(Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin, double * x_array, double * y_array, double * w_array);
00215
00216 private:
00217
00219 LinearRegression(const LinearRegression & arg);
00221 LinearRegression & operator=(const LinearRegression & arg);
00222 };
00223
00224 template <typename Iterator>
00225 void LinearRegression::computeRegression(double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin)
00226 {
00227 int N = int(distance(x_begin, x_end));
00228
00229 double * X = new double[N];
00230 double * Y = new double[N];
00231 iteratorRange2Arrays_(x_begin, x_end, y_begin, X, Y);
00232
00233 double cov00, cov01, cov11;
00234
00235
00236
00237
00238 int error = gsl_fit_linear(X, 1, Y, 1, N, &intercept_, &slope_, &cov00, &cov01, &cov11, &chi_squared_);
00239
00240 if (!error)
00241 {
00242 computeGoodness_(X, Y, N, confidence_interval_P);
00243 }
00244
00245 delete[] X;
00246 delete[] Y;
00247
00248 if (error)
00249 {
00250 throw Exception::UnableToFit(__FILE__, __LINE__, __PRETTY_FUNCTION__, "UnableToFit-LinearRegression", "Could not fit a linear model to the data");
00251 }
00252 }
00253
00254 template <typename Iterator>
00255 void LinearRegression::computeRegressionNoIntercept(double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin)
00256 {
00257 int N = int(distance(x_begin, x_end));
00258
00259 double * X = new double[N];
00260 double * Y = new double[N];
00261 iteratorRange2Arrays_(x_begin, x_end, y_begin, X, Y);
00262
00263 double cov;
00264
00265
00266
00267
00268 int error = gsl_fit_mul(X, 1, Y, 1, N, &slope_, &cov, &chi_squared_);
00269 intercept_ = 0.0;
00270
00271 if (!error)
00272 {
00273 computeGoodness_(X, Y, N, confidence_interval_P);
00274 }
00275
00276 delete[] X;
00277 delete[] Y;
00278
00279 if (error)
00280 {
00281 throw Exception::UnableToFit(__FILE__, __LINE__, __PRETTY_FUNCTION__, "UnableToFit-LinearRegression", "Could not fit a linear model to the data");
00282 }
00283 }
00284
00285 template <typename Iterator>
00286 void LinearRegression::computeRegressionWeighted(double confidence_interval_P, Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin)
00287 {
00288 int N = int(distance(x_begin, x_end));
00289
00290 double * X = new double[N];
00291 double * Y = new double[N];
00292 double * W = new double[N];
00293 iteratorRange3Arrays_(x_begin, x_end, y_begin, w_begin, X, Y, W);
00294
00295 double cov00, cov01, cov11;
00296
00297
00298
00299
00300 int error = gsl_fit_wlinear(X, 1, W, 1, Y, 1, N, &intercept_, &slope_, &cov00, &cov01, &cov11, &chi_squared_);
00301
00302 if (!error)
00303 {
00304 computeGoodness_(X, Y, N, confidence_interval_P);
00305 }
00306
00307 delete[] X;
00308 delete[] Y;
00309 delete[] W;
00310
00311 if (error)
00312 {
00313 throw Exception::UnableToFit(__FILE__, __LINE__, __PRETTY_FUNCTION__, "UnableToFit-LinearRegression", "Could not fit a linear model to the data");
00314 }
00315 }
00316
00317 template <typename Iterator>
00318 void LinearRegression::iteratorRange2Arrays_(Iterator x_begin, Iterator x_end, Iterator y_begin, double * x_array, double * y_array)
00319 {
00320 int i = 0;
00321 while (x_begin < x_end)
00322 {
00323 x_array[i] = *x_begin;
00324 y_array[i] = *y_begin;
00325 ++x_begin;
00326 ++y_begin;
00327 ++i;
00328 }
00329 }
00330
00331 template <typename Iterator>
00332 void LinearRegression::iteratorRange3Arrays_(Iterator x_begin, Iterator x_end, Iterator y_begin, Iterator w_begin, double * x_array, double * y_array, double * w_array)
00333 {
00334 int i = 0;
00335 while (x_begin < x_end)
00336 {
00337 x_array[i] = *x_begin;
00338 y_array[i] = *y_begin;
00339 w_array[i] = *w_begin;
00340 ++x_begin;
00341 ++y_begin;
00342 ++w_begin;
00343 ++i;
00344 }
00345 }
00346
00347 }
00348 }
00349
00350
00351 #endif