R Удалить перехватчики в логистической регрессии

Я использую библиотеку rms для выполнения регуляризованной логистической регрессии и хочу принудительно установить перехват до нуля. Я использую следующее для моделирования и регрессии:

library(rms)
N = 100
pred <- vapply(1:12, function(i) rnorm(N, mean = 0, sd =1), numeric(N))
resp <- 20*pred[, 1] - 3*pred[, 7] - 2*pred[, 8] + matrix(rnorm(N, sd = 0.1)) + 20
pr <- 1 / (1 + exp(-resp))
y <- rbinom(N, 1, pr)
lrm(y ~ pred, penalty = 1)

Сообщение на Как удалить перехват в R предлагает включить «0 +» или '- 1' в формуле модели. Однако для lrm это не работает.


person TreeStump    schedule 23.04.2015    source источник
comment
вам нужно использовать rms библиотеку?   -  person Randy Lai    schedule 23.04.2015
comment
Неа. Я знаю три возможных библиотеки: glmnet, LiblinearC и rms; если вы знаете о других, я бы не прочь узнать о них. Я обнаружил, что LiblinearC работает дольше и дает более странные результаты, чем rms; Сейчас тестирую glmnet.   -  person TreeStump    schedule 24.04.2015
comment
Я думаю, что сейчас glmnet - это настоящее искусство.   -  person Randy Lai    schedule 24.04.2015
comment
Хорошо спасибо. Вы знаете, реализовал ли кто-нибудь алгоритм IRLS-LARS?   -  person TreeStump    schedule 24.04.2015
comment
glmnet использует итеративную систему координат, что также довольно быстро.   -  person Randy Lai    schedule 24.04.2015


Ответы (1)


Вы можете использовать glmnet. Он также включает функцию перекрестной проверки для выбора параметра поворота.

library(glmnet)
N = 1000
pred <- vapply(1:12, function(i) rnorm(N, mean = 0, sd =1), numeric(N))
resp <- 20*pred[, 1] - 3*pred[, 7] - 2*pred[, 8] + matrix(rnorm(N, sd = 0.1)) + 20
pr <- 1 / (1 + exp(-resp))
y <- rbinom(N, 1, pr)
result <- cv.glmnet(pred, y, family="binomial", intercept=FALSE)
# best lambda based on cv
result$lambda.min
# coefficient
coef(result$glmnet.fit, s=result$lambda.min)
person Randy Lai    schedule 24.04.2015