Regresión probit y logit

Las regresiones probit y logit son modelos de regresión no lineales diseñados específicamente para variables dependientes binarias.

La regresión probit utiliza la función de distribución acumulativa normal estándar (fda).

\[\Phi(z) = P(Z \geq z) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{z} e^{-\frac{z^2}{2}}ds\] Donde:

\[z_i = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n\]

La regresión logit, asimismo denominada regresión logística, utiliza la fda logística. Es similar al modelo de regresión probit, excepto que la función de distribución acumulada está definida por la siguiente ecuación;

\[f(z) = \frac{1}{1+e^{-z}} = \frac{1}{1+\frac{1}{e^{z}}} = \frac{e^{z}}{1+e^{z}}\]

Con ambas funciones obtendremos resultados muy parecidos, la diferencia principal entre ambos modelos se encuentra por la definición de la función, la función Logit presenta colas mas planas en los extremos, por tanto, con probit tendremos una curva más próxima al eje en los extremos y esto implica que tendremos menor área de probabilidad en esa zona.

¿Criterios de información para la comparación de modelos?

Los criterios de información son una medida de la calidad relativa de un modelo. Proporcionan un medio para la selección del modelo.

El criterio de mayor uso es el de Akaike (AIC) el cual maneja un balance entre la bondad de ajuste del modelo y la complejidad del modelo. (MÉTRICA)

\[AIC = 2k - 2Ln(L)\]

Donde:
\(k\): es el número de parámetros del modelo \(L\): máximo valor de la función de verosimilitud del modelo

AIC no proporciona una prueba de un modelo en el sentido de probar una hipótesis nula, es decir AIC no puede decir nada acerca de la calidad del modelo en un sentido absoluto. Si todos los modelos candidatos encajan mal, AIC no dará ningún aviso de ello.

Ejemplo:

library(readxl)
datos = read_xlsx("Hipotecas.xlsx", sheet = "Hoja1") 
datos = as.data.frame(datos)
class(datos)
## [1] "data.frame"
str(datos)
## 'data.frame':    70 obs. of  4 variables:
##  $ Observaciones: num  1 2 3 4 5 6 7 8 9 10 ...
##  $ Rechazo      : num  1 0 0 0 0 0 0 0 1 0 ...
##  $ Ingreso      : num  19 26.5 37.2 32 36 ...
##  $ Familia      : num  9 6 1 2 3 3 3 2 7 2 ...
summary(datos)
##  Observaciones      Rechazo           Ingreso         Familia     
##  Min.   : 1.00   Min.   :0.00000   Min.   :16.00   Min.   :1.000  
##  1st Qu.:18.25   1st Qu.:0.00000   1st Qu.:30.25   1st Qu.:1.000  
##  Median :35.50   Median :0.00000   Median :34.00   Median :2.000  
##  Mean   :35.50   Mean   :0.08571   Mean   :32.86   Mean   :2.714  
##  3rd Qu.:52.75   3rd Qu.:0.00000   3rd Qu.:37.00   3rd Qu.:3.000  
##  Max.   :70.00   Max.   :1.00000   Max.   :44.00   Max.   :9.000
head(datos) 
##   Observaciones Rechazo Ingreso Familia
## 1             1       1    19.0       9
## 2             2       0    26.5       6
## 3             3       0    37.2       1
## 4             4       0    32.0       2
## 5             5       0    36.0       3
## 6             6       0    24.0       3

Rechazo: (En funcón de Ingreso y Familia)
- 1 Rechazo de de la hipoteca
- 0 Aprobación de la hipoteca
Ingreso: Monto de Ingreso por familia
Familia: Número de miembres de la familia dependiente del Ingreso

Estimados el modelo logit

#library(stats)
modelo_logit <- glm(Rechazo ~ Ingreso + Familia, data = datos, family = binomial(link = "logit"))
summary(modelo_logit)
## 
## Call:
## glm(formula = Rechazo ~ Ingreso + Familia, family = binomial(link = "logit"), 
##     data = datos)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -1.54169  -0.27933  -0.14331  -0.08002   2.15182  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept) -1.07856    2.75236  -0.392  0.69516   
## Ingreso     -0.15480    0.08552  -1.810  0.07029 . 
## Familia      0.86902    0.32113   2.706  0.00681 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 40.951  on 69  degrees of freedom
## Residual deviance: 22.584  on 67  degrees of freedom
## AIC: 28.584
## 
## Number of Fisher Scoring iterations: 7

