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
;我还标记了与平均值相差>= 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 >= 2, TRUE, FALSE)
可以简化为 Data.scaled >= 2
。
谢谢你的回答......它确实找到了异常值......但我的数据集是一个时间序列类型 xts。我用示例数据更新了问题
@StefaniaAxo 请使用dput
提供(部分)样本数据。以上是关于R - 使用标准偏差查找时间序列数据集中的异常值的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(手动编码添加均值标准偏差)实战(dot plot)