Em R, “glmnet” se encaixa em uma interceptação?

10

Estou ajustando um modelo linear em R usando glmnet. O modelo original (não regularizado) foi ajustado usando lme não tinha um termo constante (ou seja, estava na forma lm(y~0+x1+x2,data)).

glmnetleva uma matriz de preditores e um vetor de respostas. Eu tenho lido a glmnetdocumentação e não encontro menção ao termo constante.

Então, existe uma maneira de pedir glmnetpara forçar o ajuste linear através da origem?

NPE
fonte

Respostas:

12

Sim, uma interceptação é incluída em um modelo glmnet , mas não é regularizada ( consulte Caminhos de regularização para modelos lineares generalizados via descida de coordenadas , p. 13). Certamente mais detalhes sobre a implementação poderiam ser obtidos com uma análise cuidadosa do código (para uma família gaussiana, é a elnet()função que é chamada por glmnet()), mas está no Fortran.

Você pode tentar o pacote penalizado , que permite remover a interceptação passandounpenalized = ~0 para 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))

Para obter a regularização do Lasso, tente algo como

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

Como pode ser visto na figura a seguir, existem poucas diferenças entre os parâmetros de regressão calculados com os dois métodos (esquerda), e você pode plotar a solução do caminho de Lasso com muita facilidade (direita).

texto alternativo

chl
fonte