【问题标题】:R: iterative outliers detectionR:迭代异常值检测
【发布时间】:2014-05-21 13:35:16
【问题描述】:

我有一个数据框(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 值的异常值。我需要的基本上是所有异常值以及它们作为每个 (V,V1) 的异常值的 p 值,或者换句话说,来自 V2 的所有候选人以及它们作为异常值的 p 值 (@987654326 @)。

有什么想法可以改变我的代码来做到这一点吗?

【问题讨论】:

    标签: r outliers


    【解决方案1】:

    我认为这可能有效。 dropout 函数将进行迭代循环以测试异常值。对于您传入的每个元素,如果该元素不是异常值,它将返回 1,否则将返回 p 值

    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/,这里我们只关注代码。

    【讨论】:

    • 感谢您的回答,我更新了函数,以便它可以返回异常值分数以及 V、V1。但最后,我怎样才能得到每个异常值对应的行号?所以我可以得到哪个 V2 是每个 V、V1 的异常值。我将函数调用如下:outliers &lt;- d[, dropout(V3), list(V, V1)] outliers &lt;- merge(outliers, d[, list(max.ind=row[which.max(V3)]), list(V, V1)], by=c('V', 'V1')) 但这只会给我最大的行索引,我想要每个异常值的行索引。
    • @ifreak ave 以找到它们的相同顺序返回值。因此,您可以将其添加回 data.frame,dd$do &lt;- with(dd, ave(V3, V1, V2, FUN = dropout))
    • 现在我在一段时间内遇到了一个奇怪的错误 (missing value where TRUE/FALSE needed)。你知道为什么吗?
    • @ifreak 没有足够的信息来诊断问题。我的功能适用于您上面的测试数据。如果您的真实数据以某种方式有所不同,我建议您弄清楚是如何导致问题的。我使用了 data.frame 版本的数据。
    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 2019-10-01
    • 2020-02-23
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2018-10-08
    相关资源
    最近更新 更多