R中的加权非负最小二乘

R中的加权非负最小二乘,r,least-squares,R,Least Squares,我希望在R中执行加权非负最小二乘法(即,所有拟合系数均>=0)。nnls包中的nnls函数似乎不支持权重。通过将协变量矩阵X和因变量y乘以权重向量的平方根,我可以在nnls函数中模拟权重对吗?或者有更好的方法来实现这一点吗?1)nnls是的,它是等效的,因为加权最小二乘法最小化了: sum( w * (Y - X %*% beta)^2 ) = sum_i( (sqrt(w[i]) * X[i, ] %*% beta - sqrt(w[i]) * Y[i])^2 ) 受限制,其中sum_i表示

我希望在R中执行加权非负最小二乘法(即,所有拟合系数均>=0)。
nnls
包中的
nnls
函数似乎不支持权重。通过将协变量矩阵
X
和因变量
y
乘以
权重
向量的平方根,我可以在
nnls
函数中模拟
权重
对吗?或者有更好的方法来实现这一点吗?

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)*X
sqrt(w)*Y
。(请注意,它们也分别等于
diag(sqrt(w))%*%X
c(diag(sqrt(w))%*%Y)
。)

2)CVXRCVXR软件包可以直接执行加权非负最小二乘法。在其渐晕图中有一个执行非负最小二乘的示例

vignette("cvxr_intro")
只需更改代码中的目标即可添加权重:

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

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

希望此链接有帮助:
srvy
软件包允许您使用指定的权重创建矩阵。我处理调查数据并交叉处理同一问题。使用此软件包,您可以创建一个矩阵,其中的权重已经应用,并与任何其他软件包一起使用,这样您就不需要软件包本身包含一个特定的参数来对数据进行加权。此外,我熟悉常规加权最小二乘法,这不是问题所在-我正在寻找一个函数,虽然它允许我约束所有系数为正…我想你可以使用glmnet包:是的,我知道glmnet,它允许权重和约束,当lambda设置为零时,它不会做任何正则化。但它比nnls慢得多,因此我的问题是,在nnls中,X和y乘以sqrt(权重)是否正确?对于我的问题大小,加权nnls需要0.25s,λ=0和更低的glmnet。限制=0需要2s(慢8x),CVXR需要95s(慢380x)。遗憾的是CVX速度如此之慢,因为我喜欢它的灵活性-希望他们将来可以结合一个更快的解算器,如CPLEX。。。没有尝试nls,因为我知道它不是那么健壮…我建议你也尝试nls。关于它的这个评论确实不准确,特别是对于这样一个线性问题。刚刚尝试过,nls给了我一个错误“'收敛失败:奇异收敛(7)''-所以不幸的是,这证实了我的怀疑,它往往不是非常稳健…我不会得出结论。如果你的X矩阵是奇异的,那可能会发生,但这只是意味着你提供了一个模棱两可的规范。我确信我的X矩阵并不完全是奇异的-即使有很大的共线性。。。
zeros <- numeric(ncol(X))
nls(Y ~ X %*% b, start = list(b = zeros), weights = w, lower = zeros, alg = "port")