我对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。
答案 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