/*3:*/ #line 100 "statlib.w" #ifndef STATLIB_HEADER_DEFINES #define STATLIB_HEADER_DEFINES #include #include #include #include #include #include #include #include using namespace std; /*6:*/ #line 184 "statlib.w" class probabilityDistribution{ private: virtual string distributionName(void)= 0; public: static double Q_from_P(double x){ return 1-x; } static double P_from_Q(double x){ return 1-x; } virtual double mean(void)= 0; virtual double stdev(void)= 0; double variance(void){ return stdev()*stdev(); } virtual double skewness(void)= 0; virtual double kurtosisExcess(void)= 0; double kurtosis(void){ return kurtosisExcess()+3; } virtual double CDF_P(double x)= 0; double CDF_Q(double x){ return Q_from_P(CDF_P(x)); } virtual void writeParameters(ostream&of){ of<<"Distribution: "< class dataTable:public vector { public: double mean(void); double geometricMean(void); double harmonicMean(void); double median(void); double RMS(void); T mode(void); double percentile(double k); double quartile(int q) { assert(q>=1&&q<=3); return percentile(0.25*q); } double variance(void); double varianceMLE(void) { return(variance()*(this->size()-1))/this->size(); } double stdev(void) { return sqrt(variance()); } double stdevMLE(void) { return sqrt(varianceMLE()); } double centralMoment(int k); double skewness(void); double kurtosis(void); }; /*:37*//*38:*/ #line 1813 "statlib.w" template double dataTable ::mean(void) { typename dataTable ::iterator p; double m= 0; for(p= this->begin();p!=this->end();p++){ m+= *p; } return m/this->size(); } /*:38*//*39:*/ #line 1832 "statlib.w" template double dataTable ::geometricMean(void) { typename dataTable ::iterator p; double g= 1,ni= 1.0/this->size(); for(p= this->begin();p!=this->end();p++){ g*= pow(*p,ni); } return g; } /*:39*//*40:*/ #line 1851 "statlib.w" template double dataTable ::harmonicMean(void) { typename dataTable ::iterator p; double d= 0; for(p= this->begin();p!=this->end();p++){ d+= 1.0/(*p); } return this->size()/d; } /*:40*//*41:*/ #line 1870 "statlib.w" template double dataTable ::RMS(void) { typename dataTable ::iterator p; double sum= 0; for(p= this->begin();p!=this->end();p++){ sum+= (*p)*(*p); } return sqrt(sum/this->size()); } /*:41*//*42:*/ #line 1894 "statlib.w" template double dataTable ::median(void) { dataTable v(*this); sort(v.begin(),v.end()); if(v.size()&1){ return(double)v[(v.size()+1)/2]; }else{ return(double)((v[(v.size()/2)-1]+v[v.size()/2])/2.0); } } /*:42*//*43:*/ #line 1923 "statlib.w" template T dataTable ::mode(void) { dataTable v(*this); T cmode,bmode= 0; int n= 0,most= 0; typename dataTable ::iterator p; sort(v.begin(),v.end()); p= v.begin(); cmode= *p++; while(p!=v.end()){ T cval= *p++; if(cval==cmode){ n++; }else{ if(n> most){ most= n; bmode= cmode; } n= 1; cmode= cval; } } if(n> most){ most= n; bmode= cmode; } return bmode; } /*:43*//*44:*/ #line 1963 "statlib.w" template double dataTable ::percentile(double k) { dataTable v(*this); double index,result; int i; assert(k>=0&&k<=1); sort(v.begin(),v.end()); index= v.size()*k; if(index!=floor(index)){ i= ((int)index); result= v[i]; }else{ i= ((int)index)-1; result= (v[i]+v[i+1])/2.0; } return result; } /*:44*//*45:*/ #line 1994 "statlib.w" template double dataTable ::variance(void) { typename dataTable ::iterator p; double mu= mean(),sum= 0; for(p= this->begin();p!=this->end();p++){ double t= ((*p)-mu); sum+= t*t; } return sum/(this->size()-1); } /*:45*//*46:*/ #line 2016 "statlib.w" template double dataTable ::centralMoment(int k) { typename dataTable ::iterator p; double mu= mean(),sum= 0; for(p= this->begin();p!=this->end();p++){ sum+= pow((*p)-mu,(double)k); } return sum/this->size(); } /*:46*//*47:*/ #line 2037 "statlib.w" template double dataTable ::skewness(void) { double sigma= stdevMLE(); return centralMoment(3)/(sigma*sigma*sigma); } /*:47*//*48:*/ #line 2055 "statlib.w" template double dataTable ::kurtosis(void) { double v= varianceMLE(); return centralMoment(4)/(v*v); } /*:48*/ #line 114 "statlib.w" #endif /*:3*/