我不确定这个问题是否属于stackoverflow或stackexchange,我把它贴在了上面,stackoverflow因为它包含R-code。但是,如果您觉得它属于 ,您可以自由移动它stackexchange。
R当我注意到一些奇怪的事情时,我正在建模一些时间序列并在 中尝试不同的平稳性测试。我们是否有平稳性测试来检查平稳时间序列的所有三个分量(根据维基百科:常数均值、常数方差和常数协方差)?
模拟一些时间序列,我发现通常的测试无法找到一些非平稳的时间序列。现在的问题是,我是否遗漏了什么,或者我做错了什么,或者有没有比上面提到的测试更好的选择?
第一个时间序列应该是平稳的,而其他 5 个被模拟为具有不同的均值或不同的方差。
set.seed(123)
dat <- data.frame(x = 1:1000,
# stationary
ts1 = rnorm(1000),
# random walk
ts2 = cumsum(rnorm(1000)),
# jumps in mean
ts3 = c(rnorm(200), rnorm(400, mean = 5), rnorm(400)),
# jumps in variance
ts4 = c(rnorm(100), rnorm(300, sd = 5), rnorm(500), rnorm(100)),
# increasing variance
ts5 = sapply(1:1000, function(x) rnorm(1, sd = x/1000)),
# variance as a squared function
ts6 = sapply(1:1000, function(x) rnorm(1, sd = (x - 500)^2))/1000000)
Run Code Online (Sandbox Code Playgroud)
该系列看起来像这样。我会说很明显只有第一个系列具有恒定的均值和方差,而其他系列是非平稳的。
到目前为止,我看着成4周不同的测试:adf.test,Box.test,kpss.test,和PP.test(均来自tseries-packages。
虽然在一个显著p值adf.test和PP.test表示平稳序列,一个显著值表示非平稳其他两个测试。
library(tseries)
tests <- c("adf.test", "Box.test", "kpss.test", "PP.test")
sapply(tests, function(test){
apply(dat[, c("ts1", "ts2", "ts3", "ts4", "ts5", "ts6")], 2, function(x) {
get(test)(x)$p.value
})
})
# resulting in
# adf.test Box.test kpss.test PP.test # stat:non_stat
# ts1 0.0100000 0.386053779 0.10 0.0100000 # 4:0 clearly stat
# ts2 0.4195604 0.000000000 0.01 0.3260713 # 0:4 clearly non-stat
# ts3 0.5467517 0.000000000 0.01 0.0100000 # 1:3 most-likely non-stat
# ts4 0.0100000 0.004360365 0.10 0.0100000 # 2:2 ?!
# ts5 0.0100000 0.033007310 0.10 0.0100000 # 2:2 ?!
# ts6 0.0100000 0.307453035 0.10 0.0100000 # 4:0 stationary ?!
Run Code Online (Sandbox Code Playgroud)
虽然所有四个测试都发现第一个系列是平稳的,但其他系列的测试存在问题,尤其是方差不断变化的系列在许多情况下被错误分类。
您是否知道是否有更好的测试来解释方差和/或协方差的变化?
非常感谢您的想法、想法和解决方案。