Я погоджуюся з відповіддю Уаубера, але просто хотів додати, що частина "+2" коду, яка намагається змістити індекс, щоб відповідати нещодавно знайденому піку, насправді "прострочує" і має бути "+1". наприклад, у прикладі, який ми маємо, ми отримуємо:
> findPeaks(cc)
[1] 3 22 41 59 78 96
коли ми виділимо ці знайдені вершини на графіку (жирним червоним кольором):
ми бачимо, що вони послідовно на 1 бал від фактичного піку.
внаслідок цього
pks[x[pks - 1] - x[pks] > thresh]
має бути pks[x[pks] - x[pks + 1] > thresh]
абоpks[x[pks] - x[pks - 1] > thresh]
ВЕЛИЧЕ ОНОВЛЕННЯ
слідуючи власним прагненням знайти адекватну функцію пошуку піку, я написав це:
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
}
"пік" визначається як локальні максимуми, в яких m
точки, обидві сторони яких менші за нього. отже, чим більший параметр m
, тим жорсткішою є пікова процедура фінансування. так:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
функцію можна також використовувати для пошуку локальних мінімумів будь-якого послідовного вектора x
через find_peaks(-x)
.
Примітка. Зараз я поставив функцію на gitHub, якщо комусь це потрібно: https://github.com/stas-g/findPeaks