R упорядочить коэффициенты в регрессии - PullRequest
2 голосов
/ 03 декабря 2011

Я пытаюсь использовать линейную регрессию, чтобы выяснить наилучшее взвешивание для 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 - из модели gbm.Я пытаюсь получить наилучшие весовые коэффициенты для каждой модели, поэтому каждый коэффициент равен <= 1, а сумма коэффициентов == 1. Будет выглядеть примерно так: </p>

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, при этом убедившись, что они составляют 1.

Ответы [ 3 ]

5 голосов
/ 03 декабря 2011

Скорее всего, есть лучший способ, которым кто-то другой поделится, но вы ищете два параметра, так что

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)
2 голосов
/ 03 декабря 2011

Нет данных для тестирования:

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 голосов
/ 27 сентября 2015

Для пяти показанных строк либо round(knnPred), либо round(gbmPred) дают точные прогнозы, поэтому возникает вопрос, нужно ли более одного предиктора.

Во всяком случае, для решения данного вопроса, как указано ниже, будут получены неотрицательные коэффициенты, равные 1 (за исключением, возможно, крошечных различий из-за компьютерной арифметики). a является зависимой переменной, а b является матрицей независимых переменных. c и d определяют ограничение равенства (сумма коэффициентов равна 1), а e и f определяют ограничения неравенства (коэффициенты неотрицательны).

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...