2017-07-04 9 views
0

私はピークと谷をリストするために以下のコードを使用しています。Rピークと谷の埋め込みしきい値付き

x_last <- as.numeric(series[1]) 
x <- as.numeric(series[2]) 
d_last <- (x-x_last) 
series[1:2] <- NULL 
output <- list() 

for (x_next in series){ 
    if (x_next == x){ 
    next} 
    d_next <- (x_next - x) 
    if (d_last * d_next < 0){ 
    output <- append(output, x)} 
    x_last <- x 
    x <- x_next 
    d_last <- d_next 
} 

ここで出力(リスト)には「連続ピークと谷」が含まれています。

Output <- c(41.49916, 37.92029, 39.86477, 39.86432, 39.95672, 39.95465, 39.96144, 39.83994, 40.43357, 40.11285, 40.82250, 39.37034, 58.82975, 42.19894) 

ように...

enter image description here グラフは出力(リスト)を使用してプロットしました。私の質問は、このコードにスレッシュホールドを追加する方法です。またはどのように私は小さなピークと谷(1未満の値)を削除することができます。私は連続的なピークと谷が必要です。

回答を検索します。前もって感謝します。

答えて

0

あなたは自分のデータをプロットしたい場合:

あなたはggplot2でこれをプロットし、geom_smooth()層を追加することができます。小規模なデータセットの場合、 "do-the-right-thing"のようにスムーズになるメソッド "loess"がデフォルトになります。

dat <- data.frame(y=c(41.49916, 37.92029, 39.86477, 39.86432, 39.95672, 39.95465, 39.96144, 39.83994, 40.43357, 40.11285, 40.82250, 39.37034, 58.82975, 42.19894)) 
dat$x <- 1:length(dat$y) 
library(ggplot2) 

ggplot(dat, aes(x, y)) + 
     geom_line() + 
     geom_smooth(method="loess", se=FALSE) 

enter image description here

あなたはむしろ自分でデータを滑らかにしたいですか? (あなたのデータシリーズはそれに対してかなり短いです。)フィットの式が必要ですか?それにかなりの時間を費やすのは簡単です。

私はこの「ピーク/谷」のことを十分に理解していません。いずれにしても、diff()関数を見てください。おそらくこれは役に立ちます:

dat <- data.frame(y=c(41.49916, 37.92029, 39.86477, 39.86432, 39.95672, 39.95465, 39.96144, 39.83994, 40.43357, 40.11285, 40.82250, 39.37034, 58.82975, 42.19894)) 
dat[which(diff(dat$y) < 0.01)+1,"y"] <- NA 
dat$y 

[1] 41.50 NA 39.86 NA 39.96 NA NA NA 40.43 NA 40.82 NA 
[13] 58.83 NA 

ここでは、0.01のしきい値を使用しました。 それが正しいのかどうかわかりません。しかし、あなたはこのコードをあなたのニーズに適応させることができます。

+0

私はこのデータをプロットしたくありません。私はこのデータの小さなサイクルを削除したいと思うし、ピークと谷(ピーク、谷、ピーク、谷など)を保持したい。私の知るところでは、それは閾値(マグニチュード)と呼ばれ、ピークと谷との間の差は、除去されなければならない閾値よりも小さい。 – Ruth

+0

@ruthが1段落私の答えを追加 – knb

0

最後に、ピークと谷を維持するために小さなサイクルを削除する機能を作成しました。私にとっては完璧に働いています。

hysteresis <- function(series, min_range){ 
    #hysteresis function will remove cycles within the magnitude of min_range 
    #Series: list of values with continuous Peak & valley. 
    series <- unlist(series) 
    f <- series[1] 
    org <- f 
    series <- series[2:length(series)] 
    for(i in series){ 
    val <- abs(i-f) 
    if(val > min_range){ 
     org <- c(org,i) 
     f <- i 
    } 
    #else statement is used to maintain peak and valley 
    else{ 
     org <- org[1:(length(org)-1)] 
     f <- org[length(org)] 
    } 
    } 
    return(org) 
} 
関連する問題