Я согласен с ответом whuber, но просто хотел добавить, что часть кода «+2», которая пытается сместить индекс, чтобы соответствовать вновь найденному пику, фактически «переходит» и должна быть «+1». например, в нашем примере мы получаем:
> findPeaks(cc)
[1] 3 22 41 59 78 96
когда мы выделяем эти найденные пики на графике (жирный красный):
мы видим, что они последовательно 1 пункт от фактического пика.
consequenty
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