#base de datos COVID
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
COVID <- read.csv("COVID19MEXICO2022.csv")

Pregunta 1: Limpieza de Base de Datos en R

attach(COVID)
datos_originales<- data.frame(ENTIDAD_RES, INTUBADO, NEUMONIA, EDAD, ASMA, EPOC, FECHA_DEF)

#Creamos el dataframe con las variables relacionadas con el tema de interés
datos_originales<-na.omit(datos_originales)

#Eliminar los datos SIN valor

datos_lp <- datos_originales %>% # datos_lp = datos limpios

  mutate(Muerte = as.factor(ifelse(FECHA_DEF == "9999-99-99", "Vivo", "Muerto"))) %>%
  
  filter(ENTIDAD_RES == 19)%>% #FILTRAMOS PARA NUEVO LEÓN
  
#FILTRAMOS INTUBADO
    mutate(INTUBADO=as.factor(ifelse(INTUBADO=='1', 'Si',
                                  ifelse(INTUBADO=='2', 'No', "NA"))))%>%
  filter(INTUBADO%in%c("Si","No"))%>%  
  
#FILTRAMOS NEUMONIA
  mutate(NEUMONIA=as.factor(ifelse(NEUMONIA=='1', 'Si',
                                  ifelse(NEUMONIA=='2', 'No', "NA"))))%>%
  filter(NEUMONIA%in%c("Si","No"))%>%  
  
#EDAD
  mutate(EDAD=as.numeric(EDAD))%>% #SE CONVIERTE A NUMERICO
  
#FILTRAMOS EPOC
  mutate(EPOC=as.factor(ifelse(EPOC=='1', 'Si',
                                  ifelse(EPOC=='2', 'No', "NA"))))%>%
  filter(EPOC%in%c("Si","No"))%>%  
  
#FILTRAMOS ASMA
    mutate(ASMA=as.factor(ifelse(ASMA=='1', 'Si',
                                  ifelse(ASMA=='2', 'No', "NA"))))%>%
  filter(ASMA%in%c("Si","No"))  

Pregunta:

  1. Redacta un párrafo en el que describas brevemente los pasos que tomarás para limpiar la base de datos.

Para limpiar la base de datos relacionados con COVID-19 en el estado de Nuevo León, primero se identificaron las variables de interés: ENTIDAD_RES, INTUBADO, NEUMONIA, EDAD, ASMA, EPOC, y FECHA_DEF. Luego, e tuvo que eliminar las filas que contienen los datos sin ningun valor faltantes por lo que estas variables se eliminaron con la finalidad de que sean omitidas en el codigo correspondiente, na.omit(datos_originales). Posteriormente, creo un nuevo marco de datos datos_lp (que corresponde a la base de datos limpios) donde clasifico a los individuos como “Vivo” o “Muerto” según la variable FECHA_DEF, donde “9999-99-99” indica que la persona está viva. A continuación, se filtraron los datos para incluir solo los residentes de Nuevo León (ENTIDAD_RES == 19). Para las variables de interés sanitario en este trbado(INTUBADO, NEUMONIA, EPOC, ASMA) primeramente se aplico transformaciones para categorizarlas como “Si” o “No”, de acuerdo con los códigos realizados, además que se elimino aquellos registros que no tienen un valor válido (no “Si” ni “No”). Finalmente, se conviritip la variable EDAD a formato numérico para realizar un análisis posterior. Este proceso es crucial para que los datos sean coherentes y útiles con el objetivo de realizar un análisis específico con respecto al COVID-19 en Nuevo León.

  1. Muestra un resumen estadístico (summary) de la base de datos original y uno de la nueva base después de la limpieza.
