Eu quero fazer o seguinte:
1) regressão OLS (sem termo de penalização) para obter coeficientes beta ; j representa as variáveis usadas para regredir. Eu faço isso por
lm.model = lm(y~ 0 + x)
betas = coefficients(lm.model)
2) Na regressão do laço com um termo de penalização, os critérios de seleção serão os Critérios de Informação Bayesiana (BIC), dados por
onde representa o número da variável / regressor, T o número de observações e b ∗ j para os betas iniciais obtidos na etapa 1). Quero ter resultados de regressão para este específico λ j valor, que é diferente para cada regressor usado. Portanto, se houver três variáveis, haverá três valores diferentes λ j .
O problema de otimização OLS-Lasso é então dado por
Como posso fazer isso no R com o pacote lars ou glmnet? Não consigo encontrar uma maneira de especificar lambda e não tenho 100% de certeza se obtenho os resultados corretos se executar
lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")
Agradeço qualquer ajuda aqui.
Atualizar:
Eu usei o seguinte código agora:
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)
Na linha 1, uso validação cruzada com meu fator de penalidade especificado ( ), que é diferente para cada regressor. A linha 2 seleciona o "lambda.min" de fits.cv, que é o lambda que fornece um erro médio de validação cruzada mínimo. A linha 3 executa um ajuste de laço () nos dados. Novamente, usei o fator de penalidadeλ. A linha 4 extrai os coeficientes dos ajustes que pertencem ao "ideal"λescolhido na linha 2.alpha=1
Agora eu tenho os coeficientes beta para os regressores que representam a solução ideal do problema de minimização
com um fator de penalidade . O conjunto ótimo de coeficientes é provavelmente um subconjunto dos regressores que eu inicialmente usei; isso é uma consequência do método Lasso, que reduz o número de regressores usados.
Meu entendimento e o código estão corretos?
fonte
$\alpha$
torna-se . Faça isso, pois isso facilitará as pessoas a entender sua pergunta e, portanto, responder.Respostas:
A partir da
glmnet
documentação (?glmnet
), vemos que é possível realizar o encolhimento diferencial. Isso nos leva a pelo menos meio caminho para responder à pergunta do OP.Para responder completamente à pergunta, acho que existem duas abordagens disponíveis, dependendo do que você deseja realizar.
glmnet
penalty.factor
penalty.factor
glmnet
coef(model, s=1, exact=T)
glmnet
glmnet
coef(fits,s=something)
something
cv.glmnet
glmnet
penalty.factor
Este procedimento otimiza
penalty.factor
Essa é basicamente a motivação
glmnet
que eu entendo: usar a regressão penalizada para estimar um modelo de regressão que não seja excessivamente otimista sobre o desempenho fora da amostra. Se esse é seu objetivo, talvez este seja o método certo para você, afinal.fonte
pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
como extraio os betas regressores que correspondem ao lambda que eu especifiquei, pois o lambda é diferente para cada fator de risco?glmnet
. Veja minha resposta revisada.