Có vẻ như bạn đang tìm kiếm gai trong khoảng thời gian tương đối yên tĩnh . "Tương đối" có nghĩa là so với các giá trị gần đó điển hình, điều này cho thấy làm mịn chuỗi. Một mịn mạnh mẽ là mong muốn chính xác bởi vì nó không bị ảnh hưởng bởi một vài gai địa phương. "Yên tĩnh" có nghĩa là biến thể xung quanh đó là nhỏ. Một lần nữa, một ước tính mạnh mẽ của biến thể địa phương là mong muốn. Cuối cùng, một "đột biến" sẽ là phần dư lớn như là bội số của biến thể cục bộ.
Để thực hiện công thức này , chúng ta cần chọn (a) mức độ "gần" nghĩa là gì, (b) một công thức để làm mịn và (c) một công thức để tìm biến thể cục bộ. Bạn có thể phải thử nghiệm với (a), vì vậy hãy biến nó thành một tham số dễ kiểm soát. Các lựa chọn tốt, sẵn có cho (b) và (c) lần lượt là Lowess và IQR . Đây là một R
thực hiện:
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
}
Ví dụ về việc sử dụng nó, hãy xem xét các dữ liệu mô phỏng này trong đó hai đột biến liên tiếp được thêm vào một khoảng thời gian yên tĩnh (hai liên tiếp sẽ khó phát hiện hơn một đột biến bị cô lập):
> 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)
Đây là âm mưu chẩn đoán:
> u <- f(x)
> plot(u)
Bất chấp tất cả sự ồn ào trong dữ liệu gốc, cốt truyện này phát hiện rất tốt các gai (tương đối nhỏ) ở trung tâm. Tự động phát hiện bằng cách quét f(x)
các giá trị lớn (lớn hơn khoảng 5 trong giá trị tuyệt đối: thử nghiệm để xem cái gì hoạt động tốt nhất với dữ liệu mẫu).
> spikes <- u[abs(u) >= 5]
240 241 273
9.274959 -9.586756 6.319956
Phát hiện giả tại thời điểm 273 là một ngoại lệ ngẫu nhiên cục bộ. Bạn có thể tinh chỉnh thử nghiệm để loại trừ (hầu hết) các giá trị giả như vậy bằng cách sửa đổi f
để tìm kiếm các giá trị chẩn đoán cao r/z
và giá trị thấp đồng thời của IQR đang chạy z
. Tuy nhiên, mặc dù chẩn đoán có thang đo và giải thích phổ quát (không có đơn vị), ý nghĩa của IQR "thấp" phụ thuộc vào đơn vị dữ liệu và phải được xác định theo kinh nghiệm.