A diferencia de los modelos lineales, estos coeficientes no tienen una interpretación directa. El signo es interpretativo en la probabilidad.

modelo_probit <- glm(Rechazo ~ Ingreso + Familia , data = datos, family = binomial(link = "probit"))
summary(modelo_probit)
## 
## Call:
## glm(formula = Rechazo ~ Ingreso + Familia, family = binomial(link = "probit"), 
##     data = datos)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -1.51508  -0.27138  -0.09716  -0.03483   2.06501  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept) -0.78169    1.50135  -0.521  0.60261   
## Ingreso     -0.08261    0.04664  -1.771  0.07653 . 
## Familia      0.49817    0.17389   2.865  0.00417 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 40.951  on 69  degrees of freedom
## Residual deviance: 21.907  on 67  degrees of freedom
## AIC: 27.907
## 
## Number of Fisher Scoring iterations: 8

Estimamos los criterios de información para cada modelo:

  • Modelo Logit
CIA_Logit = AIC(modelo_logit)
CIA_Logit
## [1] 28.58381
  • Modelo Probit
CIA_Probit = AIC(modelo_probit)
CIA_Probit
## [1] 27.90694

En función del criterio de información Akaike, el modelo que tiene un mejor ajuste es aquel cuyo criterio sea menor, en este caso el que mejor ajusta es el Probit.

Probamos los modelos con algunos valores con Logit

# Utilizando valores promedio de Ingreso y Familia 
# Considerando un Ingreso de 32.86
# mean(datos$Ingreso)
# Y número de familiares 2.71
# mean(datos$Familia)

log.odds <- predict(modelo_logit, data.frame(Ingreso = 32.86, Familia = 2.71))

ProbLogit =exp(log.odds)/(1+exp(log.odds))
ProbLogit
##          1 
## 0.02166393

Ahora con Probit

log.odds <- predict(modelo_probit, data.frame(Ingreso = 32.86, Familia = 2.71))
ProbProbit <- pnorm(log.odds)
ProbProbit
##          1 
## 0.01593117

¿Por qué no podemos usar un modelo lineal tradicional?

Matriz de Confusiones

Dado un nivel de probabiliad que yo asigne, la predicción debe asumir como resultado un 1 o un 0, en este caso sería de Rechazo o no Rechazo de la asignación del crédito.

Como institución se deben fijar los parámetros de riesgo para estimar las posibles pérdidas al otorgar un crédito.

  • Modelo Probit
predicciones <- ifelse(test = modelo_probit$fitted.values > 0.3, yes =1, no = 0)
matriz_confusion_prob <- table(modelo_probit$model$Rechazo, predicciones, dnn = c("observaciones", "predicciones"))
matriz_confusion_prob 
##              predicciones
## observaciones  0  1
##             0 61  3
##             1  3  3

¿Qué exactitud tiene nuestro modelo? (MÉTRICA)

\[Exactitud = \frac{VN + VP}{VN + VP + FP + FN}\]

(61 + 3) / (61 + 3 +3 +3)
## [1] 0.9142857

¿Qué precisión tiene nuestro modelo? (MÉTRICA)

\[Precisión = \frac{VP}{VP + FP}\]

3 / (3 + 3)
## [1] 0.5
  • Modelo Logit
predicciones <- ifelse(test = modelo_logit$fitted.values > 0.3, yes =1, no = 0)
matriz_confusion_logit <- table(modelo_logit$model$Rechazo, predicciones, dnn = c("observaciones", "predicciones"))
matriz_confusion_logit 
##              predicciones
## observaciones  0  1
##             0 62  2
##             1  3  3
precision_exactitud

precision_exactitud

Machine Learning

