dynare/matlab/doc/DiffuseKalmanSmootherH3corr...

253 lines
13 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 DiffuseKalmanSmootherH3corr</title>
<meta name="keywords" content="DiffuseKalmanSmootherH3corr">
<meta name="description" content="stephane.adjemian@cepremap.cnrs.fr [09-16-2004]">
<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; DiffuseKalmanSmootherH3corr.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>DiffuseKalmanSmootherH3corr
</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@cepremap.cnrs.fr [09-16-2004]</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 [alphahat,epsilonhat,etahat,a1] = DiffuseKalmanSmootherH3corr(T,R,Q,H,Pinf1,Pstar1,Y,trend,pp,mm,smpl,mf) </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@cepremap.cnrs.fr [09-16-2004]
See &quot;Fast Filtering and Smoothing for Multivariate State Space
Models&quot;, S.J. Koopman and J. Durbin (2000, in Journal of Time Series
Analysis, vol. 21(3), pp. 281-296).</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="steady.html" class="code" title="function steady(linear)">steady</a> Copyright (C) 2001 Michel Juillard</li></ul>
This function is called by:
<ul style="list-style-image:url(../matlabicon.gif)">
</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 [alphahat,epsilonhat,etahat,a1] = DiffuseKalmanSmootherH3corr(T,R,Q,H,Pinf1,Pstar1,Y,trend,pp,mm,smpl,mf)</a>
0002 <span class="comment">% stephane.adjemian@cepremap.cnrs.fr [09-16-2004]</span>
0003 <span class="comment">%</span>
0004 <span class="comment">% See &quot;Fast Filtering and Smoothing for Multivariate State Space</span>
0005 <span class="comment">% Models&quot;, S.J. Koopman and J. Durbin (2000, in Journal of Time Series</span>
0006 <span class="comment">% Analysis, vol. 21(3), pp. 281-296).</span>
0007
0008 <span class="keyword">global</span> options_;
0009
0010 rr = size(Q,1);
0011 T = cat(1,cat(2,T,zeros(mm,pp)),zeros(pp,mm+pp));
0012 R = cat(1,cat(2,R,zeros(mm,pp)),cat(2,zeros(pp,rr),eye(pp)));
0013 Q = cat(1,cat(2,Q,zeros(rr,pp)),cat(2,zeros(pp,rr),H));
0014 <span class="keyword">if</span> size(Pinf1,1) <span class="comment">% Otherwise Pinf = 0 (no unit root)</span>
0015 Pinf1 = cat(1,cat(2,Pinf1,zeros(mm,pp)),zeros(pp,mm+pp));
0016 <span class="keyword">end</span>
0017 Pstar1 = cat(1,cat(2,Pstar1,zeros(mm,pp)),cat(2,zeros(pp,mm),H));
0018 spinf = size(Pinf1);
0019 spstar = size(Pstar1);
0020 Pstar = zeros(spstar(1),spstar(2),smpl+1); Pstar(:,:,1) = Pstar1;
0021 Pinf = zeros(spinf(1),spinf(2),smpl+1); Pinf(:,:,1) = Pinf1;
0022 Pstar1 = Pstar;
0023 Pinf1 = Pinf;
0024 v = zeros(pp,smpl);
0025 a = zeros(mm+pp,smpl+1);
0026 a1 = a;
0027 Fstar = zeros(pp,smpl);
0028 Finf = zeros(pp,smpl);
0029 Fi = zeros(pp,smpl);
0030 Ki = zeros(mm+pp,pp,smpl);
0031 Li = zeros(mm+pp,mm+pp,pp,smpl);
0032 Linf = zeros(mm+pp,mm+pp,pp,smpl);
0033 L0 = zeros(mm+pp,mm+pp,pp,smpl);
0034 Kstar = zeros(mm+pp,pp,smpl);
0035 Kinf = zeros(mm+pp,pp,smpl);
0036 P = zeros(mm+pp,mm+pp,smpl+1);
0037 P1 = zeros(mm+pp,mm+pp,smpl+1);
0038 crit = options_.kalman_tol;
0039 <a href="steady.html" class="code" title="function steady(linear)">steady</a> = smpl;
0040 QQ = R*Q*transpose(R);
0041 QRt = Q*transpose(R);
0042 alphahat = zeros(mm+pp,smpl);
0043 etahat = zeros(rr,smpl);
0044 epsilonhat = zeros(pp,smpl);
0045 r = zeros(mm+pp,smpl);
0046 Z = zeros(pp,mm+pp);
0047 <span class="keyword">for</span> i=1:pp;
0048 Z(i,mf(i)) = 1;
0049 Z(i,mm+i) = 1;
0050 <span class="keyword">end</span>
0051 <span class="comment">%% [1] Kalman filter...</span>
0052 t = 0;
0053 newRank = rank(Pinf(:,:,1),crit);
0054 <span class="keyword">while</span> newRank &amp; t &lt; smpl
0055 t = t+1;
0056 a1(:,t) = a(:,t);
0057 Pstar1(:,:,t) = Pstar(:,:,t);
0058 Pinf1(:,:,t) = Pinf(:,:,t);
0059 <span class="keyword">for</span> i=1:pp
0060 v(i,t) = Y(i,t)-a(mf(i),t)-a(mm+i,t)-trend(i,t);
0061 Fstar(i,t) = Pstar(mf(i),mf(i),t)+Pstar(mm+i,mm+i,t);
0062 Finf(i,t) = Pinf(mf(i),mf(i),t);
0063 Kstar(:,i,t) = Pstar(:,mf(i),t)+Pstar(:,mm+i,t);
0064 <span class="keyword">if</span> Finf(i,t) &gt; crit
0065 Kinf(:,i,t) = Pinf(:,mf(i),t);
0066 Linf(:,:,i,t) = eye(mm+pp) - Kinf(:,i,t)*Z(i,:)/Finf(i,t);
0067 L0(:,:,i,t) = (Kinf(:,i,t)*Fstar(i,t)/Finf(i,t) - Kstar(:,i,t))*Z(i,:)/Finf(i,t);
0068 a(:,t) = a(:,t) + Kinf(:,i,t)*v(i,t)/Finf(i,t);
0069 Pstar(:,:,t) = Pstar(:,:,t) + <span class="keyword">...</span>
0070 Kinf(:,i,t)*transpose(Kinf(:,i,t))*Fstar(i,t)/(Finf(i,t)*Finf(i,t)) - <span class="keyword">...</span>
0071 (Kstar(:,i,t)*transpose(Kinf(:,i,t)) +<span class="keyword">...</span>
0072 Kinf(:,i,t)*transpose(Kstar(:,i,t)))/Finf(i,t);
0073 Pinf(:,:,t) = Pinf(:,:,t) - Kinf(:,i,t)*transpose(Kinf(:,i,t))/Finf(i,t);
0074 <span class="keyword">else</span> <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>
0075 <span class="comment">%% rank(Pinf)=0 is satisfied we have P = Pstar and F = Fstar and (3) Finf = 0 does not imply that</span>
0076 <span class="comment">%% rank(Pinf)=0. [stphane,11-03-2004].</span>
0077 a(:,t) = a(:,t) + Kstar(:,i,t)*v(i,t)/Fstar(i,t);
0078 Pstar(:,:,t) = Pstar(:,:,t) - Kstar(:,i,t)*transpose(Kstar(:,i,t))/Fstar(i,t);
0079 <span class="keyword">end</span>
0080 <span class="keyword">end</span>
0081 a(:,t+1) = T*a(:,t);
0082 Pstar(:,:,t+1) = T*Pstar(:,:,t)*transpose(T)+ QQ;
0083 Pinf(:,:,t+1) = T*Pinf(:,:,t)*transpose(T);
0084 P0=Pinf(:,:,t+1);
0085 newRank = ~all(abs(P0(:))&lt;crit);
0086 <span class="keyword">end</span>
0087 d = t;
0088 P(:,:,d+1) = Pstar(:,:,d+1);
0089 Linf = Linf(:,:,:,1:d);
0090 L0 = L0(:,:,:,1:d);
0091 Fstar = Fstar(:,1:d);
0092 Finf = Finf(:,1:d);
0093 Kstar = Kstar(:,:,1:d);
0094 Pstar = Pstar(:,:,1:d);
0095 Pinf = Pinf(:,:,1:d);
0096 Pstar1 = Pstar1(:,:,1:d);
0097 Pinf1 = Pinf1(:,:,1:d);
0098 notsteady = 1;
0099 <span class="keyword">while</span> notsteady &amp; t&lt;smpl
0100 t = t+1;
0101 a1(:,t) = a(:,t);
0102 P(:,:,t)=tril(P(:,:,t))+transpose(tril(P(:,:,t),-1));
0103 P1(:,:,t) = P(:,:,t);
0104 <span class="keyword">for</span> i=1:pp
0105 v(i,t) = Y(i,t) - a(mf(i),t) - a(mm+i,t) - trend(i,t);
0106 Fi(i,t) = P(mf(i),mf(i),t)+P(mm+i,mm+i,t);
0107 Ki(:,i,t) = P(:,mf(i),t)+P(:,mm+i,t);
0108 <span class="keyword">if</span> Fi(i,t) &gt; crit
0109 Li(:,:,i,t) = eye(mm+pp)-Ki(:,i,t)*Z(i,:)/Fi(i,t);
0110 a(:,t) = a(:,t) + Ki(:,i,t)*v(i,t)/Fi(i,t);
0111 P(:,:,t) = P(:,:,t) - Ki(:,i,t)*transpose(Ki(:,i,t))/Fi(i,t);
0112 P(:,:,t)=tril(P(:,:,t))+transpose(tril(P(:,:,t),-1));
0113 <span class="keyword">end</span>
0114 <span class="keyword">end</span>
0115 a(:,t+1) = T*a(:,t);
0116 P(:,:,t+1) = T*P(:,:,t)*transpose(T) + QQ;
0117 notsteady = ~(max(max(abs(P(:,:,t+1)-P(:,:,t))))&lt;crit);
0118 <span class="keyword">end</span>
0119 P_s=tril(P(:,:,t))+transpose(tril(P(:,:,t),-1));
0120 Fi_s = Fi(:,t);
0121 Ki_s = Ki(:,:,t);
0122 L_s =Li(:,:,:,t);
0123 <span class="keyword">if</span> t&lt;smpl
0124 t_steady = t+1;
0125 P = cat(3,P(:,:,1:t),repmat(P(:,:,t),[1 1 smpl-t_steady+1]));
0126 Fi = cat(2,Fi(:,1:t),repmat(Fi_s,[1 1 smpl-t_steady+1]));
0127 Li = cat(4,Li(:,:,:,1:t),repmat(L_s,[1 1 smpl-t_steady+1]));
0128 Ki = cat(3,Ki(:,:,1:t),repmat(Ki_s,[1 1 smpl-t_steady+1]));
0129 <span class="keyword">end</span>
0130 <span class="keyword">while</span> t&lt;smpl
0131 t=t+1;
0132 a1(:,t) = a(:,t);
0133 <span class="keyword">for</span> i=1:pp
0134 v(i,t) = Y(i,t) - a(mf(i),t) - a(mm+i,t) - trend(i,t);
0135 <span class="keyword">if</span> Fi_s(i) &gt; crit
0136 a(:,t) = a(:,t) + Ki_s(:,i)*v(i,t)/Fi_s(i);
0137 <span class="keyword">end</span>
0138 <span class="keyword">end</span>
0139 a(:,t+1) = T*a(:,t);
0140 <span class="keyword">end</span>
0141 a1(:,t+1) = a(:,t+1);
0142 <span class="comment">%% [2] Kalman smoother...</span>
0143 ri=r;
0144 t = smpl+1;
0145 <span class="keyword">while</span> t&gt;d+1 &amp; t&gt;2,
0146 t = t-1;
0147 <span class="keyword">for</span> i=pp:-1:1
0148 <span class="keyword">if</span> Fi(i,t) &gt; crit
0149 ri(:,t)=transpose(Z(i,:))/Fi(i,t)*v(i,t)+transpose(Li(:,:,i,t))*ri(:,t);
0150 <span class="keyword">end</span>
0151 <span class="keyword">end</span>
0152 r(:,t-1) = ri(:,t);
0153 alphahat(:,t) = a1(:,t) + P1(:,:,t)*r(:,t-1);
0154 tmp = QRt*r(:,t);
0155 etahat(:,t) = tmp(1:rr);
0156 epsilonhat(:,t) = tmp(rr+1:rr+pp);
0157 ri(:,t-1) = transpose(T)*ri(:,t);
0158 <span class="keyword">end</span>
0159 <span class="keyword">if</span> d
0160 r0 = zeros(mm+pp,d); r0(:,d) = ri(:,d);
0161 r1 = zeros(mm+pp,d);
0162 <span class="keyword">for</span> t = d:-1:2
0163 <span class="keyword">for</span> i=pp:-1:1
0164 <span class="keyword">if</span> Finf(i,t) &gt; crit
0165 r1(:,t) = transpose(Z)*v(:,t)/Finf(i,t) + <span class="keyword">...</span>
0166 transpose(L0(:,:,i,t))*r0(:,t) + transpose(Linf(:,:,i,t))*r1(:,t);
0167 r0(:,t) = transpose(Linf(:,:,i,t))*r0(:,t);
0168 <span class="keyword">end</span>
0169 <span class="keyword">end</span>
0170 alphahat(:,t) = a1(:,t) + Pstar1(:,:,t)*r0(:,t) + Pinf1(:,:,t)*r1(:,t);
0171 r(:,t-1) = r0(:,t);
0172 tmp = QRt*r(:,t);
0173 etahat(:,t) = tmp(1:rr);
0174 epsilonhat(:,t) = tmp(rr+1:rr+pp);
0175 r0(:,t-1) = transpose(T)*r0(:,t);
0176 r1(:,t-1) = transpose(T)*r1(:,t);
0177 <span class="keyword">end</span>
0178 r0_0 = r0(:,1);
0179 r1_0 = r1(:,1);
0180 <span class="keyword">for</span> i=pp:-1:1
0181 <span class="keyword">if</span> Finf(i,1) &gt; crit,
0182 r1_0 = transpose(Z)*v(:,1)/Finf(i,1) + <span class="keyword">...</span>
0183 transpose(L0(:,:,i,1))*r0_0 + transpose(Linf(:,:,i,1))*r1_0;
0184 r0_0 = transpose(Linf(:,:,i,1))*r0_0;
0185 <span class="keyword">end</span>
0186 <span class="keyword">end</span>
0187 alphahat(:,1) = a(:,1) + Pstar(:,:,1)*r0_0 + Pinf(:,:,1)*r1_0;
0188 tmp = QRt*r(:,1);
0189 etahat(:,1) = tmp(1:rr);
0190 epsilonhat(:,1) = tmp(rr+1:rr+pp);
0191 <span class="keyword">else</span>
0192 r0 = ri(:,1);
0193 <span class="keyword">for</span> i=pp:-1:1
0194 <span class="keyword">if</span> Fi(i,1) &gt; crit
0195 r0=transpose(Z(i,:))/Fi(i,1)*v(i,1)+transpose(Li(:,:,i,1))*r0;
0196 <span class="keyword">end</span>
0197 <span class="keyword">end</span>
0198 alphahat(:,1) = a(:,1) + P(:,:,1)*r0;
0199 tmp = QRt*r(:,1);
0200 etahat(:,1) = tmp(1:rr);
0201 epsilonhat(:,1) = tmp(rr+1:rr+pp);
0202 <span class="keyword">end</span>
0203 alphahat = alphahat(1:mm,:);</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>