Je suis d'accord avec la réponse de whuber, mais je voulais juste ajouter que la partie "+2" du code, qui tente de décaler l'index pour correspondre au pic nouvellement trouvé, "dépasse les limites" et devrait être "+1". par exemple dans l'exemple en question, nous obtenons:
> findPeaks(cc)
[1] 3 22 41 59 78 96
lorsque nous mettons en évidence ces pics trouvés sur un graphique (rouge gras):
nous voyons qu'ils sont toujours à 1 point du pic réel.
conséquenty
pks[x[pks - 1] - x[pks] > thresh]
devrait être pks[x[pks] - x[pks + 1] > thresh]
oupks[x[pks] - x[pks - 1] > thresh]
GRANDE MISE À JOUR
suivant ma propre quête pour trouver une fonction de recherche de pic adéquate, j'ai écrit ceci:
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
}
un «pic» est défini comme un maximum local dont les m
points de chaque côté sont plus petits que lui. par conséquent, plus le paramètre est grand m
, plus la procédure de financement de pointe est stricte. donc:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
la fonction peut également être utilisée pour trouver des minima locaux de tout vecteur séquentiel x
via find_peaks(-x)
.
Remarque: j'ai maintenant mis la fonction sur gitHub si quelqu'un en a besoin: https://github.com/stas-g/findPeaks