library(glmnet)
## Cargando paquete requerido: Matrix
## Loaded glmnet 4.1-8
library(caret)
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: lattice
str(carros)
## 'data.frame':    93 obs. of  27 variables:
##  $ ID                        : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ tipo                      : chr  "Small" "Midsize" "Compact" "Midsize" ...
##  $ millas_por_galon_ciudad   : int  25 18 20 19 22 22 19 16 19 16 ...
##  $ millas_por_galon_carretera: int  31 25 26 26 30 31 28 25 27 25 ...
##  $ numero_de_airbags         : chr  "No tiene" "Conductor y copiloto" "Conductor" "Conductor y copiloto" ...
##  $ traccion                  : chr  "Delantera" "Delantera" "Delantera" "Delantera" ...
##  $ cilindros                 : int  4 6 6 6 4 4 6 6 6 8 ...
##  $ litros_motor              : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
##  $ caballos_fuerza           : int  140 200 172 172 208 110 170 180 170 200 ...
##  $ revoluciones_por_minuto   : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
##  $ rev_motor_por_milla       : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
##  $ transmision_manual        : chr  "Si" "Si" "Si" "Si" ...
##  $ capacidad_tanque          : num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
##  $ capacidad_pasajeros       : int  5 5 5 6 4 6 6 6 5 6 ...
##  $ longitud                  : int  177 195 180 193 186 189 200 216 198 206 ...
##  $ distancia_entre_ruedas    : int  102 115 102 106 109 105 111 116 108 114 ...
##  $ ancho                     : int  68 71 67 70 69 69 74 78 73 73 ...
##  $ espacio_para_dar_la_u     : int  37 38 37 37 39 41 42 45 41 43 ...
##  $ espacio_asiento_trasero   : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
##  $ capacidad_baul            : num  11 15 14 17 13 16 17 21 14 18 ...
##  $ peso_en_libras            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
##  $ hecho_o_no_en_USA         : chr  "Hecho fuera de USA" "Hecho fuera de USA" "Hecho fuera de USA" "Hecho fuera de USA" ...
##  $ precio_basico             : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
##  $ precio_promedio           : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
##  $ precio_equipado           : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
##  $ fabricante                : chr  "Acura" "Acura" "Audi" "Audi" ...
##  $ modelo                    : chr  "Integra" "Legend" "90" "100" ...

Feature Engineering:

De la estructura de los datos se obtienen las siguientes observaciones que llevarán a transformaciones de preparación de los datos (feature engineering):

1- Si la variable dependiente es el precio, hay 3 precios disponibles. Usar uno de ellos como predictor del otro probablemente no tiene sentido de negocio, porque no es el tipo de característica que va a estar disponible para predecir el precio de un nuevo vehículo. Por eso, dos de ellos serán descartados (dejaremos el precio promedio)

2- Las variables predictoras numéricas están todas asociadas a características físicas del carro. El ID del caso debe ser retirado como variable predictora.

3- Existen un conjunto de datos categóricos (tipo factor en R) que debemos transformar si deseamos que se incluyan como variables predictoras. Los airbags, el tipo de tracción y de transmisión son características no numéricas del vehículo. El tipo de vehículo. y el lugar de fabricación son posibles condicionantes del precio del vehículo también. La marca (fabricante) puede resultar interesante, más aún si tenemos en cuenta que la marca es un intangible muy importante en un vehículo, y hasta ahora ninguna de las variables podía capturar directamente intangibles de los vehículos. El modelo, en cambio, es casi único por cada vehículo (hay 93 modelos) luego es casi una variable identificadora y será descartada. Todas las demás variables categóricas cada una con k categorías a incluir se convertirán en k-1 variables binarias,

Dado que existen más de 20 posibles variables predictoras para un conjunto de tan solo 97 casos, el riesgo de overfitting puede ser grande, más aún si tenemos en cuenta que vamos a crear variables binarias para múltiples variables categóricas y requerimos bases de datos de entrenamiento y validación, incrementando aún más el riesgo mencionado. Todo ello va a implicar decisiones en el modelo y su validación.

Preparemos la base de datos:

