#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:
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.
#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:
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:
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.
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:
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
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:
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.
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.