如何检测R中特定范围内的峰值

时间:2014-10-02 21:32:13

标签: r time-series

我有一个时间序列,我想检测(并识别它们)某些峰值,但仅限于R中的特定范围。

    here is an example
## generate test data with 3 peaks
set.seed(123)
x <- seq(0, 360, length = 20)
y <- abs(rnorm(20, mean = 1, sd = 0.1))
y[5:10] <- c(2, 4, 7, 3, 4, 2)
y <- c(y, 0.8 * y, 1.2 * y)
x <- seq(0, 360, along = y)
y[6] <- y[7]   # test case with 2 neighbouring equal points
plot(x, y, type="b")

# 在那个例子中,我想说,我想选择仅在6到9之间(2个峰值)或仅在2到4之间(也是2个峰值)的峰值(y)。

我知道R检测峰中有几个包(例如Peaks,pastecs,quantmod,pracma,splus2R),但似乎没有这个包具有此功能,通常只有最小阈值。

任何建议都将受到赞赏。

谢谢

马丁

编辑:Eric提供的代码完美无缺。但是对于我自己的数据集,我遇到了一个小问题。如果某个窗口中的相同值两次(x),您将如何检测一个峰值。基本上我想创建一个条件语句,可以说,你需要在峰值之间有一定数量的点(x)才能被视为两个独特的峰值。

1 个答案:

答案 0 :(得分:1)

这样的事情变得很接近(不确定你是否关心用两个值检测峰值两次)。

# Reproduce your data
set.seed(123)
x <- seq(0, 360, length = 20)
y <- abs(rnorm(20, mean = 1, sd = 0.1))
y[5:10] <- c(2, 4, 7, 3, 4, 2)
y <- c(y, 0.8 * y, 1.2 * y)
x <- seq(0, 360, along = y)
y[6] <- y[7]   # test case with 2 neighbouring equal points
plot(x, y, type="b")

# shift y up and down a position (for peak identification)
yu <- c(tail(y, -1), NA)
yd <- c(NA, head(y, -1))

# identify peaks that are in the correct range 
# where y is higher than the point before and after
high <- which(y - yu >= 0 & y - yd >= 0 & y > 6 & y < 9)
low  <- which(y - yu >= 0 & y - yd >= 0 & y >= 2 & y <= 4) # one peak is at 4

# plot lines at peaks
abline(v = x[high], col = 'blue')
abline(v = x[low], col = 'red')

enter image description here