#guardar los modelos de los carros para interpretación
carmodelos<-carros$modelo
#remover el ID, el modelo y dos de los precios
carros<-within(carros,rm(ID,modelo,precio_basico,precio_equipado))
#crear variables dummy (binarias)
set.seed(1)
carroswin<-dummyVars("~.",data=carros)
carrosfin<-as.data.frame(predict(carroswin,newdata=carros))
summary(carrosfin)
##   tipoCompact      tipoLarge       tipoMidsize       tipoSmall     
##  Min.   :0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :0.000   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   :0.172   Mean   :0.1183   Mean   :0.2366   Mean   :0.2258  
##  3rd Qu.:0.000   3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.0000  
##  Max.   :1.000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##    tipoSporty        tipoVan        millas_por_galon_ciudad
##  Min.   :0.0000   Min.   :0.00000   Min.   :15.00          
##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:18.00          
##  Median :0.0000   Median :0.00000   Median :21.00          
##  Mean   :0.1505   Mean   :0.09677   Mean   :22.37          
##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:25.00          
##  Max.   :1.0000   Max.   :1.00000   Max.   :46.00          
##  millas_por_galon_carretera numero_de_airbagsConductor
##  Min.   :20.00              Min.   :0.0000            
##  1st Qu.:26.00              1st Qu.:0.0000            
##  Median :28.00              Median :0.0000            
##  Mean   :29.09              Mean   :0.4624            
##  3rd Qu.:31.00              3rd Qu.:1.0000            
##  Max.   :50.00              Max.   :1.0000            
##  numero_de_airbagsConductor y copiloto numero_de_airbagsNo tiene
##  Min.   :0.000                         Min.   :0.0000           
##  1st Qu.:0.000                         1st Qu.:0.0000           
##  Median :0.000                         Median :0.0000           
##  Mean   :0.172                         Mean   :0.3656           
##  3rd Qu.:0.000                         3rd Qu.:1.0000           
##  Max.   :1.000                         Max.   :1.0000           
##       traccionDoble tracci\xf3n traccionDelantera traccionTrasera
##  Min.   :0.0000                 Min.   :0.0000    Min.   :0.000  
##  1st Qu.:0.0000                 1st Qu.:0.0000    1st Qu.:0.000  
##  Median :0.0000                 Median :1.0000    Median :0.000  
##  Mean   :0.1075                 Mean   :0.7204    Mean   :0.172  
##  3rd Qu.:0.0000                 3rd Qu.:1.0000    3rd Qu.:0.000  
##  Max.   :1.0000                 Max.   :1.0000    Max.   :1.000  
##    cilindros      litros_motor   caballos_fuerza revoluciones_por_minuto
##  Min.   :3.000   Min.   :1.000   Min.   : 55.0   Min.   :3800           
##  1st Qu.:4.000   1st Qu.:1.800   1st Qu.:103.0   1st Qu.:4800           
##  Median :4.000   Median :2.400   Median :140.0   Median :5200           
##  Mean   :4.957   Mean   :2.668   Mean   :143.8   Mean   :5281           
##  3rd Qu.:6.000   3rd Qu.:3.300   3rd Qu.:170.0   3rd Qu.:5750           
##  Max.   :8.000   Max.   :5.700   Max.   :300.0   Max.   :6500           
##  rev_motor_por_milla transmision_manualNo transmision_manualSi capacidad_tanque
##  Min.   :1320        Min.   :0.0000       Min.   :0.0000       Min.   : 9.20   
##  1st Qu.:1985        1st Qu.:0.0000       1st Qu.:0.0000       1st Qu.:14.50   
##  Median :2340        Median :0.0000       Median :1.0000       Median :16.40   
##  Mean   :2332        Mean   :0.3441       Mean   :0.6559       Mean   :16.66   
##  3rd Qu.:2565        3rd Qu.:1.0000       3rd Qu.:1.0000       3rd Qu.:18.80   
##  Max.   :3755        Max.   :1.0000       Max.   :1.0000       Max.   :27.00   
##  capacidad_pasajeros    longitud     distancia_entre_ruedas     ancho      
##  Min.   :2.000       Min.   :141.0   Min.   : 90.0          Min.   :60.00  
##  1st Qu.:4.000       1st Qu.:174.0   1st Qu.: 98.0          1st Qu.:67.00  
##  Median :5.000       Median :183.0   Median :103.0          Median :69.00  
##  Mean   :5.086       Mean   :183.2   Mean   :103.9          Mean   :69.38  
##  3rd Qu.:6.000       3rd Qu.:192.0   3rd Qu.:110.0          3rd Qu.:72.00  
##  Max.   :8.000       Max.   :219.0   Max.   :119.0          Max.   :78.00  
##  espacio_para_dar_la_u espacio_asiento_trasero capacidad_baul  peso_en_libras
##  Min.   :32.00         Min.   :17.80           Min.   : 6.00   Min.   :1695  
##  1st Qu.:37.00         1st Qu.:26.00           1st Qu.:12.00   1st Qu.:2620  
##  Median :39.00         Median :27.50           Median :14.00   Median :3040  
##  Mean   :38.96         Mean   :27.68           Mean   :14.02   Mean   :3073  
##  3rd Qu.:41.00         3rd Qu.:30.00           3rd Qu.:16.00   3rd Qu.:3525  
##  Max.   :45.00         Max.   :36.00           Max.   :22.00   Max.   :4105  
##  hecho_o_no_en_USAHecho en USA hecho_o_no_en_USAHecho fuera de USA
##  Min.   :0.0000                Min.   :0.0000                     
##  1st Qu.:0.0000                1st Qu.:0.0000                     
##  Median :1.0000                Median :0.0000                     
##  Mean   :0.5161                Mean   :0.4839                     
##  3rd Qu.:1.0000                3rd Qu.:1.0000                     
##  Max.   :1.0000                Max.   :1.0000                     
##  precio_promedio fabricanteAcura   fabricanteAudi    fabricanteBMW    
##  Min.   : 7.40   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:12.20   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :17.70   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :19.51   Mean   :0.02151   Mean   :0.02151   Mean   :0.01075  
##  3rd Qu.:23.30   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :61.90   Max.   :1.00000   Max.   :1.00000   Max.   :1.00000  
##  fabricanteBuick   fabricanteCadillac fabricanteChevrolet fabricanteChrysler
##  Min.   :0.00000   Min.   :0.00000    Min.   :0.00000     Min.   :0.00000   
##  1st Qu.:0.00000   1st Qu.:0.00000    1st Qu.:0.00000     1st Qu.:0.00000   
##  Median :0.00000   Median :0.00000    Median :0.00000     Median :0.00000   
##  Mean   :0.04301   Mean   :0.02151    Mean   :0.08602     Mean   :0.03226   
##  3rd Qu.:0.00000   3rd Qu.:0.00000    3rd Qu.:0.00000     3rd Qu.:0.00000   
##  Max.   :1.00000   Max.   :1.00000    Max.   :1.00000     Max.   :1.00000   
##  fabricanteDodge   fabricanteEagle   fabricanteFord    fabricanteGeo    
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.06452   Mean   :0.02151   Mean   :0.08602   Mean   :0.02151  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :1.00000   Max.   :1.00000   Max.   :1.00000   Max.   :1.00000  
##  fabricanteHonda   fabricanteHyundai fabricanteInfiniti fabricanteLexus  
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000    Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000    1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000    Median :0.00000  
##  Mean   :0.03226   Mean   :0.04301   Mean   :0.01075    Mean   :0.02151  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000    3rd Qu.:0.00000  
##  Max.   :1.00000   Max.   :1.00000   Max.   :1.00000    Max.   :1.00000  
##  fabricanteLincoln fabricanteMazda   fabricanteMercedes-Benz fabricanteMercury
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000         Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000         1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000         Median :0.00000  
##  Mean   :0.02151   Mean   :0.05376   Mean   :0.02151         Mean   :0.02151  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000         3rd Qu.:0.00000  
##  Max.   :1.00000   Max.   :1.00000   Max.   :1.00000         Max.   :1.00000  
##  fabricanteMitsubishi fabricanteNissan  fabricanteOldsmobile fabricantePlymouth
##  Min.   :0.00000      Min.   :0.00000   Min.   :0.00000      Min.   :0.00000   
##  1st Qu.:0.00000      1st Qu.:0.00000   1st Qu.:0.00000      1st Qu.:0.00000   
##  Median :0.00000      Median :0.00000   Median :0.00000      Median :0.00000   
##  Mean   :0.02151      Mean   :0.04301   Mean   :0.04301      Mean   :0.01075   
##  3rd Qu.:0.00000      3rd Qu.:0.00000   3rd Qu.:0.00000      3rd Qu.:0.00000   
##  Max.   :1.00000      Max.   :1.00000   Max.   :1.00000      Max.   :1.00000   
##  fabricantePontiac fabricanteSaab    fabricanteSaturn  fabricanteSubaru 
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.05376   Mean   :0.01075   Mean   :0.01075   Mean   :0.03226  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :1.00000   Max.   :1.00000   Max.   :1.00000   Max.   :1.00000  
##  fabricanteSuzuki  fabricanteToyota  fabricanteVolkswagen fabricanteVolvo  
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000      Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000      1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000      Median :0.00000  
##  Mean   :0.01075   Mean   :0.04301   Mean   :0.04301      Mean   :0.02151  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000      3rd Qu.:0.00000  
##  Max.   :1.00000   Max.   :1.00000   Max.   :1.00000      Max.   :1.00000
carrosfin2<-within(carrosfin,rm(fabricanteLexus,tipoSporty,tracciónTrasera,transmisión_manualSi,
                                `numero_de_airbagsNo tiene`,
                                `hecho_o_no_en_USAHecho fuera de USA`))
