00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef DISTRIBUTIONS_H
00020 #define DISTRIBUTIONS_H
00021 #include <math.h>
00022 #include <string>
00023 #include "BaseDefinitions.h"
00024
00025 #define RANGE_NONE -1
00026 #define RANGE_MININF_INF 0
00027 #define RANGE_0_INF 1
00028 #define RANGE_0_1 2
00029 #define RANGE_PARA1_PARA2 3
00030 #define RANGE_0_PARA1 4
00031 #define RANGE_PARA1_INF 5
00032 #define RANGE_PARA2_INF 6
00033 #define RANGE_PARA3_INF 7
00034 #define RANGE_PARA1P1_INF 8
00035
00036 #define INFINITY 10e+300
00037 #define inf INFINITY
00038 #define MOMENT_NONE INFINITY
00039
00040
00041 #define USE_EXP_DIST 1
00042 #define USE_GAMMA_DIST 2
00043 #define USE_NORMAL_DIST 3
00044 #define USE_LOGNORMAL_DIST 4
00045 #define USE_PARETO0_DIST 5
00046 #define USE_WEIBULL_DIST 6
00047
00048
00049
00050
00051
00052 #define IncompleteBeta( p1, p2, p3) 0
00053 #define IncompleteGamma(p1,p2) 0
00054 #define tgamma(x) exp(lgamma(x))
00055
00056
00057
00058
00059
00060
00061
00062
00063
00068 class Distribution {
00069 protected:
00070 Zahl param[4];
00071 int paramnr;
00072 public:
00073 Distribution(int paramnumber=0, Zahl para=0, Zahl para1=0){param[0]=para; param[1]=para1; paramnr=paramnumber;};
00074 virtual ~Distribution(){};
00077 virtual string DistributionName(){return "Generic";};
00078 virtual string DistributionShortName(){ return DistributionName().substr(0,3);}
00081 virtual Zahl pdf(Zahl y) {return pdf(y, param[0]);};
00082 virtual Zahl pdf(Zahl y, Zahl para) {return pdf(y, para, param[1]);};
00083 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1)=0;
00086 virtual Zahl Transform(Zahl y) {return Transform(y,param[0]);};
00087 virtual Zahl Transform(Zahl y, Zahl para) {return Transform(y,para, param[1]);};
00088 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) =0;
00091 virtual inline Zahl TransformCut(Zahl y, Zahl cut) {return TransformCut(y, cut, param[0]);};
00092 virtual inline Zahl TransformCut(Zahl y, Zahl cut, Zahl para) {return TransformCut(y, cut, para, param[1]);};
00093 virtual inline Zahl TransformCut(Zahl y, Zahl cut, Zahl para, Zahl para1) {Zahl res=Transform(y*cdf(cut, para, para1), para, para1); if ((res>cut) && (res-cut<0.005)) res=cut; return res;};
00096 virtual inline void SetParameter(Zahl para, int nr=0) {if (0<=nr && nr<paramnr) param[nr]=para;};
00099 virtual inline Zahl GetParameter(int nr=0){if (0<=nr && nr<paramnr) return param[nr]; else return 0;};
00102 virtual Zahl cdf(Zahl y) {return cdf(y,param[0]);};
00103 virtual Zahl cdf(Zahl y, Zahl para) {return cdf(y,para, param[1]);};
00104 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) =0;
00107 virtual Zahl cdfc(Zahl y) {return cdfc(y, param[0]);}
00108 virtual Zahl cdfc(Zahl y, Zahl para) {return cdfc(y, para, param[1]);}
00109 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return 1-cdf(y, para, para1);}
00110
00111 virtual int Range()=0;
00112 virtual int ParameterRange(int paranr) =0;
00113 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1)=0;
00114 virtual Zahl Moment(int k, Zahl para, Zahl para1)=0;
00115 virtual Zahl Mean() {return Mean(param[0], param[1]);};
00116 virtual Zahl Mean(Zahl para, Zahl para1) {return Moment(1,para,para1);};
00117 virtual Zahl Variance(Zahl para, Zahl para1) {return Moment(2,para,para1);};
00118 virtual Zahl StdDeviation(Zahl para, Zahl para1) {Zahl vari=Variance(para,para1); if (vari==MOMENT_NONE) return MOMENT_NONE; else return sqrt(vari);}
00119 virtual Zahl Skewness(Zahl para, Zahl para1) {return Moment(3,para,para1);};
00120 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return Moment(4,para,para1);};
00121 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1)=0;
00122 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1)=0;
00123 virtual Zahl Median(Zahl para, Zahl para1)=0;
00124 virtual Zahl Q1(Zahl para, Zahl para1)=0;
00125 virtual Zahl Q3(Zahl para, Zahl para1)=0;
00126 virtual Zahl Mode(Zahl para, Zahl para1)=0;
00127 virtual Zahl qMean(Zahl para, Zahl para1)=0;
00128 virtual Zahl qMode(Zahl para, Zahl para1)=0;
00129 };
00130
00131 class DistDiscrete : public Distribution {
00132 };
00133
00134
00135 class DistTemplate : public Distribution {
00136 public:
00137 DistTemplate(Zahl para=0, Zahl para1=0) : Distribution(0,para, para1){}
00138 virtual ~DistTemplate(){};
00139 virtual string DistributionName(){return "Template";};
00140 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) {return 0;}
00141 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) {return 0;}
00142 virtual inline Zahl TransformCut(Zahl y, Zahl cut, Zahl para, Zahl para1) {return Transform(y*cdf(cut, para, para1), para, para1);};
00143 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return 0;}
00144 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return 1-cdf(y, para, para1);}
00145
00146 virtual int Range() {return 0;}
00147 virtual int ParameterRange(int paranr) {return 0;}
00148 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00149 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00150 virtual Zahl Mean(Zahl para, Zahl para1) {return Moment(1,para,para1);};
00151 virtual Zahl Variance(Zahl para, Zahl para1) {return Moment(2,para,para1);};
00152 virtual Zahl Skewness(Zahl para, Zahl para1) {return Moment(3,para,para1);};
00153 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return Moment(4,para,para1);};
00154 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00155 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00156 virtual Zahl Median(Zahl para, Zahl para1) {return 0;}
00157 virtual Zahl Q1(Zahl para, Zahl para1) {return 0;}
00158 virtual Zahl Q3(Zahl para, Zahl para1) {return 0;}
00159 virtual Zahl Mode(Zahl para, Zahl para1) {return 0;}
00160 virtual Zahl qMean(Zahl para, Zahl para1) {return 0;}
00161 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00162 };
00163
00164
00165 class DistBeta : public Distribution {
00166 public:
00167 DistBeta(Zahl para=0, Zahl para1=0, Zahl para2=0, Zahl para3=0) : Distribution(4,para, para1){ param[2]=para2; param[3]=para3;}
00168 virtual ~DistBeta(){};
00169 virtual string DistributionName(){return "Beta";}
00170 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) {return tgamma(param[2]+param[3])/(tgamma(param[2])*tgamma(param[3])*pow(param[1]-param[0], param[2]+param[3]-1)) *pow(y-param[0], param[2]-1)*pow(param[1]-y, param[3]-1);}
00171 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) {return 0;}
00172 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return IncompleteBeta( (y-para)/(para1-para), param[2], param[3]);}
00173
00174 virtual int Range() {return RANGE_PARA1_PARA2;}
00175 virtual int ParameterRange(int paranr) { switch (paranr) {
00176 case 1: case 2: return RANGE_MININF_INF;
00177 case 3: case 4: return RANGE_0_INF;
00178 default: return RANGE_NONE;} }
00179 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00180 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00181 virtual Zahl Mean(Zahl para, Zahl para1) {return (para*param[3] + para1*param[2])/(param[2]+param[3]);}
00182 virtual Zahl Variance(Zahl para, Zahl para1) {return (param[2]*param[3]*(para1-para)*(para1-para) ) / ( (param[2]+param[3]+1)*(param[2]+param[3])*(param[2]+param[3]) );}
00183 virtual Zahl StdDeviation(Zahl para, Zahl para1) {return Moment(2, para,para1);}
00184 virtual Zahl Skewness(Zahl para, Zahl para1) {
00185 Zahl C=param[2],D=param[3];
00186 return (2*C*D*(D-C)) / ( pow(C+D, 3) * (C+D+1) * (C+D+2) * sqrt(pow((C*D)/( (C+D)*(C+D)*(C+D+1)), 3)) ); }
00187 virtual Zahl Kurtosis(Zahl para, Zahl para1) {
00188 Zahl C=param[2],D=param[3];
00189 return 3*( ( (C*C*(D+2) + 3*D*D + C*D*(D-2))*(C+D+1)) / (C*D*(C+D+2)*(C+D+3) ) -1);}
00190 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00191 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00192 virtual Zahl Median(Zahl para, Zahl para1) {return 0;}
00193 virtual Zahl Q1(Zahl para, Zahl para1) {return 0;}
00194 virtual Zahl Q3(Zahl para, Zahl para1) {return 0;}
00195 virtual Zahl Mode(Zahl para, Zahl para1) {Zahl A=para, B=para1, C=param[2],D=param[3];
00196 if (C==1 && D==1) return -inf;
00197 else return (A*(D-1) + B*(C-1))/(C+D-2); }
00198 virtual Zahl qMean(Zahl para, Zahl para1) {return 0;}
00199 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00200 };
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 class DistBradford : public Distribution {
00211 public:
00212 DistBradford(Zahl para=0, Zahl para1=1, Zahl para2=5) : Distribution(3,para, para1){param[2]=para2;}
00213 virtual ~DistBradford(){}
00214 virtual string DistributionName(){return "Bradford";}
00215 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return param[2]/( (param[2]*(y-para) + para1 - para) * log(param[2]+1) );}
00216 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) { return (para*(param[2]+1) - para1 + (para1-para)*pow(param[2]+1, y) ) / param[2];}
00217
00218 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) { return log(1+ (param[2]*(y-para))/(para1-para) ) / log(param[2]+1);}
00219
00220 virtual int Range() {return RANGE_PARA1_PARA2;};
00221 virtual int ParameterRange(int paranr) {switch (paranr) {
00222 case 1: case 2: return RANGE_MININF_INF;
00223 case 3: return RANGE_0_INF;
00224 default: return RANGE_NONE;} }
00225 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00226 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00227 virtual Zahl Mean(Zahl para, Zahl para1) {
00228 Zahl A=para, B=para1, C=param[2], k;
00229 k=log(C+1);
00230 return (C*(B-A) + k*( A*C+A-B) ) / (C*k);}
00231 virtual Zahl Variance(Zahl para, Zahl para1) {
00232 Zahl A=para, B=para1, C=param[2], k;
00233 k=log(C+1);
00234 return (B-A)*(B-A) *( C*(k-2) + 2*k) / (2*C*k*k);}
00235 virtual Zahl StdDeviation(Zahl para, Zahl para1) {return Moment(2, para,para1);};
00236 virtual Zahl Skewness(Zahl para, Zahl para1) {
00237 Zahl C=param[2], k;
00238 k=log(C+1);
00239 return M_SQRT2* (12*C*C - 9*k*C*(C+2) + 2*k*k*(C*(C+3)+3) ) / (sqrt(C*(C*(k-2)+2*k))*(3*C*(k-2)+6*k) );}
00240 virtual Zahl Kurtosis(Zahl para, Zahl para1) {
00241 Zahl C=param[2], k;
00242 k=log(C+1);
00243 return (C*C*C*(k-3)*(k*(3*k-16)+24) + 12*k*C*C*(k-4)*(k-3) + 6*C*k*k*(3*k-14) + 12*k*k*k) / (3*C*pow(C*(k-2) + 2*k, 2) );}
00244 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00245 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00246 virtual Zahl Median(Zahl para, Zahl para1) {return (para*(param[2]+1) - para1 + (para1-para)*sqrt(param[2]+1)) / param[2];}
00247 virtual Zahl Q1(Zahl para, Zahl para1) { return (para*(param[2]+1)-para1+(para1-para)*sqrt(sqrt(param[2]+1)) ) / param[2];}
00248 virtual Zahl Q3(Zahl para, Zahl para1) { return (para*(param[2]+1)-para1+(para1-para)*sqrt(sqrt(pow(param[2]+1, 3) )) ) / param[2];}
00249 virtual Zahl Mode(Zahl para, Zahl para1) {return para;}
00250 virtual Zahl qMean(Zahl para, Zahl para1) {Zahl C=param[2]; return log(C/log(C+1)) / log(C+1);}
00251 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00252 };
00253
00254
00255
00256
00257
00258
00259
00260
00261 class DistCauchy : public Distribution {
00262 public:
00263 DistCauchy(Zahl para=0, Zahl para1=1) : Distribution(2,para, para1){}
00264 virtual ~DistCauchy(){}
00265 virtual string DistributionName(){return "Cauchy";};
00266 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) {return 1/(M_PI*para1*(1+pow((y-para)/para1, 2)) ); };
00267 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) {return para + para*tan(M_PI*(y-0.5));};
00268
00269 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return 0.5+1/M_PI*atan( (y-para)/para1 );};
00270
00271 virtual int Range() { return RANGE_MININF_INF;};
00272 virtual int ParameterRange(int paranr) { if (paranr==0) return RANGE_MININF_INF; if (paranr==1) return RANGE_0_INF; return RANGE_NONE;};
00273 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return MOMENT_NONE;}
00274 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return MOMENT_NONE;};
00275 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00276 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00277 virtual Zahl Median(Zahl para, Zahl para1) {return para;};
00278 virtual Zahl Q1(Zahl para, Zahl para1) {return para-para1;};
00279 virtual Zahl Q3(Zahl para, Zahl para1) {return para+para1;};
00280 virtual Zahl Mode(Zahl para, Zahl para1) {return para;};
00281 virtual Zahl qMean(Zahl para, Zahl para1) {return MOMENT_NONE;};
00282 virtual Zahl qMode(Zahl para, Zahl para1) {return 0.5;};
00283 };
00284 #define DistLorentz DistChauchy
00285
00286
00287
00288
00289
00290
00291
00292
00296 class DistExp : public Distribution {
00297 public:
00302 DistExp(Zahl lamb=1, Zahl para=0):Distribution(2, lamb, 0) {}
00303 virtual ~DistExp() {}
00304 virtual string DistributionName(){return "Exponential";};
00308 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return para*exp(para*(para1-y) );}
00311 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) {return para1-log(1-y)/para;};
00312 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return 1-exp(para*(para1-y));}
00313 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return exp(para*(para1-y) );}
00314 virtual int Range() {return RANGE_PARA2_INF;}
00315 virtual int ParameterRange(int paranr) {if (paranr==1) return RANGE_0_INF; if (paranr==2) return RANGE_MININF_INF; return RANGE_NONE;}
00316 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00317 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00318 virtual Zahl Mean(Zahl para, Zahl para1) {return 1/para+para1;}
00319 virtual Zahl Variance(Zahl para, Zahl para1) {return 1/(para*para);}
00320 virtual Zahl Skewness(Zahl para, Zahl para1) {return 2;}
00321 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return 6;}
00322 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00323 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00324 virtual Zahl Median(Zahl para, Zahl para1) {return para1+ log(2)/para;}
00325 virtual Zahl Q1(Zahl para, Zahl para1) {return para1+log(4/3)/para;}
00326 virtual Zahl Q3(Zahl para, Zahl para1) {return para1+log(4)/para;}
00327 virtual Zahl Mode(Zahl para, Zahl para1) {return para1;}
00328 virtual Zahl qMean(Zahl para, Zahl para1) {return (M_E-1)/M_E;}
00329 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00330 };
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00346 class DistGamma : public Distribution {
00347 public:
00350 DistGamma(Zahl al=1, Zahl be=1, Zahl A=0):Distribution(3, al, be) {param[2]=A;}
00351 virtual ~DistGamma() {}
00352 virtual string DistributionName(){return "Gamma";}
00358 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return 1/(para1*tgamma(para))*pow( (y-param[2])*para1,para-1)*exp( (param[2]-y)*para1); }
00361 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1);
00364 virtual Zahl TransformCut(Zahl y, Zahl cut, Zahl para, Zahl para1);
00365 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return IncompleteGamma(para, (y-param[2])*para1);}
00366
00367 virtual int Range() {return RANGE_PARA3_INF;}
00368 virtual int ParameterRange(int paranr) {switch (paranr) {
00369 case 1: return RANGE_MININF_INF;
00370 case 2: case 3: return RANGE_0_INF;
00371 default: return RANGE_NONE;} }
00372 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00373 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00374 virtual Zahl Mean(Zahl para, Zahl para1) {return param[2] + para/para1;}
00375 virtual Zahl Variance(Zahl para, Zahl para1) {return para/(para1*para1);}
00376 virtual Zahl Skewness(Zahl para, Zahl para1) {return 2/sqrt(para);}
00377 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return 6/para;}
00378 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00379 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00380 virtual Zahl Median(Zahl para, Zahl para1) {return 0;}
00381 virtual Zahl Q1(Zahl para, Zahl para1) {return 0;}
00382 virtual Zahl Q3(Zahl para, Zahl para1) {return 0;}
00383 virtual Zahl Mode(Zahl para, Zahl para1) {return param[2]+ (para-1)/para1;}
00384 virtual Zahl qMean(Zahl para, Zahl para1) {return IncompleteGamma(param[0], param[0]);}
00385 virtual Zahl qMode(Zahl para, Zahl para1) {return IncompleteGamma(param[0], param[0]-1);}
00386 };
00387
00388
00389
00390
00391 class DistLaplace : public DistExp {
00392 public:
00393 DistLaplace(Zahl lamb=1, Zahl para=0):DistExp(lamb, para) {}
00394 virtual ~DistLaplace(){}
00395 virtual string DistributionName(){return "Laplace";};
00396 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) {return 1/2.*DistExp::pdf(fabs(y), para, para1);}
00397 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) { Zahl u=2*y-1; if (u<0) return -DistExp::Transform(-u,para,para1); else return DistExp::Transform(u,para,para1);}
00398 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {if (y<para1) return 0.5*exp(para*(y-para1)); else return 1-0.5*exp(para*(para1-y));}
00399
00400 virtual int Range() {return RANGE_MININF_INF;}
00401 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00402 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00403 virtual Zahl Mean(Zahl para, Zahl para1) {return para1;}
00404 virtual Zahl Variance(Zahl para, Zahl para1) {return 2/(para*para);}
00405 virtual Zahl Skewness(Zahl para, Zahl para1) {return 0;}
00406 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return 3;}
00407 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00408 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00409 virtual Zahl Median(Zahl para, Zahl para1) {return para1;}
00410 virtual Zahl Q1(Zahl para, Zahl para1) {return para1-log(2)/para;}
00411 virtual Zahl Q3(Zahl para, Zahl para1) {return para1+log(2)/para;}
00412 virtual Zahl Mode(Zahl para, Zahl para1) {return para1;}
00413 virtual Zahl qMean(Zahl para, Zahl para1) {return 0.5;}
00414 virtual Zahl qMode(Zahl para, Zahl para1) {return 0.5;}
00415 };
00416 #define DistDoubleExponential DistLaplace
00417 #define DistBilateralExponential DistLaplace
00418
00419
00420
00421
00422
00423
00424
00425
00429 class DistNormal : public Distribution {
00430 public:
00431 DistNormal(Zahl mm=0, Zahl ss=1) : Distribution(2, mm, ss) {}
00432 virtual ~DistNormal() {}
00433 virtual string DistributionName(){return "Normal (Gauss)";};
00434 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return M_1SQRT2PI/para1*exp(-(y-para)*(y-para)/(2*para1*para1));};
00435 virtual Zahl Transform(Zahl y, Zahl mm, Zahl ss);
00438 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1);
00439 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return cdf(-y, para, para1);}
00440
00441 virtual int Range() {return RANGE_MININF_INF;}
00442 virtual int ParameterRange(int paranr) {if (paranr==1) return RANGE_MININF_INF; if (paranr==2) return RANGE_0_INF; return RANGE_NONE;}
00443 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00444 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00445 virtual Zahl Mean(Zahl para, Zahl para1) {return para;}
00446 virtual Zahl Variance(Zahl para, Zahl para1) {return para1*para1;}
00447 virtual Zahl Skewness(Zahl para, Zahl para1) {return 0;}
00448 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return 0;}
00449 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00450 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00451 virtual Zahl Median(Zahl para, Zahl para1) {return para;}
00452 virtual Zahl Q1(Zahl para, Zahl para1) {return para-0.6745*para1;}
00453 virtual Zahl Q3(Zahl para, Zahl para1) {return para+0.6745*para1;}
00454 virtual Zahl Mode(Zahl para, Zahl para1) {return para;}
00455 virtual Zahl qMean(Zahl para, Zahl para1) {return 0.5;}
00456 virtual Zahl qMode(Zahl para, Zahl para1) {return 0.5;}
00457 };
00458 #define DistGauss DistNormal
00459
00460
00461 class DistFoldedNormal : public DistNormal {
00462 public:
00463 DistFoldedNormal(Zahl mm=0, Zahl ss=1) : DistNormal(mm, ss) {}
00464 virtual ~DistFoldedNormal() {}
00465 virtual string DistributionName(){return "Folded Normal";};
00466 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return M_SQRT2/(para1*M_SQRTPI)*cosh(para*y/(para1*para1) )*exp(-0.5*(y*y+para*para)/(para1*para1));};
00467 virtual Zahl Transform(Zahl y, Zahl mm, Zahl ss) {return 0;}
00470 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) { return DistNormal::cdf(y, para, para1)-DistNormal::cdf(-y, para, para1);}
00471 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return 1-cdf(y, para, para1);}
00472
00473 virtual int Range() {return RANGE_0_INF;}
00474 virtual int ParameterRange(int paranr) {if (paranr==1) return RANGE_MININF_INF; if (paranr==2) return RANGE_0_INF; return RANGE_NONE;}
00475 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00476 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00477 virtual Zahl Mean(Zahl para, Zahl para1) {return 0;}
00478 virtual Zahl Variance(Zahl para, Zahl para1) {return 0;}
00479 virtual Zahl Skewness(Zahl para, Zahl para1) {return 0;}
00480 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return 0;}
00481 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00482 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00483 virtual Zahl Median(Zahl para, Zahl para1) {return 0;}
00484 virtual Zahl Q1(Zahl para, Zahl para1) {return 0;}
00485 virtual Zahl Q3(Zahl para, Zahl para1) {return 0;}
00486 virtual Zahl Mode(Zahl para, Zahl para1) {return 0;}
00487 virtual Zahl qMean(Zahl para, Zahl para1) {return 0;}
00488 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00489 };
00490
00491
00492 class DistHalfNormal : public DistNormal {
00493 public:
00494 DistHalfNormal(Zahl mm=0, Zahl ss=1) : DistNormal(mm, ss) {}
00495 virtual ~DistHalfNormal() {}
00496 virtual string DistributionName(){return "Half Normal";};
00497 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) {return 2*DistNormal::pdf(y,para,para1);}
00498 virtual Zahl Transform(Zahl y, Zahl mm, Zahl ss) {return DistNormal::Transform(y/2.+0.5, mm, ss);}
00501 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) { return 2*DistNormal::cdf(y,para,para1) - 1;}
00502 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return 2*DistNormal::cdf(y,para,para1);}
00503
00504 virtual int Range() {return RANGE_PARA1_INF;}
00505 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00506 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00507 virtual Zahl Mean(Zahl para, Zahl para1) {return para+para1*M_SQRT2/M_SQRTPI;}
00508 virtual Zahl Variance(Zahl para, Zahl para1) {return para1*para1*(1-2/M_PI);}
00509 virtual Zahl Skewness(Zahl para, Zahl para1) {return M_SQRT2*(4-M_PI) / sqrt(pow(M_PI-2, 2));}
00510 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return 8*(M_PI-3)/ ( (M_PI-2)*(M_PI-2) );}
00511 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00512 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00513 virtual Zahl Median(Zahl para, Zahl para1) {return para+0.6745*para1;}
00514 virtual Zahl Q1(Zahl para, Zahl para1) {return para+0.3286*para1;}
00515 virtual Zahl Q3(Zahl para, Zahl para1) {return para+1.150*para1;}
00516 virtual Zahl Mode(Zahl para, Zahl para1) {return para;}
00517 virtual Zahl qMean(Zahl para, Zahl para1) {return 0.5751;}
00518 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00519 };
00520
00521
00525 class DistLogNormal : public DistNormal {
00526 public:
00527 DistLogNormal(Zahl mm=0, Zahl ss=1):DistNormal(mm,ss) {};
00528 virtual ~DistLogNormal() {};
00529 virtual string DistributionName(){return "LogNormal";};
00530 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return DistNormal::pdf(log(y), para,para1)/y;};
00531 virtual Zahl Transform(Zahl y, Zahl mm, Zahl ss) {return exp(DistNormal::Transform(y,mm,ss));};
00532 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) { return DistNormal::cdf(log(y), para, para1);}
00533
00534 virtual int Range() {return RANGE_0_INF;}
00535 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00536 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00537 virtual Zahl Mean(Zahl para, Zahl para1) {return exp(para+para1*para1/2);}
00538 virtual Zahl Variance(Zahl para, Zahl para1) {return exp(2*para+para1*para1) * (exp(para1*para1) - 1);}
00539 virtual Zahl Skewness(Zahl para, Zahl para1) {return (M_E+2) *sqrt(M_E-1);}
00540 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return M_E*M_E*M_E*M_E + 3*M_E*M_E*M_E + 3*M_E*M_E - 6;}
00541 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00542 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00543 virtual Zahl Median(Zahl para, Zahl para1) {return exp(para);}
00544 virtual Zahl Q1(Zahl para, Zahl para1) {return exp(para-0.6745*para1);}
00545 virtual Zahl Q3(Zahl para, Zahl para1) {return exp(para+0.6745*para1);}
00546 virtual Zahl Mode(Zahl para, Zahl para1) {return exp(para-para1*para1);}
00547 virtual Zahl qMean(Zahl para, Zahl para1) {return 0;}
00548 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00549 };
00550 #define DIstCobbDouglas DistLogNormal
00551 #define DistAntiLogNormal DistLogNormal
00552
00553
00557 class DistPareto : public Distribution {
00558 public:
00559 DistPareto(Zahl aa=1, Zahl bb=1) : Distribution(2, aa, bb) {}
00560 virtual ~DistPareto() {}
00561 virtual string DistributionName(){return "Pareto";};
00562 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return y<para1 ? 0 : (para/para1)*pow(para1/y, para+1); };
00563 virtual Zahl Transform(Zahl y, Zahl aa, Zahl bb) {return bb*(pow(y, -1/aa));};
00564 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return 1-pow(para1/y, para);}
00565 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return pow(para1/y, para);}
00566
00567 virtual int Range() {return RANGE_PARA2_INF;}
00568 virtual int ParameterRange(int paranr) { if (paranr>0 && paranr<=2) return RANGE_0_INF; else return RANGE_NONE;}
00569 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00570 virtual Zahl Moment(int k, Zahl para, Zahl para1) {if (k>=para) return MOMENT_NONE; else {return 0; }}
00571 virtual Zahl Mean(Zahl para, Zahl para1) {if (1<para) return (para*para1/(para-1)); else return MOMENT_NONE;}
00572 virtual Zahl Variance(Zahl para, Zahl para1) {if (2<para) return (para*para1*para1)/( (para-2)*(para-1)*(para-1)); else return MOMENT_NONE;}
00573 virtual Zahl Skewness(Zahl para, Zahl para1) {if (3<para) return ( 2*(para+1)*sqrt(para-2) ) / ((para-3)*sqrt(para)); else return MOMENT_NONE;}
00574 virtual Zahl Kurtosis(Zahl para, Zahl para1) {if (4<para) return 6/para*(para*para*para+ para*para-6*para-2) / (para*para-7*para+12); else return MOMENT_NONE;}
00575 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00576 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00577 virtual Zahl Median(Zahl para, Zahl para1) {return para1*pow(2., 1/para);}
00578 virtual Zahl Q1(Zahl para, Zahl para1) {return para1*pow(4./3., 1/para);}
00579 virtual Zahl Q3(Zahl para, Zahl para1) {return para1*pow(4., 1/para);}
00580 virtual Zahl Mode(Zahl para, Zahl para1) {return para1;}
00581 virtual Zahl qMean(Zahl para, Zahl para1) {return 1-pow((para-1)/para, 1/para);}
00582 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00583 };
00584
00585
00589 class DistPareto0 : public DistPareto {
00590 public:
00591 DistPareto0(Zahl aa=1, Zahl bb=1) : DistPareto(aa, bb) {}
00592 virtual ~DistPareto0() {}
00593 virtual string DistributionName(){return "Pareto (0-Point)";}
00594 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return (para/para1)*pow((1+y/para1), -para-1); };
00595 virtual Zahl Transform(Zahl y, Zahl aa, Zahl bb) {return bb*(pow(1-y, -1/aa)-1);};
00596
00597 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return 1-pow(1+y/para1, -para);}
00598 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return pow(1+y/para1, -para);}
00599
00600 virtual int Range() {return RANGE_0_INF;}
00601 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00602 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00603 virtual Zahl Mean(Zahl para, Zahl para1) {return Moment(1,para,para1);};
00604 virtual Zahl Variance(Zahl para, Zahl para1) {return Moment(2,para,para1);};
00605 virtual Zahl Skewness(Zahl para, Zahl para1) {return Moment(3,para,para1);};
00606 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return Moment(4,para,para1);};
00607 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00608 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00609 virtual Zahl Median(Zahl para, Zahl para1) {return 0;}
00610 virtual Zahl Q1(Zahl para, Zahl para1) {return 0;}
00611 virtual Zahl Q3(Zahl para, Zahl para1) {return 0;}
00612 virtual Zahl Mode(Zahl para, Zahl para1) {return 0;}
00613 virtual Zahl qMean(Zahl para, Zahl para1) {return 0;}
00614 virtual Zahl qMode(Zahl para, Zahl para1) {return 0;}
00615 };
00616
00617
00621 class DistUniform : public Distribution {
00622 public:
00623 DistUniform(Zahl a=0, Zahl b=1):Distribution(2,a,b) {}
00624 virtual ~DistUniform(){}
00625 virtual string DistributionName(){return "Uniform";};
00626 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) {return 1./(para1-para);}
00627 virtual Zahl Transform(Zahl y, Zahl para, Zahl para1) { return para+y*(para1-para);}
00628 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return max(0, min(1, (y-para)/(para1-para) ));}
00629 virtual int Range() {return RANGE_PARA1_PARA2;}
00630 virtual int ParameterRange(int paranr) {if (0<paranr && paranr<=2 ) return RANGE_MININF_INF; else return RANGE_NONE;}
00631 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00632 virtual Zahl Moment(int k, Zahl para, Zahl para1) { return 0;}
00633 virtual Zahl Mean(Zahl para, Zahl para1) {return (para+para1)/2;}
00634 virtual Zahl Variance(Zahl para, Zahl para1) {return (para1-para)*(para1-para)/12;}
00635 virtual Zahl Skewness(Zahl para, Zahl para1) {return 0;}
00636 virtual Zahl Kurtosis(Zahl para, Zahl para1) {return -1.2;}
00637 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00638 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00639 virtual Zahl Median(Zahl para, Zahl para1) {return (para+para1)/2;}
00640 virtual Zahl Q1(Zahl para, Zahl para1) {return (3*para+para1)/4;}
00641 virtual Zahl Q3(Zahl para, Zahl para1) {return (para+3*para1)/4;}
00642 virtual Zahl Mode(Zahl para, Zahl para1) {return MOMENT_NONE;}
00643 virtual Zahl qMean(Zahl para, Zahl para1) {return 0.5;}
00644 virtual Zahl qMode(Zahl para, Zahl para1) {return MOMENT_NONE;}
00645 };
00646 #define DistRectangular DistUniform
00647
00648
00652 class DistWeibull : public Distribution {
00653 public:
00654 DistWeibull(Zahl aa=1, Zahl bb=1, Zahl A=0) : Distribution(3, aa, bb) {param[2]=A;}
00655 virtual ~DistWeibull() {}
00656 virtual string DistributionName(){return "Weibull";}
00657 virtual Zahl pdf(Zahl y, Zahl para, Zahl para1) { return (para/para1)*pow((y-param[2])/para1, para-1)*exp(-pow((y-param[2])/para1, para) ); };
00658 virtual Zahl Transform(Zahl y, Zahl mm, Zahl ss) {return param[2]+pow(-log(1-y), 1/mm)*ss;};
00659 virtual Zahl cdf(Zahl y, Zahl para, Zahl para1) {return 1-exp(-pow((y-param[2])/para1, para) );}
00660 virtual Zahl cdfc(Zahl y, Zahl para, Zahl para1) {return exp(-pow((y-param[2])/para1, para) );}
00661
00662 virtual int Range() {return RANGE_PARA1_INF;}
00663 virtual int ParameterRange(int paranr) {switch (paranr) {
00664 case 1: case 2: return RANGE_0_INF;
00665 case 3: return RANGE_MININF_INF;
00666 default: return RANGE_NONE;}}
00667 virtual Zahl mgf(Zahl y, Zahl para, Zahl para1) {return 0;}
00668 virtual Zahl Moment(int k, Zahl para, Zahl para1) {return 0;}
00669 virtual Zahl Mean(Zahl para, Zahl para1) {return param[2]+ para1*tgamma((para+1)/para); }
00670 virtual Zahl Variance(Zahl para, Zahl para1) {return para1*para1* ( tgamma((para+2)/para) - pow(tgamma((para+1)/para), 2));}
00671 virtual Zahl Skewness(Zahl para, Zahl para1) {
00672 Zahl g1=tgamma((para+1)/para), g2=tgamma((para+2)/para), g3=tgamma((para+1)/para);
00673 return (2*pow(g1, 3) - 3*g1*g2 + g3 ) / pow( g2-g1*g1, 1.5);}
00674 virtual Zahl Kurtosis(Zahl para, Zahl para1) {
00675 Zahl g1=tgamma((para+1)/para), g2=tgamma((para+2)/para), g3=tgamma((para+1)/para), g4=tgamma((para+4)/para);
00676 return (-3*g1*g1*g1*g1 + 6*g1*g1*g2 - 4*g1*g3 + g4 ) / pow(g1*g1-g2, 2) -3;}
00677 virtual Zahl LogLikelihood(Zahl y, Zahl para, Zahl para1) {return 0;}
00678 virtual Zahl CharacteristicFunction(Zahl y, Zahl para, Zahl para1) {return 0;}
00679 virtual Zahl Median(Zahl para, Zahl para1) {return param[2] + para1*pow(M_LOG2E, 1/para);}
00680 virtual Zahl Q1(Zahl para, Zahl para1) {return param[2]+para1*pow(log(4/3.), 1/para);}
00681 virtual Zahl Q3(Zahl para, Zahl para1) {return param[2]+para1*pow(log(4.), 1/para);}
00682 virtual Zahl Mode(Zahl para, Zahl para1) {if (para<=1) return param[2]; else return param[2]+para1*pow((para-1)/para, 1/para);}
00683 virtual Zahl qMean(Zahl para, Zahl para1) {return 1-exp(-pow(tgamma(1+1/para), para));}
00684 virtual Zahl qMode(Zahl para, Zahl para1) {return 1-exp(1/para-1);}
00685 };
00686 #define DistFrechet DistWeibull
00687
00688
00689
00690
00691
00697 Distribution*CreateDistribution(long type, Zahl para, Zahl para1);
00698
00699 #endif