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

标签 r least-squares

我想在 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) * 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) 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/

相关文章:

r - 保存使用 "by"函数生成的数据帧中保存的数据

reshape 相关矩阵以按列对堆叠

python - 为什么 scipy.optimize.curce 拟合函数无法正确拟合数据点以及为什么给出较大的 pfit 值?

opencv - 为什么直接线性变换 (DLT) 不能给出最佳的相机外部参数?

r - 使用 R 包 "Survival"的多态生存分析

r - 长格式 tsibble 中的多个时间序列

r - 在 R 中将 NA 转换为 0,将非 NA 转换为 1

python - 如何强制 scipy.optimize.curve_fit 修复第一点?

Python Numpy 泊松回归产生错误的数字

command-line-arguments - Vowpal Wabbit 中的普通最小二乘回归