El machine Learning o aprendizaje automático consiste básicamente en automatizar, mediante distintos algoritmos, la identificación de patrones o tendencias que se “esconden” en los datos. Por ello, resulta muy importante no sólo la elección del algoritmo más adecuado (y su posterior parametrización para cada problemática concreta), sino también el hecho de disponer de un gran volumen de datos de suficiente calidad.

El objetivo del machine learning es crear un modelo que nos permita resolver una tarea dada. Luego se entrena el modelo usando gran cantidad de datos. El modelo aprende de estos datos y es capaz de hacer predicciones. Según la tarea que se quiera realizar, será más adecuado trabajar con un algoritmo u otro.

Aprendizaje Supervisado

En el aprendizaje supervisado, los algoritmos trabajan con datos “etiquetados” (labeled data), intentado encontrar una función que, dadas las variables de entrada (input data), les asigne la etiqueta de salida adecuada. El algoritmo se entrena con un “histórico” de datos y así “aprende” a asignar la etiqueta de salida adecuada a un nuevo valor, es decir, predice el valor de salida.

Aprendizaje no Supervisado

El aprendizaje no supervisado tiene lugar cuando no se dispone de datos “etiquetados” para el entrenamiento. Sólo conocemos los datos de entrada, pero no existen datos de salida que correspondan a un determinado input. Por tanto, sólo podemos describir la estructura de los datos, para intentar encontrar algún tipo de organización que simplifique el análisis. Por ello, tienen un carácter exploratorio.

Forward stepwise selection

Forward stepwise selection es una alternativa, en la que no se evalúan todas las posibles combinaciones de predictores sino solo un subconjunto. El proceso se inicia generando un modelo nulo (M0) sin predictores. A continuación, se generan todos los posibles modelos que se pueden crear añadiendo un predictor al modelo nulo. De entre todos estos modelos con 1 predictor se selecciona el mejor basándose en el error de entrenamiento, al modelo elegido se denomina M1. Se repite el paso anterior, pero esta vez partiendo del último modelo seleccionado y así sucesivamente hasta llegar al modelo con todos los predictores. De entre los mejores modelos seleccionados para cada número de predictores (M0, M1, M2,...,Mk), se identifica el mejor, esta vez empleando una métrica de validación (validación cruzada, Cp, AIC, BIC o R2ajustado).

Backward stepwise selection

El concepto es equivalente al de forward stepwise selection pero, en este caso, iniciando el proceso a partir del modelo que contiene todos los posibles predictores (full model Mk). En cada iteración, se entrenan todos los modelos que se pueden crear eliminando un único predictor y se selecciona el que tiene menor error de entrenamiento tiene. El proceso se repite hasta llegar al modelo nulo sin predictores (M0). De entre los mejores modelos seleccionados para cada número de predictores (M0, M1, M2,...,Mk) se identifica el mejor, esta vez empleando una métrica de validación (validación cruzada, Cp, AIC, BIC o R2ajustado).

Hibrid (double) Stepwise Selection

Este método se inicia al igual que el forward pero, tras cada nueva incorporación, se realiza un test de extracción de predictores no útiles (como en el backward).

Ejemplo: Influencia de la inversión extranjera de China en AL

Utilizamos la base de información BaseIEDCH.xslx El objetivo de este ejemplo es que mediante un proceso de ML, obtener el mejor conjunto de variables que nos permitan modelar la variable independiente Y

• Gross Domestic Product at constant prices in dollars. (Y) • Foreign direct investment China. (IED_CH) • Price index. (X1) • Total employees in thousands. (X2) • Exports in dollars. (X3) • Imports in dollars. (X4) • Unemployment rate. (X5) • Control of corruption. (X6) • The government effectiveness indicator. (X7) • Regulatory quality indicator. (X8)

Information on China's investment in Latin America was obtained from the LAC-China network, the variables X1, X2, X3, X4 and X5 of the International Monetary Fund and the governance indicators, X6, X7 and X8 from the World Bank

Importamos las librerías que vamos a utilizar

library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#library(ggplot2)
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
library(gmodels)

Extraemos los datos

