Rangkaian waktu 'pengelompokan' di R

38

Saya memiliki satu set data deret waktu. Setiap seri mencakup periode yang sama, meskipun tanggal sebenarnya dalam setiap seri waktu mungkin tidak semuanya 'berbaris' persis.

Dengan kata lain, jika seri Time harus dibaca ke dalam matriks 2D, itu akan terlihat seperti ini:

date     T1   T2   T3 .... TN
1/1/01   100  59   42      N/A
2/1/01   120  29   N/A     42.5
3/1/01   110  N/A  12      36.82
4/1/01   N/A  59   40      61.82
5/1/01    05  99   42      23.68
...
31/12/01  100  59   42     N/A

etc 

Saya ingin menulis skrip R yang akan memisahkan deret waktu {T1, T2, ... TN} menjadi 'keluarga' di mana sebuah keluarga didefinisikan sebagai serangkaian deret yang "cenderung bergerak dalam simpati" satu sama lain.

Untuk bagian 'pengelompokan', saya perlu memilih / menentukan jenis ukuran jarak. Saya tidak yakin bagaimana cara melakukannya, karena saya berurusan dengan deret waktu, dan sepasang deret yang mungkin bergerak dengan simpati selama satu interval, mungkin tidak melakukannya dalam interval berikutnya.

Saya yakin ada orang yang jauh lebih berpengalaman / pintar daripada saya di sini, jadi saya akan berterima kasih atas saran, ide tentang algoritma / heuristik apa yang digunakan untuk mengukur jarak dan bagaimana menggunakannya dalam pengelompokan deret waktu.

Dugaan saya adalah bahwa TIDAK ada metode statistik kuat yang mapan untuk melakukan ini, jadi saya akan sangat tertarik untuk melihat bagaimana orang mendekati / menyelesaikan masalah ini - berpikir seperti ahli statistik.

morf
sumber
1
Anda mungkin juga tertarik dengan jawaban untuk pertanyaan ini, stats.stackexchange.com/q/2777/1036
Andy W
1
Dan yang ini: stats.stackexchange.com/questions/3331/…
Rob Hyndman
1
Ada metode statistik yang didasarkan pada proses Dirichlet yang berfungsi untuk dataset di mana titik waktu tidak sama untuk semua sampel.
Dario

Jawaban:

24

Dalam streaming data dan penambangan basis data deret waktu, pendekatan umum adalah mengubah deret menjadi representasi simbolis, kemudian menggunakan metrik kesamaan, seperti jarak Euclidean, untuk mengelompokkan deret tersebut. Representasi yang paling populer adalah SAX (Keogh & Lin) atau iSAX yang lebih baru (Shieh & Keogh):

Halaman di atas juga mengandung referensi untuk metrik jarak dan pengelompokan. Keogh dan kru terlibat dalam penelitian yang dapat direproduksi dan cukup reseptif untuk merilis kode mereka. Jadi, Anda dapat mengirim email kepada mereka dan bertanya. Saya percaya mereka cenderung bekerja di MATLAB / C ++.

Ada upaya terbaru untuk menghasilkan implementasi Java dan R:

Saya tidak tahu sejauh mana itu - itu diarahkan untuk mencari motif, tetapi, tergantung pada seberapa jauh mereka telah mendapatkan, itu harus memiliki bit yang diperlukan Anda perlu menyatukan sesuatu untuk kebutuhan Anda (iSAX dan metrik jarak: karena bagian ini biasa ditemukan pada pengelompokan dan motif).

ars
sumber
1
Ini terlihat seperti titik awal yang baik dan dapat ditelusuri. terima kasih atas tautannya.
morpheous
4
Omong kosong, saya pikir halaman SAX adalah halaman web paling jelek yang pernah saya lihat!
naught101
18

Cara lain untuk mengatakan "cenderung bergerak dalam simpati" adalah "terkointegrasi".

Ada dua cara standar untuk menghitung kointegrasi : Metode Engle-Granger dan prosedur Johansen. Ini tercakup dalam "Analisis Rangkaian Waktu Terpadu dan Terpointegrasi dengan R" (Pfaff 2008) dan paket R urca terkait . Saya sangat merekomendasikan buku ini jika Anda ingin mengejar metode ini di R.

Saya juga menyarankan agar Anda melihat pertanyaan ini pada rangkaian waktu multivarian dan, khususnya, pada kursus Ruey Tsay di U. Chicago yang mencakup semua kode R yang diperlukan.

