Posting ini adalah kelanjutan dari posting lain yang terkait dengan metode umum untuk deteksi outlier dalam deret waktu . Pada dasarnya, pada titik ini saya tertarik pada cara yang kuat untuk menemukan periodisitas / musim dari rangkaian waktu generik yang dipengaruhi oleh banyak kebisingan. Dari sudut pandang pengembang, saya ingin antarmuka yang sederhana seperti:
unsigned int discover_period(vector<double> v);
Di mana v
array berisi sampel, dan nilai kembali adalah periode sinyal. Poin utamanya adalah, sekali lagi, saya tidak bisa membuat asumsi mengenai sinyal yang dianalisis. Saya sudah mencoba pendekatan yang didasarkan pada autokorelasi sinyal (mendeteksi puncak suatu korelasiogram), tetapi tidak sekuat yang saya inginkan.
time-series
algorithms
frequency
real-time
gianluca
sumber
sumber
Jawaban:
Jika Anda benar-benar tidak tahu apa periodisitasnya, mungkin pendekatan terbaik adalah menemukan frekuensi yang sesuai dengan maksimum kepadatan spektral. Namun, spektrum pada frekuensi rendah akan dipengaruhi oleh tren, jadi Anda harus membatalkan seri terlebih dahulu. Fungsi R berikut harus melakukan pekerjaan untuk sebagian besar seri. Ini jauh dari sempurna, tetapi saya telah mengujinya pada beberapa lusin contoh dan tampaknya berfungsi ok. Ini akan mengembalikan 1 untuk data yang tidak memiliki periodisitas kuat, dan panjang periode sebaliknya.
Pembaruan: Versi 2 fungsi. Ini jauh lebih cepat dan tampaknya lebih kuat.
sumber
findfrequency
Jika Anda mengharapkan proses menjadi diam - periodisitas / musim tidak akan berubah seiring waktu - maka sesuatu seperti periodogram Chi-square (lihat misalnya Sokolove dan Bushell, 1978) mungkin merupakan pilihan yang baik. Ini umumnya digunakan dalam analisis data sirkadian yang dapat memiliki jumlah suara yang sangat besar di dalamnya, tetapi diharapkan memiliki periodikitas yang sangat stabil.
Pendekatan ini tidak membuat asumsi tentang bentuk gelombang (selain dari itu konsisten dari siklus ke siklus), tetapi memang mensyaratkan bahwa setiap kebisingan menjadi rata-rata konstan dan tidak berkorelasi dengan sinyal.
Dua baris terakhir hanyalah sebuah contoh, yang menunjukkan bahwa ia dapat mengidentifikasi periode fungsi trigonometri murni, bahkan dengan banyak noise tambahan.
Seperti yang ditulis, argumen terakhir (
alpha
) dalam panggilan itu berlebihan, fungsinya hanya mengembalikan periode 'terbaik' yang dapat ditemukan; batalkan komentar pertamareturn
dan komentar kedua untuk mengembalikan daftar semua periode yang signifikan di level tersebutalpha
.Fungsi ini tidak melakukan pengecekan kewarasan apa pun untuk memastikan bahwa Anda telah memasukkan periode yang dapat diidentifikasi, juga tidak (dapat) bekerja dengan periode fraksional, juga tidak ada semacam kontrol perbandingan ganda yang dibangun jika Anda memutuskan untuk lihat beberapa periode. Tetapi selain itu harus cukup kuat.
sumber
Anda mungkin ingin mendefinisikan apa yang Anda inginkan dengan lebih jelas (untuk diri sendiri, jika tidak di sini). Jika yang Anda cari adalah periode diam paling signifikan secara statistik yang terkandung dalam data bising Anda, pada dasarnya ada dua rute yang harus diambil:
1) menghitung estimasi autokorelasi yang kuat, dan mengambil koefisien maksimum
2) menghitung estimasi kepadatan spektral daya yang kuat, dan mengambil maksimum spektrum
Masalah dengan # 2 adalah untuk deret waktu yang berisik, Anda akan mendapatkan sejumlah besar daya dalam frekuensi rendah, sehingga sulit untuk dibedakan. Ada beberapa teknik untuk menyelesaikan masalah ini (yaitu pra-pemutihan, lalu perkirakan PSD), tetapi jika periode sebenarnya dari data Anda cukup lama, deteksi otomatis akan rapuh.
Taruhan terbaik Anda mungkin untuk menerapkan rutin autokorelasi yang kuat seperti yang dapat ditemukan di bab 8.6, 8.7 di Robust Statistics - Theory and Methods oleh Maronna, Martin dan Yohai. Mencari Google untuk "durbin-levinson yang kuat" juga akan menghasilkan beberapa hasil.
Jika Anda hanya mencari jawaban sederhana, saya tidak yakin jawabannya ada. Deteksi periode dalam deret waktu bisa rumit, dan meminta rutin otomatis yang dapat melakukan sihir mungkin terlalu banyak.
sumber
Anda bisa menggunakan Hilbert Transformation from the DSP theory untuk mengukur frekuensi sesaat dari data Anda. Situs http://ta-lib.org/ memiliki kode sumber terbuka untuk mengukur periode siklus dominan dari data keuangan; fungsi yang relevan disebut HT_DCPERIOD; Anda mungkin dapat menggunakan ini atau menyesuaikan kode dengan tujuan Anda.
sumber
Pendekatan yang berbeda bisa berupa Dekomposisi Mode Empiris. Paket R disebut EMD yang dikembangkan oleh penemu metode:
Metode ini diberi merek 'Empiris' untuk alasan yang baik dan ada risiko bahwa Fungsi Mode Intrinsik (komponen aditif individu) ikut campur. Di sisi lain metode ini sangat intuitif dan dapat membantu untuk inspeksi visual yang cepat dari siklus.
sumber
Mengacu pada pos Rob Hyndman di atas https://stats.stackexchange.com/a/1214/70282
Fungsi find.freq bekerja dengan sangat baik. Pada set data harian yang saya gunakan, frekuensi frekuensinya menjadi 7.
Ketika saya mencobanya hanya pada hari-hari minggu, frekuensinya adalah 23, yang sangat dekat dengan 21,42857 = 29,6 * 5/7 yang merupakan jumlah rata-rata hari kerja dalam sebulan. (Atau sebaliknya 23 * 7/5 adalah 32.)
Melihat kembali data harian saya, saya bereksperimen dengan firasat mengambil periode pertama, rata-rata dengan itu dan kemudian menemukan periode berikutnya, dll. Lihat di bawah:
Di atas memberi (7,28) atau (7,35) tergantung pada apakah seq dimulai dengan 1 atau f. (Lihat komentar di atas.)
Yang akan menyiratkan bahwa periode musiman untuk msts (...) harus (7,28) atau (7,35).
Logika muncul sensitif terhadap kondisi awal mengingat sensitivitas parameter algoritma. Rata-rata 28 dan 35 adalah 31,5 yang dekat dengan panjang rata-rata sebulan.
Saya kira saya menemukan kembali roda, apa nama algoritma ini? Apakah ada implementasi yang lebih baik di R di suatu tempat?
Kemudian, saya menjalankan kode di atas dalam mencoba semua mulai dari 1 sampai 7 dan saya mendapat 35,35,28,28,28,28,28 untuk periode kedua. Rata-rata berhasil hingga 30 yang merupakan jumlah rata-rata hari dalam sebulan. Menarik...
Ada pemikiran atau komentar?
sumber
Seseorang juga dapat menggunakan tes Ljung-Box untuk mengetahui perbedaan musim mana yang mencapai stasioneritas terbaik. Saya sedang mengerjakan subjek yang berbeda dan saya menggunakan ini sebenarnya untuk tujuan yang sama. Coba periode yang berbeda seperti 3 hingga 24 untuk data bulanan. Dan uji masing-masing dengan Ljung-Box dan simpan hasil Chi-Square. Dan pilih periode dengan nilai chi-square terendah.
Berikut adalah kode sederhana untuk melakukannya.
sumber