解决R中复杂约束的二次优化问题

时间:2017-04-07 12:34:05

标签: r optimization regression quadratic-programming

有人知道如何在R中实现回归,其中我们的目标是最小化残差的平方和,所有残差都是非负的,并且还有系数约束?具体而言,我询问关于二次项的单变量回归,其中b_0 <= 0,b_1> = 0且b_2> = 0。

我能够解决类似的问题,其目标是使用lpSolve包最小化残差总和。在R中求解平方和似乎相当困难。任何想法?

有人问过Cross Validated:

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

2 个答案:

答案 0 :(得分:1)

步骤1.制定模型。这是在post中完成的。虽然我认为完整的模型应该如下:

enter image description here

观察这是一个纯粹的二次规划问题。决策变量是beta0,beta1,beta2和r(i)。我们已经对决策变量和线性等式进行了界定(记住y和x是这里的数据)。 标准QP模型如下:

enter image description here

这里新的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这样的求解器应该没有问题。

答案 1 :(得分: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