Time-Series
檢測時間序列中的步驟
我附上了我正在談論的時間序列的圖片。上為原系列,下為差異系列。
每個數據點是來自應變儀的 5 分鐘平均讀數。該應變儀放置在機器上。嘈雜區域對應機器開啟的區域,清潔區域對應機器關閉的區域。如果您查看紅色圈出的區域,我希望能夠自動檢測到讀數中的異常步驟。
我完全不知道我怎麼能做到這一點——有什麼想法嗎?
看來您正在尋找相對安靜區間內的尖峰。“相對”是指與典型的附近值相比,這表明對序列進行平滑處理。穩健的平滑是可取的,因為它不應該受到一些局部尖峰的影響。“安靜”意味著平滑度附近的變化很小。同樣,需要對局部變化進行穩健的估計。最後,“尖峰”將是一個很大的殘差,是局部變化的倍數。
為了實現這個秘訣,我們需要選擇(a)“附近”的接近程度,(b)平滑的秘訣,以及(c)尋找局部變化的秘訣。您可能需要對 (a) 進行試驗,因此讓我們將其設為易於控制的參數。(b) 和 (c) 的良好、現成的選擇分別是Lowess和IQR。這是一個
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