Time-Series

檢測時間序列中的步驟

  • January 5, 2012

我附上了我正在談論的時間序列的圖片。上為原系列,下為差異系列。

每個數據點是來自應變儀的 5 分鐘平均讀數。該應變儀放置在機器上。嘈雜區域對應機器開啟的區域,清潔區域對應機器關閉的區域。如果您查看紅色圈出的區域,我希望能夠自動檢測到讀數中的異常步驟。

我完全不知道我怎麼能做到這一點——有什麼想法嗎?

在此處輸入圖像描述

看來您正在尋找相對安靜區間內的尖峰。“相對”是指與典型的附近值相比,這表明對序列進行平滑處理穩健的平滑是可取的,因為它不應該受到一些局部尖峰的影響。“安靜”意味著平滑度附近的變化很小。同樣,需要對局部變化進行穩健的估計。最後,“尖峰”將是一個很大的殘差,是局部變化的倍數

為了實現這個秘訣,我們需要選擇(a)“附近”的接近程度,(b)平滑的秘訣,以及(c)尋找局部變化的秘訣。您可能需要對 (a) 進行試驗,因此讓我們將其設為易於控制的參數。(b) 和 (c) 的良好、現成的選擇分別是LowessIQR。這是一個R實現:

library(zoo)                      # For the local (moving window) IQR
f <- function(x, width=7) {       # width = size of moving window in time steps
   w <- width / length(x)
   y <- lowess(x, f=w)           # The smooth
   r <- zoo(x - y$y)             # Its residuals, structured for the next step
   z <- rollapply(r, width, IQR) # The running estimate of variability
   r/z                           # The diagnostic series: residuals scaled by IQRs
}

作為其使用示例,考慮這些模擬數據,其中兩個連續的尖峰被添加到一個安靜期(連續兩個尖峰應該比一個孤立的尖峰更難檢測):

> x <- c(rnorm(192, mean=0, sd=1), rnorm(96, mean=0, sd=0.1), rnorm(192, mean=0, sd=1))
> x[240:241] <- c(1,-1) # Add a local spike
> plot(x)

模擬數據

這是診斷圖:

> u <- f(x)
> plot(u)

診斷圖

儘管原始數據中存在所有噪聲,但該圖很好地檢測到了中心的(相對較小的)尖峰。 通過掃描較大的值(絕對值大於約 5:實驗以查看最適合樣本數據的值)來自動檢測。f(x)

> spikes <- u[abs(u) >= 5]
     240       241       273 
9.274959 -9.586756  6.319956

在時間 273 的虛假檢測是一個隨機的局部異常值。 您可以通過修改以同時查找診斷的高值和運行 IQR 的低值來優化測試以排除(大多數)此類虛假值。然而,儘管診斷具有通用(無單位)的規模和解釋,“低”IQR 的含義取決於數據的單位,並且必鬚根據經驗來確定。f``r/z``z

引用自:https://stats.stackexchange.com/questions/20612

comments powered by Disqus