使用 R 中的 tsoutliers 包檢測時間序列中的異常值(LS/AO/TC)。如何以方程格式表示異常值?
評論: 首先我要非常感謝新tsoutliers軟件包的作者,該軟件包實現了 Chen 和 Liu 的時間序列異常值檢測,該軟件包於 1993 年發表在美國統計協會雜誌的開源軟件中.
該包在時間序列數據中迭代檢測 5 種不同類型的異常值:
- 加性異常值 (AO)
- 創新異常值 (IO)
- 電平轉換 (LS)
- 臨時變更 (TC)
- 季節性水平偏移 (SLS)
更棒的是,這個包從預測包中實現了 auto.arima,因此檢測異常值是無縫的。該軟件包還可以生成漂亮的圖,以便更好地理解時間序列數據。
以下是我的問題:
我嘗試使用這個包運行幾個示例,效果很好。加性異常值和水平偏移是直觀的。但是,關於處理臨時變更異常值和創新異常值,我有 2 個問題,我無法理解。
臨時變化異常值示例:
考慮以下示例:
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。)
包裝手冊和文章中臨時更改的公式如下:
在哪裡為 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
臨時變化 TC 是異常值的一般類型。包文檔中給出的方程式以及您編寫的方程式是描述此類異常值動態的方程式。您可以通過
filter
如下所示的函數生成它。將它顯示為幾個 delta 值是很有啟發性的。為了 $ \delta=0 $ TC 在一個加性異常值中崩潰;在另一個極端, $ \delta=1 $ , TC 就像一個電平轉換。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 更為奇特。與 中考慮的其他類型的異常值相反,
tsoutliers
IO 的影響取決於所選模型和參數估計。這個事實與許多異常值串聯起來可能會很麻煩。在算法的第一次迭代中(其中一些異常值的影響可能沒有被檢測和調整),ARIMA 模型的估計質量可能不足以準確定義 IO。此外,隨著算法的進展,可以選擇新的 ARIMA 模型。因此,可以在初始階段使用 ARIMA 模型檢測 IO,但最終其動態由在最後階段選擇的另一個 ARIMA 模型定義。在本文檔(1) 中表明,在某些情況下,IO 的影響可能會隨著其發生日期變得越來越遠而增加,這很難解釋或假設。
IO 具有有趣的潛力,因為它可以捕捉季節性異常值。中考慮的其他類型的異常值
tsoutliers
無法捕捉季節性模式。然而,在某些情況下,最好搜索可能的季節性水平變化,SLS,而不是 IO(如前面提到的文檔中所示)。IO有一個吸引人的解釋。它有時被理解為一個加性異常值,它影響擾動項,然後根據 ARIMA 模型的動態在序列中傳播。從這個意義上說,IO 就像一個加性異常值,它們都影響單個觀察,但 IO 是擾動項中的脈衝,而 AO 是直接添加到 ARIMA 模型或數據生成過程生成的值的脈衝. 異常值是否影響創新或超出乾擾項可能是一個討論問題。
在之前的參考資料中,您可能會發現一些檢測到 IO 的真實數據示例。
(1)*時間序列中的季節性異常值。*Regina Kaiser 和 Agustín Maravall。文件 20.II.2001。