我想在 R 中执行加权非负最小二乘法(即所有拟合系数 >=0 的约束)。 nnls
包中的 nnls
函数似乎不支持权重。我是否正确,我可以在 weights
函数内通过将协变量矩阵 nnls
和因变量 X
乘以 y
向量的平方根来模拟 weights
,如似乎所示 here ?或者有更好的方法来做到这一点吗?
最佳答案
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) CVXR CVXR包可以直接做加权非负最小二乘。其插图中有一个执行非负最小二乘的示例。
vignette("cvxr_intro")
只需更改代码中的目标即可添加权重:
objective <- Minimize(sum((w *(Y - X %*% betaHat)^2)))
3) nls 如果您使用下限为全部为 0。(在下面的代码中,我们从零开始,通常从边界开始不是一个好主意,但考虑到这里的线性度,这实际上并不重要。)
zeros <- numeric(ncol(X))
nls(Y ~ X %*% b, start = list(b = zeros), weights = w, lower = zeros, alg = "port")
运行所有三种方法来仔细检查答案。
关于r - R 中的加权非负最小二乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888996/