Changeset 679 for library/bdm/estim/arx.cpp
- Timestamp:
- 10/23/09 00:05:25 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/arx.cpp
r665 r679 2 2 namespace bdm { 3 3 4 void ARX::bayes ( const vec &dt, const double w ) {4 void ARX::bayes_weighted ( const vec &yt, const vec &cond, const double w ) { 5 5 double lnc; 6 6 //cache 7 ldmat &V=est._V(); 8 double &nu=est._nu(); 9 10 dyad.set_subvector(0,yt); 11 dyad.set_subvector(dimy,cond); 12 // possible "1" is there from the beginning 13 7 14 if ( frg < 1.0 ) { 8 15 est.pow ( frg ); // multiply V and nu 16 9 17 10 18 //stabilize 11 19 ldmat V0=alter_est._V(); //$ copy 12 20 double &nu0=alter_est._nu(); 21 13 22 V0*=(1-frg); 14 23 V += V0; //stabilization … … 20 29 } 21 30 } 22 if (have_constant) { 23 _dt.set_subvector(0,dt); 24 V.opupdt ( _dt, w ); 25 } else { 26 V.opupdt ( dt, w ); 27 } 31 V.opupdt ( dyad, w ); 28 32 nu += w; 29 33 … … 36 40 } 37 41 38 double ARX::logpred ( const vec & dt ) const {42 double ARX::logpred ( const vec &yt ) const { 39 43 egiw pred ( est ); 40 44 ldmat &V = pred._V(); … … 42 46 43 47 double lll; 48 vec dyad_p = dyad; 49 dyad_p.set_subvector(0,yt); 44 50 45 51 if ( frg < 1.0 ) { … … 53 59 } 54 60 55 V.opupdt ( d t, 1.0 );61 V.opupdt ( dyad_p, 1.0 ); 56 62 nu += 1.0; 57 63 // log(sqrt(2*pi)) = 0.91893853320467 … … 67 73 const ARX* A0 = dynamic_cast<const ARX*> ( B0 ); 68 74 69 bdm_assert_debug ( V.rows() == A0->V.rows(), "ARX::set_statistics Statistics differ" );70 set_statistics ( A0->dim x, A0->V, A0->nu);75 bdm_assert_debug ( dimension() == A0->dimension(), "Statistics of different dimensions" ); 76 set_statistics ( A0->dimensiony(), A0->posterior()._V(), A0->posterior()._nu() ); 71 77 } 72 78 73 79 enorm<ldmat>* ARX::epredictor ( const vec &rgr ) const { 74 int dim = dimx;//est.dimension(); 75 mat mu ( dim, V.rows() - dim ); 76 mat R ( dim, dim ); 80 mat mu ( dimy, posterior()._V().rows() - dimy ); 81 mat R ( dimy, dimy ); 77 82 78 83 enorm<ldmat>* tmp; 79 84 tmp = new enorm<ldmat> ( ); 80 85 //TODO: too hackish 81 if ( drv._dsize() > 0 ) {86 if ( yrv._dsize() > 0 ) { 82 87 } 83 88 … … 91 96 92 97 mlnorm<ldmat>* ARX::predictor ( ) const { 93 int dim = est.dimension(); 94 95 mat mu ( dim, V.rows() - dim ); 96 mat R ( dim, dim ); 98 mat mu ( dimy, posterior()._V().rows() - dimy ); 99 mat R ( dimy, dimy ); 97 100 mlnorm<ldmat>* tmp; 98 101 tmp = new mlnorm<ldmat> ( ); … … 106 109 tmp->set_parameters ( mu.get_cols ( 0, mu.cols() - 2 ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ) ); 107 110 } else { 108 tmp->set_parameters ( mu, zeros ( dim ), ldmat ( R ) );111 tmp->set_parameters ( mu, zeros ( dimy ), ldmat ( R ) ); 109 112 } 110 113 return tmp; … … 112 115 113 116 mlstudent* ARX::predictor_student ( ) const { 114 int dim = est.dimension();115 116 mat mu ( dim , V.rows() - dim);117 mat R ( dim , dim);117 const ldmat &V = posterior()._V(); 118 119 mat mu ( dimy, V.rows() - dimy ); 120 mat R ( dimy, dimy ); 118 121 mlstudent* tmp; 119 122 tmp = new mlstudent ( ); … … 122 125 mu = mu.T(); 123 126 124 int xdim = dimx;125 127 int end = V._L().rows() - 1; 126 ldmat Lam ( V._L() ( xdim, end, xdim, end ), V._D() ( xdim, end ) ); //exp val of R128 ldmat Lam ( V._L() ( dimy, end, dimy, end ), V._D() ( dimy, end ) ); //exp val of R 127 129 128 130 … … 132 134 tmp->set_parameters ( mu.get_cols ( 0, mu.cols() - 2 ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ), Lam ); 133 135 } else { 134 tmp->set_parameters ( mat ( dim , 0), mu.get_col ( mu.cols() - 1 ), ldmat ( R ), Lam );136 tmp->set_parameters ( mat ( dimy, dimc ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ), Lam ); 135 137 } 136 138 } else { 137 139 // no constant term 138 tmp->set_parameters ( mu, zeros ( xdim), ldmat ( R ), Lam );140 tmp->set_parameters ( mu, zeros ( dimy ), ldmat ( R ), Lam ); 139 141 } 140 142 return tmp; … … 214 216 215 217 void ARX::from_setting ( const Setting &set ) { 216 shared_ptr<RV> yrv = UI::build<RV> ( set, "rv", UI::compulsory );218 shared_ptr<RV> yrv_ = UI::build<RV> ( set, "rv", UI::compulsory ); 217 219 shared_ptr<RV> rrv = UI::build<RV> ( set, "rgr", UI::compulsory ); 218 int ylen = yrv->_dsize();220 dimy = yrv_->_dsize(); 219 221 // rgrlen - including constant!!! 220 int rgrlen= rrv->_dsize();221 222 dimx = ylen;223 set_rv ( *yrv, *rrv );222 dimc = rrv->_dsize(); 223 224 yrv = *yrv_; 225 rvc = *rrv; 224 226 225 227 string opt; … … 233 235 have_constant=constant>0; 234 236 } 235 i f (have_constant) {rgrlen++;_dt=ones(rgrlen+ylen);}237 int rgrlen = dimc+int(have_constant==true); 236 238 237 239 //init 238 240 shared_ptr<egiw> pri=UI::build<egiw>(set, "prior", UI::optional); 239 241 if (pri) { 240 bdm_assert(pri->_dimx()== ylen,"prior is not compatible");241 bdm_assert(pri->_V().rows()== ylen+rgrlen,"prior is not compatible");242 bdm_assert(pri->_dimx()==dimy,"prior is not compatible"); 243 bdm_assert(pri->_V().rows()==dimy+rgrlen,"prior is not compatible"); 242 244 est.set_parameters( pri->_dimx(),pri->_V(), pri->_nu()); 243 245 }else{ 244 est.set_parameters( ylen, zeros(ylen+rgrlen));246 est.set_parameters( dimy, zeros(dimy+rgrlen)); 245 247 set_prior_default(est); 246 248 } … … 248 250 shared_ptr<egiw> alt=UI::build<egiw>(set, "alternative", UI::optional); 249 251 if (alt) { 250 bdm_assert(alt->_dimx()== ylen,"alternative is not compatible");251 bdm_assert(alt->_V().rows()== ylen+rgrlen,"alternative is not compatible");252 bdm_assert(alt->_dimx()==dimy,"alternative is not compatible"); 253 bdm_assert(alt->_V().rows()==dimy+rgrlen,"alternative is not compatible"); 252 254 alter_est.set_parameters( alt->_dimx(),alt->_V(), alt->_nu()); 253 255 } else { … … 264 266 shared_ptr<RV> rv_par=UI::build<RV>(set, "rv_param",UI::optional ); 265 267 if (!rv_par){ 266 est.set_rv ( RV ( "{theta r }", vec_2 ( ylen*rgrlen, ylen*ylen) ) );268 est.set_rv ( RV ( "{theta r }", vec_2 ( dimy*rgrlen, dimy*dimy ) ) ); 267 269 } else { 268 270 est.set_rv ( *rv_par ); … … 270 272 validate(); 271 273 } 272 273 } 274 } 275