Contexto de los datos

El conjunto de datos se trata de un conjunto de atributos que definen la calidad de vino blanco, son alrededor de 4898 registros y 25 variables.

Las variables independientes son:

La variable dependiente es calidad de vino de manera cuantitativa: * quality: Representa la calidad del vino evaluada generalmente en escala ordinal por expertos catadores.

Los datos originales tienen valores cuantitativos y se normalizarán de manera inicial para que todos los modelos entrenen con datos estandarizados con media igual a cero \(\mu=0\) y desviación estándar igual a 1 \(\sigma = 1\); \(z= \frac {x_i - \mu}{\sigma}\).

El caso de estudio se encuentra en rpubs.com en la dirección url siguiente: https://rpubs.com/rpizarrog/1434956 .

Los datos se encuentran para su descarga en el servicio github.com en el espacio del autor: https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/winequality_white_enriquecido_final_calidad.csv .

Las funciones que permiten la adecuada ejecución de este caso de estudio se pueden encontrar en el servicio github.com en el espacio del autor: https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20modelos%20de%20regresion%20SVR%20y%20multiple.R

Objetivo

Construir modelos de regresión basados en los algoritmos de soporte de regresión SVR con kernel lineal, kernel polinomial grado dos y tres, kernel radial y regresión lineal múltiple.

Los modelos serán válidos estadísticamente si cumplen con los supuestos de linealidad, no multicolinealidad, homocedasticidad normalidad e independencia de residuos o al menos identificar e indicar la condición que tiene cada modelo de regresión con cada supuesto citado.

Los modelos tendrán calidad predictiva si superan con estos datos el 20% del estadístico r square ajustado para modelos como regresión lineal múltiple y r square para modelos de soporte de regresión (SVR).

Los datos serán particionados con el 70% para datos de entrenamiento y 30% datos de validación.

Al final, el caso de estudio deberá entregar los estadísticos de evaluación para indicar e interpretar cual es el mejor modelo de regresión multivariable de los aquí descritos, con los datos del caso en términos de calidad predictiva y validación de supuestos de regresión.

Descripción

Se sigue la metodología descrita en el capítulo tres.

Cargar librerías

Se cargan las librerías necesarias para este caso de estudio.

# install.packages("readr")
# install.packages("tidyverse")
# install.packages("psych")
# install.packages("dplyr")
# install.packages("ggplot2")
# install.packages("caret")
# install.packages("broom")
# install.packages("lmtest")
# install.packages("car")
# install.packages("stats")
# install.packages("flextable")
# install.packages("officer")
# install.packages("patchwork")
# install.packages("performance")
# install.packages("see")
# install.packages("car")
# install.packages("nortest")
# install.packages("lmtest")
# install,packages("e1071")

library(readr)        # cargar datos datos
library(tidyverse)    # Para manipular
library (psych)       # Para descriobir datos
library(dplyr)        # Manipulación de datos
library(ggplot2)      # gráficos
library(caret)        # partición de datos
library(broom)        # tidy modelos
library(lmtest)       # Durbin-Watson
library(car)          # VIF y diagnóstico, entre otras
library(stats)        # lm, shapiro.test
library(patchwork)    # Graficos organizados en columnas renglones
# Tablas compatibles con Word
library(flextable)
library(officer)

library(performance) # Para evaluar postulados de modelos
library(see)         # Para evaluar postulados de modelos dependencia de performance
library(car)         # Para verificar postulados de los modelos

library(nortest)     # Para pruebas de normalidad Anderson-Darling
library(lmtest)      # Para pruebas de homocedasticidad Breusch–Pagan y prueba de White y otras pruebas
library(glmnet)      # Para modelos Lasso y Ridge

library(e1071)       # Para modelos SVR varios kernels

Cargar funciones

url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20modelos%20de%20regresion%20SVR%20y%20multiple.R"
source (url)

Cargar los datos

url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/winequality_white_enriquecido_final_calidad.csv"
datos <- f_cargar_datos(url)

Visualizar datos

Se presentan los primeros y últimos registros del conjunto de los datos original de la calidad de vino, de igual manera, solo las primeras y últimas cuatro variables incluyendo la variable dependiente calidad.

