私はwhuberの応答に同意しますが、コードの「+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