Algoritmos para selección de variables en lm

Introducción

Para la selección de variables en la regresión lienal múltiple, existen métodos (algoritmos) que facilitan este proceso. Sin embargo, está selección no es definitiva y siempre se deberá utilizar el criterio personal y sobre todo la experiencia del investigador para identificar y validar los modelos. En este archivo en particular se revisarán los stepwise methods

La ejecución de un modelo de regresión con muchas variables, incluidas las irrelevantes, conducirá a un modelo innecesariamente complejo y erroneo. Evite dolores de cabeza. Cuando se añaden variables que no aportan información al modelo, este se vuelve complejo, se generá ruido y se hace “imposible” interpretar los resultados. Un problema más común al incluir muchas variables, especialmente si están correlacionadas (multicolinealidad), es que los coeficientes pueden volverse inestables y tener grandes varianzas. Esto puede hacer que las estimaciones de \(\beta\) sean imprecisas y difíciles de interpretar.

Recuerde que para fines prácticos el modelo con la menor cantidad de variables y que más explique será el mejor. En general, los modelos más simples que explican adecuadamente los datos tienden a ser preferidos, siempre y cuando no comprometan el poder predictivo.

Además realizar la selección de variables utilizando pureba y error en un modelo con muchas variables, puede llegar a ser laborioso. Imagine la cantidad de combinaciones posibles para un modelo en el que se prueben 10-20 variables.

La regresión escalonada (Stepwised regressions) es una forma de seleccionar variables importantes para obtener un modelo simple y fácilmente interpretable. Existe tres principales tipos de regresión escalonada

  1. Forward stepwise (hacia adelante)
  2. Backward stepwise (hacia atrás)
  3. Stepwise (en abmas direcciones)

Forward stepwise

Inicia con un modelo sin variables (solo el intercepto) y en cada paso hacia adelante agrega una variable explicativa significativa. La selección progresiva hacia adelante (o selección hacia adelante) es un método de selección de variables que:

  • Comienza con un modelo que no contiene variables (llamado modelo nulo, en el que solo se agrega el intercepto)
  • Luego comienza a agregar las variables más significativas una tras otra hasta que se alcance una regla de detención preespecificada o hasta que todas las variables consideradas se incluyan en el modelo.

De forma general estos son los pasos del algoritmo:

1.Comienzo con un modelo vacío: El modelo inicial no incluye ninguna variable predictora (solo el intercepto). 2. Evaluación de todas las variables: En cada paso, se evalúan todas las variables candidatas que aún no están en el modelo. Para cada variable, se estima el modelo con esa variable incluida. 3. Criterio de inclusión: Se selecciona la variable que más mejora el ajuste del modelo según algún criterio estadístico, como el AIC (Criterio de Información de Akaike), BIC (Criterio de Información Bayesiano) o el p-valor asociado a la significancia estadística del coeficiente de la variable. 4. Añadir la variable al modelo: La variable seleccionada se añade al modelo. Luego, se vuelve a evaluar el siguiente conjunto de variables que aún no están incluidas. 5. Repetir el proceso: Este proceso continúa hasta que no haya más variables que mejoren significativamente el modelo (según el criterio establecido) o hasta que se alcance un número predeterminado de variables.

Para estaz clase de regresión escalonada, el criterio de detención es el AIC.Los valores p son malos, recuerdelo.

Forward stepwise

Imagen tomada de:

Reglas para la selección de variables

En nuestro caso la regla para detención es el Akaike Information Criterion (AIC).

El AIC es un método matemático para evaluar qué tan bien se ajusta un modelo a los datos a partir de los cuales se generó. En otras palabras el AIC, se utiliza para comparar diferentes modelos posibles y determinar cuál se ajusta mejor a los datos. No tiene sentido fuera de la regresión. AIC se calcula a partir de:

  • El número de variables independientes utilizadas para construir el modelo.
  • La estimación de máxima verosimilitud del modelo (qué tan bien el modelo reproduce los datos).

El modelo de mejor ajuste según AIC es el que explica la mayor cantidad de variación utilizando la menor cantidad posible de variables independientes.

Otra forma de realizar está selección es basándose en criterios pre establecidos como el valor de \(p\) y el valor de \(R^2\). Por ejemplo, para seleccionar que variables incluir en el modelo, se toma en cuenta lo siguiente:

  • La variable que tiene el valor p más pequeño
  • La variable que proporciona el mayor aumento en \(R^2\)
  • La variable que proporciona la mayor caída en el modelo RSS (suma de cuadrados de residuos) en comparación con otros predictores en consideración.

También puede establecerse una regla de decisión en especifico.

Recuerde que aquí utilizaremos el AIC

