2011-12-03 56 views
2

我正在嘗試使用線性迴歸來找出3個模型的最佳權重以預測結果。所以有3個變量(x1, x2, x3)是因變量的預測,y。我的問題是,我該如何運行帶有約束迴歸的係數的總和相加爲1。例如:R在迴歸中的正則化係數

這是件好事:

y = .2(x1) + .4(x2) + .4(x3) 

因爲.2 + .4 + .4 = 1

這是沒有好:

y = 1.2(x1) + .4(x2) + .3(x3) 

因爲1.2 + .4 + .3 > 1

如果可能,我期待在R中這樣做。謝謝。讓我知道是否需要移動到統計區域('交叉驗證')。

編輯:

的問題是每一行分類爲1個或0,y是實際值(0或1)從訓練集中,X 1是從KNN模型的預測值,X 2是從一個randomForest,x3來自gbm模型。我試圖讓每個模型的最佳權重,因此每個係數< = 1,係數==總和1. 會是這個樣子:

y/Actual value  knnPred  RfPred  gbmPred 
     0    .1111  .0546  .03325 
     1    .7778  .6245  .60985 
     0    .3354  .1293  .33255 
     0    .2235  .9987  .10393 
     1    .9888  .6753  .88933 
    ...     ...   ...   ... 

成功的措施是AUC 。所以我想設定的係數最大化AUC,同時確保他們和爲1

+2

嘗試:http://stats.stackexchange.com/q/3143/229 – James

+0

這裏是你做什麼:構建一個小例子,列出你所使用的包和代碼來創建你所看到的輸出然後有人會提供建議。 –

+1

'mgcv'軟件包提供了一個函數'pcls()'(懲罰約束最小二乘擬合),該函數允許爲參數指定線性相等_和_不等式約束。您需要將模型設置在略低於'lm()',但它購買的電力可能會帶來額外的麻煩。 –

回答

2

沒有數據來測試:

mod1 <- lm(y ~ 0+x1+x2+x3, data=dat) 
mod2 <- lm(y/I(sum(coef(mod1))) ~ 0+x1+x2+x3, data=dat) 

而現在,我想關於它一些,跳過mod2,只是:

coef(mod1)/sum(coef(mod1)) 
+0

這是很酷的Dwin,但也許有必要將係數限制在0和1之間。我認爲。 – aatrujillob

+0

取決於什麼問題正在解決,這從來沒有說過。 –

+0

對不起,由於缺乏相關細節,我在上面做了一些更新。 – screechOwl

5

有很可能一個更好的方式,別人會共享的,但你要找的兩個參數,使得

b1 * x1 + b2 * x2 + (1 - b1 - b2) * x3 

接近y。要做到這一點,我會寫一個錯誤的功能,以儘量減少

minimizeMe <- function(b, x, y) { ## Calculates MSE 
    mean((b[1] * x[, 1] + b[2] * x[, 2] + (1 - sum(b)) * x[, 3] - y)^2) 
} 

扔給optim

fit <- optim(par = c(.2, .4), fn = minimizeMe, x = cbind(x1, x2, x3), y = y) 
0

對於顯示round(knnPred)round(gbmPred)中的任意一行的五個行給出完美的預測,所以存在一些問題是否需要多個預測變量。

無論如何,爲了解決給定的問題,如下所示,將給出總和爲1的非負係數(除了可能由於計算機算術的微小差異)。 a是因變量,b是自變量的矩陣。 cd定義了等式約束(coeffs sum to 1),並且ef定義了不等式約束(coeffs是非負的)。

library(lsei) 
a <- cbind(x1, x2, x3) 
b <- y 
c <- matrix(c(1, 1, 1), 1) 
d <- 1 
e <- diag(3) 
f <- c(0, 0, 0) 
lsei(a, b, c, d, e, f)