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