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

Posted

技术标签:

【中文标题】R - 使用标准偏差查找时间序列数据集中的异常值【英文标题】:R - find outliers in time series dataset using standard deviation 【发布时间】:2018-09-07 21:28:04 【问题描述】:

我有一个 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 进行子集化

【问题讨论】:

只需 scale 您的完整数据具有零均值和单位标准偏差(即 Z 变换您的数据);那么很容易确定哪些点与平均值相差> 2 sd 您没有提供最小的样本数据集,所以我根据下面的一些样本数据添加了一个示例。请看一看。 问题中提供的示例 我通过使用 `meanD = mean(data); 解决了sdD = sd(data) outliers= subset(data, (data[,1] > meanD + 2 * sdD) | (data[,1] 您已经手动缩放了值;当然也可以。您可以通过将两个条件总结为 abs(data[, 1] - meanD) > 2 * sdD 来简化最后一个命令。 【参考方案1】:

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

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

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

为了说明,我将样本数据和缩放样本数据存储在data.frame;我还标记了与平均值相差&gt;= 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 个单位的标准差。

【讨论】:

请注意,ifelse(Data.scaled &gt;= 2, TRUE, FALSE) 可以简化为 Data.scaled &gt;= 2 谢谢你的回答......它确实找到了异常值......但我的数据集是一个时间序列类型 xts。我用示例数据更新了问题 @StefaniaAxo 请使用dput 提供(部分)样本数据。

以上是关于R - 使用标准偏差查找时间序列数据集中的异常值的主要内容,如果未能解决你的问题,请参考以下文章

标准偏差为零的归一化

剔除“异常值”的一般原则是什么?

添加误差线以在 R 中的绘图上显示标准偏差

删除高于/低于标准偏差的值

R语言高级方法进行缺失数据多重插补案例演示

R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(手动编码添加均值标准偏差)实战(dot plot)