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.
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:
CIA_Logit = AIC(modelo_logit)
CIA_Logit
## [1] 28.58381
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?
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.
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
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
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.
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.
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 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).
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).
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).
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
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
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
# 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
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
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