Analisis Descriptivo Univariado

library(readxl)
Warning: package 'readxl' was built under R version 4.2.3
library(dplyr)
Warning: package 'dplyr' was built under R version 4.2.3

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
library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.2.3
library(FactoClass)
Warning: package 'FactoClass' was built under R version 4.2.3
Loading required package: ade4
Warning: package 'ade4' was built under R version 4.2.3
Loading required package: ggrepel
Warning: package 'ggrepel' was built under R version 4.2.3
Loading required package: xtable
Warning: package 'xtable' was built under R version 4.2.3
Loading required package: scatterplot3d
Warning: package 'scatterplot3d' was built under R version 4.2.3
library(plotly)
Warning: package 'plotly' was built under R version 4.2.3

Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':

    last_plot
The following object is masked from 'package:stats':

    filter
The following object is masked from 'package:graphics':

    layout
library(knitr)
Warning: package 'knitr' was built under R version 4.2.3
library(htmlwidgets)
Warning: package 'htmlwidgets' was built under R version 4.2.3

Introducción

La atención a pacientes en estado crítico representa uno de los mayores desafíos en la medicina, especialmente cuando se trata de enfermedades que potencialmente son mortales. Comprender las tasas de supervivencia a corto y mediano plazo en pacientes hospitalizados en unidades de cuidados intensivos (UCI), y las características socio demográficas y fisiológicas que pueden apaciguar/atenuar el avance de estas ensfermedades, permite plantear estrategias que busquen disminuir las tasas de mortalidad en este tipo de pacientes.

Descripción de datos

El estudio cuenta con 9105 individuos ingresados a hospitales de 5 centros médicos de Estados Unidos entre 1989 y 1994, a los cuales les fueron medidas 45 variables socio-demográficas, fisiológicas y relacionadas a su estancia en el hospital.

Los individuos de estudio corresponden a personas con al menos una de 9 enfermedades graves o potencialmente mortales, véase insuficiencia respiratoria aguda, enfermedad pulmonar obstructiva crónica, insuficiencia cardíaca congestiva, enfermedad hepática, coma, cáncer de colon, cáncer de pulmón, insuficiencia multiorgánica con malignidad e insuficiencia multiorgánica con sepsis, y a los que les fue estimado un índice de supervivencia una vez pasados 2 y 6 meses fuera del hospital.

El conjunto de datos proviene del experimento SUPPORT, donde se evaluaba el efecto de la toma de decisiones y pronósticos para personas con enfermedades graves buscando evitar el sufrimiento al final de la vida.

Población de estudio

La población objetivo del estudio corresponde a los pacientes graves de alguna de las 9 enfermedades estudiadas dentro de los cinco centros médicos en cuestión, ingresados entre 1989 y 1994.

datos <- read_excel("SUPPPORT2.xlsx")
head(datos)
# A tibble: 6 × 45
    age sex    dzgroup  dzclass num.co   edu income scoma charges totcst totmcst
  <dbl> <chr>  <chr>    <chr>    <dbl> <dbl> <chr>  <dbl>   <dbl>  <dbl>   <dbl>
1  62.8 male   Lung Ca… Cancer       0    11 $11-$…     0    9715     NA      NA
2  60.3 female Cirrhos… COPD/C…      2    12 $11-$…    44   34496     NA      NA
3  52.7 female Cirrhos… COPD/C…      2    12 under…     0   41094     NA      NA
4  42.4 female Lung Ca… Cancer       2    11 under…     0    3075     NA      NA
5  79.9 female ARF/MOS… ARF/MO…      1    NA <NA>      26   50127     NA      NA
6  93.0 male   Coma     Coma         1    14 <NA>      55    6884     NA      NA
# ℹ 34 more variables: avtisst <dbl>, race <chr>, sps <dbl>, aps <dbl>,
#   surv2m <dbl>, surv6m <dbl>, hday <dbl>, diabetes <dbl>, dementia <dbl>,
#   ca <chr>, prg2m <dbl>, prg6m <dbl>, dnr <chr>, dnrday <dbl>, meanbp <dbl>,
#   wblc <dbl>, hrt <dbl>, resp <dbl>, temp <dbl>, pafi <dbl>, alb <dbl>,
#   bili <dbl>, crea <dbl>, sod <dbl>, ph <dbl>, glucose <dbl>, bun <dbl>,
#   urine <dbl>, adlp <dbl>, adls <dbl>, adlsc <dbl>, death <dbl>,
#   hospdead <dbl>, sfdm2 <chr>