#Base con los datos original
summary(datos_originales)
##   ENTIDAD_RES       INTUBADO        NEUMONIA           EDAD       
##  Min.   : 1.00   Min.   : 1.00   Min.   : 1.000   Min.   :  0.00  
##  1st Qu.: 9.00   1st Qu.:97.00   1st Qu.: 2.000   1st Qu.: 25.00  
##  Median :13.00   Median :97.00   Median : 2.000   Median : 36.00  
##  Mean   :14.75   Mean   :93.14   Mean   : 2.985   Mean   : 37.32  
##  3rd Qu.:21.00   3rd Qu.:97.00   3rd Qu.: 2.000   3rd Qu.: 49.00  
##  Max.   :32.00   Max.   :99.00   Max.   :99.000   Max.   :266.00  
##       ASMA             EPOC         FECHA_DEF        
##  Min.   : 1.000   Min.   : 1.000   Length:6451944    
##  1st Qu.: 2.000   1st Qu.: 2.000   Class :character  
##  Median : 2.000   Median : 2.000   Mode  :character  
##  Mean   : 2.354   Mean   : 2.369                     
##  3rd Qu.: 2.000   3rd Qu.: 2.000                     
##  Max.   :98.000   Max.   :98.000
#Base con los datos corregidos/limpios
summary(datos_lp)
##   ENTIDAD_RES INTUBADO   NEUMONIA        EDAD       ASMA       EPOC      
##  Min.   :19   NA:    0   No:22755   Min.   :  0.0   NA:    0   NA:    0  
##  1st Qu.:19   No:24557   Si: 2223   1st Qu.: 22.0   No:24588   No:24600  
##  Median :19   Si:  421              Median : 45.0   Si:  390   Si:  378  
##  Mean   :19                         Mean   : 43.2                        
##  3rd Qu.:19                         3rd Qu.: 65.0                        
##  Max.   :19                         Max.   :105.0                        
##   FECHA_DEF            Muerte     
##  Length:24978       Muerto: 3569  
##  Class :character   Vivo  :21409  
##  Mode  :character                 
##                                   
##                                   
## 

Pregunta 2: Regresión Logística

# Establecer una semilla para reproducibilidad -> CON MATRÍCULA PERSONAL (A01198531)
set.seed(01198531)

# Se tiene que dividir los datos en conjunto de entrenamiento Y calcular el tamaño del conjunto de entrenamiento 
trainIndex <- sample(1:nrow(datos_lp), 0.7 * nrow(datos_lp))

# Se tiene que crear el conjunto de entrenamiento seleccionando las filas correspondientes
trainSet <- datos_lp[trainIndex, ]

# Se tiene que crear  el conjunto de prueba excluyendo las filas del conjunto de entrenamiento
testSet <- datos_lp[-trainIndex, ]

# Se tiene que ajustar el modelo de regresión logística que nos pide, pero, solo con el conjunto de entrenamiento
glm.fit.train <- glm(Muerte ~ INTUBADO + NEUMONIA + EDAD + EPOC + ASMA, data = trainSet, family = binomial)

# Posteriormente se debe predecir las probabilidades en el conjunto de prueba
glm.probs.test <- predict(glm.fit.train, newdata = testSet, type = "response")

# Luego se convertira las probabilidades en etiquetas de clase en el conjunto de prueba
glm.pred.test <- rep("0", length(glm.probs.test))
glm.pred.test[glm.probs.test > 0.5] <- "1"

# Por último Generar y mostrar la matriz de confusión para el conjunto de prueba
tablaConfusionTest <- table(glm.pred.test, testSet$Muerte)
print(tablaConfusionTest)
##              
## glm.pred.test Muerto Vivo
##             0    172  108
##             1    926 6288
#checar precision 
precisionRF <- (tablaConfusionTest[1,1] + tablaConfusionTest[2,2]) / (tablaConfusionTest[1,1] + tablaConfusionTest[2,2] +tablaConfusionTest[1,2] + tablaConfusionTest[2,1])
precisionRF
## [1] 0.862023

Pregunta:

  1. ¿Que indica la matriz de confusión?, ¿cuál es la precisión del modelo?

