1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
function [g,badg] = fn_a0sfreegrad2(b,Uistar,Uibar,nvar,nStates,n0,n0cumsum,tvstate,tvtot,constot,...
tvinx,constinx,indxTV,indxConst,Tkave,Sgm0tldinvaveConst,Sgm0tldinvaveTV)
% Analytical gradient for both time-varying and constant parameters for fn_a0sfreefun2.m when using csminwel.m.
% The case of no asymmetric prior and no lag restrictions.
% Note: (1) columns correspond to equations; s stands for state.
% See Time-Varying BVAR NOTE pp.34a-34c.
%
% b: tvtot+constot-by-1 vector of free A0 parameters, vectorized from b_shat for both time-varying and constant parameter matrices.
% Uistar: cell(nvar,1). In each cell, nvar*nStates-by-qi orthonormal basis for the null of the ith
% equation contemporaneous restriction matrix where qi is the number of free parameters
% where in each state, nvar-by-qi is the same. With this transformation, we have
% ai = Ui*bi or Ui'*ai = bi where ai is a vector of total original parameters and
% bi is a vector of free parameters. When no restrictions are imposed, we have Ui = I.
% There must be at least one free parameter left for the ith equation. See p.33.
% Uibar: cell(nvar,1). In each cell, we have nvar*nStates-by-qi*nStates, rearranged
% from Uistar or Ui. See p.33.
% nvar: Number of endogenous variables.
% nStates: NUmber of states.
% n0: nvar-by-1. n0(i)=qi where ith element represents the number of free A0 parameters in ith equation for each state.
% n0cumsum=[0;cumsum(n0)]: nvar+1-by-1. Cumulative sums of n0 with zero added.
% tvstate=length(tvinx): Number of time-varying parameters for all equations under *each* state.
% constot=length(constinx): Total number of constant parameters for all equations.
% tvtot = tvstate*nStates: Total number of time-varying parameters for all equations under all states.
% tvinx: Vectorized index to include time-varying parameters for all equations under *each* state.
% constinx: Vectorized index to include constant parameters for all equations.
% indxTV: Index vector of ascending order for equations with time-varying parameters.
% indxConst: Index vector of ascending order for equations with constant parameters. When [], all equations
% are time varying; when [1:nvar], all equations have constant parameters.
% Tkave: nStates-by-1 of sample sizes (excluding lags but including dummies if provided) for different states k,
% averaged (ave) over E-step draws. For T_k. See p.40.
% Sgm0tldinvaveConst
% Sgm0tldinvaveTV
% Sgm0tldinvave: nvar*nStates-by-nvar*nStates. The matrix inv(\Sigma~_0) averaged (ave)
% over E-step draws. Same for all equations because of no asymmetric prior and no lag
% restrictions. Resembles old SpH in the exponent term in posterior of A0,
% but NOT divided by fss (T) yet. See p.40.
%----------------
% g: tvtot+constot-by-1 analytical gradient for fn_a0sfreefun2.m. Vectorized first from the
% time-varying parameter matrix and then from constant parameter and constant parameter matrix.
% badg: Always 0 --- the value that is used in csminwel.m.
%
% Tao Zha, August 2001.
%
% Copyright (C) 1997-2012 Tao Zha
%
% This free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% It is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% If you did not received a copy of the GNU General Public License
% with this software, see <http://www.gnu.org/licenses/>.
%
n0=n0(:);
A0=zeros(nvar,nvar,nStates);
B0=A0;
b_shat = zeros(n0cumsum(end),nStates);
b_shat(tvinx,:) = reshape(b(1:tvtot),tvstate,nStates); % Time-varying parameter matrix.
b_shat(constinx,:) = repmat(b(tvtot+1:end), [1 nStates]); % Constant parameter matrix.
%
gmix = zeros(n0cumsum(end),nStates);
% Gradient matrix mixing time-varying and constant parameters.
% Rows of gmix, indexed by constinx, will not be used but instead treated
% different under "for kj=indxConst."
gtv = zeros(tvstate,nStates); % Gradient wrt time-varying parameters, which will be vectorized later.
gconst1 = zeros(constot,1); % The first gradient wrt constant parameters for the exponetial term.
gconst2=zeros(constot,1); % The second gradient wrt constant parameters for -T_klog|A0(k)|.
%---------------------------------------------------
% Time-varying situation. See p. 34a.
%---------------------------------------------------
%*** The derivative of the exponential term w.r.t. each free time-varying paramater.
for kj = 1:nvar % For all equations
lenbjs=length(n0cumsum(kj)+1:n0cumsum(kj+1));
bj = zeros(nStates*lenbjs,1);
for si=1:nStates
bj((si-1)*lenbjs+1:si*lenbjs) = b_shat(n0cumsum(kj)+1:n0cumsum(kj+1),si); % bj(si). See p.34a.
A0(:,kj,si) = Uistar{kj}((si-1)*nvar+1:si*nvar,:)*b_shat(n0cumsum(kj)+1:n0cumsum(kj+1),si);
end
gj = (Uibar{kj}'*Sgm0tldinvaveTV*Uibar{kj})*bj;
if find(kj==indxTV) % For time-varying equations.
for si=1:nStates
gmix(n0cumsum(kj)+1:n0cumsum(kj+1),si) = gj((si-1)*lenbjs+1:si*lenbjs);
end
end
end
%*** Add the derivative of -T_klog|A0(k)| w.r.t. each free time-varying paramater.
for si=1:nStates % See p.34a.
B0(:,:,si)=inv(A0(:,:,si)');
for ki = tvinx % Those from 1 to sum(q_i) that pertain to time-varying parameters.
n = max(find( (ki-n0cumsum)>0 )); % note, 1<=n<=nvar equations.
gmix(ki,si) = gmix(ki,si) - Tkave(si)*B0(:,n,si)'*Uistar{n}((si-1)*nvar+1:si*nvar,ki-n0cumsum(n)); % See p.34a.
end
end
%---------------------------------------------------
% Constant-parameter situation. See pp. 34b-34c.
%---------------------------------------------------
kcount = 0; % Counts.
for kj = indxConst % Equations
klocat=kcount+n0(kj); % Losition for the last constant element in the jth equation.
Bbar = repmat(eye(n0(kj)),[1 nStates]); % See p.34b.
lenbjs=length(n0cumsum(kj)+1:n0cumsum(kj+1));
bj = zeros(nStates*lenbjs,1);
for si=1:nStates
bj((si-1)*lenbjs+1:si*lenbjs) = b_shat(n0cumsum(kj)+1:n0cumsum(kj+1),si); % bj(si). See p.34a.
A0(:,kj,si) = Uistar{kj}((si-1)*nvar+1:si*nvar,:)*b_shat(n0cumsum(kj)+1:n0cumsum(kj+1),si);
end
gconst1(kcount+1:klocat) = Bbar*( (Uibar{kj}'*Sgm0tldinvaveConst*Uibar{kj})*bj );
kcount=klocat;
end
%*** Add the derivative of -T_klog|A0(k)| w.r.t. each free time-varying paramater.
kcount = 0; % Counts.
for ki = constinx % Those from 1 to sum(q_i) that pertain to constant parameters.
kcount=kcount+1;
n = max(find( (ki-n0cumsum)>0 )); % note, 1<=n<=nvar equations.
gi=0; % Initializes a gradient summed across the states. See p. 34c.
for si=1:nStates % See p.34c.
gi = gi - Tkave(si)*B0(:,n,si)'*Uistar{n}((si-1)*nvar+1:si*nvar,ki-n0cumsum(n)); % See p. 34a.
end
gconst2(kcount)=gi;
end
%---------------------------------------------------
% Conclusion.
%---------------------------------------------------
gtv = gmix(tvinx,:); % Extract the gradient wrt time-varying parameters.
gconst = gconst1+gconst2; % Gradient wrt to constant parameters.
%
g = [gtv(:);gconst]; % Vectorized the same way as b is vectorized.
badg = 0; % This term is used for Sims's csminwel program.
|