f_visualizar_head_tail_reducido_word(datos)

fixed_acidity

volatile_acidity

citric_acid

residual_sugar

...

density_sugar

acidez_pH

alcohol_acidez_volatil

quality

7

0.27

0.36

20.7

...

20.7207

21

2.376

6

6.3

0.3

0.34

1.6

...

1.5904

20.79

2.85

6

8.1

0.28

0.4

6.9

...

6.8662

26.406

2.828

6

7.2

0.23

0.32

8.5

...

8.4626

22.968

2.277

6

7.2

0.23

0.32

8.5

...

8.4626

22.968

2.277

6

8.1

0.28

0.4

6.9

...

6.8662

26.406

2.828

6

...

...

...

...

...

...

...

...

...

6.5

0.23

0.38

1.3

...

1.2909

21.385

2.231

5

6.2

0.21

0.29

1.6

...

1.5858

20.274

2.352

6

6.6

0.32

0.36

8

...

7.9592

20.79

3.072

5

6.5

0.24

0.19

1.2

...

1.191

19.435

2.256

6

5.5

0.29

0.3

1.1

...

1.0876

18.37

3.712

7

6

0.21

0.38

0.8

...

0.7915

19.56

2.478

6

Estadísticos descriptivos

f_describir_datos(datos)
## $describe
##                        vars    n   mean     sd median trimmed   mad   min
## fixed_acidity             1 4898   6.85   0.84   6.80    6.82  0.74  3.80
## volatile_acidity          2 4898   0.28   0.10   0.26    0.27  0.09  0.08
## citric_acid               3 4898   0.33   0.12   0.32    0.33  0.09  0.00
## residual_sugar            4 4898   6.39   5.07   5.20    5.80  5.34  0.60
## chlorides                 5 4898   0.05   0.02   0.04    0.04  0.01  0.01
## free_sulfur_dioxide       6 4898  35.31  17.01  34.00   34.36 16.31  2.00
## total_sulfur_dioxide      7 4898 138.36  42.50 134.00  136.96 43.00  9.00
## density                   8 4898   0.99   0.00   0.99    0.99  0.00  0.99
## pH                        9 4898   3.19   0.15   3.18    3.18  0.15  2.72
## sulphates                10 4898   0.49   0.11   0.47    0.48  0.10  0.22
## alcohol                  11 4898  10.51   1.23  10.40   10.43  1.48  8.00
## indice_alcohol_acidez    12 4898   1.56   0.29   1.51    1.54  0.27  0.78
## balance_azucar_acidez    13 4898  24.04  20.83  17.38   20.81 17.19  0.87
## indice_mineralidad       14 4898   0.54   0.12   0.52    0.53  0.11  0.24
## potencial_alcoholico     15 4898  10.45   1.20  10.32   10.37  1.39  7.95
## relacion_SO2             16 4898   0.25   0.09   0.25    0.25  0.09  0.02
## alcohol_2                17 4898 112.06  26.66 108.16  109.71 29.36 64.00
## density_2                18 4898   0.99   0.01   0.99    0.99  0.01  0.97
## sugar_2                  19 4898  66.57 106.82  27.04   48.26 37.58  0.36
## acidez_2                 20 4898  47.70  12.11  46.24   46.73 10.45 14.44
## alcohol_sulphates        21 4898   5.15   1.37   4.85    5.00  1.14  2.62
## density_sugar            22 4898   6.37   5.07   5.16    5.78  5.30  0.60
## acidez_pH                23 4898  21.80   2.42  21.56   21.69  2.27 13.92
## alcohol_acidez_volatil   24 4898   2.93   1.16   2.70    2.80  0.92  0.81
## quality                  25 4898   5.88   0.89   6.00    5.85  1.48  3.00
##                            max   range  skew kurtosis   se
## fixed_acidity            14.20   10.40  0.65     2.17 0.01
## volatile_acidity          1.10    1.02  1.58     5.08 0.00
## citric_acid               1.66    1.66  1.28     6.16 0.00
## residual_sugar           65.80   65.20  1.08     3.46 0.07
## chlorides                 0.35    0.34  5.02    37.51 0.00
## free_sulfur_dioxide     289.00  287.00  1.41    11.45 0.24
## total_sulfur_dioxide    440.00  431.00  0.39     0.57 0.61
## density                   1.04    0.05  0.98     9.79 0.00
## pH                        3.82    1.10  0.46     0.53 0.00
## sulphates                 1.08    0.86  0.98     1.59 0.00
## alcohol                  14.20    6.20  0.49    -0.70 0.02
## indice_alcohol_acidez     3.28    2.50  0.90     1.49 0.00
## balance_azucar_acidez   123.33  122.46  1.25     1.15 0.30
## indice_mineralidad        1.11    0.87  0.88     1.37 0.00
## potencial_alcoholico     14.03    6.08  0.49    -0.70 0.02
## relacion_SO2              0.71    0.68  0.38     0.56 0.00
## alcohol_2               201.64  137.64  0.67    -0.40 0.38
## density_2                 1.08    0.11  1.03    10.73 0.00
## sugar_2                4329.64 4329.28 14.14   519.82 1.53
## acidez_2                201.64  187.20  1.41     7.59 0.17
## alcohol_sulphates        13.12   10.50  1.36     3.15 0.02
## density_sugar            68.36   67.77  1.13     4.18 0.07
## acidez_pH                44.73   30.81  0.65     2.13 0.03
## alcohol_acidez_volatil   13.64   12.83  1.69     5.72 0.02
## quality                   9.00    6.00  0.16     0.21 0.01
## 
## $structure
## [1] "'data.frame':\t4898 obs. of  25 variables:\n $ fixed_acidity         : num  7 6.3 8.1 7.2 7.2 8.1 6.2 7 6.3 8.1 ...\n $ volatile_acidity      : num  0.27 0.3 0.28 0.23 0.23 0.28 0.32 0.27 0.3 0.22 ...\n $ citric_acid           : num  0.36 0.34 0.4 0.32 0.32 0.4 0.16 0.36 0.34 0.43 ...\n $ residual_sugar        : num  20.7 1.6 6.9 8.5 8.5 6.9 7 20.7 1.6 1.5 ...\n $ chlorides             : num  0.045 0.049 0.05 0.058 0.058 0.05 0.045 0.045 0.049 0.044 ...\n $ free_sulfur_dioxide   : num  45 14 30 47 47 30 30 45 14 28 ...\n $ total_sulfur_dioxide  : num  170 132 97 186 186 97 136 170 132 129 ...\n $ density               : num  1.001 0.994 0.995 0.996 0.996 ...\n $ pH                    : num  3 3.3 3.26 3.19 3.19 3.26 3.18 3 3.3 3.22 ...\n $ sulphates             : num  0.45 0.49 0.44 0.4 0.4 0.44 0.47 0.45 0.49 0.45 ...\n $ alcohol               : num  8.8 9.5 10.1 9.9 9.9 10.1 9.6 8.8 9.5 11 ...\n $ indice_alcohol_acidez : num  1.26 1.51 1.25 1.38 1.38 ...\n $ balance_azucar_acidez : num  73.93 5.16 23.79 35.42 35.42 ...\n $ indice_mineralidad    : num  0.495 0.539 0.49 0.458 0.458 0.49 0.515 0.495 0.539 0.494 ...\n $ potencial_alcoholico  : num  8.81 9.44 10.05 9.86 9.86 ...\n $ relacion_SO2          : num  0.263 0.105 0.306 0.251 0.251 ...\n $ alcohol_2             : num  77.4 90.2 102 98 98 ...\n $ density_2             : num  1.002 0.988 0.99 0.991 0.991 ...\n $ sugar_2               : num  428.49 2.56 47.61 72.25 72.25 ...\n $ acidez_2              : num  49 39.7 65.6 51.8 51.8 ...\n $ alcohol_sulphates     : num  3.96 4.66 4.44 3.96 3.96 ...\n $ density_sugar         : num  20.72 1.59 6.87 8.46 8.46 ...\n $ acidez_pH             : num  21 20.8 26.4 23 23 ...\n $ alcohol_acidez_volatil: num  2.38 2.85 2.83 2.28 2.28 ...\n $ quality               : num  6 6 6 6 6 6 6 6 6 6 ..."

