如何使用R计算时间系列中局部峰值之间的差异?

时间:2015-10-03 22:09:31

标签: r time-series

以下数据显示2个周期或"循环"。我怎样才能获得1)每个周期的最大值(峰值)和最后值?

我需要计算每个周期的峰值与紧接之前的周期的最后一个值之间的差异[例如(周期2的峰值) - (周期1的最后一个值)]。我认为这将解决我的问题:https://stats.stackexchange.com/questions/22974/how-to-find-local-peaks-valleys-in-a-series-of-data 但是我使用findPeak函数,quantmod包(在尝试了许多阈值之后)获得的峰值没有意义。我尝试了其他功能(例如Whuber在这里提出的功能:https://stats.stackexchange.com/questions/36309/how-do-i-find-peaks-in-a-dataset),但我无法准确计算峰​​值,对我来说更难以确定每个周期的最后一个数据点。我真的很感激任何帮助,

<meta name="csrf-token" content="{{ csrf_token() }}" />

$.ajaxSetup({
     headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

1 个答案:

答案 0 :(得分:0)

我认为问题主要是关于如何定义一个循环而不是用R编码它。例如,如果你想在两个连续点之间的差异大于阈值时启动一个新的循环(例如100你可以这样做

thres <- 100
cuts <- which(abs(diff(y)) > thres)
idx <- Map(seq, c(1, cuts + 1), c(cuts, length(x)))
cycles <- lapply(seq_along(idx), 
    function(i) data.frame(cycle = i, x = x[idx[[i]]], y = y[idx[[i]]])) 

这将为您提供一个列表,其中每个元素将包含一个循环的x和y值。从那时起,您可以根据需要计算统计数据/摘要,例如,找到您可以执行的每个周期的最大值

library(dplyr)
cycles.df <- bind_rows(cycles)
cycles.df %>% group_by(cycle) %>% slice(which.max(y))
# Source: local data frame [2 x 3]
# Groups: cycle
# 
#   cycle   x     y
# 1     1  66 265.7
# 2     2 186 355.4

或查找每个周期中的最后一个值

cycles.df  %>% group_by(cycle) %>% slice(n())
# Source: local data frame [2 x 3]
# Groups: cycle
# 
#   cycle   x     y
# 1     1 119 252.0
# 2     2 239 337.6