【问题标题】:Find the time lag between two series找出两个系列之间的时间差
【发布时间】:2018-02-21 16:24:11
【问题描述】:

我试图找出两个系列之间的滞后。假设有一个变量 temp2,其值滞后于 temp1,其中滞后不是恒定的。

library(data.table)

dt <- data.table(
    datetime = seq(as.POSIXct("2000-01-01 00:00:00"),as.POSIXct("2000-01-01 09:00:00"), by = "1 hour"),
    temp1 = seq(30, 21, by = -1),
    temp2 = c(30, seq(30, 25, by = -1), seq(25, 23, by = -1))
)

我想要一个额外的列“滞后”等于 temp1 和 temp2 之间的滞后,以便结果如下所示:

dt <- data.table(
    datetime = seq(as.POSIXct("2000-01-01 00:00:00"),as.POSIXct("2000-01-01 09:00:00"), by = "1 hour"),
    temp1 = seq(30, 21, by = -1),
    temp2 = c(30, seq(30, 25, by = -1), seq(25, 23, by = -1)),
    lag = c(0, 1, 1, 1, 1, 1, 2, 2, NA, NA)
)

感谢您的帮助:)

【问题讨论】:

  • 为什么第 7 行的滞后值为 2?我认为应该是1。为什么最后两行的数字是NA?我认为他们应该是 2。
  • 我只是想表明滞后可能不是恒定的。在第 7 行 temp1 = 24 和 temp2 直到第 9 行才达到此值。我将最后两行设置为 NA 因为 temp2 没有达到 temp1 值(系列结束)。也许我可以更改示例以使其更清楚。
  • 为什么不只是dt[, lag:= temp2 - temp1][]。如果不是,请详细说明时间维度和两个值之间的关系。
  • 我的例子太简单了。随着时间的推移,这两个值之间没有确切的关系。我将编辑我的问题以澄清。

标签: r data.table time-series


【解决方案1】:

1) 减法 如果简单的减法就足够了,那么:

library(data.table)

dt[, lag := temp2 - temp1]

给予:

> dt
               datetime temp1 temp2 lag
 1: 2000-01-01 00:00:00    30    30   0
 2: 2000-01-01 01:00:00    29    30   1
 3: 2000-01-01 02:00:00    28    29   1
 4: 2000-01-01 03:00:00    27    28   1
 5: 2000-01-01 04:00:00    26    27   1
 6: 2000-01-01 05:00:00    25    26   1
 7: 2000-01-01 06:00:00    24    25   1
 8: 2000-01-01 07:00:00    23    25   2
 9: 2000-01-01 08:00:00    22    24   2
10: 2000-01-01 09:00:00    21    23   2

2) dtw 另一种可能性是动态时间扭曲。您可能需要根据您的需要使用不同的参数对其进行自定义,例如试试这个:

library(data.table)
library(dtw)

fm <- dt[, dtw(temp1, temp2)]
dt[, lag := tapply(fm$index2 - fm$index1, fm$index1, min)]

给予:

> dt
               datetime temp1 temp2 lag
 1: 2000-01-01 00:00:00    30    30   0
 2: 2000-01-01 01:00:00    29    30   1
 3: 2000-01-01 02:00:00    28    29   1
 4: 2000-01-01 03:00:00    27    28   1
 5: 2000-01-01 04:00:00    26    27   1
 6: 2000-01-01 05:00:00    25    26   1
 7: 2000-01-01 06:00:00    24    25   2
 8: 2000-01-01 07:00:00    23    25   2
 9: 2000-01-01 08:00:00    22    24   1
10: 2000-01-01 09:00:00    21    23   0

注意:ccf 函数在这里也可能有用。

【讨论】:

  • 感谢您的回答。我将编辑我的问题,以展示我如何尝试解决它并澄清我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多