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.average(); 00081 } 00082 00083 double osl::stat::TwoDimensionalStatistics:: 00084 averageY() const 00085 { 00086 return m_data->m_y.average(); 00087 } 00088 00089 double osl::stat::TwoDimensionalStatistics:: 00090 averageX2() const 00091 { 00092 return m_data->m_x2.average(); 00093 } 00094 00095 double osl::stat::TwoDimensionalStatistics:: 00096 averageY2() const 00097 { 00098 return m_data->m_y2.average(); 00099 } 00100 00101 double osl::stat::TwoDimensionalStatistics:: 00102 averageXY() const 00103 { 00104 return m_data->m_xy.average(); 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: