R - Лассо регрессия - разные лямбда на регрессор


11

Я хочу сделать следующее:

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

lm.model = lm(y~ 0 + x)
betas    = coefficients(lm.model)

2) регрессия Лассо с условием штрафования, критериями выбора должны быть Байесовские критерии информации (BIC), определяемые

λj=log(T)T|bj|

где обозначает номер переменной / регрессора, - количество наблюдений и - начальные бета-версии, полученные на шаге 1). Я хочу получить результаты регрессии для этого конкретного значения , которое отличается для каждого используемого регрессора. Следовательно, если есть три переменные, будет три разных значения .jTbjλjλj

Задача оптимизации OLS-Лассо тогда задается

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

Как я могу сделать это в R с пакетом lars или glmnet? Я не могу найти способ указать лямбда, и я не уверен на 100%, если я получу правильные результаты, если я бегу

lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")

Я ценю любую помощь здесь.


Обновить:

Я использовал следующий код сейчас:

fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin    = as.numeric(fits.cv[9]) #lambda.min
fits    = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef    = coef(fits, s = lmin)

В строке 1 я использую перекрестную проверку с указанным штрафным коэффициентом ( ), который отличается для каждого регрессора , В строке 2 выбирается «lambda.min» файла fits.cv, который является лямбда-значением, дающим минимальную среднюю ошибку перекрестной проверки. Строка 3 выполняет лассо ( ) для данных. Я снова использовал штрафной коэффициент . В строке 4 извлекаются коэффициенты из подгонок, которые принадлежат «оптимальному» выбранному в строке 2.λλλj=log(T)T|bj|alpha=1λλ

Теперь у меня есть бета-коэффициенты для регрессоров, которые изображают оптимальное решение задачи минимизации

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

с штрафным коэффициентом . Оптимальный набор коэффициентов, скорее всего, является подмножеством регрессоров, которые я первоначально использовал, это является следствием метода Лассо, который сокращает количество используемых регрессоров.λj=log(T)T|bj|

Мое понимание и код верны?


2
Вы можете использовать разметку LATEX в своем посте, заключенную в знаки доллара. $\alpha$становится . Пожалуйста, сделайте это, так как это облегчит людям понимание вашего вопроса и, следовательно, ответит на него. α
Sycorax сообщает восстановить Monica

Ответы:


15

Из glmnetдокументации ( ?glmnet) мы видим, что можно выполнить дифференциальную усадку. Это дает нам хотя бы частичную возможность ответить на вопрос ОП.

penalty.factor: К каждому коэффициенту могут применяться отдельные штрафные коэффициенты. Это число, которое умножается lambdaдля обеспечения дифференциальной усадки. Может быть 0 для некоторых переменных, что означает отсутствие усадки, и эта переменная всегда включена в модель. По умолчанию 1 для всех переменных (и неявно бесконечность для переменных, перечисленных в exclude). Примечание: штрафные коэффициенты внутренне пересчитываются для суммирования nvars, и lambdaпоследовательность будет отражать это изменение.

Чтобы полностью ответить на этот вопрос, я думаю, что вам доступны два подхода, в зависимости от того, чего вы хотите достичь.

  1. Ваш вопрос заключается в том, как применить дифференциальное сжатие glmnetи извлечь коэффициенты для определенного значения . Если некоторые значения не равны 1, достигается дифференциальная усадка при любом значении . Чтобы добиться усадки st, усадка для каждого равна , нам просто нужно выполнить некоторую алгебру. Пусть будет штрафным коэффициентом для , для чего будет предоставлено . Из документации видно, что эти значения масштабируются с коэффициентом st . Это означает, чтоλpenalty.factorλbjϕjbjCϕj=ϕj m=C m j = 1 logTϕj=logTT|bj|ϕjbjpenalty.factorCϕj=ϕjϕj ϕjCϕj λ=1m=Cj=1mlogTT|bj|ϕjзаменяет в приведенном ниже выражении оптимизации. Так что решите для , значения для , а затем извлеките коэффициенты для . Я бы порекомендовал использовать .ϕjCϕjglmnetλ=1coef(model, s=1, exact=T)

  2. Второй - это «стандартный» способ использования glmnet: каждый выполняет повторную перекрестную проверку в раз, чтобы выбрать , чтобы вы минимизировали MSE вне выборки. Это то, что я опишу ниже более подробно. Причина, по которой мы используем CV и проверяем MSE вне выборки, заключается в том, что MSE в выборке всегда будет минимизировано для , т. Е. является обычным MLE. Использование CV при изменении позволяет нам оценить, как модель работает с данными вне выборки , и выбрать который является оптимальным (в определенном смысле).λ λ = 0 b λ λkλλ=0bλλ

