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

Revision 990, 6.9 kB (checked in by smidl, 14 years ago)

ARX validate

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