Saya setuju dengan respons whuber tetapi hanya ingin menambahkan bahwa bagian "+2" dari kode, yang berupaya menggeser indeks agar sesuai dengan puncak yang baru ditemukan sebenarnya 'melampaui batas' dan seharusnya "+1". misalnya dalam contoh yang kita dapatkan:
> findPeaks(cc)
[1] 3 22 41 59 78 96
ketika kami menyorot puncak-puncak yang ditemukan ini pada grafik (tebal merah):
kita melihat bahwa mereka secara konsisten 1 poin dari puncak yang sebenarnya.
akibatnya
pks[x[pks - 1] - x[pks] > thresh]
seharusnya pks[x[pks] - x[pks + 1] > thresh]
ataupks[x[pks] - x[pks - 1] > thresh]
PEMBARUAN BESAR
mengikuti pencarian saya sendiri untuk menemukan fungsi pencarian puncak yang memadai saya menulis ini:
find_peaks <- function (x, m = 3){
shape <- diff(sign(diff(x, na.pad = FALSE)))
pks <- sapply(which(shape < 0), FUN = function(i){
z <- i - m + 1
z <- ifelse(z > 0, z, 1)
w <- i + m + 1
w <- ifelse(w < length(x), w, length(x))
if(all(x[c(z : i, (i + 2) : w)] <= x[i + 1])) return(i + 1) else return(numeric(0))
})
pks <- unlist(pks)
pks
}
'puncak' didefinisikan sebagai maksimum lokal dengan m
poin di kedua sisi lebih kecil dari itu. karenanya, semakin besar parameter m
, semakin ketat prosedur pendanaan puncak. begitu:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
fungsi ini juga dapat digunakan untuk menemukan minimum lokal dari setiap vektor berurutan x
viafind_peaks(-x)
.
Catatan: saya sekarang telah meletakkan fungsi pada gitHub jika ada yang membutuhkannya: https://github.com/stas-g/findPeaks