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

Revision 996, 7.3 kB (checked in by smidl, 14 years ago)

Scheduling of forgetting factor

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