dynare/matlab/doc/DiffuseLikelihood3.html

348 lines
18 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 DiffuseLikelihood3</title>
<meta name="keywords" content="DiffuseLikelihood3">
<meta name="description" content="M. Ratto added lik in output [October 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; DiffuseLikelihood3.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>DiffuseLikelihood3
</h1>
<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="box"><strong>M. Ratto added lik in output [October 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 [LIK, lik] = DiffuseLikelihood3(T,R,Q,Pinf,Pstar,Y,trend,start)%//Z,T,R,Q,Pinf,Pstar,Y) </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"> M. Ratto added lik in output [October 2005]
changes by M. Ratto [April 2005]
introduced new options options_.diffuse_d for termination of DKF
new icc counter for Finf steps in DKF
new termination for DKF
likelihood terms for Fstar must be cumulated in DKF also when Pinf is non
zero.
[4/5/2005] correctyed bug in the modified verson of Ratto for rank of Pinf
introduced a specific crit1 for the DKF termination
stepane.adjemian@cepremap.cnrs.fr [07-19-2004]
See &quot;Filtering and Smoothing of State Vector for Diffuse State Space
Models&quot;, S.J. Koopman and J. Durbin (2003, in Journal of Time Series
Analysis, vol. 24(1), pp. 85-98).
Case where F_{\infty,t} is singular ==&gt; Univariate treatment of multivariate
time series.
THE PROBLEM:
y_t = Z_t * \alpha_t + \varepsilon_t
\alpha_{t+1} = T_t * \alpha_t + R_t * \eta_t
with:
\alpha_1 = a + A*\delta + R_0*\eta_0
m*q matrix A and m*(m-q) matrix R_0 are selection matrices (their
columns constitue all the columns of the m*m identity matrix) so that
A'*R_0 = 0 and A'*\alpha_1 = \delta
We assume that the vector \delta is distributed as a N(0,\kappa*I_q)
for a given \kappa &gt; 0. So that the expectation of \alpha_1 is a and
its variance is P, with
P = \kappa*P_{\infty} + P_{\star}
P_{\infty} = A*A'
P_{\star} = R_0*Q_0*R_0'
P_{\infty} is a m*m diagonal matrix with q ones and m-q zeros.
and where:
y_t is a pp*1 vector
\alpha_t is a mm*1 vector
\varepsilon_t is a pp*1 multivariate random variable (iid N(0,H_t))
\eta_t is a rr*1 multivariate random variable (iid N(0,Q_t))
a_1 is a mm*1 vector
Z_t is a pp*mm matrix
T_t is a mm*mm matrix
H_t is a pp*pp matrix
R_t is a mm*rr matrix
Q_t is a rr*rr matrix
P_1 is a mm*mm matrix
FILTERING EQUATIONS:
v_t = y_t - Z_t* a_t
F_t = Z_t * P_t * Z_t' + H_t
K_t = T_t * P_t * Z_t' * F_t^{-1}
L_t = T_t - K_t * Z_t
a_{t+1} = T_t * a_t + K_t * v_t
P_{t+1} = T_t * P_t * L_t' + R_t*Q_t*R_t'
DIFFUSE FILTERING EQUATIONS:
a_{t+1} = T_t*a_t + K_{\ast,t}v_t
P_{\infty,t+1} = T_t*P_{\infty,t}*T_t'
P_{\ast,t+1} = T_t*P_{\ast,t}*L_{\ast,t}' + R_t*Q_t*R_t'
K_{\ast,t} = T_t*P_{\ast,t}*Z_t'*F_{\ast,t}^{-1}
v_t = y_t - Z_t*a_t
L_{\ast,t} = T_t - K_{\ast,t}*Z_t
F_{\ast,t} = Z_t*P_{\ast,t}*Z_t' + H_t</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)">
</ul>
This function is called by:
<ul style="list-style-image:url(../matlabicon.gif)">
<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>
<!-- 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 [LIK, lik] = DiffuseLikelihood3(T,R,Q,Pinf,Pstar,Y,trend,start)</a><span class="comment">%//Z,T,R,Q,Pinf,Pstar,Y)</span>
0002 <span class="comment">% M. Ratto added lik in output [October 2005]</span>
0003 <span class="comment">% changes by M. Ratto [April 2005]</span>
0004 <span class="comment">% introduced new options options_.diffuse_d for termination of DKF</span>
0005 <span class="comment">% new icc counter for Finf steps in DKF</span>
0006 <span class="comment">% new termination for DKF</span>
0007 <span class="comment">% likelihood terms for Fstar must be cumulated in DKF also when Pinf is non</span>
0008 <span class="comment">% zero.</span>
0009 <span class="comment">%</span>
0010 <span class="comment">% [4/5/2005] correctyed bug in the modified verson of Ratto for rank of Pinf</span>
0011 <span class="comment">% introduced a specific crit1 for the DKF termination</span>
0012 <span class="comment">%</span>
0013 <span class="comment">% stepane.adjemian@cepremap.cnrs.fr [07-19-2004]</span>
0014 <span class="comment">%</span>
0015 <span class="comment">% See &quot;Filtering and Smoothing of State Vector for Diffuse State Space</span>
0016 <span class="comment">% Models&quot;, S.J. Koopman and J. Durbin (2003, in Journal of Time Series</span>
0017 <span class="comment">% Analysis, vol. 24(1), pp. 85-98).</span>
0018 <span class="comment">%</span>
0019 <span class="comment">% Case where F_{\infty,t} is singular ==&gt; Univariate treatment of multivariate</span>
0020 <span class="comment">% time series.</span>
0021 <span class="comment">%</span>
0022 <span class="comment">% THE PROBLEM:</span>
0023 <span class="comment">%</span>
0024 <span class="comment">% y_t = Z_t * \alpha_t + \varepsilon_t</span>
0025 <span class="comment">% \alpha_{t+1} = T_t * \alpha_t + R_t * \eta_t</span>
0026 <span class="comment">%</span>
0027 <span class="comment">% with:</span>
0028 <span class="comment">%</span>
0029 <span class="comment">% \alpha_1 = a + A*\delta + R_0*\eta_0</span>
0030 <span class="comment">%</span>
0031 <span class="comment">% m*q matrix A and m*(m-q) matrix R_0 are selection matrices (their</span>
0032 <span class="comment">% columns constitue all the columns of the m*m identity matrix) so that</span>
0033 <span class="comment">%</span>
0034 <span class="comment">% A'*R_0 = 0 and A'*\alpha_1 = \delta</span>
0035 <span class="comment">%</span>
0036 <span class="comment">% We assume that the vector \delta is distributed as a N(0,\kappa*I_q)</span>
0037 <span class="comment">% for a given \kappa &gt; 0. So that the expectation of \alpha_1 is a and</span>
0038 <span class="comment">% its variance is P, with</span>
0039 <span class="comment">%</span>
0040 <span class="comment">% P = \kappa*P_{\infty} + P_{\star}</span>
0041 <span class="comment">%</span>
0042 <span class="comment">% P_{\infty} = A*A'</span>
0043 <span class="comment">% P_{\star} = R_0*Q_0*R_0'</span>
0044 <span class="comment">%</span>
0045 <span class="comment">% P_{\infty} is a m*m diagonal matrix with q ones and m-q zeros.</span>
0046 <span class="comment">%</span>
0047 <span class="comment">%</span>
0048 <span class="comment">% and where:</span>
0049 <span class="comment">%</span>
0050 <span class="comment">% y_t is a pp*1 vector</span>
0051 <span class="comment">% \alpha_t is a mm*1 vector</span>
0052 <span class="comment">% \varepsilon_t is a pp*1 multivariate random variable (iid N(0,H_t))</span>
0053 <span class="comment">% \eta_t is a rr*1 multivariate random variable (iid N(0,Q_t))</span>
0054 <span class="comment">% a_1 is a mm*1 vector</span>
0055 <span class="comment">%</span>
0056 <span class="comment">% Z_t is a pp*mm matrix</span>
0057 <span class="comment">% T_t is a mm*mm matrix</span>
0058 <span class="comment">% H_t is a pp*pp matrix</span>
0059 <span class="comment">% R_t is a mm*rr matrix</span>
0060 <span class="comment">% Q_t is a rr*rr matrix</span>
0061 <span class="comment">% P_1 is a mm*mm matrix</span>
0062 <span class="comment">%</span>
0063 <span class="comment">%</span>
0064 <span class="comment">% FILTERING EQUATIONS:</span>
0065 <span class="comment">%</span>
0066 <span class="comment">% v_t = y_t - Z_t* a_t</span>
0067 <span class="comment">% F_t = Z_t * P_t * Z_t' + H_t</span>
0068 <span class="comment">% K_t = T_t * P_t * Z_t' * F_t^{-1}</span>
0069 <span class="comment">% L_t = T_t - K_t * Z_t</span>
0070 <span class="comment">% a_{t+1} = T_t * a_t + K_t * v_t</span>
0071 <span class="comment">% P_{t+1} = T_t * P_t * L_t' + R_t*Q_t*R_t'</span>
0072 <span class="comment">%</span>
0073 <span class="comment">%</span>
0074 <span class="comment">% DIFFUSE FILTERING EQUATIONS:</span>
0075 <span class="comment">%</span>
0076 <span class="comment">% a_{t+1} = T_t*a_t + K_{\ast,t}v_t</span>
0077 <span class="comment">% P_{\infty,t+1} = T_t*P_{\infty,t}*T_t'</span>
0078 <span class="comment">% P_{\ast,t+1} = T_t*P_{\ast,t}*L_{\ast,t}' + R_t*Q_t*R_t'</span>
0079 <span class="comment">% K_{\ast,t} = T_t*P_{\ast,t}*Z_t'*F_{\ast,t}^{-1}</span>
0080 <span class="comment">% v_t = y_t - Z_t*a_t</span>
0081 <span class="comment">% L_{\ast,t} = T_t - K_{\ast,t}*Z_t</span>
0082 <span class="comment">% F_{\ast,t} = Z_t*P_{\ast,t}*Z_t' + H_t</span>
0083 <span class="keyword">global</span> bayestopt_ options_
0084
0085 mf = bayestopt_.mf;
0086 pp = size(Y,1);
0087 mm = size(T,1);
0088 smpl = size(Y,2);
0089 a = zeros(mm,1);
0090 QQ = R*Q*transpose(R);
0091 t = 0;
0092 lik = zeros(smpl+1,1);
0093 lik(smpl+1) = smpl*pp*log(2*pi); <span class="comment">%% the constant of minus two times the log-likelihood</span>
0094 notsteady = 1;
0095 crit = options_.kalman_tol;
0096 crit1 = 1.e-6;
0097 newRank = rank(Pinf,crit1);
0098 icc=0;
0099 <span class="keyword">while</span> newRank &amp; t &lt; smpl
0100 t = t+1;
0101 <span class="keyword">for</span> i=1:pp
0102 v(i) = Y(i,t)-a(mf(i))-trend(i,t);
0103 Fstar = Pstar(mf(i),mf(i));
0104 Finf = Pinf(mf(i),mf(i));
0105 Kstar = Pstar(:,mf(i));
0106 <span class="keyword">if</span> Finf &gt; crit &amp; newRank, <span class="comment">%added newRank criterion</span>
0107 icc=icc+1;
0108 Kinf = Pinf(:,mf(i));
0109 a = a + Kinf*v(i)/Finf;
0110 Pstar = Pstar + Kinf*transpose(Kinf)*Fstar/(Finf*Finf) - <span class="keyword">...</span>
0111 (Kstar*transpose(Kinf)+Kinf*transpose(Kstar))/Finf;
0112 Pinf = Pinf - Kinf*transpose(Kinf)/Finf;
0113 lik(t) = lik(t) + log(Finf);
0114 <span class="comment">% start new termination criterion for DKF</span>
0115 <span class="keyword">if</span> ~isempty(options_.diffuse_d),
0116 newRank = (icc&lt;options_.diffuse_d);
0117 <span class="comment">%if newRank &amp; any(diag(Pinf(mf,mf))&gt;crit)==0; % M. Ratto this line is BUGGY</span>
0118 <span class="keyword">if</span> newRank &amp; (any(diag(Pinf(mf,mf))&gt;crit)==0 &amp; rank(Pinf,crit1)==0);
0119 options_.diffuse_d = icc;
0120 newRank=0;
0121 disp(<span class="string">'WARNING: Change in OPTIONS_.DIFFUSE_D in univariate DKF'</span>)
0122 disp([<span class="string">'new OPTIONS_.DIFFUSE_D = '</span>,int2str(icc)])
0123 disp(<span class="string">'You may have to reset the optimisation'</span>)
0124 <span class="keyword">end</span>
0125 <span class="keyword">else</span>
0126 <span class="comment">%newRank = any(diag(Pinf(mf,mf))&gt;crit); % M. Ratto this line is BUGGY</span>
0127 newRank = (any(diag(Pinf(mf,mf))&gt;crit) | rank(Pinf,crit1));
0128 <span class="keyword">if</span> newRank==0,
0129 P0= T*Pinf*transpose(T);
0130 <span class="comment">%newRank = any(diag(P0(mf,mf))&gt;crit); % M. Ratto this line is BUGGY</span>
0131 newRank = (any(diag(P0(mf,mf))&gt;crit) | rank(P0,crit1)); <span class="comment">% M. Ratto 11/10/2005</span>
0132 <span class="keyword">if</span> newRank==0,
0133 options_.diffuse_d = icc;
0134 <span class="keyword">end</span>
0135 <span class="keyword">end</span>
0136 <span class="keyword">end</span>,
0137 <span class="comment">% end new termination and checks for DKF</span>
0138 <span class="keyword">elseif</span> Fstar &gt; crit
0139 <span class="comment">%% Note that : (1) rank(Pinf)=0 implies that Finf = 0, (2) outside this loop (when for some i and t the condition</span>
0140 <span class="comment">%% rank(Pinf)=0 is satisfied we have P = Pstar and F = Fstar and (3) Finf = 0 does not imply that</span>
0141 <span class="comment">%% rank(Pinf)=0. [stphane,11-03-2004].</span>
0142 <span class="comment">%if rank(Pinf,crit) == 0</span>
0143 <span class="comment">% the likelihood terms should alwasy be cumulated, not only</span>
0144 <span class="comment">% when Pinf=0, otherwise the lik would depend on the ordering</span>
0145 <span class="comment">% of observed variables</span>
0146 <span class="comment">% presample options can be used to ignore initial time points</span>
0147 lik(t) = lik(t) + log(Fstar) + v(i)*v(i)/Fstar;
0148 <span class="comment">%end</span>
0149 a = a + Kstar*v(i)/Fstar;
0150 Pstar = Pstar - Kstar*transpose(Kstar)/Fstar;
0151 <span class="keyword">else</span>
0152 <span class="comment">%disp(['zero F term in DKF for observed ',int2str(i),' ',num2str(Fstar)])</span>
0153 <span class="keyword">end</span>
0154 <span class="keyword">end</span>
0155 <span class="comment">% if all(abs(Pinf(:))&lt;crit),</span>
0156 <span class="comment">% oldRank = 0;</span>
0157 <span class="comment">% else</span>
0158 <span class="comment">% oldRank = rank(Pinf,crit);</span>
0159 <span class="comment">% end</span>
0160 <span class="keyword">if</span> newRank,
0161 oldRank = rank(Pinf,crit1);
0162 <span class="keyword">else</span>
0163 oldRank = 0;
0164 <span class="keyword">end</span>
0165 a = T*a;
0166 Pstar = T*Pstar*transpose(T)+QQ;
0167 Pinf = T*Pinf*transpose(T);
0168 <span class="comment">% if all(abs(Pinf(:))&lt;crit),</span>
0169 <span class="comment">% newRank = 0;</span>
0170 <span class="comment">% else</span>
0171 <span class="comment">% newRank = rank(Pinf,crit);</span>
0172 <span class="comment">% end</span>
0173 <span class="keyword">if</span> newRank,
0174 newRank = rank(Pinf,crit1); <span class="comment">% new crit1 is used</span>
0175 <span class="keyword">end</span>
0176 <span class="keyword">if</span> oldRank ~= newRank
0177 disp(<span class="string">'DiffuseLiklihood3 :: T does influence the rank of Pinf!'</span>)
0178 <span class="keyword">end</span>
0179 <span class="keyword">end</span>
0180 <span class="keyword">if</span> t == smpl
0181 error([<span class="string">'There isn''t enough information to estimate the initial'</span> <span class="keyword">...</span><span class="comment"> </span>
0182 <span class="string">' conditions of the nonstationary variables'</span>]);
0183 <span class="keyword">end</span>
0184 <span class="keyword">while</span> notsteady &amp; t &lt; smpl
0185 t = t+1;
0186 oldP = Pstar;
0187 <span class="keyword">for</span> i=1:pp
0188 v(i) = Y(i,t) - a(mf(i)) - trend(i,t);
0189 Fi = Pstar(mf(i),mf(i));
0190 <span class="keyword">if</span> Fi &gt; crit
0191 Ki = Pstar(:,mf(i));
0192 a = a + Ki*v(i)/Fi;
0193 Pstar = Pstar - Ki*transpose(Ki)/Fi;
0194 lik(t) = lik(t) + log(Fi) + v(i)*v(i)/Fi;
0195 <span class="keyword">else</span>
0196 <span class="comment">%disp(['zero F term for observed ',int2str(i),' ',num2str(Fi)])</span>
0197 <span class="keyword">end</span>
0198 <span class="keyword">end</span>
0199 a = T*a;
0200 Pstar = T*Pstar*transpose(T) + QQ;
0201 notsteady = ~(max(max(abs(Pstar-oldP)))&lt;crit);
0202 <span class="keyword">end</span>
0203 <span class="keyword">while</span> t &lt; smpl
0204 t = t+1;
0205 Pstar = oldP;
0206 <span class="keyword">for</span> i=1:pp
0207 v(i) = Y(i,t) - a(mf(i)) - trend(i,t);
0208 Fi = Pstar(mf(i),mf(i));
0209 <span class="keyword">if</span> Fi &gt; crit
0210 Ki = Pstar(:,mf(i));
0211 a = a + Ki*v(i)/Fi;
0212 Pstar = Pstar - Ki*transpose(Ki)/Fi;
0213 lik(t) = lik(t) + log(Fi) + v(i)*v(i)/Fi;
0214 <span class="keyword">else</span>
0215 <span class="comment">%disp(['zero F term for observed ',int2str(i),' ',num2str(Fi)])</span>
0216 <span class="keyword">end</span>
0217 <span class="keyword">end</span>
0218 a = T*a;
0219 <span class="keyword">end</span>
0220
0221 LIK = .5*(sum(lik(start:end))-(start-1)*lik(smpl+1)/smpl);
0222</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>