2014-06-17 55 views
-1

我想在R中編寫一個函數來計算權重,以便將R中的任何一組數字求和爲零。例如,如果給任何一組數字賦予加起來爲零的權重R

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

我想這將返回已加權矢量和力爲零,通過採取一些關閉的正數,並添加一些東西到負值的新載體的功能...

編輯:爲了澄清我不想將數值向上或向下移動一個比例......我想加權以使重新調整後的負數變得稍微更負/更少,並且重新調整後的正數變得稍微更少/更多正。

我不確定1)如何計算比例權重的正確值和2)如果R中有一個函數可以做到這一點?

+6

用'X - 均值(X)' – jdharrison

回答

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 
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

如何

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奧布萊恩設定額= 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 
+0

你或許應該設置'規模(X,規模= FALSE)'使其* *只是中心(並且不也是由他們(中心標準化值)標準偏差)。 –

3

1)彌補,如果你想 @jdharrison已經表示一個矢量a,使sum(x-a)爲零,然後將a設置爲x的平均值。

2)權重向量問題的措辭看來,要求權重向量w使得sum(w * x)爲零。

(ⅰ)如果x不是恆定的(即,其元素是不全部相同),然後在數學符號P = I-xx'/(x'x)是投影正交xP1 = 1 - xx'1/(x'x)在P的範圍內的載體中,從而切換至R代碼:

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 
+0

謝謝..與權重的第二部分是我以後....與零作品:) – user3343467

+0

@ g-grothendieck只是再次玩這個...得到一些意想不到的行爲與大量...例如, x < - c(-5,-3,0,2,4,6,20); rescale_zero < - function(x){w < - 1 - x * sum(x)/ sum(x * x); w * x}; rescale_zero(x)... 20被重新調整爲0.4081(小於其他+ ve數字?) – user3343467

+0

結果w與x正交,這就是所需要的。 –