R Есть ли способ установить порог в линейной регрессии?

Я пытаюсь сделать линейную регрессию, но я хочу использовать только переменные с положительными коэффициентами (я думаю, что это называется жестким порогом, но я не уверен).

Например:

> summary(lm1)

Call:
lm(formula = value ~ ., data = intCollect1[, -c(1, 3)])

Residuals:
     Min       1Q   Median       3Q      Max 
-15.6518  -0.2089  -0.0227   0.2035  15.2235 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)     0.099763   0.024360   4.095 4.22e-05 ***
modelNum3802    0.208867   0.008260  25.285  < 2e-16 ***
modelNum8000   -0.086258   0.013104  -6.582 4.65e-11 ***
modelNum8001   -0.058225   0.010741  -5.421 5.95e-08 ***
modelNum8002   -0.001813   0.012087  -0.150 0.880776    
modelNum8003   -0.083646   0.011015  -7.594 3.13e-14 ***
modelNum8004    0.002521   0.010729   0.235 0.814254    
modelNum8005    0.301286   0.011314  26.630  < 2e-16 ***

В приведенной выше регрессии я хотел бы использовать только модели 3802, 8004 и 8005. Есть ли способ сделать это без копирования и вставки имени каждой переменной?


person screechOwl    schedule 28.03.2012    source источник
comment
Вы можете проверить ?coef. Но если удалить переменные с отрицательным коэффициентом и пересчитать регрессию, знак оставшихся коэффициентов может измениться.   -  person Vincent Zoonekynd    schedule 29.03.2012


Ответы (3)


Вместо использования lm вы можете сформулировать свою проблему в терминах квадратичного программирования:

Минимизируйте сумму квадратов ошибок репликации при условии, что все ваши линейные коэффициенты положительны.

Такие проблемы можно решить с помощью lsei из пакета limSolve. Глядя на ваш пример, это будет выглядеть примерно так:

x.variables <- c("modelNum3802", "modelNum8000", ...)
num.var <- length(x.variables)

lsei(A = intCollect1[, x.variables],
     B = intCollect1$value,
     G = diag(num.var),
     H = rep(0, num.var))
person flodel    schedule 29.03.2012

Я нашел пакет nnls (неотрицательный метод наименьших квадратов), на который стоит обратить внимание.

person screechOwl    schedule 03.05.2013

Вы также можете переформулировать свою модель линейной регрессии следующим образом: label ~ sum(exp(\alpha_i) f_i)

целью оптимизации будет sum_j (label_j - sum_i(exp(\alpha_i) f_i))^2

Это не имеет решения в закрытой форме, но может быть решено эффективно, поскольку оно выпукло в \alpha_i.

Как только вы вычислите \alpha_i, вы можете преобразовать их в регрессоры обычной линейной модели, возведя их в степень.

person John Jiang    schedule 10.01.2014