Changeset 625

Show
Ignore:
Timestamp:
09/18/09 00:17:05 (15 years ago)
Author:
smidl
Message:

ARX re-designed

Location:
library/bdm/estim
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/estim/arx.cpp

    r585 r625  
    55        double lnc; 
    66 
     7                 
    78        if ( frg < 1.0 ) { 
    89                est.pow ( frg ); 
     
    1112                } 
    1213        } 
    13         V.opupdt ( dt, w ); 
     14        if (have_constant) { 
     15                _dt.set_subvector(0,dt); 
     16                V.opupdt ( _dt, w ); 
     17        } else { 
     18                V.opupdt ( dt, w ); 
     19        } 
    1420        nu += w; 
    1521 
     
    7884mlnorm<ldmat>* ARX::predictor ( ) const { 
    7985        int dim = est.dimension(); 
    80         int dif = V.rows() - dim ;///<----------- TODO 
    81         bdm_assert_debug ( ( dif == 0 ) || ( dif == 1 ), "Give RVs do not match" ); 
    82  
     86         
    8387        mat mu ( dim, V.rows() - dim ); 
    8488        mat R ( dim, dim ); 
     
    9094        //correction for student-t  -- TODO check if correct!! 
    9195 
    92         if ( dif == 0 ) { // no constant term 
    93                 tmp->set_parameters ( mu, zeros ( dim ), ldmat ( R ) ); 
    94         } else { 
     96        if ( have_constant) { // constant term 
    9597                //Assume the constant term is the last one: 
    9698                tmp->set_parameters ( mu.get_cols ( 0, mu.cols() - 2 ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ) ); 
     99        } else { 
     100                tmp->set_parameters ( mu, zeros ( dim ), ldmat ( R ) ); 
    97101        } 
    98102        return tmp; 
     
    101105mlstudent* ARX::predictor_student ( ) const { 
    102106        int dim = est.dimension(); 
    103         int dif = V.rows() - est.dimension();//-------------TODO 
    104         bdm_assert_debug ( ( dif == 0 ) || ( dif == 1 ), "Give RVs do not match" ); 
    105107 
    106108        mat mu ( dim, V.rows() - dim ); 
     
    117119 
    118120 
    119         if ( dif == 0 ) { // no constant term 
    120                 tmp->set_parameters ( mu, zeros ( xdim ), ldmat ( R ), Lam ); 
    121         } else { 
     121        if ( have_constant) { // no constant term 
    122122                //Assume the constant term is the last one: 
    123123                if ( mu.cols() > 1 ) { 
     
    126126                        tmp->set_parameters ( mat ( dim, 0 ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ), Lam ); 
    127127                } 
     128        } else { 
     129                // no constant term 
     130                tmp->set_parameters ( mu, zeros ( xdim ), ldmat ( R ), Lam ); 
    128131        } 
    129132        return tmp; 
     
    203206 
    204207void ARX::from_setting ( const Setting &set ) { 
    205         shared_ptr<RV> yrv = UI::build<RV> ( set, "y", UI::compulsory ); 
     208        shared_ptr<RV> yrv = UI::build<RV> ( set, "rv", UI::compulsory ); 
    206209        shared_ptr<RV> rrv = UI::build<RV> ( set, "rgr", UI::compulsory ); 
    207210        int ylen = yrv->_dsize(); 
     211        // rgrlen - including constant!!! 
    208212        int rgrlen = rrv->_dsize(); 
    209  
     213         
     214        set_rv ( *yrv, *rrv ); 
     215         
    210216        string opt; 
    211217        if ( UI::get(opt, set,  "options", UI::optional) ) { 
    212218                BM::set_options(opt); 
    213219        } 
     220        if (!UI::get(have_constant, set, "constant", UI::optional)){ 
     221                have_constant=true; 
     222        } 
     223        if (have_constant) {rgrlen++;_dt=ones(rgrlen+ylen);} 
    214224 
    215225        //init 
    216226        mat V0; 
    217227        vec dV0; 
    218         if ( !UI::get ( dV0, set, "dV0" ) ) 
    219                 dV0 = concat ( 1e-3 * ones ( ylen ), 1e-5 * ones ( rgrlen ) ); 
    220         V0 = diag ( dV0 ); 
    221  
     228        if (!UI::get(V0, set, "V0",UI::optional)){ 
     229                if ( !UI::get ( dV0, set, "dV0" ) ) 
     230                        dV0 = concat ( 1e-3 * ones ( ylen ), 1e-5 * ones ( rgrlen ) ); 
     231                V0 = diag ( dV0 ); 
     232        } 
    222233        double nu0; 
    223234        if ( !UI::get ( nu0, set, "nu0" ) ) 
     
    230241        set_parameters ( frg ); 
    231242        set_statistics ( ylen, V0, nu0 ); 
    232         set_drv ( concat ( *yrv, *rrv ) ); 
    233  
     243         
    234244        //name results (for logging) 
    235         set_rv ( RV ( "{theta r }", vec_2 ( ylen*rgrlen, ylen*ylen ) ) ); 
    236  
    237 } 
    238  
    239 } 
     245        shared_ptr<RV> rv_par=UI::build<RV>(set, "rv_param",UI::optional ); 
     246        if (!rv_par){ 
     247                est.set_rv ( RV ( "{theta r }", vec_2 ( ylen*rgrlen, ylen*ylen ) ) ); 
     248        } else { 
     249                est.set_rv ( *rv_par ); 
     250        } 
     251        validate(); 
     252} 
     253 
     254} 
  • library/bdm/estim/arx.h

    r585 r625  
    4848        //! Do NOT access directly, only via \c get_yrv(). 
    4949        RV _yrv; 
     50        //! rv of regressor 
     51        RV rgrrv; 
    5052        //! Posterior estimate of \f$\theta,r\f$ in the form of Normal-inverse Wishart density 
    5153        egiw est; 
     
    5456        //! cached value of est.nu 
    5557        double &nu; 
     58        //! switch if constant is modelled or not 
     59        bool have_constant; 
     60        //! cached value of data vector for have_constant =true 
     61        vec _dt; 
    5662public: 
    5763        //! \name Constructors 
     
    7379        //!@} 
    7480 
    75 //      //! Set parameters given by moments, \c mu (mean of theta), \c R (mean of R) and \c C (variance of theta) 
    76 //      void set_parameters ( const vec &mu, const mat &R, const mat &C, double dfm){}; 
    7781        //! Set sufficient statistics 
    7882        void set_statistics ( const BMEF* BM0 ); 
    79 //      //! Returns sufficient statistics 
    80 //      void get_parameters ( mat &V0, double &nu0 ) {V0=est._V().to_mat(); nu0=est._nu();} 
     83 
    8184        //!\name Mathematical operations 
    8285        //!@{ 
     
    121124        //!\name Connection 
    122125        //!@{ 
    123         void set_drv ( const RV &drv0 ) { 
    124                 drv = drv0; 
     126        void set_rv ( const RV &yrv0 , const RV &rgrrv0 ) { 
     127                _yrv = yrv0; 
     128                rgrrv=rgrrv0; 
     129                set_drv(concat(yrv0, rgrrv)); 
    125130        } 
    126131 
     
    140145        //!@} 
    141146 
    142         // TODO dokumentace - aktualizovat 
    143147        /*! UI for ARX estimator 
    144148 
    145         The ARX is constructed from a structure with fields: 
    146149        \code 
    147         estimator = { 
    148                 class = "ARX"; 
    149                 y = {type="rv", ...}   // description of output variables 
    150                 rgr = {type="rv", ...} // description of regressor variables 
    151                 constant = true;       // boolean switch if the constant term is modelled or not 
     150        class = 'ARX'; 
     151        rv    = RV({names_of_dt} )                 // description of output variables 
     152        rgr   = RV({names_of_regressors}, [-1,-2]} // description of regressor variables 
     153        constant = true;                           // boolean switch if the constant term is modelled or not 
    152154 
    153                 //optional fields 
    154                 dV0 = [1e-3, 1e-5, 1e-5, 1e-5]; 
    155                                                            // default: 1e-3 for y, 1e-5 for rgr 
    156                 nu0 = 6;               // default: rgrlen + 2 
    157                 frg = 1.0;             // forgetting, default frg=1.0 
    158         }; 
     155        --- optional --- 
     156        V0  = [1 0;0 1];                           // Initial value of information matrix V 
     157          --- OR --- 
     158        dV0 = [1e-3, 1e-5, 1e-5, 1e-5];            // Initial value of diagonal of information matrix V 
     159                                                                                           // default: 1e-3 for rv, 1e-5 for rgr 
     160        nu0 = 6;                                                   // initial value of nu, default: rgrlen + 2 
     161        frg = 1.0;                                 // forgetting, default frg=1.0 
     162 
     163        rv_param   = RV({names_of_parameters}}     // description of parametetr names  
     164                                                                                           // default: ["theta_i" and "r_i"] 
    159165        \endcode 
    160  
    161         The estimator will assign names of the posterior in the form ["theta_i" and "r_i"] 
    162166        */ 
    163167        void from_setting ( const Setting &set ); 
    164168 
     169        void validate() { 
     170                bdm_assert(dimx == _yrv._dsize(), "RVs of parameters and regressor do not match"); 
     171                 
     172        } 
    165173}; 
    166174 
  • library/bdm/estim/kalman.h

    r620 r625  
    378378        public: 
    379379                //! set up this object to match given mlnorm 
    380                 void connect_mlnorm(const mlnorm<fsqmat > &ml){ 
    381         //get ids of yrv                                 
     380                void connect_mlnorm(const mlnorm<fsqmat> &ml){ 
     381                        //get ids of yrv                                 
    382382                        const RV &yrv = ml._rv(); 
    383383                        //need to determine u_t - it is all in _rvc that is not in ml._rv()