我正在尝试使用线性回归来确定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。
答案 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
是自变量矩阵。 c
和d
定义了等式约束(coeffs sum为1),e
和f
定义了不等式约束(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)