Apakah mungkin melakukan pengelompokan seri waktu berdasarkan bentuk kurva?

47

Saya memiliki data penjualan untuk serangkaian outlet, dan ingin mengategorikannya berdasarkan bentuk kurva mereka dari waktu ke waktu. Data terlihat kurang lebih seperti ini (tetapi jelas tidak acak, dan memiliki beberapa data yang hilang):

n.quarters <- 100
n.stores <- 20
if (exists("test.data")){
  rm(test.data)
}
for (i in 1:n.stores){
  interval <- runif(1, 1, 200)
  new.df <- data.frame(              
    var0 = interval + c(0, cumsum(runif(49, -5, 5))),
    date = seq.Date(as.Date("1990-03-30"), by="3 month", length.out=n.quarters),
    store = rep(paste("Store", i, sep=""), n.quarters))
  if (exists("test.data")){
    test.data <- rbind(test.data, new.df)    
  } else {
    test.data <- new.df
  }
}
test.data$store <- factor(test.data$store)

Saya ingin tahu bagaimana saya bisa mengelompokkan berdasarkan bentuk kurva di R. Saya telah mempertimbangkan pendekatan berikut:

  1. Buat kolom baru dengan mengubah secara linear setiap var0 toko ke nilai antara 0,0 dan 1,0 untuk seluruh rangkaian waktu.
  2. Cluster kurva yang diubah ini menggunakan kmlpaket dalam R.

Saya punya dua pertanyaan:

  1. Apakah ini pendekatan eksplorasi yang masuk akal?
  2. Bagaimana saya bisa mengubah data saya menjadi format data longitudinal yang kmlakan mengerti? Cuplikan R akan sangat dihargai!
fmark
sumber
2
Anda mungkin mendapatkan beberapa ide dari pertanyaan sebelumnya tentang pengelompokan lintasan data longitudinal individual stats.stackexchange.com/questions/2777/…
Jeromy Anglim
1
@Jeromy Anglin Terima kasih atas tautannya. Apakah Anda beruntung kml?
fmark
Saya sudah melihat sekilas, tetapi untuk saat ini saya menggunakan analisis klaster khusus berdasarkan fitur yang dipilih dari rangkaian waktu individu (misalnya, rata-rata, awal, akhir, variabilitas, adanya perubahan mendadak, dll.).
Jeromy Anglim
Apakah ini duplikat? stats.stackexchange.com/questions/3238/…
Rob Hyndman
@Rob Pertanyaan ini sepertinya tidak mengasumsikan interval waktu yang tidak teratur, tetapi memang mereka saling berdekatan (saya tidak mengingatkan pertanyaan lain pada saat tulisan saya).
chl

Jawaban:

26

Beberapa arahan untuk menganalisis data longitudinal dibahas dalam tautan yang disediakan oleh @Jeromy, jadi saya akan menyarankan Anda untuk membacanya dengan cermat, terutama pada analisis data fungsional. Coba googling untuk "Clustering Fungsional Data Longitudinal", atau kotak alat PACE Matlab yang secara khusus berkaitan dengan pengelompokan berbasis model lintasan sampel tidak teratur (Peng dan Müller, pengelompokan berbasis jarak dari proses stokastik yang jarang diamati, dengan aplikasi untuk lelang online , Annals of Applied Statistics 2008 2: 1056). Saya bisa membayangkan bahwa mungkin ada kerangka kerja statistik yang baik untuk seri waktu keuangan, tetapi saya tidak tahu tentang itu.

kmltniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. Data yang hilang ditangani melalui sedikit modifikasi ukuran jarak sebelumnya (penyesuaian Gower) yang terkait dengan skema imputasi seperti tetangga terdekat (untuk menghitung kriteria Calinski). Karena saya tidak mewakili diri saya seperti apa data Anda yang sebenarnya, saya tidak bisa mengatakan apakah itu akan berfungsi. Setidaknya, ia bekerja dengan kurva pertumbuhan longitudinal, bentuk "polinomial", tetapi saya ragu itu akan memungkinkan Anda untuk mendeteksi pola yang sangat spesifik (seperti minimum / maksimum lokal pada titik waktu tertentu dengan titik waktu yang berbeda di antara kluster, dengan terjemahan untuk contoh). Jika Anda tertarik mengelompokkan kurva yang mungkin tidak selaras, maka Anda harus melihat solusi lain; Pengelompokan dan penyelarasan fungsional , dari Sangalli et al., Dan referensi di dalamnya dapat memberikan titik awal yang baik.

kmlclusterizLongDataidt

library(lattice)
xyplot(var0 ~ date, data=test.data, groups=store, type=c("l","g"))

