使用R中的tsoutliers包检测时间序列中的离群值(LS / AO / TC)。如何用公式格式表示离群值?


35

评论: 首先,我要非常感谢新的tsoutliers软件包的作者,该软件包实现了Chen和Liu的时间序列离群值检测,该软件包于1993年在《美国统计协会杂志》上的开源软件。[R

程序包在时间序列数据中迭代检测5种不同类型的离群值:

  1. 附加异常值(AO)
  2. 创新离群值(IO)
  3. 电平转换(LS)
  4. 临时变更(TC)
  5. 季节性水平变动(SLS)

更妙的是,此程序包从预测程序包实现了auto.arima,因此可以无缝检测异常值。软件包还可以生成漂亮的图,以更好地了解时间序列数据。

以下是我的问题:

我尝试使用此程序包运行一些示例,但效果很好。加法离群值和电平移位很直观。但是,在处理临时更改离群值和创新离群值方面,我有两个问题,我无法理解。

临时更改异常值示例:

考虑以下示例:

library(tsoutliers)
library(expsmooth)
library(fma)

outlier.chicken <- tsoutliers::tso(chicken,types = c("AO","LS","TC"),maxit.iloop=10)
outlier.chicken
plot(outlier.chicken)

该程序正确地检测到以下位置的电平变化和临时变化。

Outliers:
  type ind time coefhat tstat
1   LS  12 1935   37.14 3.153
2   TC  20 1943   36.38 3.350

以下是情节和我的问题。

  • 如何以等式格式写入临时更改?(电平移位可以很容易地写为二进制变量,在1935 / Obs 12之前的任何时候为0,在1935年之后和之后的任何时候为1。)

包装手册和本文中的临时更改公式为:

大号=1个1个-δ

其中为0.7。我只是努力将其翻译为上面的示例。δ

  • 我的第二个问题是关于创新离群值的,我
    在实践中从未遇到过创新离群值。任何数字示例或案例示例都将非常有帮助。

离群值

编辑: @ Irishstat,tsoutliers函数在识别异常值并建议合适的ARIMA模型方面做得很好。查看Nile数据集,请参见下面的auto.arima应用程序,然后应用tsoutliers(默认值包括auto.arima):

auto.arima(Nile)
Series: Nile 
ARIMA(1,1,1)                    

Coefficients:
         ar1      ma1
      0.2544  -0.8741
s.e.  0.1194   0.0605

sigma^2 estimated as 19769:  log likelihood=-630.63
AIC=1267.25   AICc=1267.51   BIC=1275.04

应用tsoutliers函数后,它将标识LS离群值和加法离群值,并建议ARIMA阶数(0,0,0)。

nile.outliers <- tso(Nile,types = c("AO","LS","TC"))
nile.outliers
Series: Nile 
ARIMA(0,0,0) with non-zero mean 

Coefficients:
      intercept       LS29       AO43
      1097.7500  -242.2289  -399.5211
s.e.    22.6783    26.7793   120.8446

sigma^2 estimated as 14401:  log likelihood=-620.65
AIC=1249.29   AICc=1249.71   BIC=1259.71

Outliers:
  type ind time coefhat  tstat
1   LS  29 1899  -242.2 -9.045
2   AO  43 1913  -399.5 -3.306

在此处输入图片说明


8
我很高兴看到您发现该软件包很有用,谢谢!顺便说一句,我已经修复了绘制结果的函数中的错字,以便在软件包的下一个发行版中,y轴将覆盖原始序列和调整后的序列的范围。
javlacalle 2014年

2
在软件包的最新版本中,该函数tsoutliers已重命名为tso避免与package中的同名函数冲突forecast
javlacalle 2014年

1
@javlacalle我下载了最新的tsoutliers软件包,但它仍然包含tsoutliers而不是tso。我不确定何时更新软件包。我很高兴我们有不同的功能名称。
天气预报员

我赶紧通知了一下更新。在CRAN上更新之前需要花费一些时间。我刚刚看到可以从CRAN下载最新版本0.4。
javlacalle 2014年

@javlacalle我发现很难在Mac上安装tsoutliers。我BREW安装GSL,我尝试使用编译clanggcc没有工作。我认为这是一个很棒的软件包,但安装过程确实让我很伤心。
宝马先生

Answers:


19

filterδ=0δ=1个

tc <- rep(0, 50)
tc[20] <- 1
tc1 <- filter(tc, filter = 0, method = "recursive")
tc2 <- filter(tc, filter = 0.3, method = "recursive")
tc3 <- filter(tc, filter = 0.7, method = "recursive")
tc4 <- filter(tc, filter = 1, method = "recursive")
par(mfrow = c(2,2))
plot(tc1, main = "TC delta = 0")
plot(tc2, main = "TC delta = 0.3")
plot(tc3, main = "TC delta = 0.7")
plot(tc4, main = "TC delta = 1", type = "s")

暂时的变化

在您的示例中,您可以使用该函数outliers.effects来表示检测到的异常值对观察到的序列的影响:

# unit impulse
m1 <- ts(outliers.effects(outlier.chicken$outliers, n = length(chicken), weights = FALSE))
tsp(m1) <- tsp(chicken)
# weighted by the estimated coefficients
m2 <- ts(outliers.effects(outlier.chicken$outliers, n = length(chicken), weights = TRUE))
tsp(m2) <- tsp(chicken)

创新的异常值IO更为特殊。与中考虑的其他类型的异常值相反,tsoutliersIO的效果取决于所选模型和参数估计值。与许多异常值连在一起时,这一事实可能很麻烦。在算法的第一个迭代中(可能未检测到并调整某些异常值的影响),ARIMA模型的估计质量可能不够好,无法准确定义IO。此外,随着算法的发展,可以选择新的ARIMA模型。因此,可以使用ARIMA模型在初始阶段检测IO,但最终由最后阶段选择的另一个ARIMA模型定义其动态。

此文档中表明,在某些情况下,IO的影响可能会随着它的发生日期越来越远而变得越来越远,这是很难解释或假定的。

IO具有潜在的吸引力,因为它可以捕获季节性异常值。考虑的其他类型的离群值tsoutliers不能捕获季节性模式。但是,在某些情况下,最好搜索可能的季节性水平变化SLS,而不是IO(如前面提到的文档中所示)。

IO有一个吸引人的解释。有时将其理解为累加离群值,它影响扰动项,然后根据ARIMA模型的动态在系列中传播。从这个意义上讲,IO就​​像一个加法异常值,它们都影响单个观测值,但是IO是扰动项的冲量,而AO是直接加到ARIMA模型或数据生成过程的值上的冲量。离群值是否影响创新或超出干扰范围可能是讨论的问题。

在先前的参考中,您可能会发现一些检测到IO的实际数据示例。


感谢您的详细回复。对此,我真的非常感激。我有几个其他问题。使用auto.arima,确定p,d,q然后使用以arima作为ts方法的tsoutliers有什么优势?
天气预报员

1
forecast::auto.arima与一起使用的主要优点tsoutliers是一切都可以自动化。但是,建议使用其他选项来运行自动过程。例如,您可能首先查看ACF或单位根测试,然后选择要传递给的ARIMA模型tsoutliers。如果在建议的模型中发现任何异常值,则可以再次对调整后的序列进行分析。这是一个反复的过程。自动过程提供了有用的指导,但不一定提供最终或独特的解决方案。
javlacalle 2014年

1
查找异常值的过程是迭代的。为了安全起见,对允许的迭代次数设置了限制。当您看到警告时,您可以尝试运行算法,将参数maxit.iloop增加到5-6,然后查看结果是否改变。如果警告返回的数值较大maxit.iloop(例如20或更多),则可能表示某些模型未正确建模。在某些情况下,从要考虑的异常值类型中删除IO可能是一个不错的选择。在大多数情况下,您可以忽略该警告。您可以suppressWarnings用来避免它们。
javlacalle 2014年

2
@mugen我不完全了解有关此问题的教科书。由于本文中讨论的方法与干预分析有关,因此,任何包含该问题章节的教科书(关于计量经济学或时间序列)都将有所帮助;例如时间序列分析。在R中的应用程序。有关详细信息,您应该阅读许多有关此问题的期刊文章,例如Chen和Liu(1993)及其参考文献。
javlacalle,2015年

2
@mugen,我还将查看Tsay 文章。另外,我会检查Pankratz的经典书,该书对异常值有很好的报道。
天气预报员
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.