## Warning in rm(fabricanteLexus, tipoSporty, tracciónTrasera,
## transmisión_manualSi, : objeto 'tracciónTrasera' no encontrado
## Warning in rm(fabricanteLexus, tipoSporty, tracciónTrasera,
## transmisión_manualSi, : objeto 'transmisión_manualSi' no encontrado
#veamos la dimension final de la base de datos
dim(carrosfin2)
## [1] 93 60
#retiro la variable a predecir
predictores<-cbind(as.matrix(carrosfin2[,1:27]),as.matrix(carrosfin2[,29:59]))

MODELADO - MODELO

La multicolinealidad y la baja relación datos a variables hacen de este problema un caso complicado para las regresiones basadas en mínimos cuadrados. Obtengamos un modelo básico y observémoslo.

Modeo Clasico

##entrenamiento y validación 80-20
set.seed(49584)
sample <- sample.int(nrow(carrosfin2), floor(.8*nrow(carrosfin2)))
carros.train <- carrosfin2[sample, ]
carros.test <- carrosfin2[-sample, ]
#haciendo el modelo
modeloaug<-lm(precio_promedio~.,data=carros.train)
summary(modeloaug)
## 
## Call:
## lm(formula = precio_promedio ~ ., data = carros.train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.5080 -0.9991  0.0000  0.8484  2.5280 
## 
## Coefficients: (6 not defined because of singularities)
##                                           Estimate Std. Error t value Pr(>|t|)
## (Intercept)                             64.4684147 29.9028457   2.156  0.04345
## tipoCompact                             -3.6024856  2.3101839  -1.559  0.13459
## tipoLarge                                1.8130657  3.7583324   0.482  0.63475
## tipoMidsize                              1.5303352  3.4302043   0.446  0.66029
## tipoSmall                               -4.0013225  1.9422007  -2.060  0.05263
## tipoVan                                  1.7399073  5.3501413   0.325  0.74840
## millas_por_galon_ciudad                  0.2849058  0.3699011   0.770  0.45017
## millas_por_galon_carretera              -0.2207619  0.3759656  -0.587  0.56365
## numero_de_airbagsConductor               1.9295984  1.5417841   1.252  0.22518
## `numero_de_airbagsConductor y copiloto`  0.7019062  2.2798388   0.308  0.76136
## `traccionDoble tracci\\xf3n`            -2.1582913  3.3076944  -0.653  0.52150
## traccionDelantera                       -0.5800834  2.1363680  -0.272  0.78877
## traccionTrasera                                 NA         NA      NA       NA
## cilindros                                0.9117545  1.0905011   0.836  0.41298
## litros_motor                            -0.9284601  2.1046087  -0.441  0.66383
## caballos_fuerza                          0.0664939  0.0465879   1.427  0.16893
## revoluciones_por_minuto                 -0.0002577  0.0017712  -0.145  0.88579
## rev_motor_por_milla                     -0.0005368  0.0019264  -0.279  0.78336
## transmision_manualNo                    -0.6866302  2.7079451  -0.254  0.80242
## transmision_manualSi                            NA         NA      NA       NA
## capacidad_tanque                         0.8201028  0.4766811   1.720  0.10079
## capacidad_pasajeros                     -0.9457592  1.3677932  -0.691  0.49723
## longitud                                 0.1364055  0.1042617   1.308  0.20561
## distancia_entre_ruedas                  -0.0821904  0.2813804  -0.292  0.77322
## ancho                                   -1.2591775  0.4395051  -2.865  0.00957
## espacio_para_dar_la_u                   -0.2103207  0.3431502  -0.613  0.54684
## espacio_asiento_trasero                  0.2798630  0.3633129   0.770  0.45012
## capacidad_baul                          -0.3463114  0.3377345  -1.025  0.31742
## peso_en_libras                           0.0044807  0.0047712   0.939  0.35888
## `hecho_o_no_en_USAHecho en USA`          2.8044715  5.6124186   0.500  0.62275
## fabricanteAcura                          6.1038227  4.6970398   1.300  0.20855
## fabricanteAudi                           6.5038205  3.1886295   2.040  0.05481
## fabricanteBMW                           -3.1784917  4.3305868  -0.734  0.47149
## fabricanteBuick                         -2.0460083  3.9951405  -0.512  0.61417
## fabricanteCadillac                       4.2465123  5.5676597   0.763  0.45454
## fabricanteChevrolet                     -3.9613108  3.6546030  -1.084  0.29129
## fabricanteChrysler                      -2.6258746  4.9834493  -0.527  0.60405
## fabricanteDodge                         -4.2029503  3.9424546  -1.066  0.29909
## fabricanteEagle                                 NA         NA      NA       NA
## fabricanteFord                          -3.4203894  3.8413579  -0.890  0.38383
## fabricanteGeo                           -0.2240785  5.0195015  -0.045  0.96484
## fabricanteHonda                         -0.6300359  4.9657573  -0.127  0.90031
## fabricanteHyundai                       -5.2258748  3.3954444  -1.539  0.13946
## fabricanteInfiniti                              NA         NA      NA       NA
## fabricanteLincoln                       10.4571342  4.9395415   2.117  0.04699
## fabricanteMazda                         -0.5360288  3.9797724  -0.135  0.89420
## `fabricanteMercedes-Benz`               31.2713089  4.7415715   6.595 2.01e-06
## fabricanteMercury                       -7.6594158  4.9978265  -1.533  0.14105
## fabricanteMitsubishi                     0.6375606  4.6007784   0.139  0.89117
## fabricanteNissan                        -2.9461685  3.4434272  -0.856  0.40236
## fabricanteOldsmobile                    -3.3404959  4.2137616  -0.793  0.43722
## fabricantePlymouth                      -4.4124918  5.5244878  -0.799  0.43384
## fabricantePontiac                       -2.6240870  4.0012033  -0.656  0.51941
## fabricanteSaab                           8.7781707  4.0615958   2.161  0.04298
## fabricanteSaturn                                NA         NA      NA       NA
## fabricanteSubaru                         0.1219518  4.3031989   0.028  0.97767
## fabricanteSuzuki                                NA         NA      NA       NA
## fabricanteToyota                         0.0071963  3.7434189   0.002  0.99849
## fabricanteVolkswagen                    -1.7646822  3.6900410  -0.478  0.63767
## fabricanteVolvo                          1.6616299  3.4409064   0.483  0.63441
##                                            
## (Intercept)                             *  
## tipoCompact                                
## tipoLarge                                  
## tipoMidsize                                
## tipoSmall                               .  
## tipoVan                                    
## millas_por_galon_ciudad                    
## millas_por_galon_carretera                 
## numero_de_airbagsConductor                 
## `numero_de_airbagsConductor y copiloto`    
## `traccionDoble tracci\\xf3n`               
## traccionDelantera                          
## traccionTrasera                            
## cilindros                                  
## litros_motor                               
## caballos_fuerza                            
## revoluciones_por_minuto                    
## rev_motor_por_milla                        
## transmision_manualNo                       
## transmision_manualSi                       
## capacidad_tanque                           
## capacidad_pasajeros                        
## longitud                                   
## distancia_entre_ruedas                     
## ancho                                   ** 
## espacio_para_dar_la_u                      
## espacio_asiento_trasero                    
## capacidad_baul                             
## peso_en_libras                             
## `hecho_o_no_en_USAHecho en USA`            
## fabricanteAcura                            
## fabricanteAudi                          .  
## fabricanteBMW                              
## fabricanteBuick                            
## fabricanteCadillac                         
## fabricanteChevrolet                        
## fabricanteChrysler                         
## fabricanteDodge                            
## fabricanteEagle                            
## fabricanteFord                             
## fabricanteGeo                              
## fabricanteHonda                            
## fabricanteHyundai                          
## fabricanteInfiniti                         
## fabricanteLincoln                       *  
## fabricanteMazda                            
## `fabricanteMercedes-Benz`               ***
## fabricanteMercury                          
## fabricanteMitsubishi                       
## fabricanteNissan                           
## fabricanteOldsmobile                       
## fabricantePlymouth                         
## fabricantePontiac                          
## fabricanteSaab                          *  
## fabricanteSaturn                           
## fabricanteSubaru                           
## fabricanteSuzuki                           
## fabricanteToyota                           
## fabricanteVolkswagen                       
## fabricanteVolvo                            
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.377 on 20 degrees of freedom
## Multiple R-squared:  0.9829, Adjusted R-squared:  0.9375 
## F-statistic: 21.67 on 53 and 20 DF,  p-value: 3.13e-10
modelocarstep<-step(modeloaug,direction="both",trace=0)
summary(modelocarstep)
## 
## Call:
## lm(formula = precio_promedio ~ tipoCompact + tipoSmall + millas_por_galon_ciudad + 
##     millas_por_galon_carretera + numero_de_airbagsConductor + 
##     `traccionDoble tracci\xf3n` + cilindros + caballos_fuerza + 
##     capacidad_tanque + capacidad_pasajeros + longitud + ancho + 
##     espacio_para_dar_la_u + espacio_asiento_trasero + capacidad_baul + 
##     peso_en_libras + `hecho_o_no_en_USAHecho en USA` + fabricanteAcura + 
##     fabricanteAudi + fabricanteBMW + fabricanteBuick + fabricanteChevrolet + 
##     fabricanteChrysler + fabricanteDodge + fabricanteFord + fabricanteHyundai + 
##     fabricanteLincoln + `fabricanteMercedes-Benz` + fabricanteMercury + 
##     fabricanteNissan + fabricanteOldsmobile + fabricantePlymouth + 
##     fabricantePontiac + fabricanteSaab + fabricanteVolkswagen + 
##     fabricanteVolvo, data = carros.train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.8630 -0.9726  0.0000  0.8940  2.8987 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                      62.191108  11.891904   5.230 6.92e-06 ***
## tipoCompact                      -4.817800   0.875996  -5.500 2.99e-06 ***
## tipoSmall                        -4.759652   1.060651  -4.487 6.78e-05 ***
## millas_por_galon_ciudad           0.307848   0.211122   1.458 0.153236    
## millas_por_galon_carretera       -0.309591   0.205181  -1.509 0.139826    
## numero_de_airbagsConductor        1.704492   0.622482   2.738 0.009443 ** 
## `traccionDoble tracci\\xf3n`     -1.414351   1.086822  -1.301 0.201179    
## cilindros                         1.016270   0.498873   2.037 0.048838 *  
## caballos_fuerza                   0.067745   0.016404   4.130 0.000199 ***
## capacidad_tanque                  0.777155   0.242597   3.203 0.002792 ** 
## capacidad_pasajeros              -1.034024   0.606546  -1.705 0.096621 .  
## longitud                          0.162887   0.047541   3.426 0.001513 ** 
## ancho                            -1.397943   0.221756  -6.304 2.44e-07 ***
## espacio_para_dar_la_u            -0.265213   0.186707  -1.420 0.163841    
## espacio_asiento_trasero           0.367232   0.174660   2.103 0.042368 *  
## capacidad_baul                   -0.433078   0.177858  -2.435 0.019834 *  
## peso_en_libras                    0.003745   0.002010   1.863 0.070383 .  
## `hecho_o_no_en_USAHecho en USA`   4.379153   1.643009   2.665 0.011332 *  
## fabricanteAcura                   5.159037   2.104144   2.452 0.019054 *  
## fabricanteAudi                    6.361459   1.772664   3.589 0.000958 ***
## fabricanteBMW                    -3.210246   2.409852  -1.332 0.190964    
## fabricanteBuick                  -4.073083   1.700358  -2.395 0.021775 *  
## fabricanteChevrolet              -5.437539   1.716759  -3.167 0.003079 ** 
## fabricanteChrysler               -5.025764   1.753390  -2.866 0.006813 ** 
## fabricanteDodge                  -6.096914   1.889380  -3.227 0.002620 ** 
## fabricanteFord                   -4.942656   1.751307  -2.822 0.007628 ** 
## fabricanteHyundai                -5.582188   1.246309  -4.479 6.96e-05 ***
## fabricanteLincoln                 8.684916   2.435613   3.566 0.001023 ** 
## `fabricanteMercedes-Benz`        30.785710   2.246037  13.707 4.49e-16 ***
## fabricanteMercury               -10.088408   2.372749  -4.252 0.000138 ***
## fabricanteNissan                 -2.728505   1.383934  -1.972 0.056173 .  
## fabricanteOldsmobile             -5.528283   1.898789  -2.911 0.006062 ** 
## fabricantePlymouth               -6.659689   2.868743  -2.321 0.025875 *  
## fabricantePontiac                -3.856323   1.923688  -2.005 0.052359 .  
## fabricanteSaab                    8.590120   2.186790   3.928 0.000360 ***
## fabricanteVolkswagen             -2.409098   1.632979  -1.475 0.148598    
## fabricanteVolvo                   2.064267   1.584927   1.302 0.200816    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.816 on 37 degrees of freedom
## Multiple R-squared:  0.9815, Adjusted R-squared:  0.9635 
## F-statistic:  54.6 on 36 and 37 DF,  p-value: < 2.2e-16

