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) * X
和 sqrt(w) * Y
。 (请注意,它们也分别等于 diag(sqrt(w)) %*% X
和 c(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")
运行 仔细检查答案的所有三种方法。
我想在 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) * X
和 sqrt(w) * Y
。 (请注意,它们也分别等于 diag(sqrt(w)) %*% X
和 c(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")
运行 仔细检查答案的所有三种方法。