R在回归中规范系数

时间:2011-12-03 16:42:13

标签: r regression

我正在尝试使用线性回归来确定3种模型的最佳权重,以预测结果。因此有3个变量(x1, x2, x3)是因变量y的预测。我的问题是,如何运行回归,其约束条件是系数之和总和为1.例如:

这很好:

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),x1是来自kNN模型的预测值,x2来自randomForest,x3来自a 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。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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))

答案 2 :(得分:0)

对于round(knnPred)round(gbmPred)中显示的五行,可以给出完美的预测,因此有一些问题是否需要多个预测变量。

无论如何,为了解决所述的给定问题,下面将给出总计为1的非负系数(除了可能由于计算机算术引起的微小差异)。 a是因变量,b是自变量矩阵。 cd定义了等式约束(coeffs sum为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)