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

Revision 738, 6.8 kB (checked in by mido, 15 years ago)

a few moves of code from h to cpp, however, only part of the whole library is done

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