0

我想在 R 中编写一个函数来计算权重,以将 R 中的任何一组数字求和为零。例如,如果

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

我想要一个函数,该函数将返回一个新向量,该向量已被加权以强制向量总和为零,方法是从正数中取出一些东西并向负值添加一些东西......

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

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

4

4 回答 4

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'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
于 2014-06-17T15:21:20.997 回答
3

1) 偏移量@jdharrison 已经表明,如果你想要一个为零的向量,那么设置a为的平均值就可以了。sum(x-a)ax

2)权重向量问题的措辞似乎要求权重向量w为零 sum(w * x)

(i)如果x不是常数(即它的元素并不完全相同),那么在数学符号P = I-xx'/(x'x)中是一个与 正交的投影,x并且)是一个在切换到 R 代码P1 = 1 - xx'1/(x'x的范围内的向量:P

w <- 1 - x * sum(x) / sum(x*x)

就是这样一个权重向量。我们可以验证这一点:

> sum(w*x)
[1] 2.220446e-16

(ii)如果x是常数但不完全为零,则选择任何非常量向量s <- seq_along(x),例如。那么Ps = s - xx's/(x'x)与所以正交x

x <- c(1, 1, 1, 1)
s <- seq_along(x)
w <- s - x * sum(s*x) / sum(x*x)
sum(w * x)

给予:

> sum(w * x)
[1] 0
于 2014-06-17T15:42:28.367 回答
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)会做的伎俩。

于 2014-06-17T15:20:56.020 回答
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
于 2017-11-19T06:00:12.500 回答