Librerías utilizadas

Se utilizarán las siguientes librerias durante el estudio:

library(httr)
library(ggplot2)
library(gridExtra)
library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:httr':
## 
##     progress
library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
library(tree)
library(C50)
library(MultBiplotR)
library(corrplot)
## corrplot 0.92 loaded
library(tree)
library(DMwR2)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(ROSE)
## Loaded ROSE 0.0-4
library(ggmosaic)
## 
## Attaching package: 'ggmosaic'
## The following object is masked from 'package:GGally':
## 
##     happy
library("xgboost")
library(gbm)
## Loaded gbm 2.1.9
## This version of gbm is no longer under development. Consider transitioning to gbm3, https://github.com/gbm-developers/gbm3
library(e1071)
library(class)
library(caret)
library(ROCR)
library(kernlab)
## 
## Attaching package: 'kernlab'
## The following object is masked from 'package:ggplot2':
## 
##     alpha
library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.1-8
library(naivebayes)
## naivebayes 1.0.0 loaded
## For more information please visit:
## https://majkamichal.github.io/naivebayes/
library(ranger)
library(cluster)
library(coin)
## Loading required package: survival
## 
## Attaching package: 'survival'
## The following object is masked from 'package:caret':
## 
##     cluster
## 
## Attaching package: 'coin'
## The following object is masked from 'package:kernlab':
## 
##     size
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:MultBiplotR':
## 
##     logit

Preparación de la base de datos

Para mejorar la limpieza de salida durante la ejecución, desactivo las advertencias y mensajes en R.

Para inspeccionar las primeras filas y comprender la estructura de los datos, importo mi conjunto de datos relacionado con la predicción de accidentes cerebrovasculares que obtuve de Kaggle desde un archivo CSV y luego lo visualizo en un formato tabular.

Posteriormente, elimino la primera columna que corresponde al id de los pacientes con los que no trabajaré para garantizar la integridad del conjunto de datos, así como las filas que contienen valores faltantes (NA). Además de convertir las columnas de tipo entero a tipo numérico, cambié los nombres de las columnas para que sean más fáciles de leer. Y posteriormente recodifiqué las variables categóricas: -variable género : 1 <- Male, 2 <- Female, 3<- Other -variable “casado_alguna_vez”: 0<- No, 1<- Yes -variable tipo_trabajo , 1<- children, 2 <- Govt_jov, 3<- Never_worked, 4<- Private, 5<- Self-employed usa -variable tipo_residencia, 1<- Rural, 2<- Urban -variable fumador, 1<- formerly smoked, 2<- never smoked, 3<- smokes, 4<- Unknown

Los tipos de datos de cada columna se muestran a continuación, seguido de la identificación y visualización de las filas con valores faltantes.

Por último visualizo la base de datos final

warning = FALSE
message = FALSE
library(readr)
Datastroke <- read_csv("C:/Users/cloar/OneDrive - Universidad de Salamanca/Desktop/UNI/TFG!!!!!!!!!!! VAAAAAAAAAAAAMOSSSSS ESTO SE ACABAAAAAAAAAAAAA/mi base de datos y codigos/healthcare-dataset-stroke-data.csv")
## Rows: 5110 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (6): gender, ever_married, work_type, Residence_type, bmi, smoking_status
## dbl (6): id, age, hypertension, heart_disease, avg_glucose_level, stroke
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(Datastroke)
summary(Datastroke)
##        id           gender               age         hypertension    
##  Min.   :   67   Length:5110        Min.   : 0.08   Min.   :0.00000  
##  1st Qu.:17741   Class :character   1st Qu.:25.00   1st Qu.:0.00000  
##  Median :36932   Mode  :character   Median :45.00   Median :0.00000  
##  Mean   :36518                      Mean   :43.23   Mean   :0.09746  
##  3rd Qu.:54682                      3rd Qu.:61.00   3rd Qu.:0.00000  
##  Max.   :72940                      Max.   :82.00   Max.   :1.00000  
##  heart_disease     ever_married        work_type         Residence_type    
##  Min.   :0.00000   Length:5110        Length:5110        Length:5110       
##  1st Qu.:0.00000   Class :character   Class :character   Class :character  
##  Median :0.00000   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :0.05401                                                           
##  3rd Qu.:0.00000                                                           
##  Max.   :1.00000                                                           
##  avg_glucose_level     bmi            smoking_status         stroke       
##  Min.   : 55.12    Length:5110        Length:5110        Min.   :0.00000  
##  1st Qu.: 77.25    Class :character   Class :character   1st Qu.:0.00000  
##  Median : 91.89    Mode  :character   Mode  :character   Median :0.00000  
##  Mean   :106.15                                          Mean   :0.04873  
##  3rd Qu.:114.09                                          3rd Qu.:0.00000  
##  Max.   :271.74                                          Max.   :1.00000
# Contar el número de filas con valores faltantes en cualquier variable
num_filas_con_na <- sum(!complete.cases(Datastroke))
print(num_filas_con_na)
## [1] 0
names <- colnames(Datastroke)
Datastroke <- Datastroke[, -1]
colnames(Datastroke) <- c("género","edad","hipertensión","enfermedades_vasculares","casado_alguna_vez", "tipo_trabajo", "tipo_residencia", "nivel_glucosa", "IMC","fumador","infarto")
# Transformar la variable "género"
Datastroke$género <- factor(Datastroke$"género", levels = c("Male", "Female", "Other"), labels = c(1, 2, 3))

