很少有异常值没有删除

时间:2012-06-11 04:10:58

标签: r outliers

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

此示例数据:

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不被移除。 我的数据集也发生了同样的事情。我无法弄清楚原因。 我希望得到这方面的帮助。

感谢您的阅读。

2 个答案:

答案 0 :(得分:2)

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

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

试试这个数据集:

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

在此数据集上,它应删除0以外的所有内容!

现在将其更改为:

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

现在只删除一个元素,尽管差异在精度范围内且几乎不显着。

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

答案 1 :(得分:1)

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

在你的例子中,m [40] = m [90] = m [67] = 150是关系。如果你尝试使用m [40] = 150; m [90] = 200; m [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