Backward stepwise

La selección por pasos hacia atrás (o eliminación hacia atrás) es un método de selección de variables que:

  • Comienza con un modelo que contiene todas las variables consideradas (llamado modelo completo)
  • Luego comienza a eliminar las variables menos significativas una tras otra.
  • Hasta que se alcance una regla de detención preespecificada o hasta que no quede ninguna variable en el modelo

Backward stepwise

Stepwise

  • Inicia con modelo sin variables y agrega una variable explicacativa significativa
  • Es una combinación de la regresión forward y bcakward. Si en un paso encuentra un modelo sin una variable significativa la quita y repite el paso.

¿Cómo hacerlo en R?

Para poder realizar una regresión escalonada se necesita crear un modelo vacío y un modelo con todas la variables. Esto nos servirá para indicar a R de donde a donde comenzará a probrar modelos.

Para el siguiente ejemplo, utilizaremos la base se datos LungCapData, con estos datos construiremos un modelo para predecir que variables afectan la capacidad pulmonar.

Preparando los modelos

  1. Importar y adjuntar la base de datos
library(readxl)
LungCapData <- read_excel("Bases/LungCapData.xls")
attach(LungCapData)
  1. Crear un modelo vacío.
modelo.vacio <- lm(LungCap~1)# con 1 indicamos que no tiene variables predictoras
summary(modelo.vacio)

Call:
lm(formula = LungCap ~ 1)

Residuals:
    Min      1Q  Median      3Q     Max 
-7.3561 -1.7131  0.1369  1.9369  6.8119 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.86315    0.09886   79.53   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.662 on 724 degrees of freedom
  1. Crear un modelo con todas las variables
modelo.completo <- lm(LungCap~., data = LungCapData)# el punto indica que todas 
#la variables serán tomadas en cuenta. Es necesario incluir el nombre de la base
summary(modelo.completo)

Call:
lm(formula = LungCap ~ ., data = LungCapData)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3388 -0.7200  0.0444  0.7093  3.0172 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -11.32249    0.47097 -24.041  < 2e-16 ***
Age            0.16053    0.01801   8.915  < 2e-16 ***
Height         0.26411    0.01006  26.248  < 2e-16 ***
Smokeyes      -0.60956    0.12598  -4.839 1.60e-06 ***
Gendermale     0.38701    0.07966   4.858 1.45e-06 ***
Caesareanyes  -0.21422    0.09074  -2.361   0.0185 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared:  0.8542,    Adjusted R-squared:  0.8532 
F-statistic: 842.8 on 5 and 719 DF,  p-value: < 2.2e-16

Construyendo un modelo forward

Para este paso utilzaremos la función step

modelo.forward <- step(modelo.vacio, scope = list(lower=modelo.vacio,
                                                  upper=modelo.completo),
                       direction = "forward")
Start:  AIC=1420.67
LungCap ~ 1

            Df Sum of Sq    RSS     AIC
+ Height     1    4269.0  861.5  129.05
+ Age        1    3447.0 1683.5  614.77
+ Gender     1     148.0 4982.5 1401.45
+ Smoke      1      52.7 5077.7 1415.18
<none>                   5130.5 1420.67
+ Caesarean  1       2.3 5128.1 1422.34

Step:  AIC=129.05
LungCap ~ Height

            Df Sum of Sq    RSS     AIC
+ Age        1    55.913 805.57  82.396
+ Smoke      1    18.847 842.63 115.010
+ Gender     1     8.716 852.76 123.675
+ Caesarean  1     5.874 855.61 126.087
<none>                   861.48 129.048

Step:  AIC=82.4
LungCap ~ Height + Age

            Df Sum of Sq    RSS    AIC
+ Smoke      1   27.6589 777.91 59.066
+ Gender     1   26.9647 778.60 59.713
+ Caesarean  1    6.2692 799.30 78.732
<none>                   805.57 82.396

Step:  AIC=59.07
LungCap ~ Height + Age + Smoke

            Df Sum of Sq    RSS    AIC
+ Gender     1   24.3327 753.57 38.026
+ Caesarean  1    5.5801 772.33 55.847
<none>                   777.91 59.066

Step:  AIC=38.03
LungCap ~ Height + Age + Smoke + Gender

            Df Sum of Sq    RSS    AIC
+ Caesarean  1    5.7968 747.78 34.427
<none>                   753.57 38.026

Step:  AIC=34.43
LungCap ~ Height + Age + Smoke + Gender + Caesarean
summary(modelo.forward)

