twoDimensionalStatistics.cc
Go to the documentation of this file.
00001 /* TwoDimensionalStatistics.cc
00002  */
00003 #include "osl/stat/twoDimensionalStatistics.h"
00004 #include "osl/stat/average.h"
00005 #include <cmath>
00006 
00007 class osl::stat::TwoDimensionalStatistics::Data 
00008 {
00009 public:
00010   Average m_x, m_y, m_x2, m_y2, m_xy;
00011 
00012   // MANIPULATORS
00013   void add(const double& x, const double& y) 
00014   {
00015     m_x.add(x);
00016     m_y.add(y);
00017     m_x2.add(x*x);
00018     m_y2.add(y*y);
00019     m_xy.add(x*y);
00020   }
00021   void merge(const Data& r)
00022   {
00023     m_x.merge(r.m_x);
00024     m_y.merge(r.m_y);
00025     m_x2.merge(r.m_x2);
00026     m_y2.merge(r.m_y2);
00027     m_xy.merge(r.m_xy);
00028   }
00029   void clear()
00030   {
00031     m_x.clear();
00032     m_y.clear();
00033     m_x2.clear();
00034     m_y2.clear();
00035     m_xy.clear();
00036   }
00037 };
00038 
00039 // CREATORS
00040 osl::stat::TwoDimensionalStatistics::
00041 TwoDimensionalStatistics() : m_data(new Data())
00042 {
00043 }
00044 
00045 osl::stat::TwoDimensionalStatistics::
00046 ~TwoDimensionalStatistics()
00047 {
00048 }
00049 
00050 // MANIPULATORS
00051 void osl::stat::TwoDimensionalStatistics::
00052 add(const double& x, const double& y)
00053 {
00054   m_data->add(x,y);
00055 }
00056 
00057 void osl::stat::TwoDimensionalStatistics::
00058 merge(const TwoDimensionalStatistics& r)
00059 {
00060   m_data->merge(*r.m_data);
00061 }
00062 
00063 void osl::stat::TwoDimensionalStatistics::
00064 clear()
00065 {
00066   m_data->clear();
00067 }
00068 
00069 
00070 // ACCESSORS
00071 size_t osl::stat::TwoDimensionalStatistics::
00072 size() const
00073 {
00074   return m_data->m_x.numElements();
00075 }
00076 
00077 double osl::stat::TwoDimensionalStatistics::
00078 averageX() const
00079 {
00080   return m_data->m_x.getAverage();
00081 }
00082 
00083 double osl::stat::TwoDimensionalStatistics::
00084 averageY() const
00085 {
00086   return m_data->m_y.getAverage();
00087 }
00088 
00089 double osl::stat::TwoDimensionalStatistics::
00090 averageX2() const
00091 {
00092   return m_data->m_x2.getAverage();
00093 }
00094 
00095 double osl::stat::TwoDimensionalStatistics::
00096 averageY2() const
00097 {
00098   return m_data->m_y2.getAverage();
00099 }
00100 
00101 double osl::stat::TwoDimensionalStatistics::
00102 averageXY() const
00103 {
00104   return m_data->m_xy.getAverage();
00105 }
00106 
00107 double osl::stat::TwoDimensionalStatistics::
00108 meanSquaredErrors() const
00109 {
00110   return averageX2() - 2*averageXY() + averageY2();
00111 }
00112 
00113 double osl::stat::TwoDimensionalStatistics::
00114 meanSquaredErrorsAdjustConstant() const
00115 {
00116   return averageX2() - averageX()*averageX()
00117     -2*(averageXY() - averageX()*averageY())
00118     + averageY2() - averageY()*averageY();
00119 }
00120 
00121 double osl::stat::TwoDimensionalStatistics::
00122 correlation() const
00123 {
00124   return (averageXY() - averageX()*averageY())
00125     / sqrt((averageX2() - averageX()*averageX())
00126            * (averageY2() - averageY()*averageY()));
00127 }
00128 
00129 void osl::stat::TwoDimensionalStatistics::
00130 fitting(double &a, double &b, double &residual) const
00131 {
00132   double d = averageX2() - averageX()*averageX();
00133   double n = averageXY() - averageX()*averageY();
00134   if (std::abs(d) < 1e-8) {
00135     a = 0.0;
00136     b = averageY();
00137     residual = averageY2() - averageY()*averageY();
00138     return;
00139   }
00140   a = n / d;
00141   b = (averageX2()*averageY() - averageXY()*averageX()) / d;
00142   residual = averageY2()-averageY()*averageY()
00143     - n * n / d;
00144 }
00145 
00146 /* ------------------------------------------------------------------------- */
00147 // ;;; Local Variables:
00148 // ;;; mode:c++
00149 // ;;; c-basic-offset:2
00150 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines