1function Q = SRestrictRWZalg(A0hatinv,Bhat,nvar,lags,irs)
2% Rubio-Waggoner-Zha (RWZ) method of sign restrictions.  For related methods, see Canova, Faust, and Uhlig.
3%      The detailed theoretical foundation of this algorithm can be found in Theorem 3 of Rubio, Waggoner, and Zha (RWZ)'s article "Regime Changes in the Euro Area."
4%      Other M functions called by this function can be downloaded by clicking on Archived Matlab Library ZhaZippedCode on http://home.earthlink.net/~tzha02/programCode.html
5% Strcutural VAR form:   Y*A0hat = X*Aphat + E, X where Y is T-by-nvar, A0hat is nvar-by-nvar, X is T-by-k (including the constant term and all other exogenous terms),
6%   Aphat is k-by-nvar, and E is T-by-nvar.  Rows are in the order of 1st lag (with nvar variables) to lags (with nvar variables) plus the exogenous terms.
7%   Note that columns of A0hat or Aphat correspond to equations.
8% Inputs:
9%   A0hatinv = inv(A0hat).
10%   Bhat = Aphat*inv(A0hat).
11%   nvar = number of endogenous variables.
12%   lags = lag length.
13%   irs = maximum number of periods in which sign restrictions are imposed.
14% Outputs:
15%   Q: orthogonal rotation matrix so that Q*A0hatinv or A0hat*Q' gives impulse responses that will satisfy
16%      sign restrictions of Canova, Faust, and Uhlig.
17%
18% Modified Nov 2004 by T. Zha to
19%     (1) correct the existing bugs;
20%     (2) make the signs explicit to avoid the normalization problem when computing error bands;
21%     (3) construct efficient way (i.e., earlier exit) to make all restrictions satisfied;
22%     (4) construct efficient way to normalize.
23% In this example, we have
24%    Variables are in the following order: 1: y; 2: P; 3: R; 4: M3; 5: Exec (per $).
25%    Shocks are in the following order: 1: AS; 2: AD; 3: MP; 4: MD; 5: Exec.
26%
27%
28% Copyright (C) 1997-2012 Juan Rubio-Ramirez, Daniel Waggoner and Tao Zha
29%
30% This free software: you can redistribute it and/or modify
31% it under the terms of the GNU General Public License as published by
32% the Free Software Foundation, either version 3 of the License, or
33% (at your option) any later version.
34%
35% It is distributed in the hope that it will be useful,
36% but WITHOUT ANY WARRANTY; without even the implied warranty of
37% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
38% GNU General Public License for more details.
39%
40% If you did not received a copy of the GNU General Public License
41% with this software, see <http://www.gnu.org/licenses/>.
42%
43
44
45nn = [nvar lags irs];
46control=0;
47
48
49Q=eye(nvar);
50
51while control==0
52   newmatrix=normrnd(0,1,nvar,nvar);
53   [Q,R]=qr(newmatrix);
54   for i=1:nvar;
55       if R(i,i)<0
56           Q(:,i)=-Q(:,i);
57       end
58   end
59   imfhat = fn_impulse(Bhat,Q*A0hatinv,nn);
60      %In the form that is congenial to RATS
61   imf3hat=reshape(imfhat,size(imfhat,1),nvar,nvar);
62      %imf3hat: row--steps, column--nvar responses, 3rd dimension--nvar shocks
63
64   %=== Responses to a moneaty policy (MP) shock.
65   % R>0, M<0, y<0, and P<0 for the irs periods.
66   a = (imf3hat(1:irs,3,3) > 0) .* (imf3hat(1:irs,4,3) < 0) .* (imf3hat(1:irs,1,3) < 0) .* (imf3hat(1:irs,2,3) < 0);
67   if (max(a)==0)
68      %--- Swiching the sign of the shock.
69      am = (imf3hat(1:irs,3,3) < 0) .* (imf3hat(1:irs,4,3) > 0) .* (imf3hat(1:irs,1,3) > 0) .* (imf3hat(1:irs,2,3) > 0);
70      if (min(am)==0)
71         continue;   %The restrictions are not satisfied.  Go the beginning to redraw.
72      else
73         %--- Normalizing according to the switched sign.
74         Q(3,:) = -Q(3,:);
75      end
76   elseif (min(a)==0)
77      continue;  %The restrictions are not satisfied.  Go the beginning to redraw.
78   end
79   %--- R>0 and M<0 for the irs periods.
80   %   a = (imf3hat(1:irs,3,3) > 0) .* (imf3hat(1:irs,4,3) < 0);
81   %   if (max(a)==0)
82   %      %--- Swiching the sign of the shock.
83   %      am = (imf3hat(1:irs,3,3) < 0) .* (imf3hat(1:irs,4,3) > 0);
84   %      if (min(am)==0)
85   %         continue;   %The restrictions are not satisfied.  Go the beginning to redraw.
86   %      else
87   %         %--- Normalizing according to the switched sign.
88   %         Q(3,:) = -Q(3,:);
89   %      end
90   %   elseif (min(a)==0)
91   %      continue;  %The restrictions are not satisfied.  Go the beginning to redraw.
92   %   end
93
94   %=== Responses to an money demand (MD) shock.
95   % R>0 and M>0 for the irs periods.
96   a = (imf3hat(1:irs,3,4) > 0) .* (imf3hat(1:irs,4,4) > 0);
97   if (max(a)==0)
98      %--- Swiching the sign of the shock and normalize.
99      am = (imf3hat(1:irs,3,4) < 0) .* (imf3hat(1:irs,4,4) < 0);
100      if (min(am)==0)
101         continue;   %The restrictions are not satisfied.  Go the beginning to redraw.
102      else
103         %--- Normalizing according to the switched sign.
104         Q(4,:) = -Q(4,:);
105      end
106   elseif (min(a)==0)
107      continue;  %The restrictions are not satisfied.  Go the beginning to redraw.
108   end
109
110   %=== Responses to an aggregate demand (AD) shock.
111   % P>0 and y>0 for the irs periods.
112   a = (imf3hat(1:irs,1,2) > 0) .* (imf3hat(1:irs,2,2) > 0);
113   if (max(a)==0)
114      %--- Swiching the sign of the shock and normalize.
115      am = (imf3hat(1:irs,1,2) < 0) .* (imf3hat(1:irs,2,2) < 0);
116      if (min(am)==0)
117         continue;   %The restrictions are not satisfied.  Go the beginning to redraw.
118      else
119         %--- Normalizing according to the switched sign.
120         Q(2,:) = -Q(2,:);
121      end
122   elseif (min(a)==0)
123      continue;  %The restrictions are not satisfied.  Go the beginning to redraw.
124   end
125
126   %=== Responses to an aggregate supply (AS) shock.
127   % P>0 and y<0 for the irs periods.
128   a = (imf3hat(1:irs,1,1) < 0) .* (imf3hat(1:irs,2,1) > 0);
129   if (max(a)==0)
130      %--- Swiching the sign of the shock and normalize.
131      am = (imf3hat(1:irs,1,1) > 0) .* (imf3hat(1:irs,2,1) < 0);
132      if (min(am)==0)
133         continue;   %The restrictions are not satisfied.  Go the beginning to redraw.
134      else
135         %--- Normalizing according to the switched sign.
136         Q(1,:) = -Q(1,:);
137      end
138   elseif (min(a)==0)
139      continue;  %The restrictions are not satisfied.  Go the beginning to redraw.
140   end
141
142   %=== Responses to an exchange-rate shock (depreciation ==> exports >0 ==> y>0);
143   % Ex>0 and y>0 for the irs periods.
144   a= (imf3hat(1:irs,1,5) > 0) .* (imf3hat(1:irs,5,5) > 0);
145   if (max(a)==0)
146      %--- Swiching the sign of the shock and normalize.
147      am = (imf3hat(1:irs,1,5) < 0) .* (imf3hat(1:irs,5,5) < 0);
148      if (min(am)==0)
149         continue;   %The restrictions are not satisfied.  Go the beginning to redraw.
150      else
151         %--- Normalizing according to the switched sign.
152         Q(5,:) = -Q(5,:);
153      end
154   elseif (min(a)==0)
155      continue;  %The restrictions are not satisfied.  Go the beginning to redraw.
156   end
157
158   %--- Terminating condition: all restrictions are satisfied.
159   control=1;
160end
161