Shane
sumber
Saya telah bertemu dengan beberapa kointegrasi beberapa tahun lalu - tetapi itu tampak sangat rumit bagi saya (saya tidak memahaminya!). Saya berharap akan ada lebih teoritis (yaitu lebih praktis) solusi ...
morpheous
3
Metode Engle-Granger tidak terlalu rumit: Anda hanya mengambil residu dari regresi antara dua seri dan menentukan apakah ia memiliki unit root. Ini tentu saja praktis: digunakan secara teratur untuk spektrum masalah yang luas. Yang mengatakan, saya membayangkan bahwa setiap jawaban atas pertanyaan Anda akan memerlukan pengetahuan statistik (misalnya, Anda harus memahami hal-hal seperti stasioneritas, kemandirian, dll.) ...
Shane
apakah ada cara yang lebih baik untuk melakukan ini daripada menguji semua seri pasangan-bijaksana untuk integrasi bersama (dengan cita-cita yang sama untuk mengelompokkan seri?) Juga bukankah saran ini tergantung pada kenyataan bahwa seri itu sendiri terintegrasi di awal?
Andy W
@Andy: Saya yakin ada cara yang lebih baik, dan saya berharap dapat mendengarnya. Ini adalah pendekatan yang cukup mendasar.
Shane
1
> saya tidak bisa menyarankan hal lain, tetapi kointegrasi keduanya sangat rapuh ('asumsi parametrik' menjadi seri liar) dalam praktik dan tidak cocok untuk tugas yang sedang dikerjakan: pada setiap langkah, ini sama dengan melakukan pengelompokan hierarkis, paling banyak menggabungkan dua seri kepada satu (rata-rata yang terintegrasi).
user603
4

Rangkaian waktu pengelompokan dilakukan cukup umum oleh dinamacis populasi, khususnya yang mempelajari serangga untuk memahami tren wabah dan keruntuhan. Cari pekerjaan pada ngengat Gypsy, budoworm Spruce, kumbang pinus gunung dan larch budmoth.

Untuk pengelompokan yang sebenarnya Anda dapat memilih metrik jarak apa pun yang Anda suka, masing-masing mungkin memiliki kekuatan dan minggu itu sendiri relatif terhadap jenis data yang dikelompokkan, Kaufmann dan Rousseeuw 1990. Menemukan kelompok dalam data. Pengantar analisis klaster adalah tempat yang baik untuk memulai. Ingat, metode pengelompokan tidak 'peduli' bahwa Anda menggunakan deret waktu, hanya melihat nilai yang diukur pada titik waktu yang sama. Jika dua seri waktu Anda tidak selaras dengan masa pakainya, mereka tidak akan (dan mungkin tidak boleh) mengelompok.

Di mana Anda akan mengalami masalah adalah menentukan jumlah cluster (keluarga) yang akan digunakan setelah Anda mengelompokkan deret waktu. Ada berbagai cara untuk memilih potongan-potongan kluster informatif, tetapi di sini literaturnya tidak begitu bagus.

Chris
sumber
1
y1,t
1
@ user603 Bisakah Anda menjelaskan "Anda juga harus mengakui bahwa rangkaian sangat berkorelasi dengan masa lalunya sendiri dengan menempatkan masing-masing y1, t sebagai dimensi sendiri (yaitu menghasilkan dimensi N * T)" tolong?
B_Miner
2

Lihat jawaban saya untuk pertanyaan serupa di sini . Singkatnya, lakukan transformasi Fourier data yang cepat, buang frekuensi berlebihan jika data input Anda dihargai nyata, pisahkan bagian nyata dan imajiner untuk setiap elemen transformasi Fourier cepat, dan gunakan paket Mclust di R untuk melakukan model- pengelompokan berdasarkan pada bagian nyata dan imajiner dari setiap elemen dari setiap seri waktu. Paket mengotomatiskan pengoptimalan terhadap jumlah cluster dan kepadatannya.

Keseimbangan kurang ajar
sumber
0

Anda juga bisa menggunakan paket clustDDist, yang melakukan metode pemimpin dan metode pengelompokan hierarkis dengan langkah-langkah kesalahan yang berbeda:

http://r-forge.r-project.org/projects/clustddist/

d4(x,y)=(xy)2y
Tomaz
sumber