Этот glmnetвызов не определяет (и не должен, потому что по соображениям производительности он вычисляет всю траекторию по умолчанию). будет возвращать коэффициенты для значения . Но независимо от выбора вы предоставите, результат будет отражать дифференциальное наказание, которое вы применили в вызове, чтобы соответствовать модели.λ λ λλλcoef(fits,s=something)λsomethingλ

Стандартный способ выбора оптимального значения - использовать вместо . Перекрестная проверка используется для выбора величины сжатия, которая сводит к минимуму ошибку вне выборки, в то время как спецификация сокращает некоторые функции больше, чем другие, в соответствии с вашей схемой взвешивания.λcv.glmnetglmnetpenalty.factor

Эта процедура оптимизирует

minbRmt=1T(ytbXt)2+λj=1m(ϕj|bj|)

где - штрафной коэффициент для функции (что вы указали в аргументе). (Это немного отличается от вашего выражения оптимизации; обратите внимание, что некоторые из индексов отличаются.) Обратите внимание, что термин одинаков для всех функций, поэтому единственный способ сокращения некоторых функций по сравнению с другими - через . Важно отметить, что и - это не одно и то же; скалярная и вектор! В этом выражении является фиксированным / предполагаемым известным; то есть оптимизация выберет оптимальный , а не оптимальныйj t h λ ϕ j λ ϕ λ ϕ λ b λϕjjthpenalty.factorλϕjλϕλϕλbλ,

Это в основном мотивация, glmnetнасколько я понимаю: использовать штрафованную регрессию для оценки регрессионной модели, которая не слишком оптимистична в отношении производительности вне выборки. Если это ваша цель, возможно, в конце концов это правильный метод для вас.


+1 Это правильно. Я также добавлю, что регуляризация регрессии может рассматриваться как байесовский априор, т. Е. Максимальный апостериорный (MAP) является регуляризованным максимальным правдоподобием (ML). Работа в таких рамках дает больше гибкости в регуляризации, если это необходимо.
TLJ

Если я запускаю, pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty) как мне тогда извлечь бета-регрессоры, которые соответствуют лямбде, который я указал, так как лямбда различна для каждого фактора риска?
Дом

1
@Dom Меня слишком поздно осенило, что есть очевидный способ получить именно то, что вы хотите, используя glmnet. Смотрите мой исправленный ответ.
Sycorax сообщает восстановить Monica

2
Остерегайтесь настраивать штраф отдельно для каждого предиктора. В некоторых случаях это будет не более чем пошаговое выделение переменных. Наказанная регрессия уменьшает среднеквадратичную ошибку, принимая очень ограниченное количество параметров штрафа и заимствуя информацию среди предикторов.
Фрэнк Харрелл

2
@FrankHarrell Спасибо за комментарий! Кажется, что использование разных штрафов для каждого предиктора равносильно байесовской модели, которая предполагает различный априор для каждого параметра. Меня это не удивляет, поскольку я представляю уникальную опасность для байесовского вывода в целом. Кроме того, не могли бы вы рассказать о том, как наказываемая регрессия заимствует информацию среди предикторов? Я не уверен, что полностью понимаю, как это происходит в таком сценарии.
Sycorax говорит восстановить Monica
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.