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