Я хочу сделать следующее:
1) регрессия OLS (без штрафных санкций) для получения бета-коэффициентов ; обозначает переменные, используемые для регрессии. Я делаю это
lm.model = lm(y~ 0 + x)
betas = coefficients(lm.model)
2) регрессия Лассо с условием штрафования, критериями выбора должны быть Байесовские критерии информации (BIC), определяемые
где обозначает номер переменной / регрессора, - количество наблюдений и - начальные бета-версии, полученные на шаге 1). Я хочу получить результаты регрессии для этого конкретного значения , которое отличается для каждого используемого регрессора. Следовательно, если есть три переменные, будет три разных значения .
Задача оптимизации OLS-Лассо тогда задается
Как я могу сделать это в 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.λλalpha=1
Теперь у меня есть бета-коэффициенты для регрессоров, которые изображают оптимальное решение задачи минимизации
с штрафным коэффициентом . Оптимальный набор коэффициентов, скорее всего, является подмножеством регрессоров, которые я первоначально использовал, это является следствием метода Лассо, который сокращает количество используемых регрессоров.
Мое понимание и код верны?
источник
$\alpha$
становится . Пожалуйста, сделайте это, так как это облегчит людям понимание вашего вопроса и, следовательно, ответит на него.Ответы:
Из
glmnet
документации (?glmnet
) мы видим, что можно выполнить дифференциальную усадку. Это дает нам хотя бы частичную возможность ответить на вопрос ОП.Чтобы полностью ответить на этот вопрос, я думаю, что вам доступны два подхода, в зависимости от того, чего вы хотите достичь.
Ваш вопрос заключается в том, как применить дифференциальное сжатиеλ λ bj ϕjbjCϕj=ϕ ′ j m=C∑ m j = 1 logTϕj=logTT|b∗j| ϕj bj Cϕj=ϕ′j ϕ ′ j ϕjCϕ ′ j λ=1m=C∑mj=1logTT|b∗j| ϕ′j заменяет в приведенном ниже выражении оптимизации. Так что решите для , значения для , а затем извлеките коэффициенты для . Я бы порекомендовал использовать .ϕj C ϕ′j λ=1
glmnet
и извлечь коэффициенты для определенного значения . Если некоторые значения не равны 1, достигается дифференциальная усадка при любом значении . Чтобы добиться усадки st, усадка для каждого равна , нам просто нужно выполнить некоторую алгебру. Пусть будет штрафным коэффициентом для , для чего будет предоставлено . Из документации видно, что эти значения масштабируются с коэффициентом st . Это означает, чтоpenalty.factor
penalty.factor
glmnet
coef(model, s=1, exact=T)
Второй - это «стандартный» способ использованияk λ λ=0 b λ λ
glmnet
: каждый выполняет повторную перекрестную проверку в раз, чтобы выбрать , чтобы вы минимизировали MSE вне выборки. Это то, что я опишу ниже более подробно. Причина, по которой мы используем CV и проверяем MSE вне выборки, заключается в том, что MSE в выборке всегда будет минимизировано для , т. Е. является обычным MLE. Использование CV при изменении позволяет нам оценить, как модель работает с данными вне выборки , и выбрать который является оптимальным (в определенном смысле).λ λ = 0 b λ λЭтотλ λ λ λ
glmnet
вызов не определяет (и не должен, потому что по соображениям производительности он вычисляет всю траекторию по умолчанию). будет возвращать коэффициенты для значения . Но независимо от выбора вы предоставите, результат будет отражать дифференциальное наказание, которое вы применили в вызове, чтобы соответствовать модели.λ λ λcoef(fits,s=something)
something
Стандартный способ выбора оптимального значения - использовать вместо . Перекрестная проверка используется для выбора величины сжатия, которая сводит к минимуму ошибку вне выборки, в то время как спецификация сокращает некоторые функции больше, чем другие, в соответствии с вашей схемой взвешивания.λ
cv.glmnet
glmnet
penalty.factor
Эта процедура оптимизирует
где - штрафной коэффициент для функции (что вы указали в аргументе). (Это немного отличается от вашего выражения оптимизации; обратите внимание, что некоторые из индексов отличаются.) Обратите внимание, что термин одинаков для всех функций, поэтому единственный способ сокращения некоторых функций по сравнению с другими - через . Важно отметить, что и - это не одно и то же; скалярная и вектор! В этом выражении является фиксированным / предполагаемым известным; то есть оптимизация выберет оптимальный , а не оптимальныйj t h λ ϕ j λ ϕ λ ϕ λ b λϕj jth λ ϕj λ ϕ λ ϕ λ b λ ,
penalty.factor
Это в основном мотивация,
glmnet
насколько я понимаю: использовать штрафованную регрессию для оценки регрессионной модели, которая не слишком оптимистична в отношении производительности вне выборки. Если это ваша цель, возможно, в конце концов это правильный метод для вас.источник
pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
как мне тогда извлечь бета-регрессоры, которые соответствуют лямбде, который я указал, так как лямбда различна для каждого фактора риска?glmnet
. Смотрите мой исправленный ответ.