0

我正在处理由异常值组成的大量数据。该代码适用于大多数数据集,但不适用于少数数据。

此示例数据:

set.seed(100)
m=rnorm(200)
m[1]=100   #inserting outlier
m[2]=50

我的代码是:

library(outliers)
lg=outlier(m, logical=TRUE)
for(i in 1:length(lg)){
if(lg[i]==c("TRUE")){ 
 m[i]=NA }}

这将用 NA 替换异常值。现在在这种情况下,100 被删除,但 50 没有被删除。我的数据集也发生了同样的事情。我不知道为什么。我希望得到这方面的帮助。

感谢您的阅读。

4

2 回答 2

2

这取决于您对异常值的定义。有很多。

outlier方法将异常值定义为**与平均值差异最大的对象。这是一个相当弱的定义,因为它强制异常值的数量为 1(除非绑定)。

试试这个数据集:

0 .1 .1 .1 -.1 -.1 -.1

在这个数据集上,它应该删除除0!

现在将其更改为:

0 .1 .1 .1 -.1 -.1 -.100000001

现在只会删除一个元素,尽管差异处于精度边缘并且几乎不显着。

也许尝试一种更聪明的异常值检测方法。

于 2012-06-11T06:24:29.137 回答
1

在这里,我将上面的评论扩展为答案。

在您的示例中, m[40]=m[90]=m[67]=150 是平局。如果您尝试使用 m[40] = 150; 米[90] = 200;米[67] = 250;我想你会发现只有 m[67] 被识别为异常值。也许在姊妹统计网站 Cross Validated 上询问您的数据集的异常值的最佳定义。那么也许这里有人可以帮助您为该定义编写 R 代码。

以下是异常值的简单定义的 R 代码:异常值是值 > 50 的任何观察值。我不建议您使用该定义。事实上,请不要。我在这里仅用于说明。下面的代码将所有异常值替换为 NA。

set.seed(100)
m=rnorm(200)
m[10]=100
m[40]=150
m[90]=200
m[67]=250
m

outlier <- rep(0,length(m))
outlier[m>50]=NA
outlier

m[is.na(outlier)]=NA
m
于 2012-06-11T06:25:10.090 回答