Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

I need to do a Sign Restriction SVAR in Matlab

Asked by Gareth on 15 Jul 2013

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'.

2 Comments

per isakson on 16 Jul 2013

Make this more readable by markup.

Gareth on 17 Jul 2013

I have made it readable. Someone please help me out

Gareth

Tags

Products

No products are associated with this question.

1 Answer

Answer by Muthu Annamalai on 18 Jul 2013
Accepted answer

@Gareth MATLAB has concepts of script and a function. You cannot mix both.

If you start a M-file with a MATLAB command that is not a function or class definition, it is considered a script. In MATLAB scripts you may not define functions.

Try creating a file VAR_str.m and move the code for function VAR_str and you should get rid of the error, "Error: Function definitions are not permitted in this context."

4 Comments

Muthu Annamalai on 19 Jul 2013

Yes, you should copy and paste the code for VAR_str into the VAR_str.m script.

Gareth on 20 Jul 2013

Thank you Muthu

Gareth on 21 Jul 2013

The entire script does not work so I have put up another one for SVAR which works for the original data but I need it to work for mine and so I guess I have to make a few tweaks. Can you please have a look for me and help me out as my deadline is fast approaching. Please help me

Muthu Annamalai

Contact us