Transformar los datos

Transformar los datos originales en datos estandarizados \(z=\frac{x_i - \mu}{\sigma}\)

datos_transformados <- f_estandarizar_escalar(datos)
## 
## ============================
## Transformación de datos
## ============================
## Variables numéricas transformadas: 25 
## Variables no numéricas preservadas: 0 
## Decimales aplicados: 4
datos_estandarizados <- datos_transformados$datos_estandarizados
f_visualizar_head_tail_reducido_word(datos_estandarizados)

fixed_acidity

volatile_acidity

citric_acid

residual_sugar

...

density_sugar

acidez_pH

alcohol_acidez_volatil

quality

0.1721

-0.0818

0.2133

2.8211

...

2.8291

-0.3302

-0.4809

0.1379

-0.6574

0.2159

0.048

-0.9447

...

-0.9412

-0.4168

-0.0723

0.1379

1.4756

0.0175

0.5438

0.1003

...

0.0986

1.8994

-0.0913

0.1379

0.4091

-0.4786

-0.1173

0.4157

...

0.4132

0.4815

-0.5662

0.1379

0.4091

-0.4786

-0.1173

0.4157

...

0.4132

0.4815

-0.5662

0.1379

1.4756

0.0175

0.5438

0.1003

...

0.0986

1.8994

