【问题标题】:R - how to remove outliers from dataset by two different groupsR - 如何通过两个不同的组从数据集中删除异常值
【发布时间】:2021-02-28 16:05:49
【问题描述】:

我想创建一个函数,从我的数据集中删除所有异常值。我已经阅读了很多关于此的 Stack Overflow 文章,因此我意识到删除异常值的危险,但到目前为止我看到的所有函数都不适合我的数据类型。到目前为止,这是我所拥有的:

我的最小数据集示例:

ID, Treatment, conc, relabs
1, A, 40.00, 1.0793923
2, A, 40.00, 0.6436631
3, A, 40.00, 0.5556844
4, A, 40.00, 0.4834845
5, A, 40.00, 0.7224756
6, A, 40.00, 0.6804259
7, A, 20.00, 0.9958288
8, A, 20.00, 0.7099360
9, A, 20.00, 0.7028124
10, A, 20.00, 0.5016352
11, A, 20.00, 0.6860346
12, A, 20.00, 0.7341970
13, A, 10.00, 0.8175491
14, A, 10.00, 0.6900910
15, A, 10.00, 0.5278228
16, A, 10.00, 0.7560026
17, A, 10.00, 0.8841343
18, A, 10.00, 0.6687616
19, A, 5.00, 0.8563232
20, A,  5.00, 0.7419997
21, B, 0.80, 1.2049695
22, B, 0.80, 0.4969811
23, B, 0.80, 0.2835814
24, B, 0.80, 0.6700250
25, B, 0.80, 1.3126651
26, B, 0.80, 0.4510617
27, B, 0.60, 0.7629639
28, B, 0.60, 0.7513716
19, B, 0.60, 0.7956074

我使用rstatix 包中的identify_outliers 函数通过不同的处理和浓度来识别异常值,它为我提供了两个新列is.outlieris.extreme 的数据框。

df_outliers <-
df %>% 
  group_by(Treatment, conc) %>% 
  identify_outliers("relabs") 

df_outliers

然后,我只需将 df_outliers 数据框的 dplyr 包中的 slice 函数中的 ID 粘贴到 slice 函数中,手动删除异常值,如果我有更大的数据集,这将很麻烦:

df_wo_outliers <- 
  df %>% 
  slice(-c(1, 7, 10, 19 )) %>% 
  select(-ID)

df_wo_outliers

我不知何故需要从我的原始数据集 relabs 列中自动删除 is.outlier = TRUE 所在的行。

这意味着在该浓度(可变浓度)和处理(可变处理)内,相对吸光度(可变 relabs)过高或过低(Q3 + 1.5xIQR/Q1 - 1.5xIQR)。

我愿意听取有关该函数的任何建议或编写我自己的建议,但是我不确定如何过滤数据,以便它可以删除数据集中不同组中的异常值,我的意思是 Treatment 和 conc 而不是正如我所见,整个数据集被讨论了很多。

另外有没有办法以类似的方式计算置信区间?由于我还没有以正确的方式过滤我的数据集,我相信我会遇到类似的问题

如果需要,我还包括我的部分数据的图片: section of my data set

我正在使用 Windows 10,R 版本 1.3.1073

【问题讨论】:

  • 哪个包包含identify_outliers()函数?
  • 你能提供一个可重现的例子吗? stackoverflow.com/questions/5963269/…
  • @Dave2e identify_outliers 函数来自一个包 rstatix
  • @william3031 我已经在我的帖子中添加了所有缺失的点,我相信现在更容易理解我正在使用的内容

标签: r statistics scatter-plot outliers confidence-interval


【解决方案1】:

在获取异常值后,您可以在 dplyr 中使用 anti_join()。请注意,在我的 df_outliers 中,我只有 IDs 1、7 和 10。

library(tidyverse)
library(rstatix)

df <- tibble(
                ID = c(1L,2L,3L,4L,5L,6L,7L,8L,
                       9L,10L,11L,12L,13L,14L,15L,16L,17L,18L,19L,
                       20L,21L,22L,23L,24L,25L,26L,27L,28L,19L),
         Treatment = c("A","A","A","A","A","A",
                       "A","A","A","A","A","A","A","A","A","A","A","A",
                       "A","A","B","B","B","B","B","B","B","B","B"),
              conc = c(40,40,40,40,40,40,20,20,
                       20,20,20,20,10,10,10,10,10,10,5,5,0.8,0.8,
                       0.8,0.8,0.8,0.8,0.6,0.6,0.6),
            relabs = c(1.0793923,0.6436631,0.5556844,
                       0.4834845,0.7224756,0.6804259,0.9958288,0.709936,
                       0.7028124,0.5016352,0.6860346,0.734197,0.8175491,
                       0.690091,0.5278228,0.7560026,0.8841343,0.6687616,
                       0.8563232,0.7419997,1.2049695,0.4969811,0.2835814,0.670025,
                       1.3126651,0.4510617,0.7629639,0.7513716,0.7956074)
)

df_outliers <- df %>% 
  group_by(Treatment, conc) %>% 
  identify_outliers("relabs") 

# A tibble: 3 x 6
  Treatment  conc    ID relabs is.outlier is.extreme
  <chr>     <dbl> <int>  <dbl> <lgl>      <lgl>     
1 A            20     7  0.996 TRUE       TRUE      
2 A            20    10  0.502 TRUE       TRUE      
3 A            40     1  1.08  TRUE       FALSE  

# without outliers
df %>% 
  anti_join(df_outliers, by = "ID") %>% 
  view()

# A tibble: 26 x 4
      ID Treatment  conc relabs
   <int> <chr>     <dbl>  <dbl>
 1     2 A            40  0.644
 2     3 A            40  0.556
 3     4 A            40  0.483
 4     5 A            40  0.722
 5     6 A            40  0.680
 6     8 A            20  0.710
 7     9 A            20  0.703
 8    11 A            20  0.686
 9    12 A            20  0.734
10    13 A            10  0.818
# … with 16 more rows

【讨论】:

  • 成功了,谢谢!非常感谢您的宝贵时间!
【解决方案2】:

您可以为此使用dplyr::filter()。由于要保留is.outlier == FALSE,所以需要使用感叹号作为否定操作。

library(dplyr)
df_no_outliers <- df %>%
  group_by(Treatment, conc) %>%
  identify_outliers("relabs") %>%
  filter(!is.outlier)

【讨论】:

  • 谢谢你,我试过运行它,但它给了我 0 行的结果。我相信这是因为我的原始数据集没有列 is.outlier,因此即使是 TRUE 也无法过滤
  • @SimonaZubavičiūtė - 如果您可以发布您的数据样本,并告诉我们哪个包包含identify_outliers(),我会测试此代码并进行验证。
  • 我现在附上了我的一部分数据的图片,identify_outliers 来自一个包 rstatix。
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多