R strucchange bootstrap 由于非球形扰动导致的检验统计量

R strucchange bootstrap test statistic due to nonspherical disturbances

我试图在倾斜、肥尾和异方差的时间序列的均值中找到结构性断裂。我通过 strucchange 包应用 Andrews(1993) supF-test。我的理解是,即使有我的非球形干扰,这也是有效的。但我想通过 bootstrapping 确认这一点。我想根据每个可能的断点处的平均测试差异来估计最大 t-stat(就像 Andrews F-stat),然后 bootstrap 临界值。换句话说,我想在按时间排序的数据中找到我的最大 t-stat。然后打乱数据,在打乱的数据中找到最大的t-stat,10000次。然后将时间排序数据中的最大 t-stat 与无序数据中排名 9,500 max t-stat 给出的临界值进行比较。下面我生成示例数据并应用 Andrews supF-test。有什么方法可以 "correct" 安德鲁斯测试非球形扰动吗?有什么办法可以做到我想做的 bootstrap 吗?

library(strucchange)
Thames <- ts(matrix(c(rlnorm(120, 0, 1), rlnorm(120, 2, 2), rlnorm(120, 4, 1)), ncol = 1), frequency = 12, start = c(1985, 1))
fs.thames <- Fstats(Thames ~ 1)
sctest(fs.thames)

(1) 偏度和重尾。 和线性回归模型一样,推理的渐近证明不依赖于正态性,也适用于给定的任何其他误差分布零期望、同方差和缺乏相关性(通常的高斯-马尔可夫假设)。但是,如果您对感兴趣的数据有一个非常合适的偏态分布,那么您可以通过将您的推理基于相应的模型来提高效率。例如,glogis 包提供了一些用于结构变化测试和约会的函数,这些函数基于允许重尾和偏度的广义逻辑分布。 Windberger & Zeileis (2014, Eastern European Economics, 52, 66–88, doi:10.2753/EEE0012-8775520304) 使用它来跟踪 inflation 动态的偏度随时间的变化。 (有关工作示例,请参阅 ?breakpoints.glogisfit。)此外,如果偏度本身并不真正令人感兴趣,那么对数或 sqrt 转换也可能足以使数据更多 "normal".

(2) 异方差和自相关。 与线性回归模型一样,标准误差(或更广泛的协方差矩阵)在存在异方差时不一致 and/or 自相关。人们可以尝试将其明确包含在模型中(例如,AR 模型),或者将其视为令人讨厌的术语并采用异方差和自相关一致 (HAC) 协方差矩阵(例如,Newey-West 或 Andrews 的二次谱核 HAC) . strucchange 中的函数 Fstats() 允许插入此类估计器,例如,来自 sandwich 包。有关使用 vcovHC().

的示例,请参阅 ?durab

(3) Bootstrap 和排列 p 值。 您上面描述的时间序列的 "scrambling" 听起来更像是应用排列(即,无放回抽样)而不是 bootstrap(即放回抽样)。如果误差不相关或可交换,前者是可行的。如果你只是在一个常数上回归,那么你可以使用 coin 包中的函数 maxstat_test() 来执行 supF 测试。测试统计量的计算方式略有不同,但是,这可以证明等同于仅常数情况下的 supF 测试(参见 Zeileis & Hothorn,2013,Statistical Papers , 54, 931–954, doi:10.1007/s00362-013-0503-4)。如果你想在更一般的模型中执行排列测试,那么你必须进行排列 "by hand" 并简单地存储每个排列的测试统计量。或者,可以应用 bootstrap,例如,通过 boot 包(您仍然需要编写自己的小函数来计算给定 bootstrap 样本的测试统计量)。还有一些 R 包(例如,tseries)实现了依赖序列的 bootstrap 方案。