-0.0913

0.1379

...

...

...

...

...

...

...

...

...

-0.4204

-0.4786

0.3785

-1.0038

...

-1.0002

-0.1714

-0.6059

-0.9913

-0.7759

-0.677

-0.3652

-0.9447

...

-0.9421

-0.6296

-0.5016

0.1379

-0.3019

0.4143

0.2133

0.3171

...

0.314

-0.4168

0.119

-0.9913

-0.4204

-0.3794

-1.1915

-1.0235

...

-1.0199

-0.9757

-0.5843

0.1379

-1.6054

0.1167

-0.2825

-1.0432

...

-1.0403

-1.4149

0.6707

1.267

-1.0129

-0.677

0.3785

-1.1024

...

-1.0986

-0.9241

-0.393

0.1379

Desarrollo

Particionar los datos en datos de entrenamiento y datos de validación

Se crean las particiones con el 70% para datos de entrenamiento y 30% para datos de validación. Se ejecuta la función f_particionar_datos() previamente preparada para crear estos dos conjuntos de datos a partir de los datos estandarizados.

Luego se presentan los primeros y últimos registros de los datos de entrenamiento y datos de validación al igual con las primeras y últimas cuatro variables.

particion <- f_particionar_datos(datos_estandarizados)

datos_entrenamiento <- particion$datos_entrenamiento
datos_validacion <- particion$datos_validacion

f_visualizar_head_tail_reducido_word(datos_entrenamiento)

fixed_acidity

volatile_acidity

citric_acid

residual_sugar

...

density_sugar

acidez_pH

alcohol_acidez_volatil

quality

-0.5389

-0.4786

0.1306

0.7706

...

0.7686

-0.4655

-0.705

-0.9913

0.7646

-0.3794

-0.1999

1.3227

...

1.3242

0.4431

-0.6464

0.1379

-0.4204

-0.2802

-0.5304

1.7367

...

1.7327

-0.4395

-0.3956

-0.9913

0.4091

0.6127

-0.2825

0.396

...

0.3968

1.3426

0.3138

-0.9913

-0.5389

1.0096

-1.1088

-0.2152

...

-0.2157

-0.4391

0.5828

0.1379

-0.5389

-0.5778

1.2875

0.2186

...

0.2158

-0.3599

-0.6136

0.1379

...

...

...

...

...

...

...

...

...

-0.1834

2.0017

1.2875

-0.6884

...

-0.6892

-0.3422

2.8497

0.1379

-0.0649

2.8946

-0.3652

-0.8264

...

-0.8237

0.3198

2.4825

-0.9913

0.2906

-1.0739

0.7917

-1.0038

...

-1.0008

0.1156

-0.8145

0.1379

-1.8425

3.0434

-2.183

0.1397

...

0.137

-1.6904

2.3623

0.1379

-0.3019

