使用重复循环查找多个异常值?

时间:2014-06-21 02:24:52

标签: r outliers

我对R很陌生,我正在努力寻找重复循环,寻找异常值,或两者兼而有之。

我有一个矩阵形式的大但不可靠的数据集。我使用包异常值来搜索数据集中的异常值,特别是在我的数据矩阵的每一行中,但每行有多个异常值。为了寻找多个异常值,我尝试使用重复循环来替换异常值(使用行均值),直到行的标准偏差低于某个指定值。

replaceoutliers <- function(data, standarddeviationthreshold) {
for(k in 1:nrow(data)) {
    repeat{
        data[k,] <- rm.outlier(data[k,], fill=TRUE, median=FALSE, opposite=FALSE)
            if(sd(data[k,]) > standarddeviationthreshold) {
            break
          }
        }
    }
    View(data)
}

该函数运行,但只替换每行中的高值。重复循环中有问题吗?有谁知道会找到并替换多个异常值的包?到目前为止,我一直无法做到好。

谢谢!

编辑:我无法分享我正在使用的数据,但这是我运行的测试: 我通过了函数

data <- matrix(c(1:16)^2, nrow=4, ncol=4)
data
         [,1] [,2] [,3] [,4]
[1,]    1   25   81  169
[2,]    4   36  100  196
[3,]    9   49  121  225
[4,]   16   64  144  256

replaceoutliers(data, 1)
     [,1] [,2] [,3]     [,4]
[1,]    1   25   81 35.66667
[2,]    4   36  100 46.66667
[3,]    9   49  121 59.66667
[4,]   16   64  144 74.66667

所以我们看到高值被均值所取代。但是在第一行中,例如,也应该替换1。

1 个答案:

答案 0 :(得分:1)

您最好直接使用outlier功能,以便连续删除异常值:

replaceoutliers <- function(x, threshold) {
  t(apply(data, 1, function(row) {
    exclude <- rep(FALSE, length(row))
    repeat {
      outliers <- outlier(row[!exclude], logical=TRUE)
      exclude[!exclude] <- outliers
      if (sd(row[!exclude]) < threshold) break
    }
    row[exclude] <- mean(row)
    row
  }))
}

此处,异常值从数据中连续删除并替换为均值,直到违反所需的标准差。

一些注意事项:

标准差测试的方向错误。当您用平均值替换异常值时,标准偏差将减小。

outlier在数据中找到一个异常值,值越低。保持删除值的逻辑允许连续删除,同时跟踪数据的位置。

无法保证在第二次迭代时将删除较低的值。对于第一行,在删除81之前,您将删除1

如果尝试标准偏差过低,则测试失败。人们可以为此编码守卫,但我没有:

> replaceoutliers(data, 50)
     [,1] [,2] [,3] [,4]
[1,]    1   25   81   69
[2,]    4   36  100   84
[3,]    9   49  101  101
[4,]   16   64  120  120
> replaceoutliers(data, 34)
     [,1] [,2] [,3] [,4]
[1,]    1   25   69   69
[2,]    4   36   84   84
[3,]    9   49  101  101
[4,]   16   64  120  120
> replaceoutliers(data, 33)
 Error in if (sd(row[!exclude]) < threshold) break : 
  missing value where TRUE/FALSE needed