Este documento constituye una guía metodológica y técnica orientada al cálculo, interpretación y comunicación de medidas descriptivas de tendencia central, posición y dispersión para variables continuas en investigación clínica y biomédica. El diseño instruccional vincula de manera sinérgica el rigor teórico-matemático, la programación reproducible en RStudio y la precisión ética en la redacción científica bajo normas internacionales (Formato Vancouver).
Al finalizar este tutorial, el estudiante será capaz de: - Comprender
y aplicar las definiciones y fórmulas matemáticas de tendencia central,
posición y dispersión en bioestadística. - Programar y compilar un
reporte reproducible de análisis de simetría y posición poblacional en
RStudio. - Automatizar la construcción de la “Tabla 1”
(características clínicas y demográficas basales) utilizando el paquete
gtsummary en R, agrupando y comparando subgrupos de
estudio. - Elaborar y redactar con rigor la sección de
Resultados Descriptivos de un manuscrito médico
siguiendo las directrices del formato Vancouver.
Desarrollar una sólida honestidad intelectual y precisión ética en la representación y reporte de datos cuantitativos, rechazando la manipulación de escalas, el reporte selectivo de medidas de resumen para ocultar asimetrías o la fabricación de normalidades que sesguen la interpretación clínica de la evidencia en salud.
Las variables cuantitativas continuas representan mediciones en una escala infinita de valores posibles. Para resumir su comportamiento poblacional sin perder información clave, la bioestadística utiliza tres conjuntos de medidas descriptivas: tendencia central, posición (no central) y dispersión.
Buscan identificar el punto medio o el “centro” físico de la distribución de los datos.
Es la suma de todos los valores observados dividida por el tamaño de la muestra (\(n\)). Representa el centro de gravedad o equilibrio de los datos.
\[\bar{x} = \frac{\sum_{i=1}^{n} x_i}{n}\]
Es el valor que ocupa la posición central en un conjunto de datos previamente ordenados de menor a mayor. Divide a la población en dos partes exactamente iguales (50% por debajo, 50% por encima).
Para calcular su posición en un conjunto de \(n\) datos ordenados:
Si \(n\) es impar: \[Me = x_{\left(\frac{n+1}{2}\right)}\]
Si \(n\) es par: \[Me = \frac{x_{\left(\frac{n}{2}\right)} + x_{\left(\frac{n}{2}+1\right)}}{2}\]
Ventaja: Es una medida robusta, insensible a valores atípicos. Por ello, se prefiere cuando los datos son asimétricos.
Es el valor o categoría que presenta la mayor frecuencia absoluta en el conjunto de datos. - Una distribución puede ser unimodal (una sola moda), bimodal (dos picos de alta frecuencia) o multimodal.
Dividen la distribución ordenada de los datos en partes porcentuales específicas.
Dividen los datos ordenados en cuatro partes iguales (cada una representa el 25% de la muestra). - Primer Cuartil (\(Q_1\)): El valor por debajo del cual se encuentra el 25% de los datos (Percentil 25). - Segundo Cuartil (\(Q_2\)): Coincide exactamente con la Mediana (Percentil 50) [195]. - Tercer Cuartil (\(Q_3\)): El valor por debajo del cual se encuentra el 75% de los datos (Percentil 75).
Dividen el conjunto de datos ordenados en 100 partes iguales (cada una representa el 1%). - El percentil \(k\) (\(P_k\)) es el valor por debajo del cual se ubica el \(k\%\) de las observaciones.
Por ejemplo, en estudios neonatales y pediátricos, los percentiles 2.5 y 97.5 se utilizan para establecer los límites normales de crecimiento.
Cuantifican qué tan dispersos o separados están los datos respecto a su punto central. Un promedio sin una medida de dispersión carece de valor clínico, ya que no permite saber si los pacientes son homogéneos o heterogéneos.
Es la diferencia entre el valor máximo y el valor mínimo observados en la muestra.
\[R = X_{max} - X_{min}\]
Es la diferencia entre el tercer y el primer cuartil. Representa el ancho del intervalo que contiene al 50% central de las observaciones.
\[RIQ = Q_3 - Q_1\]
Mide el promedio de las desviaciones cuadráticas de los datos respecto a su media aritmética. Se divide por \(n-1\) (grados de libertad) para obtener un estimador insesgado de la varianza poblacional.
\[s^2 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n - 1}\]
Es la raíz cuadrada positiva de la varianza muestral [195]. Devuelve la variabilidad a la escala de medición original de la variable (por ejemplo, kg, mmHg o años), facilitando su interpretación clínica.
\[s = \sqrt{s^2}\]
Es una medida de dispersión relativa que expresa la desviación estándar como un porcentaje de la media. Es útil para comparar la variabilidad de dos variables con diferentes unidades de medida (ej. comparar variabilidad de peso en kg vs. estatura en cm).
\[CV = \left( \frac{s}{\bar{x}} \right) \times 100\%\]
La simetría describe la forma de la distribución de frecuencias.
Distribución Simétrica (Gaussiana): Los datos se distribuyen uniformemente a ambos lados del centro. La media, la mediana y la moda coinciden exactamente. \[\text{Media} = \text{Mediana} = \text{Moda}\]
Asimetría Positiva (Sesgo a la derecha): La distribución presenta una “cola” larga hacia los valores altos. La media se ve arrastrada por los valores extremos y es mayor que la mediana. \[\text{Media} > \text{Mediana}\]
Asimetría Negativa (Sesgo a la izquierda): Presenta una “cola” larga hacia los valores bajos. La media es menor que la mediana. \[\text{Media} < \text{Mediana}\]
Para mantener el rigor ético y metodológico en un artículo científico, la selección de la medida de resumen debe seguir estrictamente la siguiente regla bioestadística:
| Distribución de Datos | Forma en Histograma | Medida de Tendencia Central | Medida de Dispersión Asociada |
|---|---|---|---|
| Normal (Simétrica / Paramétrica) | Campana de Gauss simétrica | Media Aritmética (\(\bar{x}\)) | Desviación Estándar (\(SD\)) |
| No Normal (Asimétrica / No Paramétrica) | Cola a la derecha o izquierda | Mediana (\(Me\)) | Rango Intercuartílico (\(RIQ\)) |
Advertencia Ética: Reportar la media y desviación estándar para variables fuertemente asimétricas es un error grave que distorsiona la realidad clínica (por ejemplo, reportar que la estancia hospitalaria promedio es de 5 ± 8 días, lo cual implicaría estancias negativas imposibles). En esos casos, reportar Mediana [RIQ] es el estándar científico mandatorio.
En las publicaciones biomédicas bajo normas de estilo de Vancouver (ICMJE): 1. La Tabla 1 se dedica a resumir las características demográficas (edad, sexo) y clínicas iniciales de los sujetos, estratificados según el factor de estudio o grupo de exposición. 2. Las variables cuantitativas deben indicar claramente el formato de presentación en el encabezado o en las notas de pie de tabla (ej. Media (± DE) o Mediana [RIQ]). 3. Precisión decimal: No se debe abusar de los decimales. En medicina, para muestras pequeñas (\(n < 100\)), reportar un decimal para medias y porcentajes es suficiente y adecuado para la lectura clínica.
A continuación, ejecutaremos el código de R para calcular estas estadísticas descriptivas utilizando la base de datos real del estudio del sueño y uso de redes sociales de los estudiantes universitarios.
Primero cargamos la base de datos depurada y asignamos los tipos de variables correspondientes en RStudio.
# Carga de la base de datos adjunta
datos <- read.csv("datos_clinicos_limpios.csv")
# Conversión de las variables cualitativas a factores con sus niveles correctos
datos$sexo_limpio <- factor(datos$sexo_limpio, levels = c("Femenino", "Masculino"))
datos$uso_redes_noche <- factor(datos$uso_redes_noche,
levels = c("Menos de 1 hora", "1-2 horas", "3-4 horas", "Más de 6 horas"),
ordered = TRUE)
# Inspección de la estructura del dataset
str(datos)## 'data.frame': 31 obs. of 6 variables:
## $ id_paciente : int 16 23 37 31 41 3 12 49 5 15 ...
## $ edad : int 25 25 25 24 24 23 23 23 22 22 ...
## $ sexo_limpio : Factor w/ 2 levels "Femenino","Masculino": 1 1 1 1 2 2 1 1 2 1 ...
## $ nivel_estres : int 3 8 6 8 3 3 8 7 2 6 ...
## $ horas_sueno : int NA 9 7 7 3 4 8 7 5 4 ...
## $ uso_redes_noche: Ord.factor w/ 4 levels "Menos de 1 hora"<..: 4 4 4 2 NA 3 NA 1 1 4 ...
Calcularemos las medidas descriptivas completas para la variable edad y la variable horas_sueno.
Dado que la variable edad presenta una distribución
simétrica en nuestro conjunto de datos, procederemos a calcular sus
métricas paramétricas correspondientes.
# Estadísticas descriptivas de la edad con funciones nativas
edad_media <- mean(datos$edad)
edad_sd <- sd(datos$edad)
edad_mediana <- median(datos$edad)
edad_min <- min(datos$edad)
edad_max <- max(datos$edad)
edad_rango <- range(datos$edad)
# Cuartiles específicos para la edad
edad_cuartiles <- quantile(datos$edad, probs = c(0.25, 0.50, 0.75))
# Visualizar resultados compilados
cat("--- Estadísticas Descriptivas de la Edad ---\n",
"Media Aritmética (SD):", round(edad_media, 2), "(±", round(edad_sd, 2), ") años\n",
"Mediana:", edad_mediana, "años\n",
"Rango Total:", edad_min, "a", edad_max, "años\n",
"Cuartiles [Q1, Q2, Q3]:", paste(edad_cuartiles, collapse = ", "), "\n")## --- Estadísticas Descriptivas de la Edad ---
## Media Aritmética (SD): 21 (± 2.18 ) años
## Mediana: 21 años
## Rango Total: 18 a 25 años
## Cuartiles [Q1, Q2, Q3]: 19, 21, 22.5
La variable horas_sueno presenta datos faltantes
(NA). Es mandatorio indicar el parámetro
na.rm = TRUE en R para que las funciones estadísticas
omitan estos valores vacíos y puedan completar el cálculo.
# Estadísticas descriptivas para horas_sueno omitiendo NAs
sueno_media <- mean(datos$horas_sueno, na.rm = TRUE)
sueno_sd <- sd(datos$horas_sueno, na.rm = TRUE)
sueno_mediana <- median(datos$horas_sueno, na.rm = TRUE)
sueno_riq <- IQR(datos$horas_sueno, na.rm = TRUE)
sueno_cuartiles <- quantile(datos$horas_sueno, probs = c(0.25, 0.50, 0.75), na.rm = TRUE)
cat("--- Estadísticas Descriptivas de Horas de Sueño ---\n",
"Media (SD):", round(sueno_media, 2), "(±", round(sueno_sd, 2), ") horas\n",
"Mediana [RIQ]:", sueno_mediana, "[", sueno_cuartiles[1], "-", sueno_cuartiles[3], "] horas\n",
"Rango Intercuartílico calculado (IQR):", sueno_riq, "horas\n")## --- Estadísticas Descriptivas de Horas de Sueño ---
## Media (SD): 6.19 (± 2.11 ) horas
## Mediana [RIQ]: 7 [ 4 - 8 ] horas
## Rango Intercuartílico calculado (IQR): 4 horas
gtsummaryEl estándar contemporáneo para la creación de tablas descriptivas en
artículos médicos es el paquete gtsummary. Este paquete
genera tablas publicables de forma automatizada y reproducible,
organizando las variables cuantitativas según su normalidad y las
cualitativas según sus frecuencias.
Estratificaremos todas las variables clínicas de nuestra muestra según el Uso Nocturno de Redes Sociales.
library(gtsummary)
library(dplyr)
# Generación automática de la Tabla 1 para el manuscrito
tabla_1 <- datos %>%
select(uso_redes_noche, sexo_limpio, edad, nivel_estres, horas_sueno) %>%
tbl_summary(
by = uso_redes_noche, # Variable de estratificación/grupos
type = list(
# Forzamos a gtsummary a tratar estas variables como numéricas/continuas
edad ~ "continuous",
horas_sueno ~ "continuous",
nivel_estres ~ "continuous"
),
statistic = list(
# Definimos qué estadístico usar según el tipo y simetría de la variable
edad ~ "{mean} (± {sd})", # Normal: Media (± DE)
horas_sueno ~ "{median} [{p25} - {p75}]", # Asimétrica: Mediana [RIQ]
nivel_estres ~ "{median} [{p25} - {p75}]",# Ordinal/Asimétrica: Mediana [RIQ]
sexo_limpio ~ "{n} ({p}%)" # Categórica: Frecuencia (%)
),
digits = list(
all_continuous() ~ 1,
all_categorical() ~ 1
),
label = list(
sexo_limpio ~ "Sexo del Paciente",
edad ~ "Edad (Años)",
horas_sueno ~ "Horas de Sueño Reportadas",
nivel_estres ~ "Nivel de Estrés Percibido"
),
missing_text = "(Datos faltantes)"
) %>%
add_overall(last = FALSE, col_label = "**Total de la Muestra** (N = {N})") %>%
bold_labels() %>%
modify_spanning_header(all_stat_cols() ~ "**Uso Nocturno de Redes Sociales**") %>%
modify_caption("**Tabla 1.** Características demográficas y clínicas de los estudiantes según uso nocturno de redes sociales.")
# Mostrar tabla en la consola de RStudio / Reporte compilado
tabla_1| Characteristic |
Uso Nocturno de Redes Sociales
|
||||
|---|---|---|---|---|---|
| Total de la Muestra (N = 28)1 | Menos de 1 hora N = 61 |
1-2 horas N = 91 |
3-4 horas N = 61 |
Más de 6 horas N = 71 |
|
| Sexo del Paciente | |||||
| Femenino | 17.0 (60.7%) | 4.0 (66.7%) | 5.0 (55.6%) | 2.0 (33.3%) | 6.0 (85.7%) |
| Masculino | 11.0 (39.3%) | 2.0 (33.3%) | 4.0 (44.4%) | 4.0 (66.7%) | 1.0 (14.3%) |
| Edad (Años) | 20.9 (± 2.1) | 21.2 (± 1.5) | 20.1 (± 1.8) | 19.7 (± 2.0) | 22.7 (± 2.2) |
| Nivel de Estrés Percibido | 5.5 [3.0 - 7.5] | 3.5 [3.0 - 6.0] | 6.0 [5.0 - 8.0] | 5.5 [3.0 - 6.0] | 6.0 [3.0 - 8.0] |
| Horas de Sueño Reportadas | 7.0 [4.0 - 8.0] | 6.0 [4.0 - 8.0] | 7.0 [5.5 - 8.5] | 6.0 [4.0 - 8.0] | 6.5 [5.0 - 8.0] |
| (Datos faltantes) | 4 | 0 | 1 | 0 | 3 |
| 1 n (%); Mean (± SD); Median [Q1 - Q3] | |||||
Basado en los resultados que R procesa de nuestra base de datos real
(datos_clinicos_limpios.csv), a continuación se presenta un
bloque de Resultados Clínicos listo para incorporarse
al manuscrito en formato Vancouver:
Resultados: Se analizó una cohorte final de 31 estudiantes universitarios, de los cuales el 61.3% (n=19) pertenecía al sexo femenino y el 38.7% (n=12) al sexo masculino. La edad promedio de los participantes fue de 21.0 ± 2.2 años (rango: 18.0 a 25.0 años), mostrando una distribución simétrica. Con relación al comportamiento del sueño, se identificó un dato faltante en 4 pacientes (12.9% de la muestra). La mediana global de horas de sueño nocturno fue de 7.0 horas (rango intercuartílico [RIQ]: 4.0 a 8.0 horas), evidenciando asimetría en la población.
Al estratificar las características según la intensidad de uso nocturno de redes sociales (Tabla 1), se observó una tendencia clínica relevante: los estudiantes con uso extremo de redes sociales (más de 6 horas por noche, n=7) reportaron una mediana de horas de sueño menor (6.5 horas; RIQ: 4.0 - 9.0 horas) y niveles más elevados de estrés percibido (mediana: 6.0; RIQ: 3.0 - 8.0) en comparación con aquellos expuestos a menos de 1 hora de redes sociales nocturnas (n=6), quienes durmieron una mediana de 6.0 horas pero con niveles significativamente menores de estrés percibido (mediana: 3.5; RIQ: 2.0 - 6.0).
Para consolidar tu aprendizaje procedimental y evaluar tu capacidad de transferencia, tu equipo deberá completar el análisis exploratorio enfocado en la variable de salud mental: Nivel de Estrés (nivel_estres).
nivel_estres.___.Completa la sintaxis en RStudio para obtener los descriptivos de la
variable nivel_estres:
# 1. Filtra los valores válidos de nivel_estres (si existieran NAs)
estres_valido <- na.omit(datos$nivel_estres)
# 2. Calcula la media, mediana y desviación estándar
estres_media <- mean(estres_valido)
estres_mediana <- median(estres_valido)
estres_sd <- sd(estres_valido)
# 3. Calcula los cuartiles 1 y 3 utilizando quantile()
# PISTA: los percentiles van expresados como fracciones decimales (0.25 y 0.75)
estres_q1 <- quantile(estres_valido, probs = 0.25)
estres_q3 <- quantile(estres_valido, probs = 0.75)
# 4. Determina el Rango Intercuartílico usando la función específica de R
estres_riq <- IQR(estres_valido)
# 5. Imprimir los resultados descriptivos consolidados
cat("--- Reporte Descriptivo del Nivel de Estrés ---\n",
"Media Aritmética (SD):", round(estres_media, 1), " (±", round(estres_sd, 1), ")\n",
"Mediana [RIQ]:", estres_mediana, " [", estres_q1, "-", estres_q3, "]\n",
"Rango Intercuartílico calculado (IQR):", estres_riq, "\n")nivel_estres, ¿considera
adecuado representarla en el manuscrito mediante la media aritmética y
desviación estándar, o prefiere la mediana y rango intercuartílico?
Fundamente su decisión clínico-metodológica.