# Transformar la variable "casado_alguna_vez"
Datastroke$"casado_alguna_vez" <- factor(Datastroke$"casado_alguna_vez", levels = c("No", "Yes"), labels = c(0, 1))
# Transformar la variable "tipo_trabajo"
Datastroke$"tipo_trabajo" <- factor(Datastroke$"tipo_trabajo", levels = c("children", "Govt_job", "Never_worked", "Private", "Self-employed"), labels = c(1, 2, 3, 4, 5))

# Transformar la variable "tipo_residencia"
Datastroke$"tipo_residencia" <- factor(Datastroke$"tipo_residencia", levels = c("Rural", "Urban"), labels = c(1, 2))

# Transformar la variable "hipertensión"
Datastroke$hipertensión <- as.factor(Datastroke$hipertensión)


# Transformar la variable "enfermedades_vasculares "
Datastroke$enfermedades_vasculares <- as.factor(Datastroke$enfermedades_vasculares)


# Transformar la variable "fumador"
Datastroke$"fumador" <- factor(Datastroke$"fumador", levels = c("formerly smoked", "never smoked", "smokes", "Unknown"), labels = c(1, 2, 3, 4))


# Transformar la variable "IMC" a numérica
Datastroke$IMC <- as.numeric(as.character(Datastroke$IMC))
## Warning: NAs introducidos por coerción
# Convierto la variable infarto en un factor
infarto <- as.factor(Datastroke$infarto)
Datastroke$infarto <- infarto
summary(Datastroke)
##  género        edad       hipertensión enfermedades_vasculares
##  1:2115   Min.   : 0.08   0:4612       0:4834                 
##  2:2994   1st Qu.:25.00   1: 498       1: 276                 
##  3:   1   Median :45.00                                       
##           Mean   :43.23                                       
##           3rd Qu.:61.00                                       
##           Max.   :82.00                                       
##                                                               
##  casado_alguna_vez tipo_trabajo tipo_residencia nivel_glucosa   
##  0:1757            1: 687       1:2514          Min.   : 55.12  
##  1:3353            2: 657       2:2596          1st Qu.: 77.25  
##                    3:  22                       Median : 91.89  
##                    4:2925                       Mean   :106.15  
##                    5: 819                       3rd Qu.:114.09  
##                                                 Max.   :271.74  
##                                                                 
##       IMC        fumador  infarto 
##  Min.   :10.30   1: 885   0:4861  
##  1st Qu.:23.50   2:1892   1: 249  
##  Median :28.10   3: 789           
##  Mean   :28.89   4:1544           
##  3rd Qu.:33.10                    
##  Max.   :97.60                    
##  NA's   :201

Eliminar 3 de género al ser solo un individuo y no lo considero relevante para mi estudio posterior

# Eliminar filas donde género es igual a 3
Datastroke <- subset(Datastroke, género != 3)
# Eliminar la categoría 3 en la variable "género"
Datastroke <- Datastroke[Datastroke$género != 3, ]
Datastroke$género <- factor(Datastroke$"género", labels = c(1, 2))

Imputación de datos faltantes usando KNN

# Contar el número de filas con valores faltantes en cualquier variable
num_filas_con_na <- sum(!complete.cases(Datastroke))
print(num_filas_con_na)
## [1] 201
# Contar el número de filas con valores NA en la variable "IMC"
num_na <- sum(is.na(Datastroke$'IMC'))

# Imprimir el resultado
print(num_na)
## [1] 201
# Filtrar y ver solo las filas con valores NA en "IMC"
filas_na_IMC <- subset(Datastroke, is.na(IMC))
View(filas_na_IMC)
summary(filas_na_IMC)
##  género       edad       hipertensión enfermedades_vasculares casado_alguna_vez
##  1:104   Min.   : 0.48   0:154        0:168                   0: 52            
##  2: 97   1st Qu.:37.00   1: 47        1: 33                   1:149            
##          Median :58.00                                                         
##          Mean   :52.05                                                         
##          3rd Qu.:71.00                                                         
##          Max.   :82.00                                                         
##                                                                                
##  tipo_trabajo tipo_residencia nivel_glucosa         IMC      fumador infarto
##  1: 16        1: 95           Min.   : 57.52   Min.   : NA   1:48    0:161  
##  2: 27        2:106           1st Qu.: 81.43   1st Qu.: NA   2:40    1: 40  
##  3:  0                        Median : 99.87   Median : NA   3:52           
##  4:114                        Mean   :126.72   Mean   :NaN   4:61           
##  5: 44                        3rd Qu.:191.79   3rd Qu.: NA                  
##                               Max.   :260.85   Max.   : NA                  
##                                                NA's   :201
# Imputar valores faltantes en todas las variables predictoras, incluyendo IMC
Datastroke <- knnImputation(Datastroke)
View(Datastroke)
summary(Datastroke)
##  género        edad       hipertensión enfermedades_vasculares
##  1:2115   Min.   : 0.08   0:4611       0:4833                 
##  2:2994   1st Qu.:25.00   1: 498       1: 276                 
##           Median :45.00                                       
##           Mean   :43.23                                       
##           3rd Qu.:61.00                                       
##           Max.   :82.00                                       
##  casado_alguna_vez tipo_trabajo tipo_residencia nivel_glucosa   
##  0:1756            1: 687       1:2513          Min.   : 55.12  
##  1:3353            2: 657       2:2596          1st Qu.: 77.24  
##                    3:  22                       Median : 91.88  
##                    4:2924                       Mean   :106.14  
##                    5: 819                       3rd Qu.:114.09  
##                                                 Max.   :271.74  
##       IMC        fumador  infarto 
##  Min.   :10.30   1: 884   0:4860  
##  1st Qu.:23.70   2:1892   1: 249  
##  Median :28.30   3: 789           
##  Mean   :28.95   4:1544           
##  3rd Qu.:33.10                    
##  Max.   :97.60
# Contar el número de filas con valores faltantes en cualquier variable
num_filas_con_na <- sum(!complete.cases(Datastroke))
print(num_filas_con_na)
## [1] 0
# Contar el número de filas con valores NA en la variable "IMC"
num_na <- sum(is.na(Datastroke$'IMC'))