La matriz de confusión indica como los modelos de clasificación como la regresión logística generada muestra cómo el modelo predice las etiquetas si una persona ha fallecido o no, en comparación con los valores reales en el conjunto de prueba.

Esta medida es de suma importancia de la capacidad del modelo para clasificar correctamente a los individuos según las variables predictoras utilizadas (INTUBADO, NEUMONIA, EDAD, EPOC, ASMA). La matriz de confusión y la precisión del modelo fue de 0.862023, estos son indicadores clave para evaluar su rendimiento en la predicción de la mortalidad en base a las características de los pacientes analizados.

Pregunta 3: Validación Cruzada

Instrucciones: Utiliza la misma variable objetivo que en la Pregunta 2. Implementa una validación cruzada k fold con k=5 para evaluar el modelo de regresión logística. Usa tu matrícula como semilla para asegurar la reproducibilidad.

#libreria BOOT
library (boot)

# LA SEMILLA CON LA MATRÍCULA CORRESPONDIENTE
set.seed(01198531)
cv.error.5<-rep(0,5)
for (i in 1:5) {
glm.fit<-glm(Muerte ~ INTUBADO + NEUMONIA + EDAD + EPOC + ASMA, datos_lp , family = binomial)
cv.error.5[i]<-cv.glm(datos_lp,glm.fit,K=15)$delta[1]
}
cv.error.5   #VALIDACIÓN CRUZADA K=5
## [1] 0.1024068 0.1024227 0.1024353 0.1024142 0.1024119
plot(cv.error.5)

Pregunta:

  1. Explica brevemente qué es la validación cruzada y por qué es útil. De acuerdo con Nelly Flores en su investigación Cross validation: qué es y su relación con machine learning, esta técnica es empleada en el machine learning con el objetivo de evaluar la variabilidad de los datos y la confiabilidad de cualquier modelo se utilice.

  2. Evaluación de las métricas de evaluación y explica los resultados.

Los valores de error promedio obtenidos de la validación cruzada k-fold son: 0.1024068, 0.1024227, 0.1024353, 0.1024142 y 0.1024119. Estos valores representan la tasa promedio de error cometida por el modelo en la predicción de la variable Muerte, utilizando diferentes subconjuntos de datos para entrenamiento y validación.

Error promedio: El promedio de los errores obtenidos indica que, en promedio, el modelo comete un error de aproximadamente 0.1024 en la clasificación de los casos de muerte versus supervivencia del covid 19. Es importante recalcar que los errores obtenidos son relativamente consistentes entre los diferentes folds de la validación cruzada. Los resultados de la validación cruzada indican que el modelo de regresión logística tiene una capacidad aceptable para predecir la variable Muerte basándose en las variables predictoras seleccionadas.

Pregunta 4: Ridge y Lasso

#Librerias correspondientes 
library(ISLR)
library(leaps)

x <- model.matrix(Muerte ~.,datos_lp) #model.matrix = MODELO DE LA MATRIX
x <- model.matrix(Muerte ~.,datos_lp)[ ,-1]
y <- datos_lp$Muerte 
#se definio el modelo como x y y 

RIDGE

library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.1-8
set.seed(01198531)
cv.ridge <- cv.glmnet(x, y, alpha = 0, family = "binomial")
plot(cv.ridge)

LASSO

library(glmnet)
set.seed(01198531)
cv.lasso <- cv.glmnet(x, y, alpha = 1, family = "binomial")
plot(cv.lasso)

Pregunta:

  1. Explica la diferencia entre Ridge y Lasso.

Ambas son técnicas de regularización que usualmente son empleadas en el aprendizaje automático para prevenir el sobreajuste y mejorar la generalización de los modelos. Ambas funcionan penalizando la complejidad del modelo, no obstante, lo hacen de diferentes maneras.

