dynare/matlab/varprior.m

55 lines
2.6 KiB
Matlab

function [ydum,xdum,breaks]=varprior(nv,nx,lags,mnprior,vprior)
%function [ydum,xdum,breaks]=varprior(nv,nx,lags,mnprior,vprior)
% ydum, xdum: dummy observation data that implement the prior
% breaks: vector of points in the dummy data after which new dummy obs's start
% Set breaks=T+[0;breaks], ydata=[ydata;ydum], xdum=[xdata;xdum], where
% actual data matrix has T rows, in preparing input for rfvar3
% nv,nx,lags: VAR dimensions
% mnprior.tight:Overall tightness of Minnesota prior
% mnprior.decay:Standard deviations of lags shrink as lag^(-decay)
% vprior.sig: Vector of prior modes for diagonal elements of r.f. covariance matrix
% vprior.w: Weight on prior on vcv. 1 corresponds to "one dummy observation" weight
% Should be an integer, and will be rounded if not. vprior.sig is needed
% to scale the Minnesota prior, even if the prior on sigma is not used itself.
% Set vprior.w=0 to achieve this.
% Note: The original Minnesota prior treats own lags asymmetrically, and therefore
% cannot be implemented entirely with dummy observations. It is also usually
% taken to include the sum-of-coefficients and co-persistence components
% that are implemented directly in rfvar3.m. The diagonal prior on v, combined
% with sum-of-coefficients and co-persistence components and with the unit own-first-lag
% prior mean generates larger prior variances for own than for cross-effects even in
% this formulation, but here there is no way to shrink toward a set of unconstrained
% univariate AR's.
%-----------------------
%
if ~isempty(mnprior)
xdum=zeros(lags+1,nx,lags,nv);
ydum=zeros(lags+1,nv,lags,nv);
for il=1:lags
ydum(il+1,:,il,:)=il^mnprior.decay*diag(vprior.sig);
end
ydum(1,:,1,:)=diag(vprior.sig);
ydum=mnprior.tight*reshape(ydum,[lags+1,nv,lags*nv]);
ydum=flipdim(ydum,1);
xdum=mnprior.tight*reshape(xdum,[lags+1,nx,lags*nv]);
xdum=flipdim(xdum,1);
breaks=(lags+1)*[1:(nv*lags)]';
lbreak=breaks(end);
else
ydum=[];
xdum=[];
breaks=[];
lbreak=0;
end
if ~isempty(vprior) & vprior.w>0
ydum2=zeros(lags+1,nv,nv);
xdum2=zeros(lags+1,nx,nv);
ydum2(end,:,:)=diag(vprior.sig);
ydum=cat(3,ydum,ydum2);
xdum=cat(3,xdum,xdum2);
dimy=size(ydum);
ydum=reshape(permute(ydum,[1 3 2]),dimy(1)*dimy(3),nv);
xdum=reshape(permute(xdum,[1 3 2]),dimy(1)*dimy(3),nx);
breaks=[breaks;(lags+1)*[1:nv-1]'+lbreak];
end