Concordo com a resposta do whuber, mas só queria acrescentar que a parte "+2" do código, que tenta alterar o índice para corresponder ao pico recém-encontrado, na verdade 'ultrapassa' e deve ser "+1". por exemplo, no exemplo em questão, obtemos:
> findPeaks(cc)
[1] 3 22 41 59 78 96
quando destacamos esses picos encontrados em um gráfico (vermelho negrito):
vemos que eles estão consistentemente a 1 ponto do pico real.
consequentemente
pks[x[pks - 1] - x[pks] > thresh]
deve ser pks[x[pks] - x[pks + 1] > thresh]
oupks[x[pks] - x[pks - 1] > thresh]
ATUALIZAÇÃO GRANDE
seguindo minha própria busca para encontrar uma função adequada de localização de pico, escrevi isso:
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
}
um 'pico' é definido como um máximo local, com m
pontos em ambos os lados menores que ele. portanto, quanto maior o parâmetro m
, mais rigoroso é o procedimento de pico de financiamento. assim:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
a função também pode ser usada para encontrar mínimos locais de qualquer vetor seqüencial x
via find_peaks(-x)
.
Nota: agora coloquei a função no gitHub se alguém precisar: https://github.com/stas-g/findPeaks