我想从我的数据集的每一列中删除异常值...通过搜索网络,似乎Hampel标识符应该是我的问题的一个很好的解决方案,它具有异常值检测技术:[median – t * MAD, median + t * MAD]
。< / p>
使用以下提供的说明:http://exploringdatablog.blogspot.com/2012/01/moving-window-filters-and-pracma.html我想使用“outlierMAD”命令来完成我的任务:
outlierMAD <- function (x, k){
n <- length(x)
y <- x
ind <- c()
L <- 1.4826
t0 <- 3
for (i in (k + 1):(n - k)) {
x0 <- median(x[(i - k):(i + k)])
S0 <- L * median(abs(x[(i - k):(i + k)] - x0))
if (abs(x[i] - x0) > t0 * S0) {
y[i] <- x0
ind <- c(ind, i)
}
}
list(y = y, ind = ind)
}
但是当我尝试时出现错误:
Error in if (abs(x[i] - x0) > t0 * S0) { :
missing value where TRUE/FALSE needed
任何人都可以帮我这个吗?如何在数据中避免使用NA?
我的样本数据链接可在以下位置找到: https://drive.google.com/file/d/0B86_a8ltyoL3NHNaeWk3d1QyQms/view?usp=sharing
答案 0 :(得分:1)
abs(x [i] -x0)的逻辑值&gt; t0 * S0应为True或False。如果任何变量是NA或被视为非数字,则可能发生错误。 在NA存在的情况下,如果na.rm = FALSE,则中值可以产生NA而不是中值。为中位数设置na.rm = TRUE将修复X0和S0,但如果x [I] = NA本身,则无助于上面的逻辑表达式。 尝试检查NA或其他一些非数字值的数据。希望这可以帮助。
答案 1 :(得分:0)
我使用'pracma'包的hampel函数得到了同样的错误。这个问题是由我的时间序列引起的,该时间序列少于5次。检查你的是否足够长。
答案 2 :(得分:0)
需要降低K值,或者如果nrow(df)> 0,则保持一个条件。 5然后应用hample,否则跳过hample并继续进行5组
的平均值