R:迭代异常值检测

时间:2014-05-21 13:35:16

标签: r outliers

我有一个数据框(df)如下:

V V1 V2 V3
1  A  B  32
1  A  C  33
1  A  E  43 
1  A  F  22
1  A  T  53 
1  A  N  54
1  C  T  44 
1  C  G  11
1  C  N  31
1  C  D  53
1  C  U  75
1  A  T  53 
1  A  N  54
2  C  T  42 
2  C  G  14
2  C  N  35
2  C  D  23
2  C  U  56

想要做什么我想得到(V,V1)的每个组合的离群值,这很容易用我的代码实现。

d <- as.data.table(df)

# Add a column to keep track of row numbers
d[, c('row'):= list(seq_len(nrow(d)))]

# For each group (combination of V and V1), perform the outlier test
outliers <- d[, chisq.out.test(V3), list(V, V1)]

主要问题是这个函数会为(V,V1)的每个组合返回一个带有p值的异常值。我需要的基本上是所有异常值以及它们的p值,即每个异常值(V,V1)或者换句话说,来自V2的所有候选者以及它们作为异常值的p值到(V,V1)。

任何想法如何更改我的代码才能做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为这可行。 dropout函数将执行迭代循环以测试异常值。对于传入的每个元素,如果元素不是异常值,它将返回1,否则它将返回p值&lt; .05用于异常值测试。

library(outliers)
dropout<-function(x) {
    if(length(x)<2) return (1)
    vals <- rep.int(1, length(x))
    r <- chisq.out.test(x)
    while (r$p.value<.05 & sum(vals==1)>2) {
        if (grepl("lowest", r$alternative)) {
            d <- which.min(ifelse(vals==1,x, NA))
        } else {
            d <- which.max(ifelse(vals==1, x, NA))
        }
        vals[d] <- r$p.value
        r <- chisq.out.test(x[vals==1])
    }
    vals
}

有了这个帮助函数,我们现在可以将它应用于由VV1定义的每个子组。为此,我们使用ave函数。

with(dd, ave(V3, V1, V2, FUN = dropout))

在给出chisq.out.test异常值定义的情况下,您的样本数据似乎在任何子组中都没有异常值。

考虑到一般情况下对于异常值的休息问题以及多个测试问题,这个迭代过程肯定没有统计意义。不过,这个讨论是针对https://stats.stackexchange.com/的,在这里我们只关注代码。