Menemukan ekstrema lokal dari fungsi kepadatan menggunakan splines

15

Saya mencoba mencari maxima lokal untuk fungsi kepadatan probabilitas (ditemukan menggunakan densitymetode R ). Saya tidak bisa melakukan metode "lihat sekeliling tetangga" yang sederhana (di mana orang melihat-lihat titik untuk melihat apakah itu maksimum lokal sehubungan dengan tetangganya) karena ada volume data yang besar. Selain itu, tampaknya lebih efisien dan generik untuk menggunakan sesuatu seperti interpolasi Spline dan kemudian menemukan akar turunan pertama, sebagai lawan membangun "lihat sekeliling tetangga" dengan toleransi kesalahan dan parameter lainnya.

Jadi, pertanyaan saya:

  1. Diberi fungsi dari splinefun, metode apa yang akan menemukan maxima lokal?
  2. Apakah ada cara mudah / standar untuk menemukan turunan dari suatu fungsi yang dikembalikan menggunakan splinefun?
  3. Apakah ada cara yang lebih baik / standar untuk menemukan maksimum lokal dari fungsi kepadatan probabilitas?

Untuk referensi, di bawah ini adalah sebidang fungsi kerapatan saya. Fungsi kepadatan lainnya yang saya kerjakan memiliki bentuk yang serupa. Saya harus mengatakan bahwa saya baru di R, tetapi tidak baru dalam pemrograman, jadi mungkin ada perpustakaan atau paket standar untuk mencapai apa yang saya butuhkan. fungsi kepadatan

Terima kasih atas bantuan Anda!!

aaronlevin
sumber
Saya tidak jelas mengapa volume data yang besar merupakan masalah untuk metode 'melihat-lihat tetangga'. density()tidak memperkirakan kepadatan untuk setiap datum, ia memperkirakan kepadatan pada nilai n , di mana n adalah parameter yang ditentukan pengguna dengan nilai default n = 512.
onestop
Nilai saya untuk ini adalah 2 ^ 15 dan tampaknya bahwa data memiliki banyak varian pada level poin demi poin. Saya mencoba menulis max / min finder menggunakan sesuatu yang mirip dengan metode neighborhood (via msExtrema {msProcess}) dan hanya mampu mengidentifikasi beberapa maksimum, tidak semua, dengan bermain dengan pengaturan toleransi.
aaronlevin
2
Melihat kode untuk msExtrema, itu adalah pembungkus sederhana untuk peaksdari splus2Rpaket, yang Anda akan lebih baik menggunakan secara langsung jika Anda hanya menginginkan maksimum lokal dan bukan minimum lokal. Saya tidak dapat melihat mengapa menggunakan default span=3tidak akan menemukan semua maxima lokal. Dan 2 ^ 15 = 32768 seharusnya tidak cukup besar untuk efisiensi menjadi kekhawatiran besar.
onestop
Fungsi yang dikembalikan oleh splinefun memiliki argumen "turunan" yaitu 0 secara default. Setel turunan = 1 untuk turunan pertama.
Cyan
1
Hmm, peakstampaknya buggy: Ia memanggil max.coldengan pengaturan default ties.method = "random", yang tidak hanya memutus ikatan secara acak tetapi juga menetapkan toleransi relatif 1e-5 untuk menyatakan dasi. Yang pertama membingungkan, yang terakhir jelas bukan yang Anda inginkan di sini. peaks()juga mengambil strictparameter yang kurang didokumentasikan dan, melihat kode fungsi, tidak melakukan apa pun. Ah, kegembiraan perpustakaan perangkat lunak kontribusi pengguna! Anda mungkin dapat memperbaikinya, seperti yang Anda katakan Anda bukan orang baru dalam pemrograman,
onestop

Jawaban:

14

Apa yang ingin Anda lakukan disebut deteksi puncak dalam kemometrik. Ada berbagai metode yang dapat Anda gunakan untuk itu. Saya hanya menunjukkan pendekatan yang sangat sederhana di sini.

require(graphics)
#some data
d <- density(faithful$eruptions, bw = "sj")

#make it a time series
ts_y<-ts(d$y)

#calculate turning points (extrema)
require(pastecs)
tp<-turnpoints(ts_y)
#plot
plot(d)
points(d$x[tp$tppos],d$y[tp$tppos],col="red")
Roland
sumber
Dari semua solusi, ini bekerja paling baik. 1. Pertanyaan tindak lanjut: apakah ada cara untuk mengubah toleransi dengan titik balik? Menemukan banyak puncak dan lembah di bagian ekor panjang fungsi Density. 2. Pertanyaan tindak lanjut # 2: apa cara yang baik untuk menentukan toleransi?
aaronlevin
iklan 1. Saya kira tidak. Ini dimaksudkan untuk menguji keacakan deret waktu, sehingga fungsinya tidak memerlukan itu. Anda dapat mencoba menguji relevansi / signifikansi puncak diri Anda. Misalnya, Anda bisa melakukan uji-t terhadap lingkungan (di mana Anda dapat memutuskan seberapa besar lingkungan itu seharusnya). Atau Anda dapat mencari fungsi yang lebih canggih dalam paket R untuk evaluasi data dari spektrometri (massa) atau metode kimia analitik lainnya.
Roland