减少异常值的功能
Function to reduce outliers
我正在使用支持向量机并希望减少异常值。
所以我有一个函数可以将异常值减少到原始值的 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
}
问题是该函数在某些列上有效,但在其他列上产生此错误消息。
警告信息:
In x[x < quantile(x, 0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE) |
: number of items to replace is not a multiple of replacement length
您收到错误消息是因为函数内 <-
的 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
}
要解决长度问题,请使用 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
)
}
我正在使用支持向量机并希望减少异常值。 所以我有一个函数可以将异常值减少到原始值的 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
}
问题是该函数在某些列上有效,但在其他列上产生此错误消息。
警告信息:
In x[x < quantile(x, 0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE) | : number of items to replace is not a multiple of replacement length
您收到错误消息是因为函数内 <-
的 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
}
要解决长度问题,请使用 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
)
}