Phát hiện các bước trong chuỗi thời gian


8

Tôi đã đính kèm một hình ảnh của chuỗi thời gian tôi đang nói về. Trên cùng là loạt ban đầu, dưới cùng là loạt khác biệt.

Mỗi điểm dữ liệu là một lần đọc trung bình 5 phút từ máy đo biến dạng. Máy đo biến dạng này được đặt trên một máy. Các khu vực ồn ào tương ứng với các khu vực bật máy, các khu vực sạch sẽ là khi tắt máy. Nếu bạn nhìn vào khu vực được khoanh tròn màu đỏ, có những bước bất thường trong bài đọc mà tôi muốn có thể tự động phát hiện.

Tôi hoàn toàn bối rối về cách tôi có thể làm điều này - có ý tưởng nào không?

nhập mô tả hình ảnh ở đây


Các bước bất thường là gì? Có phải máy đã tắt? Tôi có thể thấy patten tương tự trong vòng tròn màu đỏ trong phần khác của loạt bài? Tôi đã bỏ lỡ một cái gì đó để xem trong cốt truyện?
vinux

Điều này có vẻ khó khăn. Fisrt của tôi nghĩ: mô hình hóa trạng thái bật / tắt (ẩn) bằng Chuỗi Markov. Hiện tượng bạn muốn phát hiện là sự xuất hiện của một vài giá trị quan trọng trong chuỗi khác biệt khi máy tắt, vì vậy nếu bạn có thể tính toán tại mỗi thời điểm thì xác suất máy bị tắt, bạn có thể phát hiện ra nó là " giá trị quan trọng khi xác suất tắt cao ".
Elvis

Tôi đã có một ý nghĩ thứ hai. Tôi sẽ đăng nó ...
Elvis

Câu trả lời:


14

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à LowessIQR . Đây là một Rthự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)

Dữ liệu mô phỏng

Đây là âm mưu chẩn đoán:

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

Sơ đồ chẩn đoán

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/zvà 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.


Đoạn cuối được dựa trên dữ liệu mô phỏng rất giống, nhưng không hoàn toàn giống với dữ liệu được hiển thị ở đây. Trong sơ đồ chẩn đoán này, rõ ràng có các giá trị giả khác có kích thước lên tới khoảng 7,5 và hai gai có giá trị khoảng 14.
whuber

Câu trả lời tốt đẹp - điều này có vẻ đầy hứa hẹn. Cảm ơn rất nhiều. Tôi sẽ lấy lại cho bạn sau với kết quả của tôi.
mohamedmoussa

Chỉ cần theo dõi nhanh - Tôi đã làm một điều tương tự như những gì bạn đã làm, nhưng tôi có quyền truy cập vào độ lệch chuẩn của dữ liệu trong mỗi điểm dữ liệu (ví dụ: trong mỗi khoảng thời gian 5 phút). Tôi chia cho STD được làm mịn và tôi đã nhận được một số kết quả khá tốt.
mohamedmoussa

wow, tôi đã bỏ lỡ điều đó! (+1!)
Elvis

3

Đây là một gợi ý hai xu.

Biểu thị loạt differenced. Cho và một điểm , xác định XtΔ>0t

a(Δ,t)=12Δ+1|Xt|.

Đối với giả sử , giá trị của đặc trưng cho các vùng tắt / bật theo giá trị thấp / cao.Δ=50a(Δ,t)

Một bước bất thường là một điểm trong đó - bạn sẽ cần thực hiện một số điều chỉnh trên để phát hiện những gì bạn muốn và tránh dương tính giả khi bật máy. Tôi sẽ thử đầu tiên với và .t|Xt|>αa(Δ,t)α,ΔΔ=50α=4

Ngoài ra, bạn có thể xem các điểm trong đó cho một (ví dụ , ), có thể giúp tinh chỉnh (trong trường hợp đó, bạn sẽ lấy giá trị nhỏ hơn cho ).a ( δ , t ) > α a ( Δ , t ) δ Δ δ = 10 Δ = 100 αta(δ,t)>αa(Δ,t)δΔδ=10Δ=100α


Có thể viết mã R để thực hiện điều này? Cảm ơn!
dùng9292
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.