【问题标题】:Few outliers not removed少数异常值未删除
【发布时间】:2012-06-11 04:10:58
【问题描述】:

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

这个样本数据:

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 没有被删除。 我的数据集也发生了同样的事情。我不知道为什么。 我希望得到这方面的帮助。

感谢您的阅读。

【问题讨论】:

  • outlier 是如何定义的?它不是基础 R,AFAIK。
  • 它在异常值包中。查看?异常值
  • 仅供参考:您的意思是 outliers 包,而不是 outlier。
  • @rockswap 我认为这是因为在您的示例中 m[40]=m[90]=m[67]=150 是平局。如果您尝试使用 m[40] = 150;米[90] = 200;米[67] = 250;我想你会发现只有 m[67] 被识别为异常值。也许编写您自己的异常值定义。也许在统计网站上询问定义异常值的 R 代码或异常值的“最佳”定义,也许这里有人可以帮助您编写该定义。
  • 统计学家不建议简单地去除基于异常值检验的极值。相反,您应该仔细检查极值,因为它们可能是数据集中最有趣的信息。请参阅this question 的最佳答案。此外,如果您的数据容易出现异常值,则应使用稳健的统计方法而不是删除异常值。

标签: r outliers


【解决方案1】:

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

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

试试这个数据集:

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

在这个数据集上,它应该删除除0之外的所有内容!

现在将其更改为:

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

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

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

【讨论】:

    【解决方案2】:

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

    在您的示例中, 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多