datos <- read_xlsx('BaseIEDCH.xlsx')
datos <- as.data.frame(datos)
head(datos)
##           Y    IED_CH        X1      X2       X3       X4     X5         X6
## 1 10875.796 1622.8200  92.52556 171.490 484.8200 2449.420  7.900  1.3362775
## 2 10623.054 1512.3110  96.67955 174.920 560.0100 2354.060  8.700  1.3421829
## 3 10179.506  645.7025  98.67380 157.805 584.8800 2698.970 14.200  1.3679554
## 4 10399.503 1408.7994 103.19878 160.185 926.9430 3410.884 15.900  1.3538066
## 5 10720.500 1033.5072 105.23527 165.255 828.6920 3657.500 14.000  1.3239427
## 6  9646.054  476.4046  84.33601 133.050 523.8228 1746.179  7.425 -0.3668478
##           X7         X8
## 1  1.1089906  1.0286251
## 2  1.1495850  1.0526873
## 3  1.0085013  0.8027678
## 4  0.9800856  0.5280252
## 5  0.9895768  0.3950239
## 6 -0.4533815 -0.4116923
summary(datos)
##        Y                 IED_CH               X1               X2         
##  Min.   :     8844   Min.   :   56.05   Min.   : 61.39   Min.   :  124.7  
##  1st Qu.:    54558   1st Qu.:  656.57   1st Qu.: 97.78   1st Qu.: 1608.1  
##  Median :   231118   Median : 1417.40   Median :107.66   Median : 3653.8  
##  Mean   : 27362810   Mean   : 6675.78   Mean   :113.42   Mean   : 9868.3  
##  3rd Qu.: 14947795   3rd Qu.: 5225.50   3rd Qu.:119.37   3rd Qu.: 6449.4  
##  Max.   :425060000   Max.   :73370.12   Max.   :772.02   Max.   :92216.3  
##        X3                 X4               X5               X6         
##  Min.   :   378.5   Min.   :  1449   Min.   : 2.771   Min.   :-1.3913  
##  1st Qu.:  1822.1   1st Qu.:  6983   1st Qu.: 4.900   1st Qu.:-0.7528  
##  Median :  5420.1   Median : 13828   Median : 7.113   Median :-0.3965  
##  Mean   : 43975.5   Mean   : 48049   Mean   : 7.280   Mean   :-0.3079  
##  3rd Qu.: 31018.5   3rd Qu.: 32897   3rd Qu.: 8.542   3rd Qu.:-0.2288  
##  Max.   :396911.7   Max.   :419976   Max.   :15.900   Max.   : 1.5822  
##        X7                X8         
##  Min.   :-1.2199   Min.   :-1.8849  
##  1st Qu.:-0.6435   1st Qu.:-0.5124  
##  Median :-0.3012   Median :-0.1723  
##  Mean   :-0.2011   Mean   :-0.1171  
##  3rd Qu.: 0.1874   3rd Qu.: 0.3525  
##  Max.   : 1.2755   Max.   : 1.5385

Antes de hacer un análisis, verificamos nuestra información y en su caso, la modificamos, esta actividad se conoce como Preprocess

  1. Estandarizamos variables

Dado que las variables X1, X6, X7, X8 son índices y la variable X5 están en porcentaje, se aplicaron logaritmos al resto de las variables para estandarizar sus medidas y hacerlas comparables.

# Creamos unas nuevas columnas en función de los valores de otras columnas 
Datos_CH = datos %>% mutate(X2LN = log(X2),
                  X3LN = log(X3),
                  X4LN = log(X4),
                  YLN = log(Y),
                  IEDCHLN = log(IED_CH))
