2017-08-08 139 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