如何检测 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 ) 它将进一步检查值。
lag
和 lead
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
我有一个时间序列面板数据集,其结构如下:
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 ) 它将进一步检查值。
lag
和 lead
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