R - 使用标准偏差在时间序列数据集中查找异常值

时间:2018-03-29 02:58:13

标签: r time-series

我有一个xts时间序列对象,其中包含数据的数值。 str(dataTS)

An ‘xts’ object on 2014-02-14 14:27:00/2014-02-28 14:22:00 containing: Data: num [1:4032, 1] 51.8 44.5 41.2 48.6 46.7 ... Indexed by objects of class: [POSIXlt,POSIXt] TZ: xts Attributes:
NULL

我想找到远离平均值超过(2 * s.d.)的数据点。 我想从中创建一个新的数据集。

[,1] 2015-02-14 14:27:00 51.846 2015-02-14 14:32:00 44.508 2016-02-14 14:37:00 41.244 2015-02-14 14:42:00 48.568 2015-02-14 14:47:00 46.714 2015-02-14 14:52:00 44.986 2015-02-14 14:57:00 49.108 2015-02-14 15:02:00 1000.470 2015-02-14 15:07:00 53.404 2015-02-14 15:12:00 45.400 2015-02-14 15:17:00 3.216 2015-02-14 15:22:00 49.7204

时间序列。 我想要分配异常值3.216和1000.470

1 个答案:

答案 0 :(得分:3)

您可以scale您的数据的均值和单位标准差为零。然后,您可以直接识别远离平均值>= 2 sd的单个观察值。

例如,我从Cauchy分布中随机抽取一些数据。

set.seed(2010);
smpl <- rcauchy(10, location = 4, scale = 3);

为了说明,我将样本数据和缩放的样本数据存储在data.frame;我还标记了距离平均值>= 2标准偏差的观察结果。

library(tidyverse);
df <- data.frame(Data = smpl) %>%
    mutate(
        Data.scaled = as.numeric(scale(Data)),
        deviation_greater_than_2sd = ifelse(Data.scaled >= 2, TRUE, FALSE));
df;
#         Data Data.scaled deviation_greater_than_2sd
#1    8.007951  -0.2639689                      FALSE
#2  -34.072054  -0.5491882                      FALSE
#3  465.099800   2.8342104                       TRUE
#4    7.191778  -0.2695010                      FALSE
#5    2.383882  -0.3020890                      FALSE
#6    3.544079  -0.2942252                      FALSE
#7   -7.002769  -0.3657119                      FALSE
#8    4.384503  -0.2885287                      FALSE
#9   15.722492  -0.2116796                      FALSE
#10   4.268082  -0.2893179                      FALSE

我们还可以看到Data.scaled

的分布
ggplot(df, aes(Data.scaled)) + geom_histogram();

enter image description here

“离群值”与平均值相差2.8个单位。