2012-04-03 36 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)