Winsorizing очень прост и очень гибок.Легко создать функцию собственного дизайна.Трудная часть заключается в выборе наиболее подходящего дизайна.
Один из примеров
set.seed(1)
mat <- matrix(sample(-99:99, 30), 6)
ran <- quantile(mat, c(0.20, 0.80))
mat.w <- mat
mat.w[mat < ran[1]] <- ran[1]
mat.w[mat > ran[2]] <- ran[2]
mat.w - mat
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0.0 -38.8 0.0 0.0 0.0
# [2,] 0.0 0.0 0.0 0.0 0.0
# [3,] 0.0 0.0 0.0 -23.8 36.8
# [4,] -34.8 27.8 0.0 1.8 0.0
# [5,] 0.0 0.8 0.0 0.0 -4.8
# [6,] -30.8 5.8 -36.8 16.8 0.0
Здесь мы сделали так, чтобы все, что ниже двадцатого процентиля, было привязано к этому значению, ивсе, что выше восьмидесятого процентиля, ограничено этим значением.Это делает эту версию винсоризации симметричной относительно медианы, и медиана не будет изменена (в отличие от обрезки), но среднее будет.
median(mat.w) - median(mat)
# 0
mean(mat.w) - mean(mat)
# -2.6667
Этот способ винсоризации, основанный на процентилях, вероятно, является наиболее распространенным подходом, но нет никаких реальных ограничений или правил, как это должно быть сделано.
Например, мы можем основывать его на отклонениях от среднего.
cen <- mean(mat)
range(mat - cen)
# -91.8 88.2
Мы видим, что значения отклоняются от среднего значения на 91,8 ниже и на 88,2 выше максимум.Скажем, мы хотим ограничить это до 70?Легко.
mat.w <- mat
mat.w[mat - cen < -70] <- -70
mat.w[mat - cen > 70] <- 70
mat.w - mat
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 -13 0 0 0
# [2,] 0 0 0 0 0
# [3,] 0 0 0 2 27
# [4,] -9 18 0 0 0
# [5,] 0 0 0 0 0
# [6,] -5 0 -11 7 0
И так далее.Любой метод winsorizing, который вы пожелаете, просто peasy.