Menemukan titik belok dalam R dari data yang dihaluskan

14

Saya punya beberapa data yang saya gunakan mulus loess. Saya ingin mencari titik belok pada garis yang dihaluskan. Apakah ini mungkin? Saya yakin seseorang telah membuat metode mewah untuk menyelesaikan ini ... Maksud saya ... setelah semua, itu R!

Saya baik-baik saja dengan mengubah fungsi penghalusan yang saya gunakan. Saya hanya menggunakan loesskarena itulah yang saya gunakan di masa lalu. Tetapi fungsi menghaluskan apapun baik-baik saja. Saya menyadari bahwa titik belok akan tergantung pada fungsi perataan yang saya gunakan. Saya baik-baik saja dengan itu. Saya ingin memulai dengan hanya memiliki fungsi menghaluskan yang dapat membantu meludahkan titik belok.

Berikut kode yang saya gunakan:

x = seq(1,15)
y = c(4,5,6,5,5,6,7,8,7,7,6,6,7,8,9)
plot(x,y,type="l",ylim=c(3,10))
lo <- loess(y~x)
xl <- seq(min(x),max(x), (max(x) - min(x))/1000)
out = predict(lo,xl)
lines(xl, out, col='red', lwd=2)

masukkan deskripsi gambar di sini

pengguna164846
sumber
3
Mungkin Anda ingin melihat analisis titik perubahan .
nico
Saya telah menemukan baris kode ini sangat berguna: infl <- c (FALSE, diff (diff (out)> 0)! = 0) Tetapi kode ini menemukan semua titik balik terlepas dari naik atau turun. Bagaimana saya bisa tahu titik mana yang menekuk ke atas dan mana yang menekuk dalam jangka waktu? Misalnya, plot dan warna titik balik ke atas berwarna hijau dan ke bawah berwarna merah.
user3511894

Jawaban:

14

Dari perspektif menggunakan R untuk menemukan infleksi dalam kurva yang dihaluskan, Anda hanya perlu menemukan tempat-tempat itu dalam nilai-nilai y yang dihaluskan di mana perubahan dalam y bertanda.

infl <- c(FALSE, diff(diff(out)>0)!=0)

Kemudian Anda dapat menambahkan poin ke grafik tempat infleksi ini terjadi.

points(xl[infl ], out[infl ], col="blue")

Dari perspektif menemukan titik infleksi yang bermakna secara statistik, saya setuju dengan @nico bahwa Anda harus melihat ke dalam analisis perubahan-titik, kadang-kadang juga disebut sebagai regresi tersegmentasi.

Jean V. Adams
sumber
Ini sepertinya melakukan pekerjaan dengan cukup baik. Saya mengerti itu tidak ideal dan hasil yang diberikannya tentu tidak ideal. Terima kasih atas kontribusinya. Ini mencakup sebagian besar kasus kecuali untuk hal-hal seperti garis lurus.
user164846
3
Saya tidak yakin saya mengerti, @ user164846. Garis lurus tidak memiliki titik belok.
Jean V. Adams
Juga, Anda mungkin ingin melihat smoothers yang segera memberikan turunan, misalnya Savitzky-Golay-filter. Namun pilihan yang lebih halus harus selalu diputuskan oleh data dan aplikasi Anda, bukan sebaliknya!
cbeleites tidak senang dengan SX
4

Ada beberapa masalah di beberapa level di sini.

Pertama, loess kebetulan adalah satu yang lebih halus dan ada banyak, banyak yang bisa dipilih. Orang-orang optimis berpendapat bahwa hampir semua orang yang berakal sehat akan menemukan pola yang nyata dan bahwa semua orang yang berakal sehat setuju dengan pola yang nyata. Pesimis berpendapat bahwa ini adalah masalahnya dan bahwa "smoothers masuk akal" dan "pola nyata" di sini didefinisikan dalam hal satu sama lain. Intinya, mengapa loess dan mengapa menurut Anda pilihan yang bagus di sini? Pilihannya tidak hanya dari satu smoother atau implementasi tunggal dari smoother (tidak semua yang menggunakan nama loess atau lowess identik di seluruh perangkat lunak), tetapi juga tingkat kehalusan tunggal (bahkan jika itu dipilih oleh rutin untuk Anda). Anda memang menyebutkan poin ini tetapi itu tidak mengatasinya.

Lebih khusus lagi, seperti yang diperlihatkan contoh mainan Anda, fitur-fitur dasar seperti titik balik mungkin dengan mudah tidak dapat dipertahankan oleh loess (tidak juga untuk memilih loess). Minimum lokal pertama Anda menghilang dan minimum lokal kedua Anda digantikan oleh kelancaran tertentu yang Anda tunjukkan. Infleksi didefinisikan oleh nol dari turunan kedua daripada yang pertama dapat diharapkan menjadi lebih berubah-ubah.

Nick Cox
sumber
Saya memilih loess karena saya mengambilnya dari internet. Saya sangat berpengalaman dalam smoothing secara umum, jadi saya hanya mengambil kode online. Apakah Anda memiliki saran yang lebih baik?
user164846
Maaf, tapi saya tidak mengerti komentar Anda. Jika Anda sangat berpengalaman dalam smoothing, Anda harus memiliki argumen yang lebih baik mempertahankan inflexions sambil menekan kebisingan. Itu tampaknya merupakan tujuan yang bertentangan dengan saya, tetapi saya akan senang mendengar argumen teknis mengapa saya salah.
Nick Cox
Maaf, maksud saya bukan "tidak berpengalaman" haha
user164846
1
Saya melihat. Hidup ini singkat, dan Anda tidak dapat mencoba setiap metode yang mungkin. Kami tidak dapat melihat data Anda yang sebenarnya, tetapi contoh mainan Anda menggarisbawahi bahwa penghalusan dapat menghilangkan struktur yang dapat diidentifikasi.
Nick Cox
2

Ada banyak pendekatan hebat untuk masalah ini. Beberapa di antaranya. (1) - paket changepoint- (2) - tersegmentasi - paket. Tetapi Anda diharuskan memilih jumlah changepoint. (3) MARS sebagaimana diterapkan dalam paket -earth-

Bergantung pada bias / varians tradeoff Anda, semua akan memberi Anda informasi yang sedikit berbeda. -teregmentasi- sangat menarik untuk dilihat. Jumlah model changepoint yang berbeda dapat dibandingkan dengan AIC / BIC

charles
sumber
1

Anda mungkin dapat menggunakan pustaka fda, ​​dan setelah Anda memperkirakan fungsi kontinu yang sesuai, Anda dapat dengan mudah menemukan tempat-tempat di mana turunan kedua adalah nol.

CRAN FDA

Intro FDA

DL Dahly
sumber
Nol dari turunan pertama mendefinisikan minima dan maxima. Saya pikir maksud Anda yang kedua. Apa itu "dengan mudah"? Ada lebih dari satu cara untuk membedakan secara numerik.
Nick Cox