我同意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