如何在 R 中拟合约束回归,使所有系数均为正且高于 0

机器算法验证 r 约束回归
2022-04-21 03:14:01

我试图了解如何解决以下二次程序:

这是我的模型 Y=π1X1+π2X2+π3X3+ε,

我的限制是: - 所有权重πk>0所以每个权重都需要在0以上

我的目标是最小化∑(Yi−(π1Xi1+π2Xi2+π3Xi3))2

下面的代码显示第一个权重等于 0 对于 meq=1,我正在寻找一个所有权重都高于 0 的解决方案。我不确定 meq 应该是 1 还是 0。为什么使用 meq =0,不受约束的结果与受约束的结果匹配?

require("quadprog")
X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
Dmat = t(X) %*% X
Amat = t(diag(3))
bvec = c(0,0,0)
dvec = t(Y) %*% X
solve.QP(Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq = 0, factorized = F)

meq=1 的结果

$solution
[1] 0.0000000 0.4365420 0.5267267


$unconstrained.solution
[1] 0.2052446 0.3196065 0.4612527

meq=0 的结果

$solution
[1] 0.1450482 0.2105224 0.5632482



$unconstrained.solution
[1] 0.1450482 0.2105224 0.5632482
1个回答

首先,您应该set.seed(1)在代码的开头添加(或任何其他种子),以便它可以重现。来到你的问题:

来自?solve.QP

meq     the first meq constraints are treated as equality constraints, all further as inequality constraints (defaults to 0).

因此,当您设置 时meq=1,您是在告诉solve.QP第一个约束不能是不等式,而是等式:换句话说,您是在说π1必须为 0。事实上,solve.QP返回一个解决方案,其中π1=0.

solve.QP(Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq=1, factorized = F)
$solution
[1] 0.0000000 0.3582641 0.6358091

$value
[1] -12.71193

$unconstrained.solution
[1] 0.2024494 0.2646992 0.5357331

无论如何,因为你只需要πi0i=1,,3,你必须设置meq=0,即你需要告诉solve.QP所有的约束都是不等式约束。无论如何,您甚至可以避免meq=0在对 的调用中传递值solve.QP,因为meq=0这是默认值。现在,既然无约束解满足约束,那么它也是约束解,这就是为什么两个解相等:

solve.QP(Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq=0, factorized = F)
$solution
[1] 0.2024494 0.2646992 0.5357331

$value
[1] -12.91278

$unconstrained.solution
[1] 0.2024494 0.2646992 0.5357331

编辑关于其他解决方案的可能性,因此需要全局方法。这个特定的优化问题属于凸优化问题家族。对于这类问题,局部最小值也是全局最小值。由于您已经找到了局部最小值,因此您无需执行任何其他操作。请注意,对于另一个非凸优化问题,这将不再适用。

两个旁注:

  1. 您不能对 施加严格的不等式约束solve.QP,因此编写约束的正确方法是 πi0i=1,,3, 不是πi>0i=1,,3
  2. 我发现solve.QPfromquadprog有一个违反直觉的界面,它可能不如替代品那么健壮。我建议你看看lseifrom package limSolve您可以在此处找到一个工作示例由于界面不同,如果您决定使用lsei.

编辑:OP 似乎对严格的不等式约束特别感兴趣,因此我添加了一些众所周知的技巧来处理它们。首先,用不严格的不等式约束来解决问题:如果约束在受约束问题的解决方案中不活跃,即,如果解决方案满足严格的不等式约束,那么你就完成了。例如,在使用非严格不等式约束的第二种情况下,找到了所有系数都是严格的meq=0solve.QP>0,即约束在约束解中不活跃。

如果一个或多个约束在解决方案中处于活动状态(例如,通过solve.QPwhen找到的解决方案meq=1),那么一个技巧是添加一个小的正数ϵ到约束。例如,代替约束πi>0i=1,,3, 你使用约束πiϵi=1,,3. 在这种情况下找到的解决方案将解决最初的严格不等式约束,因为ϵ>0. 这种方法的问题是解决方案将取决于ϵ. 然而:

  1. 总是可以解决一系列问题ϵ并深入了解解决方案在以下方面的行为ϵ.
  2. 如果优化问题模拟一个真实的物理问题,那么对物理变量的严格不等式约束通常需要一些“容差”。例如,假设您想要优化某些机器的效率,其效率与旋转轴与其静态外壳之间的间隙(例如,转子-定子密封间隙)有关。燃气轮机)。距离δ旋转部分和静态部分之间确实需要严格为正(如果转子和定子接触,则肯定会发生灾难!)。但是,为了确保转子和定子不接触,间隙需要高于某些装配/制造公差:您不能接受这样的解决方案,例如,δ=0.001微米,因为您永远无法制造出具有如此小的间隙的设计。你需要解决一个有约束的问题δ>ϵ在哪里,说,ϵ=100微米。因此,当涉及到真实的物理系统并且似乎需要严格的不等式约束时,通常我们真正需要的不是具有“物理意义”容限的严格不等式约束。