El modelo incluyó 25 variables predictoras. Observe que varias de ellas (11 en total) son no significativas. Una mirada, por ejemplo, a los coeficientes de millas por galón en ciudad y en carretera muestran que tienen signos contrarios, lo que no tiene sentido de negocio y es un clásico signo de multicolinealidad.

La cantidad de variables y la multicolinealidad generan un modelo que, a simple vista, se ve extraño.

REGULARIZACION

Parte de la problemática es la restricción de que los estimadores deben ser insesgados, y por tanto la suma de los residuales debe ser cero. Eso puede crear una alta varianza en los estimadores, al punto de ver los resultados que observamos.

Puesto que el error en una predicción es la suma de el sesgo y la varianza de la estimación (más el error residual), permitir cierto sesgo que disminuya en mayor proporción la varianza es un mecanismo que claramente puede permitir mejores predicciones.

Para usar la librería glmnet es necesario crear matrices separadas para los predictores y la variable pendiente. En este notebook ya creamos los predictores: falta la variable dependiente

predic.train<-cbind(as.matrix(carros.train[,1:27]),as.matrix(carros.train[,29:59]))
precio.train<-as.matrix(carros.train[,28])

predic.test<-cbind(as.matrix(carros.test[,1:27]),as.matrix(carros.test[,29:59]))
precio.test<-as.matrix(carros.test[,28])

