Brief description of class still missing. More...
#include <LinearRegression.h>
Public Member Functions | |
double | a () const |
void | add (double x, double y) |
double | at (double x) const |
double | b () const |
int | badValue (double deviation) const |
bool | calculate () |
unsigned int | count () const |
LinearRegression () | |
void | remove (int i) |
void | reset () |
float | stddev () const |
Brief description of class still missing.
Full description of class still missing
GpCoreTools::LinearRegression::LinearRegression | ( | ) | [inline] |
{reset();}
double GpCoreTools::LinearRegression::a | ( | ) | const [inline] |
Referenced by PPSBuffer::bytesAvailable().
{return _a;}
void GpCoreTools::LinearRegression::add | ( | double | x, |
double | y | ||
) |
Referenced by PPSBuffer::bytesAvailable().
{ if(_values.size()==0) { // Avoid big numbers on x _x0=x; x=0.0; } else { x-=_x0; } _sumX+=x; _sumY+=y; _sumXY+=x*y; _sumX2+=x*x; _values.push_back(std::pair<double, double>(x, y)); }
double GpCoreTools::LinearRegression::at | ( | double | x | ) | const [inline] |
Referenced by PPSBuffer::bytesAvailable().
{return _a*(x-_x0)+_b;}
double GpCoreTools::LinearRegression::b | ( | ) | const [inline] |
Referenced by PPSBuffer::bytesAvailable().
{return _b;}
int GpCoreTools::LinearRegression::badValue | ( | double | deviation | ) | const |
Never returns an index greater that half of the size. It avoids rejecting values that have been just added.
Referenced by PPSBuffer::bytesAvailable().
{ int n=_values.size() >> 1; for(int i=0; i<n; i++) { const std::pair<double, double>& v=_values[i]; double y=_a*v.first+_b; // Already corrected by x0 if(fabs(y-v.second)>deviation) { return i; } } return -1; }
Computes a and b. Returns false if line is vertical. In this case, equation is x=b.
Referenced by PPSBuffer::bytesAvailable().
{ double invn=1.0/_values.size(); double denom=_sumX2-invn*_sumX*_sumX; if(denom!=0.0) { _a=(_sumXY-invn*_sumY*_sumX)/denom; _b=(invn*_sumY*_sumX2-invn*_sumXY*_sumX)/denom; return true; } else { _a=0.0; _b=_sumX*invn; return false; } }
unsigned int GpCoreTools::LinearRegression::count | ( | ) | const [inline] |
Referenced by PPSBuffer::bytesAvailable().
{return _values.size();}
void GpCoreTools::LinearRegression::remove | ( | int | i | ) |
Referenced by PPSBuffer::bytesAvailable().
{ unsigned int n=_values.size(); std::pair<double, double>& v=_values[i]; double x=v.first; double y=v.second; _sumX-=x; _sumY-=y; _sumXY-=x*y; _sumX2-=x*x; v=_values[n-1]; _values.resize(n-1); }
void GpCoreTools::LinearRegression::reset | ( | ) |
Referenced by PPSBuffer::bytesAvailable().
{ _sumX=0.0; _sumY=0.0; _sumXY=0.0; _sumX2=0.0; _a=0.0; _b=0.0; _values.clear(); }
float GpCoreTools::LinearRegression::stddev | ( | ) | const |
Return the standard deviation around regression line. A and B must be computed.
References QGpCoreTools::sqrt().
Referenced by PPSBuffer::bytesAvailable().
{ double sum=0; double sum2=0; std::vector<std::pair<double, double> >::const_iterator it; for(it=_values.begin(); it!=_values.end(); it++) { double y=_a*it->first+_b; // Already corrected by x0 double dy=y-it->second; sum+=dy; sum2+=dy*dy; } double n=_values.size(); double mean=sum/n; double stddev=(sum2-mean*mean*n)/(n-1); if(stddev<0.0) { return 0.0; } else { return sqrt(stddev); } }