diffuse filter: removed special treatment of static variables
parent
383d891e81
commit
2f9dc09285
|
@ -52,20 +52,8 @@ function [Z,ST,R1,QT,Pstar,Pinf] = schur_statespace_transformation(mf,T,R,Q,qz_c
|
||||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
np = size(T,1);
|
np = size(T,1);
|
||||||
if nargin == 6,
|
|
||||||
indx = restrict_columns;
|
|
||||||
indx0=find(~ismember([1:np],indx));
|
|
||||||
else
|
|
||||||
indx=(find(max(abs(T))>0));
|
|
||||||
indx0=(find(max(abs(T))==0));
|
|
||||||
end
|
|
||||||
T0=T(indx0,indx); %static variables vs. dynamic ones
|
|
||||||
R0=R(indx0,:); % matrix of shocks for static variables
|
|
||||||
|
|
||||||
% perform Kitagawa transformation only for non-zero columns of T
|
% perform Kitagawa transformation
|
||||||
T=T(indx,indx);
|
|
||||||
R=R(indx,:);
|
|
||||||
np = size(T,1);
|
|
||||||
[QT,ST] = schur(T);
|
[QT,ST] = schur(T);
|
||||||
e1 = abs(ordeig(ST)) > 2-qz_criterium;
|
e1 = abs(ordeig(ST)) > 2-qz_criterium;
|
||||||
[QT,ST] = ordschur(QT,ST,e1);
|
[QT,ST] = ordschur(QT,ST,e1);
|
||||||
|
@ -73,7 +61,9 @@ k = find(abs(ordeig(ST)) > 2-qz_criterium);
|
||||||
nk = length(k);
|
nk = length(k);
|
||||||
nk1 = nk+1;
|
nk1 = nk+1;
|
||||||
Pstar = zeros(np,np);
|
Pstar = zeros(np,np);
|
||||||
B = QT'*R*Q*R'*QT;
|
R1 = QT'*R;
|
||||||
|
B = R1*Q*R1';
|
||||||
|
% computes variance of stationary block (lower right)
|
||||||
i = np;
|
i = np;
|
||||||
while i >= nk+2
|
while i >= nk+2
|
||||||
if ST(i,i-1) == 0
|
if ST(i,i-1) == 0
|
||||||
|
@ -113,47 +103,20 @@ if i == nk+1
|
||||||
c = ST(nk+1,:)*(Pstar(:,nk+2:end)*ST(nk1,nk+2:end)')+ST(nk1,nk1)*ST(nk1,nk+2:end)*Pstar(nk+2:end,nk1);
|
c = ST(nk+1,:)*(Pstar(:,nk+2:end)*ST(nk1,nk+2:end)')+ST(nk1,nk1)*ST(nk1,nk+2:end)*Pstar(nk+2:end,nk1);
|
||||||
Pstar(nk1,nk1)=(B(nk1,nk1)+c)/(1-ST(nk1,nk1)*ST(nk1,nk1));
|
Pstar(nk1,nk1)=(B(nk1,nk1)+c)/(1-ST(nk1,nk1)*ST(nk1,nk1));
|
||||||
end
|
end
|
||||||
|
|
||||||
R1 = QT'*R;
|
|
||||||
ST1=ST;
|
|
||||||
|
|
||||||
% now I recover stationarized static variables
|
|
||||||
% using
|
|
||||||
% ss = s-z and
|
|
||||||
% z-z(-1) (growth rates of unit roots) only depends on stationary variables
|
|
||||||
np0=length(indx0);
|
|
||||||
Pstar = blkdiag(zeros(np0),Pstar);
|
|
||||||
ST = [zeros(length(Pstar),length(indx0)) [T0*QT ;ST]];
|
|
||||||
R1 = [R0; R1];
|
|
||||||
ST0=ST;
|
|
||||||
ST0(:,1:np0+nk)=0;
|
|
||||||
ST0(np0+1:np0+nk,:)=0;
|
|
||||||
ST0(1:np0,np0+nk+1:end) = ST(1:np0,np0+nk+1:end)-ST(1:np0,np0+1:np0+nk)*ST(np0+1:np0+nk,np0+nk+1:end);
|
|
||||||
R10 = R1;
|
|
||||||
R10(np0+1:np0+nk,:)=0;
|
|
||||||
R10(1:np0,:) = R1(1:np0,:)-ST(1:np0,np0+1:np0+nk)*R1(np0+1:np0+nk,:);
|
|
||||||
Pstar = ...
|
|
||||||
ST0*Pstar*ST0'+ ...
|
|
||||||
R10*Q*R10';
|
|
||||||
QT = blkdiag(eye(np0),QT);
|
|
||||||
QT(1:np0,np0+1:np0+nk) = QT(1:np0,np0+1:np0+nk)+ST(1:np0,np0+1:np0+nk);
|
|
||||||
% reorder QT entries
|
|
||||||
QT([indx0(:); indx(:)],:) = QT;
|
|
||||||
Z = QT(mf,:);
|
Z = QT(mf,:);
|
||||||
ST(1:np0,:) = ST0(1:np0,:);
|
|
||||||
R1(1:np0,:) = R10(1:np0,:);
|
|
||||||
|
|
||||||
% stochastic trends with no influence on observed variables are
|
% stochastic trends with no influence on observed variables are
|
||||||
% arbitrarily initialized to zero
|
% arbitrarily initialized to zero
|
||||||
Pinf = zeros(np,np);
|
Pinf = zeros(np,np);
|
||||||
Pinf(1:nk,1:nk) = eye(nk);
|
Pinf(1:nk,1:nk) = eye(nk);
|
||||||
[QQ,RR,EE] = qr(Z*ST(:,1+np0:nk+np0),0);
|
[QQ,RR,EE] = qr(Z*ST,0);
|
||||||
k = find(abs(diag([RR; zeros(nk-size(Z,1),size(RR,2))])) < 1e-8);
|
k = find(abs(diag(RR)) < 1e-8);
|
||||||
if length(k) > 0
|
if length(k) > 0
|
||||||
k1 = EE(:,k);
|
k1 = EE(:,k);
|
||||||
dd =ones(nk,1);
|
dd =ones(nk,1);
|
||||||
dd(k1) = zeros(length(k1),1);
|
dd(k1) = zeros(length(k1),1);
|
||||||
Pinf(1:nk,1:nk) = diag(dd);
|
Pinf(1:nk,1:nk) = diag(dd);
|
||||||
end
|
end
|
||||||
Pinf = blkdiag(zeros(np0),Pinf);
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue