【问题标题】:Removing univariate outliers from data frame (+-3 SDs)从数据框中删除单变量异常值(+-3 SD)
【发布时间】:2013-01-13 19:38:30
【问题描述】:

我对 R 很陌生,以至于我很难在别人的问题中找到我需要的东西。我想我的问题很简单,没有人会费心去问。

创建一个新数据框的最简单代码是什么,该数据框排除了单变量异常值的数据(我将其定义为与条件均值相差 3 个标准差的点),在他们的条件下,在某个变量上?

我很尴尬地展示我尝试过的东西,但它就是这样

greaterthan <- mean(dat$var2[dat$condition=="one"]) + 
               2.5*(sd(dat$var2[dat$condition=="one"]))
lessthan    <- mean(dat$var2[dat$condition=="one"]) -
               2.5*(sd(dat$var2[dat$condition=="one"]))   

withoutliersremovedone1 <-dat$var2[dat$condition=="one"] < greaterthan

我几乎已经被困在那里了。

谢谢

【问题讨论】:

    标签: r outliers


    【解决方案1】:
    > dat <- data.frame(
                        var1=sample(letters[1:2],10,replace=TRUE),
                        var2=c(1,2,3,1,2,3,102,3,1,2)
                       )
    > dat
       var1 var2
    1     b    1
    2     a    2
    3     a    3
    4     a    1
    5     b    2
    6     b    3
    7     a  102 #outlier
    8     b    3
    9     b    1
    10    a    2
    

    现在仅从相关变量的 mean 返回那些不 (!) 大于 2 absolute sd 的行。显然,将 2 更改为您想要的任何数量的sd

    > dat[!(abs(dat$var2 - mean(dat$var2))/sd(dat$var2)) > 2,]
       var1 var2
    1     b    1
    2     a    2
    3     a    3
    4     a    1
    5     b    2
    6     b    3 # no outlier
    8     b    3 # between here
    9     b    1
    10    a    2
    

    或者使用scale函数更简写:

    dat[!abs(scale(dat$var2)) > 2,]
    
       var1 var2
    1     b    1
    2     a    2
    3     a    3
    4     a    1
    5     b    2
    6     b    3
    8     b    3
    9     b    1
    10    a    2
    

    编辑

    这可以扩展到使用by查看组内

    do.call(rbind,by(dat,dat$var1,function(x) x[!abs(scale(x$var2)) > 2,] ))
    

    这假设 dat$var1 是您定义每行所属组的变量。

    【讨论】:

    • 干杯 - 1 个问题。我想根据每个组的平均值排除,例如我想排除 b 的情况,这些情况仅比 b 的平均值高 +- 3 sds,而不是整个 var 2 的平均值。我该怎么做呢?
    • 为了解释最后一行是如何工作的:“by”根据dat$var1中的值拆分数据帧dat,每个块都被馈送到那里定义的function(x)它返回一个没有异常值的数据帧,然后调用rbind 函数将来自每个data$var1 类的所有数据帧作为参数合并回来——这就是do.call 的魔力。
    【解决方案2】:

    我使用robustHD 包中的winsorize() 函数来执行此任务。这是它的例子:

    R> example(winsorize)
    
    winsrzR> ## generate data
    winsrzR> set.seed(1234)     # for reproducibility
    
    winsrzR> x <- rnorm(10)     # standard normal
    
    winsrzR> x[1] <- x[1] * 10  # introduce outlier
    
    winsrzR> ## winsorize data
    winsrzR> x
     [1] -12.070657   0.277429   1.084441  -2.345698   0.429125   0.506056  
     [7]  -0.574740  -0.546632  -0.564452  -0.890038
    
    winsrzR> winsorize(x)
     [1] -3.250372  0.277429  1.084441 -2.345698  0.429125  0.506056 
     [7] -0.574740 -0.546632 -0.564452 -0.890038
    
    winsrzR>
    

    这默认为中位数 +/- 2 mad,但您可以设置均值 +/- 3 sd 的参数。

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 2015-04-25
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2020-09-16
      • 2023-03-11
      相关资源
      最近更新 更多