head(Datos_CH)
##           Y    IED_CH        X1      X2       X3       X4     X5         X6
## 1 10875.796 1622.8200  92.52556 171.490 484.8200 2449.420  7.900  1.3362775
## 2 10623.054 1512.3110  96.67955 174.920 560.0100 2354.060  8.700  1.3421829
## 3 10179.506  645.7025  98.67380 157.805 584.8800 2698.970 14.200  1.3679554
## 4 10399.503 1408.7994 103.19878 160.185 926.9430 3410.884 15.900  1.3538066
## 5 10720.500 1033.5072 105.23527 165.255 828.6920 3657.500 14.000  1.3239427
## 6  9646.054  476.4046  84.33601 133.050 523.8228 1746.179  7.425 -0.3668478
##           X7         X8     X2LN     X3LN     X4LN      YLN  IEDCHLN
## 1  1.1089906  1.0286251 5.144525 6.183778 7.803607 9.294295 7.391921
## 2  1.1495850  1.0526873 5.164329 6.327955 7.763897 9.270782 7.321394
## 3  1.0085013  0.8027678 5.061360 6.371407 7.900625 9.228132 6.470339
## 4  0.9800856  0.5280252 5.076329 6.831892 8.134727 9.249513 7.250493
## 5  0.9895768  0.3950239 5.107490 6.719849 8.204535 9.279913 6.940713
## 6 -0.4533815 -0.4116923 4.890725 6.261153 7.465185 9.174304 6.166267
  1. Seleccionamos variables de interés

Nuestra base de datos creció en número de columnas, por tanto, solo seleccionamos las que sean de nuestro interés

datosIED3 <- Datos_CH %>% select(YLN, X1, X2LN, X3LN, X4LN, X5, X6, X7, X8, IEDCHLN)
head(datosIED3)
##        YLN        X1     X2LN     X3LN     X4LN     X5         X6         X7
## 1 9.294295  92.52556 5.144525 6.183778 7.803607  7.900  1.3362775  1.1089906
## 2 9.270782  96.67955 5.164329 6.327955 7.763897  8.700  1.3421829  1.1495850
## 3 9.228132  98.67380 5.061360 6.371407 7.900625 14.200  1.3679554  1.0085013
## 4 9.249513 103.19878 5.076329 6.831892 8.134727 15.900  1.3538066  0.9800856
## 5 9.279913 105.23527 5.107490 6.719849 8.204535 14.000  1.3239427  0.9895768
## 6 9.174304  84.33601 4.890725 6.261153 7.465185  7.425 -0.3668478 -0.4533815
##           X8  IEDCHLN
## 1  1.0286251 7.391921
## 2  1.0526873 7.321394
## 3  0.8027678 6.470339
## 4  0.5280252 7.250493
## 5  0.3950239 6.940713
## 6 -0.4116923 6.166267

Hacemos un análisis previo antes de aplicar métodos de análisis

summary(datosIED3)
##       YLN               X1              X2LN             X3LN       
##  Min.   : 9.087   Min.   : 61.39   Min.   : 4.826   Min.   : 5.936  
##  1st Qu.:10.907   1st Qu.: 97.78   1st Qu.: 7.383   1st Qu.: 7.508  
##  Median :12.351   Median :107.66   Median : 8.204   Median : 8.598  
##  Mean   :13.275   Mean   :113.42   Mean   : 8.065   Mean   : 8.931  
##  3rd Qu.:16.520   3rd Qu.:119.37   3rd Qu.: 8.772   3rd Qu.:10.342  
##  Max.   :19.868   Max.   :772.02   Max.   :11.432   Max.   :12.891  
##       X4LN              X5               X6                X7         
##  Min.   : 7.279   Min.   : 2.771   Min.   :-1.3913   Min.   :-1.2199  
##  1st Qu.: 8.851   1st Qu.: 4.900   1st Qu.:-0.7528   1st Qu.:-0.6435  
##  Median : 9.534   Median : 7.113   Median :-0.3965   Median :-0.3012  
##  Mean   : 9.673   Mean   : 7.280   Mean   :-0.3079   Mean   :-0.2011  
##  3rd Qu.:10.401   3rd Qu.: 8.542   3rd Qu.:-0.2288   3rd Qu.: 0.1874  
##  Max.   :12.948   Max.   :15.900   Max.   : 1.5822   Max.   : 1.2755  
##        X8             IEDCHLN      
##  Min.   :-1.8849   Min.   : 4.026  
##  1st Qu.:-0.5124   1st Qu.: 6.487  
##  Median :-0.1723   Median : 7.257  
##  Mean   :-0.1171   Mean   : 7.589  
##  3rd Qu.: 0.3525   3rd Qu.: 8.561  
##  Max.   : 1.5385   Max.   :11.203
str(datosIED3)
## 'data.frame':    133 obs. of  10 variables:
##  $ YLN    : num  9.29 9.27 9.23 9.25 9.28 ...
##  $ X1     : num  92.5 96.7 98.7 103.2 105.2 ...
##  $ X2LN   : num  5.14 5.16 5.06 5.08 5.11 ...
##  $ X3LN   : num  6.18 6.33 6.37 6.83 6.72 ...
##  $ X4LN   : num  7.8 7.76 7.9 8.13 8.2 ...
##  $ X5     : num  7.9 8.7 14.2 15.9 14 ...
##  $ X6     : num  1.34 1.34 1.37 1.35 1.32 ...
##  $ X7     : num  1.11 1.15 1.01 0.98 0.99 ...
##  $ X8     : num  1.029 1.053 0.803 0.528 0.395 ...
##  $ IEDCHLN: num  7.39 7.32 6.47 7.25 6.94 ...

