| 1 | #Require BysMcmc; |
|---|
| 2 | |
|---|
| 3 | NameBlock Build.Example.BSR(Text path.out, Text session.id, |
|---|
| 4 | Serie Y, Set X) |
|---|
| 5 | { |
|---|
| 6 | Real beta1 = Rand(-1,1); |
|---|
| 7 | Real beta2 = Rand(-1,beta1); |
|---|
| 8 | |
|---|
| 9 | NameBlock [[ |
|---|
| 10 | Text _.path.out = path.out; |
|---|
| 11 | Text _.session.id = session.id; |
|---|
| 12 | NameBlock _.bsr.ARMA.2_1 = [[ |
|---|
| 13 | Text _.dating.name = DatingName(Y); |
|---|
| 14 | Date _.first = First(Y); |
|---|
| 15 | Date _.last = Last(Y), |
|---|
| 16 | Matrix _.Y = SerMat(Y); |
|---|
| 17 | Matrix _.X = SerSetMat(X); |
|---|
| 18 | Set _.beta.ini = [[beta1, beta2]]; |
|---|
| 19 | |
|---|
| 20 | Text Get.Name(Real void) |
|---|
| 21 | { |
|---|
| 22 | Text "ObsY" |
|---|
| 23 | }; |
|---|
| 24 | |
|---|
| 25 | Text Get.Sigma2(Real void) |
|---|
| 26 | { |
|---|
| 27 | Text "sigma2" |
|---|
| 28 | }; |
|---|
| 29 | |
|---|
| 30 | Set Get.TimeInfo(Real void) |
|---|
| 31 | { |
|---|
| 32 | Set BSR.NoiseTimeInfo(TimeSet Eval(_.dating.name), _.first, _.last) |
|---|
| 33 | }; |
|---|
| 34 | |
|---|
| 35 | Real Get.ARIMA.Size(Real void) |
|---|
| 36 | { |
|---|
| 37 | Real 1 |
|---|
| 38 | }; |
|---|
| 39 | |
|---|
| 40 | Set Get.ARIMA.Factor(Real f) |
|---|
| 41 | { |
|---|
| 42 | Set ARIMAStruct(1, 1-0.1*B-0.1*B^2, 1-0.1*B, 1) |
|---|
| 43 | }; |
|---|
| 44 | |
|---|
| 45 | Real Get.Param.Size(Real void) |
|---|
| 46 | { |
|---|
| 47 | Real Rows(_.X) |
|---|
| 48 | }; |
|---|
| 49 | |
|---|
| 50 | Set Get.Param(Real iP) |
|---|
| 51 | { |
|---|
| 52 | Real value = If(iP>2, Real Rand(-1,1), |
|---|
| 53 | _.beta.ini[iP]); |
|---|
| 54 | Set Bsr.Param.Info("beta_"+IntText(iP), value, -1/0, 1/0) |
|---|
| 55 | }; |
|---|
| 56 | |
|---|
| 57 | Real Get.Missing.Size(Real void) |
|---|
| 58 | { |
|---|
| 59 | Real 0 |
|---|
| 60 | }; |
|---|
| 61 | |
|---|
| 62 | Set Get.Missing(Real iP) |
|---|
| 63 | { |
|---|
| 64 | Set Empty |
|---|
| 65 | }; |
|---|
| 66 | |
|---|
| 67 | Real Get.Equation.Size(Real void) |
|---|
| 68 | { |
|---|
| 69 | // _.X e _.Y están dispuestas por filas |
|---|
| 70 | // asi las ecuaciones estan por columnas |
|---|
| 71 | Real Columns(_.X) |
|---|
| 72 | }; |
|---|
| 73 | |
|---|
| 74 | Real Get.Equation.Output(Real iE) |
|---|
| 75 | { |
|---|
| 76 | Real MatDat(_.Y,1,iE) |
|---|
| 77 | }; |
|---|
| 78 | |
|---|
| 79 | Real Get.Equation.Input.Size(Real iE) |
|---|
| 80 | { |
|---|
| 81 | Real Rows(_.X) |
|---|
| 82 | }; |
|---|
| 83 | |
|---|
| 84 | Real Get.Equation.Input.Coef(Real iE, Real iT) |
|---|
| 85 | { |
|---|
| 86 | Real MatDat(_.X, iT,iE) |
|---|
| 87 | }; |
|---|
| 88 | |
|---|
| 89 | Text Get.Equation.Input.Param(Real iE, Real iT) |
|---|
| 90 | { |
|---|
| 91 | Text "beta_"+IntText(iT) |
|---|
| 92 | }; |
|---|
| 93 | |
|---|
| 94 | NameBlock Get.Constraints.Handler(Real void) |
|---|
| 95 | { |
|---|
| 96 | NameBlock BysMcmc::Bsr::Import::Explicit.Constraints([["0>=-beta_1+beta_2"]]) |
|---|
| 97 | } |
|---|
| 98 | ]]; |
|---|
| 99 | |
|---|
| 100 | Text Get.Doc.Model.Name(Real void) |
|---|
| 101 | { |
|---|
| 102 | Text "BSRExample" |
|---|
| 103 | }; |
|---|
| 104 | |
|---|
| 105 | Text Get.Doc.Model.Description(Real void) |
|---|
| 106 | { |
|---|
| 107 | Text "Modelo simple ARMA(2,1)" |
|---|
| 108 | }; |
|---|
| 109 | |
|---|
| 110 | Text Get.Doc.Session.Name(Real void) |
|---|
| 111 | { |
|---|
| 112 | Text _.session.id |
|---|
| 113 | }; |
|---|
| 114 | |
|---|
| 115 | Text Get.Doc.Session.Description(Real void) |
|---|
| 116 | { |
|---|
| 117 | Text "Session "+_.session.id+" para el modelo: " + |
|---|
| 118 | Get.Doc.Model.Name(0) + " " + Get.Doc.Model.Description(0) |
|---|
| 119 | }; |
|---|
| 120 | |
|---|
| 121 | Text Get.Doc.Session.Authors(Real void) |
|---|
| 122 | { |
|---|
| 123 | Text "user@bayesforecast.com" |
|---|
| 124 | }; |
|---|
| 125 | |
|---|
| 126 | Text Get.Doc.Path(Real void) |
|---|
| 127 | { |
|---|
| 128 | Text _.path.out |
|---|
| 129 | }; |
|---|
| 130 | |
|---|
| 131 | Real Get.LinReg.Size(Real void) |
|---|
| 132 | { |
|---|
| 133 | // para el ejemplo actual solo tenemos un segmento de regresión |
|---|
| 134 | Real 1 |
|---|
| 135 | }; |
|---|
| 136 | |
|---|
| 137 | NameBlock Get.LinReg.Segment(Real iS) |
|---|
| 138 | { |
|---|
| 139 | // en este caso retornamos el NameBlock para el único segmento |
|---|
| 140 | // que se modela para mas de un segmento de regresión se suele |
|---|
| 141 | // usar un Set que es indexado por iS: _bsr.blocks[iS] |
|---|
| 142 | NameBlock _.bsr.ARMA.2_1 |
|---|
| 143 | }; |
|---|
| 144 | |
|---|
| 145 | NameBlock Get.Constraints.Handler(Real void) |
|---|
| 146 | { |
|---|
| 147 | // retornamos un NameBlock predefinido para el caso |
|---|
| 148 | // no restringido |
|---|
| 149 | NameBlock BysMcmc::Bsr::Import::Unconstrained(0) |
|---|
| 150 | } |
|---|
| 151 | ]] |
|---|
| 152 | }; |
|---|
| 153 | |
|---|
| 154 | // Este seria el objeto config para la 1.1.7 |
|---|
| 155 | /* |
|---|
| 156 | NameBlock bsr.config = [[ |
|---|
| 157 | //MCMC dimensions |
|---|
| 158 | Real mcmc.burnin = 100; |
|---|
| 159 | Real mcmc.sampleLength = 2000; |
|---|
| 160 | Real mcmc.cacheLength = 100; |
|---|
| 161 | //Basic master configuration |
|---|
| 162 | Real basic.cholesky.epsilon = 1.E-10; |
|---|
| 163 | Real basic.cholesky.warningFreq = 100; |
|---|
| 164 | Real basic.truncMNormal.gibbsNumIter = 5; |
|---|
| 165 | //Report configuration |
|---|
| 166 | Real report.raftery.diag.q = 0.025; |
|---|
| 167 | Real report.raftery.diag.r = 0.007; |
|---|
| 168 | Real report.raftery.diag.s = 0.950; |
|---|
| 169 | Real report.raftery.diag.eps = 0.001; |
|---|
| 170 | Real report.acf.lag = 20, |
|---|
| 171 | Real report.histogram.parts = 100; |
|---|
| 172 | Real report.kerDens.points = 0; |
|---|
| 173 | //Generic flags |
|---|
| 174 | Real do.resume = False; |
|---|
| 175 | Real do.report = True; |
|---|
| 176 | Real do.eval = True; |
|---|
| 177 | Real do.linear.effects = True |
|---|
| 178 | ]]; |
|---|
| 179 | */ |
|---|
| 180 | |
|---|
| 181 | // El objeto config para la 2.0.1 es de tipo Config |
|---|
| 182 | BysMcmc::@Config bsr.config = BysMcmc::@Config::Default( 0 ); |
|---|
| 183 | |
|---|
| 184 | Serie WN = SubSer(Gaussian(0,1),y2000,y2008); |
|---|
| 185 | Polyn AR = (1-0.7*B)*(1-0.3*B); |
|---|
| 186 | Polyn MA = 1-0.2*B; |
|---|
| 187 | Ration Q = MA/AR; |
|---|
| 188 | Serie Z = DifEq(Q,WN); |
|---|
| 189 | Real K = 4; |
|---|
| 190 | Real beta1=Rand(-1,1); |
|---|
| 191 | Real beta2=Rand(-1,beta1); |
|---|
| 192 | Set BETA = [[beta1, beta2]]<<For(3,K, Real(Real ik) {Rand(-1,1)}); |
|---|
| 193 | Set X = For(1,K,Serie(Real _k) |
|---|
| 194 | { |
|---|
| 195 | Real s = Rand(0,1); |
|---|
| 196 | Real l = Rand(0,10); |
|---|
| 197 | Serie SubSer(Rand(l,l) + Gaussian(0,s),y2007,y2008)}); |
|---|
| 198 | |
|---|
| 199 | |
|---|
| 200 | Serie Y = SetSum(For(1,K,Serie(Real _k) |
|---|
| 201 | {Serie BETA[_k]*X[_k]})) + SubSer(Z,y2007,y2008); |
|---|
| 202 | |
|---|
| 203 | // Construye el NameBlock que implementa el interfaz Import |
|---|
| 204 | NameBlock bsr.import = Build.Example.BSR("/tmp/", Text "session01", Serie Y, Set X); |
|---|
| 205 | |
|---|
| 206 | // Si quiero escribir el archivo |
|---|
| 207 | Text file.bsr = BysMcmc::Bsr::Import::Write(bsr.import); |
|---|
| 208 | |
|---|
| 209 | // si quiero parserarlo |
|---|
| 210 | Set bsr.parsed = BSR.Parse(file.bsr, "joint"); |
|---|
| 211 | |
|---|
| 212 | // Esta seria la forma de estimar en la version 1.1.7 |
|---|
| 213 | /* |
|---|
| 214 | Set bsr.estim = { BysMcmc::Bsr::Gibbs::Estim |
|---|
| 215 | ( |
|---|
| 216 | Set modelDef = bsr.parsed, |
|---|
| 217 | NameBlock bsr.config |
|---|
| 218 | )}; |
|---|
| 219 | */ |
|---|
| 220 | |
|---|
| 221 | // Esta seria la forma de invocar Estim en la version 2.0.1 |
|---|
| 222 | |
|---|
| 223 | // Creo un Cycler |
|---|
| 224 | |
|---|
| 225 | // El partial handler es el objeto que implementara el |
|---|
| 226 | // condicionamiento, para este ejemplo usamos uno vacio. |
|---|
| 227 | BysMcmc::@McmcPartialHandler hdPartial = BysMcmc::@McmcPartialHandler::Null( 0 ); |
|---|
| 228 | |
|---|
| 229 | // El notifiar permite emitir notificaciones personalizadas de las |
|---|
| 230 | // etapas del gibbs. |
|---|
| 231 | BysMcmc::@Notifier notifier = BysMcmc::@Notifier::Null( 0 ); |
|---|
| 232 | |
|---|
| 233 | // El cycler se puede construir de 3 maneras |
|---|
| 234 | |
|---|
| 235 | BysMcmc::@Cycler cycler = BysMcmc::Bsr::Gibbs::GetCycler( bsr.import, |
|---|
| 236 | hdPartial, |
|---|
| 237 | bsr.config, |
|---|
| 238 | notifier ); |
|---|
| 239 | //Cycler cycler = GetCycler( file.bsr, hdPartial, bsr.config, notifier ); |
|---|
| 240 | //Cycler cycler = GetCycler( bsr.parsed, hdPartial, bsr.config, notifier ); |
|---|
| 241 | |
|---|
| 242 | // ahora la estimacion |
|---|
| 243 | BysMcmc::@Estimation EE = BysMcmc::@Estimation::New( cycler ); |
|---|
| 244 | |
|---|
| 245 | Real EE::Run( 0 ); |
|---|