我有一个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
答案 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();
“离群值”与平均值相差2.8个单位。