Call:
lm(formula = LungCap ~ Height + Age + Smoke + Gender + Caesarean)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3388 -0.7200  0.0444  0.7093  3.0172 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -11.32249    0.47097 -24.041  < 2e-16 ***
Height         0.26411    0.01006  26.248  < 2e-16 ***
Age            0.16053    0.01801   8.915  < 2e-16 ***
Smokeyes      -0.60956    0.12598  -4.839 1.60e-06 ***
Gendermale     0.38701    0.07966   4.858 1.45e-06 ***
Caesareanyes  -0.21422    0.09074  -2.361   0.0185 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared:  0.8542,    Adjusted R-squared:  0.8532 
F-statistic: 842.8 on 5 and 719 DF,  p-value: < 2.2e-16
modelo.forward$anova
         Step Df   Deviance Resid. Df Resid. Dev        AIC
1             NA         NA       724  5130.4725 1420.66650
2    + Height -1 4268.99282       723   861.4796  129.04782
3       + Age -1   55.91333       722   805.5663   82.39604
4     + Smoke -1   27.65895       721   777.9074   59.06594
5    + Gender -1   24.33272       720   753.5746   38.02589
6 + Caesarean -1    5.79681       719   747.7778   34.42733

Construyendo un modelo backward

Para este paso utilzaremos la función step

modelo.backward <- step(modelo.completo, scope = list(lower=modelo.vacio,
                                                  upper=modelo.completo),
                       direction = "backward")
Start:  AIC=34.43
LungCap ~ Age + Height + Smoke + Gender + Caesarean

            Df Sum of Sq     RSS    AIC
<none>                    747.78  34.43
- Caesarean  1      5.80  753.57  38.03
- Smoke      1     24.35  772.13  55.66
- Gender     1     24.55  772.33  55.85
- Age        1     82.65  830.43 108.44
- Height     1    716.54 1464.32 519.66
summary(modelo.backward)

Call:
lm(formula = LungCap ~ Age + Height + Smoke + Gender + Caesarean, 
    data = LungCapData)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3388 -0.7200  0.0444  0.7093  3.0172 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -11.32249    0.47097 -24.041  < 2e-16 ***
Age            0.16053    0.01801   8.915  < 2e-16 ***
Height         0.26411    0.01006  26.248  < 2e-16 ***
Smokeyes      -0.60956    0.12598  -4.839 1.60e-06 ***
Gendermale     0.38701    0.07966   4.858 1.45e-06 ***
Caesareanyes  -0.21422    0.09074  -2.361   0.0185 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared:  0.8542,    Adjusted R-squared:  0.8532 
F-statistic: 842.8 on 5 and 719 DF,  p-value: < 2.2e-16
modelo.backward$anova
  Step Df Deviance Resid. Df Resid. Dev      AIC
1      NA       NA       719   747.7778 34.42733

Construyendo un modelo stepwise

Para este paso utilzaremos la variable step

modelo.stepwise <- step(modelo.vacio, scope = list(lower=modelo.vacio,
                                                  upper=modelo.completo),
                       direction = "both")
Start:  AIC=1420.67
LungCap ~ 1

            Df Sum of Sq    RSS     AIC
+ Height     1    4269.0  861.5  129.05
+ Age        1    3447.0 1683.5  614.77
+ Gender     1     148.0 4982.5 1401.45
+ Smoke      1      52.7 5077.7 1415.18
<none>                   5130.5 1420.67
+ Caesarean  1       2.3 5128.1 1422.34

Step:  AIC=129.05
LungCap ~ Height

            Df Sum of Sq    RSS     AIC
+ Age        1      55.9  805.6   82.40
+ Smoke      1      18.8  842.6  115.01
+ Gender     1       8.7  852.8  123.68
+ Caesarean  1       5.9  855.6  126.09
<none>                    861.5  129.05
- Height     1    4269.0 5130.5 1420.67

Step:  AIC=82.4
LungCap ~ Height + Age

            Df Sum of Sq     RSS    AIC
+ Smoke      1     27.66  777.91  59.07
+ Gender     1     26.96  778.60  59.71
+ Caesarean  1      6.27  799.30  78.73
<none>                    805.57  82.40
- Age        1     55.91  861.48 129.05
- Height     1    877.91 1683.48 614.77

Step:  AIC=59.07
LungCap ~ Height + Age + Smoke

            Df Sum of Sq     RSS    AIC
+ Gender     1     24.33  753.57  38.03
+ Caesarean  1      5.58  772.33  55.85
<none>                    777.91  59.07
- Smoke      1     27.66  805.57  82.40
- Age        1     64.73  842.63 115.01
- Height     1    877.91 1655.82 604.76

Step:  AIC=38.03
LungCap ~ Height + Age + Smoke + Gender

            Df Sum of Sq     RSS    AIC
