我想要对具有6列且非NA且没有无限值的矩阵进行优化。
我使用robustHD
包和代码
winsorize(df)
但是我收到以下错误消息:
特征误差(R,对称= TRUE):' x'
中的无限或缺失值
有没有人知道这个问题是什么,或者我可以尝试使用另一种方法吗?
答案 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
等等。任何你想要的胜利方法,轻松自如。