由于非球面扰动导致的R strucchange bootstrap测试统计

时间:2015-04-12 16:27:14

标签: r testing mean difference statistics-bootstrap

我试图在一个时间序列的平均值上找到一个结构性的中断,这个时间序列是倾斜的,胖尾的和异方差的。我通过strucchange包应用了Andrews(1993)supF-test。我的理解是,即使我的非球面扰动,这也是有效的。但我想通过bootstrapping来证实这一点。我想根据每个可能断点处的平均测试差异来估计最大t-stat(就像安德鲁斯F-stat一样),然后引导临界值。换句话说,我想在时间排序的数据中找到我的最大t-stat。然后对数据进行加扰,并在加扰数据中找到最大t-stat,10,000次。然后将时间排序数据的最大t-stat与无序数据中排名9,500 max t-stat给出的临界值进行比较。下面我生成示例数据并应用Andrews supF-test。有没有办法“纠正”安德鲁斯测试非球面扰动?有没有办法做我试图做的引导程序?

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)

2 个答案:

答案 0 :(得分:2)

(1)偏斜和沉重的尾巴。与线性回归模型一样,推理的渐近证明不依赖于正态性,也适用于任何其他误差分布,给定零期望,同方差性,缺乏相关性(通常的高斯 - 马尔可夫假设)。但是,如果您对感兴趣的数据有一个合适的偏差分布,那么您可以通过基于相应模型的推理来提高效率。例如,glogis包提供了一些结构变更测试和约会的功能,这些功能基于允许重尾和偏斜的广义逻辑分布。 Windberger&amp; Zeileis(2014年,东欧经济学,52,66-88,doi:10.2753/EEE0012-8775520304)用这个来追踪通货膨胀动态随时间变化的变化。 (有关工作示例,请参阅?breakpoints.glogisfit。)此外,如果偏斜本身并不是真正感兴趣,那么日志或sqrt转换也可能足以使数据更加正常&#34;。< / p>

(2)异方差和自相关。与线性回归模型一样,标准误差(或更广泛的协方差矩阵)在存在异方差性和/或自相关时不一致。可以尝试将其明确地包括在模型中(例如,AR模型)或将其视为麻烦术语并且使用异方差性和自相关一致性(HAC)协方差矩阵(例如,Newey-West或Andrews&#39;二次谱kernal) HAC)。 Fstats()中的函数strucchange允许插入此类估算工具,例如来自sandwich包。有关使用?durab的示例,请参阅vcovHC()

(3)引导和置换p值。&#34;加扰&#34;您在上面描述的时间序列听起来更像是应用排列(即,没有替换的采样)而不是自举(即,替换采样)。如果错误不相关或可交换,前者是可行的。如果你只是在常数上回归,那么你可以使用maxstat_test()包中的函数coin来执行supF测试。测试统计量以稍微不同的方式计算,但是,这可以显示为仅与常数情况下的supF测试相同(参见Zeileis&amp; Hothorn,2013, Statistical Papers ,54 ,931-954,doi:10.1007/s00362-013-0503-4)。如果你想在更通用的模型中执行排列测试,那么你必须手工完成排列&#34;#34;并简单地存储每个排列的测试统计量。或者,可以例如通过boot包来应用引导程序(在那里你仍然需要编写自己的小函数来计算来自给定引导程序样本的测试统计量)。还有一些R包(例如,tseries)实现了依赖系列的引导方案。

答案 1 :(得分:2)

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

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

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) 

下面的可视化显示了第一行中拟合截距的时间序列,第二行中具有5%临界值的Wald / F统计序列,以及剩余的平方和和BIC的总和。选择最后一行中的断点数。复制图形的代码在这个答案的末尾。

Structural change analysis of simulated Thames data.

两个supF测试都非常重要,但在级别(sctest(fs_lev))中,测试统计数据仅为&#34;仅为&#34; 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)