+ Caesarean  1      5.80  747.78  34.43
<none>                    753.57  38.03
- Gender     1     24.33  777.91  59.07
- Smoke      1     25.03  778.60  59.71
- Age        1     82.24  835.82 111.12
- Height     1    714.22 1467.79 519.37

Step:  AIC=34.43
LungCap ~ Height + Age + Smoke + Gender + Caesarean

            Df Sum of Sq     RSS    AIC
<none>                    747.78  34.43
- Caesarean  1      5.80  753.57  38.03
- Smoke      1     24.35  772.13  55.66
- Gender     1     24.55  772.33  55.85
- Age        1     82.65  830.43 108.44
- Height     1    716.54 1464.32 519.66
summary(modelo.stepwise)

Call:
lm(formula = LungCap ~ Height + Age + Smoke + Gender + Caesarean)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3388 -0.7200  0.0444  0.7093  3.0172 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -11.32249    0.47097 -24.041  < 2e-16 ***
Height         0.26411    0.01006  26.248  < 2e-16 ***
Age            0.16053    0.01801   8.915  < 2e-16 ***
Smokeyes      -0.60956    0.12598  -4.839 1.60e-06 ***
Gendermale     0.38701    0.07966   4.858 1.45e-06 ***
Caesareanyes  -0.21422    0.09074  -2.361   0.0185 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared:  0.8542,    Adjusted R-squared:  0.8532 
F-statistic: 842.8 on 5 and 719 DF,  p-value: < 2.2e-16

Criterio de información de Akaike (AIC)

El criterio de información de Akaike (AIC) permite juzgar la bondad del ajuste del modelo de regresión teniendo en cuenta la posibilidad de sobreajustar los datos. El AIC es una herramienta de selección de modelos que logra un equilibrio entre la bondad de ajuste, es decir, qué tan bien se ajusta un modelo a un conjunto de datos.

La puntuación AIC por sí sola no es significativa a menos que se compare con la puntuación AIC de otros modelos de regresión.

Al comparar modelos de la competencia, se prefiere una puntuación AIC más baja a una puntuación más alta. Una puntuación más baja indica que el modelo tiene una capacidad superior para equilibrar la bondad del ajuste con el riesgo de sobreajustar el conjunto de datos.

Otras funciones

library(MASS)
# Modelo completo
full.model <- lm(LungCap ~., data = LungCapData)
# Stepwise method
step.model <- stepAIC(full.model, direction = "both", 
                      trace = FALSE)
summary(step.model)

Call:
lm(formula = LungCap ~ Age + Height + Smoke + Gender + Caesarean, 
    data = LungCapData)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3388 -0.7200  0.0444  0.7093  3.0172 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -11.32249    0.47097 -24.041  < 2e-16 ***
Age            0.16053    0.01801   8.915  < 2e-16 ***
Height         0.26411    0.01006  26.248  < 2e-16 ***
Smokeyes      -0.60956    0.12598  -4.839 1.60e-06 ***
Gendermale     0.38701    0.07966   4.858 1.45e-06 ***
Caesareanyes  -0.21422    0.09074  -2.361   0.0185 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.02 on 719 degrees of freedom
Multiple R-squared:  0.8542,    Adjusted R-squared:  0.8532 
F-statistic: 842.8 on 5 and 719 DF,  p-value: < 2.2e-16
library(leaps)
models <- regsubsets(LungCap~., data = LungCapData, nvmax = 5, # nvmax es el número de variables
                     method = "seqrep")
summary(models)
Subset selection object
Call: regsubsets.formula(LungCap ~ ., data = LungCapData, nvmax = 5, 
    method = "seqrep")
5 Variables  (and intercept)
             Forced in Forced out
Age              FALSE      FALSE
Height           FALSE      FALSE
Smokeyes         FALSE      FALSE
Gendermale       FALSE      FALSE
Caesareanyes     FALSE      FALSE
1 subsets of each size up to 5
Selection Algorithm: 'sequential replacement'
         Age Height Smokeyes Gendermale Caesareanyes
1  ( 1 ) " " "*"    " "      " "        " "         
2  ( 1 ) "*" "*"    " "      " "        " "         
3  ( 1 ) "*" "*"    "*"      " "        " "         
4  ( 1 ) "*" "*"    "*"      "*"        " "         
5  ( 1 ) "*" "*"    "*"      "*"        "*"         

Ejercicio de practica.

  1. Construya un modelo para predecir la circunferencia de cintura (abdomen) utilizando la base de datos bodyfat, primero forward, luego backward y finalmente stepwise. Compare sus resutlados
  2. Utilizando la base de datos