Hi Sir/Madam,
I need to do an SVAR sign restrictions on shocks in Matlab.
my variables of interest are expenditure, gdp, inflation, revenue, interest rate stock price index and i have the code below
I want to impose the restriction on expenditure shock and revenue shock
—————————————————————————— clear all; close all;
ddata = xlsread ('Data for Sign Restrictions.xls'); data= [ddata(3:48,2) ddata(3:48,3) ddata(3:48,4) ddata(3:48,5) ddata(3:48,6) ddata(3:48,7)];
% pick log of Expend, log of Gdp,log of Inf, log of Rev, log of Int and log % of Stockpix
% Preliminary transformation of the data
const=ones(46,1); trend=1:46; qtrend=(1:46).^2; XXX=[const,trend',qtrend']; res1=data-XXX*inv(XXX'*XXX)*XXX'*data; nlags = 4; % number of lags
nimp = 20; % number of impulses
c =0 ; % use no constant in the VAR
n=size(data,2); % number of variables
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(res1,c,nlags); % creates the variables X and the Y
Bet=inv(X'*X)*X'*Y; % beta_ols
res=Y-X*Bet; Sigma=cov(res); % sigma_ols
% choleski decomposition
wimpu=[]; cimpu=[]; BB=companion2(Bet,nlags,n,c); % construct companion form of the VAR
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;
% computation of sign-based impulse responses
% 1) draw a normal (0,1) random matrix of dimension nxn
% 2) use the qr decompostion of the draw and store q
% 3) multiply choleski response by q
% 4) check if the impulse constructed in 3) satisfy the sign restrictions 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 candidate responses implied by q
for j=1:n for i = 1:nlagsimp S(:,j,i) = cimpu(:,:,i)*q(:,j); end end invchol=inv(cimpu(:,:,1)); imp=q(:,1)'*invchol(:,1);
% Check if the restrictions are satisfied for shock 1
% Want Expend up (variable 1), Rev up (variable 3)
% down at horizons 1 to ho
z1=[squeeze(S(1,1,1:ho))'>=0 squeeze(S(3,1,1:ho))'<=0 squeeze(S(2,1,1:ho))'- squeeze(S(1,1,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(3,1,1:ho))'>=0 squeeze(S(2,1,1:ho))'-squeeze(S(1,1,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 end dr=dr+1; end disp('number of draws made and accepted draws') [dr-1 gg]
% estract 68 intervals for the responses using identification uncertainty
sir=sort(irf,4); figure(1) me11=squeeze(sir(3,1,:,fix(gg*0.50))); up11=squeeze(sir(3,1,:,fix(gg*0.84))); lo11=squeeze(sir(3,1,:,fix(gg*0.16))); me21=squeeze(sir(5,1,:,fix(gg*0.50))); up21=squeeze(sir(5,1,:,fix(gg*0.84))); lo21=squeeze(sir(5,1,:,fix(gg*0.16))); subplot(1,2,1),plot([me11 up11 lo11]),axis tight; legend('RGDP responses') subplot(1,2,2),plot([me21 up21 lo21]),axis tight; legend('Inflation responses')
return —————————————————————————- i am getting the error below when i run the code above
Undefined function 'VAR_str' for input arguments of type 'double'.
and please see below for the code i have on 'VAR_str'
—————————————————————————- %Creates matrices for VAR(k)
function [yy,xx,x] = VAR_str(y,c,k) s=size(y); T=s(1); N=s(2); for i=1:N, yy(:,i)=y(k+1:T,i); for j=1:k, xx(:,k*(i-1)+j)=y(k+1-j:T-j,i); end; end; if c==0,xx=xx; elseif c==1,xx=[ones(T-k,1) xx]; elseif c==2,xx=[ones(T-k,1) (1:T-k)' xx]; elseif c==3,xx=[ones(T-k,1) (1:T-k)' ((1:t-k).^2)' xx] % added july 6, 2011
end z(:,1)=xx(:,1); for ij = 1:k zz(:,(ij-1)*N+1:N*ij) = xx(:,ij+c:k:size(xx,2)); end if c==1,x = [z zz]; elseif c==0 x=zz;
—————————————————————————-
I get the error below when I run the 'VAR_str' code
function [yy,xx,x] = VAR_str(y,c,k) | Error: Function definitions are not permitted in this context.
—————————————————————————-
when I create a file VAR_str.m and move the code for function VAR_str(my understanding is that I mark up function [yy,xx,x] = VAR_str(y,c,k) to achieve this), i get rid of the error, "Error: Function definitions are not permitted in this context."
but if I comment out the function below it then becomes a script
function [yy,xx,x] = VAR_str(y,c,k)
and try running the whole script (the SVAR sign restrictions code) i get the error below
Undefined function 'VAR_str' for input arguments of type'double'.
Best Answer