Bagaimana cara mengurangi jumlah titik data dalam satu seri?

11

Saya belum belajar statistik selama lebih dari 10 tahun (dan kemudian hanya kursus dasar), jadi mungkin pertanyaan saya agak sulit untuk dipahami.

Bagaimanapun, apa yang ingin saya lakukan adalah mengurangi jumlah titik data dalam suatu seri. Sumbu x adalah jumlah milidetik sejak dimulainya pengukuran dan sumbu y adalah bacaan untuk titik itu.

Seringkali ada ribuan titik data, tetapi saya mungkin hanya perlu beberapa ratus. Jadi pertanyaan saya adalah: Bagaimana cara mengurangi jumlah poin data secara akurat?

Apa prosesnya? (Jadi saya bisa google itu) Apakah ada algoritma yang disukai (saya akan menerapkannya dalam C #)

Semoga Anda mendapat petunjuk. Maaf atas kurangnya terminologi yang tepat.


Sunting: Detail lebih lanjut datang ke sini:

Data mentah yang saya dapatkan adalah data detak jantung, dan dalam bentuk jumlah milidetik sejak detak terakhir. Sebelum memplot data, saya menghitung jumlah milidetik dari sampel pertama, dan bpm (denyut per menit) pada setiap titik data (60000 / kaliincelastbeat).

Saya ingin memvisualisasikan data, yaitu memplotnya dalam grafik garis. Saya ingin mengurangi jumlah titik dalam grafik dari ribuan menjadi beberapa ratus.

Salah satu opsi adalah menghitung rata-rata bpm untuk setiap detik dalam seri, atau mungkin setiap 5 detik atau lebih. Itu akan sangat mudah jika saya tahu saya akan memiliki setidaknya satu sampel untuk masing-masing periode (detik interval 5 detik).

Rob Hyndman
sumber
Saya lupa ini: Titik-titik di sepanjang sumbu x datang dengan jarak yang bervariasi.
Saya tidak yakin saya mengerti. Apakah kamu tidak memiliki sumbu y?
Ah maaf. Saya salah ketik. Saya sekarang telah mengubahnya di atas.
Saya juga berpikir Anda perlu memberikan sedikit informasi lebih lanjut. Misalnya, saya masih tidak bisa memvisualisasikan grafik. Apa tujuanmu?
Ok maaf Saya telah menambahkan beberapa detail di atas.

Jawaban:

10

Anda memiliki dua masalah: terlalu banyak poin dan cara memuluskan poin yang tersisa.

Menipiskan sampel Anda

Jika Anda memiliki terlalu banyak pengamatan yang tiba dalam waktu nyata, Anda selalu dapat menggunakan sampel acak sederhana untuk mengencerkan sampel Anda. Perhatikan, untuk ini juga benar, jumlah poin harus sangat besar.

Misalkan Anda memiliki N poin dan Anda hanya ingin n dari mereka. Kemudian hasilkan n angka acak dari distribusi seragam diskrit U (0, N-1) . Ini akan menjadi poin yang Anda gunakan.

Jika Anda ingin melakukan ini secara berurutan, yaitu pada setiap titik Anda memutuskan untuk menggunakannya atau tidak, maka terima saja poin dengan probabilitas p . Jadi, jika Anda menetapkan p = 0,01 Anda akan menerima (rata-rata) 1 poin dalam seratus.

Jika data Anda tersebar tidak merata dan Anda hanya ingin menipiskan titik-titik padat, maka buat saja fungsi penjarangan Anda sedikit lebih canggih. Misalnya, alih-alih p , bagaimana dengan:

1-halexp(-λt)

di mana adalah angka positif dan adalah waktu sejak pengamatan terakhir. Jika waktu antara dua titik besar, yaitu besar , probabilitas menerima titik adalah satu. Sebaliknya, jika dua poin saling berdekatan, kemungkinan menerima poin adalah .λtt1-hal

Anda perlu bereksperimen dengan nilai dan .λhal

Menghaluskan

Mungkin sesuatu seperti skema jenis rata-rata bergerak sederhana. Atau Anda bisa menggunakan sesuatu yang lebih maju seperti kernel yang lebih halus (seperti yang disarankan orang lain). Anda harus berhati-hati agar tidak terlalu lancar, karena saya berasumsi bahwa penurunan tiba-tiba harus diambil dengan sangat cepat dalam skenario Anda.

Seharusnya ada perpustakaan C # yang tersedia untuk hal-hal semacam ini.

Kesimpulan

Tipis jika perlu, lalu halus.

csgillespie
sumber
Ah, menarik, tapi saya harus dapat diprediksi, yaitu memiliki hasil yang sama setiap kali saya melihat data.
Dalam hal ini, hasilkan n indeks dari poin yang Anda pilih, dan simpan indeks itu.
csgillespie
Atau simpan benih ke RNG sebelum pengambilan sampel.
Dirk Eddelbuettel
Solusi Dirk mengenai benih mungkin merupakan opsi yang lebih baik.
csgillespie
Menghitung rata-rata per setiap detik tidak masalah, tetapi apa yang saya lakukan ketika tidak ada data untuk satu detik tertentu. Saya kira saya bisa melakukan interpolasi dari detik sebelum dan sesudahnya, tetapi akan lebih baik dengan beberapa metode khusus (bernama) untuk ini, jadi saya tidak mencoba untuk menciptakan sesuatu yang sudah ditemukan.
9

Yah, saya pikir kata yang Anda cari adalah "pengambilan sampel," tetapi saya tidak yakin mengapa Anda ingin melakukannya. Ribuan titik data tidak terlalu banyak. Atau apakah Anda hanya ingin memplot angka yang lebih kecil dari jarak yang sama? Itu biasanya disebut "binning."

Apakah tujuan Anda untuk menghasilkan visualisasi? Dalam hal ini, Anda mungkin ingin menyimpan data mentah, memplotnya sebagai scattergraph, kemudian menampar semacam kecenderungan sentral (garis regresi, spline, apa pun) untuk berkomunikasi apa pun yang harus dilakukan dengan pesan takehome.

Atau apakah tujuan Anda untuk merangkum hasil secara numerik dalam beberapa cara? Dalam hal ini, Anda mungkin ingin menjelaskan masalah Anda lebih detail!

Harlan
sumber
Yap, visualisasi adalah yang saya inginkan. Saya telah menambahkan beberapa info lagi dalam pertanyaan.
Menempatkan memplot data mentah dengan garis smoothing.
JoFrhwld
dengan mem-plot data mentah dengan garis smoothing --- Anda mungkin ingin juga merencanakan perubahan dalam BPM seiring waktu sebagai visualisasi terpisah.
John
5

Menghitung rata-rata mengarah ke dataset berbeda dari sekadar mengurangi jumlah titik data. Jika satu detak jantung per menit jauh lebih cepat daripada detak jantung lainnya, Anda akan kehilangan sinyal melalui proses perataan Anda.

Jika Anda menyimpulkan 125-125-0-125-125 sebagai 100 daripada cerita yang diceritakan data berbeda melalui smoothing Anda.

Kadang-kadang jantung bahkan berhenti berdetak dan saya percaya itu adalah peristiwa yang menarik namun ingin melihat data detak jantung yang diplot.

Karena itu saya akan mengusulkan agar Anda menghitung jarak antara dua titik dengan rumus seperti d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Anda menetapkan jarak minimum dalam program Anda. Kemudian Anda mengulangi data Anda dan setelah setiap titik Anda menghapus semua titik berikut yang d lebih kecil dari jarak minimum Anda.

Karena satuan waktu dan bpm tidak sama, Anda mungkin ingin memikirkan bagaimana Anda dapat menemukan cara untuk mengukur satuan secara bermakna. Untuk melakukan tugas ini dengan benar, Anda harus berbicara dengan dokter yang pada akhirnya harus menafsirkan grafik Anda dan bertanya kepada mereka informasi apa yang mereka anggap penting.

Kristen
sumber
Posting yang menarik. Saya akan melihatnya juga. Kamu mungkin benar.
2

Jika BPM tetap sama pada banyak sampel (atau mengubah sangat sedikit dengan cara yang Anda tidak khawatir), Anda dapat memotong data Anda ke digit signifikan yang benar-benar Anda pedulikan dan kemudian lakukan Run Length Encoding.

Misalnya, dalam R data ini:

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

memiliki output ini

rle(data)
Run Length Encoding
  lengths: int [1:3] 10 15 15
  values : num [1:3] 0 1 2
russellpierce
sumber
1

Anda tidak memberikan informasi yang cukup. Mengapa Anda ingin mengurangi titik data. Beberapa ribu bukanlah apa-apa hari ini.

Mengingat Anda menginginkan hasil yang sama setiap kali Anda melihat data yang sama, mungkin Anda hanya ingin membuang rata-rata. Anda memiliki spasi variabel pada sumbu x Anda. Mungkin Anda mencoba membuatnya konsisten? Dalam hal ini Anda akan menetapkan lebar nampan mungkin 50 msec, atau 100, dan kemudian rata-rata semua titik di sana. Buat lebar bin sebesar yang Anda butuhkan untuk mengurangi titik data ke ukuran set yang Anda inginkan.

Benar-benar pertanyaan yang sulit dijawab tanpa alasan mengapa Anda membuang data.

John
sumber
Ok maaf Saya telah menambahkan beberapa detail di atas.
1

Untuk mengurangi poin data Anda, Anda dapat menggunakan algoritma Ramer – Douglas – Peucker yang sangat mudah dipahami dan diimplementasikan. Sinyal sampel akan sangat mirip dengan yang asli.

Kamran Bigdely
sumber