1 Introducción

El paquete {medicaldata} cuenta con 20 conjuntos de datos de salud, que son útiles para aplicaciones de modelación estadística con R, para profesionales de dicha disciplina, incluidas enfermeras, farmacéuticos, aprendices y estudiantes.

Estos conjuntos de datos van desde versiones reconstruidas, como por ejemplo, el conjunto de datos de escorbuto de James Lind (1757), el ensayo clínico original de estreptomicina para la tuberculosis (1948) y de indometacina para prevenir la pancreatitis en el 2012.

Muchos de los conjuntos de datos provienen del portal de recursos Teaching Statistics in the Health Sciences (TSHS) de la Asociación Estadounidense de Estadística, mantenido por Carol Bigelow en la Universidad de Massachusetts. Asimismo Frank Harrell donó conjuntos de datos en la versión de desarrollo; estos conjuntos de datos actualmente se encuentran en github: https://higgi13425.github.io/medicaldata/.

2 Objetivo

Configurar el área de trabajo en Rstudio, instalar y activar la paqueteria Medicaldata (desde github).

Explorar el conjunto de datos: propensión a padecer diabetes.

3 Instalación

Si se desea la versión en desarrollo (que puede tener nuevos conjuntos de datos y viñetas), se instala con:

remotes::install_github("higgi13425/medicaldata", force = T)
## Downloading GitHub repo higgi13425/medicaldata@HEAD
## Running `R CMD build`...
## * checking for file ‘/private/var/folders/jd/ks1q1smd2hx0l016prvqs40w0000gn/T/Rtmppynv88/remotes30bb57a84ab6/higgi13425-medicaldata-a73901f/DESCRIPTION’ ... OK
## * preparing ‘medicaldata’:
## * checking DESCRIPTION meta-information ... OK
## * checking for LF line-endings in source and make files and shell scripts
## * checking for empty or unneeded directories
## * building ‘medicaldata_0.2.0.9001.tar.gz’

Una vez instalado el paquete, se carga la libreria de la forma siguiente:

library(medicaldata)

La lista de conjuntos de datos disponibles en el paquete es:

  • abm: Observational Dataset of Acute Bacterial Meningitis

  • blood_storage: Retrospective Cohort Study of the Effects of Blood Storage on Prostate Cancer

  • cath: Observational Dataset of Cardiac Catheterization

  • cdystonia: RCT of Botulinum Toxin B for Cervical Dystonia

  • covid_testing: Deidentified Results of COVID-19 testing at the Children’s Hospital of Pennsylvania (CHOP) in 2020

  • cytomegalovirus: Retrospective Cohort Study of the Effects of Donor KIR genotype on the reactivation of cytomegalovirus (CMV) after myeloablative allogeneic hematopoietic stem cell transplant.

  • diabetes: Diabetes Prediction Dataset from the Pima Indian Tribe and the NIDDK

  • esoph_ca: Esophageal Cancer dataset

  • indo_rct: RCT of Indomethacin for Prevention of Post-ERCP Pancreatitis

  • indometh (Indometh): Cohort Study of the Pharmacokinetics of Intravenous Indomethacin

  • laryngoscope: Randomized, Comparison Trial of Video vs. Standard Laryngoscope

  • licorice_gargle: Randomized, Controlled Trial of Licorice Gargle before Intubation for Elective Thoracic Surgery

  • opt: Obstetrics and Periodontal Therapy Dataset

  • polyps: RCT of Sulindac for Polyp Prevention in Familial Adenomatous Polyposis

  • scurvy: Randomized Trial of Six Therapies for Scurvy

  • smartpill: Prospective Cohort Study of Intestinal Transit using a SmartPill to Compare Trauma Patients to Healthy Volunteers

  • strep_tb: RCT of Streptomycin Therapy for Tuberculosis

  • supraclavicular: Study of Supraclavicular Anesthesia

  • theoph: Cohort Study of the Pharmacokinetics of Oral Theophylline

  • thiomon: Deidentified Laboratory Data on IBD Patients using Thiourines for at least 4 weeks and their Eventual Remission/Active Status after at least 12 Weeks of Therapy.