Contamos con 133 observaciones y 10 columnas (variables), donde YLN es la variable dependiente

  1. Extraemos una muestra aleatoria de los datos
    En este ejemplo será del 80%
# Fijamos la semilla para tener el mismo resultado de variables aleatorias en subsecuentes ejecuciones
set.seed(1234)

# p = 0.8 toma el 80% de la muestra aleatoriamente, y dejamos el resto para la prueba 
train <- createDataPartition(y = datosIED3$YLN, p = 0.8, list = FALSE, times = 1) 
datos_train <- datosIED3[train, ]
datos_test <- datosIED3[-train, ]
dim(datos_train)
## [1] 109  10
dim(datos_test)
## [1] 24 10
  1. Aplicamos nuestros métodos y analizamos

Forward Selection

set.seed(1234)
#Forward selection
lm.null = lm(YLN ~1, data=datos_train)
model.aic.forward <- step(lm.null, direction = "forward", scope = ~ IEDCHLN+X1+X2LN+X3LN+X4LN+X5+X6+X7+X8)
## Start:  AIC=251.61
## YLN ~ 1
## 
##           Df Sum of Sq     RSS    AIC
## + X8       1    390.33  686.08 204.52
## + X3LN     1    365.24  711.16 208.44
## + X4LN     1    320.49  755.92 215.09
## + X7       1    287.90  788.50 219.69
## + IEDCHLN  1    281.78  794.63 220.53
## + X2LN     1    256.79  819.62 223.91
## + X6       1     74.37 1002.04 245.81
## <none>                 1076.41 251.61
## + X5       1      1.75 1074.66 253.44
## + X1       1      1.09 1075.32 253.50
## 
## Step:  AIC=204.52
## YLN ~ X8
## 
##           Df Sum of Sq    RSS    AIC
## + X2LN     1   247.634 438.44 157.72
## + X4LN     1   212.260 473.82 166.17
## + X3LN     1   211.748 474.33 166.29
## + IEDCHLN  1    89.755 596.32 191.24
## + X6       1    62.631 623.45 196.09
## + X1       1    13.241 672.84 204.40
## <none>                 686.08 204.52
## + X5       1     2.051 684.03 206.19
## + X7       1     0.414 685.66 206.46
## 
## Step:  AIC=157.72
## YLN ~ X8 + X2LN
## 
##           Df Sum of Sq    RSS    AIC
## + X5       1    39.364 399.08 149.46
## + IEDCHLN  1    29.539 408.91 152.11
## <none>                 438.44 157.72
## + X6       1     3.209 435.24 158.91
## + X1       1     1.293 437.15 159.39
## + X3LN     1     1.254 437.19 159.40
## + X7       1     0.206 438.24 159.66
## + X4LN     1     0.004 438.44 159.72
## 
## Step:  AIC=149.46
## YLN ~ X8 + X2LN + X5
## 
##           Df Sum of Sq    RSS    AIC
## + IEDCHLN  1    41.342 357.74 139.54
## + X6       1    16.884 382.20 146.75
## <none>                 399.08 149.46
## + X4LN     1     0.323 398.76 151.37
## + X3LN     1     0.096 398.98 151.44
## + X7       1     0.094 398.99 151.44
## + X1       1     0.019 399.06 151.46
## 
## Step:  AIC=139.54
## YLN ~ X8 + X2LN + X5 + IEDCHLN
## 
##        Df Sum of Sq    RSS    AIC
## + X4LN  1    9.6397 348.10 138.56
## <none>              357.74 139.54
## + X6    1    4.9637 352.78 140.02
## + X1    1    1.3295 356.41 141.14
## + X3LN  1    1.3239 356.42 141.14
## + X7    1    0.0105 357.73 141.54
## 
## Step:  AIC=138.56
## YLN ~ X8 + X2LN + X5 + IEDCHLN + X4LN
## 
##        Df Sum of Sq    RSS    AIC
## <none>              348.10 138.56
## + X6    1    5.7223 342.38 138.76
## + X1    1    1.0383 347.06 140.24
## + X3LN  1    0.2988 347.80 140.47
## + X7    1    0.2827 347.82 140.48
summary(model.aic.forward)
## 
## Call:
## lm(formula = YLN ~ X8 + X2LN + X5 + IEDCHLN + X4LN, data = datos_train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6535 -0.8980 -0.0044  1.0260  4.2800 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.77912    1.73847   1.023 0.308523    
## X8           3.28276    0.32883   9.983  < 2e-16 ***
## X2LN         1.34111    0.30753   4.361 3.08e-05 ***
## X5           0.25456    0.06629   3.840 0.000212 ***
## IEDCHLN     -0.97741    0.25245  -3.872 0.000190 ***
## X4LN         0.68207    0.40386   1.689 0.094268 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.838 on 103 degrees of freedom
## Multiple R-squared:  0.6766, Adjusted R-squared:  0.6609 
## F-statistic:  43.1 on 5 and 103 DF,  p-value: < 2.2e-16

