2

有谁知道如何在 R 中实现回归,我们的目标是最小化残差的平方和,因为所有残差都是非负的,并且对系数有限制?具体来说,我在询问具有二次项的单变量回归,其中 b_0 <=0,b_1>=0 和 b_2>=0。

我能够解决类似的问题,目标是使用 lpSolve 包最小化残差总和。在 R 中求解平方和似乎要困难得多。有什么想法吗?

交叉验证也提出了问题:

https://stats.stackexchange.com/questions/272234/restrictions-on-residuals-and-coefficients-in-regression-dfa

4

2 回答 2

1

步骤 1. 制定模型。这是在这篇文章中完成的。虽然我认为完整的模型应该是这样的:

在此处输入图像描述

观察这是一个纯二次规划问题。决策变量是 beta0、beta1、beta2 和 r(i)。我们对决策变量和线性等式有界限(记住 y 和 x 是这里的数据)。标准 QP 模型如下所示:

在此处输入图像描述

这里新的 x 是变量 beta0、beta1、beta2 和 r(i)。矩阵 A 由下式构成

A = [1 x(i) x(i)^2 I ]

其中 x(i) 再次是数据。最后一部分是一个身份子矩阵。Q 矩阵是一个单位矩阵(对应于 beta、beta1、beta2 的变量为零):

Q = [ 0  0 ]
    [ 0  I ]

步骤 2. 使用 QP 求解器求解。像 QuadProg、Gurobi 或 Cplex 这样的求解器应该没有问题。

于 2017-04-11T12:52:49.347 回答
0

这是一个尝试实现上面给出的解决方案的代码片段:

library(quadprog)

xvec <- c(8.1,6.4,6.8,13.3,0.7,2.4,3.5,6.5,1.9,2.8,8.0,6.8,4.6,18.6,1.1,9.5,1.4,3.8,0.7,11.5,7.1,8.2,7.0,7.0,2.2,9.8,0.3,2.5,10.6,1.4,31.0)
yvec <- c(15.8,10.6,12.8,26.5,1.3,3.9,6.2,13.1,3.1,4.4,12.6,11.6,9.3,35.3,1.8,16.0,2.7,6.4,1.3,18.9,12.0,14.3,13.5,11.3,3.5,16.0,0.6,4.8,17.7,2.5,71.0)

K <- length(xvec)

# decision vars: c(beta0, beta1, beta2, r1, ..., rK)

Amat <- cbind(rep(1,K), xvec, xvec^2, diag(rep(1, K)))
Amat <- rbind(Amat, c(-1, rep(0,K+2)), c(0,1, rep(0,K+1)), c(0,0,1, rep(0,K)))

bvec <- c(yvec, rep(0,3))

Dmat <- diag(rep(1, K+3))
Dmat[1:3, 1:3] <- diag(rep(0.000001, 3))

s <- solve.QP(Dmat=Dmat, dvec=rep(0, K+3), Amat=t(Amat), bvec=bvec, meq=K)

s$solution
于 2017-04-17T22:23:01.787 回答