2.7954

-1.522

0.7115

...

0.7092

-0.063

2.0084

-0.9913

-1.3684

-0.9747

-0.6131

-0.8264

...

-0.8257

-1.7741

-0.6205

0.1379

f_visualizar_head_tail_reducido_word(datos_validacion)
## New names:
## New names:
## New names:
## • `...` -> `...5`

fixed_acidity

volatile_acidity

citric_acid

residual_sugar

...

density_sugar

acidez_pH

alcohol_acidez_volatil

quality

0.1721

-0.0818

0.2133

2.8211

...

2.8291

-0.3302

-0.4809

0.1379

-0.6574

0.2159

0.048

-0.9447

...

-0.9412

-0.4168

-0.0723

0.1379

-0.3019

-1.0739

0.3785

-0.9644

...

-0.9615

-0.1446

-0.8584

1.267

-0.6574

2.0017

-2.4309

-1.0432

...

-1.0394

-0.5727

1.443

0.1379

-0.7759

3.7875

1.2048

-1.0235

...

-1.0207

-0.4762

4.7529

2.3961

0.1721

-0.2802

-0.1173

0.5143

...

0.5111

0.3915

-0.2878

0.1379

...

...

...

...

...

...

...

...

...

-2.198

-0.7762

0.5438

-0.8855

...

-0.884

-2.0418

-0.4516

0.1379

-1.4869

-0.7762

0.2133

-0.7672

...

-0.7655

-0.9307

-0.805

0.1379

-2.198

-0.429

-0.5304

1.0565

...

1.0505

-2.6604

-0.6248

0.1379

-2.3165

1.9025

-1.3567

-0.8855

...

-0.8841

-2.3829

2.13

0.1379

-0.7759

1.3072

-0.9436

-0.8855

...

-0.8842

-1.2177

2.0653

1.267

-0.4204

-0.4786

0.3785

-1.0038

...

-1.0002

-0.1714

-0.6059

-0.9913

Modelo de SVR kernel lineal

Valores de epsilon iniciales, las variables independientes y dependientes

epsilon <- 0.3
v_dependiente <- "quality" 
v_independientes <- names(datos_entrenamiento)
v_independientes <- v_independientes[v_independientes != v_dependiente]

cat("Variables independientes:", "\n")
## Variables independientes:
paste(v_independientes)
##  [1] "fixed_acidity"          "volatile_acidity"       "citric_acid"           
##  [4] "residual_sugar"         "chlorides"              "free_sulfur_dioxide"   
##  [7] "total_sulfur_dioxide"   "density"                "pH"                    
## [10] "sulphates"              "alcohol"                "indice_alcohol_acidez" 
## [13] "balance_azucar_acidez"  "indice_mineralidad"     "potencial_alcoholico"  
## [16] "relacion_SO2"           "alcohol_2"              "density_2"             
## [19] "sugar_2"                "acidez_2"               "alcohol_sulphates"     
## [22] "density_sugar"          "acidez_pH"              "alcohol_acidez_volatil"
cat("\n", "Variable dependiente:\n")
## 
##  Variable dependiente:
paste(v_dependiente)  
## [1] "quality"

Se manda llamar la función f_crear_modelo_SVR_lineal().

modelo_SVR_lineal <- f_crear_modelo_SVR_lineal(
    datos_entrenamiento, 
    v_independientes, 
    v_dependiente, 
    epsilon = epsilon
)
## 
## =====================================
## MODELO SVR KERNEL LINEAL
## =====================================
## 
## FÓRMULA DEL MODELO:
## quality ~ fixed_acidity + volatile_acidity + citric_acid + residual_sugar + 
##     chlorides + free_sulfur_dioxide + total_sulfur_dioxide + 
##     density + pH + sulphates + alcohol + indice_alcohol_acidez + 
##     balance_azucar_acidez + indice_mineralidad + potencial_alcoholico + 
##     relacion_SO2 + alcohol_2 + density_2 + sugar_2 + acidez_2 + 
##     alcohol_sulphates + density_sugar + acidez_pH + alcohol_acidez_volatil
## <environment: 0x0000017a5afa9118>
## 
## GAMMA:
## [1] 0.04166667
## 
## EPSILON:
## [1] 0.3
## 
## COST:
## [1] 1
## 
## RHO (INTERCEPTO):
## [1] 0.031249
## [1] "Valor de b:"
## [1] -0.031249
## 
## NÚMERO VECTORES SOPORTE:
## [1] 2468

