我想在R中编写一个函数来计算权重,将R中的任何数字集合加到零。例如,如果
x <- c(-5, 6, 2, 4, -3)
我想要一个函数来返回一个新的向量,该向量已被加权以强制向量和为零,通过从正数中取一些东西并向负值添加一些内容......
编辑:为了澄清我不想将值向上或向下移动...我想要加权,以便重新调整的负数变得略微/更少负数和重新调整的正数变得略微/更积极。
我不确定1)如何计算比例权重的正确值以及2)如果R中有一个可以做到的函数?
答案 0 :(得分:3)
怎么样
x <- scale(x)
> x
[,1]
[1,] -1.2450825
[2,] 1.1162809
[3,] 0.2576033
[4,] 0.6869421
[5,] -0.8157437
attr(,"scaled:center")
[1] 0.8
attr(,"scaled:scale")
[1] 4.658326
> sum(scale(x))
[1] 5.551115e-17
编辑: 正如@Josh O&#39; brien所建议的,设置scale = FALSE给出
scale(x, scale = FALSE)
[,1]
[1,] -5.8
[2,] 5.2
[3,] 1.2
[4,] 3.2
[5,] -3.8
attr(,"scaled:center")
[1] 0.8
sum(scale(x, scale = FALSE))
[1] 6.661338e-16
答案 1 :(得分:3)
1)偏移 @jdharrison已经指出你是否想要一个向量a
,使sum(x-a)
为零,然后将a
设置为{的平均值{1}}会这样做。
2)权重向量问题的措辞似乎要求权重向量x
,使w
为零。
(i)如果sum(w * x)
不是常数(即其元素不完全相同),则数学符号x
是与{{1}正交的投影}和P = I-xx'/(x'x)
)是x
范围内的向量,因此切换到R代码:
P1 = 1 - xx'1/(x'x
是这样的权重向量。我们可以验证这一点:
P
(ii)如果w <- 1 - x * sum(x) / sum(x*x)
是常数但不是相同的零,那么选择任何非常数向量> sum(w*x)
[1] 2.220446e-16
。然后x
与s <- seq_along(x)
正交,因此:
Ps = s - xx's/(x'x)
,并提供:
x
答案 2 :(得分:2)
阐述@ jdharrison的评论:
> x
[1] -5 6 2 4 -3
> sum(x)
[1] 4
> mean(x)
[1] 0.8
> x - mean(x)
[1] -5.8 5.2 1.2 3.2 -3.8
> sum(x - mean(x))
[1] 6.661338e-16 #floating point 0
所以x - mean(x)
会做到这一点。
答案 3 :(得分:1)
如果您想在重新缩放后保留标志......
x <- c(-5, -3, 0, 2, 4, 6, 50)
rescale_zero <- function(x){
x1 <- x[x>0]
x2 <- x[x<0]
d <- (sum(x1) + sum(x2)) / 2
w1 <- (sum(x1) - d) / sum(x1)
w2 <- (sum(x2) - d) / sum(x2)
y <- x
y[x>0] <- x1*w1
y[x<0] <- x2*w2
y
}
rescale_zero(x)
# [1] -21.875000 -13.125000 0.000000 1.129032 2.258065 3.387097 28.225806