2017-08-08 98 views
5

我试图进行线性回归,像这样的模式:线性回归与系数的约束

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 

回答

2

solve.QP可以传递任意线性约束,所以它当然可以用于模型您的限制a+c >= 0c >= 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 

随着从问题的样本数据,既不限制是使用标准线性回归来满足。

通过修改两个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函数一样,您可以通过删除违规观察值来处理YX2中的缺失值。你可能会做一些类似于以下内容的预处理步骤:

has.missing <- rowSums(is.na(cbind(Y, X2))) > 0 
Y <- Y[!has.missing] 
X2 <- X2[!has.missing,] 
+1

谢谢你的回答!为了确保我理解正确,因为我想要一个+ c> = 0且c> = 0,满足这些约束但a和c不等于0的情况应该不受限制,它们应该保留为是(标准线性回归的结果)。您的解决方案是否适用于系数可能符合约束条件的不同数据?如果使用标准线性回归来满足约束条件(以便我可以在大型数据集上使用它),我希望能够在不知道事先知道的情况下应用此功能。 – arielle

+1

另外,在使用这种方法(我习惯于lm())时,如何处理响应中的潜在NAs,以及如何得到系数的标准误差或p值? – arielle

+1

是的,如果约束在原始线性回归中不具约束力,那么您将返回这些结果。如果在标准线性回归中不满足约束条件,约束条件只会改变。我不知道你有关P值的问题的答案;您可能可以通过stats.stackexchange.com获得帮助。 – josliber