Entrenamos el modelo con las variables seleccionadas e imprimimos los coeficientes del modelo

# Utilizamos el modelos lineal, pero lo podemos cambiar 
# Train, estima los coeficientes adecuados 
mod_IED1 <- train(YLN ~ X8 + X2LN + X5 + IEDCHLN + X4LN,data=datos_train,method="lm") 
mod_IED1$finalModel
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Coefficients:
## (Intercept)           X8         X2LN           X5      IEDCHLN         X4LN  
##      1.7791       3.2828       1.3411       0.2546      -0.9774       0.6821
summary(mod_IED1)
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6535 -0.8980 -0.0044  1.0260  4.2800 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.77912    1.73847   1.023 0.308523    
## X8           3.28276    0.32883   9.983  < 2e-16 ***
## X2LN         1.34111    0.30753   4.361 3.08e-05 ***
## X5           0.25456    0.06629   3.840 0.000212 ***
## IEDCHLN     -0.97741    0.25245  -3.872 0.000190 ***
## X4LN         0.68207    0.40386   1.689 0.094268 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.838 on 103 degrees of freedom
## Multiple R-squared:  0.6766, Adjusted R-squared:  0.6609 
## F-statistic:  43.1 on 5 and 103 DF,  p-value: < 2.2e-16

Estimamos las predicciones con los datos de prueba, datos_test

predicciones_F <- predict(mod_IED1,datos_test) 

Observamos la correlación de los datos de prueba con los arrojados con el modelo, mientras mayor sea la correlación, mejor. (MÉTRICA)

cor(predicciones_F, datos_test$YLN)
## [1] 0.7820525

Backward Selection

Con este proceso empezamos al revés. Empezamos de tener el modelo completo con todas las variables, y el proceso va quitando variables hasta el punto donde encuentra el mejor criterio AIC.

