En R, ¿"glmnet" se ajusta a una intersección?

10

Estoy ajustando un modelo lineal en R usando glmnet. El modelo original (no regularizado) se ajustó utilizando lmy no tenía un término constante (es decir, tenía la forma lm(y~0+x1+x2,data)).

glmnettoma una matriz de predictores y un vector de respuestas. He estado leyendo glmnetdocumentación y no encuentro mención del término constante.

Entonces, ¿hay alguna manera de pedir glmnetforzar el ajuste lineal a través del origen?

NPE
fuente

Respuestas:

12

Sí, se incluye una intersección en un modelo glmnet , pero no está regularizada (cf. Rutas de regularización para modelos lineales generalizados a través del descenso coordinado , p. 13). Ciertamente, se podrían obtener más detalles sobre la implementación observando cuidadosamente el código (para una familia gaussiana, es la elnet()función que se llama glmnet()), pero está en Fortran.

Puede probar el paquete penalizado , que permite eliminar la intercepción pasando unpenalized = ~0a 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 obtener la regularización de Lasso, puede intentar algo como

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

Como se puede ver en la siguiente figura, existen pequeñas diferencias entre los parámetros de regresión calculados con ambos métodos (izquierda), y puede trazar la solución de ruta de lazo muy fácilmente (derecha).

texto alternativo

chl
fuente