1function [Pi_bar,H0tldcell_inv,Hptldcell_inv] ...
2                      = fn_rnrprior_covres_dobs_tv2(nvar,nStates,indxScaleStates,q_m,lags,xdgel,mu,indxDummy,Ui,Vi,hpmsmd,indxmsmdeqn,nexo,asym0,asymp)
3% Differs from fn_rnrprior_covres_dobs(): linear restrictions (Ui and Vi) have been incorported in fn_rnrprior_covres_dobs_tv?().
4% Differs from fn_rnrprior_covres_dobs_tv():  allows an option to scale up the prior variance by nStates or not scale at all,
5%                so that the prior value is the same as the constant VAR when the parameters in all states are the same.
6%
7% Only works for the nexo=1 (constant term) case.  To extend this to other exogenous variables, see fn_dataxy.m.  01/14/03.
8% Differs from fn_rnrprior_covres_tv.m in that dummy observations are included as part of the explicit prior.  See Forcast II, pp.68-69b.
9% Exports random Bayesian prior of Sims and Zha with asymmetric rior with linear restrictions already applied
10%   and with dummy observations (i.e., mu(5) and mu(6)) used as part of an explicit prior.
11% This function allows for prior covariances for the MS and MD equations to achieve liquidity effects.
12% See Waggoner and Zha's Gibbs sampling paper and TVBVAR NOTES pp. 71k.0 and 50-61.
13%
14% nvar:  number of endogenous variables
15% nStates:  Number of states.
16% indxScaleStates: if 0, no scale adjustment in the prior variance for the number of states in the function fn_rnrprior_covres_dobs_tv2();
17%                  if 1: allows a scale adjustment, marking the prior variance bigger by the number of states.
18% q_m:  quarter or month
19% lags: the maximum length of lag
20% xdgel: T*nvar endogenous-variable matrix of raw or original data (no manipulation involved) with sample size including lags.
21%       Order of columns: (1) nvar endogenous variables; (2) constants will be automatically put in the last column.
22%       Used only to get variances of residuals for mu(1)-mu(5) and for dummy observations mu(5) and mu(6).
23% mu: 6-by-1 vector of hyperparameters (the following numbers for Atlanta Fed's forecast), where
24%          mu(5) and mu(6) are NOT used here.  See fn_dataxy.m for using mu(5) and mu(6).
25%       mu(1): overall tightness and also for A0;  (0.57)
26%       mu(2): relative tightness for A+;  (0.13)
27%       mu(3): relative tightness for the constant term;  (0.1).  NOTE: for other
28%               exogenous terms, the variance of each exogenous term must be taken into
29%               acount to eliminate the scaling factor.
30%       mu(4): tightness on lag decay;  (1)
31%       mu(5): weight on nvar sums of coeffs dummy observations (unit roots);  (5)
32%       mu(6): weight on single dummy initial observation including constant
33%               (cointegration, unit roots, and stationarity);  (5)
34%       NOTE: for this function, mu(5) and mu(6) are not used.  See fn_dataxy.m for using mu(5) and mu(6).
35% indxDummy:  1: uses dummy observations to form part of an explicit prior; 0: no dummy observations as part of the prior.
36% Ui: nvar-by-1 cell.  In each cell, nvar-by-qi*si orthonormal basis for the null of the ith
37%           equation contemporaneous restriction matrix where qi is the number of free parameters
38%           within the state and si is the number of free states.
39%           With this transformation, we have ai = Ui*bi or Ui'*ai = bi where ai is a vector
40%           of total original parameters and bi is a vector of free parameters. When no
41%           restrictions are imposed, we have Ui = I.  There must be at least one free
42%           parameter left for the ith equation in the order of [a_i for 1st state, ..., a_i for last state].
43% Vi: nvar-by-1 cell.  In each cell, k-by-ri*ti orthonormal basis for the null of the ith
44%           equation lagged restriction matrix where k is a total of exogenous variables and
45%           ri is the number of free parameters within the state and ti is the number of free states.
46%           With this transformation, we have fi = Vi*gi
47%           or Vi'*fi = gi where fi is a vector of total original parameters and gi is a
48%           vector of free parameters.  The ith equation is in the order of [nvar variables
49%           for 1st lag and 1st state, ..., nvar variables for last lag and 1st state, const for 1st state, nvar
50%           variables for 1st lag and 2nd state, nvar variables for last lag and 2nd state, const for 2nd state, and so on].
51% hpmsmd: 2-by-1 hyperparameters with -1<h1=hpmsmd(1)<=0 for the MS equation and 0<=h2=hpmsmd(2)<1 the MD equation.  Consider a1*R + a2*M.
52%          The term h1*var(a1)*var(a2) is the prior covariance of a1 and a2 for MS, equivalent to penalizing the same sign of a1 and a2.
53%          The term h2*var(a1)*var(a2) is the prior covariance of a1 and a2 for MD, equivalent to penalizing opposite signs of a1 and a2.
54%          This will give us a liquidity effect.  If hpmsmd=0, no such restrictions will be imposed.
55% indxmsmdeqn: 4-by-1 index for the locations of the MS and MD equation and for the locations of M and R.
56%               indxmsmdeqn(1) for MS and indxmsmdeqn(2) for MD.
57%               indxmsmdeqn(3) for M and indxmsmdeqn(4) for R.
58% nexo:  number of exogenous variables (if not specified, nexo=1 (constant) by default).
59%         The constant term is always put to the last of all endogenous and exogenous variables.
60% asym0: nvar-by-nvar asymmetric prior on A0.  Column -- equation.
61%        If ones(nvar,nvar), symmetric prior;  if not, relative (asymmetric) tightness on A0.
62% asymp: ncoef-1-by-nvar asymmetric prior on A+ bar constant.  Column -- equation.
63%        If ones(ncoef-1,nvar), symmetric prior;  if not, relative (asymmetric) tightness on A+.
64% --------------------
65% Pi_bar: ncoef-by-nvar matrix for the ith equation under random walk.  Same for all equations
66% H0tldcell_inv: cell(nvar,1).  The ith cell represents the ith equation, where the dim is
67%         qi*si-by-qi*si.  The inverse of H0tld on p.60.
68% Hptldcell_inv: cell(nvar,1).  The ith cell represents the ith equation, where the dim is
69%         ri*ti-by-ri*ti.The inverse of Hptld on p.60.
70%
71% Differs from fn_rnrprior_covres_dobs(): linear restrictions (Ui and Vi) have been incorported in fn_rnrprior_covres_dobs_tv?().
72% Differs from fn_rnrprior_covres_dobs_tv():  allows an option to scale up the prior variance by nStates or not scale at all.
73%                so that the prior value is the same as the constant VAR when the parameters in all states are the same.
74% Tao Zha, February 2000.  Revised, September 2000, 2001, February, May 2003, May 2004.
75%
76% Copyright (C) 1997-2012 Tao Zha
77%
78% This free software: you can redistribute it and/or modify
79% it under the terms of the GNU General Public License as published by
80% the Free Software Foundation, either version 3 of the License, or
81% (at your option) any later version.
82%
83% It is distributed in the hope that it will be useful,
84% but WITHOUT ANY WARRANTY; without even the implied warranty of
85% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
86% GNU General Public License for more details.
87%
88% If you did not received a copy of the GNU General Public License
89% with this software, see <http://www.gnu.org/licenses/>.
90%
91
92
93if nargin<=12, nexo=1; end   % <<>>1
94ncoef = nvar*lags+nexo;  % Number of coefficients in *each* equation for each state, RHS coefficients only.
95ncoefsts = nStates*ncoef;  % Number of coefficients in *each* equation in all states, RHS coefficients only.
96
97H0tldcell_inv=cell(nvar,1);  % inv(H0tilde) for different equations under asymmetric prior.
98Hptldcell_inv=cell(nvar,1);  % inv(H+tilde) for different equations under asymmetric prior.
99
100%*** Constructing Pi_bar for the ith equation under the random walk assumption
101Pi_bar = zeros(ncoef,nvar);   % same for all equations
102Pi_bar(1:nvar,1:nvar) = eye(nvar);   % random walk
103
104%
105%@@@ Prepared for Bayesian prior
106%
107%
108% ** monthly lag decay in order to match quarterly decay: a*exp(bl) where
109% **  l is the monthly lag.  Suppose quarterly decay is 1/x where x=1,2,3,4.
110% **  Let the decay of l1 (a*exp(b*l1)) match that of x1 (say, beginning: 1/1)
111% **  and the decay of l2 (a*exp(b*l2)) match that of x2 (say, end: 1/5),
112% **  we can solve for a and b which are
113% **      b = (log_x1-log_x2)/(l1-l2), and a = x1*exp(-b*l1).
114if q_m==12
115   l1 = 1;   % 1st month == 1st quarter
116   xx1 = 1;   % 1st quarter
117   l2 = lags;   % last month
118   xx2 = 1/((ceil(lags/3))^mu(4));   % last quarter
119   %xx2 = 1/6;   % last quarter
120   % 3rd quarter:  i.e., we intend to let decay of the 6th month match
121   %    that of the 3rd quarter, so that the 6th month decays a little
122   %    faster than the second quarter which is 1/2.
123   if lags==1
124      b = 0;
125   else
126      b = (log(xx1)-log(xx2))/(l1-l2);
127   end
128   a = xx1*exp(-b*l1);
129end
130
131
132
133%
134% *** specify the prior for each equation separately, SZ method,
135% ** get the residuals from univariate regressions.
136%
137sgh = zeros(nvar,1);        % square root
138sgsh = sgh;              % square
139nSample=size(xdgel,1);  % sample size-lags
140yu = xdgel;
141C = ones(nSample,1);
142for k=1:nvar
143   [Bk,ek,junk1,junk2,junk3,junk4] = sye([yu(:,k) C],lags);
144   clear Bk junk1 junk2 junk3 junk4;
145   sgsh(k) = ek'*ek/(nSample-lags);
146   sgh(k) = sqrt(sgsh(k));
147end
148% ** prior variance for A0(:,1), same for all equations!!!
149sg0bid = zeros(nvar,1);  % Sigma0_bar diagonal only for the ith equation
150for j=1:nvar
151   sg0bid(j) = 1/sgsh(j);    % sgsh = sigmai^2
152end
153% ** prior variance for lagged and exogeous variables, same for all equations
154sgpbid = zeros(ncoef,1);     % Sigma_plus_bar, diagonal, for the ith equation
155for i = 1:lags
156   if (q_m==12)
157      lagdecay = a*exp(b*i*mu(4));
158   end
159   %
160   for j = 1:nvar
161      if (q_m==12)
162         % exponential decay to match quarterly decay
163         sgpbid((i-1)*nvar+j) = lagdecay^2/sgsh(j);  % ith equation
164      elseif (q_m==4)
165         sgpbid((i-1)*nvar+j) = (1/i^mu(4))^2/sgsh(j);  % ith equation
166      else
167			error('Incompatibility with lags, check the possible errors!!!')
168         %warning('Incompatibility with lags, check the possible errors!!!')
169         %return
170      end
171   end
172end
173%
174if indxDummy   % Dummy observations as part of the explicit prior.
175   ndobs=nvar+1;         % Number of dummy observations: nvar unit roots and 1 cointegration prior.
176   phibar = zeros(ndobs,ncoef);
177   %* constant term
178   const = ones(nvar+1,1);
179   const(1:nvar) = 0.0;
180   phibar(:,ncoef) = const;      % the first nvar periods: no or zero constant!
181
182   xdgelint = mean(xdgel(1:lags,:),1); % mean of the first lags initial conditions
183   %* Dummies
184   for k=1:nvar
185      for m=1:lags
186         phibar(ndobs,nvar*(m-1)+k) = xdgelint(k);
187         phibar(k,nvar*(m-1)+k) = xdgelint(k);
188         % <<>> multiply hyperparameter later
189      end
190   end
191   phibar(1:nvar,:) = 1*mu(5)*phibar(1:nvar,:);    % standard Sims and Zha prior
192   phibar(ndobs,:) = mu(6)*phibar(ndobs,:);
193   [phiq,phir]=qr(phibar,0);
194   xtxbar=phir'*phir;   % phibar'*phibar.   ncoef-by-ncoef.  Reduced (not full) rank.  See Forcast II, pp.69-69b.
195end
196
197
198
199
200
201%=================================================
202%   Computing the (prior) covariance matrix for the posterior of A0, no data yet
203%=================================================
204%
205%
206% ** set up the conditional prior variance sg0bi and sgpbi.
207sg0bida = mu(1)^2*sg0bid;   % ith equation
208sgpbida = mu(1)^2*mu(2)^2*sgpbid;
209sgpbida(ncoef-nexo+1:ncoef) = mu(1)^2*mu(3)^2;
210          %<<>> No scaling adjustment has been made for exogenous terms other than constant
211sgppbd = sgpbida(nvar+1:ncoef);    % corresponding to A++, in a Sims-Zha paper
212
213Hptd = zeros(ncoef);
214Hptdi=Hptd;
215Hptd(ncoef,ncoef)=sgppbd(ncoef-nvar);
216Hptdinv(ncoef,ncoef)=1./sgppbd(ncoef-nvar);
217             % condtional on A0i, H_plus_tilde
218
219
220if nargin<14   % <<>>1 Default is no asymmetric information
221   asym0 = ones(nvar,nvar);  % if not ones, then we have relative (asymmetric) tightness
222   asymp = ones(ncoef-1,nvar);    % for A+.  Column -- equation
223end
224
225%**** Asymmetric Information
226%asym0 = ones(nvar,nvar);  % if not ones, then we have relative (asymmetric) tightness
227%asymp = ones(ncoef-1,nvar);    % pp: plus without constant.  Column -- equation
228%>>>>>> B: asymmetric prior variance for asymp <<<<<<<<
229%
230%for i = 1:lags
231%   rowif = (i-1)*nvar+1;
232%   rowil = i*nvar;
233%     idmatw0 = 0.5;   % weight assigned to idmat0 in the formation of asymp
234%	if (i==1)
235%     asymp(rowif:rowil,:)=(1-idmatw0)*ones(nvar)+idmatw0*idmat0;  % first lag
236%		                 % note:  idmat1 is already transposed.  Column -- equation
237%	else
238%     %asymp(rowif:rowil,1:nvar) = (1-idmatw0)*ones(nvar)+idmatw0*idmat0;
239%                % <<<<<<< toggle +
240%                % Note: already transposed, since idmat0 is transposed.
241%				     % Meaning: column implies equation
242%     asymp(rowif:rowil,1:nvar) = ones(nvar);
243%                % >>>>>>> toggle -
244%	end
245%end
246%
247%>>>>>> E: asymmetric prior variance for asymp <<<<<<<<
248
249
250%=================================================
251%   Computing the final covariance matrix (S1,...,Sm) for the prior of A0,
252%      and final Gb=(G1,...,Gm) for A+ if asymmetric prior or for
253%      B if symmetric prior for A+
254%=================================================
255%
256for i = 1:nvar
257   %------------------------------
258   % Introduce prior information on which variables "belong" in various equations.
259   % In this first trial, we just introduce this information here, in a model-specific way.
260   % Eventually this info has to be passed parametricly.  In our first shot, we just damp down
261   % all coefficients except those on the diagonal.
262
263   %*** For A0
264   factor0=asym0(:,i);
265
266   sg0bd = sg0bida.*factor0;  %  Note, this only works for the prior variance Sg(i)
267                      % of a0(i) being diagonal.  If the prior variance Sg(i) is not
268                      % diagonal, we have to the inverse to get inv(Sg(i)).
269   %sg0bdinv = 1./sg0bd;
270   % *    unconditional variance on A0+
271   H0td = diag(sg0bd);    % unconditional
272   %=== Correlation in the MS equation to get a liquidity effect.
273   if (i==indxmsmdeqn(1))
274      H0td(indxmsmdeqn(3),indxmsmdeqn(4)) = hpmsmd(1)*sqrt(sg0bida(indxmsmdeqn(3))*sg0bida(indxmsmdeqn(4)));
275      H0td(indxmsmdeqn(4),indxmsmdeqn(3)) = hpmsmd(1)*sqrt(sg0bida(indxmsmdeqn(3))*sg0bida(indxmsmdeqn(4)));
276   elseif (i==indxmsmdeqn(2))
277      H0td(indxmsmdeqn(3),indxmsmdeqn(4)) = hpmsmd(2)*sqrt(sg0bida(indxmsmdeqn(3))*sg0bida(indxmsmdeqn(4)));
278      H0td(indxmsmdeqn(4),indxmsmdeqn(3)) = hpmsmd(2)*sqrt(sg0bida(indxmsmdeqn(3))*sg0bida(indxmsmdeqn(4)));
279   end
280   H0tdinv = inv(H0td);
281   %H0tdinv = diag(sg0bdinv);
282   %
283   if indxScaleStates
284      H0tldcell_inv{i}=(Ui{i}'*kron(eye(nStates),H0tdinv/nStates))*Ui{i};
285   else
286      H0tldcell_inv{i}=(Ui{i}'*kron(eye(nStates),H0tdinv))*Ui{i};
287   end
288
289
290
291   %*** For A+
292   if ~(lags==0)  % For A1 to remain random walk properties
293      factor1=asymp(1:nvar,i);
294      sg1bd = sgpbida(1:nvar).*factor1;
295      sg1bdinv = 1./sg1bd;
296      %
297      Hptd(1:nvar,1:nvar)=diag(sg1bd);
298      Hptdinv(1:nvar,1:nvar)=diag(sg1bdinv);
299      if lags>1
300         factorpp=asymp(nvar+1:ncoef-1,i);
301         sgpp_cbd = sgppbd(1:ncoef-nvar-1) .* factorpp;
302         sgpp_cbdinv = 1./sgpp_cbd;
303         Hptd(nvar+1:ncoef-1,nvar+1:ncoef-1)=diag(sgpp_cbd);
304         Hptdinv(nvar+1:ncoef-1,nvar+1:ncoef-1)=diag(sgpp_cbdinv);
305               % condtional on A0i, H_plus_tilde
306      end
307   end
308   %---------------
309   % The dummy observation prior affects only the prior covariance of A+|A0,
310   %    but not the covariance of A0.  See pp.69a-69b for the proof.
311   %---------------
312   if indxDummy   % Dummy observations as part of the explicit prior.
313      Hptdinv2 = Hptdinv + xtxbar;  % Rename Hptdinv to Hptdinv2 because we want to keep Hptdinv diagonal in the next loop of i.
314   else
315      Hptdinv2 = Hptdinv;
316   end
317   if (indxScaleStates)
318      Hptldcell_inv{i}=(Vi{i}'*kron(eye(nStates),Hptdinv2/nStates))*Vi{i};
319   else
320      Hptldcell_inv{i}=(Vi{i}'*kron(eye(nStates),Hptdinv2))*Vi{i};
321   end
322   %Hptdinv_3 = kron(eye(nStates),Hptdinv);   % ?????
323end
324
325
326