Winsorize矩阵

时间:2018-06-10 17:43:15

标签: dataframe

我想要对具有6列且非NA且没有无限值的矩阵进行优化。

我使用robustHD包和代码

winsorize(df)

但是我收到以下错误消息:

  

特征误差(R,对称= TRUE):' x'

中的无限或缺失值

有没有人知道这个问题是什么,或者我可以尝试使用另一种方法吗?

1 个答案:

答案 0 :(得分:1)

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

在这里,我们已经做到了这一点,以至于低于第二百分位数的所有内容都被限制在该值,并且高于第80百分位数的所有内容都被限制在该值。这使得这个版本的winsorizing对称中位数,中位数不会改变(与修剪不同),但意思是。

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

等等。任何你想要的胜利方法,轻松自如。