4 Estudio de caso

Para el ejemplo siguiente se utilizará la base de datos “diabetes”, la cual se compone de una recopilación de datos de la tribu de los indios Pima ubicada cerca de Phoenix, Arizona (EE. UU.), en donde la prevalencia de diabetes tipo 2 es alta.

El National Institute of Diabetes and Digestive and Kidney Diseases (NIDDK), reunió una serie de variables predictivas de diabetes y se midieron los resultados de un diagnóstico de diabetes tipo 2 después de 5 años posteriores a las mediciones iniciales. Este conjunto de datos incluye solo mujeres de al menos 21 años de edad y de herencia indígena pima, con al menos 5 años de seguimiento en un estudio longitudinal de diabetes.

# Cargamos base de datos "diabetes"
data(diabetes)

# Asignamos la base de datos al nombre: datos
datos <- diabetes

# Adjuntar los datos
attach(datos)

Este conjunto de datos contiene 768 participantes en riesgo de diabetes que participaron en el estudio longitudinal del NIDDK, con medidas de referencia y resultados de diabetes a 5 años. Hay varias variables clínicas que pueden ser factores de riesgo de diabetes, incluido el embarazo, la glucosa, la insulina, el índice de masa corporal, la medición de la grasa corporal en el tríceps y el pedigrí (antecedentes familiares de diabetes como una puntuación numérica). La variable de resultado es diabetes_5y, y esperamos identificar predictores de diabetes futura.

# Visualizamos los primeros 6 renglones de la base de datos
head(datos)
##   pregnancy_num glucose_mg-dl dbp_mm-hg triceps_mm insulin_microiu-ml  bmi
## 1             6           148        72         35                 NA 33.6
## 2             1            85        66         29                 NA 26.6
## 3             8           183        64         NA                 NA 23.3
## 4             1            89        66         23                 94 28.1
## 5             0           137        40         35                168 43.1
## 6             5           116        74         NA                 NA 25.6
##   pedigree age diabetes_5y
## 1    0.627  50         pos
## 2    0.351  31         neg
## 3    0.672  32         pos
## 4    0.167  21         neg
## 5    2.288  33         pos
## 6    0.201  30         neg

Variables

# Visualizamos el nombre de las variables que tiene la base

names(datos)
## [1] "pregnancy_num"      "glucose_mg-dl"      "dbp_mm-hg"         
## [4] "triceps_mm"         "insulin_microiu-ml" "bmi"               
## [7] "pedigree"           "age"                "diabetes_5y"
  • pregnancy_num : Número de embarazos, con rango de 0 a 17 embarazos y ningún dato faltante; tipo: doble

  • glucose_mg-dl : Nivel de glucosa en el plasma al realizar en una prueba de tolerancia oral a la glucosa, con rango de 44 a 199 mg/dl, con 5 datos faltantes; tipo: doble

  • dbp_mm-hg : Presión arterial diastólica en mm Hg. tipo: doble

  • triceps_mm : Espesor del pliegue cutáneo del tríceps, una medida de grasa subcutánea, con rango de 7 a 99 mm, con 227 datos faltantes; tipo: doble

  • insulin_microiu-ml : Insulina sérica después de 2 horas de la administración de una prueba de tolerancia oral a la glucosa, con rango de 14 a 846 microU/mL y con 374 datos faltantes; tipo: doble

  • bmi : Índice de masa corporal, con un rango de 18.2 a 67.1 kg de peso por metro de altura al cuadrado, con 11 datos faltantes; tipo: doble

  • pedigree : La función de pedigrí de diabetes indica la probabilidad de padecer diabetes en base a los antecedentes familiares, ponderada por la cercanía de su relación genética con el participante, tiene un rango de de 0.78 a 2.42 y ningún dato faltante; tipo: doble

  • age : Edad con rango de 21 a 81 años, con ningún dato faltante; tipo: doble

  • diabetes_5y : Variable de resultado, diagnóstico de diabetes en los siguientes 5 años, variable dicotómica: positivo (pos) o negativo (neg), con ningún dato faltante; tipo: factor

5 Datos faltantes

Las bases de datos no son del todo perfectas, existen multiples errores, por ejemplo, al insertar los datos de manera computacional pueden ocurrir sobrevistos y equivocaciones que terminan en bases de datos con valores incorrectos o inapropiados; además existe el riesgo de dadas de baja de pacientes en ensayos clínicos ocasionando datos perdidos e imposibles de conseguir de nuevo. Por lo cual, en algunos casos se recomienda trabajar solo con los datos que no excluyan información. Los pacientes que no cuenten con su infomación completa, serán omitidos como se muestra a continuación.

# Cargar libreria
library(dplyr)

# Total de datos faltantes (Na´s)
sum(is.na(datos[1:9]))
## [1] 652
# Omitir datos faltantes (Na´s)
datos1 <- na.omit(datos)

6 Ánalisis estadístico

La función pairs.panels() del paquete {psych} también se puede usar para crear un diagrama de dispersión de matrices, con diagramas de dispersión bivariados debajo de la diagonal, histogramas en la diagonal y la correlación de Pearson sobre la diagonal.

library(psych)

pairs.panels(diabetes, 
             method = "pearson", # correlation method
             hist.col = "#00AFBB",
             density = TRUE,  # show density plots
             ellipses = TRUE # show correlation ellipses
             )

Interpretación: La correlación más alta entre las variables es de 0.65 (casi moredada) y se encuentra entre el espesor del tricep y índice de masa corporal, lo cual tiene sentido ya que entre más masa corporal se tendrá un tricep con mayor volumen. La segunda correlación más alta es de 0.58 y es entre la concentración de glucosa en el plasma y la insulina sérica

6.1 Evaluación de supuestos

6.1.0.0.1 Normalidad
# Cargar libreria
library(stats)

#shapiro.test()

7 Prueba de medias

7.0.0.1 Gráfico de box-plot,

Para obtener un panorama genral sobre la base de datos, se recomienda utilizar la función summary(), la cual genera un resumen de cada variable, es decir, calcula valores importantes tales como, mínimos, máximos, cuantiles e indica los valores faltantes dentro cada una de las variables de interés.

# Resumen de la base de datos
summary(datos)
##  pregnancy_num    glucose_mg-dl     dbp_mm-hg        triceps_mm   
##  Min.   : 0.000   Min.   : 44.0   Min.   : 24.00   Min.   : 7.00  
##  1st Qu.: 1.000   1st Qu.: 99.0   1st Qu.: 64.00   1st Qu.:22.00  
##  Median : 3.000   Median :117.0   Median : 72.00   Median :29.00  
##  Mean   : 3.845   Mean   :121.7   Mean   : 72.41   Mean   :29.15  
##  3rd Qu.: 6.000   3rd Qu.:141.0   3rd Qu.: 80.00   3rd Qu.:36.00  
##  Max.   :17.000   Max.   :199.0   Max.   :122.00   Max.   :99.00  
##                   NA's   :5       NA's   :35       NA's   :227    
##  insulin_microiu-ml      bmi           pedigree           age       
##  Min.   : 14.00     Min.   :18.20   Min.   :0.0780   Min.   :21.00  
##  1st Qu.: 76.25     1st Qu.:27.50   1st Qu.:0.2437   1st Qu.:24.00  
##  Median :125.00     Median :32.30   Median :0.3725   Median :29.00  
##  Mean   :155.55     Mean   :32.46   Mean   :0.4719   Mean   :33.24  
##  3rd Qu.:190.00     3rd Qu.:36.60   3rd Qu.:0.6262   3rd Qu.:41.00  
##  Max.   :846.00     Max.   :67.10   Max.   :2.4200   Max.   :81.00  
##  NA's   :374        NA's   :11                                      
##  diabetes_5y
##  neg:500    
##  pos:268    
##             
##             
##             
##             
## 