Modelo de SVR kernel polinomila grado 2 y 3

Kernel polinomial grado 2

Se manda llamar la función f_crear_modelo_SVR_polinomial() con el grado 2

modelo_SVR_polinomial_2 <- f_crear_modelo_SVR_polinomial(
    datos_entrenamiento, 
    v_independientes, 
    v_dependiente, 
    grado = 2,
    epsilon = epsilon
)
## 
## MODELO SVR KERNEL POLINOMIAL GRADO 2
## 
## FÓRMULA DEL MODELO:
## quality ~ fixed_acidity + volatile_acidity + citric_acid + residual_sugar + 
##     chlorides + free_sulfur_dioxide + total_sulfur_dioxide + 
##     density + pH + sulphates + alcohol + indice_alcohol_acidez + 
##     balance_azucar_acidez + indice_mineralidad + potencial_alcoholico + 
##     relacion_SO2 + alcohol_2 + density_2 + sugar_2 + acidez_2 + 
##     alcohol_sulphates + density_sugar + acidez_pH + alcohol_acidez_volatil
## <environment: 0x0000017a55f40c80>
## 
## KERNEL:
## [1] 1
## 
## GRADO POLINOMIAL:
## [1] 2
## 
## GAMMA:
## [1] 0.04166667
## 
## EPSILON:
## [1] 0.3
## 
## COST:
## [1] 1
## 
## RHO:
## [1] 0.01771851
## 
## INTERCEPTO REAL b:
## [1] -0.01771851
## 
## NÚMERO VECTORES SOPORTE:
## [1] 2422

Kernel polinomial grado 3

Se manda llamar la función f_crear_modelo_SVR_polinomial() con el grado 3.

modelo_SVR_polinomial_3 <- f_crear_modelo_SVR_polinomial(
    datos_entrenamiento, 
    v_independientes, 
    v_dependiente,
    grado = 3,
    epsilon = epsilon
)
## 
## MODELO SVR KERNEL POLINOMIAL GRADO 3
## 
## FÓRMULA DEL MODELO:
## quality ~ fixed_acidity + volatile_acidity + citric_acid + residual_sugar + 
##     chlorides + free_sulfur_dioxide + total_sulfur_dioxide + 
##     density + pH + sulphates + alcohol + indice_alcohol_acidez + 
##     balance_azucar_acidez + indice_mineralidad + potencial_alcoholico + 
##     relacion_SO2 + alcohol_2 + density_2 + sugar_2 + acidez_2 + 
##     alcohol_sulphates + density_sugar + acidez_pH + alcohol_acidez_volatil
## <environment: 0x0000017a563a7c78>
## 
## KERNEL:
## [1] 1
## 
## GRADO POLINOMIAL:
## [1] 3
## 
## GAMMA:
## [1] 0.04166667
## 
## EPSILON:
## [1] 0.3
## 
## COST:
## [1] 1
## 
## RHO:
## [1] 0.04132413
## 
## INTERCEPTO REAL b:
## [1] -0.04132413
## 
## NÚMERO VECTORES SOPORTE:
## [1] 2312

Kernel radial

Se manda llamar la función f_crear_modelo_SVR_radial().

modelo_SVR_radial <- f_crear_modelo_SVR_radial(
    datos_entrenamiento, 
    v_independientes, 
    v_dependiente,
    epsilon = epsilon
)
## 
## MODELO SVR KERNEL RADIAL
## 
## FÓRMULA DEL MODELO:
## quality ~ fixed_acidity + volatile_acidity + citric_acid + residual_sugar + 
##     chlorides + free_sulfur_dioxide + total_sulfur_dioxide + 
##     density + pH + sulphates + alcohol + indice_alcohol_acidez + 
##     balance_azucar_acidez + indice_mineralidad + potencial_alcoholico + 
##     relacion_SO2 + alcohol_2 + density_2 + sugar_2 + acidez_2 + 
##     alcohol_sulphates + density_sugar + acidez_pH + alcohol_acidez_volatil
## <environment: 0x0000017a56440388>
## 
## KERNEL:
## [1] 2
## 
## GAMMA:
## [1] 0.04166667
## 
## EPSILON:
## [1] 0.3
## 
## COST:
## [1] 1
## 
## RHO:
## [1] 0.4416716
## 
## INTERCEPTO REAL b:
## [1] -0.4416716
## 
## NÚMERO VECTORES SOPORTE:
## [1] 2352

