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);
}
}