R中的加权非负最小二乘法

Weighted nonnegative least squares in R

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

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 即可添加权重:

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

3) nls nls 如果你使用所有下限的 port 算法,R 可以做非负加权最小二乘0.(在下面的代码中,我们从零开始,通常从边界开始不是一个好主意,但考虑到这里的线性度,这真的无关紧要。)

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

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