SVAR (sign restrictions)-- Index exceeds matrix dimensions error
조회 수: 4 (최근 30일)
이전 댓글 표시
Hello Sir/Madam,
I want to do a SVAR sign restrictions on expenditure shock and revenue shock. my variables are expenditure, gdp, inflation, revenue, interest rate and stock price index.
I get the error below when I run the script
Index exceeds matrix dimensions.
Someone please help Thank you
------------------------------------------------------------------------------
load SignRes
% order of the data
% 1) Expend
% 2) GDP
% 3) Inflation
% 4) Revenue
% 5) Interest Rate
% 6) Stock Price Index
ddata= [data(2:49,2),data(2:49,3),data(2:49,4),data(2:49,5),data(2:49,6),data(2:49,7)]
n = size(ddata,2); % number of variables in the VAR
c = 1; % number of deterministic variables
nlags = 4; % number of lags of the VAR.
nimp = 20; % number of impulses to be computed.
ho = 1; % number of horizons over which sign restrictions are imposed.
maxdraws = 1000; % maximum number of rotations tried
% estimation of the var system
[Y,X] = VAR_str(ddata,c,nlags);
Bet=inv(X'*X)*X'*Y;
res=Y-X*Bet;
Sigma=cov(res);
% choleski decomposition
wimpu=[];
cimpu=[];
BB=companion(Bet,nlags,n,c);
for j=1:nimp
%% (non-orthogonal) Wold impulses
if j==1
wimpu(:,:,j)=eye(size(BB,1),size(BB,2));
elseif j>1
wimpu(:,:,j)=BB^(j-1);
end
%%(orthogonal) Choleski impulses
cimpu(:,:,j)=wimpu(1:n,1:n,j)*chol(Sigma)';
end
[n n nlagsimp]=size(cimpu);
dr=1;
gg=0;
irf=[];
idx=0;
while dr<=maxdraws
a=normrnd(0,1,n,n);
% Compute the qr decomposition of the random matrix a
[q r]=qr(a);
for ii=1:n;
if r(ii,ii)<0
q(:,ii)=-q(:,ii); % reflection matrix
end
end
% Compute the decomposition implied by q
for j=1:n
for i = 1:ho
S(:,j,ho) = cimpu(:,:,i)*q(:,j);
end
end
invchol=inv(cimpu(:,:,1));
imp=q(:,1)'*invchol(:,1);
%Check if the restrictions are satisfied for shock 1 and 2
z1=[squeeze(S(1,1,1:ho))'>=0 squeeze(S(2,1,1:ho))'<=0 ...
squeeze(S(1,2,1:ho))'>=0 squeeze(S(2,2,1:ho))'>=0];
zz1=sum(z1);
if zz1==size(z1,2)
gg=gg+1;
for j=1:n
for i = 1:nlagsimp
irf(:,j,i,gg) = cimpu(:,:,i)*q(:,j);
end
end
end
if zz1<size(z1,2)
mz1=[squeeze(S(1,1,1:ho))'<=0 squeeze(S(2,1,1:ho))'>=0 ...
squeeze(S(1,2,1:ho))'>=0 squeeze(S(2,2,1:ho))'>=0];
mzz1=sum(mz1);
if mzz1==size(mz1,2)
q(:,1)=-q(:,1);
gg= gg+1;
for j=1:n
for i = 1:nlagsimp
irf(:,j,i,gg) = cimpu(:,:,i)*q(:,j);
end
end
end
mz3=[squeeze(S(1,1,1:ho))'>=0 squeeze(S(2,1,1:ho))'<=0 ...
squeeze(S(1,2,1:ho))'<=0 squeeze(S(2,2,1:ho))'<=0];
mzz3=sum(mz3);
if mzz3==size(mz3,2)
q(:,2)=-q(:,2);
gg= gg+1;
for j=1:n
for i = 1:nlagsimp
irf(:,j,i,gg) = cimpu(:,:,i)*q(:,j);
end
end
end
end
dr=dr+1;
end
disp(' number or draws and accepted draws')
[dr gg]
sir=sort(irf,4);
figure(1)
me11=squeeze(sir(1,1,:,fix(gg*0.50)));
up11=squeeze(sir(1,1,:,fix(gg*0.84)));
lo11=squeeze(sir(1,1,:,fix(gg*0.16)));
me21=squeeze(sir(2,1,:,fix(gg*0.50)));
up21=squeeze(sir(2,1,:,fix(gg*0.84)));
lo21=squeeze(sir(2,1,:,fix(gg*0.16)));
me12=squeeze(sir(1,2,:,fix(gg*0.50)));
up12=squeeze(sir(1,2,:,fix(gg*0.84)));
lo12=squeeze(sir(1,2,:,fix(gg*0.16)));
me22=squeeze(sir(2,2,:,fix(gg*0.50)));
up22=squeeze(sir(2,2,:,fix(gg*0.84)));
lo22=squeeze(sir(2,2,:,fix(gg*0.16)));
subplot(2,2,1),plot([me11 up11 lo11]),axis tight;
title('RGDP')
ylabel('Supply shock')
subplot(2,2,2),plot([me21 up21 lo21]),axis tight;
title('Inflation')
subplot(2,2,3),plot([me12 up12 lo12]),axis tight;
ylabel('Demand shock')
subplot(2,2,4),plot([me22 up22 lo22]),axis tight;
return
댓글 수: 0
답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Multivariate Models에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!