Mendeteksi langkah-langkah dalam deret waktu


8

Saya telah melampirkan gambar seri waktu yang saya bicarakan. Bagian atas adalah seri asli, bagian bawah adalah seri yang dibedakan.

Setiap titik data adalah pembacaan rata-rata 5 menit dari strain gauge. Alat ukur regangan ini ditempatkan pada mesin. Area bising sesuai dengan area di mana mesin dihidupkan, area yang bersih adalah saat mesin dimatikan. Jika Anda melihat area yang dilingkari merah, ada beberapa langkah aneh dalam pembacaan yang ingin saya deteksi secara otomatis.

Saya benar-benar bingung bagaimana saya bisa melakukan ini - ada ide?

masukkan deskripsi gambar di sini


Apa itu langkah anomali? apakah mesin dimatikan? Saya bisa melihat patten serupa dalam lingkaran merah di bagian seri lainnya? Apakah saya melewatkan sesuatu untuk dilihat dalam plot?
vinux

Ini sepertinya sulit. Pemikiran fisrt saya: memodelkan status on / off (tersembunyi) oleh Rantai Markov. Fenomena yang ingin Anda deteksi adalah kemunculan beberapa nilai penting dalam seri berbeda ketika mesin dimatikan, jadi jika Anda dapat menghitung pada setiap saat probabilitas mesin dimatikan, Anda mungkin dapat mendeteksinya sebagai " nilai penting ketika probabilitas mati tinggi ".
Elvis

Saya berpikir dua kali. Saya akan mempostingnya ...
Elvis

Jawaban:


14

Tampaknya Anda mencari paku dalam interval waktu yang relatif tenang . "Relatif" berarti dibandingkan dengan nilai-nilai terdekat yang khas, yang menyarankan perataan seri. Sebuah kuat halus diinginkan justru karena tidak harus dipengaruhi oleh paku lokal beberapa. "Tenang" berarti variasi di sekitar yang halus itu kecil. Sekali lagi, perkiraan variasi lokal yang kuat diperlukan. Akhirnya, "lonjakan" akan menjadi residu besar sebagai kelipatan dari variasi lokal.

Untuk menerapkan resep ini , kita perlu memilih (a) seberapa dekat arti "terdekat", (b) resep untuk menghaluskan, dan (c) resep untuk menemukan variasi lokal. Anda mungkin harus bereksperimen dengan (a), jadi mari kita menjadikannya parameter yang mudah dikontrol. Pilihan yang baik dan tersedia untuk (b) dan (c) masing-masing adalah Lowess dan IQR . Berikut ini adalah Rimplementasinya:

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
}

Sebagai contoh penggunaannya, pertimbangkan data simulasi ini di mana dua lonjakan berturut-turut ditambahkan ke periode tenang (dua berturut-turut harus lebih sulit untuk dideteksi daripada satu lonjakan terisolasi):

> 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)

Data simulasi

Berikut ini plot diagnostiknya:

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

Plot diagnostik

Terlepas dari semua kebisingan di data asli, plot ini dengan indah mendeteksi paku (yang relatif kecil) di tengah. Otomatis deteksi dengan memindai f(x)nilai-nilai lebih besar (lebih besar dari sekitar 5 dalam nilai absolut: percobaan untuk melihat apa yang paling baik dengan data sampel).

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

Deteksi palsu pada waktu 273 adalah outlier lokal acak. Anda dapat memperhalus tes untuk mengecualikan (sebagian besar) nilai palsu tersebut dengan memodifikasi funtuk mencari nilai diagnostik r/zdan nilai IQR rendah yang berjalan bersamaan z. Namun, meskipun diagnostik memiliki skala dan interpretasi universal (tanpa unit), makna IQR "rendah" tergantung pada unit data dan harus ditentukan dari pengalaman.


Paragraf terakhir didasarkan pada data simulasi seperti, tetapi tidak persis sama dengan yang ditunjukkan di sini. Dalam plot diagnostik ini jelas ada nilai palsu lainnya hingga sekitar 7,5 dalam ukuran dan dua paku memiliki nilai sekitar 14.
Whuber

Jawaban yang bagus - ini terlihat menjanjikan. Terima kasih banyak. Saya akan menghubungi Anda nanti dengan hasil saya.
mohamedmoussa

Hanya tindak lanjut cepat - Saya melakukan hal yang serupa dengan apa yang Anda lakukan, tetapi saya memiliki akses ke standar deviasi data dalam setiap titik data (mis. Dalam setiap periode 5 menit). Saya dibagi dengan STD yang dihaluskan dan saya mendapatkan beberapa hasil yang cukup bagus.
mohamedmoussa

wow, aku merindukan itu! (+1!)
Elvis

3

Berikut adalah saran dua sen.

Menunjukkan Xtseri yang dibedakan. DiberikanΔ>0 dan sebuah titik t, tentukan

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

Karena katakanlah Δ=50, nilai dari a(Δ,t) mencirikan zona mati / hidup dengan nilai rendah / tinggi.

Langkah anomali adalah sebuah titik t dimana |Xt|>αa(Δ,t) - Anda harus melakukan penyetelan α,Δuntuk mendeteksi apa yang Anda inginkan, dan menghindari false positive ketika mesin menyala. Saya akan coba dulu denganΔ=50 dan α=4.

Atau, Anda bisa melihat poin t dimana a(δ,t)>αa(Δ,t) untuk sebuah δΔ (misalnya δ=10, Δ=100), yang dapat membantu fine tuning (dalam hal ini, Anda akan mengambil nilai yang lebih kecil untuk α).


apakah mungkin untuk menulis kode R untuk mengimplementasikan ini? Terima kasih!
user9292
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.