### Efecto de la demografia y conteos de celulas T en la recuperacion
### de pacientes con sindrome post-COVID-19
## Lopez Sanchez Jaciel Ivan
# 25/05/2024
# Cargar librerias
library("FactoMineR")
library("factoextra")
## Cargando paquete requerido: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library("corrplot")
## corrplot 0.92 loaded
library(ggplot2)
library(plyr)
library(scales)
library(grid)
library(devtools)
## Cargando paquete requerido: usethis
library(ggbiplot)
library(car)
## Cargando paquete requerido: carData
library(broom)
library(readr)
##
## Adjuntando el paquete: 'readr'
## The following object is masked from 'package:scales':
##
## col_factor
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following objects are masked from 'package:plyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tinytex)
getwd()
## [1] "C:/Users/rinco/Downloads"
# Cargar el conjunto de datos
df <- read.csv("C:/Users/rinco/Desktop/01_Base/02_Data/pacientes.csv", header = TRUE, sep = ",")
df2 <- read.csv("C:/Users/rinco/Desktop/01_Base/02_Data/pacientes2.csv", header = TRUE, sep = ",")
### Analisis de Componentes Principales
# PCA Best
#################
# Realiza el PCA en las columnas 4 a 6 del DataFrame
WS.pca <- PCA(df [, 4:6], graph = FALSE)
# Obtiener los valores propios (eigenvalues) del PCA
EigenCOVIDClinic <- get_eig(WS.pca)
# Muestra los valores propios en la consola
EigenCOVIDClinic
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 1.4135428 47.11809 47.11809
## Dim.2 1.0037889 33.45963 80.57772
## Dim.3 0.5826683 19.42228 100.00000
# Guardar los valores propios en un archivo CSV llamado 'Eigen_pacientes.csv'
write.table(EigenCOVIDClinic, file = "02_Data/Eigen_pacientes.csv",
sep = ",", eol = "\r\n", na = "NA",
col.names = TRUE, row.names = FALSE, fileEncoding = "")
# Genera un scree plot del PCA
fviz_screeplot(WS.pca, addlabels=TRUE, ylim = c(0, 49))

# Obtiener las variables del PCA
var <- get_pca_var(WS.pca)
# Mostrar las variables del PCA en la consola
var
## Principal Component Analysis Results for variables
## ===================================================
## Name Description
## 1 "$coord" "Coordinates for the variables"
## 2 "$cor" "Correlations between variables and dimensions"
## 3 "$cos2" "Cos2 for the variables"
## 4 "$contrib" "contributions of the variables"
# Primeras filas de las coordenadas de las variables en el PCA
head(var$coord)
## Dim.1 Dim.2 Dim.3
## BhLinfocitosAbsolutos -0.8426088 -0.002566662 0.5385200
## edad 0.5048812 0.798508478 0.3278402
## peso 0.6698120 -0.605116937 0.4303317
# Primeras filas de los valores cos2
head(var$cos2)
## Dim.1 Dim.2 Dim.3
## BhLinfocitosAbsolutos 0.7099896 6.587753e-06 0.2900038
## edad 0.2549050 6.376158e-01 0.1074792
## peso 0.4486481 3.661665e-01 0.1851854
# Primeras filas de la contribucion de las variables a los componentes principales
head(var$contrib)
## Dim.1 Dim.2 Dim.3
## BhLinfocitosAbsolutos 50.22767 6.562887e-04 49.77167
## edad 18.03306 6.352091e+01 18.44604
## peso 31.73927 3.647844e+01 31.78229
# Almacenar la contribución de las variables en 'Contrib'
Contrib <- var$contrib
# Guardar la contribucion de las variables
write.table(Contrib, file = "02_Data/contrib_pacientes.csv",
sep = ",", eol = "\r\n", na = "NA",
col.names = TRUE, row.names = FALSE, fileEncoding = "")
# Genera un gráfico de las variables del PCA
fviz_pca_var(WS.pca, col.var = "black")

# Mostrar las primeras 4 filas de los valores cos2
head(var$cos2, 4)
## Dim.1 Dim.2 Dim.3
## BhLinfocitosAbsolutos 0.7099896 6.587753e-06 0.2900038
## edad 0.2549050 6.376158e-01 0.1074792
## peso 0.4486481 3.661665e-01 0.1851854
# Generar un gráfico de correlación de los valores cos2 de las variables
corrplot(var$cos2, is.corr=F, method = "number")

# Generar un gráfico de contribución de las variables a los componentes principales
fviz_contrib(WS.pca, choice = "var", axes = 1, top = 35)

fviz_contrib(WS.pca, choice = "var", axes = 2, top = 35)

# Generar un gráfico de calidad de representación (cos2) de las variables en los componentes principales
fviz_cos2(WS.pca, choice = "var", axes = 1:2)

