Merapikan data deret waktu

14

Saya sedang membangun aplikasi android yang merekam data accelerometer selama tidur, untuk menganalisis tren tidur dan secara opsional membangunkan pengguna di dekat waktu yang diinginkan selama tidur ringan.

Saya sudah membangun komponen yang mengumpulkan dan menyimpan data, serta alarm. Saya masih perlu menangani binatang menampilkan dan menyimpan data tidur dengan cara yang benar-benar bermakna dan jelas, yang lebih disukai juga cocok untuk dianalisis.

Beberapa gambar mengatakan dua ribu kata: (Saya hanya dapat memposting satu tautan karena rep yang rendah)

Inilah data tanpa filter, jumlah gerakan, dikumpulkan pada interval 30 detik

Dan data yang sama, dihaluskan oleh manifestasi bergerak rata-rata saya sendiri

sunting) kedua grafik mencerminkan kalibrasi - ada filter 'noise' minimum dan filter cutoff maksimum, serta level pemicu alarm (garis putih)

Sayangnya, tak satu pun dari ini adalah solusi optimal-yang pertama agak sulit dipahami bagi pengguna rata-rata, dan yang kedua, yang lebih mudah dipahami, menyembunyikan banyak hal yang sebenarnya terjadi. Secara khusus rata-rata menghilangkan detail paku dalam gerakan - dan saya pikir itu bisa bermakna.

Jadi mengapa grafik ini sangat penting? Rangkaian waktu ini ditampilkan sepanjang malam sebagai umpan balik kepada pengguna, dan akan disimpan untuk ditinjau / dianalisis nanti. Penghalusan idealnya akan menurunkan biaya memori (baik RAM dan penyimpanan), dan membuat rendering lebih cepat pada ponsel / perangkat yang kekurangan sumber daya ini.

Jelas ada cara yang lebih baik untuk memuluskan data-saya punya beberapa ide yang tidak jelas, seperti menggunakan regresi linier untuk mengetahui perubahan 'tajam' dalam pergerakan dan memodifikasi smoothing moving average saya sesuai. Saya benar-benar membutuhkan lebih banyak bimbingan dan masukan sebelum saya terjun langsung ke sesuatu yang bisa diselesaikan secara lebih optimal.

Terima kasih!

Jon
sumber

Jawaban:

16

Pertama, persyaratan untuk kompresi dan analisis / presentasi tidak selalu sama - memang, untuk analisis Anda mungkin ingin menyimpan semua data mentah dan memiliki kemampuan untuk mengiris dan memotongnya dengan berbagai cara. Dan apa yang terbaik untuk Anda akan sangat bergantung pada apa yang ingin Anda dapatkan darinya. Tetapi ada sejumlah trik standar yang bisa Anda coba:

  • Gunakan perbedaan daripada data mentah
  • Gunakan thresholding untuk menghilangkan noise tingkat rendah. (Gabungkan dengan perbedaan untuk mengabaikan perubahan kecil.)
  • Gunakan varians dari beberapa window waktu daripada rata-rata, untuk menangkap level aktivitas daripada pergerakan
  • Ubah basis waktu dari interval tetap ke jangka panjang variabel dan terakumulasi menjadi satu urutan titik data tunggal dari perubahan yang dimiliki beberapa kriteria (mis. Perbedaan dalam arah yang sama, hingga beberapa ambang batas)
  • Mengubah data dari nilai riil menjadi ordinal (mis. Rendah, sedang, tinggi); Anda juga bisa melakukan ini pada nampan waktu daripada sampel individu - misalnya, tingkat aktivitas untuk setiap 5 menit peregangan
  • Gunakan kernel konvolusi yang sesuai * untuk memuluskan lebih halus daripada moving average Anda atau memilih fitur-fitur menarik seperti perubahan tajam.
  • Gunakan perpustakaan FFT untuk menghitung spektrum daya

Yang terakhir mungkin agak mahal untuk keperluan Anda, tetapi mungkin akan memberi Anda beberapa opsi presentasi yang sangat berguna, dalam hal "ritme tidur" dan semacamnya. (Saya hampir tidak tahu apa-apa tentang Android, tetapi bisa dibayangkan bahwa beberapa / banyak / semua handset mungkin telah dibangun di perangkat keras DSP yang dapat Anda manfaatkan.)


* Mengingat betapa berbelit-belitnya pusat pemrosesan sinyal digital, sangat sulit menemukan intro online yang dapat diakses. Atau setidaknya dalam 3 menit googling. Saran diterima!

walkytalky
sumber
10

Ada banyak algoritma smoothing nonparametric termasuk splines dan loess. Tetapi mereka juga akan memuluskan perubahan mendadak. Begitu juga filter low-pass. Saya pikir Anda mungkin memerlukan lebih halus berbasis wavelet yang memungkinkan lompatan tiba-tiba tetapi masih menghaluskan suara.

Lihat Percival dan Walden (2000) dan paket R terkait . Meskipun Anda menginginkan solusi java, algoritme dalam paket R adalah open-source dan Anda mungkin bisa menerjemahkannya.

Rob Hyndman
sumber
3

Ini agak bersinggungan dengan apa yang Anda tanyakan, tetapi mungkin perlu melihat pada filter Kalman.

NPE
sumber
1

Penghalusan Savitzky-Golay bisa menjadi jawaban yang bagus. Ini adalah implementasi yang sangat efisien dari kuadrat terkecil yang dihaluskan ke jendela geser waktu (lilitan atas data itu) yang turun hanya dengan mengalikan data di setiap jendela waktu dengan konstanta tetap. Anda dapat menyesuaikan nilai, turunan, turunan kedua, dan lebih tinggi.

Anda memilih seberapa runcing Anda membiarkan hasilnya, berdasarkan pada ukuran jendela waktu geser dan tingkat kecocokan polinomial pada jendela waktu itu. Itu awalnya dikembangkan untuk kromatografi, di mana puncak adalah bagian penting dari hasil. Satu sifat yang diinginkan dari perataan SG adalah bahwa lokasi puncak dipertahankan. Misalnya, jendela 5 hingga 11 titik dengan kurva kubik cocok memotong kebisingan tetapi tetap mempertahankan puncak.

Ada artikel bagus di Wikipedia, meskipun disebut sebagai Savitzky-Golay filter (melakukan sedikit kekerasan terhadap terminologi normal dari teori kontrol sistem dan analisis deret waktu, serta makalah asli, di mana makalah itu disebut smoothing). Perlu diketahui juga bahwa ada (argumen atas) kesalahan dalam artikel Wikipedia untuk formula untuk perkiraan turunan kedua - lihat bagian Talk untuk artikel itu. EDIT: Artikel Wikipedia diperbaiki

RUPS
sumber