我正在处理大量由异常值组成的数据。这些代码适用于大多数数据集,但不适用于少数数据集。
此示例数据:
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不被移除。 我的数据集也发生了同样的事情。我无法弄清楚原因。 我希望得到这方面的帮助。
感谢您的阅读。
答案 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