2017-05-16 15:10:20 +02:00
|
|
|
function [zdata]=mkdatap_anticipated(nperiods,decrulea,decruleb,...
|
|
|
|
cof,Jbarmat,cofstar,Jstarbarmat,Dstarbarmat,...
|
|
|
|
regime,regimestart,violvecbool,...
|
|
|
|
endog_,exog_,irfshock,scalefactormod,init)
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-10-10 10:05:59 +02:00
|
|
|
nvars = length(endog_);
|
2017-05-16 15:10:20 +02:00
|
|
|
|
|
|
|
if nargin<16
|
|
|
|
init=zeros(nvars,1);
|
|
|
|
end
|
|
|
|
|
|
|
|
if nargin<15
|
|
|
|
scalefactormod=1;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
nshocks = size(irfshock,1);
|
|
|
|
for i = 1:nshocks
|
2017-10-10 10:05:59 +02:00
|
|
|
shockpos = strmatch(irfshock(i,:), exog_, 'exact');
|
2017-05-16 15:10:20 +02:00
|
|
|
if ~isempty(shockpos)
|
|
|
|
irfshockpos(i) = shockpos;
|
|
|
|
else
|
2017-10-10 10:05:59 +02:00
|
|
|
error(['Shock ', irfshock(i,:), ' is not in the model']);
|
2017-05-16 15:10:20 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
nregimes = length(regime);
|
|
|
|
|
|
|
|
Cbarmat = cof(:,1:nvars);
|
|
|
|
Bbarmat = cof(:,nvars+1:2*nvars);
|
|
|
|
Abarmat = cof(:,2*nvars+1:3*nvars);
|
|
|
|
|
|
|
|
|
|
|
|
% cofstar contains the system for the model when the constraint binds
|
|
|
|
Cstarbarmat = cofstar(:,1:nvars);
|
|
|
|
Bstarbarmat = cofstar(:,nvars+1:2*nvars);
|
|
|
|
Astarbarmat = cofstar(:,2*nvars+1:3*nvars);
|
|
|
|
|
|
|
|
% get the time-dependent decision rules
|
|
|
|
|
|
|
|
Tmax = regimestart(nregimes)-1; % Tmax is the position of the last period
|
|
|
|
% when the constraint binds
|
|
|
|
|
|
|
|
if Tmax > 0
|
|
|
|
P = zeros(nvars,nvars,Tmax);
|
|
|
|
D = zeros(nvars,Tmax);
|
|
|
|
|
|
|
|
|
|
|
|
invmat = inv((Astarbarmat*decrulea+Bstarbarmat));
|
|
|
|
P(:,:,Tmax) = -invmat*Cstarbarmat;
|
|
|
|
D(:,Tmax) = -invmat*Dstarbarmat;
|
|
|
|
|
|
|
|
|
|
|
|
% equivalent to pre-multiplying by the inverse above if the target
|
|
|
|
% matrix is invertible. Otherwise it yields the minimum state solution
|
|
|
|
%P(:,:,Tmax) = -(Astarbarmat*decrulea+Bstarbarmat)\Cstarbarmat;
|
|
|
|
%D(:,Tmax) = -(Astarbarmat*decrulea+Bstarbarmat)\Dstarbarmat;
|
|
|
|
|
|
|
|
|
|
|
|
for i = Tmax-1:-1:1
|
|
|
|
|
|
|
|
if violvecbool(i)
|
|
|
|
invmat = inv(Bstarbarmat+Astarbarmat*P(:,:,i+1));
|
|
|
|
P(:,:,i)=-invmat*Cstarbarmat;
|
|
|
|
D(:,i) = -invmat*(Astarbarmat*D(:,i+1)+Dstarbarmat);
|
|
|
|
else
|
|
|
|
invmat = inv(Bbarmat+Abarmat*P(:,:,i+1));
|
|
|
|
P(:,:,i)=-invmat*Cbarmat;
|
|
|
|
D(:,i) = -invmat*(Abarmat*D(:,i+1));
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if Tmax > 1
|
|
|
|
if violvecbool(1)
|
|
|
|
E = -invmat*Jstarbarmat;
|
|
|
|
else
|
|
|
|
E = -invmat*Jbarmat;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
invmat = inv(Astarbarmat*decrulea+Bstarbarmat);
|
|
|
|
E = -invmat*Jstarbarmat;
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
% generate data
|
|
|
|
% history will contain data, the state vector at each period in time will
|
|
|
|
% be stored columnwise.
|
|
|
|
history = zeros(nvars,nperiods+1);
|
|
|
|
history(:,1) = init;
|
2017-10-10 10:05:59 +02:00
|
|
|
errvec = zeros(length(exog_), 1);
|
2017-05-16 15:10:20 +02:00
|
|
|
|
|
|
|
% deal with predetermined conditions
|
|
|
|
for i = 1:nshocks
|
|
|
|
errvec(irfshockpos(i)) = scalefactormod(i);
|
|
|
|
end
|
|
|
|
|
|
|
|
% deal with shocks
|
|
|
|
irfpos =1;
|
|
|
|
if irfpos <=Tmax
|
|
|
|
history(:,irfpos+1) = P(:,:,irfpos)* history(:,irfpos)+...
|
|
|
|
D(:,irfpos) + E*errvec;
|
|
|
|
else
|
|
|
|
history(:,irfpos+1) = decrulea*history(:,irfpos)+decruleb*errvec;
|
|
|
|
end
|
|
|
|
|
|
|
|
% all other periods
|
|
|
|
for irfpos=2:nperiods+1
|
|
|
|
if irfpos <=Tmax
|
|
|
|
history(:,irfpos+1) = P(:,:,irfpos)* history(:,irfpos)+...
|
|
|
|
D(:,irfpos);
|
|
|
|
else
|
|
|
|
history(:,irfpos+1) = decrulea*history(:,irfpos);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
history=history';
|
2015-05-31 16:48:20 +02:00
|
|
|
zdata = history(2:end,:);
|