时间序列中的异常

考虑一个 ARIMA 过程生成的时间序列

Yt=θ(B)α(B)ϕ(B)at,t=1,2,,nY_t = \frac{\theta(B)}{\alpha(B)\phi(B)}a_t, \qquad t = 1, 2, \cdots, n

其中θ(B)\theta(B)ϕ(B)\phi(B)的所有根都在单位圆外,α(B)\alpha(B)的所有根都在单位圆上。

在这个序列中引入一个异常,得到

Yt=Yt+ωA(B)G(B)H(B)It(τ)Y_t^* = Y_t + \omega\frac{A(B)}{G(B)H(B)}I_t(\tau)

其中

It(τ)={1,t=τ,0,otherwiseI_t(\tau) = \begin{cases} 1, & t= \tau,\\ 0, & otherwise \end{cases}

τ\tau表示异常发生的时刻,ω\omega表示异常的量级,A(B)G(B)H(B)\frac{A(B)}{G(B)H(B)}表示异常的演化模式。

下面考虑 4 种特定的异常,分别是 innovational outlier (IO),additive outlier (AO),level shift (LS) 以及 temporary change (TC)。它们的定义如下:

IO:A(B)G(B)H(B)=θ(B)α(B)ϕ(B),AO:A(B)G(B)H(B)=1,TC:A(B)G(B)H(B)=11δB,(0<δ<1),LS:A(B)G(B)H(B)=11B.\begin{aligned} IO:\qquad \frac{A(B)}{G(B)H(B)} &= \frac{\theta(B)}{\alpha(B)\phi(B)},\\ AO:\qquad \frac{A(B)}{G(B)H(B)} &= 1, \\ TC:\qquad \frac{A(B)}{G(B)H(B)} &= \frac 1{1-\delta B}, \qquad (0<\delta<1),\\ LS:\qquad \frac{A(B)}{G(B)H(B)} &= \frac 1{1-B}. \end{aligned}

additive outlier (AO) 表现为序列的值在单次观测中突然变大或变小,而随后的观察结果不受异常值的影响。level shift (LS) 在异常值之后出现的所有观察值都偏移到一个新的水平。temporary change (TC) 和 LS 类似,只不过异常值的影响在随后的观察中呈指数减小,序列最终会回归到正常水平。实际上 AO 和 LS 可以看作是 TC 在 δ=0\delta=0δ=1\delta=1 时的特例。这 3 种异常和系统之间是独立的,而 innovational outlier (IO) 则不然。IO 通过时间序列的相关结构,波及到与之邻近的一系列观察点。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from scipy.signal import lfilter, unit_impulse

def arma_process(ar, ma, size=200, scale=1., e=None):
if e is None:
e = np.random.normal(size=size)
return lfilter(ma, ar, scale*e)

# 考虑一个 ARMA(1, 1) 模型
ar = [1, 0.85]
ma = [1, 0.65]

sample = arma_process(ar, ma)
io = arma_process(ar, ma, e=10*unit_impulse(200, 100))
ao = 10*unit_impulse(200, 100)
tc = arma_process([1, -0.9], [1], e=10*unit_impulse(200, 100))
ls = arma_process([1, -1], [1], e=10*unit_impulse(200, 100))

x = range(200)
plt.figure(figsize=(12, 12))
plt.subplot(511)
plt.plot(x, sample)
plt.title('original signal')

plt.subplot(523)
plt.plot(x, io)
plt.title('innovational outlier (IO)')
plt.subplot(524)
plt.plot(x, sample+io, label='with IO')
plt.plot(x, sample, label='without IO')
plt.title('signal with IO')
plt.legend()

plt.subplot(525)
plt.plot(x, ao)
plt.title('additive outlier (AO)')
plt.subplot(526)
plt.plot(x, sample+ao, label='with AO')
plt.plot(x, sample, label='without AO')
plt.title('signal with AO')
plt.legend()

plt.subplot(527)
plt.plot(x, tc)
plt.title('temporary change (TC)')
plt.subplot(528)
plt.plot(x, sample+tc, label='with TC')
plt.plot(x, sample, label='without TC')
plt.title('signal with TC')
plt.legend()

plt.subplot(529)
plt.plot(x, ls)
plt.title('level shift (LS)')
plt.subplot(5,2,10)
plt.plot(x, sample+ls, label='with LS')
plt.plot(x, sample, label='without LS')
plt.title('signal with LS')
plt.legend()

plt.tight_layout()
plt.show()

更复杂的异常通常可以近似看作这几种异常的组合。

τ1,τ2,,τm\tau_1, \tau_2, \cdots, \tau_m 引入 m 个异常,则时间序列可以表示为:

Yt=Yt+j=1mωjLj(B)It(τj)Y_t^* = Y_t + \sum\limits_{j=1}^m\omega_jL_j(B)I_t(\tau_j)

其中 Lj(B)L_j(B)tjt_j处异常的演化模式。

参考文献

  1. Chen, C., & Liu, L.-M. (1993). Forecasting time series with outliers. Journal of Forecasting, 12(1), 13–35.
  2. Chen, C., & Liu, L.-M. (1993). Joint Estimation of Model Parameters and Outlier Effects in Time Series, Journal of the American Statistical Association, 88(421), 284-297
  3. Outliers - Characteristics of Time Series - IBM Knowledge Center