\(\lambda\)

Ahora vamos a crear modelos de redes elásticas para observar cómo se comportan para diversos valores del parámetro de penalización \(\lambda\).

Es importante anotar que, por defecto, las variables son estandarizadas por el procedimiento.

Con alpha=1 creamos un modelo lasso (penalizado en los valores absolutos de los coeficientes o L1) y con alpha=0 un ridge (penalizado en cuadrados de los coeficientes, o L2). Con 0.5 creamos una red elástica.

El hiperparámetro \(\lambda\) genera cambios importantes en los modelos, y la escogencia de su valor no siempre es fácil. Veamos, por ejemplo, cómo cambian los coeficientes de una regresión regularizada dependiendo de \(\lambda\):

fitlasso<-glmnet(predic.train,precio.train,alpha = 1)
fitridge<-glmnet(predic.train,precio.train,alpha = 0)

#ver la variacion de los coeficientes con el lambda
plot(fitlasso, xvar="lambda")

plot(fitridge, xvar="lambda")

Se puede observar como los valores de \(\lambda\) disminuyen los parámetros desde los de una regresión de mínimos cuadrados (a la izquierda) hasta una penalización alta de coeficientes y, por tanto, un alto sesgo (a la derecha). También puede verse que en el caso de lasso los parámetros se van volviendo cero de manera independiente, mientras en ridge la reducción tiende a ser general (en todos los parámetros)

