具有系数约束的线性回归

ari*_*lle 6 r linear-regression quadratic-programming

我正在尝试执行线性回归,对于这样的模型:

Y = aX1 + bX2 + c
Run Code Online (Sandbox Code Playgroud)

所以, Y ~ X1 + X2

假设我有以下响应向量:

set.seed(1)
Y <- runif(100, -1.0, 1.0)
Run Code Online (Sandbox Code Playgroud)

以下预测变量矩阵:

X1 <- runif(100, 0.4, 1.0)
X2 <- sample(rep(0:1,each=50))
X <- cbind(X1, X2)
Run Code Online (Sandbox Code Playgroud)

我想对系数使用以下约束:

a + c >= 0  
c >= 0
Run Code Online (Sandbox Code Playgroud)

所以对b没有约束.

我知道glmc包可以用来应用约束,但是我无法确定如何将它应用于我的约束.我也知道可以使用contr.sum,例如,所有系数总和为0,但这不是我想要做的.solve.QP()似乎是另一种可能性,meq=0可以使用设置使所有系数> = 0(同样,这里不是我的目标).

注意:解决方案必须能够处理响应向量Y中的NA值,例如:

Y <- runif(100, -1.0, 1.0)
Y[c(2,5,17,56,37,56,34,78)] <- NA
Run Code Online (Sandbox Code Playgroud)

jos*_*ber 4

solve.QP可以传递任意线性约束,因此它当然可以用于对约束a+c >= 0和进行建模c >= 0

首先,我们可以添加一列 1 来X捕获截距项,然后我们可以使用以下命令复制标准线性回归solve.QP

X2 <- cbind(X, 1)
library(quadprog)
solve.QP(t(X2) %*% X2, t(Y) %*% X2, matrix(0, 3, 0), c())$solution
# [1]  0.08614041  0.21433372 -0.13267403
Run Code Online (Sandbox Code Playgroud)

对于问题中的样本数据,使用标准线性回归都无法满足这两个约束。

通过修改Amatbvec参数,我们可以添加两个约束:

solve.QP(t(X2) %*% X2, t(Y) %*% X2, cbind(c(1, 0, 1), c(0, 0, 1)), c(0, 0))$solution
# [1] 0.0000000 0.1422207 0.0000000
Run Code Online (Sandbox Code Playgroud)

根据这些约束,通过将 a 和 c 系数设置为都等于 0,可以最小化残差平方。

您可以通过删除有问题的观察值来处理缺失值,Y或者X2像函数一样处理缺失值。lm您可以执行以下操作作为预处理步骤:

has.missing <- rowSums(is.na(cbind(Y, X2))) > 0
Y <- Y[!has.missing]
X2 <- X2[!has.missing,]
Run Code Online (Sandbox Code Playgroud)