# Imprimir el resultado
print(num_na)
## [1] 0

GUARDO LA BASE DE DATOS PREPROCESADA

#Guardo la base de datos final, que usaré en mi estudio como un .rda
save(Datastroke, file = "Datastroke_preprocesada.rda")
summary(Datastroke)
##  género        edad       hipertensión enfermedades_vasculares
##  1:2115   Min.   : 0.08   0:4611       0:4833                 
##  2:2994   1st Qu.:25.00   1: 498       1: 276                 
##           Median :45.00                                       
##           Mean   :43.23                                       
##           3rd Qu.:61.00                                       
##           Max.   :82.00                                       
##  casado_alguna_vez tipo_trabajo tipo_residencia nivel_glucosa   
##  0:1756            1: 687       1:2513          Min.   : 55.12  
##  1:3353            2: 657       2:2596          1st Qu.: 77.24  
##                    3:  22                       Median : 91.88  
##                    4:2924                       Mean   :106.14  
##                    5: 819                       3rd Qu.:114.09  
##                                                 Max.   :271.74  
##       IMC        fumador  infarto 
##  Min.   :10.30   1: 884   0:4860  
##  1st Qu.:23.70   2:1892   1: 249  
##  Median :28.30   3: 789           
##  Mean   :28.95   4:1544           
##  3rd Qu.:33.10                    
##  Max.   :97.60
View(Datastroke)

ANÁLISIS EXPLORATORIO

Distribución de variables numéricas

# Distribución de variables numéricas
par(bg = "#f2f2f2")  # Establece el color de fondo
hist(Datastroke$edad, main = "Distribución de Edad", xlab = "Edad", col = "#66c2a5", border = "#333333")

hist(Datastroke$nivel_glucosa, main = "Distribución de Nivel de Glucosa", xlab = "Nivel de Glucosa", col = "#fc8d62", border = "#333333")

hist(Datastroke$IMC, main = "Distribución de IMC", xlab = "IMC", col = "#8da0cb", border = "#333333")

##. Los individuos de nuestra base de datos tienen una amplia gama de edad, desde los bebés hasta los adultos mayores, con una edad mínima de 0,08 años y una edad máxima de 82 años. Sin embargo, los datos de cuartiles muestran que la mayoría de las personas se concentran en la franja de edad entre los 25 y 60 años.

Se observa una variabilidad significativa en los niveles de glucosa en sangre, con valores mínimos de 55.12 hasta valores máximos de 271.74. La mayoría de las personas tienen niveles de glucosa entre el primer y el tercer cuartil, entre 77.07 y 113.50, aunque la distribución tiende a sesgarse hacia valores más altos.

Por último, pero no menos importante, el índice de masa corporal (IMC), una medida del peso relativo en relación con la altura, muestra una distribución más equilibrada en comparación con las variables anteriores. La mayoría de las personas tienen un IMC entre 23.50 y 33.10, aunque los valores varían desde 10.30 hasta 97.60, lo que indica una concentración en el rango de sobrepeso a obesidad, con algunos valores atípicos en el extremo superior.

Relación entre variables numéricas y respuesta

# Relación entre variables numéricas y respuesta
# Gráfico de cajas para la variable edad vs. infarto
boxplot(edad ~ infarto, data = Datastroke, main = "Edad vs Infarto", 
        xlab = "Infarto", ylab = "Edad", col = c("skyblue", "salmon"), border = "gray")

# Gráfico de cajas para la variable nivel_glucosa vs. infarto
boxplot(nivel_glucosa ~ infarto, data = Datastroke, main = "Nivel de Glucosa vs Infarto", 
        xlab = "Infarto", ylab = "Nivel de Glucosa", col = c("skyblue", "salmon"), border = "gray")

# Gráfico de cajas para la variable IMC vs. infarto
boxplot(IMC ~ infarto, data = Datastroke, main = "IMC vs Infarto", 
        xlab = "Infarto", ylab = "IMC", col = c("skyblue", "salmon"), border = "gray")