### Estadistica descriptiva
summary(df)
## Id Recuperacion_Postcovid sexo BhLinfocitosAbsolutos
## Min. : 1.00 Length:102 Min. :1.000 Min. :0.230
## 1st Qu.: 26.25 Class :character 1st Qu.:1.000 1st Qu.:0.780
## Median : 52.50 Mode :character Median :1.000 Median :1.220
## Mean : 52.05 Mean :1.451 Mean :1.414
## 3rd Qu.: 77.75 3rd Qu.:2.000 3rd Qu.:1.802
## Max. :103.00 Max. :2.000 Max. :4.310
## edad peso
## Min. :16.00 Min. : 50.00
## 1st Qu.:41.25 1st Qu.: 65.00
## Median :50.00 Median : 77.00
## Mean :49.40 Mean : 78.85
## 3rd Qu.:58.00 3rd Qu.: 90.00
## Max. :90.00 Max. :122.00
# Realizar un boxplot con los datos para observar la distribucion de los datos
# Recuperacion post-COVID-19 vs conteos de linfocitos absolutos
ggplot(df, aes(Recuperacion_Postcovid, BhLinfocitosAbsolutos))+geom_boxplot()+
labs(x = "Recuperacion post-COVID-19",
y= "Conteo de linfocitos absolutos") +
theme_minimal()

# Recuperacion post-COVID-19 vs Edad
ggplot(df, aes(Recuperacion_Postcovid, edad))+geom_boxplot()+
labs(x = "Recuperacion post-COVID-19",
y= "Edad (años)") +
theme_minimal()

# Recuperacion post-COVID-19 vs peso
ggplot(df, aes(Recuperacion_Postcovid, peso))+geom_boxplot()+
labs(x = "Recuperacion post-COVID-19",
y= "Pesp (kg)") +
theme_minimal()

