00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #if !defined(__MCMC_H)
00039 #define __MCMC_H
00040
00041
00042 #include <boost/any.hpp>
00043 #include <boost/format.hpp>
00044 #include <boost/progress.hpp>
00045
00046 #include "mcmc++/DataTable.h"
00047 #include "mcmc++/lot.h"
00048 #include "mcmc++/util.h"
00049 #include "mcmc++/statistics.h"
00050
00051 extern const double MCMC_ZERO_FREQ;
00052
00053 namespace MCMC {
00054 const double MinBetaPar = 1.0e-1;
00055 const double MaxBetaPar = 1.0e4;
00056 const double MinDirchPar = 1.0e-1;
00057 const double MaxDirchPar = 1.0e4;
00058 }
00059
00060 lot& GetRNG();
00061 double safeFreq(double p, double zero = MCMC_ZERO_FREQ);
00062 double invSafeFreq(double x, double zero = MCMC_ZERO_FREQ);
00063 std::vector<double> safeFreq(const std::vector<double>& p,
00064 const double zero);
00065 std::vector<double> invSafeFreq(const std::vector<double>& x,
00066 const double zero = MCMC_ZERO_FREQ);
00067
00068 double proposeBeta(double mean, double denom, double tolerance);
00069 double logQBeta(double newMean, double oldMean, double denom,
00070 double tolerance);
00071 std::vector<double> proposeDirch(const std::vector<double>& mean, double denom,
00072 double tolerance);
00073 double logQDirch(const std::vector<double>& newMean,
00074 const std::vector<double>& oldMean,
00075 double denom, double tolerance);
00076 double proposeNorm(double mean, double variance);
00077 double logQNorm(double newMean, double oldMean, double variance);
00078 double safeBetaPar(double x);
00079 void safeDirchPar(std::vector<double>& x);
00080
00081
00082
00083
00084 class ParameterBase {
00085 public:
00086 ParameterBase(std::string label);
00087 virtual ~ParameterBase(void);
00088
00089 virtual void Adapt(const double accept);
00090 void Assign(const boost::any& value);
00091 std::string Label(void) const;
00092 void SetLabel(const std::string& label);
00093 const boost::any Value(void) const;
00094
00095 private:
00096 std::string label_;
00097
00098 };
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 template <typename T>
00125 class ParameterT : public ParameterBase {
00126 public:
00127
00128
00129
00130
00131 ParameterT(std::string label)
00132 : ParameterBase(label)
00133 {}
00134
00135
00136
00137 virtual ~ParameterT(void) {}
00138
00139 public:
00140
00141
00142
00143
00144
00145
00146
00147
00148 virtual double llike(const T x) const {
00149 return 0.0;
00150 }
00151
00152
00153
00154
00155
00156 virtual double lPrior(const T x) const {
00157 return 0.0;
00158 }
00159
00160
00161
00162
00163
00164 virtual T propose(const T current) const {
00165 return current;
00166 }
00167
00168
00169
00170
00171
00172
00173 virtual double lQ(const T x, const T y) const {
00174 return 0.0;
00175 }
00176
00177
00178
00179
00180 void Assign(const T& x) {
00181 x_ = x;
00182 }
00183
00184
00185
00186 virtual const T Function(const bool doCalc = true) const {
00187 return x_;
00188 }
00189
00190
00191
00192 virtual const T Value(void) const {
00193 return x_;
00194 }
00195
00196 private:
00197 T x_;
00198
00199 };
00200
00201
00202
00203
00204
00205 class StepBase {
00206 public:
00207 StepBase(ParameterBase* parameter, unsigned long accept,
00208 unsigned long ct, const double w, const double m,
00209 const double lowBound, const double highBound);
00210 virtual ~StepBase(void);
00211
00212
00213
00214 virtual void DoStep(void) = 0;
00215
00216
00217
00218
00219
00220
00221 virtual void SetBounds(double low, double high) = 0;
00222
00223
00224
00225
00226
00227 virtual void SetW(double w) = 0;
00228
00229
00230
00231
00232
00233 virtual void SetM(int m) = 0;
00234
00235
00236
00237 const boost::any aValue(void) const;
00238 const double Value(void) const;
00239 const int iValue(void) const;
00240 const std::vector<double> dVecValue(void) const;
00241 const std::vector<int> iVecValue(void) const;
00242
00243 int accept(void) const;
00244 std::string Label(void) const;
00245 ParameterBase* Par(void) const;
00246 void ResetAccept(void);
00247 void SetLabel(const std::string& label);
00248
00249 protected:
00250 ParameterBase* par_;
00251 unsigned long accept_;
00252 unsigned long ct_;
00253
00254 double w_;
00255 double m_;
00256 double lowBound_;
00257 double highBound_;
00258
00259 };
00260
00261
00262
00263
00264 template <typename T>
00265 class Step : public StepBase {
00266 public:
00267
00268
00269
00270
00271 explicit Step(ParameterT<T>* parameter)
00272 : StepBase(parameter, 0, 0, 0.0, 0.0, 0.0, 0.0), rng_(GetRNG()),
00273 parT_(parameter)
00274 {}
00275
00276
00277
00278 virtual ~Step(void) {}
00279
00280 protected:
00281
00282
00283
00284
00285
00286
00287
00288
00289 Step(ParameterT<T>* parameter, double w, double m, double lowBound,
00290 double highBound)
00291 : StepBase(parameter, 0, 0, w, m, lowBound, highBound), rng_(GetRNG())
00292 {}
00293
00294 lot& rng_;
00295 ParameterT<T>* parT_;
00296
00297 };
00298
00299
00300
00301
00302 template <typename T>
00303 class MetroStepT : public Step<T> {
00304 public:
00305
00306
00307
00308
00309 explicit MetroStepT(ParameterT<T>* parameter)
00310 : Step<T>(parameter), met_(parameter),
00311 llike_(&ParameterT<T>::llike), lPrior_(&ParameterT<T>::lPrior),
00312 propose_(&ParameterT<T>::propose), lQ_(&ParameterT<T>::lQ)
00313 {}
00314
00315 protected:
00316
00317
00318
00319
00320
00321
00322
00323
00324 bool Accept(T& newX, T& oldX) {
00325 double piNew = (met_->*llike_)(newX) + (met_->*lPrior_)(newX);
00326 double piOld = (met_->*llike_)(oldX) + (met_->*lPrior_)(oldX);
00327 double qNew = (met_->*lQ_)(newX, oldX);
00328 double qOld = (met_->*lQ_)(oldX, newX);
00329
00330 double la = piNew + qOld - piOld - qNew;
00331 if (Step<T>::rng_.uniform() < exp(la)) {
00332 return true;
00333 } else {
00334 return false;
00335 }
00336 }
00337
00338
00339
00340
00341
00342 void Assign(const T& x) {
00343 met_->Assign(x);
00344 }
00345
00346
00347
00348 virtual void DoStep(void) {
00349 T val = boost::any_cast<T>(met_->Value());
00350 T xTry = (met_->*propose_)(val);
00351 if (Accept(xTry, val)) {
00352 ++Step<T>::accept_;
00353 met_->Assign(xTry);
00354 } else {
00355 met_->Assign(val);
00356 }
00357 }
00358
00359 protected:
00360 ParameterT<T>* met_;
00361
00362 private:
00363
00364
00365
00366
00367 const T Value(void) const {
00368 return met_->Value();
00369 }
00370
00371
00372
00373
00374
00375
00376 virtual void SetBounds(double low, double high)
00377 {}
00378
00379
00380
00381
00382
00383 virtual void SetW(double w)
00384 {}
00385
00386
00387
00388
00389
00390 virtual void SetM(int m)
00391 {}
00392
00393
00394
00395 typedef double(ParameterT<T>::*llikePtr)(const T) const;
00396
00397
00398 typedef double(ParameterT<T>::*lPriorPtr)(const T) const;
00399
00400
00401 typedef T(ParameterT<T>::*proposePtr)(const T) const;
00402
00403
00404 typedef double(ParameterT<T>::*lQPtr)(const T, const T) const;
00405
00406 const llikePtr llike_;
00407 const lPriorPtr lPrior_;
00408 const proposePtr propose_;
00409 const lQPtr lQ_;
00410
00411 };
00412
00413
00414
00415
00416
00417
00418
00419 template <typename T>
00420 class AdaptMetroStepT : public MetroStepT<T> {
00421 public:
00422
00423
00424
00425
00426
00427
00428
00429 explicit AdaptMetroStepT(ParameterT<T>* parameter,
00430 const unsigned long nBurnin,
00431 const unsigned long adapt,
00432 const unsigned long interval)
00433 : MetroStepT<T>(parameter),
00434 adapt_((nBurnin < 5000) ? 0: adapt),
00435 interval_(interval), ct_(0)
00436 {}
00437
00438
00439
00440 void DoStep(void) {
00441 T current = MetroStepT<T>::met_->Value();
00442 T xTry = MetroStepT<T>::met_->propose(current);
00443 if (Accept(xTry, current)) {
00444 ++Step<T>::accept_;
00445 MetroStepT<T>::met_->Assign(xTry);
00446 } else {
00447 MetroStepT<T>::met_->Assign(current);
00448 }
00449 ++ct_;
00450 if ((ct_ < adapt_) && ((ct_ % interval_) == 0)) {
00451 MetroStepT<T>::met_->Adapt(static_cast<double>(Step<T>::accept_)/ct_);
00452 }
00453 }
00454
00455 private:
00456
00457
00458
00459
00460
00461 virtual void SetBounds(double low, double high)
00462 {}
00463
00464
00465
00466
00467
00468 virtual void SetW(double w)
00469 {}
00470
00471
00472
00473
00474
00475 virtual void SetM(int m)
00476 {}
00477
00478 const unsigned long adapt_;
00479 const unsigned long interval_;
00480 unsigned long ct_;
00481
00482 };
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496 class SliceStep : public Step<double> {
00497 public:
00498 explicit SliceStep(ParameterT<double>* parameter);
00499
00500 void SetBounds(double low, double high);
00501 void SetW(double w);
00502 void SetM(int m);
00503
00504 protected:
00505 virtual void DoStep(void);
00506
00507 private:
00508 void Assign(const double x);
00509 void SetSlice(const double x);
00510 double Sample(const double x);
00511 const double Value(void) const;
00512
00513 double r_;
00514 double l_;
00515 double z_;
00516 unsigned long ct_;
00517
00518 static const double DefaultW;
00519 static const long MUnbounded;
00520
00521 typedef double(ParameterT<double>::*llikePtr)(const double) const;
00522 typedef double(ParameterT<double>::*lPriorPtr)(const double) const;
00523
00524 ParameterT<double>* dbl_;
00525 llikePtr llike_;
00526 lPriorPtr lPrior_;
00527
00528 };
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538 template<typename T>
00539 class FunctionStepT : public Step<T> {
00540 public:
00541
00542
00543
00544
00545 explicit FunctionStepT(ParameterT<T>* parameter)
00546 : Step<T>(parameter), func_(parameter)
00547 {}
00548
00549
00550
00551
00552
00553 const T Value(void) {
00554 return func_->Function();
00555 }
00556
00557 private:
00558
00559
00560
00561
00562 void DoStep(void) {
00563 func_->Assign(func_->Function());
00564 }
00565
00566
00567
00568
00569
00570
00571
00572
00573 void SetBounds(const double low, const double high)
00574 {}
00575
00576
00577
00578
00579
00580 void SetW(const double w)
00581 {}
00582
00583
00584
00585
00586
00587 void SetM(const int m)
00588 {}
00589
00590 ParameterT<T>* func_;
00591
00592 };
00593
00594 typedef std::vector<StepBase*> ModelSteps;
00595 typedef std::vector<boost::any> SampleVector;
00596 typedef SampleVector::const_iterator SampleIter;
00597 typedef std::vector<SampleVector> Results;
00598 typedef Results::const_iterator ResultsIter;
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613 class Model {
00614 public:
00615 virtual ~Model(void);
00616
00617 void Simulation(std::ostream& outf, bool interimReport);
00618 virtual void Summarize(int i, std::ostream& outf);
00619 std::string Label(int i) const;
00620 void ReportDic(std::ostream& outf);
00621
00622
00623
00624
00625 virtual void Record(const SampleVector& p);
00626 virtual void InterimReport(std::ostream& outf, std::string header,
00627 int progress, int goal);
00628 virtual void ReportHead(std::ostream& outf);
00629
00630 virtual void Report(std::ostream& outf, const int lastPar = -1);
00631 virtual double Llike(const SampleVector& par) const;
00632 void SetBurnIn(const int nBurnin);
00633 void SetSample(const int nSample);
00634 void SetThin(const int thin);
00635
00636 protected:
00637 Model(int nBurnin, int nSample, int nThin, bool calc = false,
00638 bool useMedian = false);
00639
00640 double percent(int k, int n) const;
00641 double percent(const std::vector<int>& x, int n) const;
00642 double percent(const std::vector<std::vector<int> >& x, int n) const;
00643
00644 int nBurnin_;
00645 int nSample_;
00646 int nThin_;
00647 unsigned nElem_;
00648 SimpleStatistic likelihood_;
00649
00650 ModelSteps step_;
00651 Results results_;
00652 virtual SampleVector Parameters(void) const;
00653
00654 boost::format* summaryFormat_;
00655
00656 private:
00657 void Reset(void);
00658 void Generation(void);
00659
00660 boost::progress_display* pd_;
00661 bool calculateLikelihood_;
00662 bool useMedian_;
00663
00664 };
00665
00666
00667
00668 typedef ParameterT<double> Parameter;
00669
00670
00671 typedef FunctionStepT<double> FunctionStep;
00672
00673
00674 typedef MetroStepT<double> MetroStep;
00675
00676 #endif
00677
00678
00679
00680