2014-10-02 66 views
3

我有一個時間序列,我想檢測(和識別它們),有些山峯,但只有特定範圍R.如何檢測峯值在特定範圍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個峯)選擇峯(y),或者僅在2和4之間(也有2個峯)選擇峯。我知道R檢測峯(如Peaks,pastecs,quantmod,pracma,splus2R)中的幾個軟件包,但沒有一個似乎具有此功能,通常只有最小閾值。

任何意見,將不勝感激。

謝謝

馬丁

編輯:由Eric提供的代碼完美的作品。但對於我自己的數據集,我有一個小問題。如果在某個窗口(x)中兩次相同的值,您將如何檢測一個峯值?基本上我想創建一個條件語句,可以說,峯值之間需要一定數量的點(x)才能被視爲兩個獨特的峯值。

+0

你的意思是要繪製只有那些峯?或者你只是想要價值? – 2014-10-02 22:22:20

+0

我覺得這是一個重複,但我現在懶得找到匹配... – Dason 2014-10-02 22:52:42

回答

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