【问题标题】:Find indices of slope changes in a vector in R在 R 中的向量中查找斜率变化的索引
【发布时间】:2020-09-27 14:52:31
【问题描述】:

我有一个包含两列的数据框:(1) 日期时间和 (2) 流量值。我想创建一个带有指标值的第三列来发现突然增加(通常为 0,但当流量显示大幅增加时为 1)。

datetime <-  as.POSIXct(c(1557439200, 1557440100, 1557441000, 1557441900,1557442800, 
          1557443700, 1557444600, 1557445500, 1557446400, 1557447300, 1557448200, 1557449100, 1557450000, 1557450900, 
          1557451800, 1557452700, 1557453600, 1557454500, 1557455400, 1557456300, 1557457200, 1557458100, 1557459000), origin = "1970-01-01")enter code here
streamflow <-  c(0.35, 0.35, 0.36,  0.54, 1.0, 2.7, 8.4, 9.3, 6.2, 3.8, 4.7, 
             2.91, 2.01, 1.65, 1.41, 1.12, 0.95, 0.62, 0.52, 0.53, 0.53, 0.44, 0.35) 

data <- data.table(as.POSIXct(datetime), as.numeric(streamflow))

我正在尝试创建一个函数来识别从 0.5 跳转到 1 的日期时间,因为那是事件开始的时间。然后,当流量低于某个阈值时,它将停止指示这是一个事件。

我目前的想法是一个函数,它将流中两个连续点之间的局部斜率与某个窗口内流的所有值的斜率进行比较,但我真的不知道该怎么写。或者也许有一个更好的想法来做我想做的事情

【问题讨论】:

  • 你是问streamflow的value在哪里>0.5还是streamflow的变化大于0.5?
  • 您是否在寻找类似:match(TRUE, c(FALSE, diff(data[,2]) &gt;= 1)) 的内容?
  • 我要求一些东西来识别流值中的大跳跃。有一个很长的时间序列,这只是一些示例数据,跳跃并不总是从 0.5 到 1。我认为最好的方法是找到移动窗口上的斜率变化的位置。
  • 嗨@BeckyF - 我认为问题有点模糊......“突然”增加或“大”增加是什么意思 - 有多大(绝对值或相对于某些参考数据或...)?
  • @ValeriVoev,感谢您的提问。我有一整年的数据,其中包含超过 130 个事件,其中流数据增加。问题是,在所有这些数据中,实际增加的值各不相同:从一个测量值到下一个测量值可能是 0.3 --> 0.9,或 0.5 --> 4,甚至是 0.6 --> 8。参考数据将是它之前的数据。为了量化这个例子的“大”,假设一个数据点比它之前的数据点大 50%

标签: r


【解决方案1】:
data = data[, delta := (V2-lag(V2))/lag(V2)][
  , ind_jump := delta > 0.5
]

indices <- data[ind_jump==TRUE, V1]

与此无关,但出于某种奇怪的原因,R 给出了

(0.54 - 0.36)/0.36 > 0.5
[1] TRUE

同时

0.18/0.36 > 0.5
[1] FALSE

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2017-04-15
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多