set.seed(1234)
#Backward selection
# Tenemos que poner todos los regresores
lm.null=lm(YLN ~ IEDCHLN+X1+X2LN+X3LN+X4LN+X5+X6+X7+X8, data=datos_train)
model.aic.backward <- step(lm.null, direction = "backward",trace = 1, scope = ~ 1)
## Start:  AIC=144.12
## YLN ~ IEDCHLN + X1 + X2LN + X3LN + X4LN + X5 + X6 + X7 + X8
## 
##           Df Sum of Sq    RSS    AIC
## - X7       1     0.785 341.15 142.37
## - X3LN     1     0.831 341.20 142.38
## - X1       1     0.889 341.25 142.40
## - X6       1     6.093 346.46 144.05
## <none>                 340.36 144.12
## - X4LN     1     9.627 349.99 145.16
## - IEDCHLN  1    35.747 376.11 153.00
## - X2LN     1    46.076 386.44 155.95
## - X5       1    52.023 392.39 157.62
## - X8       1   141.176 481.54 179.94
## 
## Step:  AIC=142.37
## YLN ~ IEDCHLN + X1 + X2LN + X3LN + X4LN + X5 + X6 + X8
## 
##           Df Sum of Sq    RSS    AIC
## - X3LN     1     0.543 341.69 140.54
## - X1       1     0.835 341.98 140.63
## - X6       1     5.445 346.60 142.09
## <none>                 341.15 142.37
## - X4LN     1     9.610 350.76 143.39
## - IEDCHLN  1    40.898 382.05 152.71
## - X2LN     1    46.465 387.61 154.28
## - X5       1    51.358 392.51 155.65
## - X8       1   236.317 577.47 197.74
## 
## Step:  AIC=140.54
## YLN ~ IEDCHLN + X1 + X2LN + X4LN + X5 + X6 + X8
## 
##           Df Sum of Sq    RSS    AIC
## - X1       1     0.685 342.38 138.76
## - X6       1     5.369 347.06 140.24
## <none>                 341.69 140.54
## - X4LN     1    10.121 351.81 141.72
## - IEDCHLN  1    40.388 382.08 150.72
## - X2LN     1    48.149 389.84 152.91
## - X5       1    51.213 392.91 153.76
## - X8       1   250.375 592.07 198.46
## 
## Step:  AIC=138.76
## YLN ~ IEDCHLN + X2LN + X4LN + X5 + X6 + X8
## 
##           Df Sum of Sq    RSS    AIC
## - X6       1     5.722 348.10 138.56
## <none>                 342.38 138.76
## - X4LN     1    10.398 352.78 140.02
## - IEDCHLN  1    39.755 382.13 148.73
## - X2LN     1    47.623 390.00 150.95
## - X5       1    55.544 397.92 153.15
## - X8       1   257.562 599.94 197.90
## 
## Step:  AIC=138.56
## YLN ~ IEDCHLN + X2LN + X4LN + X5 + X8
## 
##           Df Sum of Sq    RSS    AIC
## <none>                 348.10 138.56
## - X4LN     1      9.64 357.74 139.54
## - X5       1     49.84 397.94 151.15
## - IEDCHLN  1     50.66 398.76 151.37
## - X2LN     1     64.27 412.37 155.03
## - X8       1    336.83 684.93 210.34
summary(model.aic.backward)
## 
## Call:
## lm(formula = YLN ~ IEDCHLN + X2LN + X4LN + X5 + X8, data = datos_train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6535 -0.8980 -0.0044  1.0260  4.2800 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.77912    1.73847   1.023 0.308523    
## IEDCHLN     -0.97741    0.25245  -3.872 0.000190 ***
## X2LN         1.34111    0.30753   4.361 3.08e-05 ***
## X4LN         0.68207    0.40386   1.689 0.094268 .  
## X5           0.25456    0.06629   3.840 0.000212 ***
## X8           3.28276    0.32883   9.983  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.838 on 103 degrees of freedom
## Multiple R-squared:  0.6766, Adjusted R-squared:  0.6609 
## F-statistic:  43.1 on 5 and 103 DF,  p-value: < 2.2e-16
mod_IED2 <- train(YLN ~ IEDCHLN + X2LN + X4LN + X5 + X8,data=datos_train,method="lm") 
mod_IED2$finalModel
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Coefficients:
## (Intercept)      IEDCHLN         X2LN         X4LN           X5           X8  
##      1.7791      -0.9774       1.3411       0.6821       0.2546       3.2828

Calculamos predicciones y la correlación con los datos de prueba

predicciones_B <- predict(mod_IED2,datos_test) 
cor(predicciones_B, datos_test$YLN)
## [1] 0.7820525