我正在与支持向量机一起使用,并希望减少异常值。 因此,我具有将异常值降低至原始值的70%的功能。 我发现此方法比winsorization更好,因为它不会为相同的值分配大量数据点,而是会产生更均匀的分布。
减少异常值的功能-
outlier <- function(x) {
x[x < quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE) | x > quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE)] <- (x * 0.7)
x
}
问题是该函数在某些列上有效,但在其他列上却产生此错误消息。
警告消息:
在x [x <分位数(x,0.25,na.rm = TRUE)-3 * IQR(x,na.rm = TRUE)| :要替换的项目数不是替换长度的倍数
答案 0 :(得分:2)
由于函数内<-
的LHS和RHS上向量的长度不同,导致出现错误。这是正确的方法-
outlier <- function(x) {
idx <- (x < quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE)) | (x > quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE))
x[idx] <- x[idx] * 0.7
x
}
答案 1 :(得分:1)
要解决长度问题,请使用ifelse
,以便您知道将创建一个与原始x
相同长度的新向量。另外,在复杂的条件下,请尝试将它们分解成较小的部分。除非您对操作顺序有100%的把握,否则很容易出错,而且我不确定您当前的逻辑是否满足您的要求:
outlier <- function(x) {
lower_limit = quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE)
upper_limit = quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE)
is_outlier = (x < lower_limit) | (x > upper_limit)
print(paste("Replacing", sum(is_outlier), "outliers"))
ifelse(
is_outlier,
x * 0.7,
x
)
}