В R «glmnet» соответствует перехвату?

10

Я подгоняю линейную модель в R, используя glmnet. Исходная (не регуляризованная) модель была подогнана с использованием lmи не имела постоянного члена (т.е. она была в форме lm(y~0+x1+x2,data)).

glmnetберет матрицу предикторов и вектор ответов. Я читал glmnetдокументацию и не могу найти упоминания о постоянном термине.

Итак, есть ли способ попросить glmnetфорсировать линейное соответствие через начало координат?

NPE
источник

Ответы:

12

Да, перехват включен в модель glmnet , но он не регуляризован (см. Пути регуляризации для обобщенных линейных моделей с помощью координатного спуска , стр. 13). Более подробную информацию о реализации, безусловно, можно получить, внимательно взглянув на код (для семейства гауссов это вызывается elnet()функцией glmnet()), но он написан на Фортране.

Вы можете попробовать штрафной пакет, который позволяет удалить перехват, перейдя unpenalized = ~0к penalized().

> x <- matrix(rnorm(100*20),100,20)
> y <- rnorm(100)
> fit1 <- penalized(y, penalized=x, unpenalized=~0, 
                    standardize=TRUE) 
> fit2 <- lm(y ~ 0+x)
> plot((coef(fit1) + coef(fit2))/2, coef(fit2)-coef(fit1))

Чтобы получить регуляризацию Лассо, вы можете попробовать что-то вроде

> fit1b <- penalized(y, penalized=x, unpenalized=~0, 
                     standardize=TRUE, lambda1=1, steps=20)
> show(fit1b)
> plotpath(fit1b)

Как видно из следующего рисунка, между регрессионными параметрами, вычисляемыми обоими методами (слева), есть небольшие различия, и вы можете очень легко построить решение пути Лассо (справа).

альтернативный текст

хл
источник