Diccionario de datos

  • Age: Edad

  • Death: Momento de la muerte

  • Sex: Sexo

  • hospdead: Si muere en el hospital.

  • Slos: Días desde ingreso hasta alta.

  • d.time: Días de seguimiento.

  • dzgroup: Subcategoría enfermedad del paciente.

  • dzclass: Categoría enfermedad del paciante.

  • num.co: Número de enfermedades o comorbilidades simultáneas.

  • edu: Años de educación.

  • income: Ingreso del paciente.

  • scoma: score de soporte de coma.

  • charges: Cargos de hospital.

  • totcst: Costo total.

  • totmcst: Micro costo total.

  • avtisst: Puntuación promedio de TISS.

  • race: Raza del paciente.

  • sps: Score de soporte psicológico.

  • aps: Puntuación de fisiología.

  • surv2m: Estimación de supervivencia a los 2 meses.

  • surv6m: Estimación de supervivencia a los 6 meses.

  • hday: Día en que entra al hospital.

  • diabetes: Si el paciente tiene diabetes.

  • dementia: Si el paciente tiene demencia.

  • ca: Si el paciente tiene cáncer.

  • prg2m: Estimación del médico para supervivencia a 2 meses.

  • prg6m: Estimación del médico para supervivencia a 6 meses.

  • dnr: Si el paciente ha tenido orden de resucitación.

  • dnrday: Día de la orden de resucitación.

  • meanbp: Presión arterial.

  • wblc: Conteo de glóbulos blancos.

  • hrt: Frecuencia cardiaca.

  • resp: Frecuencia respiratoria.

  • temp: Temperatura del paciente.

  • pafi: Relación de presión de oxígeno arterial y fracción de oxigeno inspirado.

  • alb: Nivel de albumina sérica.

  • bili: Niveles de bilirrubina.

  • crea: Niveles de creatinina.

  • sod: COncentración de sodio.

  • ph: pH de la presión arterial.

  • glucosa: Nivel de glucosa.

  • bun: Niveles de nitrógeno uréico.

  • urine: Producción de orina.

  • adlp: Índice de actividad diaria.

  • adls: Índice de actividad diaria hecha por un sustituto.

  • sfdm2: Nivel de discapacidad funcional.

  • adlsc: ADL impuitado calibrado al sustituto.

nombres <- c("edad","sexo","SubEnf","Enf","EnfSimul","Edu","ingreso","coma","CargosHosp","CostTot","MicroTot","PuntTISS","Raza","SopPsic","SopFisio","Sup2m","Sup6m","DiaIng","diabetes","demencia","cancer","SupEst2m","SupEst6m","Resu","DiaResu","PresArt","GlobBlanc","FrecCard","FrecResp","temperatura","OxArt-OxInsp","albumina","bilirrubina","creatinina","sodio","pH","glucosa","NitrUreico","ProdOrina","IndActDiaria","IndSust","ADL","Muerte","MuerteHosp","DiscFunc")

colnames(datos) <- nombres
categoricas <- datos[,c(2,3,4,5,7,13,19,20,21,24,40,41,43,44,45)]
categoricas <- as.data.frame(lapply(categoricas,as.factor))
numericas <- datos[,-c(2,3,4,5,7,13,19,20,21,24,40,41,43,44,45)]
numericas <- as.data.frame(lapply(numericas, as.numeric))

