📄 ar_g.m
字号:
function results = ar_g(y,nlag,ndraw,nomit,prior,start)
% PURPOSE: MCMC estimates Bayesian heteroscedastic AR(k) model
% imposing stability restrictions using Gibbs sampling
% y = b0 + y(t-1) b1 + y(t-2) b2 +,...,y(t-k) bk + E,
% E = N(0,sige*V), sige = gamma(nu,d0), b = N(c,T),
% V = diag(v1,v2,...vn), r/vi = ID chi(r)/r, r = Gamma(m,k)
%---------------------------------------------------
% USAGE: results = ar_g(y,nlag,ndraw,nomit,prior,start)
% where: y = dependent variable vector
% nlag = # of lagged values
% ndraw = # of draws
% nomit = # of initial draws omitted for burn-in
% prior = a structure for prior information input:
% prior.beta, prior means for beta, c above
% priov.bcov, prior beta covariance , T above
% prior.rval, r prior hyperparameter, default=4
% prior.m, informative Gamma(m,k) prior on r
% prior.k, informative Gamma(m,k) prior on r
% prior.const, a switch for constant term,
% default = 1 (a constant included)
% prior.nu, a prior parameter for sige
% prior.d0, a prior parameter for sige
% (default = diffuse prior for sige)
% start = (optional) structure containing starting values:
% defaults: OLS beta,sige, V= ones(n,1)
% start.b = beta starting values (nvar x 1)
% start.sig = sige starting value (scalar)
% start.V = V starting values (n x 1)
% ---------------------------------------------------
% RETURNS: a structure:
% results.meth = 'ar_g'
% results.bdraw = bhat draws (ndraw-nomit x nvar)
% results.sdraw = sige draws (ndraw-nomit x 1)
% results.vmean = mean of vi draws (nobs x 1) (if rval input)
% results.yhat = mean of posterior y-predicted values
% results.rdraw = r-value draws (ndraw-nomit x 1)
% results.pmean = b prior means, prior.beta from input
% results.pstd = b prior std deviations sqrt(diag(T))
% results.r = value of hyperparameter r (if input)
% results.nobs = # of observations
% results.nadj = # of observations adjusted for feeding lags
% results.nvar = # of variables (including constant term)
% results.ndraw = # of draws
% results.nomit = # of initial draws omitted
% results.y = actual observations (nobs x 1)
% results.x = x-matrix of lagged values of y (nobs-nlag,nlag+const)
% results.nu = nu prior parameter
% results.d0 = d0 prior parameter
% results.m = m prior parameter (if input)
% results.k = k prior parameter (if input)
% results.time = time taken for sampling
% results.accept= acceptance rate
% results.pflag = 'plevel' (default)
% or 'tstat' for bogus t-statistics
% --------------------------------------------------
% NOTES: a constant term is automatically included in the model
% unless you set prior.const = 0;
% --------------------------------------------------
% SEE ALSO: prt, prt_gibbs(results), coda
% ----------------------------------------------------
% % REFERENCES: Chib (1993) `Bayes regression with autoregressive
% errors: A Gibbs sampling approach,' Journal of Econometrics, pp. 275-294.
% ----------------------------------------------------
% written by:
% James P. LeSage, Dept of Economics
% University of Toledo
% 2801 W. Bancroft St,
% Toledo, OH 43606
% jlesage@spatial-econometrics.com
[n junk] = size(y);
results.y = y;
% error checking on input
if ~isstruct(prior)
error('ar_g: must supply the prior as a structure variable');
elseif nargin == 6 % user-supplied starting values
if ~isstruct(start)
error('ar_g: must supply starting values in a structure');
end;
b0 = start.b; sige = start.sig; V = start.V;
sflag = 1;
elseif nargin == 5 % we supply ols starting values
sflag = 0;
else
error('Wrong # of arguments to ar_g');
end;
fields = fieldnames(prior);
nf = length(fields);
mm = 0;
rval = 4; % rval = 4 is default
const = 1; % a constant is the default
nu = 0; % default diffuse prior for sige
d0 = 0;
for i=1:nf
if strcmp(fields{i},'rval')
rval = prior.rval;
elseif strcmp(fields{i},'m')
mm = prior.m;
kk = prior.k;
rval = gamm_rnd(1,1,mm,kk); % initial value for rval
elseif strcmp(fields{i},'const')
const = prior.const;
elseif strcmp(fields{i},'nu')
nu = prior.nu;
elseif strcmp(fields{i},'d0')
d0 = prior.d0;
end;
end;
if sflag == 0 % we supply ols starting values
if const == 1
x = [ones(n,1) mlag(y,nlag)];
else
x = mlag(y,nlag);
end;
x = trimr(x,nlag,0); % feed the lags
y = trimr(y,nlag,0);
nadj = length(y);
b0 = x\y; % Find ols values as initial starting values
k = nlag+const;
sige = (y-x*b0)'*(y-x*b0)/(nadj-k);
V = ones(nadj,1); in = ones(nadj,1); % initial value for V
else
if const == 1
x = [ones(n,1) mlag(y,nlag)];
else
x = mlag(y,nlag);
end;
x = trimr(x,nlag,0); % feed the lags
y = trimr(y,nlag,0);
nadj = length(y);
in = ones(nadj,1); % initial value for V
end;
c = prior.beta;
[checkk,junk] = size(c);
if checkk ~= k
error('ar_g: prior means are wrong');
elseif junk ~= 1
error('ar_g: prior means are wrong');
end;
T = prior.bcov;
[checkk junk] = size(T);
if checkk ~= k
error('ar_g: prior bcov is wrong');
elseif junk ~= k
error('ar_g: prior bcov is wrong');
end;
Q = inv(T);
Qpc = Q*c;
ssave = zeros(ndraw-nomit,1); % storage for draws
bsave = zeros(ndraw-nomit,k);
vmean = zeros(nadj,1);
yhat = zeros(nadj,1);
rsave = zeros(ndraw-nomit,1);
hwait = waitbar(0,'MCMC sampling ...');
t0 = clock;
iter = 1; counter = 0;
while iter <= ndraw; % Start sampling
% generate beta conditional on sige
ys = y.*sqrt(V);
xs = matmul(x,sqrt(V));
xpx = inv(xs'*xs + sige*Q);
beta1 = xpx*(xs'*ys + sige*Qpc);
c = chol(sige*xpx);
accept = 0; % rejection sampling
while accept == 0;
beta = beta1 + c'*randn(k,1);
betap = beta';
coef = [-fliplr(betap(2:k)) 1];
root = roots(coef);
rootmod = abs(root);
if min(rootmod) >= 1.0001;
accept = 1;
else
counter = counter+1; % counts acceptance rate
accept = 0;
end;
end; % end of while loop
% generate sige conditional on beta
nu1 = nadj + nu;
e = ys - xs*beta;
d1 = d0 + e'*e;
chi = chis_rnd(1,nu1);
t2 = chi/d1;
sige = 1/t2;
chiv = chis_rnd(nadj,rval+1); % update vi
e = y-x*beta;
vi = ((e.*e./sige) + in*rval)./chiv;
V = in./vi;
if mm ~= 0
rval = gamm_rnd(1,1,mm,kk); % update rval
end;
if iter > nomit; % save draws
vmean = vmean + vi;
ssave(iter-nomit,1) = sige;
bsave(iter-nomit,:) = beta';
yhat = yhat + randn(nadj,1).*sqrt(sige*vi) + x*beta;
if mm~= 0
rsave(i-nomit,1) = rval;
end;
end; % end of if
iter = iter+1;
waitbar(iter/ndraw);
end; % end of while iter < ndraw
gtime = etime(clock,t0);
close(hwait);
vmean = vmean/(ndraw-nomit);
yhat = yhat/(ndraw-nomit);
% find acceptance rate
results.accept = 1 - counter/(iter+counter);
results.meth = 'ar_g';
results.bdraw = bsave;
results.sdraw = ssave;
results.vmean = vmean;
results.yhat = yhat;
results.pmean = prior.beta;
results.pstd = sqrt(diag(T));
if mm~= 0
results.rdraw = rsave;
results.m = mm;
results.k = kk;
else
results.r = rval;
results.rdraw = rsave;
end;
results.nobs = n;
results.nadj = nadj;
results.nvar = nlag+const;
results.ndraw = ndraw;
results.nomit = nomit;
results.time = gtime;
results.x = x;
results.nu = nu;
results.d0 = d0;
results.pflag = 'plevel';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -