root/bdm/stat/libEF.cpp @ 32

Revision 32, 3.5 kB (checked in by smidl, 17 years ago)

test KF : estimation of R in KF is not possible! Likelihood of y_t is growing when R -> 0

Line 
1#include <itpp/itbase.h>
2#include <itpp/base/bessel.h>
3#include "libEF.h"
4#include <math.h>
5
6using namespace itpp;
7
8Uniform_RNG UniRNG;
9Normal_RNG NorRNG;
10Gamma_RNG GamRNG;
11
12using std::cout;
13
14vec egamma::sample() const {
15        vec smp ( rv.count() );
16        int i;
17
18        for ( i=0; i<rv.count(); i++ ) {
19                GamRNG.setup ( alpha ( i ),beta ( i ) );
20                smp ( i ) = GamRNG();
21        }
22
23        return smp;
24}
25
26mat egamma::sample ( int N ) const {
27        mat Smp ( rv.count(),N );
28        int i,j;
29
30        for ( i=0; i<rv.count(); i++ ) {
31                GamRNG.setup ( alpha ( i ),beta ( i ) );
32
33                for ( j=0; j<N; j++ ) {
34                        Smp ( i,j ) = GamRNG();
35                }
36        }
37
38        return Smp;
39}
40
41double egamma::evalpdflog ( const vec &val ) const {
42        double res = 0.0; //will be added
43        int i;
44
45        for ( i=0; i<rv.count(); i++ ) {
46                res += ( alpha ( i ) - 1 ) *std::log ( val ( i ) ) + alpha ( i ) *std::log ( beta ( i ) ) - beta ( i ) *val ( i ) - lgamma ( alpha ( i ) );
47        }
48
49        return res;
50}
51
52//MGamma
53mgamma::mgamma ( const RV &rv,const RV &rvc ) : mEF ( rv,rvc ), epdf ( rv ) {vec* tmp; epdf._param ( tmp,_beta );};
54
55void mgamma::set_parameters ( double k0 ) {
56        k=k0;
57        ep = &epdf;
58        epdf.set_parameters ( k*ones ( rv.count() ),*_beta );
59};
60
61vec mgamma::samplecond ( vec &cond, double &ll ) {
62        *_beta=k / cond ;
63        vec smp = epdf.sample();
64        ll = epdf.evalpdflog ( smp );
65        return smp;
66};
67
68//Fixme repetition of mlnorm.samplecond.
69mat mgamma::samplecond ( vec &cond, vec &lik, int n ) {
70        int i;
71        int dim = rv.count();
72        mat Smp ( dim,n );
73        vec smp ( dim );
74        this->condition ( cond );
75
76        for ( i=0; i<n; i++ ) {
77                smp = epdf.sample();
78                lik ( i ) = epdf.eval ( smp );
79                Smp.set_col ( i ,smp );
80        }
81
82        return Smp;
83};
84
85ivec eEmp::resample ( RESAMPLING_METHOD method ) {
86        ivec ind=zeros_i ( n );
87        ivec N_babies = zeros_i ( n );
88        vec cumDist = cumsum ( w );
89        vec u ( n );
90        int i,j,parent;
91        double u0;
92
93        switch ( method ) {
94        case MULTINOMIAL:
95                u ( n - 1 ) = pow ( UniRNG.sample(), 1.0 / n );
96
97                for ( i = n - 2;i >= 0;i-- ) {
98                        u ( i ) = u ( i + 1 ) * pow ( UniRNG.sample(), 1.0 / ( i + 1 ) );
99                }
100
101                break;
102
103        case STRATIFIED:
104
105                for ( i = 0;i < n;i++ ) {
106                        u ( i ) = ( i + UniRNG.sample() ) / n;
107                }
108
109                break;
110
111        case SYSTEMATIC:
112                u0 = UniRNG.sample();
113
114                for ( i = 0;i < n;i++ ) {
115                        u ( i ) = ( i + u0 ) / n;
116                }
117
118                break;
119
120        default:
121                it_error ( "PF::resample(): Unknown resampling method" );
122        }
123
124        // U is now full
125        j = 0;
126
127        for ( i = 0;i < n;i++ ) {
128                while ( u ( i ) > cumDist ( j ) ) j++;
129
130                N_babies ( j ) ++;
131        }
132
133        // We have assigned new babies for each Particle
134        // Now, we fill the resulting index such that:
135        // * particles with at least one baby should not move *
136        // This assures that reassignment can be done inplace;
137
138        // find the first parent;
139        parent=0; while ( N_babies ( parent ) ==0 ) parent++;
140
141        // Build index
142        for ( i = 0;i < n;i++ ) {
143                if ( N_babies ( i ) > 0 ) {
144                        ind ( i ) = i;
145                        N_babies ( i ) --; //this index was now replicated;
146                } else {
147                        // test if the parent has been fully replicated
148                        // if yes, find the next one
149                        while ( ( N_babies ( parent ) ==0 ) || ( N_babies ( parent ) ==1 && parent>i ) ) parent++;
150
151                        // Replicate parent
152                        ind ( i ) = parent;
153
154                        N_babies ( parent ) --; //this index was now replicated;
155                }
156
157        }
158
159        // copy the internals according to ind
160        for ( i=0;i<n;i++ ) {
161                if ( ind ( i ) !=i ) {
162                        samples ( i ) =samples ( ind ( i ) );
163                }
164                w ( i ) = 1.0/n;
165        }
166
167        return ind;
168}
169
170void eEmp::set_parameters ( const vec &w0, epdf* epdf0 ) {
171//it_assert_debug(rv==epdf0->rv(),"Wrong epdf0");
172        w=w0;
173        w/=sum ( w0 );//renormalize
174        n=w.length();
175        samples.set_size ( n );
176
177        for ( int i=0;i<n;i++ ) {samples ( i ) =epdf0->sample();}
178}
Note: See TracBrowser for help on using the browser.