categoricas1 <- c(2,3,4,5,7,13,19,20,21)
categoricas2 <- c(24,40,41,43,44,45)

numericas1 <- seq(1,6)
numericas2 <- seq(7,12)
numericas3 <- seq(13,18)
numericas4 <- seq(19,24)
numericas5 <- seq(25,30)

colores <- rep(c("red","blue","yellow","pink","green","orange"),5)

Se cuenta con 15 variables categóricas y 30 variables numéricas, aunque algunas variables como edad, que en el conjunto de datos se encuentra medida en escala continua se podría categorizar. Mismo caso para variables como años de educación.

Análisis variables categóricas

for (i in categoricas1) {
  col_data <- as.factor(datos[[i]])  # Asegurarse de que sea un factor
  freqs <- table(col_data)
  percs <- round(prop.table(freqs) * 100, 1)

  # Crear gráfico de barras
  barplot(
    freqs,
    horiz = TRUE,
    col = rainbow(length(freqs)),
    main = colnames(datos)[i],  # Usa el nombre directamente
    xlab = "Frecuencia",
    cex.main = 1,  # Reducir el tamaño del título
    cex.lab = 1,  # Reducir el tamaño de etiquetas
    cex.axis = 1,
    las = 1  # Rotar las etiquetas del eje vertical
  )

  # Agregar porcentajes como etiquetas
  text(freqs, seq_along(freqs), labels = paste0(percs, "%"), pos = 4, cex = 0.7, col = "black")
}

par(mfrow = c(3, 2), mai = c(0.6, 1, 0.4, 0.1))  # Márgenes más amplios a la izquierda
for (i in categoricas2) {
  col_data <- as.factor(datos[[i]])  # Asegurarse de que sea un factor
  freqs <- table(col_data)
  percs <- round(prop.table(freqs) * 100, 1)

  # Crear gráfico de barras
  barplot(
    freqs,
    horiz = TRUE,
    col = rainbow(length(freqs)),
    main = colnames(datos)[i],  # Usa el nombre directamente
    xlab = "Frecuencia",
    cex.main = 1,  # Reducir el tamaño del título
    cex.lab = 1,  # Reducir el tamaño de etiquetas
    cex.axis = 0.8,
    las = 1  # Rotar las etiquetas del eje vertical
  )

  # Agregar porcentajes como etiquetas
  text(freqs, seq_along(freqs), labels = paste0(percs, "%"), pos = 4, cex = 0.7, col = "black")
}

Se puede observar que la categoría y subcategoría de enfermedad que más se repite es falla renal aguda y falla multiorgánica. Además, la mayoría de los pacientes del estudio fallecieron, pero un mayor número fuera del hospital.

Adicionalmente, la mayoría de los pacientes no presentaban enfermedades como diabetes, demencia o cáncer.

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas1) hist(numericas[,i], main=names(numericas)[i], col=colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas2) hist(numericas[,i], main=names(numericas)[i], col=colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas3) hist(numericas[,i], main=names(numericas)[i], col=colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas4) hist(numericas[,i], main=names(numericas)[i], col=colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas5) hist(numericas[,i], main=names(numericas)[i], col=colores[i])

Se observa que la edad de los pacientes de estudio se sitúa en promedio alrededor de 60 años. Además, la mayoría de distribuciones se concentran hacia la izquierda, lo que en la mayoría de casos se interpreta como condiciones “anormales” o graves de salud.

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas1) boxplot(numericas[,i], main=names(numericas)[i], col= colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas2) boxplot(numericas[,i], main=names(numericas)[i], col=colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas3) boxplot(numericas[,i], main=names(numericas)[i], col=colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas4) boxplot(numericas[,i], main=names(numericas)[i], col=colores[i])

par(mfrow=c(2,3), mai=c(0.3,0.4,0.3,0.1), las=1, bty="n")
for(i in numericas5) boxplot(numericas[,i], main=names(numericas)[i], col=colores[i])

