我对三种不同的 Augmented Dickey-Fuller 测试(无、漂移、趋势)有点困惑。根据有关该主题的维基百科页面,这三个 ADF 检验几乎相同,因为单位根检验是在原假设 r = 0 对 r < 0 和 DF = r/SE(r) 的替代假设下进行的.
唯一的区别是临界值吗?
R 函数adf.test仅使用一种类型的临界值(带有漂移和趋势)。因此,如果我的数据没有漂移和趋势,adf.test 的输出可能不正确吗?
我对三种不同的 Augmented Dickey-Fuller 测试(无、漂移、趋势)有点困惑。根据有关该主题的维基百科页面,这三个 ADF 检验几乎相同,因为单位根检验是在原假设 r = 0 对 r < 0 和 DF = r/SE(r) 的替代假设下进行的.
唯一的区别是临界值吗?
R 函数adf.test仅使用一种类型的临界值(带有漂移和趋势)。因此,如果我的数据没有漂移和趋势,adf.test 的输出可能不正确吗?
维基百科页面声明如下:
ADF 测试的测试过程与 Dickey–Fuller 测试相同,但它适用于模型
正如您所注意到的,测试有多种变化,其中包括限制和/或等于 0。对施加限制对应于省略一个常数,而限制对应于省略时间趋势。
要了解您在使用 R 中的adf.test()
函数时在做什么tseries package
,我们应该首先查阅包作者提供的文档。为此,我们?adf.test
在 R 控制台中执行。这样做将为我们提供有关该功能的详细信息;它的作用,我们如何使用它等等。就目前而言,我们只需要注意文档中的说明:
使用包含常数和线性趋势的一般回归方程,并计算一阶自回归系数等于 1 的 t 统计量。
(我们还需要更多信息吗?)
再加上这个事实,如果我们看一下函数的用法;即,
adf.test(x, alternative = c("stationary", "explosive"),
k = trunc((length(x)-1)^(1/3)))
人们开始认为该函数对 ADF 测试的受限变化的能力有限。阅读所有文档似乎清楚地表明该函数仅运行测试的一种变体;不受限制的版本,包括常数和趋势。
(我们还需要更多信息吗?)
由于您使用的是 R,我们不必怀疑该函数是否在我们不知道的情况下以某种方式在内部施加了限制!要真正确定幕后发生了什么,我们可以查看adf.test()
函数的源代码。下面,我将逐步介绍我已缩短的代码,希望对您有所启发。
# Import some toy data
data(sunspots)
# Set arguments that are normally function inputs
x <- sunspots
alternative <- "stationary"
k <- trunc((length(x) - 1)^(1/3))
# Let the function go to work! (short version)
k <- k + 1 # Number of lagged differenced terms
y <- diff(x) # First differences
n <- length(y) # Length of first differenced series
z <- embed(y, k) # Used for creating lagged series
# Things get interesting here as variables are prepared for the regression
yt <- z[, 1] # First differences
xt1 <- x[k:n] # Series in levels - the first k-1 observations are dropped
tt <- k:n # Time-trend
yt1 <- z[, 2:k] # Lagged differenced series - there are k-1 of them
# Next, the key pieces of code.
# Regression 1: if k > 0
# The augmented Dickey-Fuller test (with constant and time-trend)
res <- lm(yt ~ xt1 + 1 + tt + yt1)
# Regression 2: if k = 0
# The standard Dickey-Fuller test (with constant and time-trend)
res <- lm(yt ~ xt1 + 1 + tt)
据我统计,该adf.test()
函数实际上由 57 行代码组成,我鼓励您检查一下。在这个问题的上下文中,其余的功能代码并不重要。所有需要知道的是该功能确实按照它在锡上所说的那样做。重要的是,似乎没有一种高级方法可以使用该函数来运行 ADF 测试的受限变体并检索相关的临界值。
该怎么办?您的第一反应应该是查看CRAN 任务视图:时间序列分析页面。在这样做的过程中,您将了解到它urca package
提供了 ADF 测试的替代实现。确实,正如我在评论中提到的,该ur.df()
功能应该能够满足您的需求。检查功能使用情况非常有用!
ur.df(y, type = c("none", "drift", "trend"), lags = 1,
selectlags = c("Fixed", "AIC", "BIC"))
可以在此处找到 urca 包,如果需要,我建议您查阅包文档和源代码。我怀疑您应该能够使用该功能而不必担心有关关键值的问题;该软件包的作者会处理好这一点,因此您可以专注于将其用作高级功能并进行研究。
在应用 ADF 测试(知道要运行哪些测试以及以何种顺序)方面,我建议使用 Dolado 等人。程序。参考是:
Dolado, JJ, Jenkinson, T. 和 Sosvilla-Rivera, S. (1990)。协整和单位根,经济调查杂志,4, 249-273。
关于将 R 代码与数学方程匹配的最后说明。基本上可以这样想(严格来说应该省略参数,但是……):
yt
=
xt
=
+ 1
=
tt
=
yt1
=
三个版本的测试之间的主要区别在于测试方程的规范。因此,临界值也不同。
您希望找到用于测试单位根的 Dikey-Fuller 测试回归的正确规范。这意味着在 {no constant, no trend}、{constant, no trend} 和 {constant, trend} 之间进行选择,并选择自回归滞后的数量。在正确的规范下,回归的系数估计量将表现良好,因此测试结果将是可信的。在不正确的规范下,事情就会出错。
R 函数 adf.test 仅使用一种类型的临界值(带有漂移和趋势)。因此,如果我的数据没有漂移和趋势,adf.test 的输出可能不正确吗?
如果底层过程的真实规范与函数中的规范不匹配adf.test
,则系数估计器将不会表现良好,因此您无法信任测试结果。