Пик 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)

скоро...

график, построенный с использованием Output(список). Мой вопрос, как добавить порог в этом коде? или как я могу удалить маленькие Пики и Долины (значения меньше 1). Мне нужны сплошные вершины и долины.

Ищу ответы. заранее спасибо.

2 ответа

Наконец я создал функцию для удаления небольших циклов, а также для поддержания пика и долины. Для меня это работает отлично.

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)
} 

Если вы просто хотите построить свои данные:

Вы могли бы построить это с ggplot2 и добавить geom_smooth() слой. По умолчанию используется метод "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) 

?

Или вы хотите сами сгладить данные? (Ваш ряд данных для этого достаточно короткий.) Вам нужно уравнение для подгонки? На это легко потратить некоторое время.

Я не совсем понимаю этот материал "пик / долина". В любом случае, посмотрите на 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. Я не уверен, что это правильно. Но вы можете адаптировать этот код для ваших нужд.

Другие вопросы по тегам