是否有一个具有漂亮功能的 R 包可以有效地处理异常值?

机器算法验证 r 异常值 缺失数据
2022-04-10 22:53:39

我处理的其中一个数据集很奇怪。我从中下载数据的数据仓库在其中一个变量中有很多 999999999 值。显然,数据仓库所在的计算机系统不支持存储空值。所以他们使用 999999999 作为“空”值。现在,如果我只是pretty在 R 中运行变量,它会给出无意义的范围。

  • 是否有一个软件包pretty可以通过将异常值置于 (100,High) 范围内来处理异常值?
2个回答

如果您使用类似命令导入数据,例如,

read.table('yourfile.txt', header=TRUE, ...)

您可以NA通过指定na.strings = "999999999". 我们也可以考虑不同的值来表示NA值。考虑以下文件 ( fake.txt),我们要在其中处理“.”。和“999999999”作为NA值:

1 2 .
3 999999999 4
5 6 7

然后在R中我们会这样做:

> a <- read.table("fake.txt", na.strings=c(".","999999999"))
> a
  V1 V2 V3
1  1  2 NA
2  3 NA  4
3  5  6  7

否则,您始终可以按照@Sacha 在他的评论中的指示过滤您的数据。在这里,它可能是这样的

a[a=="." | a==999999999] <- NA

编辑

如果在具有不同值的不同列中可能观察到多个异常值,但您知道允许值的可能范围,则可以对每一列应用一个函数。例如,定义以下过滤器:

my.filter <- function(x, threshold=100) ifelse(x > threshold, NA, x)

然后

a.filt <- apply(a, 2, my.filter)

将矩阵中所有大于 100 的值替换为 NA a

例子:

> a <- replicate(10, rnorm(10))
> a[1,3] <- 99999999
> a[5,6] <- 99999999
> a[8,10] <- 99999990
> summary(a[,3])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 -1e+00   0e+00   0e+00   1e+07   1e+00   1e+08 
> af <- apply(a, 2, my.filter)
> summary(af[,3])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.4640 -0.2680  0.4671 -0.0418  0.4981  0.7444  1.0000 

它当然可以是基于向量的:

> summary(my.filter(a[,3], 500))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-1.4640 -0.2680  0.4671 -0.0418  0.4981  0.7444  1.0000 

在处理客户每日时间序列数据时,我经常遇到这种情况。似乎许多会计系统忽略了没有发生的日常数据,即当天没有记录交易(时间间隔/桶)并且不填写“0”数字。由于时间序列分析需要读取每个时间间隔/bucket 我们需要为省略的观察注入一个“0”。干预检测本质上是一种检测异常的方案,并根据已识别的配置文件/信号/预测将其替换为预期值。如果这些“缺失”中有很多值”系统可能会崩溃 当历史数据中有很强的星期几配置文件并且没有记录“连续的值补丁”时,问题会变得更加复杂,