Validacion Cruzada

¿Cómo escoger lambda? Una buena manera es probar el error que \(\lambda\) comete en diferentes bases de “prueba”. La idea detrás de la validación cruzada es generar múltiples bases de entrenamiento y validación, creando múltiples modelos en la base de entrenamiento y evaluándolos múltiples veces en la base de validación.

Vamos a hacerlo para el caso de Ridge inicialmente:

VALIDACION CRUZADA : RIDGE

foundridge<-cv.glmnet(predic.train, precio.train,alpha=0,nfolds=5)
#grafico lambda vs mse
plot(foundridge)

#veo los lambda minimos
foundridge$lambda.1se
## [1] 863.6858
foundridge$lambda.min
## [1] 310.3926

Este gráfico muestra los errores promedio de cada \(\lambda\), junto con sus errores estándar. El valor que minimiza esos errores en promedio es 1.77 (0.65 en el gráfico, donde se ve el logaritmo), pero se suele sugerir (Hastie lo hace) que se utilice un valor más alto, a no más de una desviación estándar del valor del error más bajo, para obtener un modelo más parsimonioso con un error similar, y evadir el overfitting.

Analizando los resultados:

Miremos los resultados usando ese valor de \(\lambda\) con una desviación estándar más: 34.83

coef(foundridge,s=foundridge$lambda.1se)
## 59 x 1 sparse Matrix of class "dgCMatrix"
##                                                 s1
## (Intercept)                           286.80209111
## tipoCompact                            -6.66921938
## tipoLarge                               6.01529852
## tipoMidsize                            39.69968070
## tipoSmall                             -79.85256994
## tipoVan                               123.40639583
## millas_por_galon_ciudad                -6.76740919
## millas_por_galon_carretera             -7.40416083
## numero_de_airbagsConductor             20.19647536
## numero_de_airbagsConductor y copiloto  28.94158491
## traccionDoble tracci\xf3n              25.64580757
## traccionDelantera                     -37.03782964
## traccionTrasera                        36.29335909
## cilindros                              25.61513067
## litros_motor                           34.22956911
## caballos_fuerza                         0.80200102
## revoluciones_por_minuto                -0.02158018
## rev_motor_por_milla                    -0.05029534
## transmision_manualNo                   35.59339194
## transmision_manualSi                  -35.66964849
## capacidad_tanque                       13.88708924
## capacidad_pasajeros                    26.99805815
## longitud                                2.49177239
## distancia_entre_ruedas                  7.09654418
## ancho                                  11.03296816
## espacio_para_dar_la_u                   9.84051470
## espacio_asiento_trasero                 7.45778076
## capacidad_baul                          6.83469329
## hecho_o_no_en_USAHecho en USA         -25.27336285
## precio_promedio                         3.08999739
## fabricanteAcura                        49.39309338
## fabricanteAudi                         60.47604847
## fabricanteBMW                         146.27140652
## fabricanteBuick                       -14.24037138
## fabricanteCadillac                    -15.28896753
## fabricanteChevrolet                   -11.54974619
## fabricanteChrysler                     14.28131147
## fabricanteDodge                         0.14129654
## fabricanteEagle                         .         
## fabricanteFord                        -30.30680726
## fabricanteGeo                         -48.73054617
## fabricanteHonda                        18.17905283
## fabricanteHyundai                     -35.50037766
## fabricanteInfiniti                      .         
## fabricanteLincoln                      28.00637825
## fabricanteMazda                       -25.98576783
## fabricanteMercedes-Benz               -22.19009350
## fabricanteMercury                      13.15440521
## fabricanteMitsubishi                  -84.38673247
## fabricanteNissan                       87.88031345
## fabricanteOldsmobile                  -11.63149211
## fabricantePlymouth                    -39.89675283
## fabricantePontiac                     -31.46518043
## fabricanteSaab                        -67.85958485
## fabricanteSaturn                      -47.23847810
## fabricanteSubaru                       -8.42056817
## fabricanteSuzuki                        .         
## fabricanteToyota                       13.86343879
## fabricanteVolkswagen                   29.42976859

