8.8 Métodos de regularización
[[Pasar a selección de variables explicativas?]]
Estos métodos emplean también un modelo lineal: \[Y=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{p}X_{p}+\varepsilon\]
En lugar de ajustarlo por mínimos cuadrados (estándar), minimizando: \[ RSS = \sum\limits_{i=1}^{n}\left( y_{i} - \beta_0 - \beta_1 x_{1i} - \cdots - \beta_p x_{pi} \right)^{2}\]
Se imponen restricciones adicionales a los parámetros que los “retraen” (shrink) hacia cero:
Produce una reducción en la varianza de predicción (a costa del sesgo).
En principio se consideran todas las variables explicativas.
Ridge regression
- Penalización cuadrática: \(RSS+\lambda\sum_{j=1}^{p}\beta_{j}^{2}\).
Lasso
Penalización en valor absoluto: \(RSS+\lambda\sum_{j=1}^{p}|\beta_{j}|\).
Normalmente asigna peso nulo a algunas variables (selección de variables).
El parámetro de penalización se selecciona por validación cruzada.
- Normalmente estandarizan las variables explicativas (coeficientes en la misma escala).
8.8.1 Datos
El fichero hatco.RData contiene observaciones de clientes de la compañía de distribución industrial (Compañía Hair, Anderson y Tatham). Las variables se pueden clasificar en tres grupos:
load('datos/hatco.RData')
as.data.frame(attr(hatco, "variable.labels"))
## attr(hatco, "variable.labels")
## empresa Empresa
## tamano Tamaño de la empresa
## adquisic Estructura de adquisición
## tindustr Tipo de industria
## tsitcomp Tipo de situación de compra
## velocida Velocidad de entrega
## precio Nivel de precios
## flexprec Flexibilidad de precios
## imgfabri Imagen del fabricante
## servconj Servicio conjunto
## imgfvent Imagen de fuerza de ventas
## calidadp Calidad de producto
## fidelida Porcentaje de compra a HATCO
## satisfac Satisfacción global
## nfidelid Nivel de compra a HATCO
## nsatisfa Nivel de satisfacción
Consideraremos como respuesta la variable fidelida y como variables explicativas el resto de variables continuas menos satisfac.
library(glmnet)
El paquete glmnet
no emplea formulación de modelos, hay que establecer la respuesta
y
y las variables explicativas x
(se puede emplear la función model.matrix()
para construir x
,
la matriz de diseño, a partir de una fórmula).
En este caso, eliminamos también la última fila por tener datos faltantes:
<- as.matrix(hatco[-100, 6:12])
x <- hatco$fidelida[-100] y
8.8.2 Ridge Regression
Ajustamos un modelo de regresión ridge con la función glmnet
con alpha=0
(ridge penalty).
<- glmnet(x, y, alpha = 0)
fit.ridge plot(fit.ridge, xvar = "lambda", label = TRUE)
Para seleccionar el parámetro de penalización por validación cruzada se puede emplear
la función cv.glmnet
.
<- cv.glmnet(x, y, alpha = 0)
cv.ridge plot(cv.ridge)
En este caso el parámetro sería:
$lambda.1se cv.ridge
## [1] 3.989587
y el modelo resultante contiene todas las variables explicativas:
coef(cv.ridge)
## 8 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) 6.25898621
## velocida 1.56785760
## precio 0.67897678
## flexprec 2.17894174
## imgfabri 0.32939271
## servconj 3.69427361
## imgfvent 1.05562044
## calidadp 0.04709431
8.8.3 Lasso
Ajustamos un modelo lasso también con la función glmnet
(con la opción por defecto alpha=1
, lasso penalty).
<- glmnet(x,y)
fit.lasso plot(fit.lasso, xvar = "lambda", label = TRUE)
Seleccionamos el parámetro de penalización por validación cruzada.
<- cv.glmnet(x,y)
cv.lasso plot(cv.lasso)
En este caso el modelo resultante solo contiene 4 variables explicativas:
coef(cv.lasso)
## 8 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) 9.4071399
## velocida 0.1139557
## precio .
## flexprec 2.4071248
## imgfabri .
## servconj 5.9709828
## imgfvent .
## calidadp .