[英]Weight any set of numbers to sum to zero in R
我想在R中編寫一個函數,該函數計算權重以將R中的任何數字集求和為零。 例如,如果
x <- c(-5, 6, 2, 4, -3)
我想要一個函數將返回一個新的向量,該向量已加權過,以通過從正數中去除某些東西並將某些東西添加到負值中來將向量和強制為零...
編輯 :為澄清起見,我不想將值上移或下移...我想加權,以便重新縮放的負數變為略多/少負,而重新縮放的正數變為略少/多正。
我不確定1)如何計算比例權重的正確值,以及2)R中是否有可以做到的功能?
怎么樣
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建議,設置比例= 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)如果你想有一個矢量@jdharrison已經表示偏移 a
,使得sum(xa)
是接零設置a
是平均x
將做到這一點。
2)權重向量問題的措詞似乎要求權重向量w
使得sum(w * x)
為零。
(i)如果x
不是恆定的(即,其元素不是全部相同), P = I-xx'/(x'x)
數學符號P = I-xx'/(x'x)
是正交於x
的投影,並且P1 = 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
詳細闡述@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)
可以解決問題。
如果要在重新縮放后保留符號...
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.