R中的约束回归:系数为正,总和为1且非零截距

机器算法验证 r 回归 计量经济学 最小二乘 约束回归
2022-03-28 17:52:54

我有我需要估计的模型, 对于

Y=π0+π1X1+π2X2+π3X3+ε,
kπk=1 for k1πk0 for k1

猫王对另一个问题的回答解决了的情况。这是他/她的此解决方案的代码:π0=0

   > library("quadprog");
   > X <- matrix(runif(300), ncol=3)
   > Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
   > Rinv <- solve(chol(t(X) %*% X));
   > C <- cbind(rep(1,3), diag(3))
   > b <- c(1,rep(0,3))
   > d <- t(Y) %*% X  
   > solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)
   $solution
   [1] 0.2049587 0.3098867 0.4851546

   $value
   [1] -16.0402

   $unconstrained.solution
   [1] 0.2295507 0.3217405 0.5002459

   $iterations
   [1] 2 0

   $Lagrangian
   [1] 1.454517 0.000000 0.000000 0.000000

   $iact
   [1] 1

如何调整此代码以便它可以估计截距?

这已在此处交叉发布,因为我的作业小组对我尚未估计此回归感到恼火。如果/当其他论坛参与者首先到达那里,我将在这里回答这个问题。

1个回答

您只需要对所涉及的矩阵进行一些操作。将拦截添加到X

XX <- cbind(1,X)

重新计算中D使用的矩阵solve.QP()(我更喜欢直接使用它来避免调用solve()

Dmat <- t(XX)%*%XX

d用新的重新计算XX

dd <- t(Y)%*%XX

通过添加零列来更改约束矩阵,因为您似乎对截距没有任何约束(对吗?):

Amat <- t(cbind(0,rbind(1,diag(3))))

最后:

solve.QP(Dmat = Dmat, factorized = FALSE, dvec = dd, Amat = Amat, bvec = b, meq = 1)