##.

En el caso de los boxplot de Edad vs Infarto podemos ver como claramente hay una diferencia respecto a la edad de aquellos que sufren o no un infarto, estando el 50% de los individuos que no han sufrido un infarto entre los 25 y casi 60 años mientras que la mitad de los individuos que sí han sufrido un infarto tienen una edad entre 60 y 80 años, no vemos ningún valor atípico señalizado por puntos.

En cuanto a la relación entre el nivel de glucosa y la variable respuesta vemos una gran diferencia en cuanto a la variabilidad, habiendo mucha más variabilidad en los valores de nivel de glucosa de los pacientes que sí han sufrido un infarto frente a los que no, que se agrupan en valores mucho más bajos la mayoría. Sin embargo, debemos destacar la señalización de varios valores atípicos en valores altos de nivel de glucosa dentro del grupo de individuos que no han sufrido un infarto.

Visualizando el boxplot referente al a relación entre el IMC y la variable respuesta vemos que no podemos sacar ninguna conclusión significativa que diferencia a los pacientes que han sufrido infartos de los que no, puesto que la mayoría se engloban en los mismos valores de IMC (valores bajos) habiendo por supuesto excepciones e individuos con valores a típicos más altos representados como círculos.

Distribución de variables categóricas

# Distribución de variables categóricas
barplot(table(Datastroke$género), main = "Distribución de Género", col = rainbow(length(unique(Datastroke$género))))

barplot(table(Datastroke$hipertensión), main = "Distribución de Hipertensión", col = rainbow(length(unique(Datastroke$hipertensión))))

barplot(table(Datastroke$enfermedades_vasculares), main = "Distribución de Enfermedades Vasculares", col = rainbow(length(unique(Datastroke$enfermedades_vasculares))))

barplot(table(Datastroke$casado_alguna_vez), main = "Distribución de Casado alguna vez", col = rainbow(length(unique(Datastroke$casado_alguna_vez))))

barplot(table(Datastroke$tipo_trabajo), main = "Distribución de Tipo de Trabajo", col = rainbow(length(unique(Datastroke$tipo_trabajo))))

barplot(table(Datastroke$tipo_residencia), main = "Distribución de Tipo de Residencia", col = rainbow(length(unique(Datastroke$tipo_residencia))))

barplot(table(Datastroke$fumador), main = "Distribución de Fumador", col = rainbow(length(unique(Datastroke$fumador))))

##. Con 2011 y 2897 observaciones, el género de las personas de nuestra base de datos muestra una distribución bastante equilibrada entre las categorías masculina y femenina.

La variable de hipertensión muestra si una persona tiene o no hipertensión, con una gran mayoría de personas (4457 observaciones) que no tienen hipertensión en comparación con 451 que sí la tienen.

La mayoría de las personas (4665 observaciones) no tienen enfermedades vasculares, mientras que 243 sí.

La variable que indica si las personas han estado casadas alguna vez muestra una proporción mayoritaria de personas casadas en comparación con personas sin casarse, con 3204 observaciones frente a 1704.

En cuanto a la distribución del tipo de trabajo vemos como la mayor parte de nuestra población se dedica al sector privado (2810 individuos) mientras que el caso menos común es el de las personas que nunca han trabajado (22 individuos).

Podemos ver como las dos categorías de la variable tipo de residencia están prácticamente igualadas, podemos asumir que esta variable actúa como una variable control.

Fijándonos en la variable fumador podemos ver dos categorías muy igualas, sorprendetemente son las que corresponden a fumaba antes y fuma actualmente, sin embargo la más comñun entre nuestros individuos es nunca ha fumado.

Gráficos de mosaico

Los gráficos de mosaico muestran las relaciones entre las variables categóricas. Para mostrar la proporción de cada combinación de categorías, utilizan rectángulos. Son útiles para encontrar patrones y asociaciones en los datos. Estos gráficos me ayudan a entender cómo las diferentes categorías de las variables cualitativas están relacionadas con la ocurrencia de infartos.

q1<-ggplot(data=Datastroke)+
  geom_mosaic(aes(x=product(infarto, género), fill=infarto)) +
  labs(title = "Relación entre Género e Infarto")
q1
## Warning: The `scale_name` argument of `continuous_scale()` is deprecated as of ggplot2
## 3.5.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `trans` argument of `continuous_scale()` is deprecated as of ggplot2 3.5.0.
## ℹ Please use the `transform` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `unite_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `unite()` instead.
## ℹ The deprecated feature was likely used in the ggmosaic package.
##   Please report the issue at <https://github.com/haleyjeppson/ggmosaic>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

q2<-ggplot(data=Datastroke)+
  geom_mosaic(aes(x=product(infarto, hipertensión), fill=infarto)) +
  labs(title = "Relación entre hipertensión e Infarto")
q2

q3<-ggplot(data=Datastroke)+
  geom_mosaic(aes(x=product(infarto, enfermedades_vasculares), fill=infarto)) +
  labs(title = "Relación entre enfermedades_vasculares e Infarto")
q3