# Se comparara la magnitid de las tres variables anteriores en ambos grupos
### Supuestos para la prueba de t
## Normalidad
# Se subdiviran los datos para la prueba de normalidad
# Conteos de linfocitos
LNR <-subset(df, Recuperacion_Postcovid=="No recuperado", select = "BhLinfocitosAbsolutos")
LR <-subset(df, Recuperacion_Postcovid=="Recuperado", select = "BhLinfocitosAbsolutos")
# Edad
ENR <-subset(df, Recuperacion_Postcovid=="No recuperado", select = "edad")
ER <-subset(df, Recuperacion_Postcovid=="Recuperado", select = "edad")
# Peso
PNR <-subset(df, Recuperacion_Postcovid=="No recuperado", select = "peso")
PR <-subset(df, Recuperacion_Postcovid=="Recuperado", select = "peso")
# Realizar la prueba de Shapiro-Wilk para estos subconjuntos de datos
# prueba de decicion, se utilizara un valor de confianza de a=0.05
# prueba de hipotesis: H0: los datos siguen una distribucion normal
# HA: La distribucion de los datos no es normal
## Conteos de linfocitos
shapiro.test(LNR$BhLinfocitosAbsolutos) # p = 0.02979, los datos respaldan HA
##
## Shapiro-Wilk normality test
##
## data: LNR$BhLinfocitosAbsolutos
## W = 0.85148, p-value = 0.02979
shapiro.test(LR$BhLinfocitosAbsolutos) # p = 3.424e-06, los datos respaldan HA
##
## Shapiro-Wilk normality test
##
## data: LR$BhLinfocitosAbsolutos
## W = 0.89729, p-value = 3.424e-06
# Ya que ambas subdivisiones del data frame muestran una distribucion distinta a la normal, se utilizaran pruebas no parametricas para realizar las comparaciones.
## Edad
shapiro.test(ENR$edad) # p = 0.07219, los datos respaldan H0
##
## Shapiro-Wilk normality test
##
## data: ENR$edad
## W = 0.88039, p-value = 0.07219
shapiro.test(ER$edad) # p = 0.1943, los datos respaldan H0
##
## Shapiro-Wilk normality test
##
## data: ER$edad
## W = 0.98024, p-value = 0.1934
# Ya que ambas subdivisiones del data frame muestran una distribucion normal, se utilizaran pruebas parametricas para realizar las comparaciones.
## Peso
shapiro.test(PNR$peso) # p = 0.7673, los datos respaldan HA
##
## Shapiro-Wilk normality test
##
## data: PNR$peso
## W = 0.96089, p-value = 0.7673
shapiro.test(PR$peso) # p = 0.01473, los datos respaldan H0
##
## Shapiro-Wilk normality test
##
## data: PR$peso
## W = 0.96417, p-value = 0.01473
# Ya que ambas subdivisiones del data frame muestran distribuciones distintas, se utilizaran pruebas no parametricas para realizar las comparaciones.
## Muestras balanceadas
with(df, table(df$Recuperacion_Postcovid))
##
## No recuperado Recuperado
## 13 89
# Las muestras no estan balanceadas
## homogeneidad de varianzas
# Se utilizara la prueba de Levene dado a que los factores presentan dos niveles
# Prueba de hipotesis: H0: las varianzas son iguales en todos los grupos; HA: Al menos una de las varianzas es diferente.
## Conteos de linfocitos
leveneTest(BhLinfocitosAbsolutos ~ Recuperacion_Postcovid, data = df) # p= 0.5274, los datos respaldan H0
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 0.4023 0.5274
## 100
## Edad
leveneTest(edad ~ Recuperacion_Postcovid, data = df) # p= 0.02306, los datos respaldan HA
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 1.4548 0.2306
## 100
## Peso
leveneTest(peso ~ Recuperacion_Postcovid, data = df) # p= 0.6831, los datos respaldan H0
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 0.1676 0.6831
## 100
# Se empleara la prueba de Kruskal-Wallis para comparar los conteos de linfocitos B y la recuperacion
# Prueba de hipotesis, H0: La distribucion de las muestras en todos los grupos es identica
# HA: Al menos una de las muestras en los grupos difiere en su distribucion de las demas
kruskal.test(BhLinfocitosAbsolutos ~ Recuperacion_Postcovid, data = df) # p = 0.3481, los datos respaldan la H0
##
## Kruskal-Wallis rank sum test
##
## data: BhLinfocitosAbsolutos by Recuperacion_Postcovid
## Kruskal-Wallis chi-squared = 0.88042, df = 1, p-value = 0.3481
# Se empleara la prueba de Kruskal-Wallis para comparar el peso y la recuperacion
# Prueba de hipotesis, H0: La distribucion de las muestras en todos los grupos es identica
# HA: Al menos una de las muestras en los grupos difiere en su distribucion de las demas
kruskal.test(edad ~ Recuperacion_Postcovid, data = df) # p = 0.6842, los datos respaldan la H0
##
## Kruskal-Wallis rank sum test
##
## data: edad by Recuperacion_Postcovid
## Kruskal-Wallis chi-squared = 0.16538, df = 1, p-value = 0.6842
# Se empleara la prueba de Kruskal-Wallis para comparar el peso y la recuperacion
# Prueba de hipotesis, H0: La distribucion de las muestras en todos los grupos es identica
# HA: Al menos una de las muestras en los grupos difiere en su distribucion de las demas
kruskal.test(peso ~ Recuperacion_Postcovid, data = df) # p = 0.8057, los datos respaldan la H0
##
## Kruskal-Wallis rank sum test
##
## data: peso by Recuperacion_Postcovid
## Kruskal-Wallis chi-squared = 0.060497, df = 1, p-value = 0.8057
### Evaluar el efecto de las variables predictoras (edad, peso y conteos de linfocitos B) sobre la probabilidad de norecuperacion
### Se establecera al seco como covariable para ajustar su posible efecto
# Convertir la variable de recuperación a factor
df2$Recuperacion_Postcovid <- factor(df2$Recuperacion_Postcovid, levels = c(0,1))
# Convertir la variable de sexo a factor
df2$sexo <- factor(df2$sexo)
# Ajustar el modelo de regresión logística
modelo <- glm(df2$Recuperacion_Postcovid ~ edad + peso + BhLinfocitosAbsolutos + sexo, data = df2, family = binomial)
# Resumen del modelo
summary(modelo)
##
## Call:
## glm(formula = df2$Recuperacion_Postcovid ~ edad + peso + BhLinfocitosAbsolutos +
## sexo, family = binomial, data = df2)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.28272 2.26796 -0.566 0.572
## edad 0.00223 0.02106 0.106 0.916
## peso 0.00228 0.01963 0.116 0.908
## BhLinfocitosAbsolutos -0.43754 0.45495 -0.962 0.336
## sexo2 -0.90079 0.67927 -1.326 0.185
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 77.828 on 101 degrees of freedom
## Residual deviance: 75.125 on 97 degrees of freedom
## AIC: 85.125
##
## Number of Fisher Scoring iterations: 5
# Extraer los coeficientes del modelo y sus intervalos de confianza
coeficientes <- summary(modelo)$coefficients
odds_ratios <- exp(coeficientes[,1]) # Calcular los odds ratios
ci_low <- exp(coeficientes[,1] - 1.96 * coeficientes[,2]) # Calcular el límite inferior del intervalo de confianza
ci_up <- exp(coeficientes[,1] + 1.96 * coeficientes[,2]) # Calcular el límite superior del intervalo de confianza
# Crear un data frame con los resultados
resultados <- data.frame(coeficientes = coeficientes[,1], or = odds_ratios, ci_low = ci_low, ci_up = ci_up, variable = rownames(coeficientes))
# Graficar los odds ratios con intervalos de confianza
ggplot(resultados, aes(x = variable, y = or, ymin = ci_low, ymax = ci_up)) +
geom_pointrange() +
geom_hline(yintercept = 1, linetype = "dashed", color = "red") + # Línea de referencia en OR = 1
labs(x = "",
y = "Odds Ratio",
caption = "Intervalo de Confianza al 95%") +
theme_minimal() + # Estilo del tema del gráfico
coord_cartesian(ylim = c(0, 5))

# Verifica si el directorio existe
dir.exists("02_Data")
## [1] TRUE