7.0.1 Visualización de datos

Una de las formas básicas para generar un histograma, es utiliza la función hist(), dentro de la cual se necesita declarar los valores a graficar, en este caso será la cantidad de glucosa en (mg/dl), y asignar el titulo del gráfico y los ejes.

# Histograma de las mediciones de glucosa
hist(datos$glucose, main = "Histograma de Glucosa", xlab = "Glucosa (mg/dL)", col="skyblue")

Ahora, para visualizar un gráfico de dispersión, una función básica es plot(), la cual requiere primeramente dos argumentos: valores para x y valores para y, a partir de allí, se añade el diseño como el titulo general, titulo de ejes, colores, etc.

# Diagrama de dispersión de glucosa vs insulina
plot(datos$glucose, datos$insulin, main = "Diagrama de dispersión de glucosa vs insulina", xlab = "Glucosa (mg/dL)", ylab = "Insulina (mu U/ml)", col=blues9)

Una manera más avanzada y nueva de generar gráficos es mediante la paquetería {ggplot2}, la cual incluye ciertas funciones que dan la posibilidad de ser más especificos en las instrucciones y darle un mejor diseño a las gráficas.

Para instalar el paquete desde el CRAN, basta con escribir install.packages(“ggplot2”), después se carga la librería como se muestra a continuación:

# Cargar la librería
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha

Para generar cualquier tipo de gráfico se utilizará primeramente la función ggplot() dentro de la cual se declara la base de la cual se obtendrán los datos, y después dentro de la misma función se utiliza aes() en la cual se especifican los valores para los ejes e incluso especificar si se quieren agrupar los datos.

Agregando la función geom_density() se indica que se trata de un gráfico de dispersión y con el argumento alpha se indica la transparencia de los colores que estarán debajo de la curva.

Asi mismo, con la función ggtitle() se agrega el titulo general para el gráfico.

En este caso se desea generar un gráfico de densidad de la edad, según el diagnóstico de diabetes después de 5 años (pos o neg).

# Gráfico de densidad para la edad
ggplot(datos, aes(x = age, fill = diabetes_5y)) +
  geom_density(alpha = 0.5) +
  ggtitle("Distribución de edad agrupada en estado de diabetes después de 5 años")

Para el caso siguiente se desea generar un gráfico de barras de las mediciones del índice de masa corporal, por lo cual se utilizará la función geom_bar() y además también se declaran los titulos de cada uno de los ejes mediante las funciones xlab() y ylab().

# Gráfico de barras para la variable "bmi"
ggplot(datos, aes(x = bmi)) +
  geom_bar() +
  ggtitle("Distribución de índice de masa corporal") +
  xlab("Índice de masa corporal") +
  ylab("Número de pacientes")

Después para generar un disgrama de disperción un poco más sofisticado a comparación del anteriormente realizado, se puede utilizar la función geom_point() y además usar geom_smooth() la cual usa distintos métodos para estimar la media condicionada (curva de regresión) de una variable por otra, incluyendo el método de mínimos cuadrados.

ggplot(data = datos) +
  geom_point(aes(x = datos$`glucose_mg-dl`, y = bmi),
                     col = 'darkblue',
                     size = 3,
                     alpha = 1/5) + 
  geom_smooth(aes(x = datos$`glucose_mg-dl`, y = bmi), method = 'lm') +   # Opción por defecto
  xlab("Glucosa") +
  ylab("Índice de masa corporal")

8 Bibliografía

Más información se encuentra en Higgins (2023)

Higgins, P. (2023). Medicaldata: Data package for medical datasets.