q4<-ggplot(data=Datastroke)+
  geom_mosaic(aes(x=product(infarto, casado_alguna_vez), fill=infarto)) +
  labs(title = "Relación entre casado_alguna_vez e Infarto")
q4

q5<-ggplot(data=Datastroke)+
  geom_mosaic(aes(x=product(infarto, tipo_trabajo), fill=infarto)) +
  labs(title = "Relación entre tipo_trabajo e Infarto")
q5

q6<-ggplot(data=Datastroke)+
  geom_mosaic(aes(x=product(infarto, tipo_residencia), fill=infarto)) +
  labs(title = "Relación entre tipo_residencia e Infarto")
q6

q7<-ggplot(data=Datastroke)+
  geom_mosaic(aes(x=product(infarto, fumador), fill=infarto)) +
  labs(title = "Relación entre fumador e Infarto")
q7

## Tablas de contingencia y pruebas de asociación para variables categóricas y respuesta

# Tablas de contingencia y pruebas de asociación para variables categóricas y respuesta

# Tabla de contingencia para género vs. infarto
table_gen_infarto <- table(Datastroke$género, Datastroke$infarto)
print("Tabla de contingencia para Género vs Infarto:")
## [1] "Tabla de contingencia para Género vs Infarto:"
print(table_gen_infarto)
##    
##        0    1
##   1 2007  108
##   2 2853  141
# Prueba de asociación - Prueba exacta de Fisher
#fisher.test(table_gen_infarto)

chisq.test(table_gen_infarto)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_gen_infarto
## X-squared = 0.34, df = 1, p-value = 0.5598
# Tabla de contingencia para hipertensión  vs. infarto
table_hip_infarto <- table(Datastroke$hipertensión , Datastroke$infarto)
print("Tabla de contingencia para hipertensión  vs Infarto:")
## [1] "Tabla de contingencia para hipertensión  vs Infarto:"
print(table_hip_infarto)
##    
##        0    1
##   0 4428  183
##   1  432   66
# Prueba de asociación - Prueba exacta de Fisher
#fisher.test(table_hip_infarto)

chisq.test(table_hip_infarto)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_hip_infarto
## X-squared = 81.573, df = 1, p-value < 2.2e-16
# Tabla de contingencia para enfermedades_vasculares   vs. infarto
table_enf_infarto <- table(Datastroke$enfermedades_vasculares  , Datastroke$infarto)
print("Tabla de contingencia para enfermedades vasculares   vs Infarto:")
## [1] "Tabla de contingencia para enfermedades vasculares   vs Infarto:"
print(table_enf_infarto)
##    
##        0    1
##   0 4631  202
##   1  229   47
# Prueba de asociación - Prueba exacta de Fisher
#fisher.test(table_enf_infarto)
chisq.test(table_enf_infarto)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_enf_infarto
## X-squared = 90.229, df = 1, p-value < 2.2e-16
# Tabla de contingencia para casado_alguna_vez   vs. infarto
table_casado_infarto <- table(Datastroke$casado_alguna_vez  , Datastroke$infarto)
print("Tabla de contingencia para  casado alguna vez   vs Infarto:")
## [1] "Tabla de contingencia para  casado alguna vez   vs Infarto:"
print(table_casado_infarto)
##    
##        0    1
##   0 1727   29
##   1 3133  220
# Prueba de asociación - Prueba exacta de Fisher
#fisher.test(table_casado_infarto)
chisq.test(table_casado_infarto)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_casado_infarto
## X-squared = 58.868, df = 1, p-value = 1.686e-14
# Tabla de contingencia para tipo_trabajo vs. infarto
table_trabajo_infarto <- table(Datastroke$tipo_trabajo, Datastroke$infarto)
print("Tabla de contingencia para tipo_trabajo vs Infarto:")
## [1] "Tabla de contingencia para tipo_trabajo vs Infarto:"
print(table_trabajo_infarto)
##    
##        0    1
##   1  685    2
##   2  624   33
##   3   22    0
##   4 2775  149
##   5  754   65
# Prueba de asociación - Prueba exacta de Fisher
#fisher_test <- fisher.test(table_trabajo_infarto, simulate.p.value = TRUE)
#isher_test
chisq.test(table_trabajo_infarto)
## Warning in chisq.test(table_trabajo_infarto): Chi-squared approximation may be
## incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table_trabajo_infarto
## X-squared = 49.159, df = 4, p-value = 5.409e-10
# Tabla de contingencia para TIPO DE RESIDENCIA vs. infarto
table_residencia_infarto <- table(Datastroke$tipo_residencia, Datastroke$infarto)
print("Tabla de contingencia para tipo_residencia vs Infarto:")
## [1] "Tabla de contingencia para tipo_residencia vs Infarto:"
print(table_residencia_infarto)
##    
##        0    1
##   1 2399  114
##   2 2461  135
# Prueba de asociación - Prueba exacta de Fisher
#fisher.test(table_residencia_infarto)

