diff --git a/matlab/DsgeSmoother.m b/matlab/DsgeSmoother.m index 743454590f273d41b9d79806b41728e268e89ef7..6efd3a4551cc73b05fbdb66c8e1a47505b4a8595 100644 --- a/matlab/DsgeSmoother.m +++ b/matlab/DsgeSmoother.m @@ -180,9 +180,7 @@ elseif options_.lik_init == 3 % Diffuse Kalman filter Z = [Z, eye(vobs)]; end end - [Ztmp,Stmp,Rtmp,QT,Pstar,Pinf] = schur_statespace_transformation(mf,T,R,Q,options_.qz_criterium,oo_.dr.restrict_var_list); - Pinf = QT*Pinf*QT'; - Pstar = QT*Pstar*QT'; + [Pstar,Pinf] = compute_Pinf_Pstar(mf,T,R,Q,options_.qz_criterium,oo_.dr.restrict_var_list); elseif options_.lik_init == 4 % Start from the solution of the Riccati equation. [err, Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(mf,np,vobs)),H); mexErrCheck('kalman_steady_state',err); @@ -263,7 +261,7 @@ if kalman_algo == 2 || kalman_algo == 4 if kalman_algo == 4 %recompute Schur state space transformation with %expanded state space - [Ztmp,Ttmp,Rtmp,Qtmp,Pstar,Pinf] = schur_statespace_transformation(mf,ST,R1,Q,options_.qz_criterium); + [Pstar,Pinf] = compute_Pinf_Pstar(mf,ST,R1,Q,options_.qz_criterium); else Pstar = blkdiag(Pstar,H); Pinf = blkdiag(Pinf,zeros(vobs)); diff --git a/matlab/schur_statespace_transformation.m b/matlab/compute_Pinf_Pstar.m similarity index 91% rename from matlab/schur_statespace_transformation.m rename to matlab/compute_Pinf_Pstar.m index b57515df584d81a291c43690981b3f44fa7bf4d6..2fbae5b330d552ccf43b2f38ce318d83b46d7beb 100644 --- a/matlab/schur_statespace_transformation.m +++ b/matlab/compute_Pinf_Pstar.m @@ -1,4 +1,4 @@ -function [Z,ST,R1,QT,Pstar,Pinf] = schur_statespace_transformation(mf,T,R,Q,qz_criterium, restrict_columns) +function [Pstar,Pinf] = compute_Pinf_Pstar(mf,T,R,Q,qz_criterium, restrict_columns) % function [Z,ST,QT,R1,Pstar,Pinf] = schur_statespace_transformation(mf,T,R,Q,qz_criterium, restrict_columns) % Kitagawa transformation of state space system with a quasi-triangular % transition matrix with unit roots at the top, but excluding zero columns of the transition matrix. @@ -20,10 +20,6 @@ function [Z,ST,R1,QT,Pstar,Pinf] = schur_statespace_transformation(mf,T,R,Q,qz_c % qz_criterium [double] numerical criterium for unit roots % % OUTPUTS -% Z [double] transformed matrix of measurement equation -% ST [double] tranformed matrix of transition -% R1 [double] tranformed matrix of structural shock effects -% QT [double] matrix of Schur vectors % Pstar [double] matrix of covariance of stationary part % Pinf [double] matrix of covariance initialization for % nonstationary part @@ -103,7 +99,6 @@ 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); Pstar(nk1,nk1)=(B(nk1,nk1)+c)/(1-ST(nk1,nk1)*ST(nk1,nk1)); end -Z = QT(mf,:); % stochastic trends with no influence on observed variables are % arbitrarily initialized to zero @@ -115,4 +110,6 @@ for k = 1:nk end end +Pinf = QT*Pinf*QT'; +Pstar = QT*Pstar*QT'; diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m index 6777b39965ce1cb2be14320fd6553dd426699314..f14682115c308ab3313df2bfa58f42539153fd01 100644 --- a/matlab/dsge_likelihood.m +++ b/matlab/dsge_likelihood.m @@ -111,7 +111,7 @@ function [fval,info,exit_flag,DLIK,Hess,SteadyState,trend_coeff,Model,DynareOpti %! @sp 2 %! @strong{This function calls:} %! @sp 1 -%! @ref{dynare_resolve}, @ref{lyapunov_symm}, @ref{schur_statespace_transformation}, @ref{kalman_filter_d}, @ref{missing_observations_kalman_filter_d}, @ref{univariate_kalman_filter_d}, @ref{kalman_steady_state}, @ref{getH}, @ref{kalman_filter}, @ref{score}, @ref{AHessian}, @ref{missing_observations_kalman_filter}, @ref{univariate_kalman_filter}, @ref{priordens} +%! @ref{dynare_resolve}, @ref{lyapunov_symm}, @ref{compute_Pinf_Pstar}, @ref{kalman_filter_d}, @ref{missing_observations_kalman_filter_d}, @ref{univariate_kalman_filter_d}, @ref{kalman_steady_state}, @ref{getH}, @ref{kalman_filter}, @ref{score}, @ref{AHessian}, @ref{missing_observations_kalman_filter}, @ref{univariate_kalman_filter}, @ref{priordens} %! @end deftypefn %@eod: @@ -380,15 +380,11 @@ switch DynareOptions.lik_init error(['The model requires Diffuse filter, but you specified a different Kalman filter. You must set options_.kalman_algo ' ... 'to 0 (default), 3 or 4']) end - [Ztmp,Ttmp,Rtmp,QT,Pstar,Pinf] = schur_statespace_transformation(Z,T,R,Q,DynareOptions.qz_criterium,[1:length(T)]); - Pinf = QT*Pinf*QT'; - Pstar = QT*Pstar*QT'; - Z1=Ztmp*0; - for jz=1:length(Z) - Z1(jz,Z(jz))=1; + [Pstar,Pinf] = compute_Pinf_Pstar(Z,T,R,Q,DynareOptions.qz_criterium,[1:length(T)]); + Z =zeros(length(BayesInfo.mf),size(T,1)); + for i = 1:length(BayesInfo.mf) + Z(i,BayesInfo.mf(i))=1; end - Z=Z1; - clear Ztmp Z1 Zflag = 1; % Run diffuse kalman filter on first periods. if (kalman_algo==3)