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