chisq.test(table_residencia_infarto)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_residencia_infarto
## X-squared = 1.075, df = 1, p-value = 0.2998
# Tabla de contingencia para fumador vs. infarto
table_fumador_infarto <- table(Datastroke$fumador, Datastroke$infarto)
print("Tabla de contingencia para fumador vs Infarto:")
## [1] "Tabla de contingencia para fumador vs Infarto:"
print(table_fumador_infarto)
##    
##        0    1
##   1  814   70
##   2 1802   90
##   3  747   42
##   4 1497   47
# Prueba de asociación - Prueba exacta de Fisher
#fisher.test(table_fumador_infarto)
chisq.test(table_fumador_infarto)
## 
##  Pearson's Chi-squared test
## 
## data:  table_fumador_infarto
## X-squared = 29.226, df = 3, p-value = 2.008e-06

Tablas de contingencia y prueba de fisher

Tanto en la variable hipertensión como en la variable enfermedades vasculares y en la variable casado alguna vez podemos ver como las tres muestran una asociación significativa con el infarto (p-valor < 0.001), con un odds ratio estimado de aproximadamente valores 3.6953, 4.703 y 4.181 respectivamente, todos mayores que 1, lo que indica que los pacientes con hipertensión o enfermedades vasculares o que han estado casados alguna vez tienen más posibilidades de sufrir un infarto en comparación que aquellos que no cumplen estas condiciones.

Por otro lado, también me gustaría hacer cierto hincapié en la variable tipo de trabajo y cómo se relaciona con la variable respuesta. La prueba exacta de Fisher muestra una asociación significativa entre el tipo de trabajo y el infarto (p-valor = 0.0004998), lo que indica que hay diferencias significativas en la proporción de infartos entre al menos dos categorías de tipo de trabajo. Sin embargo, la tabla de contingencia revela que las categorías 1 (niños) y 3 (nunca trabajó) tienen números muy bajos de infartos, lo que sugiere que estas categorías pueden no ser representativas o pueden estar asociadas con otras variables, sospecho que esta podría ser la edad puesto que el nunca haber trabajado o el cuidar niños suele ser la situación de muchos jóvenes en nuestro país que aún no han llegado a la edad en la que poder trabajar, o cómo aún son jóvenes dedican sus esfuerzos a los estudios y algunos ganan sus primeros sueldos trabajando como canguro de niños.

Es por todo esto que debido a los resultados encontrados previamente y los recientes cada vez estoy más de acuerdo con la idea de centrarme en pacientes con edades más tardías, mayores de 50 años, para llevar a cabo mi proyecto de forma más precias y eficiente, pero antes de tomar ninguna decisión precipitada voy a estudiar la relación de la variable Edad con las dos variables que creo que se pueden estar viendo interferidas por ellas, IMC y tipo de trabajo.

Matriz de correlación entre variables numéricas

# Matriz de correlación entre variables numéricas
correlation_matrix <- cor(Datastroke[c("edad", "nivel_glucosa", "IMC")])
corrplot(correlation_matrix, method = "circle", type = "upper", tl.col = "black")

correlation_value <- correlation_matrix["edad", "nivel_glucosa"]
print(correlation_value)
## [1] 0.2383228
correlation_value1 <- correlation_matrix["edad", "IMC"]
print(correlation_value1)
## [1] 0.335462
correlation_value2 <- correlation_matrix["nivel_glucosa", "IMC"]
print(correlation_value2)
## [1] 0.1823342

La correlación entre la edad y el nivel medio de glucosa en sangre (nivel_glucosa) es de 0.238, muestra una correlación positiva débil entre la edad y el nivel medio de glucosa en sangre. Es decir, a medida que aumenta la edad, tiende a aumentar ligeramente el nivel medio de glucosa en sangre, pero la relación no es muy fuerte.

La correlación entre la edad y el índice de masa corporal (IMC) es de 0.335, muestra una correlación positiva entre la edad y el índice de masa corporal, como en el caso anterior, a medida que aumenta la edad, tiende a aumentar el índice de masa corporal, pero la relación no es muy fuerte.

La correlación entre el nivel medio de glucosa en sangre (nivel_glucosa) y el índice de masa corporal (IMC) es de 0.182. Muestra correlación positiva débil entre el nivel medio de glucosa en sangre y el índice de masa corporal. En resumen, hay una ligera tendencia a que los niveles más altos de glucosa en sangre se asocien con un índice de masa corporal más alto, pero la relación no es muy fuerte.

Correlación

La correlación entre la edad y el nivel medio de glucosa en sangre (nivel_glucosa) es de 0.236, muestra una correlación positiva débil entre la edad y el nivel medio de glucosa en sangre. Es decir, a medida que aumenta la edad, tiende a aumentar ligeramente el nivel medio de glucosa en sangre, pero la relación no es muy fuerte.

La correlación entre la edad y el índice de masa corporal (IMC) es de 0.333, muestra una correlación positiva entre la edad y el índice de masa corporal, como en el caso anterior, a medida que aumenta la edad, tiende a aumentar el índice de masa corporal,pero la relación no es muy fuerte.

La correlación entre el nivel medio de glucosa en sangre (nivel_glucosa) y el índice de masa corporal (IMC) es de 0.176. Muestra correlación positiva débil entre el nivel medio de glucosa en sangre y el índice de masa corporal. En resumen, hay una ligera tendencia a que los niveles más altos de glucosa en sangre se asocien con un índice de masa corporal más alto, pero la relación no es muy fuerte.

