R:迭代异常检测
我有一个数据帧(df),如下所示: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
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@ifreakave
按找到值的相同顺序返回值。因此,您只需将其添加回data.frame,dd$do now我在执行时遇到了一个奇怪的错误(缺少需要TRUE/FALSE的值
)。你知道为什么吗?@ifreak这还不足以诊断问题。我的函数处理了上面的测试数据。如果你的真实数据有所不同,我建议你找出原因,看看这是否是问题的根源。我使用了data.frame版本的数据。
with(dd, ave(V3, V1, V2, FUN = dropout))