las característica de Ridge y Lasso: 1. Penalización: Ridge -> Suma de cuadrados, mientras Lasso -> Suma de valores absolutos 2. Interpretabilidad: Ridge -> Más interpretable, mientras Lasso -> Menos interpretable 3. Selección de variables: Ridge -> No explícita, mientras Lasso -> Explícita 4. Uso: Ridge -> Modelo interpretable con variables conocidas, mientras Lasso -> Modelo escaso con pocas variables

  1. Muestra las métricas de evaluación para ambos modelos en el conjunto de prueba.

El modelo Ridge se evaluó utilizando dos métricas principales: la devianza binomial y el área bajo la curva. La devianza binomial indica que el modelo predice las clases con precisión en el conjunto de prueba, por otro lado, el area bajo la curva muestra que el modelo tiene una buena capacidad para distinguir entre las clases positivas (vivo) y negativas(muerto). Por otro lado, el modelo Lasso fue evaluado en un problema de clasificación binaria utilizando dos métricas principales: devianza binomial y área bajo la curva ROC. Se observó una devianza binomial mínima de 0.4, que indica un rendimiento ligeramente inferior al modelo Ridge en el conjunto de prueba. El area bajo la curva de 0.7 sugiere que el modelo Lasso tiene una capacidad menor para discriminar entre clases positivas y negativas que el modelo Ridge.

Pregunta 5: Árbol de Clasificación

# Cargar la biblioteca TREE para hacer el abrol de clasificación
library(tree)

tree.MUERTE <- tree(Muerte ~ INTUBADO + NEUMONIA + EDAD + EPOC + ASMA, data = datos_lp) # Ajustar  árbol 
summary(tree.MUERTE )
## 
## Classification tree:
## tree(formula = Muerte ~ INTUBADO + NEUMONIA + EDAD + EPOC + ASMA, 
##     data = datos_lp)
## Variables actually used in tree construction:
## [1] "EDAD"     "NEUMONIA"
## Number of terminal nodes:  4 
## Residual mean deviance:  0.675 = 16860 / 24970 
## Misclassification error rate: 0.139 = 3471 / 24978
# Plot del árbol de decisión
plot(tree.MUERTE)
text(tree.MUERTE, pretty = 0)

# Dividir los datos en conjunto de entrenamiento y prueba
set.seed(01198531)
train <- sample(1:nrow(datos_lp), 200)
train_set <- datos_lp[train, ]
test_set <- datos_lp[-train, ]

# Ajustar el árbol  con el conjunto de entrenamiento
tree.MUERTE <- tree(Muerte ~ INTUBADO + NEUMONIA + EDAD + EPOC + ASMA, data = train_set)

# Realizar predicciones en el conjunto de prueba
tree.pred <- predict(tree.MUERTE, newdata = test_set, type = "class")

# Crear tabla de contingencia para evaluar las predicciones
table(tree.pred, test_set$Muerte)
##          
## tree.pred Muerto  Vivo
##    Muerto    427   651
##    Vivo     3119 20581

Pregunta:

  1. Explica brevemente cómo funciona un árbol de clasificación.

Un árbol de clasificación es esencial ya que es un algoritmo utilizado para la supervisación que divide recursivamente los datos en subconjuntos más pequeños basados en variables predictoras, buscando maximizar la ganancia de información en cada división. Una vez construido, clasifica nuevos ejemplos siguiendo las rutas desde la raíz hasta las hojas del árbol.

  1. Realiza el proceso de Bagging y muestra la importancia de las variables y las métricas de evaluación del modelo en el conjunto de prueba.

Bagging es una técnica para mejorar la precisión de modelos de clasificación entrenando múltiples modelos en subconjuntos aleatorios de datos y combinando sus predicciones. }

Las métricas del árbol de clasificación indican un buen rendimiento en el conjunto de prueba. La precisión alcanza el 86.8%, lo que significa que el modelo clasifica correctamente. Además, el árbol de clasificación es interpretable, facilitando la comprensión de cómo el modelo toma decisiones.