55 lines
2.6 KiB
Matlab
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
|