dynare/matlab/occbin/mkdatap_anticipated_2constr...

180 lines
5.1 KiB
Matlab
Executable File

function [zdata]=mkdatap_anticipated_2constraints(nperiods,decrulea,decruleb,...
cof,Jbarmat,...
cof10,Jbarmat10,Dbarmat10,...
cof01,Jbarmat01,Dbarmat01,...
cof11,Jbarmat11,Dbarmat11,...
regime1,regimestart1,...
regime2,regimestart2,...
violvecbool,endog_,exog_,...
irfshock,scalefactormod,init)
nvars = size(endog_,1);
if nargin<16
init=zeros(nvars,1);
end
if nargin<15
scalefactormod=1;
end
nshocks = size(irfshock,1);
for i = 1:nshocks
shockpos = strmatch(irfshock(i,:),exog_,'exact');
if ~isempty(shockpos)
irfshockpos(i) = shockpos;
else
error(['Shock ',irfshock(i,:),' is not in the model']);
end
end
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
Cbarmat10 = cof10(:,1:nvars);
Bbarmat10 = cof10(:,nvars+1:2*nvars);
Abarmat10 = cof10(:,2*nvars+1:3*nvars);
Cbarmat01 = cof01(:,1:nvars);
Bbarmat01 = cof01(:,nvars+1:2*nvars);
Abarmat01 = cof01(:,2*nvars+1:3*nvars);
Cbarmat11 = cof11(:,1:nvars);
Bbarmat11 = cof11(:,nvars+1:2*nvars);
Abarmat11 = cof11(:,2*nvars+1:3*nvars);
% get the time-dependent decision rules
nregimes1 = length(regime1);
nregimes2 = length(regime2);
Tmax = max([regimestart1(nregimes1) regimestart2(nregimes2)])-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;
if (violvecbool(Tmax,1) & ~violvecbool(Tmax,2))
%XXX fix next three lines
invmat = inv((Abarmat10*decrulea+Bbarmat10));
P(:,:,Tmax) = -invmat*Cbarmat10;
D(:,Tmax) = -invmat*Dbarmat10;
elseif (violvecbool(Tmax,1) & violvecbool(Tmax,2))
invmat = inv((Abarmat11*decrulea+Bbarmat11));
P(:,:,Tmax) = -invmat*Cbarmat11;
D(:,Tmax) = -invmat*Dbarmat11;
else
invmat = inv((Abarmat01*decrulea+Bbarmat01));
P(:,:,Tmax) = -invmat*Cbarmat01;
D(:,Tmax) = -invmat*Dbarmat01;
end
for i = Tmax-1:-1:1
if (violvecbool(i,1) & ~violvecbool(i,2))
invmat = inv(Bbarmat10+Abarmat10*P(:,:,i+1));
P(:,:,i)=-invmat*Cbarmat10;
D(:,i) = -invmat*(Abarmat10*D(:,i+1)+Dbarmat10);
elseif (~violvecbool(i,1) & violvecbool(i,2))
invmat = inv(Bbarmat01+Abarmat01*P(:,:,i+1));
P(:,:,i)=-invmat*Cbarmat01;
D(:,i) = -invmat*(Abarmat01*D(:,i+1)+Dbarmat01);
elseif (violvecbool(i,1) & violvecbool(i,2))
invmat = inv(Bbarmat11+Abarmat11*P(:,:,i+1));
P(:,:,i)=-invmat*Cbarmat11;
D(:,i) = -invmat*(Abarmat11*D(:,i+1)+Dbarmat11);
else
invmat = inv(Bbarmat+Abarmat*P(:,:,i+1));
P(:,:,i)=-invmat*Cbarmat;
D(:,i) = -invmat*(Abarmat*D(:,i+1));
end
end
% Double check the appropriate invmat in each case
% right now -- inherited from previous loop
if Tmax > 1
if ( ~violvecbool(1,1) & violvecbool(1,2) )
E = -invmat*Jbarmat01;
elseif ( violvecbool(1,1) & ~violvecbool(1,2) )
E = -invmat*Jbarmat10;
elseif ( violvecbool(1,1) & violvecbool(1,2) )
E = -invmat*Jbarmat11;
else
E = -invmat*Jbarmat;
end
else % Tmax is equal to 1
% invmat = inv((Astarbarmat*decrulea+Bstarbarmat));
% E = -invmat*Jstarbarmat;
if ( ~violvecbool(1,1) & violvecbool(1,2) )
invmat = inv((Abarmat01*decrulea+Bbarmat01));
E = -invmat*Jbarmat01;
elseif ( violvecbool(1,1) & violvecbool(1,2) )
invmat = inv((Abarmat11*decrulea+Bbarmat11));
E = -invmat*Jbarmat11;
else
invmat = inv((Abarmat10*decrulea+Bbarmat10));
E = -invmat*Jbarmat10;
end
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;
errvec = zeros(size(exog_,1),1);
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';
zdata = history(2:end,:);