对R中的任何数字组合进行加权以求总和为零

时间:2014-06-17 15:14:16

标签: r sum weighted-average

我想在R中编写一个函数来计算权重,将R中的任何数字集合加到零。例如,如果

x <- c(-5, 6, 2, 4, -3)

我想要一个函数来返回一个新的向量,该向量已被加权以强制向量和为零,通过从正数中取一些东西并向负值添加一些内容......

编辑:为了澄清我不想将值向上或向下移动...我想要加权,以便重新调整的负数变得略微/更少负数和重新调整的正数变得略微/更积极。

我不确定1)如何计算比例权重的正确值以及2)如果R中有一个可以做到的函数?

4 个答案:

答案 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 。然后xs <- 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