Aquí los coeficientes se interpretan en el sentido de sus mayores o menores valores relativos y su signo. Por ejemplo, entre los tamaños, Midsize y small son los más importantes, el primero aumentando el precio, y el último disminuyéndolo. Entre los fabricantes, las marcas de lujo aumentan el precio (Mercedes benz, Saab, Cadillac, Audi, Infinity) mientras que marcas más populares como Hyundai o Mercury lo disminuyen. Coeficientes más cercanos a cero marcan una baja importancia de la variable.

Mucho más interpretable suele ser un Lasso, porque puede llevar a cero muchos coeficientes:

VALIDACION CRUZADA : LASSO

foundlasso<-cv.glmnet(predic.train, precio.train,alpha=0,nfolds=5)

#grafico lambda vs mse
plot(foundlasso)

#veo los lambda minimos
foundlasso$lambda.1se
## [1] 863.6858
coef(fitlasso,s=foundlasso$lambda.min)
## 59 x 1 sparse Matrix of class "dgCMatrix"
##                                              s1
## (Intercept)                           16.383434
## tipoCompact                            .       
## tipoLarge                              .       
## tipoMidsize                            .       
## tipoSmall                              .       
## tipoVan                                .       
## millas_por_galon_ciudad               -3.770468
## millas_por_galon_carretera             .       
## numero_de_airbagsConductor             .       
## numero_de_airbagsConductor y copiloto  .       
## traccionDoble tracci\xf3n              .       
## traccionDelantera                      .       
## traccionTrasera                        .       
## cilindros                              .       
## litros_motor                          33.968351
## caballos_fuerza                        .       
## revoluciones_por_minuto                .       
## rev_motor_por_milla                    .       
## transmision_manualNo                   .       
## transmision_manualSi                   .       
## capacidad_tanque                      27.544324
## capacidad_pasajeros                    .       
## longitud                               .       
## distancia_entre_ruedas                21.787931
## ancho                                  4.297684
## espacio_para_dar_la_u                  .       
## espacio_asiento_trasero                .       
## capacidad_baul                         .       
## hecho_o_no_en_USAHecho en USA          .       
## precio_promedio                        .       
## fabricanteAcura                        .       
## fabricanteAudi                         .       
## fabricanteBMW                          .       
## fabricanteBuick                        .       
## fabricanteCadillac                     .       
## fabricanteChevrolet                    .       
## fabricanteChrysler                     .       
## fabricanteDodge                        .       
## fabricanteEagle                        .       
## fabricanteFord                         .       
## fabricanteGeo                          .       
## fabricanteHonda                        .       
## fabricanteHyundai                      .       
## fabricanteInfiniti                     .       
## fabricanteLincoln                      .       
## fabricanteMazda                        .       
## fabricanteMercedes-Benz                .       
## fabricanteMercury                      .       
## fabricanteMitsubishi                   .       
## fabricanteNissan                       .       
## fabricanteOldsmobile                   .       
## fabricantePlymouth                     .       
## fabricantePontiac                      .       
## fabricanteSaab                         .       
## fabricanteSaturn                       .       
## fabricanteSubaru                       .       
## fabricanteSuzuki                       .       
## fabricanteToyota                       .       
## fabricanteVolkswagen                   .

El modelo sesgado es más simple: un aumento de precio por la relación con los caballos de fuerza y efectos por algunas marcas específicas de lujo o económicas (no todas); pequeños efectos del espacio asiento trasero, el peso, y efectos del tipo de vehiculo. Si se usa el coeficiente de una desviación estándar por encima del mínimo se tiene un modelo sin predictores.

VALIDACION CRUZADA : ELASTIC-NET

Ahora vamos a modelar una red elástica. Vamos a probar valores de alfa dese 0.1 hasta 0.9 para observar cuál puede ser el mejor:

# aqui hago redes elasticas de 0.1 a 0.9
for (i in 1:10){
  assign(paste("found", i, sep=""), cv.glmnet(predic.train, precio.train, nfolds=5,
                                              alpha=i/10,))}
min(foundridge$cvm)
## [1] 23297.92
min(found1$cvm)
## [1] 19683.52
min(found2$cvm)
## [1] 21030.14
min(found3$cvm)
## [1] 25786.55
min(found4$cvm)
## [1] 20676.29
min(found5$cvm)
## [1] 21837.01
min(found6$cvm)
## [1] 21467.52
min(found7$cvm)
## [1] 20947.27
min(found8$cvm)
## [1] 24669.92
min(found9$cvm)
## [1] 23544.19
min(foundlasso$cvm)
## [1] 24560.53
# Extraer los valores mínimos de cvm para cada modelo
min_cvm_values <- sapply(1:10, function(i) min(get(paste("found", i, sep=""))$cvm))

# Crear una tabla con los resultados
results_table <- data.frame(
  Model = paste("found", 1:10, sep=""),
  Alpha = seq(0.1, 1.0, by=0.1),
  Min_CVM = min_cvm_values
)