我正在添加第二个答案来分析所提供的模拟 Thames 数据。 关于我的第一个一般方法论答案的要点:(1)在这种情况下,log() 转换显然适合处理观察的极端偏斜。 (2) 由于数据是异方差的,推论应基于HC或HAC协方差。下面我使用了 Newey-West HAC 估计器,尽管数据只是异方差而不是自相关。 HAC 校正的推论会影响 supF 检验和断点估计的置信区间。断点本身和相应的特定于段的截距由 OLS 估计,即将异方差性视为令人讨厌的术语。 (3) 我没有添加任何 bootstrap 或排列推理,因为渐近推理在这种情况下似乎具有足够的说服力。

首先,我们使用特定的种子模拟数据。 (请注意,在级别分析系列时,其他种子可能不会导致这种明确的断点估计。)

library("strucchange")
set.seed(12)
Thames <- ts(c(rlnorm(120, 0, 1), rlnorm(120, 2, 2), rlnorm(120, 4, 1)),
  frequency = 12, start = c(1985, 1))

然后我们计算经过 HAC 校正的 Wald/F 统计数据序列,并通过 OLS 估计最佳断点(对于 m = 1、2、3 ... 断点)。为了说明这对日志系列而不是级别系列的效果有多好,显示了两个版本。

fs_lev <- Fstats(Thames ~ 1, vcov = NeweyWest)
fs_log <- Fstats(log(Thames) ~ 1, vcov = NeweyWest)
bp_lev <- breakpoints(Thames ~ 1) 
bp_log <- breakpoints(log(Thames) ~ 1) 

下面的可视化显示第一行带有拟合截距的时间序列,第二行带有 supF 检验的 5% 临界值的 Wald/F 统计序列,以及残差和squares 和 BIC 用于选择最后一行中的断点数。复制图形的代码在此答案的末尾。

两个 supF 测试都明显显着,但在级别 (sctest(fs_lev)) 中,测试统计数据为 "only" 82.79,而在对数 (sctest(fs_log)) 中为 282.46。此外,在分析日志中的数据时,可以更好地看到属于两个断点的两个峰。

同样,对数转换数据的断点估计更好,置信区间更窄。在关卡中,我们得到:

confint(bp_lev, breaks = 2, vcov = NeweyWest)
## 
##          Confidence intervals for breakpoints
##          of optimal 3-segment partition: 
## 
## Call:
## confint.breakpointsfull(object = bp_lev, breaks = 2, vcov. = NeweyWest)
## 
## Breakpoints at observation number:
##   2.5 % breakpoints 97.5 %
## 1    NA         125     NA
## 2   202         242    263

加上一条错误消息和警告,它们都反映出渐近推理在这里不是一个有用的近似值。相比之下,置信区间对于日志分析来说是相当合理的。由于中间段的方差增加,它的开始和结束比第一段和最后一段更不确定:

confint(bp_log, breaks = 2, vcov = NeweyWest)
## 
##          Confidence intervals for breakpoints
##          of optimal 3-segment partition: 
## 
## Call:
## confint.breakpointsfull(object = bp_log, breaks = 2, vcov. = NeweyWest)
## 
## Breakpoints at observation number:
##   2.5 % breakpoints 97.5 %
## 1   107         119    121
## 2   238         240    250
## 
## Corresponding to breakdates:
##   2.5 %    breakpoints 97.5 %  
## 1 1993(11) 1994(11)    1995(1) 
## 2 2004(10) 2004(12)    2005(10)

最后,上图的复制代码放在这里。由于上述错误,无法在图形中添加水平断点的置信区间。因此,只有对数转换序列也有置信区间。

par(mfrow = c(3, 2))
plot(Thames, main = "Thames")
lines(fitted(bp_lev, breaks = 2), col = 4, lwd = 2)
plot(log(Thames), main = "log(Thames)")
lines(fitted(bp_log, breaks = 2), col = 4, lwd = 2)
lines(confint(bp_log, breaks = 2, vcov = NeweyWest))
plot(fs_lev, main = "supF test")
plot(fs_log, main = "supF test")
plot(bp_lev)
plot(bp_log)