Relación no lineal entre variables numéricas y respuesta mediante gráfico de dispersión con líneas de ajuste no lineales para cada categoría de infarto.

# Crear gráfico de dispersión con líneas de ajuste no lineales para cada categoría de infarto
ggplot(Datastroke, aes(x = nivel_glucosa, y = IMC, color = infarto)) +
  geom_point() + # Añadir puntos de datos
  geom_smooth(method = "loess", se = FALSE) + # Añadir líneas de ajuste no lineales (LOESS)
  labs(x = "Nivel de Glucosa", y = "IMC", title = "Relación no lineal entre Nivel de Glucosa, IMC y Infarto") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Crear gráfico de dispersión con líneas de ajuste no lineales para cada categoría de infarto
ggplot(Datastroke, aes(x = edad, y = nivel_glucosa, color = infarto)) +
  geom_point() + # Añadir puntos de datos
  geom_smooth(method = "loess", se = FALSE) + # Añadir líneas de ajuste no lineales (LOESS)
  labs(x = "Edad", y = "Nivel de Glucosa", title = "Relación no lineal entre Edad, Nivel de Glucosa y Infarto") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Gráfico de dispersión para edad vs. IMC con líneas de ajuste no lineales para cada categoría de infarto
ggplot(Datastroke, aes(x = edad, y = IMC, color = infarto)) +
  geom_point() + # Añadir puntos de datos
  geom_smooth(method = "loess", se = FALSE) + # Añadir líneas de ajuste no lineales (LOESS)
  labs(x = "Edad", y = "IMC", title = "Relación no lineal entre Edad, IMC y Infarto") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Relación no lineal entre Nivel de Glucosa, IMC e Infarto. En general podemos decir que las líneas se mantienen bastante constantes horizontalmente a lo largo del gráfico lo que nos indica que la variable infarto no está influenciada por las variables numéricas (nivel de glucosa y IMC) o que la relación entre estas variables es muy débil.

Relación no lineal entre Edad, Nivel de Glucosa y Infarto, podemos ver que la línea azul en el gráfico de la relación no lineal entre Edad, Nivel de Glucosa e Infarto muestra una tendencia ascendente hasta la edad de 70 años y luego comienza a descender. Indicando que hasta esa edad, el riesgo de infarto aumenta a medida que la edad y los niveles de glucosa en sangre aumentan. A partir de los 70 años, la tendencia descendente podría indicar que otros factores, como el cuidado de la salud, el tratamiento médico o la selección natural, podrían estar influyendo en la disminución del riesgo de infarto. También debemos destacar la presencia de muchos puntos dispersos por encima de las líneas de ajuste, especialmente en los últimos valores de edad, lo que indica una mayor variabilidad en los datos en esa región

Relación no lineal entre Edad, IMC y Infarto. Podemos observar una leve forma cóncava de las líneas, lo podría indicar que, hay una asociación creciente entre la edad y el IMC en relación con la probabilidad de infarto hasta cierto punto, seguida de una asociación decreciente después de ese punto. Esto podría sugerir que, para ciertos grupos de edad y rangos de IMC, el riesgo de infarto disminuye con la edad, pero para otros grupos de edad y rangos de IMC, el riesgo de infarto aumenta con la edad

Crear un mapa de calor mostrando la distribución de la edad media por tipo de trabajo

# Calcular la edad media por tipo de trabajo
age_mean <- aggregate(edad ~ tipo_trabajo, data = Datastroke, FUN = mean)

# Crear un mapa de calor mostrando la distribución de la edad media por tipo de trabajo
heatmap_plot <- ggplot(data = age_mean, aes(x = tipo_trabajo, y = edad)) +
  geom_tile(aes(fill = edad)) +
  scale_fill_gradient(low = "blue", high = "red") +
  labs(title = "Distribución de la Edad Media por Tipo de Trabajo",
       x = "Tipo de Trabajo",
       y = "Edad Media",
       fill = "Edad Media") +
  theme_minimal()

# Mostrar el mapa de calor
print(heatmap_plot)

# Calcular la edad media por tipo de trabajo
age_mean2 <- aggregate(edad ~ fumador, data = Datastroke, FUN = mean)

# Crear un mapa de calor mostrando la distribución de la edad media por tipo de trabajo
heatmap_plot2 <- ggplot(data = age_mean2, aes(x = fumador, y = edad)) +
  geom_tile(aes(fill = edad)) +
  scale_fill_gradient(low = "blue", high = "red") +
  labs(title = "Distribución de la Edad Media por situación fumador",
       x = "Fumador",
       y = "Edad Media",
       fill = "Edad Media") +
  theme_minimal()

# Mostrar el mapa de calor
print(heatmap_plot2)

## Pruebas T de Student y Wilcoxon-Mann-Whitney

# Prueba t de Student para IMC
t_test_IMC <- t.test(IMC ~ infarto, data = Datastroke)

# Prueba de Wilcoxon-Mann-Whitney (equivalente no paramétrico) para IMC
wilcox_test_IMC <- wilcox_test(IMC ~ infarto, data = Datastroke)

# Prueba t de Student para Edad
t_test_Edad <- t.test(edad ~ infarto, data = Datastroke)

