有人知道如何在R中实现回归,其中我们的目标是最小化残差的平方和,所有残差都是非负的,并且还有系数约束?具体而言,我询问关于二次项的单变量回归,其中b_0 <= 0,b_1> = 0且b_2> = 0。
我能够解决类似的问题,其目标是使用lpSolve包最小化残差总和。在R中求解平方和似乎相当困难。任何想法?
有人问过Cross Validated:
答案 0 :(得分:1)
步骤1.制定模型。这是在post中完成的。虽然我认为完整的模型应该如下:
观察这是一个纯粹的二次规划问题。决策变量是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这样的求解器应该没有问题。
答案 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