繁体   English   中英

R中的加权非负最小二乘

[英]Weighted nonnegative least squares in R

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

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)如果您使用下限全为0的port算法,则R附带的nls可以执行非负加权最小二乘。(在下面的代码中,我们从零开始,通常不要从零开始边界,但考虑到这里的线性度就没关系了。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM