Changeset 404 for library/bdm/stat/merger.cpp
- Timestamp:
- 07/02/09 22:16:05 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/stat/merger.cpp
r399 r404 5 5 namespace bdm 6 6 { 7 vec merger_base::merge_points ( mat &lW ) 8 { 7 vec merger_base::merge_points ( mat &lW ) { 9 8 int nu=lW.rows(); 10 switch ( METHOD ) 11 { 9 vec result; 10 ivec indW; 11 bool infexist; 12 switch ( METHOD ) { 12 13 case ARITHMETIC: 13 re turnlog ( sum ( exp ( lW ) ) ); //ugly!14 result= log ( sum ( exp ( lW ) ) ); //ugly! 14 15 break; 15 16 case GEOMETRIC: 16 re turnsum ( lW ) /nu;17 result= sum ( lW ) /nu; 17 18 break; 18 19 case LOGNORMAL: 19 vec mu = sum ( lW ) /nu; //mean of logs 20 // vec lam = sum ( pow ( lW,2 ) )-nu*pow ( mu,2 ); ======= numerically unsafe! 21 vec lam = sum ( pow ( lW-outer_product ( ones ( lW.rows() ),mu ),2 ) ); 20 vec sumlW=sum ( lW ) ; 21 indW=find((sumlW<inf) & (sumlW>-inf)); 22 infexist=(indW.size()<lW.cols()); 23 vec mu; 24 vec lam; 25 if (infexist){ 26 mu = sumlW(indW) /nu; //mean of logs 27 // 28 mat validlW=lW.get_cols(indW); 29 lam = sum ( pow ( validlW-outer_product ( ones ( validlW.rows() ),mu ),2 ) ); 30 } 31 else { 32 mu = sum ( lW ) /nu; //mean of logs 33 lam = sum ( pow ( lW-outer_product ( ones ( lW.rows() ),mu ),2 ) ); 34 } 35 // 22 36 double coef=0.0; 23 37 vec sq2bl=sqrt ( 2*beta*lam ); //this term is everywhere 24 switch ( nu ) 25 { 38 switch ( nu ) { 26 39 case 2: 27 40 coef= ( 1-0.5*sqrt ( ( 4.0*beta-3.0 ) /beta ) ); 28 re turncoef*sq2bl + mu ;41 result =coef*sq2bl + mu ; 29 42 break; 30 case 3://Ratio of Bessel 31 coef = sqrt ( ( 3*beta-2 ) /3*beta ); 32 return log ( besselk ( 0,sq2bl*coef ) ) - log ( besselk ( 0,sq2bl ) ) + mu; 33 break; 34 case 4: 35 break; 36 default: // Approximate conditional density 43 // case 4: == can be done similar to case 2 - is it worth it??? 44 default: // see accompanying document merge_lognorm_derivation.lyx 45 coef = sqrt(1-(nu+1)/(2*beta*nu)); 46 result =log(besselk((nu-3)/2, sq2bl*coef))-log(besselk((nu-3)/2, sq2bl)) + mu; 37 47 break; 38 48 } 39 49 break; 40 50 } 41 return vec ( 0 ); 51 if (infexist){ 52 vec tmp =-inf*ones(lW.cols()); 53 set_subvector(tmp, indW, result); 54 return tmp; 55 } 56 else {return result;} 42 57 } 43 58