Para la mayoría de variables numéricas se presenta una gran cantidad de datos atípicos, lo que se traduce como una gran cantidad de pacientes que ingresan en condiciones muy graves, y costos hospitalarios muy elevados en algunos casos, probablemente por parte de los mismos pacientes.

datos_faltantes <- function(x){
  r <- sum(is.na(x))
  return(r)
}
table(apply(datos,2,datos_faltantes))

   0    1   30   42   67   82  172  212  888 1400 1633 1634 1649 2284 2325 2601 
  12   10    2    1    1    1    1    1    1    1    1    1    1    1    1    1 
2867 2982 3372 3475 4352 4500 4862 5641 
   1    1    1    1    1    1    1    1 
resultado <- data.frame(Variable = names(datos), Faltantes = sapply(datos, datos_faltantes))
resultado
                 Variable Faltantes
edad                 edad         0
sexo                 sexo         0
SubEnf             SubEnf         0
Enf                   Enf         0
EnfSimul         EnfSimul         0
Edu                   Edu      1634
ingreso           ingreso      2982
coma                 coma         1
CargosHosp     CargosHosp       172
CostTot           CostTot       888
MicroTot         MicroTot      3475
PuntTISS         PuntTISS        82
Raza                 Raza        42
SopPsic           SopPsic         1
SopFisio         SopFisio         1
Sup2m               Sup2m         1
Sup6m               Sup6m         1
DiaIng             DiaIng         0
diabetes         diabetes         0
demencia         demencia         0
cancer             cancer         0
SupEst2m         SupEst2m      1649
SupEst6m         SupEst6m      1633
Resu                 Resu        30
DiaResu           DiaResu        30
PresArt           PresArt         1
GlobBlanc       GlobBlanc       212
FrecCard         FrecCard         1
FrecResp         FrecResp         1
temperatura   temperatura         1
OxArt-OxInsp OxArt-OxInsp      2325
albumina         albumina      3372
bilirrubina   bilirrubina      2601
creatinina     creatinina        67
sodio               sodio         1
pH                     pH      2284
glucosa           glucosa      4500
NitrUreico     NitrUreico      4352
ProdOrina       ProdOrina      4862
IndActDiaria IndActDiaria      5641
IndSust           IndSust      2867
ADL                   ADL         0
Muerte             Muerte         0
MuerteHosp     MuerteHosp         0
DiscFunc         DiscFunc      1400

Algunas variables cuentan con muchos datos faltantes, en especial las relacionadas con mediciones de componentes en la sangre, o variables relacionadas con actividades luego de la salida del hospital (probablemente por parte de los pacientes que fallecieron allí).

Para el caso del ingreso, que también cuenta con muchos datos faltantes, se puede llegar a considerar una categorización tomando el dato faltante como una categoría, o extraer a dichos individuos del estudio.

Posibles Análisis estadísticos

  • Aprendizaje no supervisado:

Se plantea implementar modelos de aprendizaje no supervisado para explorar relaciones y agrupaciones de individuos y variables, como pueden ser por ejemplo que las personas con mayor nivel de ingresos tiendan tener mayores gastos hospitalarios y tengan mas probabilidades de sobrevivir, o que se asocien algunas condiciones como niveles de componentes en la sangre, diabetes, glucosa y demás a ciertas enfermedades particularmente.

  • Aprendizaje supervisado:

Se plantea implementar modelos que permitan predecir los valores de alguna variable en base a la información disponible. El ejemplo más lógico sería tomar como variable de respuesta la muerte o supervivencia del paciente, e implementar un modelo de clasificación que permita determinar si un paciente sobrevivirá en base a características como el número de comorbilidades simultáneas que posee, niveles de componentes en sangre, costos hospitalarios, edad, etc.

También se podrían plantear modelos tomando la variable de muerte en el hospital como respuesta, para separar a los individuos que sobrevivieron dentro del hospital de los que no, y analizar a estos individuos por separado.