Regresión lineal múltiple

Se manda llamar la función f_crear_modelo_SVR_radial().

modelo_RLM <- f_construir_modelo_RLM(
    datos_entrenamiento, 
    v_dependiente
)
## 
## ============================
## Modelo de Regresión Lineal Múltiple
## ============================
## Variable dependiente: quality 
## Número de observaciones: 3428 
## Número de variables independientes: 24 
## 
## Call:
## lm(formula = formula_modelo, data = datos_modelo)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7648 -0.5560 -0.0432  0.5007  3.6553 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             2.327e-03  1.411e-02   0.165 0.869001    
## fixed_acidity           1.808e+00  5.694e-01   3.174 0.001516 ** 
## volatile_acidity       -6.009e-01  1.352e-01  -4.443 9.16e-06 ***
## citric_acid             1.244e-02  1.513e-02   0.822 0.410968    
## residual_sugar         -3.658e+01  7.630e+00  -4.794 1.70e-06 ***
## chlorides              -9.240e+01  6.571e+01  -1.406 0.159769    
## free_sulfur_dioxide    -4.091e-01  5.485e-02  -7.459 1.10e-13 ***
## total_sulfur_dioxide    2.919e-01  3.861e-02   7.561 5.10e-14 ***
## density                 2.066e+00  1.614e+00   1.280 0.200581    
## pH                      1.048e-01  1.335e-01   0.785 0.432407    
## sulphates              -4.826e+02  3.433e+02  -1.406 0.159884    
## alcohol                -2.502e+01  9.173e+00  -2.727 0.006424 ** 
## indice_alcohol_acidez   6.186e-01  1.709e-01   3.620 0.000299 ***
## balance_azucar_acidez   1.719e-01  4.903e-02   3.505 0.000462 ***
## indice_mineralidad      4.929e+02  3.506e+02   1.406 0.159832    
## potencial_alcoholico    2.307e+01  8.649e+00   2.667 0.007694 ** 
## relacion_SO2            3.795e-01  4.388e-02   8.650  < 2e-16 ***
## alcohol_2               1.077e+00  4.245e-01   2.538 0.011193 *  
## density_2              -3.505e+00  1.624e+00  -2.158 0.030968 *  
## sugar_2                -4.196e-01  1.149e-01  -3.653 0.000263 ***
## acidez_2               -1.435e+00  3.002e-01  -4.780 1.83e-06 ***
## alcohol_sulphates       2.335e-02  1.358e-01   0.172 0.863529    
## density_sugar           3.746e+01  7.763e+00   4.826 1.46e-06 ***
## acidez_pH               1.199e-01  3.154e-01   0.380 0.703946    
## alcohol_acidez_volatil  4.828e-01  1.426e-01   3.386 0.000718 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8233 on 3403 degrees of freedom
## Multiple R-squared:  0.3251, Adjusted R-squared:  0.3203 
## F-statistic:  68.3 on 24 and 3403 DF,  p-value: < 2.2e-16

Validar modelos

Se validan los modelos verificando los postulados ejecutando la función f_validar_postulados_modelos().

Los resultados son académica y pedagógicamente hablando muy enriquecedores:

Primero, los postulados de regresión se aplican para modelos como regresión lineal múltiple no para modelos de soporte de regresión por la arquitectura y como se construyen los modelos.

Segundo, el modelo de regresión lineal múltiple para esos datos queda muy degenerado estadísicamente hablando dado que no cumple con ninguno de los postulados, seguramente hay muchas variables derivadas que corrompen en multicolinealidad.

