107 lines
4.3 KiB
Matlab
107 lines
4.3 KiB
Matlab
|
function var=rfvar3(ydata,lags,xdata,breaks,lambda,mu)
|
||
|
%function var=rfvar3(ydata,lags,xdata,breaks,lambda,mu)
|
||
|
% This algorithm goes for accuracy without worrying about memory requirements.
|
||
|
% ydata: dependent variable data matrix
|
||
|
% xdata: exogenous variable data matrix
|
||
|
% lags: number of lags
|
||
|
% breaks: rows in ydata and xdata after which there is a break. This allows for
|
||
|
% discontinuities in the data (e.g. war years) and for the possibility of
|
||
|
% adding dummy observations to implement a prior. This must be a column vector.
|
||
|
% Note that a single dummy observation becomes lags+1 rows of the data matrix,
|
||
|
% with a break separating it from the rest of the data. The function treats the
|
||
|
% first lags observations at the top and after each "break" in ydata and xdata as
|
||
|
% initial conditions.
|
||
|
% lambda: weight on "co-persistence" prior dummy observations. This expresses
|
||
|
% belief that when data on *all* y's are stable at their initial levels, they will
|
||
|
% tend to persist at that level. lambda=5 is a reasonable first try. With lambda<0,
|
||
|
% constant term is not included in the dummy observation, so that stationary models
|
||
|
% with means equal to initial ybar do not fit the prior mean. With lambda>0, the prior
|
||
|
% implies that large constants are unlikely if unit roots are present.
|
||
|
% mu: weight on "own persistence" prior dummy observation. Expresses belief
|
||
|
% that when y_i has been stable at its initial level, it will tend to persist
|
||
|
% at that level, regardless of the values of other variables. There is
|
||
|
% one of these for each variable. A reasonable first guess is mu=2.
|
||
|
% The program assumes that the first lags rows of ydata and xdata are real data, not dummies.
|
||
|
% Dummy observations should go at the end, if any. If pre-sample x's are not available,
|
||
|
% repeating the initial xdata(lags+1,:) row or copying xdata(lags+1:2*lags,:) into
|
||
|
% xdata(1:lags,:) are reasonable subsititutes. These values are used in forming the
|
||
|
% persistence priors.
|
||
|
% Code written by Christopher Sims. This version 6/15/03.
|
||
|
[T,nvar]=size(ydata);
|
||
|
nox=isempty(xdata);
|
||
|
if ~nox
|
||
|
[T2,nx]=size(xdata);
|
||
|
else
|
||
|
T2=T;nx=0;xdata=zeros(T2,0);
|
||
|
end
|
||
|
% note that x must be same length as y, even though first part of x will not be used.
|
||
|
% This is so that the lags parameter can be changed without reshaping the xdata matrix.
|
||
|
if T2 ~= T, disp('Mismatch of x and y data lengths'),end
|
||
|
if nargin<4
|
||
|
nbreaks=0;breaks=[];
|
||
|
else
|
||
|
nbreaks=length(breaks);
|
||
|
end
|
||
|
breaks=[0;breaks;T];
|
||
|
smpl=[];
|
||
|
for nb=1:nbreaks+1
|
||
|
smpl=[smpl;[breaks(nb)+lags+1:breaks(nb+1)]'];
|
||
|
end
|
||
|
Tsmpl=size(smpl,1);
|
||
|
X=zeros(Tsmpl,nvar,lags);
|
||
|
for is=1:length(smpl)
|
||
|
X(is,:,:)=ydata(smpl(is)-(1:lags),:)';
|
||
|
end
|
||
|
X=[X(:,:) xdata(smpl,:)];
|
||
|
y=ydata(smpl,:);
|
||
|
% Everything now set up with input data for y=Xb+e
|
||
|
% ------------------Form persistence dummies-------------------
|
||
|
if lambda~=0 | mu>0
|
||
|
ybar=mean(ydata(1:lags,:),1);
|
||
|
if ~nox
|
||
|
xbar=mean(xdata(1:lags,:),1);
|
||
|
else
|
||
|
xbar=[];
|
||
|
end
|
||
|
if lambda~=0
|
||
|
if lambda>0
|
||
|
xdum=lambda*[repmat(ybar,1,lags) xbar];
|
||
|
else
|
||
|
lambda=-lambda;
|
||
|
xdum=lambda*[repmat(ybar,1,lags) zeros(size(xbar))];
|
||
|
end
|
||
|
ydum=zeros(1,nvar);
|
||
|
ydum(1,:)=lambda*ybar;
|
||
|
y=[y;ydum];
|
||
|
X=[X(:,:);xdum];
|
||
|
end
|
||
|
if mu>0
|
||
|
xdum=[repmat(diag(ybar),1,lags) zeros(nvar,nx)]*mu;
|
||
|
ydum=mu*diag(ybar);
|
||
|
X=[X;xdum];
|
||
|
y=[y;ydum];
|
||
|
end
|
||
|
end
|
||
|
[vl,d,vr]=svd(X(:,:),0);
|
||
|
di=1../diag(d);
|
||
|
B=vl'*y;
|
||
|
B=(vr.*repmat(di',nvar*lags+nx,1))*B;
|
||
|
u=y-X(:,:)*B;
|
||
|
xxi=vr.*repmat(di',nvar*lags+nx,1);
|
||
|
xxi=xxi*xxi';
|
||
|
B=reshape(B,[nvar*lags+nx,nvar]); % rhs variables, equations
|
||
|
By=B(1:nvar*lags,:);
|
||
|
By=reshape(By,nvar,lags,nvar);% variables, lags, equations
|
||
|
By=permute(By,[3,1,2]); %equations, variables, lags to match impulsdt.m
|
||
|
if nox
|
||
|
Bx=[];
|
||
|
else
|
||
|
Bx=B(nvar*lags+(1:nx),:)';
|
||
|
end
|
||
|
%logintlh=matrictint(u'*u,xxi,size(X,1)-nvar-1)-.5*nvar*(nvar+1)*log(2*pi);
|
||
|
var.By=By;var.Bx=Bx;var.u=u;var.xxi=xxi;%var.logintlh=logintlh;
|
||
|
% Desired features: 1) automatic dummies for vcv prior
|
||
|
% 2) automatic calculation of integrated pdf, accounting
|
||
|
% for the dummy variables as a prior
|
||
|
% 3) automatic dummies for "Minnesota prior"
|