La base de datos “Hitters” contiene información sobre 322 jugadores de béisbol y sus respectivas estadísticas de bateo y salario en la temporada 1986 y 1987. Cada fila representa a un jugador, y hay un total de 20 variables o columnas que describen diferentes características de cada jugador.
Las variables incluidas en la base de datos “Hitters” son:
Se requiere inicialmente disponer de los paquetes tidyverse, ISLR2, leaps.
tidyverse: Es una colección de paquetes diseñados para la ciencia de datos. Incluye paquetes populares como ggplot2 para visualización, dplyr para manipulación de datos, tidyr para limpieza de datos, entre otros.
ISLR2: Contiene conjuntos de datos utilizados en el libro “An Introduction to Statistical Learning with Applications in R” de Gareth James, Daniela Witten, Trevor Hastie y Robert Tibshirani.
leaps: Proporciona una función para realizar selección de variables.
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0 ✔ purrr 1.0.1
## ✔ tibble 3.1.8 ✔ dplyr 1.1.0
## ✔ tidyr 1.3.0 ✔ stringr 1.5.0
## ✔ readr 2.1.4 ✔ forcats 1.0.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(ISLR2)
library(leaps)
Se llama a la base de datos “Hitters”, esta se guarda en una varible llamada “datos”, luego con la función “na.omit()” se eliminan todas las filas que contienen valores NA por el impacto que pueden tener para el análisis de los datos.
datos <- tibble(na.omit(Hitters))
Se crea una nueva columna llamada “average” en la base de datos “datos”, que contiene la tasa de éxito de los bateadores en cada juego, calculada como el número de hits (Hits) dividido por el número de turnos al bate (AtBat).
datos <- datos %>% mutate(average = Hits/ AtBat)
Se elimina la fila número 173 de la base de datos “datos” debido a problema en los datos de esa fila.
datos <- datos[-173,]
Teniendo en cuenta estos pasos preliminares, se procede a realizar el metodo de selección de variables, para estos se emplearan los métodos forward y back.
El método consiste en realizar un análisis para seleccionar el conjunto óptimo de variables predictoras que pueden predecir la variable objetivo “Salary”, para eso se utiliza el siguiente codigo:
select_var1<- regsubsets(x = Salary ~ .,data = datos, nvmax = 19, nbest = 1, method = "forward")
Posteriormente se realiza un resumen a los resultados del análisis y se almacenan en un objeto llamado “resumen” y se crea un tibble que resume las medidas de ajuste del modelo para cada número de variables predictoras, desde 1 hasta 19. Las variables en la tibble incluyen el número de variables predictoras (nvar), el coeficiente de determinación (r2), el coeficiente de determinación ajustado (r2ajustado), el criterio de Mallow’s Cp (cp) y el criterio de información de Bayes (bic). Estas medidas de ajuste del modelo se utilizan para seleccionar la mejor cantidad de variables predictoras para el modelo de regresión.
resumen <- summary(select_var1)
tabla <- tibble(nvar = 1:19,
r2 = resumen$rsq,
r2ajustado = resumen$adjr2,
cp = resumen$cp,
bic = resumen$bic)
Primero, se filtran dos conjuntos de datos “f1” y “f2” utilizando la función “filter()” de “dplyr”. “f1” contiene la fila en la tabla donde el valor de r2 ajustado es máximo, mientras que “f2” contiene la fila en la tabla donde el valor de r2 es máximo.
Luego, se crean cuatro variables “f1_1”, “f1_2”, “f2_1”, “f2_2” que almacenan valores específicos de las filas seleccionadas en “f1” y “f2”.
Finalmente, se utiliza “ggplot()” para crear el gráfico. Se agregan varias capas al gráfico, como líneas y puntos utilizando “geom_line()” y “geom_point()”, respectivamente, para visualizar los valores de r2 y r2 ajustado en función del número de variables. También se agregan textos y etiquetas para resaltar los valores máximos de r2 y r2 ajustado y sus correspondientes números de variables.
f1 <- tabla %>% filter(r2ajustado == max(tabla$r2ajustado))
f2 <- tabla %>% filter(r2 == max(tabla$r2))
f1_1 <- f1$nvar
f1_2 <- f1$r2ajustado
f2_1 <- f2$nvar
f2_2 <- f2$r2
ggplot(f1, aes(x = f1_1, y = f1_2)) +
geom_line(tabla, mapping = aes(x = nvar, y = r2ajustado), color = "blue") +
geom_point(tabla, mapping = aes(x = nvar, y = r2ajustado), color = "red") +
geom_point(color = "black", size = 2) +
geom_text(data = f1, aes(x = f1_1, y = f1_2, label = paste("(", f1_1, ",", round(f1_2,3), ")")), vjust = -1, hjust = 0, size = 2) +
geom_line(tabla, mapping = aes(x = nvar, y = r2), color = "pink") +
geom_point(tabla, mapping = aes(x = nvar, y = r2), color = "orange") +
geom_point(f2, mapping = aes(f2_1, f2_2), color = "black", size = 2)+
geom_text(data = f2, aes(x = f2_1, y = f2_2, label = paste("(", f2_1, ",", round(f2_2,3), ")")), vjust = -1, hjust = 0, size = 2) +
labs(
title = "Comparación entre número de variables y el comportamiento de r2 vs r2ajustado",
subtitle = "Datos obtenidos por el método forward",
x = "Número de variables",
y = "Frecuencia"
)
#### \(CP\) vs \(BIC\)
Primero, se filtran dos conjuntos de datos “f3” y “f4” utilizando la función “filter()” de “dplyr”. “f1” contiene la fila en la tabla donde el valor de cp es minimo, mientras que “f2” contiene la fila en la tabla donde el valor de bic es minimo
Luego, se crean cuatro variables “f3_1”, “f3_2”, “f4_1”, “f4_2” que almacenan valores específicos de las filas seleccionadas en “f3” y “f4”.
Finalmente, se utiliza “ggplot()” para crear el gráfico. Se agregan varias capas al gráfico, como líneas y puntos utilizando “geom_line()” y “geom_point()”, respectivamente, para visualizar los valores de r2 y r2 ajustado en función del número de variables. También se agregan textos y etiquetas para resaltar los valores máximos de cp y bic y sus correspondientes números de variables.
f3 <- tabla %>% filter(cp == min(tabla$cp))
f4 <- tabla %>% filter(bic == min(tabla$bic))
f3_1 <- f3$nvar
f3_2 <- f3$cp
f4_1 <- f4$nvar
f4_2 <- f4$bic
ggplot(f3, aes(x = f3_1, y = f3_2)) +
geom_line(tabla, mapping = aes(x = nvar, y = cp), color = "purple") +
geom_point(tabla, mapping = aes(x = nvar, y = cp), color = "blue") +
geom_point(color = "black", size = 2) +
geom_text(data = f3, aes(x = f3_1, y = f3_2, label = paste("(", f3_1, ",", round(f3_2,3), ")")), vjust = -1, hjust = 0, size = 2) +
geom_line(tabla, mapping = aes(x = nvar, y = bic), color = "brown") +
geom_point(tabla, mapping = aes(x = nvar, y = bic), color = "red") +
geom_point(f4, mapping = aes(f4_1, f4_2), color = "black", size = 2)+
geom_text(data = f4, aes(x = f4_1, y = f4_2, label = paste("(", f4_1, ",", round(f4_2,3), ")")), vjust = -1, hjust = 0, size = 2) +
labs(
title = "Comparación entre número de variables y el comportamiento de cp vs bic",
subtitle = "Datos obtenidos por el método forward",
x = "Número de variables",
y = "Frecuencia"
)
El método consiste en realizar un análisis para seleccionar el conjunto óptimo de variables predictoras que pueden predecir la variable objetivo “Salary”, para eso se utiliza el siguiente codigo:
select_var2 <- regsubsets(x = Salary ~ ., data = datos, nvmax = 19, nbest = 1, method = "back")
Posteriormente se realiza un resumen a los resultados del análisis y se almacenan en un objeto llamado “resumen_1” y se crea un tibble que resume las medidas de ajuste del modelo para cada número de variables predictoras, desde 1 hasta 19. Las variables en la tibble incluyen el número de variables predictoras (nvar), el coeficiente de determinación (r2), el coeficiente de determinación ajustado (r2ajustado), el criterio de Mallow’s Cp (cp) y el criterio de información de Bayes (bic). Estas medidas de ajuste del modelo se utilizan para seleccionar la mejor cantidad de variables predictoras para el modelo de regresión.
resumen_1 <- summary(select_var2)
tabla_2 <- tibble(nvar = 1:19,
r2_2 = resumen_1$rsq,
r2ajustado_2 = resumen_1$adjr2,
cp_2 = resumen_1$cp,
bic_2 = resumen_1$bic)
Primero, se filtran dos conjuntos de datos “f5” y “f6” utilizando la función “filter()” de “dplyr”. “f5” contiene la fila en la tabla donde el valor de r2 ajustado es máximo, mientras que “f6” contiene la fila en la tabla donde el valor de r2 es máximo.
Luego, se crean cuatro variables “f5_1”, “f5_2”, “f6_1”, “f6_2” que almacenan valores específicos de las filas seleccionadas en “f5” y “f6”.
Finalmente, se utiliza “ggplot()” para crear el gráfico. Se agregan varias capas al gráfico, como líneas y puntos utilizando “geom_line()” y “geom_point()”, respectivamente, para visualizar los valores de r2 y r2 ajustado en función del número de variables. También se agregan textos y etiquetas para resaltar los valores máximos de r2 y r2 ajustado y sus correspondientes números de variables.
f5 <- tabla_2 %>% filter(r2ajustado_2 == max(tabla_2$r2ajustado_2))
f6 <- tabla_2 %>% filter(r2_2 == max(tabla_2$r2_2))
f5_1 <- f5$nvar
f5_2 <- f5$r2ajustado_2
f6_1 <- f6$nvar
f6_2 <- f6$r2_2
ggplot(f5, aes(x = f5_1, y = f5_2)) +
geom_line(tabla_2, mapping = aes(x = nvar, y = r2ajustado_2), color = "blue") +
geom_point(tabla_2, mapping = aes(x = nvar, y = r2ajustado_2), color = "red") +
geom_point(color = "black", size = 2) +
geom_text(data = f5, aes(x = f5_1, y = f5_2, label = paste("(", f5_1, ",", round(f5_2,2), ")")), vjust = -1, hjust = 0, size = 2) +
geom_line(tabla_2, mapping = aes(x = nvar, y = r2_2), color = "pink") +
geom_point(tabla_2, mapping = aes(x = nvar, y = r2_2), color = "orange") +
geom_point(f6, mapping = aes(f6_1, f6_2), color = "black", size = 2)+
geom_text(data = f6, aes(x = f6_1, y = f6_2, label = paste("(", f6_1, ",", round(f6_2,2), ")")), vjust = -1, hjust = 0, size = 2) +
labs(
title = "Comparación entre número de variables y el comportamiento de r2 vs r2ajustado",
subtitle = "Datos obtenidos por el método back",
x = "Número de variables",
y = "Frecuencia"
)
#### \(CP\) vs \(BIC\)
Primero, se filtran dos conjuntos de datos “f7” y “f8” utilizando la función “filter()” de “dplyr”. “f7” contiene la fila en la tabla donde el valor de cp es minimo, mientras que “f8” contiene la fila en la tabla donde el valor de bic es minimo
Luego, se crean cuatro variables “f7_1”, “f7_2”, “f8_1”, “f8_2” que almacenan valores específicos de las filas seleccionadas en “f7” y “f8”.
Finalmente, se utiliza “ggplot()” para crear el gráfico. Se agregan varias capas al gráfico, como líneas y puntos utilizando “geom_line()” y “geom_point()”, respectivamente, para visualizar los valores de cp y bic en función del número de variables. También se agregan textos y etiquetas para resaltar los valores minimos de cp y bic y sus correspondientes números de variables.
f7 <- tabla_2 %>% filter(cp_2 == min(tabla_2$cp_2))
f8 <- tabla_2 %>% filter(bic_2 == min(tabla_2$bic_2))
f7_1 <- f7$nvar
f7_2 <- f7$cp_2
f8_1 <- f8$nvar
f8_2 <- f8$bic_2
ggplot(f7, aes(x = f7_1, y = f7_2)) +
geom_line(tabla_2, mapping = aes(x = nvar, y = cp_2), color = "purple") +
geom_point(tabla_2, mapping = aes(x = nvar, y = cp_2), color = "blue") +
geom_point(color = "black", size = 2) +
geom_text(data = f7, aes(x = f7_1, y = f7_2, label = paste("(", f7_1, ",", round(f7_2,2), ")")), vjust = -1, hjust = 0, size = 2) +
geom_line(tabla_2, mapping = aes(x = nvar, y = bic_2), color = "brown") +
geom_point(tabla_2, mapping = aes(x = nvar, y = bic_2), color = "red") +
geom_point(f8, mapping = aes(f8_1, f8_2), color = "black", size = 2)+
geom_text(data = f8, aes(x = f8_1, y = f8_2, label = paste("(", f8_1, ",", round(f8_2,2), ")")), vjust = -1, hjust = 0, size = 2) +
labs(
title = "Comparación entre número de variables y el comportamiento de cp vs bic",
subtitle = "Datos obtenidos por el método back",
x = "Número de variables",
y = "Frecuencia"
)