Tercero: este caso de estudio trata primncipaemnte con modelos de m[quinas de soprite de regresión (SVR), de tal modo que estos modelos fueron diseñados para problemas de no linealidad, heterocedasticidad, alta dimensionalidad, colinealidad, entre otros; de tal forma que, las deficiencias del modelo de regresión lineal múltiple en relación a los postulados de regresión, son subsanadas por los modelos de soporte de regresión. FALTA CITA Vapnik, 1995; Smola & Schölkopf, 2004; James et al., 2021)

resultado_postulados <- f_validar_postulados_modelos(
    modelos = list(modelo_RLM, modelo_SVR_lineal, modelo_SVR_polinomial_2,
        modelo_SVR_polinomial_3, modelo_SVR_radial),
    
    datos_list = list(datos_validacion, datos_validacion, datos_validacion, 
                      datos_validacion, datos_validacion),
    
    variable_dependiente = v_dependiente,
    nombres = c("RLM", "SVR Lineal", "SVR Poly2", "SVR Poly3", "SVR Radial")
)
## 
## ============================
## Validación de Postulados
## ============================
##       Modelo Tipo   VIF_Max Linealidad Homocedasticidad Normalidad
## 1        RLM   lm 612207523  No cumple        No cumple  No cumple
## 2 SVR Lineal  svm        NA         NA               NA  No cumple
## 3  SVR Poly2  svm        NA         NA               NA  No cumple
## 4  SVR Poly3  svm        NA         NA               NA  No cumple
## 5 SVR Radial  svm        NA         NA               NA  No cumple
##   Independencia
## 1     No cumple
## 2        Cumple
## 3        Cumple
## 4        Cumple
## 5        Cumple

Evaluación de modelos

Se ejecuta la evaluación de los modelos mandando llamar la función f_evaluacion(), y los resultado arrojan algo interesante: el valor de R² ajustado realmente pertenece a: modelos lineales paramétricos como regresión lineal múltiple, no fue diseñado originalmente para modelos como SVR y otros como Random Forest, XGBoost y modelos avanzados de Deep Learning. **(James et al., 2021; Hastie, Tibshirani & Friedman, 2009; Kuhn & Johnson, 2013).

resultado_evaluacion <- f_evaluacion(
    modelos = list(modelo_SVR_lineal, modelo_SVR_polinomial_2, modelo_SVR_polinomial_3,
        modelo_SVR_radial, modelo_RLM),
    datos_validacion_list = list(datos_validacion, datos_validacion, datos_validacion,
        datos_validacion, datos_validacion),
    variable_dependiente = v_dependiente,
    nombres = c("SVR Lineal", "SVR Poly2", "SVR Poly3", "SVR Radial", "RLM")
)
## 
## ============================
## EVALUACIÓN DE MODELOS
## ============================
##       Modelo Tipo Parametros R_square R_square_ajustado    MSE   RMSE    MAE
## 1 SVR Lineal  svm       2468   0.3016                NA 0.7028 0.8383 0.6558
## 2  SVR Poly2  svm       2422   0.1863                NA 0.8189 0.9049 0.6756
## 3  SVR Poly3  svm       2312   0.1809                NA 0.8243 0.9079 0.6723
## 4 SVR Radial  svm       2352   0.3939                NA 0.6099 0.7810 0.6004
## 5        RLM   lm         24   0.3037            0.2921 0.7007 0.8371 0.6549

Visualizar predicciones de los modelos RMSE

Al ejecutar la función f_visualizar_RMSE() con los modelos de regresión construidos, se observa que el mejor modelo predictivo para estos datos resultó ser el modelo de regresión SVR kernel radial ya que tiene mayor valor en r square con valor de 0.3939 y se desvía menos en las predicciones con valor de RMSE aproximado de 0.7810.

f_visualizar_RMSE(modelos = list(modelo_SVR_lineal, modelo_SVR_polinomial_2,
        modelo_SVR_polinomial_3, modelo_SVR_radial, modelo_RLM
    ),
    
    datos = datos_validacion,
        variable_dependiente = "quality",
    nombres_modelos = c("SVR Lineal", "SVR Poly2", "SVR Poly3",
        "SVR Radial", "RLM"),
    ncol = 3
)

Interpretación