如何检测 r 中面板时间序列数据的大跳跃和快速反转

How to detect big jumps and quick reversals in panel time-series data in r

我有一个时间序列面板数据集,其结构如下:

df <- data.frame(
  year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L),
  id = c(1L, 1L, 1L, 2L, 2L, 2L),
  c = c(11L, 13L, 13L, 16L, 15L, 15L)
)

#>   year id  c
#> 1 2012  1 11
#> 2 2013  1 26
#> 3 2014  1 13
#> 4 2012  2 16
#> 5 2013  2 15
#> 6 2014  2 19

在每个 id 中,我想在 c 列中发现巨大的不寻常变化和随后的逆转(即,变量在一个时期内翻倍或缩小 2 次,类似于样本数据集中的第 2 行,并迅速恢复正常在下一期)

我想定义反转到正常的方式是确定你是否回到之前的值(在指定范围内) 更改值返回到例如原始值的 +/- 25% 值)。

我希望能够指定寻找反转的周期(例如 3 periods/years)

总而言之,我希望能够在一个时期内检测到两次或更多次的巨大跳跃或收缩,并在指定时期(3 年)内迅速恢复正常(原始值的 25%) ).

我的最终目标是确定数据库中是否存在某些可能的错误以及select所有存在此类错误的 ID。

您可以使用lag功能向后看。它尊重 group_by.

中指定的组

lag(或lead)的默认值是移动到当前行之前或之后的直接行,但是如果您提供整数作为第二个参数(在本例中为 2 ) 它将进一步检查值。

laglead return NA 因为我们已经到达(分组)数据框的边界而没有可用的行,所以这里我正在使用 coalesce 将那些 NA 强制转换为 FALSE。您也可以使用原始函数的默认参数,但这似乎更容易。

df <- data.frame(
  year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L),
  id = c(1L, 1L, 1L, 2L, 2L, 2L),
  c = c(11L, 26L, 13L, 16L, 15L, 15L)
)

df %>%
  group_by(id) %>%
  mutate(flag = (lag(c) >= 2*lag(c, 2) | lag(c) <= 0.5*lag(c, 2)) 
                & abs(1 - c/(lag(c, 2))) < 0.25) %>%
  mutate(flag = coalesce(flag, FALSE))

# A tibble: 6 x 4
# Groups:   id [2]
   year    id     c flag 
  <int> <int> <int> <lgl>
1  2012     1    11 FALSE
2  2013     1    26 FALSE
3  2014     1    13 TRUE 
4  2012     2    16 FALSE
5  2013     2    15 FALSE
6  2014     2    15 FALSE