【问题标题】:detect outliers in a group and outlier in the single data检测组中的异常值和单个数据中的异常值
【发布时间】:2015-07-06 23:12:24
【问题描述】:
Car    100 200 300
Group1  34  35  34
Group1  57  67  34
Group1  68  76  6
Group2  45  23  23

我在检测数据框中的异常值时遇到了一些问题。我想检测每个组是否有一个完整的向量(一行)和对应的组向量(一到三行)的异常值。此外,我想检测一个特定行中是否存在异常值。对于这个问题,我找到了这个解决方案,但是使用此代码,我必须为每一行重复整个代码并检查表格是否为“TRUE”。是否有可能进行外部化?例如创建所有输出的矩阵,所以我只需要检查 >sum(matrix==TRUE)

代码:

x=as.numeric(data_without[1,1:400])
grubbs.flag <- function(x) {
     outliers <- NULL
     test <- x
     grubbs.result <- grubbs.test(test)
     pv <- grubbs.result$p.value
     while(pv < 0.05) {
         outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3]))
         test <- x[!x %in% outliers]
         grubbs.result <- grubbs.test(test)
         pv <- grubbs.result$p.value
     }
     return(data.frame(X=x,Outlier=(x %in% outliers)))
 }

grubbs.flag(x)
         X Outlier
1   0.1157   FALSE
2   0.1152   FALSE
3   0.1163   FALSE
4   0.1165   FALSE

【问题讨论】:

    标签: r outliers


    【解决方案1】:

    我已阅读对象文档,默认选项仅检查是否存在给定数据的单个异常值。因此,我认为每组只运行一次测试就足够了。

    首先将数据按组拆分,然后对每个组进行递归测试。最后只返回 p 值和描述以查看哪个是异常值(如果有) - 很容易识别哪个是异常值,因为它将是最大值或最小值。

    library(outliers)
    df <- t(data.frame(car = c(100,200,300),
                     g1 = c(34,35,34),
                     g1 = c(57,67,34),
                     g1 = c(68, 76, 6),
                     g2 = c(45, 23, 23)))
    row.names(df) <- c("car", "group1", "group1", "group1", "group2")
    
    lst <- lapply(1:length(unique(row.names(df))), function(x) {
      df[row.names(df)==unique(row.names(df))[x],]
    })
    
    lst
    [[1]]
    [1] 100 200 300
    
    [[2]]
    [,1] [,2] [,3]
    group1   34   35   34
    group1   57   67   34
    group1   68   76    6
    
    [[3]]
    [1] 45 23 23
    
    lapply(lst, function(x) {
      tst <- grubbs.test(x)
      c(tst$p.value, tst$alternative)
    })
    [[1]]
    [1] "0.5"                             "highest value 300 is an outlier"
    
    [[2]]
    [1] "0.244875529263511"            "lowest value 6 is an outlier"
    
    [[3]]
    [1] "0"                              "highest value 45 is an outlier"
    

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2011-08-26
      • 2021-10-22
      • 2018-12-06
      • 2019-03-09
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多