考虑一个 ARIMA 过程生成的时间序列
Yt=α(B)ϕ(B)θ(B)at,t=1,2,⋯,n
其中θ(B)和ϕ(B)的所有根都在单位圆外,α(B)的所有根都在单位圆上。
在这个序列中引入一个异常,得到
Yt∗=Yt+ωG(B)H(B)A(B)It(τ)
其中
It(τ)={1,0,t=τ,otherwise
τ表示异常发生的时刻,ω表示异常的量级,G(B)H(B)A(B)表示异常的演化模式。
下面考虑 4 种特定的异常,分别是 innovational outlier (IO),additive outlier (AO),level shift (LS) 以及 temporary change (TC)。它们的定义如下:
IO:G(B)H(B)A(B)AO:G(B)H(B)A(B)TC:G(B)H(B)A(B)LS:G(B)H(B)A(B)=α(B)ϕ(B)θ(B),=1,=1−δB1,(0<δ<1),=1−B1.
additive outlier (AO) 表现为序列的值在单次观测中突然变大或变小,而随后的观察结果不受异常值的影响。level shift (LS) 在异常值之后出现的所有观察值都偏移到一个新的水平。temporary change (TC) 和 LS 类似,只不过异常值的影响在随后的观察中呈指数减小,序列最终会回归到正常水平。实际上 AO 和 LS 可以看作是 TC 在 δ=0 和 δ=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)
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 引入 m 个异常,则时间序列可以表示为:
Yt∗=Yt+j=1∑mωjLj(B)It(τj)
其中 Lj(B) 为tj处异常的演化模式。
参考文献
- Chen, C., & Liu, L.-M. (1993). Forecasting time series with outliers. Journal of Forecasting, 12(1), 13–35.
- 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
- Outliers - Characteristics of Time Series - IBM Knowledge Center