function results = adf(x,p,l)
% PURPOSE: carry out DF tests on a time-series vector
%---------------------------------------------------
% USAGE: results = adf(x,p,nlag)
% where: x = a time-series vector
% p = order of time polynomial in the null-hypothesis
% p = -1, no deterministic part
% p = 0, for constant term
% p = 1, for constant plus time-trend
% p > 1, for higher order polynomial
% nlags = # of lagged changes of x included
%---------------------------------------------------
% RETURNS: a results structure
% results.meth = 'adf'
% results.alpha = estimate of the autoregressive parameter
% results.adf = ADF t-statistic
% results.crit = (6 x 1) vector of critical values
% [1% 5% 10% 90% 95% 99%] quintiles
% results.nlag = nlag
%---------------------------------------------------
% SEE ALSO: prt_coint()
%---------------------------------------------------
% References: Said and Dickey (1984) 'Testing for Unit Roots in
% Autoregressive Moving Average Models of Unknown Order',
% Biometrika, Volume 71, pp. 599-607.
% written by:
% James P. LeSage, Dept of Economics
% University of Toledo
% 2801 W. Bancroft St,
% Toledo, OH 43606
% jlesage@spatial-econometrics.com
% Modeled after a similar Gauss routine by
% Sam Ouliaris, in a package called COINT
% error checking on inputs
if (nargin ~= 3)
error('Wrong # of arguments to adf');
end;
if (p < -1)
error('p less than -1 in adf');
elseif (cols(x) > 1)
error('adf cannot handle a matrix -- only vectors');
end;
nobs = rows(x);
if ((nobs - 2*l)+1 < 1)
error('nlags too large in adf, negative dof');
end;
dep = trimr(x,1,0);
ch = tdiff(x,1);
ch = trimr(ch,1,0);
% Gerard van den Hout suggested the fix below
% Erasmus University Rotterdam.
% The Netherlands.
k = 0 ;
z = [];
while (k < l);
k = k+1;
z = [z lag(ch,k)];
end;
z = trimr(z,k,0);
dep = trimr(dep,k,0);
if (p > -1)
z = [z ptrend(p,rows(z))];
end;
b = inv(z'*z)*(z'*dep);
% res = dep - z*b ;
% BUG fix suggested by
% Nick Firoozye
% Sanford C. Bernstein, Inc
res = detrend(dep,0) - detrend(z,0)*b;
so = (res'*res)/(rows(dep)-cols(z));
var_cov = so*inv(z'*z) ;
results.nlag = l;
results.alpha = b(1,1);
results.adf = (b(1,1)-1)/sqrt(var_cov(1,1));
results.crit = ztcrit(nobs,p);
results.meth = 'adf';
评论2