dynare/matlab/doc/metropolis.html

394 lines
26 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>Description of metropolis</title>
<meta name="keywords" content="metropolis">
<meta name="description" content="stephane.adjemian@ens.fr [09-02-2005]">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">
<meta name="robots" content="index, follow">
<link type="text/css" rel="stylesheet" href="../m2html.css">
</head>
<body>
<a name="_top"></a>
<div><a href="../index.html">Home</a> &gt; <a href="index.html">.</a> &gt; metropolis.m</div>
<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
<td align="right"><a href="index.html">Index for .&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
<h1>metropolis
</h1>
<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="box"><strong>stephane.adjemian@ens.fr [09-02-2005]</strong></div>
<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="box"><strong>function metropolis(xparam1,vv,gend,data,rawdata,mh_bounds) </strong></div>
<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="fragment"><pre class="comment"> stephane.adjemian@ens.fr [09-02-2005]</pre></div>
<!-- crossreference -->
<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
This function calls:
<ul style="list-style-image:url(../matlabicon.gif)">
<li><a href="CheckPath.html" class="code" title="function DirectoryName = CheckPath(type)">CheckPath</a> 06-03-2005</li><li><a href="DsgeLikelihood.html" class="code" title="function [fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,gend,data)">DsgeLikelihood</a> stephane.adjemian@cepremap.cnrs.fr [09-07-2004]</li></ul>
This function is called by:
<ul style="list-style-image:url(../matlabicon.gif)">
<li><a href="dynare_estimation.html" class="code" title="function dynare_estimation(var_list_)">dynare_estimation</a> </li></ul>
<!-- crossreference -->
<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function metropolis(xparam1,vv,gend,data,rawdata,mh_bounds)</a>
0002 <span class="comment">% stephane.adjemian@ens.fr [09-02-2005]</span>
0003 <span class="keyword">global</span> M_ oo_ options_ bayestopt_ estim_params_
0004
0005 bayestopt_.penalty = 1e8;
0006
0007 MhDirectoryName = <a href="CheckPath.html" class="code" title="function DirectoryName = CheckPath(type)">CheckPath</a>(<span class="string">'metropolis'</span>);
0008
0009 nblck = options_.mh_nblck;
0010 nruns = ones(nblck,1)*options_.mh_replic;
0011 npar = length(xparam1);
0012 MAX_nruns = ceil(options_.MaxNumberOfBytes/(npar+2)/8);
0013 d = chol(vv);
0014 options_.lik_algo = 1;
0015 OpenOldFile = ones(nblck,1);
0016
0017 <span class="keyword">if</span> options_.load_mh_file == 0
0018 <span class="comment">% Here we start a new metropolis-hastings, previous draws are not</span>
0019 <span class="comment">% considered.</span>
0020 <span class="keyword">if</span> nblck &gt; 1
0021 disp(<span class="string">'MH: Multiple chains mode.'</span>)
0022 <span class="keyword">else</span>
0023 disp(<span class="string">'MH: One Chain mode.'</span>)
0024 <span class="keyword">end</span>
0025 <span class="comment">% Delete old mh files...</span>
0026 files = dir([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh*_blck*.mat'</span>]);
0027 <span class="keyword">if</span> length(files)
0028 delete([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh*_blck*.mat'</span>]);
0029 disp(<span class="string">'MH: Old _mh files succesfully erased!'</span>)
0030 <span class="keyword">end</span>
0031 <span class="comment">% Initial values...</span>
0032 <span class="keyword">if</span> nblck &gt; 1<span class="comment">% Case 1: multiple chains</span>
0033 disp(<span class="string">'MH: Searching for initial values...'</span>)
0034 ix2 = zeros(nblck,npar);
0035 ilogpo2 = zeros(nblck,1);
0036 <span class="keyword">for</span> j=1:nblck
0037 validate = 0;
0038 init_iter = 0;
0039 trial = 1;
0040 <span class="keyword">while</span> validate == 0 &amp; trial &lt;= 10
0041 candidate = options_.mh_init_scale*randn(1,npar)*d + transpose(xparam1);
0042 <span class="keyword">if</span> all(candidate' &gt; mh_bounds(:,1)) &amp; all(candidate' &lt; mh_bounds(:,2))
0043 ix2(j,:) = candidate;
0044 ilogpo2(j) = -<a href="DsgeLikelihood.html" class="code" title="function [fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,gend,data)">DsgeLikelihood</a>(ix2(j,:)',gend,data);
0045 j = j+1;
0046 validate = 1;
0047 <span class="keyword">end</span>
0048 init_iter = init_iter + 1;
0049 <span class="keyword">if</span> init_iter &gt; 100 &amp; validate == 0
0050 disp([<span class="string">'MH: I couldn''t get a valid initial value in 100 trials.'</span>])
0051 disp([<span class="string">'MH: You should Reduce mh_init_scale...'</span>])
0052 disp(sprintf(<span class="string">'MH: Parameter mh_init_scale is equal to %f.'</span>,options_.mh_init_scale))
0053 options_.mh_init_scale = input(<span class="string">'MH: Enter a new value... '</span>);
0054 trial = trial+1;
0055 <span class="keyword">end</span>
0056 <span class="keyword">end</span>
0057 <span class="keyword">if</span> trial &gt; 10 &amp; ~validate
0058 disp([<span class="string">'MH: I''m unable to find a starting value for block '</span> int2str(j)])
0059 <span class="keyword">return</span>
0060 <span class="keyword">end</span>
0061 <span class="keyword">end</span>
0062 disp(<span class="string">'MH: Initial values found!'</span>)
0063 disp(<span class="string">' '</span>)
0064 <span class="keyword">else</span><span class="comment">% Case 2: one chain (we start from the posterior mode)</span>
0065 candidate = transpose(xparam1);
0066 <span class="keyword">if</span> all(candidate' &gt; mh_bounds(:,1)) &amp; all(candidate' &lt; mh_bounds(:,2))
0067 ix2 = candidate;
0068 ilogpo2 = -<a href="DsgeLikelihood.html" class="code" title="function [fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,gend,data)">DsgeLikelihood</a>(ix2',gend,data);
0069 disp(<span class="string">'MH: Initialization at the posterior mode.'</span>)
0070 disp(<span class="string">' '</span>)
0071 <span class="keyword">else</span>
0072 disp(<span class="string">'MH: Initialization failed...'</span>)
0073 disp(<span class="string">'MH: The posterior mode lies outside the prior bounds.'</span>)
0074 <span class="keyword">return</span>
0075 <span class="keyword">end</span>
0076 <span class="keyword">end</span>
0077 fblck = 1;
0078 fline = ones(nblck,1);
0079 NewFile = ones(nblck,1);
0080 <span class="comment">% Creation of the mh-history file:</span>
0081 file = dir([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history.mat'</span>]);
0082 <span class="keyword">if</span> length(files)
0083 delete([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history.mat'</span>]);
0084 disp(<span class="string">'MH: Old mh_history file succesfully erased!'</span>)
0085 <span class="keyword">end</span>
0086 AnticipatedNumberOfFiles = floor(nruns(1)/MAX_nruns);
0087 AnticipatedNumberOfLinesInTheLastFile = nruns(1) - AnticipatedNumberOfFiles*MAX_nruns;
0088 record.Nblck = nblck;
0089 record.MhDraws = zeros(1,3);
0090 record.MhDraws(1,1) = nruns(1);
0091 record.MhDraws(1,2) = AnticipatedNumberOfFiles+1;
0092 record.MhDraws(1,3) = AnticipatedNumberOfLinesInTheLastFile;
0093 record.AcceptationRates = zeros(1,nblck);
0094 record.Seeds.Normal = randn(<span class="string">'state'</span>);
0095 record.Seeds.Unifor = rand(<span class="string">'state'</span>);
0096 record.InitialParameters = ix2;
0097 record.InitialLogLiK = ilogpo2;
0098 record.LastParameters = zeros(nblck,npar);
0099 record.LastLogLiK = zeros(nblck,1);
0100 record.LastFileNumber = AnticipatedNumberOfFiles+1;
0101 record.LastLineNumber = AnticipatedNumberOfLinesInTheLastFile;
0102 save([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history'</span>],<span class="string">'record'</span>);
0103 <span class="keyword">elseif</span> options_.load_mh_file == 1<span class="comment">% Here we consider previous mh files (previous mh did not crash).</span>
0104 disp(<span class="string">'MH: I''m loading past metropolis-hastings simulations...'</span>)
0105 file = dir([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history.mat'</span> ]);
0106 files = dir([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh*.mat'</span>]);
0107 <span class="keyword">if</span> ~length(files)
0108 disp(<span class="string">'MH:: FAILURE! there is no MH file to load here!'</span>)
0109 <span class="keyword">return</span>
0110 <span class="keyword">end</span>
0111 <span class="keyword">if</span> ~length(file)
0112 disp(<span class="string">'MH:: FAILURE! there is no MH-history file!'</span>)
0113 <span class="keyword">return</span>
0114 <span class="keyword">else</span>
0115 load([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history'</span>])
0116 <span class="keyword">end</span>
0117 past_number_of_blocks = record.Nblck;
0118 <span class="keyword">if</span> past_number_of_blocks ~= nblck
0119 disp(<span class="string">'MH:: The specified number of blocks doesn''t match with the previous number of blocks!'</span>)
0120 disp([<span class="string">'MH:: You declared '</span> int2str(nblck) <span class="string">' blocks, but the previous number of blocks was '</span> int2str(past_number_of_blocks) <span class="string">'.'</span>])
0121 disp([<span class="string">'MH:: I will run the Metropolis-Hastings with '</span> int2str(past_number_of_blocks) <span class="string">' blocks.'</span> ])
0122 nblck = past_number_of_blocks;
0123 options_.mh_nblck = nblck;
0124 <span class="keyword">end</span>
0125 <span class="comment">% I get the last line of the last mh-file for initialization</span>
0126 <span class="comment">% of the new metropolis-hastings simulations:</span>
0127 LastFileNumber = record.LastFileNumber;
0128 LastLineNumber = record.LastLineNumber;
0129 <span class="keyword">if</span> LastLineNumber &lt; MAX_nruns
0130 NewFile = ones(nblck,1)*LastFileNumber;
0131 <span class="keyword">else</span>
0132 NewFile = ones(nblck,1)*(LastFileNumber+1);
0133 <span class="keyword">end</span>
0134 ilogpo2 = record.LastLogLiK;
0135 ix2 = record.LastParameters;
0136 fblck = 1;
0137 fline = ones(nblck,1)*(LastLineNumber+1);
0138 NumberOfPreviousSimulations = sum(record.MhDraws(:,1),1);
0139 record.MhDraws = [record.MhDraws;zeros(1,3)];
0140 NumberOfDrawsWrittenInThePastLastFile = MAX_nruns - LastLineNumber;
0141 NumberOfDrawsToBeSaved = nruns(1) - NumberOfDrawsWrittenInThePastLastFile;
0142 AnticipatedNumberOfFiles = floor(NumberOfDrawsToBeSaved/MAX_nruns);
0143 AnticipatedNumberOfLinesInTheLastFile = NumberOfDrawsToBeSaved - AnticipatedNumberOfFiles*MAX_nruns;
0144 record.LastFileNumber = LastFileNumber + AnticipatedNumberOfFiles + 1;
0145 record.LastLineNumber = AnticipatedNumberOfLinesInTheLastFile;
0146 record.MhDraws(<span class="keyword">end</span>,1) = nruns(1);
0147 record.MhDraws(<span class="keyword">end</span>,2) = AnticipatedNumberOfFiles+1;
0148 record.MhDraws(<span class="keyword">end</span>,3) = AnticipatedNumberOfLinesInTheLastFile;
0149 randn(<span class="string">'state'</span>,record.Seeds.Normal);
0150 rand(<span class="string">'state'</span>,record.Seeds.Unifor);
0151 save([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history'</span>],<span class="string">'record'</span>);
0152 disp([<span class="string">'MH: ... It''s done. I''ve loaded '</span> int2str(NumberOfPreviousSimulations) <span class="string">' simulations.'</span>])
0153 disp(<span class="string">' '</span>)
0154 <span class="keyword">elseif</span> options_.load_mh_file == -1<span class="comment">% The previous metropolis-hastings</span>
0155 <span class="comment">% crashed before the end! I try to</span>
0156 <span class="comment">% recover the saved draws...</span>
0157 disp(<span class="string">'MH: Recover mode!'</span>)
0158 disp(<span class="string">' '</span>)
0159 file = dir([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history.mat'</span>]);
0160 <span class="keyword">if</span> ~length(file)
0161 disp(<span class="string">'MH:: FAILURE! there is no MH-history file!'</span>)
0162 <span class="keyword">return</span>
0163 <span class="keyword">else</span>
0164 load([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history'</span>])
0165 <span class="keyword">end</span>
0166 nblck = record.Nblck;
0167 options_.mh_nblck = nblck;
0168 <span class="keyword">if</span> size(record.MhDraws,1) == 1
0169 OldMh = 0;<span class="comment">% The crashed metropolis was the first session.</span>
0170 <span class="keyword">else</span>
0171 OldMh = 1;<span class="comment">% The crashed metropolis wasn't the first session.</span>
0172 <span class="keyword">end</span>
0173 <span class="comment">% Default initialization:</span>
0174 <span class="keyword">if</span> OldMh
0175 ilogpo2 = record.LastLogLiK;
0176 ix2 = record.LastParameters;
0177 <span class="keyword">else</span>
0178 ilogpo2 = record.InitialLogLiK;
0179 ix2 = record.InitialParameters;
0180 <span class="keyword">end</span>
0181 <span class="comment">% Set &quot;NewFile&quot;:</span>
0182 <span class="keyword">if</span> OldMh
0183 LastLineNumberInThePreviousMh = record.MhDraws(end-1,3);
0184 LastFileNumberInThePreviousMh = sum(record.MhDraws(1:end-1,2),1);
0185 <span class="keyword">if</span> LastLineNumberInThePreviousMh &lt; MAX_nruns
0186 NewFile = ones(nblck,1)*LastFileNumberInThePreviousMh;
0187 <span class="keyword">else</span>
0188 NewFile = ones(nblck,1)*(LastFileNumberInThePreviousMh+1);
0189 <span class="keyword">end</span>
0190 <span class="keyword">else</span>
0191 NewFile = ones(nblck,1);
0192 <span class="keyword">end</span>
0193 <span class="comment">% Set fline (First line):</span>
0194 <span class="keyword">if</span> OldMh
0195 fline = ones(nblck,1)*(record.MhDraws(end-1,3)+1);
0196 <span class="keyword">else</span>
0197 fline = ones(nblck,1);
0198 <span class="keyword">end</span>
0199 <span class="comment">% Set fblck (First block):</span>
0200 fblck = 1;
0201 <span class="comment">% How many mh files should we have ?</span>
0202 ExpectedNumberOfMhFilesPerBlock = sum(record.MhDraws(:,2),1);
0203 ExpectedNumberOfMhFiles = ExpectedNumberOfMhFilesPerBlock*nblck;
0204 <span class="comment">% I count the total number of saved mh files...</span>
0205 AllMhFiles = dir([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh*_blck*.mat'</span>]);
0206 TotalNumberOfMhFiles = length(AllMhFiles);
0207 <span class="comment">% I count the number of saved mh files per block</span>
0208 NumberOfMhFilesPerBlock = zeros(nblck,1);
0209 <span class="keyword">for</span> i = 1:nblck
0210 BlckMhFiles = dir([ MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh*_blck'</span> int2str(i) <span class="string">'.mat'</span>]);
0211 NumberOfMhFilesPerBlock(i) = length(BlckMhFiles);
0212 <span class="keyword">end</span>
0213 tmp = NumberOfMhFilesPerBlock(1); b = 1;
0214 <span class="comment">% Is there a chain with less mh files than the first chain ?</span>
0215 CrashedBlck = 1;
0216 <span class="keyword">while</span> b &lt;= nblck
0217 <span class="keyword">if</span> NumberOfMhFilesPerBlock(b) &lt; ExpectedNumberOfMhFilesPerBlock
0218 CrashedBlck = b;<span class="comment">% YES!</span>
0219 <span class="keyword">break</span>
0220 <span class="keyword">end</span>
0221 b = b+1;
0222 <span class="keyword">end</span>
0223 <span class="comment">% The new metropolis-hastings should start from (fblck=CrashedBlck)</span>
0224 fblck = CrashedBlck;
0225 <span class="comment">% How many mh-files are saved in this block ?</span>
0226 NumberOfSavedMhFilesInTheCrashedBlck = <span class="keyword">...</span>
0227 NumberOfMhFilesPerBlock(CrashedBlck);
0228 <span class="comment">% How many mh-files were saved in this block during the last session</span>
0229 <span class="comment">% (if there was a complete session before the crash) ?</span>
0230 <span class="keyword">if</span> OldMh
0231 ante = sum(record.MhDraws(1:end-1,2),1);
0232 load([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh'</span> int2str(ante) <span class="string">'_blck'</span> int2str(CrashedBlck) <span class="string">'.mat'</span>],<span class="string">'logpo2'</span>);
0233 <span class="keyword">if</span> length(logpo2) == MAX_nruns
0234 IsTheLastFileOfThePreviousMhFull = 1;
0235 <span class="keyword">else</span>
0236 IsTheLastFileOfThePreviousMhFull = 0;
0237 <span class="keyword">end</span>
0238 <span class="keyword">else</span>
0239 ante = 0;<span class="comment">% Because the crashed session is the first one</span>
0240 IsTheLastFileOfThePreviousMhFull = 1;
0241 <span class="keyword">end</span>
0242 <span class="keyword">if</span> ~IsTheLastFileOfThePreviousMhFull
0243 MhFileExist = 1;
0244 MhFileNumber = ante;
0245 <span class="keyword">while</span> MhFileExist
0246 MhFileNumber = MhFileNumber + 1;
0247 <span class="keyword">if</span> ~exist([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh'</span> int2str(MhFileNumber) <span class="string">'_blck'</span> int2str(CrashedBlck) <span class="string">'.mat'</span>])
0248 MhFileExist = 0;
0249 <span class="keyword">end</span>
0250 <span class="keyword">end</span>
0251 <span class="comment">% if MhFileNumber &gt; ExpectedNumberOfMhFilesPerBlock % Peut tre  dplacer plus haut...</span>
0252 <span class="comment">% disp('MH : You are using the recover mode but the previous session');</span>
0253 <span class="comment">% disp(' of the metropolis-hastings didn''t crash!')</span>
0254 <span class="comment">% disp('MH : I stop and you shoud modify your mod file.')</span>
0255 <span class="comment">% return</span>
0256 <span class="comment">% else</span>
0257 NumberOfCompletedMhFiles = (MhFileNumber-1)-ante;
0258 <span class="comment">% How many runs were saved ?</span>
0259 <span class="keyword">if</span> OldMh
0260 reste = MAX_nruns-record.MhDraws(end-1,3);
0261 <span class="keyword">else</span>
0262 reste = 0
0263 <span class="keyword">end</span>
0264 NumberOfSavedDraws = MAX_nruns*(NumberOfCompletedMhFiles) + reste;
0265 <span class="comment">% Here is the number of draws we still need to complete the block:</span>
0266 nruns(CrashedBlck) = nruns(CrashedBlck)-NumberOfSavedDraws;
0267 <span class="comment">% I initialize with the last saved mh file of the inccomplete</span>
0268 <span class="comment">% block:</span>
0269 load([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh'</span> int2str(MhFileNumber-1) <span class="string">'_blck'</span> int2str(CrashedBlck) <span class="string">'.mat'</span>]);
0270 ilogpo2(CrashedBlck) = logpo2(end);
0271 ix2(CrashedBlck,:) = x2(<span class="keyword">end</span>,:);
0272 NewFile(CrashedBlck) = MhFileNumber;
0273 fline(CrashedBlck,1) = 1;
0274 <span class="keyword">else</span>
0275 <span class="comment">% creuser ce qui se passe dans ce cas !</span>
0276 OpenOldFile(CrashedBlck) = 0;
0277 disp(<span class="string">'Ok'</span>)
0278 <span class="keyword">end</span>
0279 <span class="keyword">end</span><span class="comment">% of (if options_.load_mh_file == {0,1 or -1})</span>
0280 <span class="comment">%%%%</span>
0281 <span class="comment">%%%% NOW i run the (nblck-fblck+1) metropolis-hastings chains</span>
0282 <span class="comment">%%%%</span>
0283 InitSizeArray = min([MAX_nruns*ones(nblck) nruns],[],2);
0284 <span class="keyword">for</span> b = fblck:nblck
0285 <span class="keyword">if</span> (options_.load_mh_file~=0) &amp; (fline(b)&gt;1) &amp; OpenOldFile(b)
0286 load([<span class="string">'./'</span> MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh'</span> int2str(NewFile(b)) <span class="keyword">...</span>
0287 <span class="string">'_blck'</span> int2str(b) <span class="string">'.mat'</span>])
0288 x2 = [x2;zeros(InitSizeArray(b)-fline(b)+1,npar)];
0289 logpo2 = [logpo2;zeros(InitSizeArray(b)-fline(b)+1,1)];
0290 OpenOldFile(b) = 0;
0291 <span class="keyword">else</span>
0292 x2 = zeros(InitSizeArray(b),npar);
0293 logpo2 = zeros(InitSizeArray(b),1);
0294 <span class="keyword">end</span>
0295 hh = waitbar(0,[<span class="string">'Please wait... Metropolis-Hastings ('</span> int2str(b) <span class="string">'/'</span> int2str(nblck) <span class="string">')...'</span>]);
0296 set(hh,<span class="string">'Name'</span>,<span class="string">'Metropolis-Hastings'</span>)
0297 isux = 0;
0298 irun = fline(b);
0299 j = 1;
0300 <span class="keyword">while</span> j &lt;= nruns(b)
0301 par = randn(1,npar)*d;
0302 par = par.*bayestopt_.jscale' + ix2(b,:);
0303 <span class="keyword">if</span> all(par'&gt;mh_bounds(:,1)) &amp; all(par'&lt;mh_bounds(:,2))
0304 logpost = -<a href="DsgeLikelihood.html" class="code" title="function [fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,gend,data)">DsgeLikelihood</a>(par',gend,data);
0305 <span class="keyword">else</span>
0306 logpost = -inf;
0307 <span class="keyword">end</span>
0308 <span class="keyword">if</span> (logpost &gt; -inf) &amp; (log(rand) &lt; logpost-ilogpo2(b))
0309 x2(irun,:) = par;
0310 ix2(b,:) = par;
0311 logpo2(irun) = logpost;
0312 ilogpo2(b) = logpost;
0313 isux = isux + 1;
0314 <span class="keyword">else</span>
0315 x2(irun,:) = ix2(b,:);
0316 logpo2(irun) = ilogpo2(b);
0317 <span class="keyword">end</span>
0318 prtfrc = j/nruns(b);
0319 waitbar(prtfrc,hh,[ <span class="string">'('</span> int2str(b) <span class="string">'/'</span> int2str(nblck) <span class="string">') '</span> sprintf(<span class="string">'%f done, acceptation rate %f'</span>,prtfrc,isux/j)]);
0320 <span class="keyword">if</span> (irun == InitSizeArray(b)) | (j == nruns(b)) <span class="comment">% Now I save the simulations</span>
0321 save([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh'</span> int2str(NewFile(b)) <span class="string">'_blck'</span> int2str(b)],<span class="string">'x2'</span>,<span class="string">'logpo2'</span>);
0322 InitSizeArray(b) = min(nruns(b)-j,MAX_nruns);
0323 <span class="keyword">if</span> j == nruns(b) <span class="comment">% I record the last draw...</span>
0324 record.LastParameters(b,:) = x2(<span class="keyword">end</span>,:);
0325 record.LastLogLiK(b) = logpo2(end);
0326 <span class="keyword">end</span>
0327 <span class="keyword">if</span> InitSizeArray(b)
0328 x2 = zeros(InitSizeArray(b),npar);
0329 logpo2 = zeros(InitSizeArray(b),1);
0330 NewFile(b) = NewFile(b) + 1;
0331 irun = 0;
0332 <span class="keyword">else</span> <span class="comment">% InitSizeArray is equal to zero because we are at the end of an mc chain.</span>
0333 InitSizeArray(b) = min(nruns(b),MAX_nruns);
0334 <span class="keyword">end</span>
0335 <span class="keyword">end</span>
0336 j=j+1;
0337 irun = irun + 1;
0338 <span class="keyword">end</span><span class="comment">% End of the simulations for one mh-block.</span>
0339 record.AcceptationRates(b) = isux/j;
0340 close(hh);
0341 <span class="keyword">end</span><span class="comment">% End of the loop over the mh-blocks.</span>
0342 record.Seeds.Normal = randn(<span class="string">'state'</span>);
0343 record.Seeds.Unifor = rand(<span class="string">'state'</span>);
0344 save([MhDirectoryName <span class="string">'/'</span> M_.fname <span class="string">'_mh_history'</span>],<span class="string">'record'</span>);
0345 disp([<span class="string">'MH: Number of mh files : '</span> int2str(NewFile(1)) <span class="string">' per block.'</span>])
0346 disp([<span class="string">'MH: Total number of generated files : '</span> int2str(NewFile(1)*nblck) <span class="string">'.'</span>])
0347 disp([<span class="string">'MH: Total number of iterations : '</span> int2str((NewFile(1)-1)*MAX_nruns+irun-1) <span class="string">'.'</span>])
0348 disp(<span class="string">' '</span>)</pre></div>
<hr><address>Generated on Fri 16-Jun-2006 09:09:06 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
</body>
</html>