tw <- reshape(test.data, timevar="date", idvar="store", direction="wide")
parallel(tw[,-1], horizontal.axis=F, 
         scales=list(x=list(rot=45, 
                            at=seq(1,ncol(tw)-1,by=2), 
                            labels=substr(names(tw[,-1])[seq(1,ncol(tw)-1,by=2)],6,100), 
                            cex=.5)))

library(kml)
names(tw) <- c("id", paste("t", 1:(ncol(tw)-1)))
tw.cld <- as.cld(tw)
cld.res <- kml(tw.cld,nbRedrawing=5)
plot(tw.cld)

Dua angka berikutnya adalah data simulasi mentah dan solusi lima klaster (sesuai dengan kriteria Calinski, juga digunakan dalam paket fpc ). Saya tidak menunjukkan versi skala .

teks alternatif

teks alternatif

chl
sumber
1
Terima kasih atas jawaban chi Anda yang sangat mendetail. Saya sudah kmlmenjalankan data saya, tetapi seperti yang Anda sarankan itu sebagian besar berdasarkan pada besarnya bukan bentuk kurva, jadi saya mencoba beberapa langkah pra-pemrosesan untuk melihat apakah saya dapat memperbaiki masalah. Karya Sangalli et al. terlihat sangat menjanjikan untuk apa yang ingin saya lakukan - saya tidak dapat menemukan implementasi dari pendekatan mereka. Saya mungkin tidak punya waktu untuk membuat implementasi pekerjaan mereka sendiri untuk proyek ini, bagaimanapun juga. Apakah Anda mengetahui adanya implementasi FOSS?
fmark
@ tanda Tidak ada implementasi OSS untuk pengetahuan saya (pekerjaannya cukup baru, meskipun); mereka menggunakan k-means dan k-medoid yang keduanya tersedia di R. Menurut saya, bagian yang paling penting adalah untuk menghasilkan kurva templat dan mengimplementasikan fungsi warping. Untuk itu, Anda dapat menemukan info tambahan dengan melihat analisis morfometri / procruste, atau mencari kode kotak alat Matlab PACE (tetapi ini harus penuh EM atau hal-hal seperti itu). Rekomendasi terbaik saya adalah: Minta penulis untuk implementasi algoritma mereka secara gratis.
chl
2
Saya akan melaporkan kembali jika saya mendapatkan afirmatif :) Kertas mereka rata-rata keselarasan kurva untuk pengelompokan kurva memiliki beberapa detail implementasi yang juga mungkin berguna bagi seseorang yang ingin melakukan ini sendiri.
fmark
1
Mengapa tidak menghapus saja nilai rata-rata (dan mungkin membaginya dengan devaluasi standar), lalu lakukan ini? Maka hasilnya akan jauh lebih banyak tentang bentuk, dan kurang tentang besarnya ...
non't101
9

Pendekatan alternatif diterbitkan oleh stats.se biasa di Wang, Xiaozhe, Kate Smith, dan Rob Hyndman.

'Clustering Berbasis Karakteristik untuk Data Time Series'. Penambangan Data dan Penemuan Pengetahuan 13, no. 3 (2006): 335-364 .

Mereka menulis:

Makalah ini mengusulkan metode untuk pengelompokan deret waktu berdasarkan karakteristik struktural mereka. Tidak seperti alternatif lain, metode ini tidak mengelompokkan nilai titik menggunakan metrik jarak, melainkan mengelompokkan berdasarkan fitur global yang diekstrak dari deret waktu. Langkah-langkah fitur diperoleh dari setiap seri individu dan dapat dimasukkan ke dalam algoritma pengelompokan sewenang-wenang, termasuk algoritma jaringan saraf yang tidak diawasi, peta pengorganisasian diri, atau algoritma pengelompokan hierarki. Ukuran global yang menggambarkan deret waktu diperoleh dengan menerapkan operasi statistik yang paling baik menangkap karakteristik yang mendasarinya: tren, musim, periodisitas, korelasi serial, skewness, kurtosis, kekacauan, nonlinier, dan kemiripan diri. Karena cluster metode menggunakan langkah-langkah global yang diekstraksi, ini mengurangi dimensi deret waktu dan jauh kurang sensitif terhadap data yang hilang atau berisik. Kami selanjutnya menyediakan mekanisme pencarian untuk menemukan pilihan terbaik dari set fitur yang harus digunakan sebagai input pengelompokan.

Kode R tersedia di blog Rob .

fmark
sumber
6

Anda bisa melihat karya Eamonn Keogh (UC Riverside) tentang pengelompokan seri waktu. Situs webnya memiliki banyak sumber daya. Saya pikir dia memberikan contoh kode Matlab, jadi Anda harus menerjemahkan ini ke R.

Penyangga Irlandia
sumber