# Prueba de Wilcoxon-Mann-Whitney (equivalente no paramétrico) para Edad
wilcox_test_Edad <- wilcox_test(edad ~ infarto, data = Datastroke)

# Prueba t de Student para Nivel de glucosa
t_test_glucosa <- t.test(nivel_glucosa ~ infarto, data = Datastroke)

# Prueba de Wilcoxon-Mann-Whitney (equivalente no paramétrico) para Nivel de glucosa
wilcox_test_glucosa <- wilcox_test(nivel_glucosa ~ infarto, data = Datastroke)

# Imprimir los resultados
print("Prueba t de Student para IMC:")
## [1] "Prueba t de Student para IMC:"
print(t_test_IMC)
## 
##  Welch Two Sample t-test
## 
## data:  IMC by infarto
## t = -3.7402, df = 294.51, p-value = 0.000221
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -2.2315870 -0.6927987
## sample estimates:
## mean in group 0 mean in group 1 
##        28.87875        30.34094
print("")
## [1] ""
print("Prueba de Wilcoxon-Mann-Whitney para IMC:")
## [1] "Prueba de Wilcoxon-Mann-Whitney para IMC:"
print(wilcox_test_IMC)
## 
##  Asymptotic Wilcoxon-Mann-Whitney Test
## 
## data:  IMC by infarto (0, 1)
## Z = -4.0638, p-value = 4.828e-05
## alternative hypothesis: true mu is not equal to 0
print("")
## [1] ""
print("Prueba t de Student para Edad:")
## [1] "Prueba t de Student para Edad:"
print(t_test_Edad)
## 
##  Welch Two Sample t-test
## 
## data:  edad by infarto
## t = -29.682, df = 331.68, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -27.46015 -24.04658
## sample estimates:
## mean in group 0 mean in group 1 
##        41.97483        67.72819
print("")
## [1] ""
print("Prueba de Wilcoxon-Mann-Whitney para Edad:")
## [1] "Prueba de Wilcoxon-Mann-Whitney para Edad:"
print(wilcox_test_Edad)
## 
##  Asymptotic Wilcoxon-Mann-Whitney Test
## 
## data:  edad by infarto (0, 1)
## Z = -17.834, p-value < 2.2e-16
## alternative hypothesis: true mu is not equal to 0
print("")
## [1] ""
print("Prueba t de Student para Nivel de glucosa:")
## [1] "Prueba t de Student para Nivel de glucosa:"
print(t_test_glucosa)
## 
##  Welch Two Sample t-test
## 
## data:  nivel_glucosa by infarto
## t = -6.9844, df = 260.9, p-value = 2.373e-11
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -35.58269 -19.93162
## sample estimates:
## mean in group 0 mean in group 1 
##        104.7876        132.5447
print("")
## [1] ""
print("Prueba de Wilcoxon-Mann-Whitney para Nivel de glucosa:")
## [1] "Prueba de Wilcoxon-Mann-Whitney para Nivel de glucosa:"
print(wilcox_test_glucosa)
## 
##  Asymptotic Wilcoxon-Mann-Whitney Test
## 
## data:  nivel_glucosa by infarto (0, 1)
## Z = -5.9024, p-value = 3.583e-09
## alternative hypothesis: true mu is not equal to 0

Filtrado de los datos eliminando observaciones correspondientes a: pacientes menores de los 50 años y pacientes en situación laboral de nunca haber trabajado o dedicarse al cuidado de niños.

# Eliminar filas con edad menor o igual a 49 y tipo_trabajo igual a 1 o 3
Datastroke_filtrado <- Datastroke[!(Datastroke$edad <= 49 | Datastroke$tipo_trabajo %in% c(1, 3)), ]
# Eliminar las categorías 1 y 3 en tipo_trabajo
Datastroke_filtrado <- Datastroke_filtrado[!(Datastroke_filtrado$tipo_trabajo %in% c(1, 3)), ]
# Verificar que las categorías 1 y 3 en tipo_trabajo hayan sido eliminadas
unique(Datastroke_filtrado$tipo_trabajo)
## [1] 4 5 2
## Levels: 1 2 3 4 5
summary(Datastroke_filtrado)
##  género        edad       hipertensión enfermedades_vasculares
##  1: 937   Min.   :50.00   0:1798       0:1949                 
##  2:1273   1st Qu.:56.00   1: 412       1: 261                 
##           Median :63.00                                       
##           Mean   :64.68                                       
##           3rd Qu.:74.00                                       
##           Max.   :82.00                                       
##  casado_alguna_vez tipo_trabajo tipo_residencia nivel_glucosa   
##  0: 172            1:   0       1:1064          Min.   : 55.23  
##  1:2038            2: 361       2:1146          1st Qu.: 79.17  
##                    3:   0                       Median : 95.88  
##                    4:1242                       Mean   :118.44  
##                    5: 607                       3rd Qu.:145.34  
##                                                 Max.   :271.74  
##       IMC        fumador infarto 
##  Min.   :11.30   1:580   0:1981  
##  1st Qu.:26.60   2:864   1: 229  
##  Median :29.80   3:355           
##  Mean   :30.68   4:411           
##  3rd Qu.:34.00                   
##  Max.   :66.80