# Mostrar la tabla
print(results_table)
##      Model Alpha  Min_CVM
## 1   found1   0.1 19683.52
## 2   found2   0.2 21030.14
## 3   found3   0.3 25786.55
## 4   found4   0.4 20676.29
## 5   found5   0.5 21837.01
## 6   found6   0.6 21467.52
## 7   found7   0.7 20947.27
## 8   found8   0.8 24669.92
## 9   found9   0.9 23544.19
## 10 found10   1.0 22612.86

“Al parecer un modelo ridge y una red elástica con alpha=0.8 pueden ser buenos candidatos. Usaremos Lasso para comparar, dada su simplicidad. Creemos el modelo que nos falta:”

elastic8<-glmnet(predic.train,precio.train,alpha = 0.8)
coef(elastic8,s=found8$lambda.1se)
## 59 x 1 sparse Matrix of class "dgCMatrix"
##                                                  s1
## (Intercept)                           -1364.7294961
## tipoCompact                               .        
## tipoLarge                                 .        
## tipoMidsize                               .        
## tipoSmall                                -6.6030425
## tipoVan                                   .        
## millas_por_galon_ciudad                  -2.7760325
## millas_por_galon_carretera              -16.1215481
## numero_de_airbagsConductor                .        
## numero_de_airbagsConductor y copiloto     .        
## traccionDoble tracci\xf3n                 .        
## traccionDelantera                         .        
## traccionTrasera                           .        
## cilindros                                 .        
## litros_motor                             73.6025264
## caballos_fuerza                           0.7812161
## revoluciones_por_minuto                   .        
## rev_motor_por_milla                       .        
## transmision_manualNo                      .        
## transmision_manualSi                      .        
## capacidad_tanque                         28.3888733
## capacidad_pasajeros                       .        
## longitud                                  0.6173831
## distancia_entre_ruedas                   28.7429447
## ancho                                    15.5802367
## espacio_para_dar_la_u                     .        
## espacio_asiento_trasero                   .        
## capacidad_baul                            .        
## hecho_o_no_en_USAHecho en USA             .        
## precio_promedio                           .        
## fabricanteAcura                           .        
## fabricanteAudi                            .        
## fabricanteBMW                             .        
## fabricanteBuick                           .        
## fabricanteCadillac                        .        
## fabricanteChevrolet                       .        
## fabricanteChrysler                        .        
## fabricanteDodge                           .        
## fabricanteEagle                           .        
## fabricanteFord                            .        
## fabricanteGeo                             .        
## fabricanteHonda                           .        
## fabricanteHyundai                         .        
## fabricanteInfiniti                        .        
## fabricanteLincoln                         .        
## fabricanteMazda                           .        
## fabricanteMercedes-Benz                   .        
## fabricanteMercury                         .        
## fabricanteMitsubishi                      .        
## fabricanteNissan                          .        
## fabricanteOldsmobile                      .        
## fabricantePlymouth                        .        
## fabricantePontiac                         .        
## fabricanteSaab                            .        
## fabricanteSaturn                          .        
## fabricanteSubaru                          .        
## fabricanteSuzuki                          .        
## fabricanteToyota                          .        
## fabricanteVolkswagen                      .

EVALUACION

#red elastica
predicciones1<-predict.glmnet(elastic8, predic.test, s=elastic8$lambda.min)

#ridge
predicciones2<-predict.glmnet(fitridge, predic.test, s=foundridge$lambda.min)

#lasso
predicciones3<-predict.glmnet(fitlasso, predic.test, s=foundlasso$lambda.min)

#stepwise
predicciones4<-predict(modelocarstep,carros.test)
#calcular el MSE
erroreselastic=sqrt(mean((predicciones1-precio.test[,1])^2))
erroresridge=sqrt(mean((predicciones2-precio.test[,1])^2))
erroreslasso=sqrt(mean((predicciones3-precio.test[,1])^2))
erroresstep=sqrt(mean((predicciones4-precio.test[,1])^2))
erroreselastic
## [1] 240.1505
erroresridge
## [1] 176.9999
erroreslasso
## [1] 359.7593
erroresstep
## [1] 3286.911

El modelo ridge resulta el mejor predictor en la base de datos de validación. Si bien no se logra una mayor parsimonia (ni el modelo step ni los modelos que llevaron coeficientes a 0 obtuvieron mejores resultados), si parece lograrse una mejor predicción. Dado que los datos están en miles de dólares, la diferencia promedio en precisión entre los dos mejores modelos esta en el orden de los US$148 por predicción (algo cercano al 6%), lo cual, dependiendo de la aplicación, puede o no resultar valioso. El modelo lasso es quizás demasiado simple y comete errores mayores, así como la red elástica, con errores entre los cientos y los miles de dólares en promedio, lo que los descarta como candidatos viables.

En el modelo step es difícil saber o entender el efecto específico de cada variable independiente, en parte por la falta de estandarización y en parte por los problemas mencionados de multicolinealidad y parte por la baja relación casos/variables. En el modelo ridge, como se explicó, el tamaño relativo y signo de los coeficientes da idea de la importancia relativa de las variables.

Conclusión

Los modelos regularizados pueden ser una alternativa a los modelos insesgados para mejorar la predictibilidad, particularmente en entornos de baja razón casos/variables o con multicolinealidad. La interpretación de los resultados tiene cambios importantes que deben tenerse en cuenta. La idea de la regularización puede aplicarse a múltiples tipos de modelos que estén buscando minimizar una función de error, lo que la hace altamente aplicable en machine learning.