从数据框中去除单变量异常值(+-3个标准差)

4

我对R非常陌生,看其他人的问题也很吃力。我认为我的问题非常简单,所以没有人费心去问它。

最简单的代码是什么,可以创建一个新的数据框,该数据框在其条件下排除了单变量离群值(我将其定义为距离其条件平均值3 SD的点)?

我很尴尬地展示了自己尝试过的方法,以下是:

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

我已经卡住了,需要帮助。

谢谢

2个回答

7
> 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

现在只返回那些不大于变量均值加减两倍标准差的行,使用!符号表示排除大于这个范围的行。可以根据需要将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是定义每行所属组的变量。

干杯 - 这里有一个问题。我想根据每个组的平均值来排除,例如,我只想排除 b 的平均值加减 3 个标准差的情况,而不是整个 var2 的平均值。我该如何做到这一点? - luke123
1
而对于最后一行的解释: "by" 按照dat$var1中的值将数据框dat拆分为块,每个块都被传递给在此定义的函数function(x),该函数返回一个没有异常值的数据框,然后调用 rbind函数将来自每个data$var1类别的所有数据帧作为参数合并 - 这就是“do.call”的神奇之处。 - Spacedman

4

我使用 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倍标准差。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接