2012-04-03 122 views
4

我希望儘量減少使用普通最小二乘法與約束,所有係數之和必須等於5.我怎樣才能做到這一點R中的簡單線性函數Y = x1 + x2 + x3 + x4 + x5所有參數的約束?我所見過的所有軟件包似乎都允許對各個係數進行約束,但我無法弄清楚如何設置影響係數的單個約束。我沒有被綁定到OLS。如果這需要迭代方法,那也沒有問題。最小化與R中

+0

如果係數必須總和爲5,那麼你可以刪除最後一個參數並將其設置爲'5-sum(p [1:4])'......你可以設想自己做微積分,表達式... – 2012-04-03 19:48:29

+0

@BenBolker謝謝你的建議。這將如何工作?如果我將方程式表示爲'Y〜x1 + x2 + x3 + x4 + x5',那麼我如何向最小化函數表明我想保留'x5'的參數設置爲'5-sum(x [1: 4])'?我不能只求解'Y〜x1 + x2 + x3 + x4',因爲(在我看來)是一個完全不同的優化問題。 – eykanal 2012-04-03 19:55:45

+0

目前我認爲這個問題是不明確的。假設(爲了簡單起見)'n = 3'和'sum(p)= C'。原始的線性問題(沒有約束)是不適當的,因爲如果x是正數,我們可以通過將係數設置爲大負數來使'a1 * x1 + a2 * x2 + a3 * x3'儘可能小,反之亦然,對(a1 + a2 + a3 = C)施加約束將其轉化爲較低維度,但仍存在不適合的問題,即最小化a1 *(x1-x3)+ a2 *(x2-x3)+ C * x3 )'。小心澄清問題......? (也許你的意思是你想要擬合線性*最小二乘*問題) – 2012-04-03 20:05:25

回答

4

基本的數學如下:我們先從

mu = a0 + a1*x1 + a2*x2 + a3*x3 + a4*x4 

,我們想找到a0 - a4mu和我們的響應變量之間y減少SSQ。

如果我們更換(說)C-a1-a2-a3最後一個參數(比如a4)兌現了約束,我們結束了一個新的線性方程組

mu = a0 + a1*x1 + a2*x2 + a3*x3 + (C-a1-a2-a3)*x4 
    = a0 + a1*(x1-x4) + a2*(x2-x4) + a3*(x3-x4) + C*x4 

的(注意,a4已經消失了...... !)

像這樣(未經)實現它在R.

  1. 原始數據幀:

    d <- data.frame(y=runif(20), 
           x1=runif(20), 
           x2=runif(20), 
           x3=runif(20), 
           x4=runif(20)) 
    
  2. 創建轉換後的版本,其中所有,但最後一列有最後一列「掃地出門」,例如x1 -> x1-x4; x2 -> x2-x4; ...

    dtrans <- data.frame(y=d$y, 
            sweep(d[,2:4], 
              1, 
              d[,5], 
              "-"), 
            x4=d$x4) 
    
  3. 重命名爲tx1tx2,...儘量避免混淆:

    names(dtrans)[2:4] <- paste("t",names(dtrans[2:4]),sep="") 
    
  4. 加總係數約束:

    constr <- 5 
    
  5. 現在安裝與模型偏移:

    lm(y~tx1+tx2+tx3,offset=constr*x4,data=dtrans) 
    

使這個更一般化並不難。

這需要比簡單地指定一個約束至罐裝優化方案多一點思考和操作。另一方面,(1)它可以很容易地包裝在一個方便的功能; (2)這是比調用通用的優化更有效,因爲這個問題仍然是線性的(實際上一個尺寸比你開始與一個小)。甚至可以用大數據完成(例如biglm)。 (實際上,它發生,我認爲如果這是一個線性模型,你甚至不需要偏移,雖然使用偏移意味着你不必計算a0=intercept-C*x4完成後。)

+0

我對你的第一句話有點困惑。你指的約束'x4'等於'5-x1-x2-x3';我正在考慮限制*係數*,而不是變量本身。我將如何設置約束'a4 = 5-a1-a2-a3'? – eykanal 2012-04-04 11:31:00

+0

抱歉,錯字(現在已修復) - 但其餘部分應該是正確的,我認爲 – 2012-04-04 12:22:59

+0

我認爲接下來的方程式可能還需要進行修正......不應該是'y = a0 + a1 *(x1 x4)+ a2 *(x2-x4)+ a3 *(x3-x4)+ C * x4是'y = a0 +(a1-a4)* x1 + ... +(a3-a4)* x3' ? – eykanal 2012-04-04 12:41:03

4

既然你說你是開放給其他的辦法,這也可以在二次規劃的角度來解決(QP):

最小化二次目標:誤差平方的總和,

受線性約束:你的權重之和必須爲5

假設X是n乘5矩陣,Y是長度(n)的矢量,這將解決您的最佳權重:

library(limSolve) 
lsei(A = X, 
    B = Y, 
    E = matrix(1, nrow = 1, ncol = 5), 
    F = 5)