带有系数约束的线性回归

6

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

Y = aX1 + bX2 + c

所以,Y ~ X1 + X2

假设我有以下响应向量:

set.seed(1)
Y <- runif(100, -1.0, 1.0)

以下是预测变量的矩阵:

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

我希望在系数上使用以下约束条件:

a + c >= 0  
c >= 0

因此,对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
1个回答

4

solve.QP可以传递任意线性约束条件,因此它肯定可以用来建立您的约束条件a+c >= 0c >= 0的模型。

首先,我们可以在X中添加一列1,以捕获截距项,然后我们可以使用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

使用问题中的示例数据,标准线性回归无法满足任何限制条件。

通过修改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

在这些限制条件下,将a和c系数都设置为0可以最小化平方残差。
您可以像lm函数一样处理Y或X2中的缺失值,方法是删除有问题的观测值。您可以像以下这样作为预处理步骤:
has.missing <- rowSums(is.na(cbind(Y, X2))) > 0
Y <- Y[!has.missing]
X2 <- X2[!has.missing,]

1
谢谢您的回答!只是为了确保我理解正确,因为我想要a+c>=0和c>=0,那么满足这些约束条件但a和c不等于0的情况不应该受到限制,它们应该保持原样(标准线性回归的结果)。您的解决方案是否适用于可能满足约束条件的不同数据?我希望能够在不事先知道是否使用标准线性回归满足约束条件的情况下应用它(以便我可以在大型数据集上使用它)。 - arielle
1
此外,当使用这种方法时,我们如何处理响应中可能存在的NA值(我习惯于使用lm())?我们如何获得系数的标准误差或p值? - arielle
1
是的,如果原始线性回归中的约束条件不是强制性的话,则会得到那些结果。只有当标准线性回归中未满足这些约束条件时,这些约束条件才会改变事物。关于您的关于p值的问题,我不知道答案;您可以在stats.stackexchange.com上获得帮助。 - josliber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接