R中的加权非负最小二乘

问题描述 投票:2回答:1

我想在R中执行加权非负最小二乘(即,所有拟合系数都> = 0的约束)。 nnls包中的nnls函数似乎不支持权重。我是否正确,我可以模拟weights虽然在nnls函数内通过将协变量矩阵X和因变量y乘以weights向量的平方根,似乎表示here?或者有更好的方法来做到这一点?

r least-squares
1个回答
4
投票

1)nnls是的,它是等价的,因为加权最小二乘最小化:

sum( w * (Y - X %*% beta)^2 )
= sum_i( (sqrt(w[i]) * X[i, ] %*% beta - sqrt(w[i]) * Y[i])^2 )

受制约束,其中sum_i表示i的总和。因此,sqrt(w[i])乘以X的第i行和Y的第i个元素,相当于使用sqrt(w) * Xsqrt(w) * Y。 (注意,这些也分别等于diag(sqrt(w)) %*% Xc(diag(sqrt(w)) %*% Y)。)

2)CVXR CVXR包可以直接进行加权非负最小二乘。有一个在其小插图中执行非负最小二乘的示例。

vignette("cvxr_intro")

只需更改代码中的目标即可添加权重:

objective <- Minimize(sum((w *(Y - X %*% betaHat)^2)))

3)如果你使用nls算法的全部0的下限,那么R附带的nls port可以做非负加权最小二乘。(在下面的代码中我们从0开始,通常不是一个好主意开始边界,但在这里给出了线性,这无关紧要。)

zeros <- numeric(ncol(X))
nls(Y ~ X %*% b, start = list(b = zeros), weights = w, lower = zeros, alg = "port")

运行所有三种方法来仔细检查答案。

© www.soinside.com 2019 - 2024. All rights reserved.