Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:迭代异常检测_R_Outliers - Fatal编程技术网

R:迭代异常检测

R:迭代异常检测,r,outliers,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

我有一个数据帧(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)]

d我认为这可能有效。
dropout
函数将执行迭代循环以测试异常值。对于传入的每个元素,如果该元素不是异常值,它将返回1,否则对于异常值测试,它将返回p值<.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
}
似乎您的样本数据在给定的任何子组中都没有异常值
chisq.out.test
异常值定义


当然,考虑到一般情况下的异常值问题以及多重测试问题,这个迭代过程在统计上是没有意义的。尽管如此,我们还是要讨论代码。

谢谢您的回答,我更新了函数,以便它可以返回异常值分数以及V,V1。但最后,我如何才能得到每个异常值对应的行号?所以我可以得到哪个V2是每个V,V1的异常值。我按如下方式调用该函数:
outliers@ifreak
ave
按找到值的相同顺序返回值。因此,您只需将其添加回data.frame,
dd$do now我在执行时遇到了一个奇怪的错误(
缺少需要TRUE/FALSE的值
)。你知道为什么吗?@ifreak这还不足以诊断问题。我的函数处理了上面的测试数据。如果你的真实数据有所不同,我建议你找出原因,看看这是否是问题的根源。我使用了data.frame版本的数据。
with(dd, ave(V3, V1, V2, FUN = dropout))