root/library/bdm/estim/arx.cpp @ 585

Revision 585, 5.7 kB (checked in by smidl, 15 years ago)

ticket #12 preparations

  • Property svn:eol-style set to native
Line 
1#include "arx.h"
2namespace bdm {
3
4void ARX::bayes ( const vec &dt, const double w ) {
5        double lnc;
6
7        if ( frg < 1.0 ) {
8                est.pow ( frg );
9                if ( evalll ) {
10                        last_lognc = est.lognc();
11                }
12        }
13        V.opupdt ( dt, w );
14        nu += w;
15
16        // log(sqrt(2*pi)) = 0.91893853320467
17        if ( evalll ) {
18                lnc = est.lognc();
19                ll = lnc - last_lognc - 0.91893853320467;
20                last_lognc = lnc;
21        }
22}
23
24double ARX::logpred ( const vec &dt ) const {
25        egiw pred ( est );
26        ldmat &V = pred._V();
27        double &nu = pred._nu();
28
29        double lll;
30
31        if ( frg < 1.0 ) {
32                pred.pow ( frg );
33                lll = pred.lognc();
34        } else//should be save: last_lognc is changed only by bayes;
35                if ( evalll ) {
36                        lll = last_lognc;
37                } else {
38                        lll = pred.lognc();
39                }
40
41        V.opupdt ( dt, 1.0 );
42        nu += 1.0;
43        // log(sqrt(2*pi)) = 0.91893853320467
44        return pred.lognc() - lll - 0.91893853320467;
45}
46
47ARX* ARX::_copy_ ( ) const {
48        ARX* Tmp = new ARX ( *this );
49        return Tmp;
50}
51
52void ARX::set_statistics ( const BMEF* B0 ) {
53        const ARX* A0 = dynamic_cast<const ARX*> ( B0 );
54
55        bdm_assert_debug ( V.rows() == A0->V.rows(), "ARX::set_statistics Statistics  differ" );
56        set_statistics ( A0->dimx, A0->V, A0->nu );
57}
58
59enorm<ldmat>* ARX::epredictor ( const vec &rgr ) const {
60        int dim = dimx;//est.dimension();
61        mat mu ( dim, V.rows() - dim );
62        mat R ( dim, dim );
63
64        enorm<ldmat>* tmp;
65        tmp = new enorm<ldmat> ( );
66        //TODO: too hackish
67        if ( drv._dsize() > 0 ) {
68        }
69
70        est.mean_mat ( mu, R ); //mu =
71        //correction for student-t  -- TODO check if correct!!
72        //R*=nu/(nu-2);
73        mat p_mu = mu.T() * rgr;        //the result is one column
74        tmp->set_parameters ( p_mu.get_col ( 0 ), ldmat ( R ) );
75        return tmp;
76}
77
78mlnorm<ldmat>* ARX::predictor ( ) const {
79        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
83        mat mu ( dim, V.rows() - dim );
84        mat R ( dim, dim );
85        mlnorm<ldmat>* tmp;
86        tmp = new mlnorm<ldmat> ( );
87
88        est.mean_mat ( mu, R ); //mu =
89        mu = mu.T();
90        //correction for student-t  -- TODO check if correct!!
91
92        if ( dif == 0 ) { // no constant term
93                tmp->set_parameters ( mu, zeros ( dim ), ldmat ( R ) );
94        } else {
95                //Assume the constant term is the last one:
96                tmp->set_parameters ( mu.get_cols ( 0, mu.cols() - 2 ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ) );
97        }
98        return tmp;
99}
100
101mlstudent* ARX::predictor_student ( ) const {
102        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" );
105
106        mat mu ( dim, V.rows() - dim );
107        mat R ( dim, dim );
108        mlstudent* tmp;
109        tmp = new mlstudent ( );
110
111        est.mean_mat ( mu, R ); //
112        mu = mu.T();
113
114        int xdim = dimx;
115        int end = V._L().rows() - 1;
116        ldmat Lam ( V._L() ( xdim, end, xdim, end ), V._D() ( xdim, end ) );  //exp val of R
117
118
119        if ( dif == 0 ) { // no constant term
120                tmp->set_parameters ( mu, zeros ( xdim ), ldmat ( R ), Lam );
121        } else {
122                //Assume the constant term is the last one:
123                if ( mu.cols() > 1 ) {
124                        tmp->set_parameters ( mu.get_cols ( 0, mu.cols() - 2 ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ), Lam );
125                } else {
126                        tmp->set_parameters ( mat ( dim, 0 ), mu.get_col ( mu.cols() - 1 ), ldmat ( R ), Lam );
127                }
128        }
129        return tmp;
130}
131
132
133
134/*! \brief Return the best structure
135@param Eg a copy of GiW density that is being examined
136@param Eg0 a copy of prior GiW density before estimation
137@param Egll likelihood of the current Eg
138@param indeces current indeces
139\return best likelihood in the structure below the given one
140*/
141double egiw_bestbelow ( egiw Eg, egiw Eg0, double Egll, ivec &indeces ) { //parameter Eg is a copy!
142        ldmat Vo = Eg._V(); //copy
143        ldmat Vo0 = Eg._V(); //copy
144        ldmat& Vp = Eg._V(); // pointer into Eg
145        ldmat& Vp0 = Eg._V(); // pointer into Eg
146        int end = Vp.rows() - 1;
147        int i;
148        mat Li;
149        mat Li0;
150        double maxll = Egll;
151        double tmpll = Egll;
152        double belll = Egll;
153
154        ivec tmpindeces;
155        ivec maxindeces = indeces;
156
157
158        cout << "bb:(" << indeces << ") ll=" << Egll << endl;
159
160        //try to remove only one rv
161        for ( i = 0; i < end; i++ ) {
162                //copy original
163                Li = Vo._L();
164                Li0 = Vo0._L();
165                //remove stuff
166                Li.del_col ( i + 1 );
167                Li0.del_col ( i + 1 );
168                Vp.ldform ( Li, Vo._D() );
169                Vp0.ldform ( Li0, Vo0._D() );
170                tmpll = Eg.lognc() - Eg0.lognc(); // likelihood is difference of norm. coefs.
171
172                cout << "i=(" << i << ") ll=" << tmpll << endl;
173
174                //
175                if ( tmpll > Egll ) { //increase of the likelihood
176                        tmpindeces = indeces;
177                        tmpindeces.del ( i );
178                        //search for a better match in this substructure
179                        belll = egiw_bestbelow ( Eg, Eg0, tmpll, tmpindeces );
180                        if ( belll > maxll ) { //better match found
181                                maxll = belll;
182                                maxindeces = tmpindeces;
183                        }
184                }
185        }
186        indeces = maxindeces;
187        return maxll;
188}
189
190ivec ARX::structure_est ( egiw est0 ) {
191        ivec ind = linspace ( 1, est.dimension() - 1 );
192        egiw_bestbelow ( est, est0, est.lognc() - est0.lognc(), ind );
193        return ind;
194}
195
196
197
198ivec ARX::structure_est_LT ( egiw est0 ) {
199        //some stuff with beliefs etc.
200//      ivec ind = bdm::straux1(V,nu, est0._V(), est0._nu());
201        return ivec();//ind;
202}
203
204void ARX::from_setting ( const Setting &set ) {
205        shared_ptr<RV> yrv = UI::build<RV> ( set, "y", UI::compulsory );
206        shared_ptr<RV> rrv = UI::build<RV> ( set, "rgr", UI::compulsory );
207        int ylen = yrv->_dsize();
208        int rgrlen = rrv->_dsize();
209
210        string opt;
211        if ( UI::get(opt, set,  "options", UI::optional) ) {
212                BM::set_options(opt);
213        }
214
215        //init
216        mat V0;
217        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
222        double nu0;
223        if ( !UI::get ( nu0, set, "nu0" ) )
224                nu0 = rgrlen + ylen + 2;
225
226        double frg;
227        if ( !UI::get ( frg, set, "frg" ) )
228                frg = 1.0;
229
230        set_parameters ( frg );
231        set_statistics ( ylen, V0, nu0 );
232        set_drv ( concat ( *yrv, *rrv ) );
233
234        //name results (for logging)
235        set_rv ( RV ( "{theta r }", vec_2 ( ylen*rgrlen, ylen*ylen ) ) );
236
237}
238
239}
Note: See TracBrowser for help on using the browser.