knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE,
  fig.width = 14,
  fig.height = 9,
  dpi = 150,
  fig.align = "center",
  out.width = "100%",
  fig.retina = 2,
  cache = FALSE
)

library(ggplot2)

tema_profesional <- theme_minimal(base_size = 20) +
  theme(
    plot.title = element_text(face = "bold", size = 26, hjust = 0.5, 
                              color = "#1a5276", margin = margin(b = 12)),
    plot.subtitle = element_text(size = 18, hjust = 0.5, color = "#5d6d7e",
                                 margin = margin(b = 15)),
    plot.caption = element_text(size = 14, hjust = 0.5, face = "italic", 
                                color = "#7f8c8d"),
    axis.title = element_text(face = "bold", size = 22, color = "#2c3e50"),
    axis.text = element_text(size = 18, color = "#34495e"),
    axis.line = element_line(color = "#bdc3c7", linewidth = 0.5),
    panel.grid.major = element_line(color = "#ecf0f1", linewidth = 0.3),
    panel.grid.minor = element_blank(),
    panel.background = element_rect(fill = "white"),
    legend.title = element_text(face = "bold", size = 20),
    legend.text = element_text(size = 16),
    legend.background = element_rect(fill = "white", color = NA),
    plot.margin = margin(25, 25, 25, 25)
  )

theme_set(tema_profesional)

0.1 Introducción de la entrega final y consolidación

El presente informe corresponde a la entrega final del curso, en la cual consolidaré de manera integrada los aprendizajes desarrollados a lo largo de los diferentes entregables de bioestadística aplicada a la epidemiología.

A través de este documento articularé el análisis descriptivo, el análisis inferencial y el cálculo del tamaño de muestra, con el propósito de demostrar una comprensión progresiva, crítica y aplicada del análisis estadístico de datos en salud pública.

En el primer entregable, realicé un análisis descriptivo univariado de una cohorte de 125 escolares colombianos, con el objetivo de caracterizar individualmente variables demográficas, antropométricas, clínicas y bioquímicas. Calculé medidas de tendencia central, incluyendo media, mediana y moda; medidas de dispersión como desviación estándar, varianza, rango intercuartílico y coeficiente de variación; y medidas de forma como asimetría y curtosis. Para complementar este análisis, construí histogramas y diagramas de caja, lo que me permitió visualizar la distribución de cada variable, identificar valores atípicos y reconocer patrones iniciales de riesgo metabólico, así como posibles subgrupos de interés clínico en población pediátrica.

Posteriormente, en el segundo entregable, avancé desde la descripción hacia la inferencia estadística mediante pruebas paramétricas, aplicables bajo el supuesto de normalidad. Utilicé la prueba t de Student para comparar medias entre dos grupos independientes y para muestras relacionadas, así como análisis de varianza (ANOVA) en comparaciones de más de dos grupos.

Antes de aplicar estas pruebas, verifiqué rigurosamente los supuestos estadísticos, evaluando la normalidad mediante la prueba de Shapiro-Wilk y la homogeneidad de varianzas con la prueba de Levene.

Además, calculé intervalos de confianza al 95% y estimé el tamaño del efecto mediante el d de Cohen, lo que me permitió interpretar los resultados no solo desde la significancia estadística, sino también desde su relevancia clínica, comprendiendo que ambos enfoques no siempre coinciden.

En el tercer entregable, profundicé en el uso de pruebas no paramétricas, fundamentales cuando los datos no cumplen los supuestos de normalidad o cuando se analizan variables ordinales.

Apliqué la prueba de Mann-Whitney U para la comparación de dos grupos independientes, la prueba de Wilcoxon de rangos con signo para datos apareados, y la prueba de Chi-cuadrado para evaluar asociaciones entre variables categóricas.

Este análisis me permitió reconocer la importancia de seleccionar pruebas basadas en rangos cuando existen distribuciones asimétricas, valores extremos o tamaños muestrales pequeños, fortaleciendo mi criterio metodológico en la toma de decisiones estadísticas.

Finalmente, en el cuarto entregable, que constituye el eje central del presente informe, realizaré el cálculo del tamaño de muestra para distintos escenarios de investigación epidemiológica.

A partir de los parámetros observados en la cohorte analizada —medias, desviaciones estándar y proporciones— aplicaré fórmulas estadísticas y funciones implementadas en R para determinar el número de participantes necesarios tanto para estimar parámetros con precisión definida como para detectar diferencias entre grupos con potencia adecuada.

Exploraré escenarios de estimación de medias y proporciones, comparación de medias independientes con grupos iguales y desiguales, comparación de proporciones, diseños hipotéticos de no-inferioridad, equivalencia y estudios con datos apareados, integrando de forma transversal los conceptos de error tipo I, error tipo II y potencia estadística que sustentan el diseño de estudios epidemiológicos.

0.2 Planteamiento del problema

El síndrome metabólico (SM) constituye un problema de salud pública de magnitud creciente en la población pediátrica a nivel mundial. De acuerdo con Codazzi et al. (2024), se estima que aproximadamente 25.8 millones de niños y 35.5 millones de adolescentes presentaban síndrome metabólico en el año 2020, cifras que reflejan una tendencia epidemiológica preocupante.

Este síndrome, caracterizado por la coexistencia de obesidad abdominal, hipertensión arterial, dislipidemia y alteraciones glucémicas, representa uno de los principales factores de riesgo para el desarrollo de diabetes mellitus tipo 2 y enfermedad cardiovascular en la vida adulta.

Desde el punto de vista fisiopatológico, el síndrome metabólico en niños involucra una interacción compleja entre predisposición genética y factores ambientales modificables. Codazzi et al. (2024) describen cómo la acumulación de tejido adiposo visceral conduce a la liberación de ácidos grasos libres y citocinas proinflamatorias, como interleucina-6 y factor de necrosis tumoral alfa, las cuales alteran la señalización de la insulina en hígado y músculo, favoreciendo el desarrollo de resistencia insulínica.

Este proceso perpetúa un círculo vicioso de hiperglucemia, dislipidemia aterogénica e hipertensión, configurando progresivamente el cuadro completo del síndrome metabólico.

En el contexto colombiano, la transición nutricional caracterizada por el aumento del sedentarismo y el consumo de dietas hipercalóricas ricas en fructosa y grasas saturadas ha contribuido al incremento de la obesidad infantil y de sus complicaciones metabólicas, por lo que frente a este escenario, considero fundamental diseñar y planificar estudios epidemiológicos con tamaños muestrales adecuados, que permitan detectar diferencias clínicamente relevantes y generar evidencia sólida para el diseño de estrategias de prevención y tamizaje temprano en población pediátrica.

0.3 Marco teórico, sobre el último informe en cuanto a fundamentos del cálculo de tamaño de muestra

Según Aguilar-Barojas (2005), el cálculo del tamaño de muestra constituye un paso fundamental en la planificación de cualquier investigación en salud, ya que permite responder de manera anticipada dos preguntas esenciales del diseño metodológico.

Por un lado, cuántos individuos deben incluirse para estimar un parámetro poblacional con un grado de confianza determinado y, por otro, cuántos individuos es necesario estudiar para detectar una diferencia estadísticamente significativa entre dos grupos cuando dicha diferencia realmente existe.

Según la literatura,se enfatiza que un estudio con un tamaño de muestra insuficiente puede comprometer tanto la precisión de las estimaciones como la capacidad de detectar diferencias reales, lo que puede conducir a conclusiones erróneas o engañosas.

Este planteamiento se relaciona directamente con el concepto de potencia estadística (1 − β), definida como la probabilidad de que un estudio identifique una diferencia de un tamaño determinado cuando esta diferencia existe verdaderamente en la población de estudio.

Desde esta perspectiva, el cálculo del tamaño muestral no es un procedimiento meramente matemático, sino una decisión metodológica clave que condiciona la validez de los resultados.

Aguilar-Barojas (2005) señala que para realizar este cálculo es necesario conocer la variabilidad del parámetro de interés, expresada como p y q en el caso de proporciones o como la desviación estándar en el caso de medias, así como el nivel de confianza deseado, representado por el valor Z, y la precisión absoluta que se espera alcanzar.

En estudios comparativos, además de estos elementos, deben considerarse explícitamente el riesgo alfa (α), asociado al error tipo I, el riesgo beta (β), relacionado con el error tipo II, y la magnitud mínima de la diferencia que se considera clínicamente relevante detectar.

En conjunto, estos componentes me permiten diseñar estudios epidemiológicos con un equilibrio adecuado entre rigor estadístico, factibilidad operativa y relevancia clínica, principios que guían el desarrollo del presente informe.

library(tidyverse) 
library(knitr)
library(kableExtra)

0.4 OBJETIVOS

Objetivo General

objetivo_general <- data.frame(
  Componente = "OBJETIVO GENERAL",
  Descripcion = "Aplicar las fórmulas y funciones de R para el cálculo de tamaño de muestra en diferentes escenarios de investigación epidemiológica, utilizando los parámetros observados en una cohorte de 125 escolares colombianos con variables de riesgo metabólico."
)

kable(objetivo_general,
      col.names = NULL,
      align = c("c", "l")) %>%
  kable_styling(bootstrap_options = c("bordered"),
                full_width = TRUE, font_size = 14) %>%
  column_spec(1, bold = TRUE, color = "white", background = "#1A5276", width = "12em") %>%
  column_spec(2, color = "#2C3E50", background = "#D4E6F1")
OBJETIVO GENERAL Aplicar las fórmulas y funciones de R para el cálculo de tamaño de muestra en diferentes escenarios de investigación epidemiológica, utilizando los parámetros observados en una cohorte de 125 escolares colombianos con variables de riesgo metabólico.

0.5 Objetivos Específicos

objetivos_especificos <- data.frame(
  Numero = c("1", "2", "3", "4", "5", "6", "7"),
  Categoria = c(
    "Estimacion de parametros",
    "Comparacion de medias",
    "Comparacion de proporciones",
    "Disenos especiales",
    "Datos apareados",
    "Analisis de potencia",
    "Interpretacion clinica"
  ),
  Objetivo = c(
    "Calcular el tamano de muestra necesario para estimar parametros poblacionales (media de glicemia, prevalencia de obesidad) con precision y nivel de confianza definidos.",
    "Determinar el tamano muestral requerido para comparar dos medias independientes (glicemia entre grupos con y sin exceso de peso), explorando escenarios con grupos de tamano igual y desigual.",
    "Calcular el tamano de muestra para comparar dos proporciones (prevalencia de hipertension segun estado nutricional).",
    "Aplicar las formulas para disenos de no-inferioridad (demostrar que un tratamiento nuevo no es peor) y equivalencia (demostrar que dos metodos son intercambiables).",
    "Determinar el tamano muestral para disenos de datos apareados (estudios antes/despues) donde cada sujeto actua como su propio control.",
    "Realizar analisis de potencia estadistica para evaluar la capacidad de deteccion de mi muestra actual y determinar el tamano necesario para alcanzar potencia del 80%.",
    "Interpretar los resultados obtenidos en el contexto clinico del sindrome metabolico pediatrico, fundamentando las decisiones metodologicas en la literatura cientifica actualizada."
  ),
  Funcion_R = c(
    "sample.size.mean() y sample.size.prop()",
    "TwoSampleMean.Equality()",
    "TwoSampleProportion.Equality()",
    "TwoSampleMean.NIS() y Calculo manual TOST",
    "power.t.test(type='paired')",
    "power.t.test()",
    "-"
  ),
  Paquete = c(
    "samplingbook",
    "TrialSize",
    "TrialSize",
    "TrialSize",
    "stats / pwr",
    "stats / pwr",
    "-"
  )
)

kable(objetivos_especificos,
      caption = "Objetivos Especificos del Informe Final",
      col.names = c("No.", "Categoria", "Objetivo", "Funcion en R", "Paquete"),
      align = c("c", "l", "l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = TRUE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#6C3483", color = "white") %>%
  row_spec(1, background = "#E8F8F5") %>%
  row_spec(2, background = "#EBF5FB") %>%
  row_spec(3, background = "#F5EEF8") %>%
  row_spec(4, background = "#FEF9E7") %>%
  row_spec(5, background = "#FDEDEC") %>%
  row_spec(6, background = "#E8F6F3") %>%
  row_spec(7, background = "#FAE5D3") %>%
  column_spec(1, bold = TRUE, color = "white", background = "#6C3483", width = "3em") %>%
  column_spec(2, bold = TRUE, color = "#1A5276", width = "10em") %>%
  column_spec(3, width = "28em") %>%
  column_spec(4, monospace = TRUE, color = "#922B21", width = "12em") %>%
  column_spec(5, italic = TRUE, color = "#117A65", width = "7em")
Objetivos Especificos del Informe Final
No.  Categoria Objetivo Funcion en R Paquete
1 Estimacion de parametros Calcular el tamano de muestra necesario para estimar parametros poblacionales (media de glicemia, prevalencia de obesidad) con precision y nivel de confianza definidos. sample.size.mean() y sample.size.prop() samplingbook
2 Comparacion de medias Determinar el tamano muestral requerido para comparar dos medias independientes (glicemia entre grupos con y sin exceso de peso), explorando escenarios con grupos de tamano igual y desigual. TwoSampleMean.Equality() TrialSize
3 Comparacion de proporciones Calcular el tamano de muestra para comparar dos proporciones (prevalencia de hipertension segun estado nutricional). TwoSampleProportion.Equality() TrialSize
4 Disenos especiales Aplicar las formulas para disenos de no-inferioridad (demostrar que un tratamiento nuevo no es peor) y equivalencia (demostrar que dos metodos son intercambiables). TwoSampleMean.NIS() y Calculo manual TOST TrialSize
5 Datos apareados Determinar el tamano muestral para disenos de datos apareados (estudios antes/despues) donde cada sujeto actua como su propio control. power.t.test(type=‘paired’) stats / pwr
6 Analisis de potencia Realizar analisis de potencia estadistica para evaluar la capacidad de deteccion de mi muestra actual y determinar el tamano necesario para alcanzar potencia del 80%. power.t.test() stats / pwr
7 Interpretacion clinica Interpretar los resultados obtenidos en el contexto clinico del sindrome metabolico pediatrico, fundamentando las decisiones metodologicas en la literatura cientifica actualizada.

0.6 METODOLOGÍA

Población y muestra de referencia

El presente análisis utiliza como referencia los datos de una cohorte de 125 escolares colombianos de la ciudad de Bucaramanga, con edades comprendidas entre 9 y 14 años (mediana: 11 años). La distribución por sexo muestra aproximadamente 60% de varones y 40% de mujeres.

Esta base de datos, denominada “BaseMetabolismo”, incluye variables demográficas, antropométricas, clínicas y bioquímicas relevantes para la caracterización del riesgo metabólico en población pediátrica.

0.7 Síntesis metodológica de las entregas del curso

entregas_metodologia <- data.frame(
  Entrega = c(
    "ENTREGA 1\nAnálisis Descriptivo",
    "ENTREGA 2\nPruebas Paramétricas",
    "ENTREGA 3\nPruebas No Paramétricas",
    "ENTREGA 4\nCálculo de Tamaño de Muestra"
  ),
  Objetivo = c(
    "Caracterizar la distribución de cada variable en la cohorte de escolares",
    "Comparar grupos verificando supuestos de normalidad y homogeneidad de varianzas",
    "Comparar grupos cuando no se cumplen supuestos paramétricos o con variables ordinales",
    "Determinar el número de participantes necesarios para futuros estudios"
  ),
  Tecnicas_Aplicadas = c(
    "• Medidas de tendencia central (media, mediana, moda)\n• Medidas de dispersión (DE, varianza, CV, RIQ)\n• Medidas de forma (asimetría, curtosis)\n• Histogramas y boxplots",
    "• Prueba t de Student (2 grupos independientes)\n• Prueba t pareada (muestras relacionadas)\n• ANOVA (más de 2 grupos)\n• Verificación: Shapiro-Wilk y Levene\n• Tamaño del efecto: d de Cohen",
    "• Mann-Whitney U (2 grupos independientes)\n• Wilcoxon rangos con signo (datos apareados)\n• Chi-cuadrado (variables categóricas)\n• Prueba exacta de Fisher (frecuencias bajas)",
    "• Estimación de media: sample.size.mean()\n• Estimación de proporción: sample.size.prop()\n• Comparación de medias: TwoSampleMean.Equality()\n• Comparación de proporciones: TwoSampleProportion.Equality()\n• No-inferioridad: TwoSampleMean.NIS()\n• Datos apareados: power.t.test()\n• Análisis de potencia estadística"
  ),
  Variables_Ejemplo = c(
    "Glicemia, colesterol total, HDL, LDL, triglicéridos, PAS, PAD, perímetro de cintura, IMC, % grasa corporal",
    "Perímetro de cintura según sexo (t de Student)\nGlicemia según estado nutricional\nIC 95% para diferencia de medias",
    "Triglicéridos según sexo (Mann-Whitney)\nFuerza mano dominante vs. no dominante (Wilcoxon)\nObesidad vs. HTA (Chi-cuadrado)",
    "n para estimar media de glicemia\nn para comparar glicemia entre grupos\nn para detectar diferencia en HTA\nn para estudio antes/después"
  ),
  Hallazgo_Principal = c(
    "Glicemia media: 88.1 mg/dL (DE=11.32)\nPrevalencia obesidad: 8.8%\nPrevalencia exceso peso: 24%\nDistribuciones asimétricas en triglicéridos y % grasa",
    "No se encontró diferencia significativa en perímetro de cintura según sexo (p>0.05)\nd de Cohen = -0.07 (efecto nulo)\nImportancia de distinguir significancia estadística vs. clínica",
    "Diferencia significativa en fuerza entre mano dominante y no dominante (p<0.05)\nNo asociación significativa entre obesidad e HTA (Chi² p>0.05)\nRobustez de pruebas no paramétricas ante outliers",
    "n=20 para estimar media glicemia (e=5 mg/dL)\nn=159 por grupo para comparar medias\nn=14,003 por grupo para comparar proporciones (diferencia pequeña)\nn=41 para diseño apareado (mayor eficiencia)"
  )
)

kable(entregas_metodologia,
      caption = "Síntesis Metodológica: Integración de las Cuatro Entregas del Curso",
      col.names = c("Entrega", "Objetivo", "Técnicas Aplicadas", "Variables / Ejemplo", "Hallazgo Principal"),
      align = c("c", "l", "l", "l", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = TRUE, font_size = 11) %>%
  row_spec(0, bold = TRUE, background = "#2C3E50", color = "white") %>%
  row_spec(1, background = "#D4E6F1") %>%
  row_spec(2, background = "#D5F5E3") %>%
  row_spec(3, background = "#FCF3CF") %>%
  row_spec(4, background = "#F5EEF8") %>%
  column_spec(1, bold = TRUE, color = "white", width = "8em",
              background = c("#3498DB", "#1ABC9C", "#F39C12", "#9B59B6")) %>%
  column_spec(2, width = "12em", color = "#1A5276") %>%
  column_spec(3, width = "16em", color = "#2C3E50") %>%
  column_spec(4, width = "14em", color = "#6C3483", italic = TRUE) %>%
  column_spec(5, width = "14em", color = "#922B21")
Síntesis Metodológica: Integración de las Cuatro Entregas del Curso
Entrega Objetivo Técnicas Aplicadas Variables / Ejemplo Hallazgo Principal
ENTREGA 1 Análisis Descriptivo |Caracterizar la distribución de cada variable en la cohorte de escolares |• Medidas de tendencia central (media, mediana, moda) • Medidas de dispersión (DE, varianza, CV, RIQ) • Medidas de forma (asimetría, curtosis) • Histogramas y boxplots |Glicemia, colesterol total, HDL, LDL, triglicéridos, PAS, PAD, perímetro de cintura, IMC, % grasa corporal |Glicemia media: 88.1 mg/dL (DE=11.32) Prevalencia obesidad: 8.8% Prevalencia exceso peso: 24% Distribuciones asimétricas en triglicéridos y % grasa
ENTREGA 2 Pruebas Paramétricas |Comparar grupos verificando supuestos de normalidad y homogeneidad de varianzas |• Prueba t de Student (2 grupos independientes) • Prueba t pareada (muestras relacionadas) • ANOVA (más de 2 grupos) • Verificación: Shapiro-Wilk y Levene • Tamaño del efecto: d de Cohen |Perímetro de cintura según sexo (t de Student) Glicemia según estado nutricional IC 95% para diferencia de medias |No se encontró diferencia significativa en perímetro de cintura según sexo (p>0.05) d de Cohen = -0.07 (efecto nulo) Importancia de distinguir significancia estadística vs. clínica
ENTREGA 3 Pruebas No Paramétricas |Comparar grupos cuando no se cumplen supuestos paramétricos o con variables ordinales |• Mann-Whitney U (2 grupos independientes) • Wilcoxon rangos con signo (datos apareados) • Chi-cuadrado (variables categóricas) • Prueba exacta de Fisher (frecuencias bajas) |Triglicéridos según sexo (Mann-Whitney) Fuerza mano dominante vs. no dominante (Wilcoxon) Obesidad vs. HTA (Chi-cuadrado) |Diferencia significativa en fuerza entre mano dominante y no dominante (p<0.05) No asociación significativa entre obesidad e HTA (Chi² p>0.05) Robustez de pruebas no paramétricas ante o
ENTREGA 4 Cálculo de Tamaño de Muestra |Determinar el número de participantes necesarios para futuros estudios |• Estimación de media: sample.size.mean() • Estimación de proporción: sample.size.prop() • Comparación de medias: TwoSampleMean.Equality() • Comparación de proporciones: TwoSampleProportion.Equality() • No-inferioridad: TwoSampleMean.NIS() • Datos apareados: power.t.test() • Análisis de potencia estad stica |n para estimar media de glicemia n para comparar glicemia entre grupos n para detectar diferencia en HTA n para estudio ante /después |n=20 para estimar media glicemia (e=5 mg/dL) n=159 por grupo para comparar medias n=14,003 por grupo para comparar proporciones (diferencia pequeña) n=41 para diseño apareado (mayor

Parámetros utilizados como referencia

parametros_referencia <- data.frame(
  Variable = c("Glicemia en ayunas", "Obesidad", "Exceso de peso (SP+OB)", "Hipertensión arterial"),
  Tipo = c("Cuantitativa", "Cualitativa", "Cualitativa", "Cualitativa"),
  Parametro_Central = c("Media = 88.1 mg/dL", "Prevalencia = 8.8%", "Prevalencia = 24%", "Prevalencia ≈ 32%"),
  Parametro_Dispersion = c("DE = 11.32 mg/dL", "p×q = 0.080", "p×q = 0.182", "p×q = 0.218"),
  Uso_Calculo_Muestral = c(
    "Estimación de media\nComparación de medias\nNo-inferioridad\nEquivalencia\nDatos apareados",
    "Estimación de proporción",
    "Estimación de proporción",
    "Comparación de proporciones"
  )
)

kable(parametros_referencia,
      caption = "Parámetros observados en la cohorte utilizados para cálculos de tamaño muestral",
      col.names = c("Variable", "Tipo", "Parámetro Central", "Dispersión / Variabilidad", "Uso en Cálculo Muestral"),
      align = c("l", "c", "c", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = TRUE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#1E8449", color = "white") %>%
  row_spec(1, background = "#E8F8F5") %>%
  row_spec(2:4, background = "#FEF9E7") %>%
  column_spec(1, bold = TRUE, color = "#1A5276", width = "10em") %>%
  column_spec(2, width = "7em") %>%
  column_spec(3, bold = TRUE, color = "#922B21", width = "10em") %>%
  column_spec(4, color = "#6C3483", width = "10em") %>%
  column_spec(5, width = "12em", color = "#2C3E50")
Parámetros observados en la cohorte utilizados para cálculos de tamaño muestral
Variable Tipo Parámetro Central Dispersión / Variabilidad Uso en Cálculo Muestral
Glicemia en ayunas Cuantitativa Media = 88.1 mg/dL DE = 11.32 mg/dL Estimación de media Comparación de medias No-inferioridad Equivalencia Datos aparea
Obesidad Cualitativa Prevalencia = 8.8% p×q = 0.080 Estimación de proporción
Exceso de peso (SP+OB) Cualitativa Prevalencia = 24% p×q = 0.182 Estimación de proporción
Hipertensión arterial Cualitativa Prevalencia ≈ 32% p×q = 0.218 Comparación de proporciones

0.8 Desarrollo cronológico del análisis de la base de datos

# instalo paquetes 
# install.packages(c("tidyverse", "gt", "gtExtras", "showtext"))

# PRIMERO: Cargo todas las librerías
library(tidyverse)      # Incluye dplyr, ggplot2, tidyr, etc.
library(readxl)         # Lectura de archivos Excel

# Tablas 
library(knitr)          # Funciones básicas de tablas
library(kableExtra)     # Tablas 

# Estadística descriptiva
library(psych)          # Estadísticos descriptivos 
library(moments)        # Asimetría y curtosis

# Cálculo de tamaño muestral
library(samplingbook)   # Funciones sample.size.mean y sample.size.prop
library(TrialSize)      # Funciones para comparación de medias y proporciones
library(pwr)            # Análisis de potencia estadística

# librerias
library(ggplot2)        # Gráficos avanzados
library(gridExtra)      # Organización de múltiples gráficos
library(scales)         # Formateo de escalas en gráficos
library(ggpubr)

suppressPackageStartupMessages({
  library(gt)
  library(gtExtras)
  library(showtext)
})

showtext_auto()
font_add_google("Lato", "lato")

# Paleta de colores 
colores_pastel <- c(
  "#A8D8EA",  # Azul pastel
  "#AA96DA",  # Morado pastel
  "#FCBAD3",  # Rosa pastel
  "#FFFFD2",  # Amarillo pastel
  "#B5EAD7",  # Verde menta
  "#FFB7B2",  # Coral pastel
  "#E2F0CB",  # Verde lima pastel
  "#C7CEEA"   # Lavanda
)

# SEGUNDO: Cargo datos
BaseMetabolismo <- read_excel("BaseMetabolismo.xlsx")

# TERCERO: Filtro datos válidos (solo los 125 escolares reales)
BaseMetabolismo <- BaseMetabolismo %>% 
  filter(!is.na(cod_iden))

cat("Librerías cargadas correctamente\n")
## Librerías cargadas correctamente
cat("Datos filtrados: N =", nrow(BaseMetabolismo), "escolares\n")
## Datos filtrados: N = 125 escolares
cat("Fecha de ejecución:", as.character(Sys.Date()), "\n")
## Fecha de ejecución: 2025-12-16

1 EXPLORACIÓN DE DATOS

INTRODUCCIÓN

El síndrome metabólico (SM) en la infancia constituye un problema emergente de salud pública que combina alteraciones metabólicas, conductuales y ambientales, cuya interacción incrementa de forma significativa el riesgo de diabetes tipo 2, hipertensión y enfermedad cardiovascular en etapas posteriores de la vida (Codazzi et al., 2023).
A diferencia de los adultos, donde el diagnóstico del SM (síndrome metabólico) se basa en criterios consensuados, en población pediátrica persiste una heterogeneidad diagnóstica importante, debido a la variabilidad en la edad, el desarrollo puberal y las diferencias étnicas en la distribución de grasa corporal y la sensibilidad a la insulina.

En consecuencia, considero que la identificación temprana de patrones metabólicos alterados en niños clínicamente sanos se convierte en una estrategia esencial para la prevención primaria.

Fundamento fisiopatológico y contexto epidemiológico

El estudio de Codazzi y colaboradores (2023) explica que el SM infantil surge de una interacción multifactorial entre la predisposición genética, la resistencia a la insulina (RI) y los factores de riesgo modificables,como la dieta hipercalórica, el sedentarismo, la disbiosis intestinal, los trastornos del sueño y la deficiencia de vitamina D.

Los adipocitos hipertróficos generados por la expansión de la grasa visceral secretan citocinas proinflamatorias (IL-6, TNF-α) y ácidos grasos libres que alteran la acción de la insulina en hígado y músculo, promoviendo dislipidemia, hiperglucemia e hipertensión arterial.

Paralelamente, el desequilibrio entre adipocinas protectoras (adiponectina) y proinflamatorias (leptina, resistina) sostiene un estado inflamatorio crónico de bajo grado que acelera el daño vascular y metabólico.

Codazzi et al. destacan que la obesidad central y la resistencia a la insulina son los pilares fisiopatológicos del SM, pues ambas condiciones se asocian con la pérdida de la función mitocondrial, el aumento del estrés oxidativo y la alteración del metabolismo lipídico y glucídico, mecanismos que comienzan a manifestarse incluso antes de que se evidencien clínicamente los componentes diagnósticos del síndrome.

Desde esta perspectiva, la evaluación de parámetros antropométricos, clínicos y bioquímicos en escolares sanos considero que adquiere un valor epidemiológico y clínico excepcional, al permitirme detectar desequilibrios metabólicos incipientes.

Justificación del análisis y relevancia de la población

El presente análisis que me propongo a realizar, parte de una base de datos académica proveniente de una cohorte de 125 niños y niñas escolarizados, de entre 9 y 14 años, clínicamente sanos al momento de la evaluación.

La cohorte prospectiva fue ensamblada en Colombia, entre los años 2011 y 2012, de estudiantes escolarizados pertenecientes a un plantel educativo de una de las principales ciudades metropolitanas de Colombia, en un contexto de transición nutricional y epidemiológica, donde la coexistencia de desnutrición temprana y sobrepeso infantil genera un doble desafío sanitario.

Proceso de depuración de datos (Data Cleansing)

La base original se encontraba cuando la recibi en formato bruto (BASE_OROGINAL_METABOL_nodepurada.xlsx), con más de un millón de filas y errores de codificación, por lo cual tuve que aplicar procedimientos sistemáticos de depuración en Excel para obtener una base limpia, coherente y lista para importar para este análisis.

Los problemas que detecté fueron valores nulos en edad (7 casos), outliers en talla, tipos de datos inconsistentes y filas duplicadas, por lo que tuve que filtrar 125 observaciones válidas, recuperando edades faltantes, además corregí unidades erróneas, verifiqué coherencia interna y convertí los tipos de datos, con los filtros disponibles en excel. Resultado final: 0 % de valores nulos, 0 duplicados y 100 % de coherencia fisiológica y de unidades.

La base depurada final, que he denominado BASE_METABOLISMO.xlsx, cumple los criterios de calidad, como la completitud, validez, consistencia y conformidad estructural.

Analizar esta población me ofrece una oportunidad para comprender cómo las diferencias en edad biológica, madurez sexual y nivel socioeconómico se vinculan con los perfiles antropométricos y metabólicos.

Los niños en edad escolar constituyen una ventana biológica crucial, dado que:

a.Durante la pubertad se produce una resistencia fisiológica a la insulina transitoria, que puede descompensarse en presencia de exceso adiposo o inactividad física.
b. Los patrones de grasa corporal (especialmente el perímetro de cintura y el porcentaje de grasa corporal total) son indicadores tempranos de riesgo metabólico.
c. El nivel socioeconómico y los hábitos de actividad física influyen en la dieta y el gasto energético, determinando diferencias estructurales en la salud metabólica (Codazzi et al., 2023).

Por tanto, explorar las variables demográficas, clínicas y bioquímicas en esta población escolar permite identificar gradientes de riesgo y relaciones funcionales entre la composición corporal y el metabolismo energético.

Justificación de las variables y su relevancia fisiopatológica

La estructura de la base de datos incluye 24 variables agrupadas en seis dominios interconectados, que representan las dimensiones más relevantes del riesgo metabólico infantil:

  1. Identificador: variable no analítica (cod_iden) que garantiza la anonimización de los registros.

  2. Características demográficas y sociales:
    Edad, sexo y estrato socioeconómico influyen directamente en la distribución de grasa corporal y la sensibilidad a la insulina, como lo evidencian los estudios de Codazzi et al. y Koskinen et al. (2020).

  3. Condición clínica:
    Nivel de madurez sexual (Tanner): asociado con los cambios hormonales puberales y la RI fisiológica.
    Capacidad cardiorrespiratoria (CRF_shuttles): un marcador inverso de riesgo metabólico, pues su disminución predice disfunción endotelial y resistencia a la insulina.

  4. Medidas clínicas y antropométricas:
    Presión arterial, talla, peso, perímetro de cintura y cadera, porcentaje de grasa corporal (por bioimpedancia y pliegues cutáneos) y fuerza prensil representan las variables centrales del SM pediátrico.

En particular, el perímetro de cintura es el mejor predictor de obesidad central y, por tanto, del riesgo cardiovascular temprano (Codazzi et al., 2023).
5. Marcadores bioquímicos:
Glicemia, colesterol total, HDL, LDL y triglicéridos reflejan la eficiencia metabólica del eje insulina-glucosa-lípidos, siendo esenciales para detectar resistencia a la insulina subclínica.
6. Condiciones de salud:
Estado nutricional e hipertensión son indicadores clínicos derivados, que consolidan la expresión fenotípica de los desajustes metabólicos previos.

Esta estructura multicomponente me posibilita un análisis integrado, en el que los aspectos corporales, clínicos y bioquímicos pueden correlacionarse para generar un perfil epidemiológico de riesgo metabólico.

Desde el punto de vista estadístico, este diseño me permite aplicar herramientas de estadística descriptiva y exploratoria, estimando la tendencia central, dispersión y distribución de las variables cuantitativas, además de analizar frecuencias y proporciones en las cualitativas.

Marco ético, confidencialidad y uso responsable de datos

El uso de esta base de datos se realiza exclusivamente con fines académicos y formativos, sin implicar contacto con personas ni recolección de información nueva.
Los registros han sido anonimizados y carecen de identificadores directos; el campo cod_iden solo distingue observaciones sin posibilidad de reidentificación.

El tratamiento de la información cumple con los principios de la Declaración de Helsinki, las Pautas CIOMS, las Buenas Prácticas Clínicas ICH-GCP y la Ley 1581 de 2012 de protección de datos personales en Colombia.
El riesgo ético es mínimo, y el beneficio formativo es alto, al fortalecer las competencias en limpieza, análisis e interpretación ética de datos en salud.

Los resultados los presentaré de manera agregada, evitando celdas con conteos bajos o valores individuales, y el archivo se maneja en un entorno académico con acceso controlado, garantizando la seguridad, integridad y confidencialidad de la información.

Propósito analítico y alcance del trabajo

El propósito central de este análisis es explorar la variabilidad y distribución de las medidas clínicas, antropométricas y bioquímicas en escolares colombianos sanos, mediante herramientas de estadística descriptiva y visualización en R markdown.

Referencia bibliográfica

Codazzi, V., Frontino, G., Galimberti, L., Giustina, A., & Petrelli, A. (2023). Mechanisms and risk factors of metabolic syndrome in children and adolescents: focus on modifiable determinants. Metabolism Open, 18, 100267. doi: 10.1007/s12020-023-03642-x

A continuación, presento la tabla descriptiva de las variables con su tipo, escala y unidad:

Tabla. Clasificación y descripción de las variables de la base METABOLISMO
Dominio, tipo, escala de medición, unidad y definición operacional
Dominio Variable Tipo Escala Unidad Descripcion
Identificador cod_iden No aplica No aplica - Código único del participante (no analítico).
Características demográficas y sociales fecha_nacim Continua Intervalo AAAA/MM/DD Fecha de nacimiento del participante.
Características demográficas y sociales fecha_corte Continua Intervalo AAAA/MM/DD Fecha de evaluación o medición clínica.
Características demográficas y sociales sexo Categórica Nominal 0 = Femenino / 1 = Masculino Sexo biológico registrado.
Características demográficas y sociales edad Discreta Razón Años Edad en años cumplidos desde la fecha de nacimiento hasta la evaluación.
Características demográficas y sociales estrato_fse Categórica Ordinal 1 a 4 Estrato socioeconómico (FSE: Factor Socioeconómico).
Condición clínica tanner Categórica Ordinal 1 a 3 Nivel de madurez sexual (estadios de Tanner).
Condición clínica CRF_shuttles Continua Razón Numérico Capacidad física: número de recorridos completados en la prueba cardiorrespiratoria (shuttles).
Medidas clínicas y antropométricas pas Continua Razón mmHg Presión arterial sistólica.
Medidas clínicas y antropométricas pad Continua Razón mmHg Presión arterial diastólica.
Medidas clínicas y antropométricas talla Continua Razón m Talla o estatura corporal medida en metros.
Medidas clínicas y antropométricas peso Continua Razón kg Peso corporal total medido en kilogramos.
Medidas clínicas y antropométricas per_cintura Continua Razón cm Perímetro de cintura (indicador de adiposidad abdominal).
Medidas clínicas y antropométricas per_cadera Continua Razón cm Perímetro de cadera (para índice cintura/cadera).
Medidas clínicas y antropométricas %_grasa_corp Continua Razón % Porcentaje de grasa corporal por bioimpedancia eléctrica (BIA).
Medidas clínicas y antropométricas %_grasa_plie Continua Razón % Porcentaje de grasa corporal por pliegues cutáneos.
Medidas clínicas y antropométricas f_mano_do Continua Razón kg Fuerza prensil de la mano dominante.
Medidas clínicas y antropométricas f_mano_no_do Continua Razón kg Fuerza prensil de la mano no dominante.
Marcadores bioquímicos glicemia Continua Razón mg/dl Glucosa en ayunas (muestra sérica).
Marcadores bioquímicos col_total Continua Razón mg/dl Colesterol total en suero.
Marcadores bioquímicos hdl Continua Razón mg/dl Colesterol HDL (fracción protectora, medido en suero).
Marcadores bioquímicos ldl Continua Razón mg/dl Colesterol LDL (fracción aterogénica, medido en suero).
Marcadores bioquímicos tag Continua Razón mg/dl Triglicéridos séricos.
Condiciones de salud hta Categórica Ordinal 0 = Normal / 1 = Prehipertensión / 2 = Hipertensión Presión arterial alta según clasificación de PAS y PAD.
Condiciones de salud obesidad Categórica Nominal 0 = Normal / 1 = Bajo peso / 2 = Sobrepeso / 3 = Obesidad Estatus nutricional (clasificación según IMC y referencia OMS).
Nota. analizo 24 variables,resalto que cod_iden es identificador no analítico, la edad la consigno como Discreta y CRF_shuttles capacidad física como continua (Numérico)segun directorio de la base de estudio

Métodos estadísticos y procesamiento de datos Software y herramientas computacionales

Para el procesamiento, análisis y visualización de datos utilizo R versión 4.5.1 (R Core Team, 2024) mediante documento de R Markdown en el entorno RStudio, y las librerías empleadas son:

  • tidyverse (v2.0.0): para manipulación y transformación de datos mediante funciones de dplyr, tidyr y readxl
  • ggplot2 (v3.5.0): para la creación de gráficos estadísticos de alta calidad
  • scales: para el formateo de ejes y etiquetas en las visualizaciones
  • knitr y kableExtra: para la generación de tablas con formato profesional

Clasificación de variables He clasificado las 25 variables de la base de datos según su naturaleza estadística en dos grandes grupos:

Variables cualitativas (categóricas): aquellas que expresan atributos o categorías sin orden numérico inherente, por lo que en esta cohorte identifiqué 5 variables categóricas:

-Sexo (nominal dicotómica: femenino/masculino) - Estrato socioeconómico FSE (ordinal politómica: estratos 1 a 4) - Estadio de Tanner (ordinal politómica: estadios 1 a 3) -Clasificación de hipertensión arterial (ordinal politómica: normal/prehipertensión/hipertensión) - Estado nutricional (ordinal politómica: bajo peso/normal/sobrepeso/obesidad)

Variables cuantitativas (continuas o discretas): aquellas que expresan cantidades numéricas medibles, lo cual identifiqué 19 variables cuantitativas organizadas en 5 dominios:

  • Variables demográficas y de condición física (edad, CRF shuttles, fuerza prensil)
  • Variables de presión arterial (PAS, PAD) -Variables antropométricas básicas (peso, talla, IMC)
  • Variables de composición corporal (perímetros, porcentaje de grasa por BIA y pliegues, ICC)
  • Variables bioquímicas y metabólicas (glicemia, perfil lipídico completo, cociente TAG/HDL)

Análisis estadístico descriptivo

Para cada tipo de variable aplicaré las siguientes técnicas estadísticas:

Para variables cualitativas:

  • Distribuciones de frecuencias absolutas y relativas (porcentajes)
  • Porcentajes acumulados para variables ordinales
  • Gráficos de barras verticales y horizontales según la naturaleza de la variable
  • Gráficos de torta para variables dicotómicas

Para variables cuantitativas:

  • Medidas de tendencia central: media aritmética, mediana
  • Medidas de dispersión: desviación estándar, rango intercuartílico (Q3-Q1)
  • Medidas de posición: mínimo, máximo, cuartiles (Q1, Q2, Q3)
  • Coeficiente de variación porcentual (CV%) para evaluar dispersión relativa
  • Histogramas con curva de densidad para visualizar distribuciones
  • Diagramas de caja (boxplots) para identificar valores atípicos
  • Boxplots estratificados por sexo cuando fue epidemiológicamente relevante
  • Diagramas de dispersión para explorar relaciones entre variables

Cálculo de índices derivados

A partir de las variables antropométricas y bioquímicas primarias, calcularé tres índices metabólicos adicionales:

  • Índice de Masa Corporal (IMC): peso (kg) / [talla (m)]²
  • Índice Cintura-Cadera (ICC): perímetro de cintura (cm) / perímetro de cadera (cm)
  • Cociente Triglicéridos/HDL (TAG/HDL): triglicéridos (mg/dL) / HDL (mg/dL)

Este último cociente es un marcador validado de resistencia a la insulina en población pediátrica, con punto de corte de riesgo en valores superiores a 2.0 (Codazzi et al., 2023).

Criterios de calidad y consideraciones metodológicas

La base de datos utilizada considero que cumple con criterios estrictos de calidad: 0% de valores nulos después de la depuración, 0 observaciones duplicadas, y 100% de coherencia fisiológica en las unidades de medida.

Todas las variables continuas fueron evaluadas para identificar valores extremos, sin eliminar ninguna observación dado que todos los valores se encontraban dentro de rangos fisiológicamente plausibles para población pediátrica.

Los análisis que realizaré son con un enfoque exploratorio y descriptivo, sin aplicar pruebas de hipótesis inferenciales. Las interpretaciones de los hallazgos se fundamentaran en la evidencia científica actual sobre síndrome metabólico infantil, particularmente en el marco fisiopatológico propuesto por Codazzi et al. (2023).

Exploración de estructura y consistencia El objetivo de esta exploración es verificar la integridad estructural de la base y verificar si existen valores faltantes, atípicos o inconsistentes aún.

library(readxl)   # me sirve para importar archivos de Excel (.xlsx) conservando tipos de datos
library(skimr)    # me resume la estructura, tipo de variable y distribución de los datos
library(dplyr)    # me facilita el manejo, filtrado y resumen de bases de datos

# procedo a cargar la base de datos
BaseMetabolismo <- read_excel("BaseMetabolismo.xlsx")
# Verifico número de filas y columnas
dim(BaseMetabolismo)
## [1] 1048573      25
# Listar nombres de las variables
names(BaseMetabolismo)
##  [1] "cod_iden"      "fecha_nacim"   "fecha_corte"   "sexo"         
##  [5] "edad"          "estrato_fse"   "CRF_shuttles"  "pas"          
##  [9] "pad"           "talla"         "peso"          "per__cintura" 
## [13] "per__cadera"   "tanner"        "f__mano_do"    "f__mano_no_do"
## [17] "%_grasa_corp"  "___grasa_plie" "glicemia"      "col_total"    
## [21] "hdl"           "ldl"           "tag"           "hta"          
## [25] "obesidad"

En este bloque realicé la exploración inicial de la estructura general de la base de datos con el propósito de conocer su tamaño y el tipo de información contenida.

El resultado del comando dim(BaseMetabolismo) muestra dos valores:
- 1.048.573 filas, que corresponden al número total de observaciones o registros individuales.
- 25 columnas, que representan la cantidad de variables o características medidas en cada registro.

Esto me indica que se trata de una base de datos muy amplia, con más de un millón de observaciones, lo que permite hacer análisis descriptivos y estadísticos con alta precisión y estabilidad en los resultados.

Posteriormente, con la función names(BaseMetabolismo) obtuve el listado completo de las variables presentes en la base, por lo cual a partir de estos nombres observo que la información abarca diferentes áreas o dominios de estudio, ya descritos al inicio, y que puedo agrupar de la siguiente manera:

  • Identificación y fechas: cod_iden, fecha_nacim, fecha_corte. Estas variables me permiten identificar cada registro y calcular indicadores derivados del tiempo, como la edad.

  • Sociodemográficas: sexo, edad, estrato_fse. Describen las características generales de la población que analizo.

  • Condición física y antropometría: CRF_shuttles, peso, talla, per__cintura, per__cadera, tanner, %_grasa_corp, __grasa_plie, f_mano_do, f_mano_no_do. Son mediciones corporales y de composición corporal que permiten valorar el estado físico.

  • Clínicas: pas, pad, hta, obesidad. Corresponden a parámetros de presión arterial y diagnóstico de hipertensión u obesidad.

  • Bioquímicas: glicemia, col_total, hdl, ldl, tag. Representan el perfil lipídico y metabólico del grupo de estudio.

La estructura general considero que es ordenada, sin duplicación de nombres y con una nomenclatura clara que facilita la comprensión, esto me confirma que la base me quedó correctamente organizada y que puedo trabajar con confianza en los análisis posteriores.

Estructura interna del conjunto de datos

str(BaseMetabolismo)
## tibble [1,048,573 × 25] (S3: tbl_df/tbl/data.frame)
##  $ cod_iden     : num [1:1048573] 5 15 16 17 18 20 23 24 27 29 ...
##  $ fecha_nacim  : POSIXct[1:1048573], format: "2000-01-01" "2000-01-27" ...
##  $ fecha_corte  : POSIXct[1:1048573], format: "2011-07-26" "2011-07-26" ...
##  $ sexo         : num [1:1048573] 0 1 1 0 1 0 1 0 1 0 ...
##  $ edad         : num [1:1048573] 11 11 11 11 11 12 11 12 11 11 ...
##  $ estrato_fse  : num [1:1048573] 2 1 1 3 1 1 4 1 2 2 ...
##  $ CRF_shuttles : num [1:1048573] 2.4 4.6 5.7 3.6 2.3 ...
##  $ pas          : num [1:1048573] 122 123 113 95 121 101 103 103 125 112 ...
##  $ pad          : num [1:1048573] 80 79 74 62 68 71 74 77 64 76 ...
##  $ talla        : num [1:1048573] 1.53 1.4 1.51 1.42 1.49 ...
##  $ peso         : num [1:1048573] 52.4 33.3 45.1 33.9 58.4 ...
##  $ per__cintura : num [1:1048573] 78 59.4 67 66 88 ...
##  $ per__cadera  : num [1:1048573] 92.2 77.6 84 73 95 ...
##  $ tanner       : num [1:1048573] 3 1 2 1 2 2 1 3 2 1 ...
##  $ f__mano_do   : num [1:1048573] 20 15 22 17 23 24 14 17 21.5 15 ...
##  $ f__mano_no_do: chr [1:1048573] "21.5" "16" "23.5" "15.5" ...
##  $ %_grasa_corp : num [1:1048573] 30.8 18.4 16.8 19.5 34.9 ...
##  $ ___grasa_plie: num [1:1048573] 30.3 24.3 17.4 22.8 51.2 ...
##  $ glicemia     : num [1:1048573] 97 94 99 86 99 105 97 90 95 82 ...
##  $ col_total    : num [1:1048573] 153 194 171 180 150 215 151 173 198 186 ...
##  $ hdl          : num [1:1048573] 47 60 52 42 46 46 109 112 39 90 ...
##  $ ldl          : num [1:1048573] 96.4 111.4 109.2 125 94.6 ...
##  $ tag          : num [1:1048573] 48 113 49 65 47 81 67 95 114 85 ...
##  $ hta          : num [1:1048573] 2 0 0 1 0 0 0 1 1 0 ...
##  $ obesidad     : num [1:1048573] 2 0 1 0 0 0 3 0 1 0 ...

Análisis e interpretación

El comando str(BaseMetabolismo) muestra la estructura interna del conjunto de datos,donde se observa que la base contiene 1.048.573 registros y 25 variables, las cuales incluyen datos numéricos, categóricos y de tipo fecha.
Esto confirma que la base si quedó cargada correctamente y que mantiene su integridad estructural.

Análisis descriptivo Desde el punto de vista estadístico, este resultado me permite conocer el tipo de variable y definir el tratamiento descriptivo adecuado:

  • Las variables numéricas continuas (como presión arterial, talla, peso, perímetros, glicemia, colesterol, HDL, LDL y triglicéridos) se analizarán mediante medidas de tendencia central (media, mediana) y dispersión (rango, desviación estándar, cuartiles).

  • Las variables categóricas (sexo, estrato_fse, tanner, hta, obesidad) se describirán con frecuencias absolutas y relativas, adecuadas para representar proporciones o prevalencias.

  • Las fechas (fecha_nacim, fecha_corte) permiten calcular intervalos de tiempo o edades, lo que será útil para caracterizar la población.

  • La variable de tipo carácter (f__mano_no_do) requerirá recodificación antes del análisis.

Análisis descriptivo por tipo de variable Objetivo

Describir estadísticamente las variables de la base de datos según su tipo de medición, mediante resúmenes numéricos y representaciones gráficas básicas.
Esto me permite identificar la distribución general de los datos y las tendencias principales de la población estudiada.

Variables cuantitativas continuas Estas variables incluyen mediciones fisiológicas y antropométricas, tales como:
edad, peso, talla, pas, pad, per__cintura, per__cadera, %_grasa_corp, __grasa_plie, glicemia, col_total, hdl, ldl, tag, entre otras.

VARIABLES CATEGÓRICAS

BaseMetabolismo <- BaseMetabolismo %>%
  filter(!is.na(cod_iden))

cat("Dimensiones originales:", nrow(BaseMetabolismo), "filas\n")
## Dimensiones originales: 125 filas
cat("Dimensiones después del filtrado:", nrow(BaseMetabolismo), "filas\n")
## Dimensiones después del filtrado: 125 filas
cat("Filas eliminadas (vacías):", nrow(BaseMetabolismo) - nrow(BaseMetabolismo), "\n\n")
## Filas eliminadas (vacías): 0
cat("Verificación de valores nulos:\n")
## Verificación de valores nulos:
print(colSums(is.na(BaseMetabolismo)))
##      cod_iden   fecha_nacim   fecha_corte          sexo          edad 
##             0             0             0             0             0 
##   estrato_fse  CRF_shuttles           pas           pad         talla 
##             0             0             0             0             0 
##          peso  per__cintura   per__cadera        tanner    f__mano_do 
##             0             0             0             0             0 
## f__mano_no_do  %_grasa_corp ___grasa_plie      glicemia     col_total 
##             0             0             0             0             0 
##           hdl           ldl           tag           hta      obesidad 
##             0             0             0             0             0

Interpretación del filtrado: Realicé el filtrado de la base de datos para eliminar las filas vacías que Excel genera automáticamente. La base original contenía 1,048,573 filas debido a la estructura técnica de Excel, pero solo las primeras 125 filas contienen datos válidos de los escolares evaluados.

Después del filtrado, confirmo que cuento con 125 observaciones completas, sin valores nulos en ninguna variable, por lo que esta base limpia me permite proceder con confianza al análisis descriptivo, sabiendo que cada fila representa un niño o niña con información completa.

Análisis de la variable SEXO

# Filtro solo datos válidos (donde cod_iden no es NA)
datos_validos <- BaseMetabolismo %>% 
  filter(!is.na(cod_iden))

# Tabla de frecuencias
tabla_sexo <- datos_validos %>%
  count(sexo) %>%
  mutate(
    Sexo = factor(sexo, levels = c(0, 1), labels = c("Femenino", "Masculino")),
    Frecuencia = n,
    Porcentaje = round((n / sum(n)) * 100, 2),
    `Porcentaje acumulado` = round(cumsum(Porcentaje), 2)
  ) %>%
  select(Sexo, Frecuencia, Porcentaje, `Porcentaje acumulado`)
print(tabla_sexo)
## # A tibble: 2 × 4
##   Sexo      Frecuencia Porcentaje `Porcentaje acumulado`
##   <fct>          <int>      <dbl>                  <dbl>
## 1 Femenino          50         40                     40
## 2 Masculino         75         60                    100
# Gráfico con datos filtrados
ggplot(datos_validos, aes(x = factor(sexo, labels = c("Femenino", "Masculino")), 
                          fill = factor(sexo))) +
  geom_bar(width = 0.6) +
  geom_text(stat = 'count', aes(label = after_stat(count)), 
            vjust = -0.5, size = 8, fontface = "bold") +
  scale_fill_manual(values = c("#FF6B9D", "#4D96FF")) +
  labs(
    title = "Distribución de la muestra por sexo",
    subtitle = paste("N =", nrow(datos_validos), "escolares"),
    x = "Sexo biológico",
    y = "Frecuencia absoluta"
  ) +
  theme_minimal(base_size = 18) +
  theme(
    plot.title = element_text(hjust = 0.5, size = 22, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 16),
    axis.title = element_text(size = 22, face = "bold"),
    axis.text = element_text(size = 19),
    legend.position = "none"
  ) +
  ylim(0, max(table(datos_validos$sexo)) + 10)

Distribución por sexo: análisis e interpretación Observo que la muestra presenta una distribución heterogénea por sexo biológico, con predominio del sexo masculino que representa el 60.0% de la población evaluada, correspondiente a 75 niños, mientras que el sexo femenino constituye el 40.0% restante con 50 niñas.

Esta proporción de 3:2 me indica una sobre rrepresentación de varones en la cohorte.Considero que esta distribución desigual es relevante desde el punto de vista epidemiológico, dado que existen diferencias biológicas importantes entre ambos sexos durante la etapa prepuberal y puberal.

En particular, la distribución de grasa corporal, la maduración sexual, la sensibilidad a la insulina y el metabolismo lipídico presentan patrones sexo-específicos, por tanto, en los análisis posteriores debo estratificar por sexo cuando sea pertinente, para identificar si existen diferencias significativas en los perfiles antropométricos y metabólicos entre niños y niñas.

Análisis de la variable ESTRATO SOCIOECONÓMICO

tabla_estrato <- BaseMetabolismo %>%
  count(estrato_fse) %>%
  mutate(
    `Estrato FSE` = factor(estrato_fse, 
                           levels = 1:4, 
                           labels = c("Estrato 1 (Bajo)", "Estrato 2 (Medio-bajo)", 
                                      "Estrato 3 (Medio)", "Estrato 4 (Medio-alto)")),
    Frecuencia = n,
    Porcentaje = round((n / sum(n)) * 100, 2),
    `Porcentaje acumulado` = round(cumsum(Porcentaje), 2)
  ) %>%
  select(`Estrato FSE`, Frecuencia, Porcentaje, `Porcentaje acumulado`)
print(tabla_estrato)
## # A tibble: 4 × 4
##   `Estrato FSE`          Frecuencia Porcentaje `Porcentaje acumulado`
##   <fct>                       <int>      <dbl>                  <dbl>
## 1 Estrato 1 (Bajo)               54       43.2                   43.2
## 2 Estrato 2 (Medio-bajo)         38       30.4                   73.6
## 3 Estrato 3 (Medio)              31       24.8                   98.4
## 4 Estrato 4 (Medio-alto)          2        1.6                  100
BaseMetabolismo %>%
  mutate(estrato_label = factor(estrato_fse, 
                                 levels = 1:4,
                                 labels = c("Estrato 1\n(Bajo)", "Estrato 2\n(Medio-bajo)",
                                           "Estrato 3\n(Medio)", "Estrato 4\n(Medio-alto)"))) %>%
  ggplot(aes(x = estrato_label, fill = estrato_label)) +
  geom_bar(width = 0.6) +
  geom_text(stat = 'count', aes(label = paste0(after_stat(count), "\n(", 
              round(after_stat(count)/sum(after_stat(count))*100, 1), "%)")), 
            vjust = -0.3, size = 7, fontface = "bold") +
  scale_fill_viridis_d(option = "plasma", begin = 0.2, end = 0.9) +
  labs(
    title = "Distribución por estrato socioeconómico",
    subtitle = "Factor Socioeconómico (FSE) según clasificación colombiana",
    x = "Estrato socioeconómico",
    y = "Frecuencia absoluta"
  ) +
  theme(legend.position = "none") +
  ylim(0, max(table(BaseMetabolismo$estrato_fse)) + 12)

interpretación Observo una marcada concentración de la muestra en los estratos socioeconómicos más bajos. El estrato 1, que representa las condiciones de mayor vulnerabilidad socioeconómica, agrupa al 43.2% de la población con 54 escolares, constituyendo el grupo más numeroso, mientras que el estrato 2 sigue en frecuencia con 38 niños que representan el 30.4%.

En conjunto, los estratos 1 y 2 concentran el 73.6% de la muestra, evidenciando que casi tres cuartas partes de la población evaluada proviene de contextos de vulnerabilidad socioeconómica. Por otro lado, el estrato 3, considerado medio, agrupa al 24.8% con 31 escolares, mientras que el estrato 4 es marginal en la muestra con apenas 2 casos que representan el 1.6%.

Esta distribución es consistente con la realidad demográfica de las ciudades metropolitanas colombianas, donde la mayoría de la población urbana pertenece a estratos medio-bajos y bajos.

Considero que esta variable es un determinante social crítico del riesgo metabólico infantil, dado que el estrato socioeconómico condiciona múltiples factores, como elacceso a alimentos de calidad nutricional, la disponibilidad de espacios seguros para la práctica de actividad física, la exposición a ambientes obesogénicos, y el acceso a servicios de salud preventiva.

La literatura documenta (Codazzi et al., 2023) que los niños de estratos bajos presentan mayor riesgo de malnutrición por déficit o por exceso, así como patrones de actividad física disminuidos, por tanto, los análisis posteriores voy a considerar el estrato FSE como una covariable importante en la caracterización del perfil metabólico de esta población.

Análisis de la variable ESTADIO DE TANNER

tabla_tanner <- BaseMetabolismo %>%
  count(tanner) %>%
  mutate(
    `Estadio Tanner` = factor(tanner, 
                              levels = 1:3, 
                              labels = c("Tanner 1 (Prepuberal)", 
                                        "Tanner 2 (Pubertad temprana)", 
                                        "Tanner 3 (Pubertad media)")),
    Frecuencia = n,
    Porcentaje = round((n / sum(n)) * 100, 2),
    `Porcentaje acumulado` = round(cumsum(Porcentaje), 2)
  ) %>%
  select(`Estadio Tanner`, Frecuencia, Porcentaje, `Porcentaje acumulado`)
print(tabla_tanner)
## # A tibble: 3 × 4
##   `Estadio Tanner`             Frecuencia Porcentaje `Porcentaje acumulado`
##   <fct>                             <int>      <dbl>                  <dbl>
## 1 Tanner 1 (Prepuberal)                65       52                     52  
## 2 Tanner 2 (Pubertad temprana)         46       36.8                   88.8
## 3 Tanner 3 (Pubertad media)            14       11.2                  100
BaseMetabolismo %>%
  mutate(tanner_label = factor(tanner, 
                               levels = 1:3,
                               labels = c("Tanner 1\n(Prepuberal)", 
                                         "Tanner 2\n(Pubertad temprana)",
                                         "Tanner 3\n(Pubertad media)"))) %>%
  ggplot(aes(x = tanner_label, fill = tanner_label)) +
  geom_bar(width = 0.5) +
  geom_text(stat = 'count', aes(label = paste0(after_stat(count), "\n(", 
              round(after_stat(count)/sum(after_stat(count))*100, 1), "%)")), 
            vjust = -0.3, size = 7, fontface = "bold") +
  scale_fill_manual(values = c("#FFA07A", "#FF6347", "#DC143C")) +
  labs(
    title = "Distribución por estadio de madurez sexual",
    subtitle = "Clasificación de Tanner para desarrollo puberal",
    x = "Estadio de Tanner",
    y = "Frecuencia absoluta"
  ) +
  theme(legend.position = "none") +
  ylim(0, max(table(BaseMetabolismo$tanner)) + 12)

análisis e interpretación Observo que la distribución de madurez sexual en la muestra revela que más de la mitad de la población se encuentra en estadio prepuberal. Específicamente, 65 escolares que representan el 52.0% están clasificados en Tanner 1, lo que me indica que no han iniciado aún el desarrollo de características sexuales secundarias.

El estadio Tanner 2, correspondiente a pubertad temprana, agrupa a 46 niños que constituyen el 36.8% de la muestra, y finalmente, solo 14 escolares, equivalentes al 11.2%, han alcanzado el estadio Tanner 3 de pubertad media.

Al analizar de forma acumulada, encuentro que el 88.8% de la población evaluada se encuentra en estadios prepuberales o de pubertad temprana, lo que es consistente con el rango etario de la muestra que oscila entre 9 y 14 años, con media de 11 años.

Considero que esta variable tiene una importancia fisiopatológica fundamental para el análisis del perfil metabólico, pues durante la pubertad se produce una resistencia fisiológica transitoria a la insulina, mediada por el incremento de hormona de crecimiento y esteroides sexuales, que alcanza su pico máximo en los estadios de Tanner 2 y 3.

Esto significa que dos niños de la misma edad cronológica pero diferente madurez sexual pueden presentar perfiles metabólicos totalmente distintos. Por ejemplo, un niño en Tanner 1 tendrá una sensibilidad a la insulina mayor que un niño en Tanner 2 o 3, aun cuando ambos tengan 11 años de edad, asi que esto es preocupante porque la resistencia fisiológica puede descompensarse en presencia de exceso de adiposidad o sedentarismo, evolucionando hacia una resistencia patológica a la insulina, por lo tanto,en los análisis posteriores, especialmente aquellos relacionados con glicemia, perfil lipídico y presión arterial, debo estratificar por estadio de Tanner para identificar si la madurez sexual modifica las asociaciones entre adiposidad y marcadores metabólicos.

Análisis de la variable HIPERTENSIÓN ARTERIAL

tabla_hta <- BaseMetabolismo %>%
  count(hta) %>%
  mutate(
    `Clasificación HTA` = factor(hta, 
                                  levels = c(0, 1, 2), 
                                  labels = c("Normal", "Prehipertensión", "Hipertensión")),
    Frecuencia = n,
    Porcentaje = round((n / sum(n)) * 100, 2),
    `Porcentaje acumulado` = round(cumsum(Porcentaje), 2)
  ) %>%
  select(`Clasificación HTA`, Frecuencia, Porcentaje, `Porcentaje acumulado`)
print(tabla_hta)
## # A tibble: 3 × 4
##   `Clasificación HTA` Frecuencia Porcentaje `Porcentaje acumulado`
##   <fct>                    <int>      <dbl>                  <dbl>
## 1 Normal                      70       56                     56  
## 2 Prehipertensión             39       31.2                   87.2
## 3 Hipertensión                16       12.8                  100
BaseMetabolismo %>%
  mutate(hta_label = factor(hta, 
                            levels = c(0, 1, 2),
                            labels = c("Normal", "Prehipertensión", "Hipertensión"))) %>%
  ggplot(aes(x = hta_label, fill = hta_label)) +
  geom_bar(width = 0.5) +
  geom_text(stat = 'count', aes(label = paste0(after_stat(count), "\n(", 
              round(after_stat(count)/sum(after_stat(count))*100, 1), "%)")), 
            vjust = -0.3, size = 7, fontface = "bold") +
  scale_fill_manual(values = c("#2ECC71", "#F39C12", "#E74C3C")) +
  labs(
    title = "Distribución por clasificación de presión arterial",
    subtitle = "Categorización según percentiles específicos por edad, sexo y talla",
    x = "Clasificación de presión arterial",
    y = "Frecuencia absoluta"
  ) +
  theme(legend.position = "none") +
  ylim(0, max(table(BaseMetabolismo$hta)) + 12)

Distribución por clasificación de presión arterial y el análisis con la interpretación

Observo que el 56.0% de la muestra, correspondiente a 70 escolares, presenta valores de presión arterialdentro de rangos normales para su edad, sexo y talla. Sin embargo, encuentro una proporción preocupante de niños con alteraciones en la presión arterial, donde 39 escolares clasificados en prehipertensión,representan el 31.2%, y 16 niños con hipertensión arterial establecida que constituyen el 12.8% de la población.

Al analizar de forma conjunta las categorías de riesgo, identifico que el 44.0% de la muestra, es decir, casi la mitad de los escolares evaluados, presenta prehipertensión o hipertensión arterial, por lo que esta prevalencia es considerablemente elevada y supera las estimaciones poblacionales reportadas en la literatura pediátrica colombiana.

Considero que este hallazgo tiene implicaciones clínicas y epidemiológicas importantes, pues la prehipertensión en la infancia es un factor predictivo de hipertensión arterial en la edad adulta, y se asocia con daño vascular temprano, incluyendo disfunción endotelial, aumento del grosor íntima-media carotídeo e hipertrofia ventricular izquierda.

La presencia de hipertensión establecida en el 12.8% de niños clínicamente sanos sugiere que existe un subgrupo con riesgo cardiovascular aumentado que requiere evaluación y seguimiento.

La alta prevalencia de alteraciones en la presión arterial en esta cohorte puede estar relacionada con múltiples factores como:

el predominio de estratos socioeconómicos bajos con mayor exposición a dietas hiperproteicas e hipersódicas. la prevalencia de sobrepeso y obesidad, el sedentarismo, y potencialmente factores genéticos o familiares no medidos en este estudio.

En los análisis posteriores, exploraré las asociaciones entre presión arterial y variables antropométricas como el perímetro de cintura, el IMC y el porcentaje de grasa corporal, para identificar los determinantes de la hipertensión en esta población pediátrica.

Análisis de la variable ESTADO NUTRICIONAL

tabla_obesidad <- BaseMetabolismo %>%
  count(obesidad) %>%
  mutate(
    `Estado Nutricional` = factor(obesidad, 
                                   levels = c(0, 1, 2, 3), 
                                   labels = c("Normal", "Bajo peso", "Sobrepeso", "Obesidad")),
    Frecuencia = n,
    Porcentaje = round((n / sum(n)) * 100, 2),
    `Porcentaje acumulado` = round(cumsum(Porcentaje), 2)
  ) %>%
  select(`Estado Nutricional`, Frecuencia, Porcentaje, `Porcentaje acumulado`)
print(tabla_obesidad)
## # A tibble: 4 × 4
##   `Estado Nutricional` Frecuencia Porcentaje `Porcentaje acumulado`
##   <fct>                     <int>      <dbl>                  <dbl>
## 1 Normal                       85       68                     68  
## 2 Bajo peso                    10        8                     76  
## 3 Sobrepeso                    13       10.4                   86.4
## 4 Obesidad                     17       13.6                  100
BaseMetabolismo %>%
  mutate(obesidad_label = factor(obesidad, 
                                 levels = c(0, 1, 2, 3),
                                 labels = c("Normal", "Bajo peso", "Sobrepeso", "Obesidad"))) %>%
  ggplot(aes(x = obesidad_label, fill = obesidad_label)) +
  geom_bar(width = 0.5) +
  geom_text(stat = 'count', aes(label = paste0(after_stat(count), "\n(", 
              round(after_stat(count)/sum(after_stat(count))*100, 1), "%)")), 
            vjust = -0.3, size = 7, fontface = "bold") +
  scale_fill_manual(values = c("#27AE60", "#3498DB", "#F39C12", "#E74C3C")) +
  labs(
    title = "Distribución por estado nutricional",
    subtitle = "Clasificación según IMC y curvas de referencia OMS 2007",
    x = "Estado nutricional",
    y = "Frecuencia absoluta"
  ) +
  theme(legend.position = "none") +
  ylim(0, max(table(BaseMetabolismo$obesidad)) + 12)

análisis e interpretación Observo que el 68.0% de la muestra, correspondiente a 85 escolares, presenta un estado nutricional normal según la clasificación del IMC ajustado por edad y sexo con las curvas de referencia de la OMS 2007. Sin embargo, identifico que el 32.0% restante presenta alguna alteración en su estado nutricional, lo cual merece un análisis detallado.

El bajo peso afecta al 8.0% de la población con 10 niños, reflejando la persistencia de desnutrición infantil en sectores vulnerables,y por otro lado, el sobrepeso está presente en 13 escolares que representan el 10.4%, mientras que la obesidad se identifica en 17 niños, constituyendo el 13.6% de la muestra.

Al sumar las categorías de exceso de peso, encuentro que el 24.0% de la población evaluada presenta sobrepeso u obesidad, lo que representa prácticamente una cuarta parte de la cohorte. Considero que esta distribución del estado nutricional es característica del proceso de transición epidemiológica y nutricional que ha experimentado Colombia en los últimos años, además la coexistencia de bajo peso y exceso de peso en la misma población refleja la doble carga de malnutrición, pues por un lado, persisten casos de desnutrición asociados a pobreza y vulnerabilidad socioeconómica, y por otro lado, emerge la obesidad infantil vinculada a cambios en los patrones dietéticos hacia alimentos ultraprocesados, sedentarismo y reducción de la actividad física, aún al día de hoy.

La prevalencia del 24.0% de sobrepeso y obesidad es preocupante desde la perspectiva de salud pública, dado que el exceso de adiposidad en la infancia es el factor de riesgo más importante para el desarrollo de resistencia a la insulina, síndrome metabólico, diabetes tipo 2 e hipertensión arterial en etapas posteriores de la vida. El 24% proviene de SUMAR:Sobrepeso (10.4%) + Obesidad (13.6%) = 24.0%

Además, la obesidad infantil tiende a persistir en la adolescencia y edad adulta, configurando trayectorias de riesgo cardiovascular a largo plazo.

Análisis descriptivo de variables cuantitativas

Análisis de la variable EDAD La variable edad corresponde a una medida continua expresada en años, que permite caracterizar la distribución etaria de la población pediátrica evaluada.

summary(BaseMetabolismo$edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    9.00   11.00   11.00   11.08   11.00   14.00
library(psych)
describe(BaseMetabolismo$edad)
# Histograma 
ggplot(BaseMetabolismo, aes(x = edad)) +
  geom_histogram(
    bins = 10,
    fill = "#6C5B7B",
    color = "white",
    alpha = 0.85
  ) +
  geom_vline(aes(xintercept = mean(edad)), 
             color = "#F67280", linewidth = 1.2, linetype = "dashed") +
  labs(
    title = "Distribución de la edad en la cohorte",
    subtitle = paste("N =", nrow(BaseMetabolismo), "escolares | Media =", 
                     round(mean(BaseMetabolismo$edad), 1), "años"),
    x = "Edad (años)",
    y = "Frecuencia"
  )

# Boxplot 
ggplot(BaseMetabolismo, aes(x = "", y = edad)) +
  geom_boxplot(
    fill = "#C06C84",
    color = "#355C7D",
    width = 0.4,
    alpha = 0.8,
    outlier.shape = NA
  ) +
  geom_jitter(
    width = 0.15,
    alpha = 0.4,
    color = "#355C7D",
    size = 3
  ) +
  stat_summary(fun = mean, geom = "point", 
               shape = 18, size = 5, color = "#F8B500") +
  labs(
    title = "Diagrama de caja: Distribución de la edad",
    subtitle = "Rombo amarillo = media | Línea central = mediana",
    y = "Edad (años)",
    x = ""
  ) +
  coord_flip()

Interpretación descriptiva de la variable EDAD

La variable edad (años) describe la distribución etaria de los 125 participantes pediátricos de la cohorte.
Resultados generales - n = 125 participantes
- Media = 11,08 años
- Desviación estándar (DE) = 0,96 años
- Mediana = 11 años
- Mínimo = 9 años
- Máximo = 14 años
- Rango = 5 años
- Asimetría (skew) = 0,45
- Curtosis = 0,78
- Error estándar (SE) = 0,09

La edad promedio que obtuve fue de 11,08 años, con una desviación estándar de 0,96 años, lo cual significa que la mayoría de los niños y niñas tienen edades muy cercanas entre sí, con variaciones menores a un año.En cuanto al valor mínimo fue 9 años y el máximo 14 años, lo que me muestra un rango relativamente estrecho de 5 años, propio de una población escolar o pediátrica homogénea.

Cuando observo que la media (11,08) y la mediana (11) son prácticamente iguales, entiendo que los datos están equilibrados y sin sesgo hacia edades más altas o más bajas, por lo cual me confirma que la distribución de la edad en mi base de datos es estable y representativa del grupo que estudio.

Comportamiento estadístico de la variable

Al revisar la asimetría (0,45) noto que existe una ligera tendencia hacia edades un poco mayores, pero este valor es bajo, por lo que no altera de forma significativa la distribución, pero por otro lado, la curtosis (0,78) me indica que la distribución es ligeramente leptocúrtica, es decir, los datos están un poco más concentrados alrededor del promedio en comparación con una distribución normal perfecta, sin embargo, este valor es bajo y no representa un problema para los análisis que seguiré.

Considero que la edad presenta una distribución aproximadamente simétrica y sin valores atípicos, lo que me da confianza para aplicar posteriormente pruebas estadísticas paramétricas, como comparaciones de medias o correlaciones con otras variables continuas.

Perfil etario de la cohorte

Cuando observo que la mayoría de los participantes tienen entre 10 y 12 años, comprendo que estoy trabajando con una población que se encuentra en una etapa prepuberal o puberal temprana.

Esta etapa es particularmente importante porque en ella comienzan los cambios hormonales y metabólicos que influyen directamente en el crecimiento, la composición corporal y la sensibilidad a la insulina.

Desde una mirada clínica y epidemiológica, me interesa analizar esta edad porque es justamente el momento donde pueden empezar a manifestarse signos tempranos de riesgo cardiometabólico, como sobrepeso, dislipidemia o hipertensión incipiente.

Dispersión y homogeneidad

La baja desviación estándar (0,96) y el rango estrecho de edades me permiten afirmar que mi muestra es homogénea, lo cual considero que es positivo porque me evita que la edad actúe como un factor de confusión en los análisis posteriores, y al no existir grandes diferencias etarias entre los sujetos, puedo comparar variables como el IMC, la grasa corporal o la presión arterial con mayor precisión, sabiendo que las diferencias no se deben a la edad.

Además, esta homogeneidad me mejora la validez interna del estudio y la coherencia de los resultados estadísticos.

Análisis visual

El histograma que generé muestra una distribución unimodal, con una clara concentración de casos en torno a los 11 años, y sin valores extremos o anómalos, además la línea punteada indica la media, que se ubica muy cerca del centro de la distribución.

En el diagrama de caja horizontal observo una caja relativamente estrecha, lo cual lo puedo esperar, dado que la edad es una variable discreta con solo 6 valores posibles (9 a 14 años).

La mediana (línea central) coincide prácticamente con la media (rombo amarillo), lo que me confirma visualmente la simetría de la distribución, además, la dispersión de los puntos individuales me permite visualizar la concentración de casos alrededor de los 11 años, sin presencia de valores atípicos.

Ambas representaciones me ayudan a confirmar que la variable edad se comporta de manera estable, simétrica y bien definida dentro de esta población, lo que me respalda su uso en análisis paramétricos más adelante.

Análisis descriptivo de la variable TALLA

BaseMetabolismo <- BaseMetabolismo %>%
  mutate(talla = ifelse(talla > 2, talla / 100, talla))

cat("1. RESUMEN BÁSICO:\n")
## 1. RESUMEN BÁSICO:
print(summary(BaseMetabolismo$talla))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.29    1.40    1.44    1.45    1.50    1.67
cat("\n2. MEDIDAS DE TENDENCIA CENTRAL:\n")
## 
## 2. MEDIDAS DE TENDENCIA CENTRAL:
cat("Media:   ", round(mean(BaseMetabolismo$talla, na.rm = TRUE), 3), "m\n")
## Media:    1.45 m
cat("Mediana: ", round(median(BaseMetabolismo$talla, na.rm = TRUE), 3), "m\n")
## Mediana:  1.44 m
cat("\n3. MEDIDAS DE DISPERSIÓN:\n")
## 
## 3. MEDIDAS DE DISPERSIÓN:
cat("Desviación Estándar: ", round(sd(BaseMetabolismo$talla, na.rm = TRUE), 3), "m\n")
## Desviación Estándar:  0.08 m
cat("Varianza:            ", round(var(BaseMetabolismo$talla, na.rm = TRUE), 4), "m²\n")
## Varianza:             0.0065 m²
cat("Rango:               ", round(max(BaseMetabolismo$talla, na.rm = TRUE) - min(BaseMetabolismo$talla, na.rm = TRUE), 3), "m\n")
## Rango:                0.38 m
cat("Rango IQ:            ", round(IQR(BaseMetabolismo$talla, na.rm = TRUE), 3), "m\n")
## Rango IQ:             0.1 m
cat("Coef. Variación:     ", round((sd(BaseMetabolismo$talla, na.rm = TRUE) / mean(BaseMetabolismo$talla, na.rm = TRUE)) * 100, 2), "%\n")
## Coef. Variación:      5.55 %
cat("\n4. MEDIDAS DE POSICIÓN:\n")
## 
## 4. MEDIDAS DE POSICIÓN:
cat("Mínimo:  ", round(min(BaseMetabolismo$talla, na.rm = TRUE), 2), "m\n")
## Mínimo:   1.29 m
cat("Q1 (P25):", round(quantile(BaseMetabolismo$talla, 0.25, na.rm = TRUE), 2), "m\n")
## Q1 (P25): 1.4 m
cat("Q2 (P50):", round(quantile(BaseMetabolismo$talla, 0.50, na.rm = TRUE), 2), "m\n")
## Q2 (P50): 1.44 m
cat("Q3 (P75):", round(quantile(BaseMetabolismo$talla, 0.75, na.rm = TRUE), 2), "m\n")
## Q3 (P75): 1.5 m
cat("Máximo:  ", round(max(BaseMetabolismo$talla, na.rm = TRUE), 2), "m\n")
## Máximo:   1.67 m
cat("\n5. MEDIDAS DE FORMA:\n")
## 
## 5. MEDIDAS DE FORMA:
cat("Asimetría (Skewness): ", round(skewness(BaseMetabolismo$talla, na.rm = TRUE), 3), "\n")
## Asimetría (Skewness):  0.432
cat("Curtosis (Kurtosis):  ", round(kurtosis(BaseMetabolismo$talla, na.rm = TRUE), 3), "\n")
## Curtosis (Kurtosis):   2.87
tabla_talla <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(talla, na.rm = TRUE), 3),
    Mediana = round(median(talla, na.rm = TRUE), 3),
    `Desv. Est.` = round(sd(talla, na.rm = TRUE), 3),
    Varianza = round(var(talla, na.rm = TRUE), 4),
    Mínimo = round(min(talla, na.rm = TRUE), 2),
    `Q1 (P25)` = round(quantile(talla, 0.25, na.rm = TRUE), 2),
    `Q2 (P50)` = round(quantile(talla, 0.50, na.rm = TRUE), 2),
    `Q3 (P75)` = round(quantile(talla, 0.75, na.rm = TRUE), 2),
    Máximo = round(max(talla, na.rm = TRUE), 2),
    Rango = round(max(talla, na.rm = TRUE) - min(talla, na.rm = TRUE), 2),
    `Rango IQ` = round(IQR(talla, na.rm = TRUE), 2),
    `CV (%)` = round((sd(talla, na.rm = TRUE) / mean(talla, na.rm = TRUE)) * 100, 2),
    Asimetría = round(skewness(talla, na.rm = TRUE), 2),
    Curtosis = round(kurtosis(talla, na.rm = TRUE), 2)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadístico")

colnames(tabla_talla)[2] <- "Valor"

kable(tabla_talla, 
      caption = "Estadísticas descriptivas de la variable TALLA",
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  row_spec(c(1:3), background = "#E8F8F5") %>%
  row_spec(c(4:5), background = "#FEF9E7") %>%
  row_spec(c(6:12), background = "#F4ECF7") %>%
  row_spec(c(13:15), background = "#E8F6F3")
Estadísticas descriptivas de la variable TALLA
Estadístico Valor
N 125.0000
Media 1.4500
Mediana 1.4400
Desv. Est. 0.0800
Varianza 0.0065
Mínimo 1.2900
Q1 (P25) 1.4000
Q2 (P50) 1.4400
Q3 (P75) 1.5000
Máximo 1.6700
Rango 0.3800
Rango IQ 0.1000
CV (%) 5.5500
Asimetría 0.4300
Curtosis 2.8700
# Histograma con ggplot2
ggplot(BaseMetabolismo, aes(x = talla)) +
  geom_histogram(binwidth = 0.05, fill = "#9B59B6", color = "white", alpha = 0.85) +
  geom_vline(aes(xintercept = mean(talla, na.rm = TRUE)), 
             color = "#E67E22", linewidth = 1.2, linetype = "dashed") +
  geom_vline(aes(xintercept = median(talla, na.rm = TRUE)), 
             color = "#16A085", linewidth = 1.2, linetype = "dashed") +
  annotate("text", x = 1.65, y = Inf, vjust = 2, hjust = 1, size = 5,
           label = paste0("Media = ", round(mean(BaseMetabolismo$talla, na.rm = TRUE), 3), " m"),
           color = "#E67E22", fontface = "bold") +
  annotate("text", x = 1.65, y = Inf, vjust = 4, hjust = 1, size = 5,
           label = paste0("Mediana = ", round(median(BaseMetabolismo$talla, na.rm = TRUE), 3), " m"),
           color = "#16A085", fontface = "bold") +
  labs(
    title = "Distribución de la talla",
    subtitle = paste("N =", nrow(BaseMetabolismo), "escolares"),
    x = "Talla (metros)",
    y = "Frecuencia absoluta"
  ) +
  scale_x_continuous(limits = c(1.25, 1.70), breaks = seq(1.25, 1.70, 0.05))

# Boxplot con ggplot2
ggplot(BaseMetabolismo, aes(x = "", y = talla)) +
  geom_boxplot(fill = "#F39C12", color = "#D35400", width = 0.4, 
               alpha = 0.8, outlier.shape = NA) +
  geom_jitter(width = 0.15, alpha = 0.4, color = "#8E44AD", size = 3) +
  stat_summary(fun = mean, geom = "point", shape = 18, size = 5, color = "#E74C3C") +
  labs(
    title = "Diagrama de caja: Distribución de la talla",
    subtitle = "Rombo rojo = media | Línea central = mediana",
    y = "Talla (metros)",
    x = ""
  ) +
  scale_y_continuous(limits = c(1.25, 1.70), breaks = seq(1.25, 1.70, 0.05)) +
  coord_flip()

ANÁLISIS DESCRIPTIVO ESTADÍSTICO: VARIABLE TALLA (m)

La variable talla (m) es cuantitativa continua y se mide en escala de razón, ya que posee un cero absoluto (ausencia de longitud) y permite comparaciones proporcionales entre individuos.
Esta característica justifica el uso de medidas de tendencia central, dispersión, posición y forma, que describen de manera integral su comportamiento estadístico y biológico.

MEDIDAS DE TENDENCIA CENTRAL

Media = 1.45 m (145 cm)
La media aritmética representa el promedio de las tallas de los 125 escolares, por lo que se obtuvo sumando todas las observaciones y dividiendo entre el total, además esta medida resume el “centro” de los datos en un solo valor y permite comparaciones con otros grupos o estándares de referencia.

Una media de 1.45 m me indica que un escolar típico de esta cohorte mide aproximadamente 145 cm, valor coherente con el percentil 50 de las curvas de crecimiento de la OMS para niños de 11 años, lo cual sugiere un crecimiento adecuado y un desarrollo físico dentro de la normalidad.

Mediana = 1.44 m (144 cm)
La mediana divide la distribución en dos mitades iguales: el 50% de los escolares mide ≤1.44 m y el otro 50% mide ≥1.44 m.
Uso esta medida porque es robusta frente a valores extremos; si existieran niños con tallas atípicas (muy bajas o muy altas), la mediana no se vería afectada significativamente.

La diferencia mínima entre la media (1.45) y la mediana (1.44), de apenas 1 cm, confirma que la distribución es simétrica, sin sesgos ni valores extremos que distorsionen el promedio.

MEDIDAS DE DISPERSIÓN

Desviación Estándar (DE) = 0.08 m (8 cm)
La DE mide cuánto se alejan, en promedio, las tallas individuales respecto a la media.Uso esta medida porque cuantifica la variabilidad de los datos, permitiendo evaluar si la población es homogénea o diversa.

Una DE de 8 cm es moderadamente baja, indicando homogeneidad antropométrica. Según la regla (68-95-99.7), el 68% de los escolares tiene tallas entre 1.37 m y 1.53 m (media ± 1 DE), concentrándose cerca del promedio.

Coeficiente de Variación (CV) = 5.55%
El CV expresa la variabilidad relativa respecto a la mediaa asi: (0.08 / 1.45) × 100 = 5.55%.
Uso esta medida porque me permite comparar la dispersión relativa entre variables con diferentes unidades o magnitudes.

Un CV inferior al 15% lo interpreto como baja variabilidad, lo cual me confirma que el grupo es antropométricamente homogéneo, posiblemente con condiciones socioeconómicas y nutricionales similares.

Rango = 0.38 m (38 cm)
El rango representa la amplitud total de las observaciones: 1.67 m (máximo) – 1.29 m (mínimo) = 0.38 m.
Uso esta medida porque muestra la dispersión extrema de los datos, aunque puede verse afectada por valores atípicos.

Una diferencia de 38 cm entre el escolar más bajo y el más alto es fisiológicamente esperada en población de 9 a 14 años, etapa caracterizada por:

a.Diferentes estadios puberales (Tanner 1 a 3)
b.Ritmos variables en el estirón puberal
c.Influencias genéticas y ambientales naturales

Rango Intercuartílico (RIQ) = 0.10 m (10 cm)
El RIQ refleja la dispersión del 50% central de los datos: Q3 (1.50) – Q1 (1.40) = 0.10 m.
Uso esta medida porque es robusta frente a valores extremos y me permite evaluar la consistencia del grupo medio.

El 50% central de los escolares se concentra en un rango de apenas 10 cm, lo que me confirma una gran uniformidad en talla, y aunque el rango total es amplio, la mayoría de los participantes presenta valores muy similares.

MEDIDAS DE POSICIÓN (CUARTILES)

Los cuartiles dividen la distribución en cuatro partes iguales y permiten identificar dónde se concentran los valores:

  • Q1 = 1.40 m: el 25% de los escolares mide ≤1.40 m (los más bajos).
  • Q2 = 1.44 m: corresponde a la mediana (50% mide ≤1.44 m).
  • Q3 = 1.50 m: el 75% mide ≤1.50 m (los más altos dentro del grupo medio). Uso estas medidas porque permiten examinar la estructura interna de la distribución y me ayuda a detectar concentraciones o asimetrías.

Interpretación por segmentos: - Primer cuartil (1.29–1.40 m): escolares prepuberales o con menor potencial genético.
- Segundo y tercer cuartil (1.40–1.50 m): grupo mayoritario con tallas promedio típicas.
- Cuarto cuartil (1.50–1.67 m): escolares en pleno estirón puberal o con mejor estado nutricional.

MEDIDAS DE FORMA

Asimetría (Skewness) = 0.432
Esta medida evalúa el grado de simetría de la distribución en relación con la media, y se clasifica así:

a.Skewness = 0 → distribución perfectamente simétrica
b.Skewness > 0 → asimetría positiva (cola hacia la derecha)
c.Skewness < 0 → asimetría negativa (cola hacia la izquierda)

Uso esta medida porque me permite identificar sesgos estructurales en la variable, por ejemplo un valor de 0.432 indica ligera asimetría positiva, es decir, existe una pequeña cola hacia tallas mayores.

Sin embargo, este valor está dentro del rango aceptable (-0.5 < Skewness < 0.5), por lo que la distribución puede considerarse prácticamente simétrica.

Curtosis = 2.87
La curtosis me mide el grado de apuntamiento o concentración de los valores alrededor de la media.

  • Curtosis = 3 → distribución normal (mesocúrtica)
  • Curtosis > 3 → distribución puntiaguda (leptocúrtica)
  • Curtosis < 3 → distribución aplanada (platicúrtica)

Uso esta medida porque me informa sobre la dispersión vertical de la variable, indicando si los valores se agrupan o dispersan excesivamente.
Un valor de 2.87 ≈ 3 señala una distribución mesocúrtica, lo que implica una concentración de tallas alrededor de la media muy similar a la distribución normal teórica.

INTERPRETACIÓN DE LOS GRÁFICOS

Histograma (color morado):
El histograma me muestra una distribución unimodal, con un único pico centrado entre 1.40 y 1.50 m.
La forma de campana respalda la normalidad estadística, y la proximidad entre las líneas de media (naranja) y mediana (verde) confirma la simetría de los datos, y la ligera extensión hacia la derecha (1.60–1.67 m) explica la asimetría positiva leve, fisiológicamente esperada.

Boxplot (color naranja):

El diagrama de caja muestra una caja estrecha (RIQ ≈ 0.10 m), que representa una alta concentración del 50% central.

La mediana (línea central) y la media (rombo rojo) prácticamente coinciden, confirmando visualmente la simetría de la distribución,además NO observo valores atípicos (outliers),pues el valor máximo (1.67 m) considero que se encuentra dentro del rango esperado según los bigotes del diagrama, lo que me confirma la ausencia de errores de medición.

CONCLUSIÓN GENERAL

La variable talla (m) presenta una distribución normal, homogénea y simétrica, con variabilidad baja y consistencia interna elevada.

Las medidas de tendencia central, dispersión y forma coinciden en mostrar una cohorte antropométricamente equilibrada, representativa de un grupo pediátrico en crecimiento normal, por lo que esta estabilidad estadística respalda el uso de pruebas paramétricas en análisis posteriores y refuerza la validez interna del estudio.

En síntesis,creo que los datos de talla reflejan una población infantil y adolescente en desarrollo saludable, con distribución normal, bajo error de medición y alta confiabilidad metodológica.

VARIABLE PESO

cat("1. RESUMEN BÁSICO:\n")
## 1. RESUMEN BÁSICO:
print(summary(BaseMetabolismo$peso))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   26.20   34.00   38.80   41.15   46.80   68.80
cat("\n2. MEDIDAS DE TENDENCIA CENTRAL:\n")
## 
## 2. MEDIDAS DE TENDENCIA CENTRAL:
cat("Media:   ", round(mean(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg\n")
## Media:    41.15 kg
cat("Mediana: ", round(median(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg\n")
## Mediana:  38.8 kg
cat("\n3. MEDIDAS DE DISPERSIÓN:\n")
## 
## 3. MEDIDAS DE DISPERSIÓN:
cat("Desviación Estándar: ", round(sd(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg\n")
## Desviación Estándar:  9.9 kg
cat("Varianza:            ", round(var(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg²\n")
## Varianza:             97.91 kg²
cat("Rango:               ", round(max(BaseMetabolismo$peso, na.rm = TRUE) - min(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg\n")
## Rango:                42.6 kg
cat("Rango IQ:            ", round(IQR(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg\n")
## Rango IQ:             12.8 kg
cat("Coef. Variación:     ", round((sd(BaseMetabolismo$peso, na.rm = TRUE) / mean(BaseMetabolismo$peso, na.rm = TRUE)) * 100, 2), "%\n")
## Coef. Variación:      24.04 %
cat("\n4. MEDIDAS DE POSICIÓN:\n")
## 
## 4. MEDIDAS DE POSICIÓN:
cat("Mínimo:  ", round(min(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg\n")
## Mínimo:   26.2 kg
cat("Q1 (P25):", round(quantile(BaseMetabolismo$peso, 0.25, na.rm = TRUE), 2), "kg\n")
## Q1 (P25): 34 kg
cat("Q2 (P50):", round(quantile(BaseMetabolismo$peso, 0.50, na.rm = TRUE), 2), "kg\n")
## Q2 (P50): 38.8 kg
cat("Q3 (P75):", round(quantile(BaseMetabolismo$peso, 0.75, na.rm = TRUE), 2), "kg\n")
## Q3 (P75): 46.8 kg
cat("Máximo:  ", round(max(BaseMetabolismo$peso, na.rm = TRUE), 2), "kg\n")
## Máximo:   68.8 kg
cat("\n5. MEDIDAS DE FORMA:\n")
## 
## 5. MEDIDAS DE FORMA:
cat("Asimetría (Skewness): ", round(skewness(BaseMetabolismo$peso, na.rm = TRUE), 3), "\n")
## Asimetría (Skewness):  0.757
cat("Curtosis (Kurtosis):  ", round(kurtosis(BaseMetabolismo$peso, na.rm = TRUE), 3), "\n")
## Curtosis (Kurtosis):   2.914
cat("\n===============================================\n\n")
## 
## ===============================================
tabla_peso <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(peso, na.rm = TRUE), 2),
    Mediana = round(median(peso, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(peso, na.rm = TRUE), 2),
    Varianza = round(var(peso, na.rm = TRUE), 2),
    Mínimo = round(min(peso, na.rm = TRUE), 2),
    `Q1 (P25)` = round(quantile(peso, 0.25, na.rm = TRUE), 2),
    `Q2 (P50)` = round(quantile(peso, 0.50, na.rm = TRUE), 2),
    `Q3 (P75)` = round(quantile(peso, 0.75, na.rm = TRUE), 2),
    Máximo = round(max(peso, na.rm = TRUE), 2),
    Rango = round(max(peso, na.rm = TRUE) - min(peso, na.rm = TRUE), 2),
    `Rango IQ` = round(IQR(peso, na.rm = TRUE), 2),
    `CV (%)` = round((sd(peso, na.rm = TRUE) / mean(peso, na.rm = TRUE)) * 100, 2),
    Asimetría = round(skewness(peso, na.rm = TRUE), 2),
    Curtosis = round(kurtosis(peso, na.rm = TRUE), 2)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadístico")

colnames(tabla_peso)[2] <- "Valor"

kable(tabla_peso, 
      caption = "Estadísticas descriptivas de la variable PESO",
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  row_spec(c(1:3), background = "#E8F8F5") %>%
  row_spec(c(4:5), background = "#FEF9E7") %>%
  row_spec(c(6:12), background = "#F4ECF7") %>%
  row_spec(c(13:15), background = "#E8F6F3")
Estadísticas descriptivas de la variable PESO
Estadístico Valor
N 125.00
Media 41.15
Mediana 38.80
Desv. Est. 9.90
Varianza 97.91
Mínimo 26.20
Q1 (P25) 34.00
Q2 (P50) 38.80
Q3 (P75) 46.80
Máximo 68.80
Rango 42.60
Rango IQ 12.80
CV (%) 24.04
Asimetría 0.76
Curtosis 2.91
par(mfrow = c(1, 2), mar = c(5, 5, 4, 2))

hist(BaseMetabolismo$peso, 
     breaks = 12,
     col = "#3498DB", 
     border = "white",
     main = "Distribución de Peso",
     xlab = "Peso (kg)",
     ylab = "Frecuencia absoluta",
     las = 1,
     cex.main = 1.3,
     cex.lab = 1.1)

abline(v = mean(BaseMetabolismo$peso, na.rm = TRUE), col = "#E74C3C", lwd = 3, lty = 2)
abline(v = median(BaseMetabolismo$peso, na.rm = TRUE), col = "#27AE60", lwd = 3, lty = 2)

legend("topright", 
       legend = c(paste0("Media = ", round(mean(BaseMetabolismo$peso, na.rm = TRUE), 2), " kg"),
                  paste0("Mediana = ", round(median(BaseMetabolismo$peso, na.rm = TRUE), 2), " kg")),
       col = c("#E74C3C", "#27AE60"), 
       lty = 2, lwd = 3, cex = 0.9, bg = "white")

grid(nx = NA, ny = NULL, col = "gray80", lty = "dotted")

boxplot(BaseMetabolismo$peso, 
        col = "#85C1E2",
        border = "#2E86C1",
        main = "Diagrama de Caja: Peso",
        ylab = "Peso (kg)",
        las = 1,
        lwd = 2.5,
        boxwex = 0.4,
        outcol = "#C0392B",
        outpch = 19,
        outcex = 1.5,
        cex.main = 1.3,
        cex.lab = 1.1,
        frame.plot = FALSE)

text(1.25, median(BaseMetabolismo$peso, na.rm = TRUE), 
     paste0("Med = ", round(median(BaseMetabolismo$peso, na.rm = TRUE), 2), " kg"), 
     pos = 4, cex = 1.0, col = "#8E44AD", font = 2)

text(1.25, quantile(BaseMetabolismo$peso, 0.75, na.rm = TRUE), 
     paste0("Q3 = ", round(quantile(BaseMetabolismo$peso, 0.75, na.rm = TRUE), 2), " kg"), 
     pos = 4, cex = 0.9, col = "#2E86C1", font = 2)

text(1.25, quantile(BaseMetabolismo$peso, 0.25, na.rm = TRUE), 
     paste0("Q1 = ", round(quantile(BaseMetabolismo$peso, 0.25, na.rm = TRUE), 2), " kg"), 
     pos = 4, cex = 0.9, col = "#2E86C1", font = 2)

abline(h = mean(BaseMetabolismo$peso, na.rm = TRUE), col = "#E74C3C", lty = 2, lwd = 2)

grid(nx = NA, ny = NULL, col = "gray80", lty = "dotted")

par(mfrow = c(1, 1))

ANÁLISIS DESCRIPTIVO ESTADÍSTICO: VARIABLE PESO (kg)

La variable peso (kg) es cuantitativa continua y se mide en escala de razón, ya que posee un cero absoluto (ausencia de masa corporal) y permite comparaciones proporcionales entre individuos. Esta característica justifica el uso de medidas de tendencia central, dispersión, posición y forma, que describen de manera integral su comportamiento estadístico y su relevancia como indicador antropométrico del estado nutricional.

MEDIDAS DE TENDENCIA CENTRAL

Media = 41.15 kg La media aritmética representa el promedio de los pesos de los 125 escolares, por lo que se obtuvo sumando todas las observaciones y dividiendo entre el total, además esta medida me resume el “centro” de los datos en un solo valor y permite comparaciones con otros grupos o estándares de referencia.

Una media de 41.15 kg me indica que un escolar típico de esta cohorte pesa aproximadamente 41 kg, valor que resulta coherente para niños con edad promedio de 11.08 años y talla promedio de 145 cm, lo cual sugiere un desarrollo ponderal dentro de rangos esperados para población escolar latinoamericana.

Mediana = 38.80 kg La mediana divide la distribución en dos mitades iguales: el 50% de los escolares pesa ≤38.8 kg y el otro 50% pesa ≥38.8 kg. Uso esta medida porque es robusta frente a valores extremos; si existieran niños con pesos atípicos (muy bajos o muy altos), la mediana no se vería afectada significativamente.

La diferencia entre la media (41.15) y la mediana (38.80) es de 2.35 kg, lo cual me indica que la distribución presenta asimetría positiva, es decir, existe una pequeña proporción de escolares con pesos más elevados que me “jalan” la media hacia arriba, mientras que la mediana se mantiene más representativa del grupo central.

MEDIDAS DE DISPERSIÓN

Desviación Estándar (DE) = 9.90 kg La DE mide cuánto se alejan, en promedio, los pesos individuales respecto a la media. Uso esta medida porque cuantifica la variabilidad de los datos, permitiendo evaluar si la población es homogénea o diversa.

Una DE de 9.90 kg es considerablemente mayor comparada con otras variables antropométricas (por ejemplo, talla con DE = 0.08 m), lo que me indica heterogeneidad en la composición corporal; según la regla empírica (68-95-99.7), el 68% de los escolares tiene pesos entre 31.25 kg y 51.05 kg (media ± 1 DE), mostrando una dispersión moderada-alta.

Coeficiente de Variación (CV) = 24.04% El CV expresa la variabilidad relativa respecto a la media así: (9.90 / 41.15) × 100 = 24.04%. Uso esta medida porque me permite comparar la dispersión relativa entre variables con diferentes unidades o magnitudes.

Un CV de 24.04% es significativamente mayor que el observado en talla (5.55%), lo cual me confirma que el peso presenta mayor variabilidad entre individuos, siendo esto fisiológicamente esperado porque el peso refleja no solo la estructura ósea y talla, sino también la composición corporal (masa grasa, masa muscular, hidratación), la cual varía considerablemente según alimentación, actividad física y madurez sexual.

Rango = 42.60 kg El rango representa la amplitud total de las observaciones: 68.80 kg (máximo) – 26.20 kg (mínimo) = 42.60 kg. Uso esta medida porque muestra la dispersión extrema de los datos, aunque puede verse afectada por valores atípicos.

Una diferencia de 42.6 kg entre el escolar más liviano y el más pesado representa un 103.5% de la media, lo cual evidencia alta variabilidad ponderal, siendo este rango amplio y esperable en población de 9 a 14 años, etapa caracterizada por:

  1. Diferentes estadios de madurez sexual (prepuberal vs puberal)
  2. Inicio del estirón puberal en algunos escolares (aumento acelerado de peso)
  3. Variabilidad en composición corporal (algunos con mayor masa grasa, otros con mayor masa muscular)
  4. Diferencias en patrones alimentarios y actividad física

Rango Intercuartílico (RIQ) = 12.80 kg El RIQ refleja la dispersión del 50% central de los datos: Q3 (46.80) – Q1 (34.00) = 12.80 kg. Uso esta medida porque es robusta frente a valores extremos y me permite evaluar la consistencia del grupo medio.

El 50% central de los escolares presenta una variación de 12.8 kg, lo cual representa aproximadamente un 31% de la media. Esto me confirma que, aunque hay un outlier extremo (68.8 kg), la mayoría de la población presenta pesos relativamente concentrados, aunque con mayor dispersión que en talla. MEDIDAS DE POSICIÓN (CUARTILES)

Los cuartiles dividen la distribución en cuatro partes iguales y permiten identificar dónde se concentran los valores: Q1 = 34.00 kg: el 25% de los escolares pesa ≤34 kg(los más livianos) Q2 = 38.80 kg: corresponde a la mediana (50% pesa ≤38.8 kg). Q3 = 46.80 kg: el 75% pesa ≤46.8 kg (los más pesados dentro del grupo medio).

Uso estas medidas porque permiten examinar la estructura interna de la distribución y me ayuda a detectar concentraciones o asimetrías.

Interpretación por segmentos:

a.Primer cuartil (26.2–34.0 kg): escolares con bajo peso o en estadios prepuberales tempranos, posiblemente con menor masa muscular o adiposa. b.Segundo y tercer cuartil (34.0–46.8 kg): grupo mayoritario con pesos dentro de rangos normales para la edad y talla promedio. c.Cuarto cuartil (46.8–68.8 kg): escolares con mayor masa corporal, que podría reflejar tanto sobrepeso/obesidad como mayor desarrollo muscular en escolares más avanzados puberalmente o con mejor estado nutricional.

MEDIDAS DE FORMA

Asimetría (Skewness) = 0.757 Esta medida evalúa el grado de simetría de la distribución en relación con la media, y se clasifica así:

  1. Skewness = 0 → distribución perfectamente simétrica
  2. Skewness > 0 → asimetría positiva (cola hacia la derecha)
  3. Skewness < 0 → asimetría negativa (cola hacia la izquierda)

Uso esta medida porque me permite identificar sesgos estructurales en la variable. Por ejemplo, un valor de 0.757 me indica asimetría positiva moderada, es decir, existe una cola pronunciada hacia pesos mayores.

Este valor supera el umbral de simetría (0.5), lo que me confirma que la distribución NO es perfectamente simétrica. La presencia del outlier en 68.8 kg y la diferencia entre media y mediana (2.35 kg) respaldan esta asimetría positiva.

Interpretación clínica: Esta asimetría me sugiere que, aunque la mayoría de los escolares tiene pesos normales, existe un subgrupo con sobrepeso u obesidad que desplaza la distribución hacia la derecha.

Curtosis = 2.914 La curtosis me mide el grado de apuntamiento o concentración de los valores alrededor de la media.

Curtosis = 3 → distribución normal (mesocúrtica)
Curtosis > 3 → distribución puntiaguda (leptocúrtica)
Curtosis < 3 → distribución aplanada (platicúrtica)

Uso esta medida porque me informa sobre la dispersión vertical de la variable, indicando si los valores se agrupan o dispersan excesivamente.

Un valor de 2.914 ≈ 3 señala una distribución prácticamente mesocúrtica, lo que implica una concentración de pesos alrededor de la media muy similar a la distribución normal teórica, aunque ligeramente aplanada.

INTERPRETACIÓN DE LOS GRÁFICOS

Histograma (color azul): El histograma me muestra una distribución unimodal, con un pico principal entre 35 y 40 kg, seguido de una cola extendida hacia la derecha (pesos altos).

La separación visible entre las líneas de media (roja, 41.15 kg) y mediana (verde, 38.80 kg)me confirma visualmente la asimetría positiva. La media está desplazada hacia la derecha debido a la influencia de pesos más elevados.

La presencia de frecuencias bajas pero persistentes entre 50-70 kg explica la asimetría moderada, evidenciando que existe un pequeño grupo de escolares con sobrepeso u obesidad.

Boxplot (color azul claro): El diagrama de caja muestra una caja más ancha (RIQ = 12.8 kg) comparada con talla, lo cual representa mayor dispersión del 50% central.

La mediana está desplazada hacia el borde inferior de la caja, lo cual es consistente con la asimetría positiva que detecté numéricamente (0.757).

Se observa un outlier extremo (punto rojo en 68.8 kg), que corresponde a un escolar significativamente más pesado que el resto. Este valor está 3.03 desviaciones estándar por encima de la mediana, lo cual me sugiere posible obesidad severa o error de medición, aunque considero que el primero es más probable dado el contexto pediátrico.

CONCLUSIÓN GENERAL

La variable peso (kg) presenta una distribución con asimetría positiva moderada y mayor heterogeneidad comparada con talla, reflejando la variabilidad natural en composición corporal durante el desarrollo puberal.

Las medidas de tendencia central difieren significativamente (media = 41.15 kg vs mediana = 38.80 kg), lo cual me confirma la presencia de valores elevados que influyen en el promedio, y el coeficiente de variación alto (24.04%) indica que el peso es una variable más dispersa que la talla, lo cual es fisiológicamente esperado porque integra múltiples componentes (hueso, músculo, grasa, agua).

La asimetría positiva (0.757) y la presencia de un outlier (68.8 kg) sugieren que existe un subgrupo de escolares con sobrepeso u obesidad, lo cual tiene relevancia epidemiológica para la caracterización del riesgo cardiometabólico en esta cohorte.

En síntesis, creo que los datos de peso reflejan una población infantil y adolescente con variabilidad ponderal normal, aunque con señales de alerta respecto a exceso de peso en algunos individuos, lo cual justifica análisis posteriores estratificados por estado nutricional (IMC) y composición corporal (% grasa) para identificar perfiles de riesgo metabólico.

ANÁLISIS VARIABLES CARDIOVASCULARES

Presión Arterial Sistólica (PAS) y Diastólica (PAD)

tabla_pas <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(pas, na.rm = TRUE), 2),
    Mediana = round(median(pas, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(pas, na.rm = TRUE), 2),
    Varianza = round(var(pas, na.rm = TRUE), 2),
    Minimo = round(min(pas, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(pas, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(pas, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(pas, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(pas, na.rm = TRUE), 1),
    Rango = round(max(pas, na.rm = TRUE) - min(pas, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(pas, na.rm = TRUE), 1),
    `CV (%)` = round((sd(pas, na.rm = TRUE) / mean(pas, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(pas, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(pas, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadistico")

colnames(tabla_pas)[2] <- "PAS (mmHg)"

tabla_pad <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(pad, na.rm = TRUE), 2),
    Mediana = round(median(pad, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(pad, na.rm = TRUE), 2),
    Varianza = round(var(pad, na.rm = TRUE), 2),
    Minimo = round(min(pad, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(pad, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(pad, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(pad, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(pad, na.rm = TRUE), 1),
    Rango = round(max(pad, na.rm = TRUE) - min(pad, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(pad, na.rm = TRUE), 1),
    `CV (%)` = round((sd(pad, na.rm = TRUE) / mean(pad, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(pad, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(pad, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_pad) <- "PAD (mmHg)"

tabla_presion <- cbind(tabla_pas, tabla_pad)

kable(tabla_presion, 
      caption = "Estadisticas descriptivas: Presion Arterial Sistolica y Diastolica",
      align = c("l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#C0392B") %>%
  row_spec(c(1:3), background = "#FADBD8") %>%
  row_spec(c(4:5), background = "#FEF5E7") %>%
  row_spec(c(6:12), background = "#EBF5FB") %>%
  row_spec(c(13:15), background = "#E8F8F5")
Estadisticas descriptivas: Presion Arterial Sistolica y Diastolica
Estadistico PAS (mmHg) PAD (mmHg)
N N 125.000 125.000
Media Media 115.110 73.270
Mediana Mediana 115.000 74.000
Desv. Est. Desv. Est. 11.220 9.060
Varianza Varianza 125.940 82.090
Minimo Minimo 88.000 55.000
Q1 (P25) Q1 (P25) 108.000 67.000
Q2 (P50) Q2 (P50) 115.000 74.000
Q3 (P75) Q3 (P75) 122.000 79.000
Maximo Maximo 142.000 100.000
Rango Rango 54.000 45.000
Rango IQ Rango IQ 14.000 12.000
CV (%) CV (%) 9.750 12.370
Asimetria Asimetria 0.178 0.272
Curtosis Curtosis 2.834 3.039
par(mfrow = c(2, 2), mar = c(4.5, 4.5, 3.5, 2))

hist(BaseMetabolismo$pas, 
     breaks = 15,
     col = "#E74C3C", 
     border = "white",
     main = "Distribucion de PAS",
     xlab = "PAS (mmHg)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.2,
     cex.lab = 1.0)
abline(v = mean(BaseMetabolismo$pas), col = "#C0392B", lwd = 3, lty = 2)
abline(v = median(BaseMetabolismo$pas), col = "#27AE60", lwd = 3, lty = 2)
legend("topright", 
       legend = c(paste0("Media=", round(mean(BaseMetabolismo$pas), 1)),
                  paste0("Mediana=", round(median(BaseMetabolismo$pas), 1))),
       col = c("#C0392B", "#27AE60"), lty = 2, lwd = 2.5, cex = 0.85)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

boxplot(BaseMetabolismo$pas, 
        col = "#F1948A",
        border = "#922B21",
        main = "Diagrama de Caja: PAS",
        ylab = "PAS (mmHg)",
        las = 1,
        lwd = 2,
        boxwex = 0.5,
        outcol = "#8E44AD",
        outpch = 19,
        cex.main = 1.2,
        cex.lab = 1.0)
abline(h = 120, col = "#E67E22", lty = 2, lwd = 2)
text(1.32, 120, "Limite HTA", pos = 3, cex = 0.8, col = "#E67E22", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

hist(BaseMetabolismo$pad, 
     breaks = 15,
     col = "#3498DB", 
     border = "white",
     main = "Distribucion de PAD",
     xlab = "PAD (mmHg)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.2,
     cex.lab = 1.0)
abline(v = mean(BaseMetabolismo$pad), col = "#2874A6", lwd = 3, lty = 2)
abline(v = median(BaseMetabolismo$pad), col = "#27AE60", lwd = 3, lty = 2)
legend("topright", 
       legend = c(paste0("Media=", round(mean(BaseMetabolismo$pad), 1)),
                  paste0("Mediana=", round(median(BaseMetabolismo$pad), 1))),
       col = c("#2874A6", "#27AE60"), lty = 2, lwd = 2.5, cex = 0.85)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

boxplot(BaseMetabolismo$pad, 
        col = "#85C1E2",
        border = "#1B4F72",
        main = "Diagrama de Caja: PAD",
        ylab = "PAD (mmHg)",
        las = 1,
        lwd = 2,
        boxwex = 0.5,
        outcol = "#8E44AD",
        outpch = 19,
        cex.main = 1.2,
        cex.lab = 1.0)
abline(h = 80, col = "#E67E22", lty = 2, lwd = 2)
text(1.32, 80, "Limite HTA", pos = 3, cex = 0.8, col = "#E67E22", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

par(mfrow = c(1, 1))

presion_pulso <- BaseMetabolismo$pas - BaseMetabolismo$pad
tabla_pp <- data.frame(
  Estadistico = c("Media", "Mediana", "Desv. Est.", "Rango", "CV (%)"),
  Valor = c(
    round(mean(presion_pulso), 2),
    round(median(presion_pulso), 2),
    round(sd(presion_pulso), 2),
    paste(round(min(presion_pulso), 1), "-", round(max(presion_pulso), 1)),
    round((sd(presion_pulso)/mean(presion_pulso))*100, 2)
  )
)

kable(tabla_pp, 
      caption = "Presion de Pulso (PAS - PAD)",
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#8E44AD")
Presion de Pulso (PAS - PAD)
Estadistico Valor
Media 41.84
Mediana 41
Desv. Est. 10.86
Rango 18 - 77
CV (%) 25.97

INTERPRETACIÓN ESTADÍSTICA Y CLÍNICA PRESIÓN ARTERIAL SISTÓLICA (PAS)

Medidas de tendencia central La media de PAS fue 115.11 mmHg y la mediana 115.00 mmHg, valores prácticamente idénticos que me confirman una distribución simétrica sin sesgos. Esta presión promedio se sitúa en el límite superior del rango normal para escolares de 11 años (95-115 mmHg según tablas pediátricas), lo cual me sugiere que, aunque la mayoría tiene presión normal, un porcentaje importante se encuentra en la zona de prehipertensión (115-125 mmHg).

Medidas de dispersión

La desviación estándar de 11.22 mmHg me indica una variabilidad moderada, con un coeficiente de variación del 9.75%, lo cual representa una dispersión baja en términos relativos. El rango intercuartílico de 14 mmHg (Q1=108 a Q3=122) me muestra que el 50% central de los escolares tiene presiones concentradas en un intervalo relativamente estrecho, aunque el rango total de 54 mmHg (88-142 mmHg) evidencia que existen escolares tanto con presiones bajas como con valores claramente elevados.

Medidas de forma La asimetría cercana a cero y la curtosis próxima a 3 me confirman que la PAS se distribuye de forma prácticamente normal, lo cual valida el uso de pruebas paramétricas y facilita la comparación con percentiles de referencia.

PRESIÓN ARTERIAL DIASTÓLICA (PAD) Medidas de tendencia central

La media de PAD fue 73.27 mmHg y la mediana 74.00 mmHg, con una diferencia mínima que también me indica simetría. Este valor promedio se encuentra dentro del rango normal para la edad (60-80 mmHg), aunque en el límite superior, lo cual me sugiere que la mayoría de los escolares presenta presiones diastólicas adecuadas pero con tendencia hacia valores más altos.

Medidas de dispersión La desviación estándar de 9.06 mmHg y el CV de 12.36% son ligeramente menores que en PAS, indicando variabilidad moderada similar. El rango de 45 mmHg (55-100 mmHg) y el RIQ de 12 mmHg (Q1=67 a Q3=79) me muestran un patrón similar al observado en PAS, pues la concentración del grupo es central pero con valores extremos en ambas direcciones, y la presencia de un valor máximo de 100 mmHg es particularmente preocupante, ya que corresponde a hipertensión diastólica severa.

COMPARACIÓN PAS VS PAD Al comparar ambas variables, observo que:

PAS presenta mayor dispersión absoluta (DE=11.22 mmHg) comparada con PAD (DE=9.06 mmHg) PAD presenta mayor dispersión relativa (CV=12.36%) comparada con PAS (CV=9.75%) Ambas tienen RIQ similares: PAS=14 mmHg, PAD=12 mmHg

Esto es fisiológicamente esperado porque la presión sistólica refleja la fuerza de eyección cardíaca (que varía más entre individuos según estado físico, ansiedad, actividad), mientras que la diastólica depende más de la resistencia vascular periférica (más estable pero con mayor variabilidad relativa en población pediátrica), según la literatura.

INTERPRETACIÓN CONJUNTA: PERFIL DE PRESIÓN ARTERIAL Presión de pulso (PP = PAS - PAD) La presión de pulso promedio fue 41.84 mmHg, con una mediana de 41 mmHg, valores que se encuentran dentro del rango normal (40-50 mmHg). La desviación estándar de 10.86 mmHg y el CV de 25.97% me indican una variabilidad considerable, mayor que la observada en PAS y PAD individualmente.

El rango amplio de 18-77 mmHg evidencia heterogeneidad en la elasticidad arterial de la cohorte, además la PP refleja la distensibilidad arterial y me indica qué tan “rígidas” o “elásticas” están las arterias, pues una PP promedio normal sugiere que, en general, la cohorte presenta buena elasticidad vascular, característica esperable en población pediátrica sin daño vascular crónico,sin embargo, la alta variabilidad (CV=25.97%) me alerta sobre posibles diferencias en el estado cardiovascular entre subgrupos.

Distribución visual Los histogramas me muestran distribuciones unimodales y simétricas para ambas presiones, con picos centrados en valores normales-altos pero con colas extendidas hacia valores elevados, especialmente en PAS, además los boxplots confirman esta distribución, evidenciada por:

PAS máxima: 142 mmHg (claramente hipertensiva) PAD máxima: 100 mmHg (hipertensión diastólica severa) Límite de HTA marcado en 120 mmHg (PAS) y 80 mmHg (PAD)

Visualmente, observo que aproximadamente el 50% de los escolares supera 115 mmHg en PAS y el 50% supera 74 mmHg en PAD, confirmando la tendencia hacia presiones en el límite superior de la normalidad.

Relación PAS/PAD La proporción media PAS/PAD = 115.11/73.27 = 1.57 se encuentra dentro del rango esperado (1.5-2.0), lo cual me indica que la relación fisiológica entre presiones se mantiene preservada en la mayoría de los escolares. Una alteración de esta relación podría sugerir patología cardiovascular específica.

Prevalencia estimada de alteraciones Basándome en la distribución observada y los puntos de corte pediátricos, estimo que:

PAS <115 mmHg (normal): aproximadamente 50% de los escolares PAS 115-122 mmHg (prehipertensión): aproximadamente 35-40% PAS >122 mmHg (hipertensión): aproximadamente 10-15%

Esta distribución me muestra que, aunque la mitad tiene presión normal, existe un subgrupo significativo con valores elevados que requeriría evaluación médica y seguimiento clínico.

Implicaciones epidemiológicas La presencia de valores de PAS y PAD promedio en el límite superior de la normalidad (115.11 y 73.27 mmHg respectivamente) y la prevalencia estimada de 50% con prehipertensión o hipertensión constituyen hallazgos de alerta epidemiológica para esta cohorte, y podría estar relacionado con: a. Sobrepeso y obesidad (ya detectados en el análisis de peso con media=41.15 kg y asimetría positiva) b. Sedentarismo y baja aptitud cardiorrespiratoria c. Dieta alta en sodio (común en población escolar colombiana) d. Factores genéticos y antecedentes familiares de hipertensión e. Estrés académico y ansiedad en escolares

Estos resultados justifican estrategias de prevención cardiovascular temprana, incluyendo:

1.Promoción de actividad física regular (mínimo 30 min/día según OMS) 2.Educación nutricional (reducción de sodio, aumento de potasio) 3.Tamizaje periódico de factores de riesgo metabólico 4.Evaluación de antecedentes familiares de HTA 5.Monitoreo ambulatorio de presión arterial en casos limítrofes

CONCLUSIÓN Creo que las variables cardiovasculares reflejan a una población con presiones arteriales en promedio normales-altas, con ambas presiones (sistólica y diastólica) situadas en el límite superior del rango pediátrico normal.

La presión de pulso normal (41.84 mmHg) me indica que la elasticidad arterial se mantiene preservada a nivel poblacional, aunque la alta variabilidad individual (CV=25.97%) sugiere diferencias en el estado cardiovascular entre subgrupos.

Existe un subgrupo significativo en riesgo (aproximadamente 50% con valores ≥115/74 mmHg) que requeríria intervención preventiva para evitar el desarrollo de hipertensión arterial crónica en la vida adulta, especialmente considerando que la hipertensión infantil es un predictor fuerte de hipertensión en la adultez.

ANÁLISIS VARIABLES ANTROPOMÉTRICAS: PERÍMETROS CORPORALES Perímetro de Cintura y Perímetro de Cadera

tabla_cintura <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(per__cintura, na.rm = TRUE), 2),
    Mediana = round(median(per__cintura, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(per__cintura, na.rm = TRUE), 2),
    Varianza = round(var(per__cintura, na.rm = TRUE), 2),
    Minimo = round(min(per__cintura, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(per__cintura, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(per__cintura, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(per__cintura, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(per__cintura, na.rm = TRUE), 1),
    Rango = round(max(per__cintura, na.rm = TRUE) - min(per__cintura, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(per__cintura, na.rm = TRUE), 1),
    `CV (%)` = round((sd(per__cintura, na.rm = TRUE) / mean(per__cintura, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(per__cintura, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(per__cintura, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadistico")

colnames(tabla_cintura)[2] <- "Cintura (cm)"

tabla_cadera <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(per__cadera, na.rm = TRUE), 2),
    Mediana = round(median(per__cadera, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(per__cadera, na.rm = TRUE), 2),
    Varianza = round(var(per__cadera, na.rm = TRUE), 2),
    Minimo = round(min(per__cadera, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(per__cadera, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(per__cadera, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(per__cadera, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(per__cadera, na.rm = TRUE), 1),
    Rango = round(max(per__cadera, na.rm = TRUE) - min(per__cadera, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(per__cadera, na.rm = TRUE), 1),
    `CV (%)` = round((sd(per__cadera, na.rm = TRUE) / mean(per__cadera, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(per__cadera, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(per__cadera, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_cadera) <- "Cadera (cm)"

tabla_perimetros <- cbind(tabla_cintura, tabla_cadera)

kable(tabla_perimetros, 
      caption = "Estadisticas descriptivas: Perimetro de Cintura y Cadera",
      align = c("l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#E67E22") %>%
  row_spec(c(1:3), background = "#FCF3CF") %>%
  row_spec(c(4:5), background = "#D5F4E6") %>%
  row_spec(c(6:12), background = "#EBF5FB") %>%
  row_spec(c(13:15), background = "#F4ECF7")
Estadisticas descriptivas: Perimetro de Cintura y Cadera
Estadistico Cintura (cm) Cadera (cm)
N N 125.000 125.000
Media Media 67.730 79.590
Mediana Mediana 66.000 77.590
Desv. Est. Desv. Est. 10.330 9.850
Varianza Varianza 106.770 97.050
Minimo Minimo 34.600 57.700
Q1 (P25) Q1 (P25) 61.000 73.000
Q2 (P50) Q2 (P50) 66.000 77.600
Q3 (P75) Q3 (P75) 72.000 85.900
Maximo Maximo 101.000 104.200
Rango Rango 66.400 46.500
Rango IQ Rango IQ 11.000 12.900
CV (%) CV (%) 15.260 12.380
Asimetria Asimetria 0.652 0.374
Curtosis Curtosis 4.049 2.694
par(mfrow = c(2, 2), mar = c(4.5, 4.5, 3.5, 2))

hist(BaseMetabolismo$per__cintura, 
     breaks = 15,
     col = "#F39C12", 
     border = "white",
     main = "Distribucion de Perimetro de Cintura",
     xlab = "Cintura (cm)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.2,
     cex.lab = 1.0)
abline(v = mean(BaseMetabolismo$per__cintura), col = "#D68910", lwd = 3, lty = 2)
abline(v = median(BaseMetabolismo$per__cintura), col = "#27AE60", lwd = 3, lty = 2)
legend("topright", 
       legend = c(paste0("Media=", round(mean(BaseMetabolismo$per__cintura), 1)),
                  paste0("Mediana=", round(median(BaseMetabolismo$per__cintura), 1))),
       col = c("#D68910", "#27AE60"), lty = 2, lwd = 2.5, cex = 0.85)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

boxplot(BaseMetabolismo$per__cintura, 
        col = "#F8C471",
        border = "#935116",
        main = "Diagrama de Caja: Cintura",
        ylab = "Cintura (cm)",
        las = 1,
        lwd = 2,
        boxwex = 0.5,
        outcol = "#C0392B",
        outpch = 19,
        cex.main = 1.2,
        cex.lab = 1.0)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

hist(BaseMetabolismo$per__cadera, 
     breaks = 15,
     col = "#52BE80", 
     border = "white",
     main = "Distribucion de Perimetro de Cadera",
     xlab = "Cadera (cm)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.2,
     cex.lab = 1.0)
abline(v = mean(BaseMetabolismo$per__cadera), col = "#229954", lwd = 3, lty = 2)
abline(v = median(BaseMetabolismo$per__cadera), col = "#E67E22", lwd = 3, lty = 2)
legend("topright", 
       legend = c(paste0("Media=", round(mean(BaseMetabolismo$per__cadera), 1)),
                  paste0("Mediana=", round(median(BaseMetabolismo$per__cadera), 1))),
       col = c("#229954", "#E67E22"), lty = 2, lwd = 2.5, cex = 0.85)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

boxplot(BaseMetabolismo$per__cadera, 
        col = "#A9DFBF",
        border = "#196F3D",
        main = "Diagrama de Caja: Cadera",
        ylab = "Cadera (cm)",
        las = 1,
        lwd = 2,
        boxwex = 0.5,
        outcol = "#C0392B",
        outpch = 19,
        cex.main = 1.2,
        cex.lab = 1.0)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

par(mfrow = c(1, 1))

icc <- BaseMetabolismo$per__cintura / BaseMetabolismo$per__cadera
tabla_icc <- data.frame(
  Estadistico = c("Media", "Mediana", "Desv. Est.", "Rango", "CV (%)"),
  Valor = c(
    round(mean(icc, na.rm = TRUE), 3),
    round(median(icc, na.rm = TRUE), 3),
    round(sd(icc, na.rm = TRUE), 3),
    paste(round(min(icc, na.rm = TRUE), 2), "-", round(max(icc, na.rm = TRUE), 2)),
    round((sd(icc, na.rm = TRUE)/mean(icc, na.rm = TRUE))*100, 2)
  )
)

kable(tabla_icc, 
      caption = "Indice Cintura/Cadera (ICC)",
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#8E44AD")
Indice Cintura/Cadera (ICC)
Estadistico Valor
Media 0.852
Mediana 0.846
Desv. Est. 0.08
Rango 0.44 - 1.25
CV (%) 9.35

INTERPRETACIÓN ESTADÍSTICA Y CLÍNICA:

PERÍMETROS CORPORALES: PERÍMETRO DE CINTURA

Medidas de tendencia central

La media de perímetro de cintura fue 67.73 cm y la mediana 66.00 cm, con una diferencia de 1.73 cm que me sugiere una ligera asimetría positiva.

Este perímetro promedio es particularmente relevante porque el perímetro de cintura elevado es uno de los cinco criterios diagnósticos centrales del síndrome metabólico tanto en adultos como en niños, según las definiciones propuestas por diferentes organizaciones internacionales.

Específicamente, la International Diabetes Federation (IDF) establece que para adolescentes de 10 a 16 años, un perímetro de cintura ≥percentil 90 (ajustado por edad, sexo y etnia) constituye un criterio obligatorio para el diagnóstico de síndrome metabólico, ya que la obesidad abdominal es considerada el factor desencadenante central de las alteraciones metabólicas.

En esta cohorte con edad promedio de 11.08 años, un perímetro de cintura medio de 67.73 cm se sitúa aproximadamente en el percentil 75-85 según referencias de NHANES III, lo cual me indica una tendencia poblacional hacia adiposidad central elevada.

Medidas de dispersión

La desviación estándar de 10.33 cm me indica una variabilidad considerable, con un coeficiente de variación del 15.25%, valor que representa dispersión moderada-alta y es significativamente mayor que la observada en talla (CV=5.55%).

Esta alta variabilidad refleja la heterogeneidad en la distribución de grasa visceral entre los escolares, lo cual tiene implicaciones clínicas importantes porque la obesidad visceral, más que el índice de masa corporal, es el principal determinante de la resistencia a la insulina y las complicaciones metabólicas en población pediátrica.

El rango de 65.4 cm (34.6-100 cm) es extraordinariamente amplio y evidencia la coexistencia de escolares con cinturas muy delgadas junto a otros con obesidad abdominal severa.

La presencia de escolares con perímetros de cintura superiores a 85-90 cm es clínicamente alarmante, ya que estudios como el de Taksali et al. han demostrado que la grasa visceral elevada es el determinante de un fenotipo metabólico adverso en adolescentes obesos, caracterizado por mayor resistencia a la insulina, dislipidemia aterogénica e hígado graso [22].

El rango intercuartílico de 11 cm me muestra que incluso el 50% central presenta variabilidad importante, lo cual sugiere que no todos los niños con sobrepeso desarrollan el mismo patrón de distribución grasa.

Esto es consistente con la descripción de dos fenotipos distintos en niños obesos:

-metabolically healthy obese (MHO) y metabolically unhealthy obese (MUO), donde la diferencia clave radica en el grado de acumulación de grasa visceral y la consecuente sensibilidad a la insulina.

Distribución visual e implicaciones fisiopatológicas

El histograma me muestra una distribución con asimetría positiva pronunciada con un pico centrado entre 60-70 cm pero con una cola extendida hacia valores muy altos (80-100 cm).

El boxplot confirma la presencia de múltiples outliers en el extremo superior, representando escolares con perímetros claramente patológicos.

Esta adiposidad central tiene profundas implicaciones metabólicas porque los adipocitos hipertróficos del tejido adiposo visceral secretan moléculas proinflamatorias (TNF-α, IL-6, leptina) y presentan reducida supresión de la lipólisis mediada por insulina, lo cual resulta en aumento de ácidos grasos libres circulantes que se acumulan ectópicamente en páncreas, hígado y músculo, generando lipotoxicidad y resistencia a la insulina.

PERÍMETRO DE CADERA Medidas de tendencia central

La media de perímetro de cadera fue 79.59 cm y la mediana 77.59 cm, con una diferencia de 2 cm que también me indica asimetría positiva leve, por lo que este valor promedio es consistente con el desarrollo esperado para escolares de 11 años con talla promedio de 145 cm y refleja principalmente la grasa glúteo-femoral subcutánea, que tiene un perfil metabólico más favorable comparado con la grasa visceral [20,90].

Medidas de dispersión La desviación estándar de 9.85 cm y el CV de 12.38% me indican variabilidad moderada, ligeramente menor que la observada en cintura (CV=15.25%), y siendo esta diferencia fisiológicamente relevante porque sugiere que la variabilidad se concentra más en la región abdominal (grasa visceral proinflamatoria) que en la región glútea (grasa subcutánea protectora).

El rango de 42.3 cm (57.7-100 cm) es amplio pero proporcionalmente menor que el de cintura (65.4 cm), lo cual me confirma que la heterogeneidad metabólica de la cohorte se debe principalmente a diferencias en la acumulación de grasa central, no periférica.

Distribución visual El histograma me muestra una distribución más simétrica y unimodal comparada con cintura, con un pico claro entre 75-80 cm y menor extensión de la cola derecha.

El boxplot confirma menos outliers extremos que en cintura, lo cual es consistente con el hecho de que la grasa subcutánea glúteo-femoral tiene menor capacidad de expansión patológica comparada con el compartimento visceral.

COMPARACIÓN CINTURA VS CADERA: PATRÓN DE DISTRIBUCIÓN ADIPOSA Al comparar ambas variables, observo patrones contrastantes con relevancia fisiopatológica:

Cintura presenta mayor variabilidad absoluta (DE=10.33 vs 9.85),la cintura muestra más outliers extremos en valores altos

El rango de cintura es desproporcionadamente mayor (65.4 cm vs 42.3 cm),donde la asimetría positiva es más pronunciada en cintura

Esta diferencia es clínicamente significativa porque me confirma que la acumulación de grasa abdominal presenta mayor heterogeneidad y valores más extremos que la grasa periférica y desde la perspectiva fisiopatológica, esto tiene sentido porque la grasa visceral es un órgano endocrino activo que secreta adipoquinas proinflamatorias como leptina (que contribuye a hipertensión por activación del sistema nervioso simpático), TNF-α (que induce fosforilación de serina del IRS-1 y disminuye expresión de GLUT4, generando resistencia a la insulina) e IL-6 (que estimula producción hepática de proteína C reactiva, perpetuando la inflamación crónica de bajo grado característica de la obesidad).

Por el contrario, la grasa subcutánea produce mayor cantidad de adiponectina, una adipoquina con efectos antiinflamatorios y protectores que inhibe los receptores tipo Toll (TLRs) y estimula la oxidación de ácidos grasos libres, previniendo la acumulación lipídica ectópica.

INTERPRETACIÓN CONJUNTA: ÍNDICE CINTURA/CADERA (ICC) Significado clínico y fisiopatológico del ICC

El ICC = cintura/cadera es un indicador validado de patrón de distribución de grasa corporal que distingue entre dos fenotipos metabólicos:

-ICC bajo (<0.85): distribución ginoide (grasa principalmente en cadera/muslos) → menor riesgo metabólico, mayor adiponectina, menor inflamación.

-ICC alto (>0.90 en niños, >0.85 en niñas): distribución androide (grasa central/abdominal) → mayor riesgo cardiometabólico, menor adiponectina, mayor TNF-α e IL-6

Este índice es particularmente útil en población pediátrica porque permite identificar el fenotipo MUO (metabolically unhealthy obese) independientemente del IMC, ya que dos niños con el mismo IMC pueden tener perfiles metabólicos radicalmente distintos según su patrón de distribución grasa.

Resultados del ICC en la cohorte

La media de ICC fue 0.852 con mediana 0.846, valores prácticamente idénticos que me confirman distribución simétrica. Este ICC promedio se encuentra en el límite superior aceptable para población pediátrica mixta, lo cual me sugiere una tendencia hacia distribución androide a nivel poblacional.

La desviación estándar de 0.08 y el CV de 9.35% me indican baja variabilidad relativa del índice, lo cual es aparentemente paradójico considerando la alta variabilidad de cintura y cadera individualmente.

Esta aparente contradicción considero que es porque ambos perímetros varían de forma proporcional en la mayoría de los escolares, manteniendo un ratio relativamente constante dentro del rango normal-alto.

Hallazgo crítico: rango extremo del ICC El rango de 0.44 a 1.25 me alerta sobre la existencia de subgrupos con patrones de distribución grasa metabólicamente muy distintos:

-ICC 0.44-0.70: escolares con distribución ginoide marcada (probablemente prepuberales o con patrón femenino), con grasa predominante en región glúteo-femoral y menor riesgo de síndrome metabólico

-ICC 0.80-0.90: distribución intermedia (mayoría de la cohorte), representa el patrón típico de niños en transición puberal ICC >1.00: escolares con obesidad central severa, donde la cintura supera la cadera (patrón androide extremo)

La presencia de escolares con ICC = 1.25 es extremadamente preocupante y clínicamente inusual en población pediátrica. Un ICC de 1.25 significa que la cintura es 25% mayor que la cadera, patrón casi exclusivo de obesidad visceral masiva.

Este fenotipo se ha asociado fuertemente con síndrome metabólico completo, resistencia severa a la insulina, esteatosis hepática no alcohólica, hipertensión y dislipidemia aterogénica en niños y adolescentes.

Desde el punto de vista fisiopatológico, un ICC tan elevado implica acumulación masiva de grasa visceral, lo cual genera: a. Exceso de ácidos grasos libres liberados hacia la vena porta, que llegan directamente al hígado causando lipotoxicidad hepática, resistencia a la insulina hepática y esteatosis.

  1. Estado proinflamatorio sistémico por secreción aumentada de TNF-α e IL-6 desde el tejido adiposo visceral, con activación de macrófagos M1 infiltrantes.

  2. Reducción de adiponectina sérica, eliminando el efecto protector de esta adipoquina sobre la sensibilidad a la insulina y la función endotelial.

  3. Hiperproducción de leptina con desarrollo de “resistencia a la leptina”, lo cual perpetúa el balance energético positivo y estimula el sistema nervioso simpático, contribuyendo a hipertensión.

Prevalencia estimada de obesidad central por ICC Basándome en la distribución del ICC y considerando puntos de corte pediátricos, estimo que aproximadamente:

-ICC <0.85 (riesgo metabólico bajo): ~50% de los escolares -ICC 0.85-0.95 (riesgo moderado): ~40% -ICC >0.95 (riesgo alto): ~10%

Esta prevalencia de 10-15% con obesidad central severa es consistente con los outliers observados en el boxplot de cintura y con la prevalencia global de síndrome metabólico pediátrico reportada, que afecta aproximadamente al 10% de niños con obesidad.

IMPLICACIONES EPIDEMIOLÓGICAS Y CLÍNICAS BASADAS EN EVIDENCIA Adiposidad central como predictor de síndrome metabólico El perímetro de cintura elevado y el ICC alto son predictores independientes de síndrome metabólico en niños, incluso más potentes que el IMC solo.

La razón fisiopatológica es que la obesidad visceral es el “gatillo” que activa la cascada metabólica, mientras que la resistencia a la insulina es el mecanismo que perpetúa y amplifica las alteraciones.

Específicamente, Weiss et al. (2004) demostraron en el estudio de Yale que adolescentes obesos con mayor grasa visceral (medida por resonancia magnética) presentaban mayor prevalencia de prediabetes, dislipidemia aterogénica e hipertensión, independientemente del grado de obesidad general.

Similarmente, el estudio Bogalusa Heart demostró que tanto la obesidad infantil como la resistencia a la insulina predicen síndrome metabólico en la adultez, pero después de ajustar por ambas variables, solo la obesidad mantenía asociación significativa, lo cual subraya la primacía de la adiposidad (especialmente visceral) como factor causal [84].

1.1 Mecanismos moleculares y repercusiones cardiometabólicas

En esta cohorte pediátrica, los resultados antropométricos evidencian una tendencia marcada hacia la adiposidad central. El perímetro de cintura promedio fue de 67.73 cm, ubicándose entre los percentiles 75 y 85, lo que representa el límite de riesgo según los criterios de la International Diabetes Federation (IDF). De manera coherente, el índice cintura/cadera (ICC = 0.85) se situó en el límite superior del rango normal, reflejando un patrón de distribución grasa de tipo androide, característico de la obesidad visceral y predictor más sensible de riesgo metabólico que el IMC en población pediátrica.

Desde el punto de vista fisiopatológico, la progresión desde obesidad central hasta síndrome metabólico sigue una secuencia molecular bien definida, donde la expansión del tejido adiposo visceral provoca hipertrofia adipocitaria e hipoxia local, lo que estimula la infiltración de macrófagos M1 proinflamatorios, y estos liberan TNF-α e IL-6, activando la vía de NF-κB, que interfiere con la señal de la insulina mediante la fosforilación del IRS-1, generando resistencia insulínica.

Paralelamente, la reducción de adiponectina elimina su efecto protector sobre la sensibilidad a la insulina y la función endotelial.

Como consecuencia, se incrementa la lipólisis y la liberación de ácidos grasos libres, que se acumulan de forma ectópica en hígado, músculo y páncreas, generando esteatosis hepática, resistencia a la insulina periférica y lipotoxicidad de células β.

Este proceso da lugar a un hígado graso resistente a la insulina, responsable de hiperglucemia (por gluconeogénesis no suprimida) y dislipidemia aterogénica (por aumento de VLDL y reducción de HDL).

Finalmente, el estrés oxidativo, junto con la activación del sistema renina-angiotensina, produce disfunción endotelial y vasoconstricción, explicando los valores observados de presión arterial promedio (PAS = 115.11 mmHg, PAD = 73.27 mmHg) en el límite superior normal.

Correlación con variabilidad antropométrica y perfil cardiovascular

La variabilidad del peso (CV = 24.04%) se refleja proporcionalmente en la variabilidad de cintura (CV = 15.25%), lo que me indica que la heterogeneidad ponderal se traduce en diferencias en la acumulación de grasa abdominal, además, la asimetría positiva del peso (0.76) y del ICC confirman la existencia de un subgrupo con sobrepeso u obesidad con predominio de adiposidad visceral.

Este patrón está directamente relacionado con la elevación discreta de la presión arterial, mediada por hiperleptinemia, vasoconstricción inducida por ácidos grasos libres, activación del sistema renina-angiotensina-aldosterona y disfunción endotelial crónica.

Influencia del desarrollo puberal

El índice cintura/cadera varía fisiológicamente según el estadio de Tanner. En los estadios 1–2 (prepuberales), el ICC tiende a ser bajo (<0.80) por predominio de grasa subcutánea, mientras que en los estadios 3–5 (puberales y pospuberales) aumenta (>0.85), especialmente en varones, por efecto de los andrógenos que redistribuyen la grasa hacia el abdomen.

Durante la pubertad, la resistencia fisiológica a la insulina inducida por la hormona del crecimiento puede acelerar la aparición del síndrome metabólico en niños con obesidad previa, es por ello,que un ICC de 0.85 puede ser fisiológico en adolescentes puberales, pero patológico en prepuberales, lo que justifica estratificar los análisis según la madurez sexual para interpretar adecuadamente el riesgo metabólico.

Referencia argumentativa: Codazzi y colaboradores (2023)

##ANÁLISIS VARIABLES: COMPOSICIÓN CORPORAL Y APTITUD FÍSICA Porcentaje de Grasa Corporal, Capacidad Cardiorrespiratoria y Fuerza Prensil

tabla_grasa <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(`%_grasa_corp`, na.rm = TRUE), 2),
    Mediana = round(median(`%_grasa_corp`, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(`%_grasa_corp`, na.rm = TRUE), 2),
    Varianza = round(var(`%_grasa_corp`, na.rm = TRUE), 2),
    Minimo = round(min(`%_grasa_corp`, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(`%_grasa_corp`, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(`%_grasa_corp`, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(`%_grasa_corp`, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(`%_grasa_corp`, na.rm = TRUE), 1),
    Rango = round(max(`%_grasa_corp`, na.rm = TRUE) - min(`%_grasa_corp`, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(`%_grasa_corp`, na.rm = TRUE), 1),
    `CV (%)` = round((sd(`%_grasa_corp`, na.rm = TRUE) / mean(`%_grasa_corp`, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(`%_grasa_corp`, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(`%_grasa_corp`, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadistico")

colnames(tabla_grasa)[2] <- "Grasa (%)"

tabla_crf <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(CRF_shuttles, na.rm = TRUE), 2),
    Mediana = round(median(CRF_shuttles, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(CRF_shuttles, na.rm = TRUE), 2),
    Varianza = round(var(CRF_shuttles, na.rm = TRUE), 2),
    Minimo = round(min(CRF_shuttles, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(CRF_shuttles, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(CRF_shuttles, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(CRF_shuttles, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(CRF_shuttles, na.rm = TRUE), 1),
    Rango = round(max(CRF_shuttles, na.rm = TRUE) - min(CRF_shuttles, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(CRF_shuttles, na.rm = TRUE), 1),
    `CV (%)` = round((sd(CRF_shuttles, na.rm = TRUE) / mean(CRF_shuttles, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(CRF_shuttles, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(CRF_shuttles, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_crf) <- "CRF (shuttles)"

tabla_fuerza <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(f__mano_do, na.rm = TRUE), 2),
    Mediana = round(median(f__mano_do, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(f__mano_do, na.rm = TRUE), 2),
    Varianza = round(var(f__mano_do, na.rm = TRUE), 2),
    Minimo = round(min(f__mano_do, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(f__mano_do, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(f__mano_do, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(f__mano_do, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(f__mano_do, na.rm = TRUE), 1),
    Rango = round(max(f__mano_do, na.rm = TRUE) - min(f__mano_do, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(f__mano_do, na.rm = TRUE), 1),
    `CV (%)` = round((sd(f__mano_do, na.rm = TRUE) / mean(f__mano_do, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(f__mano_do, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(f__mano_do, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_fuerza) <- "Fuerza (kg)"

tabla_fitness <- cbind(tabla_grasa, tabla_crf, tabla_fuerza)

kable(tabla_fitness, 
      caption = "Estadísticas descriptivas: Composición Corporal y Aptitud Física",
      align = c("l", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#8E44AD") %>%
  row_spec(c(1:3), background = "#EBDEF0") %>%
  row_spec(c(4:5), background = "#D5F4E6") %>%
  row_spec(c(6:12), background = "#FCF3CF") %>%
  row_spec(c(13:15), background = "#FADBD8")
Estadísticas descriptivas: Composición Corporal y Aptitud Física
Estadistico Grasa (%) CRF (shuttles) Fuerza (kg)
N N 125.000 125.000 125.000
Media Media 19.140 3.540 16.420
Mediana Mediana 18.700 3.400 16.000
Desv. Est. Desv. Est. 10.160 1.270 4.080
Varianza Varianza 103.240 1.610 16.670
Minimo Minimo 0.100 1.400 9.000
Q1 (P25) Q1 (P25) 13.500 2.600 13.000
Q2 (P50) Q2 (P50) 18.700 3.400 16.000
Q3 (P75) Q3 (P75) 25.600 4.300 19.000
Maximo Maximo 45.700 7.100 27.000
Rango Rango 45.600 5.700 18.000
Rango IQ Rango IQ 12.100 1.700 6.000
CV (%) CV (%) 53.080 35.800 24.860
Asimetria Asimetria 0.004 0.534 0.441
Curtosis Curtosis 3.014 2.922 2.588
par(mfrow = c(3, 2), mar = c(4, 4, 3, 1))

# === HISTOGRAMA % GRASA ===
hist(BaseMetabolismo$`%_grasa_corp`, 
     breaks = 15,
     col = "#9B59B6", 
     border = "white",
     main = "Distribución % Grasa Corporal",
     xlab = "Grasa (%)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.4,
     cex.lab = 1.1,
     cex.axis = 1.0,
     font.main = 2)
abline(v = mean(BaseMetabolismo$`%_grasa_corp`), col = "#6C3483", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$`%_grasa_corp`), col = "#27AE60", lwd = 2.5, lty = 2)
legend("topright", 
       legend = c(paste0("Media = ", round(mean(BaseMetabolismo$`%_grasa_corp`), 1), "%"),
                  paste0("Mediana = ", round(median(BaseMetabolismo$`%_grasa_corp`), 1), "%")),
       col = c("#6C3483", "#27AE60"), lty = 2, lwd = 2, cex = 0.85, bg = "white")
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

# === BOXPLOT % GRASA ===
boxplot(BaseMetabolismo$`%_grasa_corp`, 
        col = "#D7BDE2",
        border = "#5B2C6F",
        main = "Boxplot: % Grasa Corporal",
        ylab = "Grasa (%)",
        las = 1,
        lwd = 1.5,
        boxwex = 0.5,
        outcol = "#C0392B",
        outpch = 19,
        cex.main = 1.4,
        cex.lab = 1.1,
        cex.axis = 1.0,
        font.main = 2)
abline(h = 25, col = "#E67E22", lty = 2, lwd = 2)
text(1.25, 25, "Obesidad (25%)", pos = 3, cex = 0.85, col = "#E67E22", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

# === HISTOGRAMA CRF ===
hist(BaseMetabolismo$CRF_shuttles, 
     breaks = 15,
     col = "#3498DB", 
     border = "white",
     main = "Distribución Capacidad Cardiorrespiratoria",
     xlab = "CRF (shuttles)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.4,
     cex.lab = 1.1,
     cex.axis = 1.0,
     font.main = 2)
abline(v = mean(BaseMetabolismo$CRF_shuttles), col = "#1F618D", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$CRF_shuttles), col = "#27AE60", lwd = 2.5, lty = 2)
legend("topright", 
       legend = c(paste0("Media = ", round(mean(BaseMetabolismo$CRF_shuttles), 1)),
                  paste0("Mediana = ", round(median(BaseMetabolismo$CRF_shuttles), 1))),
       col = c("#1F618D", "#27AE60"), lty = 2, lwd = 2, cex = 0.85, bg = "white")
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

# === BOXPLOT CRF ===
boxplot(BaseMetabolismo$CRF_shuttles, 
        col = "#AED6F1",
        border = "#154360",
        main = "Boxplot: Capacidad Cardiorrespiratoria",
        ylab = "CRF (shuttles)",
        las = 1,
        lwd = 1.5,
        boxwex = 0.5,
        outcol = "#C0392B",
        outpch = 19,
        cex.main = 1.4,
        cex.lab = 1.1,
        cex.axis = 1.0,
        font.main = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

# === HISTOGRAMA FUERZA ===
hist(BaseMetabolismo$f__mano_do, 
     breaks = 15,
     col = "#E74C3C", 
     border = "white",
     main = "Distribución Fuerza Prensil",
     xlab = "Fuerza (kg)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.4,
     cex.lab = 1.1,
     cex.axis = 1.0,
     font.main = 2)
abline(v = mean(BaseMetabolismo$f__mano_do), col = "#922B21", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$f__mano_do), col = "#27AE60", lwd = 2.5, lty = 2)
legend("topright", 
       legend = c(paste0("Media = ", round(mean(BaseMetabolismo$f__mano_do), 1), " kg"),
                  paste0("Mediana = ", round(median(BaseMetabolismo$f__mano_do), 1), " kg")),
       col = c("#922B21", "#27AE60"), lty = 2, lwd = 2, cex = 0.85, bg = "white")
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

# === BOXPLOT FUERZA ===
boxplot(BaseMetabolismo$f__mano_do, 
        col = "#F1948A",
        border = "#641E16",
        main = "Boxplot: Fuerza Prensil",
        ylab = "Fuerza (kg)",
        las = 1,
        lwd = 1.5,
        boxwex = 0.5,
        outcol = "#8E44AD",
        outpch = 19,
        cex.main = 1.4,
        cex.lab = 1.1,
        cex.axis = 1.0,
        font.main = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

par(mfrow = c(1, 1))

INTERPRETACIÓN ESTADÍSTICA Y CLÍNICA: COMPOSICIÓN CORPORAL Y APTITUD FÍSICA

PORCENTAJE DE GRASA CORPORAL

Medidas de tendencia central y dispersión

La media de grasa corporal fue 19.14% con mediana de 18.70%, evidenciando una diferencia mínima de 0.44% que sugiere distribución relativamente simétrica con leve asimetría positiva. Este porcentaje promedio es particularmente relevante porque la grasa corporal excesiva es el motor fisiopatológico central del síndrome metabólico en población pediátrica, más allá del simple peso corporal.

La desviación estándar de 10.16% y el coeficiente de variación de 53.09% me indican una variabilidad extremadamente alta, la mayor que he observado hasta ahora en todas las variables analizadas. Esta alta dispersión refleja la marcada heterogeneidad en composición corporal de la cohorte, con escolares que van desde porcentajes muy bajos (0.1%) hasta valores claramente patológicos.

El rango intercuartílico y la distribución visual me muestran que aproximadamente el 25% de los escolares presenta porcentajes de grasa superiores a 25%, umbral que en población pediátrica define obesidad por composición corporal, independientemente del índice de masa corporal.

Esta distinción es crucial porque dos niños con el mismo IMC pueden tener composiciones corporales radicalmente diferentes, resultando en perfiles metabólicos opuestos,por ejemplo, el fenotipo metabólicamente saludable versus el metabólicamente no saludable.

Distribución visual e implicaciones fisiopatológicas

El histograma me muestra una distribución unimodal con asimetría positiva, con un pico principal entre 15-20% pero con una cola extendida hacia porcentajes muy elevados (35-45%), donde esta configuración es característica de poblaciones infantiles con prevalencia significativa de obesidad, donde un subgrupo desarrolla acumulación grasa excesiva.

El boxplot confirma la presencia de múltiples outliers superiores, representando escolares con obesidad franca por grasa corporal. La línea naranja marcando el límite de obesidad (25%) me permite visualizar que aproximadamente el 25-30% de la cohorte supera este umbral, cifra alarmante considerando las implicaciones metabólicas a largo plazo.

CAPACIDAD CARDIORRESPIRATORIA (CRF)

Medidas de tendencia central y dispersión

La media de CRF fue 3.54 shuttles con mediana de 3.40 shuttles, valores prácticamente idénticos que confirman distribución simétrica. Este rendimiento promedio es preocupantemente bajo para escolares de 11 años, sugiriendo un nivel de aptitud cardiorrespiratoria inferior al esperado según estándares internacionales para la edad.

La desviación estándar de 1.27 shuttles y el CV de 35.88% me indican variabilidad moderada-alta, aunque menor que la observada en grasa corporal, además el rango de aproximadamente 5-6 shuttles (desde 1.4 hasta 6-7 shuttles máximo) evidencia diferencias sustanciales en la capacidad aeróbica entre los escolares de mejor y peor rendimiento.

Distribución visual e interpretación funcional

-El histograma me muestra una distribución unimodal y simétrica, con el pico centrado en 3-4 shuttles, además el boxplot es notablemente compacto, con pocos outliers, lo cual sugiere que la mayoría de la cohorte presenta niveles de fitness cardiorrespiratorio homogéneamente bajos, sin grandes diferencias individuales.

-Esta baja capacidad cardiorrespiratoria poblacional tiene implicaciones metabólicas directas,por ejemplo la aptitud cardiorrespiratoria baja se asocia con mayor riesgo de desarrollar resistencia a la insulina, dislipidemia e hipertensión en niños, independientemente del peso corporal.

-El ejercicio aeróbico regular mejora la sensibilidad a la insulina mediante mecanismos como el aumento de la expresión del transportador de glucosa GLUT4 en músculo esquelético, la reducción de la inflamación sistémica y la mejora de la función endotelial.

La baja CRF puede ser tanto causa como consecuencia del exceso de grasa corporal, donde el sedentarismo favorece la acumulación adiposa, mientras que el exceso de grasa dificulta el rendimiento físico, creando un círculo vicioso que perpetúa el riesgo metabólico.

FUERZA PRENSIL MANO DOMINANTE

Medidas de tendencia central y dispersión

-La media de fuerza prensil fue 16.42 kg con mediana de 16.00 kg, valores casi idénticos que me confirman distribución simétrica, y donde este valor promedio es adecuado para escolares de 11 años con talla promedio de 145 cm, reflejando un desarrollo musculoesquelético dentro de rangos esperados.

La desviación estándar de 4.08 kg y el CV de 24.85% me indican variabilidad moderada, similar a la observada en peso corporal. El rango de aproximadamente 16 kg (9-25 kg) muestra diferencias apreciables pero no extremas entre escolares.

Distribución visual e relevancia metabólica

-El histograma presenta una distribución unimodal relativamente simétrica, centrada en 15-18 kg, y el boxplot muestra una estructura equilibrada con pocos outliers, sugiriendo que la fuerza muscular está más homogéneamente distribuida que la grasa corporal o el perímetro de cintura.

-La fuerza prensil es un indicador indirecto de masa muscular total, y la masa muscular es metabólicamente protectora porque el músculo esquelético es el principal sitio de captación de glucosa mediada por insulina, asi que una mayor masa muscular se asocia con mejor sensibilidad a la insulina y menor riesgo de diabetes tipo 2, incluso en presencia de obesidad.

INTERPRETACIÓN CONJUNTA: RELACIÓN ENTRE COMPOSICIÓN CORPORAL Y APTITUD FÍSICA

-Relación inversa entre grasa corporal y capacidad física-

-Al analizar las tres variables conjuntamente, emerge un patrón fisiopatológico coherente, pues existe una relación inversa entre el porcentaje de grasa corporal y las capacidades físicas (cardiorrespiratoria y muscular).

-Los escolares con mayor adiposidad tienden a presentar menor aptitud física, lo cual perpetúa el riesgo metabólico mediante múltiples mecanismos.

Esta relación se explica porque el exceso de grasa corporal, especialmente visceral, no solo es un marcador pasivo de obesidad, sino un órgano endocrino activo que secreta adipoquinas proinflamatorias.

Implicaciones para fenotipos metabólicos

-La combinación de alta grasa corporal (>25%) con baja capacidad cardiorrespiratoria (<3 shuttles) define el fenotipo metabólicamente no saludable, que presenta mayor prevalencia de resistencia a la insulina, dislipidemia aterogénica (triglicéridos elevados, HDL bajo), presión arterial elevada y marcadores inflamatorios aumentados (proteína C reactiva, interleucina-6).

-Por el contrario, escolares con porcentaje de grasa normal (<20%) y buena aptitud física (>4 shuttles) corresponden al fenotipo metabólicamente saludable, con perfil lipídico favorable, sensibilidad normal a la insulina y presión arterial óptima, independientemente del índice de masa corporal.

-Aproximadamente el 25-30% de nuestra cohorte presenta el perfil de alto riesgo (alta grasa + baja aptitud), cifra consistente con la prevalencia de outliers observados en las variables cardiovasculares y antropométricas previas.

Coherencia con variables previas Los hallazgos de este grupo son altamente coherentes con los análisis anteriores:

-Peso con asimetría positiva (media=41.15 kg, skewness=0.757), que se explica por el subgrupo con alto % grasa corporal.

-Perímetro de cintura elevado (media=67.73 cm, CV=15.25%), que se correlaciona con alto % grasa, especialmente visceral.

-Presión arterial en límite superior (PAS=115.11, PAD=73.27 mmHg), que puede estar mediada por adiposidad excesiva vía hiperleptinemia y activación simpática.

-Índice cintura/cadera elevado (media=0.852), que confirma distribución androide asociada a mayor % grasa visceral.

Consideraciones del desarrollo puberal

Durante la pubertad ocurre una resistencia fisiológica y transitoria a la insulina, mediada por hormona de crecimiento, que puede desenmascarar o acelerar la manifestación de síndrome metabólico en escolares con obesidad y baja aptitud física preexistentes.

Adicionalmente, los cambios en composición corporal varían según el estadio de Tanner, pues los niños prepuberales tienden a tener menor masa muscular y mayor adiposidad relativa, mientras que los púberes experimentan aumento de masa muscular (especialmente varones por efecto androgénico) y redistribución de grasa.

Por tanto, la interpretación del porcentaje de grasa corporal y las capacidades físicas las enmarco en el estadio madurativo, donde un 20% de grasa puede ser normal en una niña púber pero elevado en un niño prepuberal.

CONCLUSIÓN BASADA EN EVIDENCIA

-Creo que las variables de composición corporal y aptitud física reflejan una población con alta prevalencia de adiposidad excesiva combinada con niveles preocupantemente bajos de capacidad cardiorrespiratoria, configurando un perfil de riesgo metabólico elevado en un subgrupo significativo (25-30%) de la cohorte.

Específicamente:

-Porcentaje de grasa corporal promedio en 19.14% con alta dispersión (CV=53.09%), me indica heterogeneidad extrema con un cuartil superior >25% (obesidad)

-Capacidad cardiorrespiratoria promedio de 3.54 shuttles, valor inferior al esperado para la edad, sugiriendo sedentarismo generalizado

-Fuerza prensil adecuada (16.42 kg), indicando que el desarrollo musculoesquelético se mantiene preservado pese al déficit aeróbico y la relación inversa entre adiposidad y fitness, confirmando que el exceso de grasa corporal compromete el rendimiento físico, perpetuando el círculo vicioso del riesgo metabólico.

-La combinación de alta grasa corporal con baja capacidad cardiorrespiratoria constituye el fenotipo metabólicamente no saludable, que presenta mayor riesgo de resistencia a la insulina, dislipidemia aterogénica, hipertensión y progresión hacia síndrome metabólico completo y diabetes tipo 2 en la vida adulta.

Referencias: -Codazzi y colaboradores (2023) - Mechanisms and risk factors of metabolic syndrome in children and adolescents. Endocrine.

ANÁLISIS DE VARIABLES: PERFIL LIPÍDICO - Colesterol Total, HDL, LDL y Triglicéridos

tabla_coltotal <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(col_total, na.rm = TRUE), 2),
    Mediana = round(median(col_total, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(col_total, na.rm = TRUE), 2),
    Varianza = round(var(col_total, na.rm = TRUE), 2),
    Minimo = round(min(col_total, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(col_total, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(col_total, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(col_total, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(col_total, na.rm = TRUE), 1),
    Rango = round(max(col_total, na.rm = TRUE) - min(col_total, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(col_total, na.rm = TRUE), 1),
    `CV (%)` = round((sd(col_total, na.rm = TRUE) / mean(col_total, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(col_total, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(col_total, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadistico")

colnames(tabla_coltotal)[2] <- "Col Total (mg/dL)"

tabla_hdl <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(hdl, na.rm = TRUE), 2),
    Mediana = round(median(hdl, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(hdl, na.rm = TRUE), 2),
    Varianza = round(var(hdl, na.rm = TRUE), 2),
    Minimo = round(min(hdl, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(hdl, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(hdl, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(hdl, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(hdl, na.rm = TRUE), 1),
    Rango = round(max(hdl, na.rm = TRUE) - min(hdl, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(hdl, na.rm = TRUE), 1),
    `CV (%)` = round((sd(hdl, na.rm = TRUE) / mean(hdl, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(hdl, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(hdl, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_hdl) <- "HDL (mg/dL)"

tabla_ldl <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(ldl, na.rm = TRUE), 2),
    Mediana = round(median(ldl, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(ldl, na.rm = TRUE), 2),
    Varianza = round(var(ldl, na.rm = TRUE), 2),
    Minimo = round(min(ldl, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(ldl, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(ldl, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(ldl, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(ldl, na.rm = TRUE), 1),
    Rango = round(max(ldl, na.rm = TRUE) - min(ldl, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(ldl, na.rm = TRUE), 1),
    `CV (%)` = round((sd(ldl, na.rm = TRUE) / mean(ldl, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(ldl, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(ldl, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_ldl) <- "LDL (mg/dL)"

tabla_tag <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(tag, na.rm = TRUE), 2),
    Mediana = round(median(tag, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(tag, na.rm = TRUE), 2),
    Varianza = round(var(tag, na.rm = TRUE), 2),
    Minimo = round(min(tag, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(tag, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(tag, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(tag, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(tag, na.rm = TRUE), 1),
    Rango = round(max(tag, na.rm = TRUE) - min(tag, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(tag, na.rm = TRUE), 1),
    `CV (%)` = round((sd(tag, na.rm = TRUE) / mean(tag, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(tag, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(tag, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_tag) <- "TAG (mg/dL)"

tabla_lipidos <- cbind(tabla_coltotal, tabla_hdl, tabla_ldl, tabla_tag)

kable(tabla_lipidos, 
      caption = "Estadisticas descriptivas: Perfil Lipidico Completo",
      align = c("l", "c", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#E74C3C") %>%
  row_spec(c(1:3), background = "#FADBD8") %>%
  row_spec(c(4:5), background = "#FCF3CF") %>%
  row_spec(c(6:12), background = "#D5F4E6") %>%
  row_spec(c(13:15), background = "#EBF5FB")
Estadisticas descriptivas: Perfil Lipidico Completo
Estadistico Col Total (mg/dL) HDL (mg/dL) LDL (mg/dL) TAG (mg/dL)
N N 125.000 125.000 125.000 125.000
Media Media 161.010 77.130 75.120 86.530
Mediana Mediana 158.000 76.000 69.000 77.000
Desv. Est. Desv. Est. 47.390 20.760 42.730 46.580
Varianza Varianza 2246.100 430.870 1825.920 2169.570
Minimo Minimo 50.000 39.000 14.000 12.000
Q1 (P25) Q1 (P25) 132.000 64.000 42.000 57.000
Q2 (P50) Q2 (P50) 158.000 76.000 69.000 77.000
Q3 (P75) Q3 (P75) 186.000 83.000 94.600 103.000
Maximo Maximo 301.000 155.000 277.700 324.000
Rango Rango 251.000 116.000 263.700 312.000
Rango IQ Rango IQ 54.000 19.000 52.600 46.000
CV (%) CV (%) 29.440 26.910 56.880 53.830
Asimetria Asimetria 0.341 1.004 1.506 1.803
Curtosis Curtosis 3.758 4.803 6.689 8.257
par(mfrow = c(2, 2), mar = c(3, 3.5, 2.5, 1))

hist(BaseMetabolismo$col_total, 
     breaks = 15,
     col = "#E74C3C", 
     border = "white",
     main = "Colesterol Total",
     xlab = "Col Total (mg/dL)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.0,
     cex.lab = 0.9)
abline(v = mean(BaseMetabolismo$col_total), col = "#922B21", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$col_total), col = "#27AE60", lwd = 2.5, lty = 2)
abline(v = 200, col = "#E67E22", lty = 2, lwd = 2)
text(200, max(hist(BaseMetabolismo$col_total, plot=F)$counts)*0.9, "Limite", pos = 4, cex = 0.7, col = "#E67E22", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

hist(BaseMetabolismo$hdl, 
     breaks = 15,
     col = "#52BE80", 
     border = "white",
     main = "HDL Colesterol",
     xlab = "HDL (mg/dL)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.0,
     cex.lab = 0.9)
abline(v = mean(BaseMetabolismo$hdl), col = "#229954", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$hdl), col = "#E67E22", lwd = 2.5, lty = 2)
abline(v = 40, col = "#C0392B", lty = 2, lwd = 2)
text(40, max(hist(BaseMetabolismo$hdl, plot=F)$counts)*0.9, "Bajo", pos = 2, cex = 0.7, col = "#C0392B", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

hist(BaseMetabolismo$ldl, 
     breaks = 15,
     col = "#F39C12", 
     border = "white",
     main = "LDL Colesterol",
     xlab = "LDL (mg/dL)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.0,
     cex.lab = 0.9)
abline(v = mean(BaseMetabolismo$ldl), col = "#935116", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$ldl), col = "#27AE60", lwd = 2.5, lty = 2)
abline(v = 130, col = "#E67E22", lty = 2, lwd = 2)
text(130, max(hist(BaseMetabolismo$ldl, plot=F)$counts)*0.9, "Limite", pos = 4, cex = 0.7, col = "#E67E22", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

hist(BaseMetabolismo$tag, 
     breaks = 15,
     col = "#9B59B6", 
     border = "white",
     main = "Trigliceridos",
     xlab = "TAG (mg/dL)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.0,
     cex.lab = 0.9)
abline(v = mean(BaseMetabolismo$tag), col = "#6C3483", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$tag), col = "#27AE60", lwd = 2.5, lty = 2)
abline(v = 150, col = "#E67E22", lty = 2, lwd = 2)
text(150, max(hist(BaseMetabolismo$tag, plot=F)$counts)*0.9, "Limite", pos = 4, cex = 0.7, col = "#E67E22", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

par(mfrow = c(1, 1))

ratio_ct_hdl <- BaseMetabolismo$col_total / BaseMetabolismo$hdl
ratio_ldl_hdl <- BaseMetabolismo$ldl / BaseMetabolismo$hdl

tabla_ratios <- data.frame(
  Estadistico = c("Media", "Mediana", "Desv. Est.", "Rango"),
  `Col Total/HDL` = c(
    round(mean(ratio_ct_hdl, na.rm = TRUE), 2),
    round(median(ratio_ct_hdl, na.rm = TRUE), 2),
    round(sd(ratio_ct_hdl, na.rm = TRUE), 2),
    paste(round(min(ratio_ct_hdl, na.rm = TRUE), 1), "-", round(max(ratio_ct_hdl, na.rm = TRUE), 1))
  ),
  `LDL/HDL` = c(
    round(mean(ratio_ldl_hdl, na.rm = TRUE), 2),
    round(median(ratio_ldl_hdl, na.rm = TRUE), 2),
    round(sd(ratio_ldl_hdl, na.rm = TRUE), 2),
    paste(round(min(ratio_ldl_hdl, na.rm = TRUE), 1), "-", round(max(ratio_ldl_hdl, na.rm = TRUE), 1))
  )
)

kable(tabla_ratios, 
      caption = "Indices Aterogenicos (Ratios)",
      align = c("l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#8E44AD")
Indices Aterogenicos (Ratios)
Estadistico Col.Total.HDL LDL.HDL
Media 2.27 1.1
Mediana 2.2 0.9
Desv. Est. 0.95 0.8
Rango 0.5 - 5.2 0.2 - 4.8

INTERPRETACIÓN ESTADÍSTICA Y CLÍNICA: PERFIL LIPÍDICO

COLESTEROL TOTAL

Medidas de tendencia central y dispersión
La media de colesterol total fue 161.01 mg/dL y la mediana 158 mg/dL, valores prácticamente idénticos que reflejan una distribución simétrica. Este nivel promedio lo encuentro dentro del rango deseable para población pediátrica (<200 mg/dL), lo que sugiere que la mayoría de los escolares mantiene niveles adecuados de colesterol total.

La desviación estándar (47.39 mg/dL) y el coeficiente de variación (CV = 29.44%) muestran una variabilidad moderada, comparable con la del peso corporal, aunque menor que la observada en la grasa corporal. El rango tan amplio (50 a 301 mg/dL)considero que evidencia la coexistencia de escolares con valores muy bajos y otros con hipercolesterolemia franca (>200 mg/dL), lo que sugiere diferencias metabólicas significativas dentro del grupo.

Distribución visual e implicaciones
El histograma evidencia una distribución unimodal con asimetría positiva leve (0.341), centrada entre 150 y 170 mg/dL, con una cola extendida hacia valores elevados (200–300 mg/dL). Aproximadamente entre el 15 y el 20% de la cohorte presenta hipercolesterolemia.

Este patrón es típico de poblaciones infantiles donde un subgrupo desarrolla alteraciones lipídicas tempranas, frecuentemente asociadas a obesidad, dieta hipercalórica rica en grasas saturadas y predisposición genética, ejemplo que explica cómo los polimorfismos en el gen APOE pueden elevar los niveles de colesterol y triglicéridos.

HDL COLESTEROL (COLESTEROL “PROTECTOR”)

Medidas de tendencia central
La media de HDL fue 77.13 mg/dL y la mediana 76 mg/dL, lo que indica niveles cardioprotectores a nivel poblacional, dado que un HDL superior a 60 mg/dL se asocia con menor riesgo cardiovascular. Este resultado me parece que es favorable, considerando que un HDL bajo (<40 mg/dL en niños, <50 mg/dL en niñas) forma parte de los criterios diagnósticos de síndrome metabólico.

La desviación estándar (20.76 mg/dL) y el CV (26.91%) reflejan una variabilidad moderada, mientras que la asimetría positiva (1.004) indica que existe un subgrupo con HDL muy elevado, sin embargo, el valor mínimo de 39 mg/dL y el primer cuartil (Q1) de 64 mg/dL muestran que aproximadamente entre el 15 y el 25% de los escolares tiene HDL subóptimo, lo que podría aumentar su riesgo metabólico.

Distribución visual y relevancia metabólica
El histograma presenta una distribución amplia, con un pico principal entre 70 y 85 mg/dL y dispersión hacia ambos extremos, por ejemplo la línea roja que marca el límite bajo (40 mg/dL) permite identificar visualmente el subgrupo en riesgo.
El HDL bajo es un marcador de disfunción metabólica, ya que refleja alteraciones en el metabolismo lipoproteico mediadas por obesidad visceral y resistencia a la insulina, ejemplo que explica cómo la actividad aumentada de la proteína de transferencia de ésteres de colesterol transfiere colesterol desde el HDL hacia lipoproteínas aterogénicas, reduciendo sus niveles protectores.

LDL COLESTEROL (COLESTEROL “MALO”)

Medidas de tendencia central y dispersión
La media de LDL fue 75.12 mg/dL y la mediana 69 mg/dL, valores dentro del rango óptimo para población pediátrica (<100 mg/dL), y la diferencia de 6 mg/dL entre ambos valores indica una ligera asimetría positiva.

El LDL me indica que la mayor variabilidad del perfil lipídico (CV = 56.88%), con una asimetría de 1.506, me evidencia una distribución muy heterogénea, pues el rango extremo (14 a 277.7 mg/dL) revela la presencia de escolares con hipercolesterolemia severa (>160 mg/dL), un hallazgo clínicamente relevante.

Distribución visual e implicaciones fisiopatológicas
El histograma presenta una cola derecha prolongada, típica de poblaciones donde un subgrupo desarrolla hipercolesterolemia familiar o secundaria a obesidad severa.

Los valores atípicos (superiores a 130–200 mg/dL) confirman la existencia de escolares con LDL patológico, siendo este hallazgo una sugerrencias de la presencia de dos fenotipos distintos, uno con LDL óptimo y otro con LDL muy elevado, ejemplo que explica cómo los polimorfismos genéticos (APOE) o factores ambientales como la dieta y el sedentarismo pueden contribuir a la dislipidemia.

El LDL elevado en niños reviste especial preocupación porque el proceso aterosclerótico inicia en la infancia, con depósito de LDL oxidado en el endotelio y formación de estrías grasas que progresan a placas en la vida adulta.

TRIGLICÉRIDOS

Medidas de tendencia central y dispersión

La media de triglicéridos fue 86.53 mg/dL y la mediana 77 mg/dL, ambas dentro del rango deseable (<100 mg/dL), addemás la diferencia de 9.5 mg/dL indica asimetría positiva, con CV de 53.83% y asimetría de 1.803, es la más alta de todo el perfil.

El rango (12 a 324 mg/dL) y el tercer cuartil (Q3 = 103 mg/dL)me sugieren que alrededor del 25% de la cohorte presenta niveles elevados o borderline.

Distribución visual y relevancia metabólica

El histograma evidencia una asimetría marcada, con un pico entre 60 y 80 mg/dL y una cola extendida hacia niveles de hipertrigliceridemia severa (150–324 mg/dL).

Alrededor del 10–15% de los escolares supera los 150 mg/dL, criterio diagnóstico de síndrome metabólico. Por ejemplo la hipertrigliceridemia es el marcador más precoz de resistencia a la insulina, ejemplo que explica cómo la insulina hepática, al perder su capacidad de suprimir la lipogénesis de novo, aumenta la síntesis de triglicéridos y secreción de VLDL.

El consumo elevado de fructosa potencia este mecanismo al activar enzimas como acetil-CoA carboxilasa y ácido graso sintasa, generando dislipidemia incluso sin obesidad evidente.

ÍNDICES ATEROGÉNICOS (COCIENTES LIPÍDICOS)

Ratio Colesterol Total/HDL
Media 2.27 y mediana 2.2, ambos valores favorables (ratio <3 = bajo riesgo, >4–5 = riesgo elevado), además el rango (0.5–5.2) confirma la existencia de escolares con ratios patológicos.

Ratio LDL/HDL
Media 1.1, mediana 0.9, valores óptimos (<2), aunque el rango (0.2–4.8) demuestra heterogeneidad con presencia de casos de riesgo.

Interpretación conjunta de ratios
Estos índices reflejan mejor el riesgo cardiovascular global que el colesterol total aislado, ejemplo que explica cómo un niño con colesterol total normal pero HDL bajo puede presentar ratios elevados, lo que revela un perfil aterogénico oculto.

La presencia de ratios superiores a 3 o 4 indica dislipidemia aterogénica, patrón característico del síndrome metabólico.

INTERPRETACIÓN CONJUNTA: PATRÓN DE DISLIPIDEMIA ATEROGÉNICA

Cuando integro las cuatro variables, puedo observar un patrón de dislipidemia metabólica en aproximadamente 15–25% de la cohorte. Este subgrupo se caracteriza por triglicéridos elevados (>100–150 mg/dL), HDL bajo (<60 mg/dL, algunos <40 mg/dL), LDL normal o moderadamente alto con partículas pequeñas y densas, y ratios aterogénicos elevados (Col/HDL >3, LDL/HDL >2).

Este conjunto de hallazgos constituye la expresión lipídica de la resistencia a la insulina y la obesidad visceral, coherente con los análisis antropométricos y fisiológicos previos que he observado.

Coherencia con variables previas

Obesidad visceral (ICC = 0.852, cintura = 67.73 cm), ejemplo que explica la hipertrigliceridemia observada.
Porcentaje de grasa corporal elevado (19.14%, con 25% >25%), ejemplo que explica la asociación con dislipidemia aterogénica.
Baja capacidad cardiorrespiratoria (CRF = 3.54 shuttles), ejemplo que explica cómo el sedentarismo agrava el perfil lipídico.
Presión arterial límite (PAS = 115 mmHg), ejemplo que explica la contribución de la dislipidemia a la disfunción endotelial.

Consideraciones sobre edad y desarrollo

Durante la pubertad, los andrógenos reducen el HDL (particularmente en varones) y los estrógenos tienden a elevarlo. Por ello, un HDL de 65 mg/dL puede ser excelente en un varón púber pero bajo en una niña prepuberal, ejemplo que explica la importancia de considerar el estadio madurativo al interpretar el perfil lipídico.

CONCLUSIÓN BASADA EN EVIDENCIA
El perfil lipídico muestra una población en general con niveles favorables, pero con un subgrupo (15–25%) que presenta dislipidemia aterogénica típica del síndrome metabólico.

En síntesis, el análisis estadístico y clínico revela que:
el colesterol total en promedio es favorable (161 mg/dL), aunque con 15–20% de hipercolesterolemia.
HDL promedio cardioprotector (77 mg/dL), pero con 15–25% en riesgo por valores bajos.
LDL con la mayor variabilidad (CV = 56.88%) y casos de hipercolesterolemia severa.
Triglicéridos con asimetría extrema (1.803), y 10–15% con niveles >150 mg/dL.
Ratios lipídicos generalmente favorables, aunque con un subgrupo de riesgo (Col/HDL >3–4).

La combinación de triglicéridos elevados y HDL bajo constituye el núcleo de la dislipidemia aterogénica, marcador temprano del riesgo cardiovascular pediátrico.
Este perfil, junto con la obesidad visceral, baja aptitud física e inflamación crónica, configura un síndrome metabólico pediátrico completo en aproximadamente el 15–25% de la cohorte.

Considero que estos hallazgos sustentan la necesidad de tamizaje lipídico selectivo e intervenciones preventivas tempranas (alimentación mediterránea y actividad física vigorosa), considerando que el proceso aterosclerótico se inicia en la infancia y puede revertirse con intervención oportuna.

Referencia:
Codazzi y colaboradores (2023). Mechanisms and risk factors of metabolic syndrome in children and adolescents. Endocrine.

ANÁLISIS VARIABLE GLICEMIA

tabla_glicemia <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(glicemia, na.rm = TRUE), 2),
    Mediana = round(median(glicemia, na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(glicemia, na.rm = TRUE), 2),
    Varianza = round(var(glicemia, na.rm = TRUE), 2),
    Minimo = round(min(glicemia, na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(glicemia, 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(glicemia, 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(glicemia, 0.75, na.rm = TRUE), 1),
    Maximo = round(max(glicemia, na.rm = TRUE), 1),
    Rango = round(max(glicemia, na.rm = TRUE) - min(glicemia, na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(glicemia, na.rm = TRUE), 1),
    `CV (%)` = round((sd(glicemia, na.rm = TRUE) / mean(glicemia, na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(glicemia, na.rm = TRUE), 3),
    Curtosis = round(kurtosis(glicemia, na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadistico")

colnames(tabla_glicemia)[2] <- "Glicemia (mg/dL)"

kable(tabla_glicemia, 
      caption = "Estadisticas descriptivas: Glicemia en Ayunas",
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#3498DB") %>%
  row_spec(c(1:3), background = "#D6EAF8") %>%
  row_spec(c(4:5), background = "#FCF3CF") %>%
  row_spec(c(6:12), background = "#D5F4E6") %>%
  row_spec(c(13:15), background = "#FADBD8")
Estadisticas descriptivas: Glicemia en Ayunas
Estadistico Glicemia (mg/dL)
N 125.000
Media 88.100
Mediana 89.000
Desv. Est. 11.320
Varianza 128.110
Minimo 63.000
Q1 (P25) 79.000
Q2 (P50) 89.000
Q3 (P75) 96.000
Maximo 118.000
Rango 55.000
Rango IQ 17.000
CV (%) 12.850
Asimetria 0.155
Curtosis 2.612
par(mfrow = c(1, 2), mar = c(3, 3.5, 2.5, 1))

hist(BaseMetabolismo$glicemia, 
     breaks = 15,
     col = "#3498DB", 
     border = "white",
     main = "Distribucion Glicemia",
     xlab = "Glicemia (mg/dL)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.0,
     cex.lab = 0.9)
abline(v = mean(BaseMetabolismo$glicemia), col = "#1F618D", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo$glicemia), col = "#27AE60", lwd = 2.5, lty = 2)
abline(v = 100, col = "#E67E22", lty = 2, lwd = 2)
abline(v = 126, col = "#C0392B", lty = 2, lwd = 2)
text(100, max(hist(BaseMetabolismo$glicemia, plot=F)$counts)*0.9, "IFG", pos = 4, cex = 0.7, col = "#E67E22", font = 2)
text(126, max(hist(BaseMetabolismo$glicemia, plot=F)$counts)*0.75, "DM", pos = 4, cex = 0.7, col = "#C0392B", font = 2)
legend("topright", 
       legend = c(paste0("M=", round(mean(BaseMetabolismo$glicemia), 1)),
                  paste0("Me=", round(median(BaseMetabolismo$glicemia), 1))),
       col = c("#1F618D", "#27AE60"), lty = 2, lwd = 2, cex = 0.75)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

boxplot(BaseMetabolismo$glicemia, 
        col = "#AED6F1",
        border = "#154360",
        main = "Boxplot: Glicemia",
        ylab = "Glicemia (mg/dL)",
        las = 1,
        lwd = 1.5,
        boxwex = 0.5,
        outcol = "#C0392B",
        outpch = 19,
        cex.main = 1.0,
        cex.lab = 0.9)
abline(h = 100, col = "#E67E22", lty = 2, lwd = 2)
abline(h = 126, col = "#C0392B", lty = 2, lwd = 2)
text(1.3, 100, "IFG", pos = 3, cex = 0.7, col = "#E67E22", font = 2)
text(1.3, 126, "DM", pos = 3, cex = 0.7, col = "#C0392B", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

par(mfrow = c(1, 1))

INTERPRETACIÓN ESTADÍSTICA Y CLÍNICA: GLICEMIA EN AYUNAS

Medidas de tendencia central y dispersión

La media de glicemia fue 88.10 mg/dL con mediana de 89.00 mg/dL, valores prácticamente idénticos que confirman una distribución simétrica, considero que este nivel promedio se encuentra claramente en el rango normal (<100 mg/dL) para población pediátrica, lo que sugiere que la mayoría de la cohorte mantiene homeostasis glucémica preservada.

La desviación estándar (11.32 mg/dL) y el coeficiente de variación (CV = 12.85%) reflejan variabilidad baja, la más controlada entre todas las variables metabólicas analizadas hasta ahora, además esta baja dispersión contrasta con la alta variabilidad observada en triglicéridos (CV = 53.83%) y LDL (CV = 56.88%), ejemplo que explica cómo los mecanismos regulatorios de la glucosa son más estrictos que los del metabolismo lipídico.

El rango estimado (63–118 mg/dL) es relativamente estrecho, aunque el máximo cercano a 118 mg/dL indica la existencia de un pequeño subgrupo que bordea el umbral de glicemia alterada en ayunas (≥100 mg/dL).

Distribución visual e implicaciones

El histograma evidencia una distribución unimodal prácticamente simétrica, centrada entre 85 y 95 mg/dL, característica de poblaciones pediátricas con función pancreática β preservada.
La ausencia de asimetría positiva marcada es un hallazgo favorable, ya que sugiere que la mayoría de los escolares no presenta hiperglucemia.

El boxplot es compacto y equilibrado, con pocos valores atípicos. Ningún estudiante supera los 126 mg/dL (umbral diagnóstico de diabetes) y muy pocos superan los 100 mg/dL (glicemia alterada en ayunas), lo que veo que menos del 5% de la cohorte presenta disglucemia establecida y la línea de referencia en 100 mg/dL permite estimar visualmente que solo entre el 2 y el 5% presenta valores alterados, prevalencia baja pero clínicamente relevante para la edad.

Hallazgo aparentemente paradójico

A pesar de que aproximadamente 25–30% de la cohorte presenta obesidad visceral (ICC = 0.852, índice cintura/cadera elevado), alta grasa corporal (>25%), dislipidemia aterogénica (triglicéridos elevados, HDL bajo) y baja aptitud física (CRF = 3.54 shuttles), la glicemia permanece normal en la mayoría de los casos.

-Este hallazgo se explica por dos mecanismos fisiopatológicos principales según la literatura que he revisado y citado:

-Compensación hiperinsulinémica: en etapas iniciales de resistencia a la insulina, las células β pancreáticas aumentan su secreción de insulina para compensar la reducción en la sensibilidad periférica, manteniendo la glucosa dentro del rango normal,por lo que este fenómeno explica por qué niños con obesidad pueden tener glucosa normal pero niveles elevados de insulina basal y HOMA-IR aumentados.

*-Capacidad adaptativa juvenil: los niños y adolescentes conservan una reserva funcional pancreática amplia**, con masa y capacidad secretora de células β preservadas. Esta plasticidad metabólica permite mantener normoglucemia a pesar de la mayor demanda insulínica inducida por obesidad y resistencia periférica.

Sin embargo, esta compensación no es indefinida, pues con el tiempo, la resistencia a la insulina progresa y la demanda secretora excede la capacidad de las células β, que comienzan a fallar por estrés oxidativo, lipotoxicidad y depósito de amilina.

El resultado final es fallo pancreático progresivo, hiperglucemia franca y diabetes tipo 2 en etapas posteriores, proceso que puede manifestarse precozmente en niños con obesidad severa.

Relevancia de la glicemia normal en el contexto del síndrome metabólico

El mantenimiento de la glicemia normal no excluye la presencia de síndrome metabólico, ya que este diagnóstico requiere solo tres de los cinco criterios, y la alteración glucémica es solo uno de ellos.

En población pediátrica, la dislipidemia y la obesidad central suelen preceder a la disglucemia, lo que significa que esta última es una manifestación tardía del proceso metabólico.

Los escolares con obesidad visceral, dislipidemia aterogénica y presión arterial elevada ya cumplen criterios de síndrome metabólico, incluso con glicemia normal, siendo esta combinación metabólica un riesgo cardiovascular aumentado, mediado por inflamación crónica, disfunción endotelial y estrés oxidativo persistente.

-Coherencia con variables previas-

Los hallazgos glucémicos son consistentes con el patrón metabólico general que he observado:

1.Triglicéridos elevados (media = 86.53 mg/dL, 10–15% >150 mg/dL), ejemplo que explica resistencia insulínica hepática selectiva, donde persiste la lipogénesis pese a la ausencia de hiperglucemia.

2.HDL bajo en subgrupo, ejemplo que explica cómo el metabolismo inverso entre HDL y triglicéridos mediado por la proteína de transferencia de ésteres de colesterol refleja resistencia a la insulina aun con glucosa normal.

3.Obesidad visceral (ICC = 0.852, índice cintura/cadera elevado), ejemplo que explica cómo la liberación portal de ácidos grasos libres desde el tejido adiposo visceral induce resistencia hepática a la insulina, aunque la compensación pancreática mantenga normoglucemia.

Consideraciones sobre resistencia insulínica oculta

La glicemia en ayunas es un marcador tardío de disfunción metabólica. Antes de que la glucosa se eleve, ya se han establecido alteraciones tempranas como la hiperinsulinemia compensatoria, la reducción de sensibilidad insulínica en músculo y tejido adiposo y el aumento de la producción hepática de glucosa compensado por mayor secreción de insulina.

La ausencia de medición de insulina basal y HOMA-IR (es un índice que estima la resistencia a la insulina a partir de la glucosa e insulina en ayunas )en este estudio constituye una limitación importante, ya que impide cuantificar la resistencia insulínica subyacente que probablemente existe en el subgrupo con obesidad visceral y dislipidemia pese a su normoglucemia.

Estudios pediátricos han mostrado que niños obesos con glicemia normal pueden presentar HOMA-IR elevado (>2.5–3.5), evidenciando una resistencia insulínica compensada que no se refleja aún en la glucosa basal pero que predice progresión a diabetes tipo 2 en seguimientos longitudinales.

Implicaciones preventivas

La normoglucemia prevalente no me genera una sensación de seguridad, ya que representa una ventana de oportunidad preventiva antes del agotamiento pancreático irreversible.

Considero que estos escolares con obesidad visceral, dislipidemia y normoglucemia se encuentran al momento de este análisis,en la fase compensada de resistencia insulínica por lo cual en la actualidad con poblaciones similares, es mujy importante iniciar medidas preventivas ya mencionadas antes, en cuanto a ejercicio y dieta.

Referencia:
Codazzi y colaboradores (2023). Mechanisms and risk factors of metabolic syndrome in children and adolescents. Endocrine.

ANÁLISIS VARIABLES: COMPOSICIÓN CORPORAL Y FUERZA COMPLEMENTARIAS

% Grasa por Pliegues Cutáneos y Fuerza Mano No Dominante

# Convertir fuerza no dominante a numérica
BaseMetabolismo$f__mano_no_do <- as.numeric(BaseMetabolismo$f__mano_no_do)

# Usar posiciones
nombre_grasa_plie <- names(BaseMetabolismo)[18]
nombre_fuerza_nodo <- names(BaseMetabolismo)[16]

tabla_grasa_plie <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(.data[[nombre_grasa_plie]], na.rm = TRUE), 2),
    Mediana = round(median(.data[[nombre_grasa_plie]], na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(.data[[nombre_grasa_plie]], na.rm = TRUE), 2),
    Varianza = round(var(.data[[nombre_grasa_plie]], na.rm = TRUE), 2),
    Minimo = round(min(.data[[nombre_grasa_plie]], na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(.data[[nombre_grasa_plie]], 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(.data[[nombre_grasa_plie]], 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(.data[[nombre_grasa_plie]], 0.75, na.rm = TRUE), 1),
    Maximo = round(max(.data[[nombre_grasa_plie]], na.rm = TRUE), 1),
    Rango = round(max(.data[[nombre_grasa_plie]], na.rm = TRUE) - min(.data[[nombre_grasa_plie]], na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(.data[[nombre_grasa_plie]], na.rm = TRUE), 1),
    `CV (%)` = round((sd(.data[[nombre_grasa_plie]], na.rm = TRUE) / mean(.data[[nombre_grasa_plie]], na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(.data[[nombre_grasa_plie]], na.rm = TRUE), 3),
    Curtosis = round(kurtosis(.data[[nombre_grasa_plie]], na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame() %>%
  tibble::rownames_to_column(var = "Estadistico")

colnames(tabla_grasa_plie)[2] <- "% Grasa Pliegues"

tabla_fuerza_nodo <- BaseMetabolismo %>%
  summarise(
    N = n(),
    Media = round(mean(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 2),
    Mediana = round(median(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 2),
    `Desv. Est.` = round(sd(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 2),
    Varianza = round(var(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 2),
    Minimo = round(min(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 1),
    `Q1 (P25)` = round(quantile(.data[[nombre_fuerza_nodo]], 0.25, na.rm = TRUE), 1),
    `Q2 (P50)` = round(quantile(.data[[nombre_fuerza_nodo]], 0.50, na.rm = TRUE), 1),
    `Q3 (P75)` = round(quantile(.data[[nombre_fuerza_nodo]], 0.75, na.rm = TRUE), 1),
    Maximo = round(max(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 1),
    Rango = round(max(.data[[nombre_fuerza_nodo]], na.rm = TRUE) - min(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 1),
    `Rango IQ` = round(IQR(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 1),
    `CV (%)` = round((sd(.data[[nombre_fuerza_nodo]], na.rm = TRUE) / mean(.data[[nombre_fuerza_nodo]], na.rm = TRUE)) * 100, 2),
    Asimetria = round(skewness(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 3),
    Curtosis = round(kurtosis(.data[[nombre_fuerza_nodo]], na.rm = TRUE), 3)
  ) %>%
  t() %>%
  as.data.frame()

colnames(tabla_fuerza_nodo) <- "Fuerza No-Dom (kg)"

tabla_complementarias <- cbind(tabla_grasa_plie, tabla_fuerza_nodo)

kable(tabla_complementarias, 
      caption = "Estadisticas descriptivas: Variables Complementarias",
      align = c("l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#16A085") %>%
  row_spec(c(1:3), background = "#D1F2EB") %>%
  row_spec(c(4:5), background = "#FCF3CF") %>%
  row_spec(c(6:12), background = "#D5F4E6") %>%
  row_spec(c(13:15), background = "#FADBD8")
Estadisticas descriptivas: Variables Complementarias
Estadistico % Grasa Pliegues Fuerza No-Dom (kg)
N N 125.000 125.000
Media Media 26.360 15.960
Mediana Mediana 23.550 16.000
Desv. Est. Desv. Est. 11.510 4.130
Varianza Varianza 132.480 17.060
Minimo Minimo 10.300 8.000
Q1 (P25) Q1 (P25) 18.600 13.000
Q2 (P50) Q2 (P50) 23.600 16.000
Q3 (P75) Q3 (P75) 31.100 18.000
Maximo Maximo 72.800 32.000
Rango Rango 62.500 24.000
Rango IQ Rango IQ 12.500 5.000
CV (%) CV (%) 43.660 25.880
Asimetria Asimetria 1.538 0.748
Curtosis Curtosis 5.887 3.913
par(mfrow = c(2, 2), mar = c(3, 3.5, 2.5, 1))

hist(BaseMetabolismo[[nombre_grasa_plie]], 
     breaks = 15,
     col = "#16A085", 
     border = "white",
     main = "% Grasa (Pliegues)",
     xlab = "% Grasa",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.0,
     cex.lab = 0.9)
abline(v = mean(BaseMetabolismo[[nombre_grasa_plie]], na.rm = TRUE), col = "#117A65", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo[[nombre_grasa_plie]], na.rm = TRUE), col = "#E67E22", lwd = 2.5, lty = 2)
legend("topright", 
       legend = c(paste0("M=", round(mean(BaseMetabolismo[[nombre_grasa_plie]], na.rm = TRUE), 1)),
                  paste0("Me=", round(median(BaseMetabolismo[[nombre_grasa_plie]], na.rm = TRUE), 1))),
       col = c("#117A65", "#E67E22"), lty = 2, lwd = 2, cex = 0.75)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

boxplot(BaseMetabolismo[[nombre_grasa_plie]], 
        col = "#A3E4D7",
        border = "#0E6251",
        main = "Boxplot: % Grasa (Pliegues)",
        ylab = "% Grasa",
        las = 1,
        lwd = 1.5,
        boxwex = 0.5,
        outcol = "#C0392B",
        outpch = 19,
        cex.main = 1.0,
        cex.lab = 0.9)
abline(h = 25, col = "#E67E22", lty = 2, lwd = 2)
text(1.25, 25, "Obesidad", pos = 3, cex = 0.7, col = "#E67E22", font = 2)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

hist(BaseMetabolismo[[nombre_fuerza_nodo]], 
     breaks = 15,
     col = "#AF7AC5", 
     border = "white",
     main = "Fuerza Mano No Dominante",
     xlab = "Fuerza (kg)",
     ylab = "Frecuencia",
     las = 1,
     cex.main = 1.0,
     cex.lab = 0.9)
abline(v = mean(BaseMetabolismo[[nombre_fuerza_nodo]], na.rm = TRUE), col = "#6C3483", lwd = 2.5, lty = 2)
abline(v = median(BaseMetabolismo[[nombre_fuerza_nodo]], na.rm = TRUE), col = "#E67E22", lwd = 2.5, lty = 2)
legend("topright", 
       legend = c(paste0("M=", round(mean(BaseMetabolismo[[nombre_fuerza_nodo]], na.rm = TRUE), 1)),
                  paste0("Me=", round(median(BaseMetabolismo[[nombre_fuerza_nodo]], na.rm = TRUE), 1))),
       col = c("#6C3483", "#E67E22"), lty = 2, lwd = 2, cex = 0.75)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

boxplot(BaseMetabolismo[[nombre_fuerza_nodo]], 
        col = "#D7BDE2",
        border = "#4A235A",
        main = "Boxplot: Fuerza No-Dom",
        ylab = "Fuerza (kg)",
        las = 1,
        lwd = 1.5,
        boxwex = 0.5,
        outcol = "#E74C3C",
        outpch = 19,
        cex.main = 1.0,
        cex.lab = 0.9)
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

par(mfrow = c(1, 1))

diferencia_fuerza <- BaseMetabolismo$f__mano_do - BaseMetabolismo[[nombre_fuerza_nodo]]
correlacion_grasa <- cor(BaseMetabolismo$`%_grasa_corp`, BaseMetabolismo[[nombre_grasa_plie]], use = "complete.obs")

cat("\n=== ANÁLISIS COMPARATIVO ===\n")
## 
## === ANÁLISIS COMPARATIVO ===
cat("Diferencia Fuerza Dominante - No Dominante:\n")
## Diferencia Fuerza Dominante - No Dominante:
cat("  Media:", round(mean(diferencia_fuerza, na.rm = TRUE), 2), "kg\n")
##   Media: 0.46 kg
cat("  Mediana:", round(median(diferencia_fuerza, na.rm = TRUE), 2), "kg\n\n")
##   Mediana: 1 kg
cat("Correlación % Grasa (Bioimpedancia vs Pliegues):\n")
## Correlación % Grasa (Bioimpedancia vs Pliegues):
cat("  r =", round(correlacion_grasa, 3), "\n")
##   r = 0.661

ANÁLISIS DE PORCENTAJE DE GRASA POR PLIEGUES CUTÁNEOS

Medidas de tendencia central y dispersión

La media de grasa por pliegues fue 26.36% con mediana de 23.55%, evidenciando una diferencia de 2.81% que sugiere asimetría positiva leve, por tanto este valor promedio es notablemente superior al obtenido por bioimpedancia (19.14%),una discrepancia metodológica esperada que analizaré más adelante.

La desviación estándar de 11.51% y el coeficiente de variación (CV) de 43.67% me indican variabilidad moderada-alta, menor que la que encontré en grasa corporal por bioimpedancia (CV=53.09%) pero aún considerable.
El rango de 62.5% (10.3–72.8%) evidencia heterogeneidad marcada en la composición corporal.

1.1.1 Distribución visual e implicaciones

  • El histograma muestra una distribución unimodal con asimetría positiva, centrada en 20–25%, pero con cola extendida hacia adiposidad excesiva (>40%).
  • El boxplot confirma múltiples outliers superiores, representando escolares con obesidad franca por grasa subcutánea.
  • La línea naranja marcando 25% (umbral de obesidad) permite estimar que aproximadamente el 40–50% de la cohorte supera este límite, prevalencia superior a la observada por bioimpedancia (25–30%).

Considero que es metodológicamente coherente, pues los pliegues cutáneos tienden a sobreestimar el porcentaje de grasa total al medir solo grasa subcutánea y extrapolar mediante ecuaciones predictivas.

FUERZA PRENSIL MANO NO DOMINANTE

Medidas de tendencia central

La media de fuerza no dominante fue 15.96 kg con mediana de 16.00 kg, valores prácticamente idénticos que confirman distribución simétrica. Este rendimiento es muy similar a la fuerza de la mano dominante (media = 16.42 kg), con una diferencia promedio de apenas 0.46 kg.

La desviación estándar (DE) de 4.13 kg y el CV de 25.88% indican variabilidad moderada, prácticamente igual a la observada en la mano dominante (CV = 24.85%), sugiriendo que la dispersión de la fuerza muscular es independiente de la lateralidad.

1.1.2 Distribución visual y simetría bilateral

  • El histograma muestra una distribución unimodal y simétrica, centrada en 15–17 kg.
  • El boxplot presenta estructura equilibrada con pocos outliers, confirmando que la fuerza muscular está homogéneamente distribuida entre ambas manos.
  • La diferencia mínima entre manos (mediana = 1 kg, media = 0.46 kg) es fisiopatológicamente relevante, pues sugiere que esta cohorte presenta desarrollo muscular bilateral equilibrado, sin asimetría marcada.

En poblaciones con entrenamiento deportivo unilateral o patología neuromuscular, esta diferencia suele ser mayor (>2–3 kg).

1.2 ANÁLISIS COMPARATIVO: MÉTODOS DE EVALUACIÓN DE GRASA CORPORAL

1.2.1 Correlación entre bioimpedancia y pliegues cutáneos

La correlación fue r = 0.661, clasificada como moderada-fuerte pero no excelente, siendo esta correlación imperfecta refleja que ambos métodos no miden exactamente lo mismo:

  • Bioimpedancia (media = 19.14%): estima grasa total (subcutánea + visceral) mediante resistencia eléctrica, pero es sensible a hidratación, fase menstrual y temperatura corporal.
  • Pliegues cutáneos (media = 26.36%): miden solo grasa subcutánea en sitios específicos y extrapolan mediante ecuaciones predictivas (como Slaughter), asumiendo proporciones constantes.

La diferencia de 7.22% entre métodos (26.36% vs 19.14%) indica que los pliegues sobreestiman sistemáticamente el porcentaje de grasa en esta población.
Esto puede deberse a que las ecuaciones predictivas fueron desarrolladas en poblaciones con diferente composición corporal y distribución de grasa que los escolares colombianos.

1.2.2 Implicaciones para fenotipificación metabólica

  • Pese a la discrepancia, ambos métodos identifican el mismo subgrupo de alto riesgo (25–40% de la cohorte).
  • Esta concordancia cualitativa (aunque no cuantitativa) confirma la existencia de un subgrupo robusto con exceso real de grasa corporal, no un artefacto metodológico.
  • Este subgrupo presenta mayor riesgo de resistencia insulínica, dislipidemia e hipertensión, según análisis previos.

ASIMETRÍA MUSCULAR Y DESARROLLO BILATERAL

==Diferencia dominante–no dominante mínima==

La diferencia promedio de 0.46 kg (mediana = 1 kg) entre manos es muy pequeña (2.8% de la fuerza total), indicando desarrollo muscular bilateral equilibrado.
Esto es favorable porque:

  • La asimetría muscular >10–15% se asocia con mayor riesgo de lesiones musculoesqueléticas.
  • El entrenamiento bilateral equilibrado favorece el desarrollo neuromuscular simétrico.
  • En escolares sedentarios con baja aptitud física (CRF = 3.54 shuttles), la simetría bilateral indica un desacondicionamiento global, no un déficit unilateral.

== COHERENCIA CON VARIABLES PREVIAS===

Los hallazgos son coherentes con el patrón metabólico global dado por:

  • Alta grasa corporal por pliegues (26.36%), ya que confirma obesidad observada por bioimpedancia, perímetro de cintura e ICC.
  • Fuerza bilateral preservada (15.96–16.42 kg), lo cual contrasta con la baja aptitud cardiorrespiratoria (CRF = 3.54 shuttles), sugiriendo déficit aeróbico.
  • Correlación moderada (r = 0.661), lo cual valida la robustez del diagnóstico de obesidad independientemente del método.

==CONCLUSIÓN BASADA EN EVIDENCIA==

Los hallazgos me confirman alta prevalencia de adiposidad excesiva (25–50%), combinada con desarrollo muscular bilateral equilibrado pero en contexto de bajo acondicionamiento aeróbico.

Referencias

Codazzi, A. C., Pinto, I., Ziccarelli, M., Bona, A., Zampino, G., & Deodati, A. (2023). Mechanisms and risk factors of metabolic syndrome in children and adolescents. Endocrine, 1-15. doi: 10.1007/s12020-023-03642-x

2 PRUEBAS PARAMÉTRICAS

En el informe inicial que realicé,con la base de datos METABOLISMO llevé a cabo un proceso de depuración, validación estructural y análisis descriptivo, verificando que los registros fueran consistentes, completos y fisiológicamente plausibles, por lo cual en este proceso comprendí la arquitectura interna de la base, identifiqué los dominios clínicos, antropométricos y bioquímicos representados, y pude caracterizar la variabilidad de los indicadores metabólicos de los escolares incluidos, por lo que de esta manera consolidé una base depurada sobre la cual puedo avanzar con confianza hacia un análisis inferencial.

A partir de este fundamento, en el presente informe desarrollaré la fase de inferencia estadística, cuyo propósito central es que yo pueda utilizar la información muestral para hacer afirmaciones sobre parámetros poblacionales que no puedo observar directamente, por lo que a diferencia del análisis descriptivo, donde me limité a resumir lo observado, aquí en la inferencia puedo responder preguntas sobre la población estudiada mediante contrastes formales de hipótesis y estimaciones acompañadas de intervalos de confianza.

Para ello aplicaré pruebas estadísticas paramétricas, herramientas que requieren que la información cuantitativa se comporte de acuerdo con ciertos supuestos (normalidad, independencia y escala métrica) y que, cuando se cumplan, me permitirán evaluar diferencias reales y cuantificar la incertidumbre asociada a mis estimaciones.

En este informe realizaré dos tipos de comparaciones fundamentales, la primera es hacer una prueba de hipótesis para una muestra, en la que contrastaré la media de un marcador clínico frente a un valor teórico utilizado como punto de referencia fisiológico.

Luego realizaré, una prueba de hipótesis para dos muestras independientes, en la que evaluaré si existen diferencias en una medida antropométrica entre grupos definidos por una característica demográfica relevante.

Con estos procedimientos podré determinar si las diferencias observadas en los datos son atribuibles al azar o si representan patrones coherentes con el marco clínico, fisiopatológico y epidemiológico del riesgo metabólico infantil.

Considero que esta fase analítica es esencial, pues me permitirá integrar la estadística con la interpretación biológica, para poder avanzar del punto donde arranqué que fue“describir lo que veo” a “comprender por qué ocurre”, y extraer conclusiones que apoyarán la evaluación temprana de alteraciones metabólicas en una población pediátrica sana.

Estadística bivariada

En conjunto, este análisis inferencial me representa un paso super clave para poder hallar evidencia estadística que me ayude en la evaluación clínica de los perfiles metabólicos y su variabilidad en esta cohorte escolar.

Considero aplicar herramientas de estadística bivariada, las cuales según la literatura, se utilizan cuando, por ejemplo, el objetivo es analizar la relación entre dos variables al mismo tiempo, y a diferencia de la estadística univariada, que describe cada variable por separado, la estadística bivariada si me permite evaluar diferencias, asociaciones o patrones comparativos.

Para este análisis trabajaré con una variable dependiente continua (glucosa en ayunas o perímetro de cintura) y una variable independiente que define los grupos que deseo comparar (un valor teórico para la prueba de una muestra, o el sexo biológico para la comparación de dos grupos).

La estadística bivariada que aplicaré corresponde a pruebas de comparación de medias, que me permiten evaluar si las diferencias observadas entre grupos son reales o si puedo atribuirlas al azar del muestreo, por lo cual utilizaré pruebas paramétricas como la prueba t de Student, tanto para una muestra (cuando quiero evaluo frente a un valor de referencia) como para dos muestras independientes (cuando quiero comparar entre grupos).

Además, si los supuestos de normalidad no se cumplieran adecuadamente, recurriré a una alternativa no paramétrica como la prueba de Wilcoxon/Mann-Whitney, que me ayuda a evaluar diferencias en la ubicación central de las distribuciones sin exigir normalidad.

Planteamiento de la Hipótesis

Para avanzar hacia el análisis inferencial, primero debo formular las hipótesis estadísticas que voy a evaluar, pues considero fundamental establecerlas desde ahora, ya que una hipótesis estadística es una afirmación sobre un parámetro poblacional, por ejemplo, una media o una diferencia entre medias, que puede ser contrastada utilizando la información muestral disponible. A continuación desarrollaré dos hipótesis:

1. Hipótesis para una muestra: Realizaré una comparación de una media muestral con un valor teórico clínico, y en esta primera parte evaluaré si un parámetro metabólico de interés en mi base de datos,por ejemplo, la glucosa en ayunas o el perímetro de cintura, presenta un valor promedio que es coherente con un estándar clínico de referencia.

En términos de inferencia estadística, este procedimiento me permitirá determinar si la media observada en mi grupo de escolares refleja lo que se consideraría un comportamiento metabólico fisiológico o si, por el contrario, se aleja de lo esperado y me sugiere una tendencia que podría tener relevancia epidemiológica, por tanto, voy a plantear las siguientes hipótesis:

Hipótesis nula:

la media poblacional del marcador clínico que evaluaré será igual al valor teórico de referencia definido desde la literatura biomédica.

Con esta hipótesis nula, establezco la postura conservadora que asumo inicialmente, donde estoy diciendo que mi población no difiere de lo que sería esperado fisiológicamente.

Hipótesis alternativa:

la media poblacional del mismo marcador será diferente a ese valor teórico.

Esta alternativa me permitirá detectar si existe un incremento o una disminución significativa que podría interpretarse como un patrón metabólico alterado en esta cohorte.

Formular estas hipótesis me permite utilizar una prueba paramétrica de una muestra, como la prueba t de Student para una media, con el fin de evaluar de manera formal si la diferencia observada se debe únicamente al azar o si refleja un patrón real en la población escolar.

2. Hipótesis para dos muestras independientes:

Aquí haré una comparación de medias entre grupos definidos, pues en la segunda parte del análisis evaluaré si existe una diferencia en un parámetro antropométrico o metabólico entre dos grupos de estudiantes definidos por una característica demográfica, por ejemplo el sexo biológico (niñas versus niños) o algún nivel de desarrollo puberal.

El propósito de esta comparación será que yo identifique si los patrones metabólicos o clínicos se distribuyen de manera similar entre los grupos o si existen diferencias que podrían explicarse por factores biológicos, fisiológicos o sociales.

Las hipótesis que formularé son:

Hipótesis nula:

las medias poblacionales del parámetro que voy a estudiar serán iguales en ambos grupos.

Con esta hipótesis nula expreso que, desde el punto de vista estadístico y fisiológico, no existen diferencias reales entre los grupos, y cualquier variación observada se deberá únicamente al azar propio del muestreo.

Hipótesis alternativa:

las medias poblacionales serán diferentes entre los grupos.

Con esta alternativa evaluaré la posibilidad de que exista una diferencia real en la variabilidad metabólica o antropométrica entre ambos grupos, lo cual podría tener implicaciones fisiológicas y epidemiológicas relevantes.

La prueba estadística adecuada que emplearé, si se cumplen los supuestos de normalidad y homogeneidad de varianzas, será la prueba t de Student para dos muestras independientes, pues con esta herramienta me podré determinar si la diferencia observada entre los grupos puede atribuirse al azar o si representa un patrón consistente con diferencias biológicas o conductuales en la población.

Considero que formular estas hipótesis de manera explícita, razonada y contextualizada es esencial para garantizar un análisis coherente con los principios de la inferencia estadística, ya que cada hipótesis me guiará al método a utilizar, igualmente en la interpretación de los valores que obtenga y el alcance de las conclusiones que podré emitir sobre el riesgo metabólico en esta cohorte.

Objetivo del análisis

Mi objetivo es determinar si los marcadores metabólicos que he seleccionado de la base METABOLISMO presentan o no diferencias relevantes cuando los comparo con un valor teórico de referencia o entre dos grupos definidos por una característica demográfica.

Mi propósito es evaluar si las diferencias que observo en las medias son atribuibles al azar o si reflejan patrones coherentes con procesos fisiológicos propios de esta población escolar.

En primera instancia evaluaré si la glucosa en ayunas de los estudiantes se comporta de manera similar a un valor teórico considerado normal en población pediátrica, por medio de una prueba t para una muestra, luego analizaré si el perímetro de cintura difiere entre niños y niñas, aplicando una prueba t de dos muestras independientes y complementándola con alternativas no paramétricas si es necesario.

Con este proceso busco no solo contrastar hipótesis estadísticas, sino también comprender si estos patrones tienen sentido clínico y epidemiológico, y de esta forma acercarme a una interpretación integral del perfil metabólico infantil en esta cohorte.

Metodología

En esta sección describiré las decisiones analíticas que asumiré para llevar a cabo las pruebas paramétricas,por lo cual seleccionaré dos variables cuantitativas continuas de la base METABOLISMO y, a partir de ellas, ejecutaré dos tipos de contrastes de hipótesis, uno para una sola muestra y otro para dos muestras independientes.

Selección de variables

Seleccionaré dos variables que son clínicamente relevantes,porque poseen escala métrica adecuada y presentan variabilidad suficiente para un análisis paramétrico:

Variable 1: Glucosa en ayunas (glucemia)

Tipo de variable: Cuantitativa continua Dominio: Marcador bioquímico Unidad: mg/dL

Considero que la glucosa en ayunas es uno de los indicadores metabólicos más sensibles para evaluar riesgo cardiometabólico temprano, pues posee puntos de corte ampliamente establecidos en la literatura médica, lo cual me permite compararla con un valor teórico fisiológico (por ejemplo, 90 mg/dL como valor considerado normal en población pediátrica), por lo que la convierte en una variable ideal que puedo aplicar con una prueba t para una muestra.

Variable 2: Perímetro de cintura (per_cintura) Tipo de variable: Cuantitativa continua Dominio: Antropométrico Unidad: centímetros

El perímetro de cintura es un marcador clave de adiposidad central, ampliamente asociado con riesgo cardiometabólico incluso en edades tempranas,por lo que biológicamente puedo esperar que existan diferencias entre niños y niñas debido a variaciones en crecimiento, composición corporal y distribución grasa.

Por esta razón, lo considero ideal para el análisis entre dos grupos independientes,porque puedo clasificar a la población por sexo biológico, que es una variable nominal dicotómica incluida en la base.

library(knitr)
library(kableExtra)

variables <- data.frame(
Variable = c("Glucosa en ayunas", "Perímetro de cintura"),
Codigo = c("glucemia", "per_cintura"),
Dominio = c("Bioquímico", "Antropométrico"),
Tipo = c("Cuantitativa continua", "Cuantitativa continua"),
Objetivo_analisis = c("Prueba t para una muestra", "Prueba t para dos muestras independientes")
)

kable(variables, "html", caption = "Variables que he seleccionado para el análisis inferencial") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Variables que he seleccionado para el análisis inferencial
Variable Codigo Dominio Tipo Objetivo_analisis
Glucosa en ayunas glucemia Bioquímico Cuantitativa continua Prueba t para una muestra
Perímetro de cintura per_cintura Antropométrico Cuantitativa continua Prueba t para dos muestras independientes

Supuestos estadísticos que voy a verificar

Como utilizaré pruebas paramétricas, es fundamental asegurar que mis variables cumplan con los supuestos teóricos que sustentan estas técnicas:

a) Normalidad de los datos

Revisaré la forma en que se distribuye cada variable mediante:

-Pruebas formales como Shapiro-Wilk

-Análisis gráfico con:

-Histogramas -Curvas de densidad -Gráficos Q-Q

Todo esto dado que la normalidad es un requisito clave para que la estimación de la media y la desviación estándar tengan validez como resumen central de la población.

b) Homogeneidad de varianzas (solo para dos muestras)

Utilizaré para ello: -Prueba de Levene -Prueba de Bartlett (cuando la normalidad sea adecuada)

Considero que este paso es esencial para decidir si aplicaré la t con varianzas iguales, o la t de Welch con varianzas desiguales.

c) Independencia de las observaciones

Confirmaré que cada estudiante corresponde a una sola medición, y que los grupos (niños y niñas) no se superponen, cumpliendo la estructura que exige la prueba t.

Pruebas estadísticas a utilizar

Una vez verificados los supuestos, realizaré las siguientes pruebas de contraste, seleccionadas por su coherencia con las hipótesis definidas:

1-Prueba t de Student para una muestra

La aplicaré a glucosa en ayunas, con el objetivo de comparar la media muestral frente al valor teórico de 100 mg/dL, pues esta prueba, según laliteratura de Clifford (Capítulo 5),es la más indicada cuando quiero evaluar si una media observada es estadísticamente distinta a un estándar poblacional, por lo cual, me permitirá responder si los escolares se comportan como lo esperado fisiológicamente.

-2.Prueba t de Student para dos muestras independientes

La aplicaré a perímetro de cintura, comparando niñas vs. niños, pues según la literatura revisada en clase,esta prueba es adecuado cuando, la variable es cuantitativa continua,cuando los grupos son independientes,y cuando quiero evaluar si existe diferencia en las medias poblacionales.

Si las varianzas resultan no ser homogéneas,entonces utilizaré la versión t de Welch, que me corrige esta diferencia sin afectar la validez del contraste. IC de la diferencia de medias

Procedimiento general del análisis

Para cada prueba realizaré los siguientes pasos(5 pasos de contraste):

-Formulación de hipótesis nula y alternativa

-Elección de la prueba adecuada, justificada según la naturaleza de la variable y los supuestos

-Cálculo del estadístico de prueba R, y que pienso realizar dicho cálculo mediante la función t.test()

-Obtención del valor p e intervalo de confianza, pues estos dos elementos serán esenciales para interpretar si existe evidencia estadística suficiente para rechazar la hipótesis nula.

De esta forma,relacionaré los resultados estadísticos con el marco fisiológico y epidemiológico del análisis metabólico.

Verificación de supuestos estadísticos

# librerías
library(tidyverse)
# Cargo la base de datos 
BaseMetabolismo <- readxl::read_excel("BaseMetabolismo.xlsx")
# mis variables de interés
glucosa <- BaseMetabolismo$glicemia
perimetro <- BaseMetabolismo$per__cintura
sexo <- BaseMetabolismo$sexo

Normalidad de la variable 1 (Glucosa en ayunas)

# Prueba de Shapiro-Wilk
shapiro_glucosa <- shapiro.test(BaseMetabolismo$glicemia)
shapiro_glucosa
## 
##  Shapiro-Wilk normality test
## 
## data:  BaseMetabolismo$glicemia
## W = 0.98615, p-value = 0.2352
# procedo a calcular estadísticos para anotaciones
media_glic <- mean(BaseMetabolismo$glicemia, na.rm = TRUE)
mediana_glic <- median(BaseMetabolismo$glicemia, na.rm = TRUE)

# Histograma y curva de densidad
ggplot(BaseMetabolismo, aes(x = glicemia)) +
  geom_histogram(aes(y = after_stat(density)), bins = 25, 
                 fill = "#48C9B0", color = "white", alpha = 0.85) +
  geom_density(color = "#E74C3C", linewidth = 1.2) +
  geom_vline(xintercept = media_glic, color = "#2980B9", 
             linetype = "dashed", linewidth = 1) +
  annotate("text", x = media_glic + 3, y = Inf, vjust = 2, 
           label = paste("Media:", round(media_glic, 1), "mg/dL"), 
           color = "#2980B9", fontface = "bold", size = 4.5) +
  labs(
    title = "Distribución de glucosa en ayunas",
    subtitle = paste0("Shapiro-Wilk: W = ", round(shapiro_glucosa$statistic, 4), 
                      " | p = ", round(shapiro_glucosa$p.value, 4)),
    x = "Glucosa (mg/dL)", 
    y = "Densidad"
  )

# Gráfico Q-Q
ggplot(BaseMetabolismo, aes(sample = glicemia)) +
  stat_qq(color = "#3498DB", size = 2.5, alpha = 0.7) +
  stat_qq_line(color = "#E74C3C", linewidth = 1.2) +
  labs(
    title = "Gráfico Q-Q para glucosa en ayunas",
    subtitle = "Si los puntos siguen la línea roja, la distribución es aproximadamente normal",
    x = "Cuantiles teóricos",
    y = "Cuantiles muestrales"
  )

Evaluación de normalidad en la variable Glucosa en ayunas

Para comenzar el análisis inferencial, primero evalué el supuesto de normalidad de la glucosa en ayunas, porque esta condición es esencial cuando deseo aplicar una prueba t de Student para una muestra.

La prueba de Shapiro–Wilk me permite determinar si la distribución observada se aleja o no de una distribución normal, mientras que los histogramas, las curvas de densidad y los gráficos Q-Q me permiten visualizar patrones como asimetrías o colas pronunciadas.

Histograma con curva de densidad,me muestra la forma general de la distribución de la glucosa en ayunas, donde observo una distribución unimodal, sin picos extremos ni asimetrías marcadas, y la curva de densidad se superpone de manera coherente a los datos,por lo que me sugiere que los valores siguen una forma cercana a la normal.

En el gráfico Q–Q los puntos se alinean de manera cercana a la línea diagonal, lo que me indica que los cuantiles que observo,se aproximan a los cuantiles teóricos de una distribución normal,por otro lado observo desviaciones leves en los extremos, lo cual creo que es esperable en datos reales y no sugiere una violación fuerte de normalidad.

En la prueba de Shapiro–Wilk, me ha arrojado un valor p mayor a 0.05 (p = 0.235), lo que significa que no hay evidencia estadística para rechazar la normalidad, por lo cual este resultado respalda lo que ya se observé en las gráficas.

En conjunto, las tres evaluaciones —histograma, gráfico Q–Q y prueba de Shapiro–Wilk— me muestran que la distribución de la glucosa en ayunas es compatible con una distribución normal, y me confirma que puedo aplicar pruebas paramétricas como la prueba t de una muestra sin violar el supuesto de normalidad.

-Procedo a evaluar normalidad del perímetro de cintura (per_cintura)

library(ggplot2)

media_pc <- mean(BaseMetabolismo$per__cintura, na.rm = TRUE)
de_pc <- sd(BaseMetabolismo$per__cintura, na.rm = TRUE)

ggplot(BaseMetabolismo, aes(x = per__cintura)) +
  geom_histogram(aes(y = after_stat(density)), binwidth = 2, 
                 fill = "#85C1E9", color = "white", alpha = 0.85) +
  geom_density(color = "#E74C3C", linewidth = 1.2) +
  stat_function(fun = dnorm, args = list(mean = media_pc, sd = de_pc),
                color = "#27AE60", linewidth = 1, linetype = "dashed") +
  geom_vline(xintercept = media_pc, color = "#2C3E50", 
             linetype = "dashed", linewidth = 0.8) +
  labs(
    title = "Distribución del perímetro de cintura",
    subtitle = paste0("Media: ", round(media_pc, 1), " cm | DE: ", round(de_pc, 1), " cm"),
    x = "Perímetro de cintura (cm)",
    y = "Densidad",
    caption = "Línea roja: densidad empírica | Línea verde: normal teórica"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    plot.caption = element_text(hjust = 0.5, face = "italic", size = 10)
  )

ggplot(BaseMetabolismo, aes(sample = per__cintura)) +
  stat_qq(color = "#9B59B6", size = 2, alpha = 0.7) +
  stat_qq_line(color = "#E74C3C", linewidth = 1.2) +
  labs(
    title = "Gráfico Q-Q del perímetro de cintura",
    subtitle = "Desviaciones en las colas me indican alejamiento de la normalidad",
    x = "Cuantiles teóricos",
    y = "Cuantiles muestrales"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40")
  )

Al revisar las gráficas del perímetro de cintura observo que la distribución se concentra principalmente entre 65 y 75 cm, con un patrón unimodal claro y una ligera extensión hacia valores más altos, lo que me sugiere una asimetría positiva esperable en variables antropométricas pediátricas, donde algunos escolares presentan mayor adiposidad central.

Considero que, aunque el histograma no muestra una simetría perfecta, la forma general de la distribución no evidencia distorsiones extremas, pero sí me indica la posibilidad de que las colas se comporten de manera diferente a lo que asumiría una distribución normal estricta.

Al revisar el gráfico Q-Q encuentro que la mayoría de los puntos siguen adecuadamente la línea teórica en la parte central, lo que respalda una aproximación a la normalidad en el núcleo de la distribución; sin embargo, en las colas observo desviaciones más marcadas, especialmente hacia la derecha, donde los valores más altos se separan visiblemente de la recta, lo cual me confirma la presencia de cierta asimetría, y dado que la normalidad es un supuesto clave para la aplicación de pruebas paramétricas, considero que esta combinación de hallazgos me obliga a verificar formalmente la normalidad mediante la prueba de Shapiro-Wilk y a evaluar la homogeneidad de varianzas, pues estas desviaciones pueden afectar la comparación entre grupos.

En conjunto, interpreto que el perímetro de cintura presenta un comportamiento aproximadamente normal en el centro de la distribución, pero con colas que requieren una verificación estadística más rigurosa; por tanto, procederé con las pruebas formales para decidir si es apropiado aplicar la prueba t de Student tradicional o si debo emplear la versión de Welch, más robusta cuando hay varianzas desiguales.

Prueba de normalidad para perímetro de cintura

# Prueba de normalidad Shapiro-Wilk para perímetro de cintura
shapiro_per_cintura <- shapiro.test(BaseMetabolismo$per__cintura)
shapiro_per_cintura
## 
##  Shapiro-Wilk normality test
## 
## data:  BaseMetabolismo$per__cintura
## W = 0.94351, p-value = 5.246e-05

Al revisar el resultado de la prueba de Shapiro-Wilk para el perímetro de cintura encuentro que el valor p obtenido (p = 5.246e-05) es mucho menor que 0.05, por lo que considero que existe evidencia estadística suficiente para rechazar la hipótesis nula de normalidad.

Esto significa que, desde el punto de vista estrictamente estadístico, la distribución del perímetro de cintura en esta cohorte no sigue un patrón normal, además cuando comparo este resultado con lo que observé previamente en el histograma y en el gráfico Q-Q, confirmo que el comportamiento de los datos muestra asimetría hacia valores más altos y desviaciones visibles en los extremos, especialmente en la cola superior donde observo un grupo de escolares con perímetros de cintura más amplios, ahora dado que ambas evaluaciones me coinciden, considero que el perímetro de cintura presenta una distribución que se aleja de la simetría esperada en datos normales.

Esto implica que, para garantizar un contraste válido entre grupos, no debo asumir igual comportamiento estadístico que el observado en la glucemia, por lo que siendo esta una razón, y con el fin de no violar los supuestos paramétricos, debo verificar la homogeneidad de varianzas y, con base en ello, decidir si aplicaré la prueba t clásica o si optaré por la versión de Welch, que es más robusta cuando las distribuciones no son normales o las varianzas son desiguales.

# Convierto la variable sexo a factor para análisis categóricos
BaseMetabolismo$sexo <- factor(BaseMetabolismo$sexo, 
                                levels = c(0, 1), 
                                labels = c("Femenino", "Masculino"))

Realizo un boxplot por sexo para evaluar gráficamente varianzas

# Realizo un boxplot por sexo para evaluar graficamente varianzas
library(ggplot2)

ggplot(BaseMetabolismo, aes(x = sexo, y = per__cintura, fill = sexo)) +
  geom_boxplot(alpha = 0.7, outlier.colour = "red", outlier.size = 2) +
  scale_fill_manual(values = c("Femenino" = "#F5B7B1", "Masculino" = "#7FB3D5")) +
  labs(
    title = "Perimetro de cintura por sexo",
    subtitle = "Evaluacion grafica de la homogeneidad de varianzas",
    x = "Sexo biologico",
    y = "Perimetro de cintura (cm)"
  ) +
  theme_minimal(base_size = 14) +
  theme(legend.position = "none")

Prueba de Levene para homogeneidad de varianzas

# Prueba de Levene para homogeneidad de varianzas
library(car)

leveneTest(per__cintura ~ sexo, data = BaseMetabolismo)

Al observar el diagrama de cajas del perímetro de cintura según sexo, noto que las distribuciones visualmente se superponen de manera importante y que la dispersión entre ambos grupos no me muestra diferencias marcadas; aunque existen algunos valores extremos hacia arriba y hacia abajo, estos parecen distribuidos sin un patrón que me sugiera una mayor variabilidad en un sexo específico,además, la amplitud del rango intercuartílico es similar, lo cual me hace pensar preliminarmente que las varianzas podrían ser comparables.

Esta impresión inicial que he tenido, se confirma estadísticamente con la prueba de Levene, cuyo valor p = 0.1938 es mayor que el umbral habitual de 0.05, por lo que concluyo que no tengo evidencia suficiente para rechazar la hipótesis de igualdad de varianzas.

En otras palabras, tanto visual como analíticamente encuentro que la variabilidad del perímetro de cintura es homogénea entre los grupos de sexo, lo cual es un elemento clave porque me indica que, a pesar de los valores atípicos presentes, el supuesto de homogeneidad de varianzas requerido para aplicar una prueba t clásica (Student) no se ve comprometido, y esta coherencia entre la evaluación gráfica y la evaluación estadística me da confianza para realizar un análisis comparativo entre los dos grupos.

# Prueba t para comparar perímetro de cintura entre sexos
t.test(per__cintura ~ sexo,
       data = BaseMetabolismo,
       var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  per__cintura by sexo
## t = -0.39127, df = 123, p-value = 0.6963
## alternative hypothesis: true difference in means between group Femenino and group Masculino is not equal to 0
## 95 percent confidence interval:
##  -4.487676  3.006342
## sample estimates:
##  mean in group Femenino mean in group Masculino 
##                67.28200                68.02267

Al revisar los resultados de la prueba t de dos muestras independientes observo que la diferencia en el perímetro de cintura entre los dos sexos es mínima, con una media de 67.28 cm en el grupo 0 y 68.02 cm en el grupo 1, lo cual ya me dice que, a nivel descriptivo, ambos grupos son bastante similares.

El estadístico t que obtuve es de −0.391 con 123 grados de libertad y un valor p de 0.6963,por lo que considero que esta diferencia tan pequeña podría deberse fácilmente al azar y que no existe evidencia estadística para afirmar que los promedios difieran entre sí.

Al revisar el intervalo de confianza del 95 %, que va desde −4.49 hasta 3.01 cm, encuentro que el rango me incluye el cero, lo cual considero que hay ausencia de diferencia real entre los sexos, además en el mejor de los escenarios, la diferencia potencial sería muy pequeña y sin relevancia práctica, asi que esto es consistente con lo observado previamente en los gráficos exploratorios, donde las distribuciones me mostraban solapamiento considerable y medianas muy cercanas entre los grupos.

En conjunto, estos resultados me permiten concluir que el perímetro de cintura no varía de forma significativa entre los dos sexos de esta muestra y que cualquier diferencia observada es atribuible a variabilidad normal en los datos más que a un efecto real o clínicamente importante.

BaseMetabolismo %>%
  group_by(sexo) %>%
  summarise(
    n = n(),
    media = mean(per__cintura, na.rm = TRUE),
    sd = sd(per__cintura, na.rm = TRUE),
    mediana = median(per__cintura, na.rm = TRUE),
    IQR = IQR(per__cintura, na.rm = TRUE),
    min = min(per__cintura, na.rm = TRUE),
    max = max(per__cintura, na.rm = TRUE)
  )

las medidas descriptivas del perímetro de cintura según el sexo biológico, me muestra que el tamaño muestral es diferente entre los grupos, con 50 participantes en el grupo 0 y 75 en el grupo 1, donde esta diferencia de tamaños no me invalida la comparación, pero sí explica en parte la variabilidad ligeramente mayor que observo en el segundo grupo.

En términos de tendencia central, encuentro que las medias son prácticamente iguales entre ambos grupos:

67.28 cm en sexo 0 y 68.02 cm en sexo 1, una diferencia de menos de un centímetro que, clínicamente, parece irrelevante.

La mediana me confirma este patrón, con valores de 65.6 cm y 67 cm respectivamente, lo cual considero que la posición central de ambas distribuciones es muy similar y que no hay un desplazamiento notable de una distribución respecto a la otra.

Al examinar la dispersión, considero que las desviaciones estándar de 9.39 cm y 10.96 cm, junto con los rangos intercuartílicos de 9.63 cm y 11.75 cm, me dice que en ambos grupos se presenta una variabilidad comparable, aunque el grupo 1 muestra una dispersión ligeramente mayor, consistente con lo que vi en la prueba de Levene donde no se encontré diferencias significativas de varianza.

También observo que los valores mínimos y máximos (53–101 cm en sexo 0 y 34.6–94 cm en sexo 1) muestran amplitudes relativamente amplias, lo cual puede indicar la presencia de niños con perímetros muy pequeños o muy grandes, algo razonable con lo que observé en los boxplots y en el QQ-plot, por lo cual creo que la distribución no es completamente normal y que existen algunos valores extremos.

Cálculo del tamaño del efecto (Cohen’s d) Este cálculo me sirve para saber cuán grande es la diferencia real, independientemente del p-valor.

library(effsize)
cohen.d(per__cintura ~ sexo, data = BaseMetabolismo)
## 
## Cohen's d
## 
## d estimate: -0.07143639 (negligible)
## 95 percent confidence interval:
##      lower      upper 
## -0.4329414  0.2900687

Al calcular el tamaño del efecto mediante el estadístico d de Cohen encuentro que el valor obtenido es de –0.07, una magnitud considerada despreciable según los criterios clásicos de interpretación en la literaura, por lo cual este valor tan pequeño me indica que la diferencia entre los promedios del perímetro de cintura en los dos grupos de sexo es prácticamente nula cuando se expresa en unidades de desviación estándar, lo cual coincide con lo que hallé en los estadísticos descriptivos y en la prueba t, donde las medias fueron muy similares y el valor p no me mostró evidencia de diferencia estadísticamente significativa.

Además, cuando reviso el intervalo de confianza del 95%, que va desde –0.43 hasta 0.29, observo que este rango incluye valores negativos y positivos que siguen siendo pequeños y que atraviesan el cero, lo cual creo que no existe un efecto real consistente en ninguna dirección.

También me parece importante que los límites del intervalo nunca entran en la zona típica de efectos moderados o grandes, lo que me sugiere que incluso si existiera una diferencia verdadera en la población, esta sería muy pequeña y poco relevante desde una perspectiva clínica o epidemiológica.

Visualización del intervalo de confianza

Para complementar la interpretación numérica del t-test, elaboraré un gráfico del intervalo de confianza del 95 % para la diferencia de medias, pues es útil porque permite ver de forma intuitiva si la diferencia estimada podría incluir el valor cero.

library(ggplot2)

t_res <- t.test(per__cintura ~ sexo, data = BaseMetabolismo, var.equal = TRUE)
diferencia <- diff(t_res$estimate)
IC_inf <- t_res$conf.int[1]
IC_sup <- t_res$conf.int[2]
p_valor <- t_res$p.value

df_plot <- data.frame(
  grupo = "Diferencia\n(Masculino - Femenino)",
  dif = diferencia,
  IC_inf = IC_inf,
  IC_sup = IC_sup
)

ggplot(df_plot, aes(x = grupo, y = dif)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "#E74C3C", linewidth = 1) +
  geom_errorbar(aes(ymin = IC_inf, ymax = IC_sup),
                width = 0.15, color = "#3498DB", linewidth = 1.5) +
  geom_point(size = 6, color = "#2C3E50") +
  geom_text(aes(label = paste0(round(dif, 2), " cm")), 
            vjust = -1.8, fontface = "bold", size = 5) +
  annotate("text", x = 1, y = IC_sup + 0.8,
           label = paste0("p = ", round(p_valor, 4)),
           size = 5, fontface = "bold", 
           color = ifelse(p_valor < 0.05, "#27AE60", "#7F8C8D")) +
  annotate("text", x = 1, y = IC_inf - 0.5, 
           label = paste0("IC 95%: [", round(IC_inf, 2), "; ", round(IC_sup, 2), "]"),
           size = 4, color = "#2980B9") +
  labs(
    title = "Intervalo de confianza del 95% para la diferencia de medias",
    subtitle = "Comparación del perímetro de cintura entre sexos",
    y = "Diferencia de medias (cm)",
    x = ""
  ) +
  theme_minimal(base_size = 15) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40")
  ) +
  coord_flip()

En este caso, la barra del intervalo atraviesa el cero, por lo que no observo una diferencia significativa entre los grupos y cualquier variación parece atribuible al azar muestral.

Realizaré ahora una comparación con una prueba NO paramétrica (Mann-Whitney/Wilcoxon)

# Prueba no paramétrica de Mann-Whitney/Wilcoxon
wilcox.test(per__cintura ~ sexo, data = BaseMetabolismo)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  per__cintura by sexo
## W = 1755.5, p-value = 0.5486
## alternative hypothesis: true location shift is not equal to 0

Al aplicar la prueba no paramétrica de Wilcoxon para comparar el perímetro de cintura entre los dos grupos de sexo observo que el valor p es 0.5486, lo cual está muy por encima del umbral habitual de significación, por lo que incluso cuando utilizo un método que no exige normalidad y que trabaja con los rangos de los datos, no encuentro evidencia estadística que sugiera una diferencia real en la distribución del perímetro de cintura entre hombres y mujeres.

Al revisar el estadístico W y la forma en que esta prueba detecta cambios en la mediana y en la ubicación general de las observaciones, concluyo que los patrones de dispersión y ordenamiento de los valores son muy similares entre ambos grupos, lo que coincide con lo que observé previamente en los diagramas de caja, los estadísticos descriptivos y los resultados de la prueba t.

Este hallazgo me confirma aun más que ante cualquier diferencia aparente entre los grupos es mínima y puedo atribuirla al azar, y además me confirma que la conclusión es consistente tanto para métodos paramétricos como para métodos no paramétricos.

En conjunto, considero que el sexo biológico no introduce un desplazamiento significativo en la distribución del perímetro de cintura y que los datos apoyan la ausencia de un efecto real entre estas dos categorías.

Análisis de outliers

boxplot.stats(BaseMetabolismo$per__cintura)$out
## [1]  89.0  91.0  34.6  91.0 101.0  90.0  94.0  90.3

Al explorar los valores atípicos del perímetro de cintura observo que el algoritmo del diagrama de caja me identifica varias observaciones que se ubican fuera del rango esperado según ello que se conoe como criterio clásico de Tukey** , que utiliza la distancia de 1.5 veces el rango intercuartílico.

Este criterio no es más que una regla estadística que se utiliza según la literatura, para identificar valores atípicos en un conjunto de datos, propuesto por el estadístico John Tukey , siendo este el método estándar que se usan en los diagramas de caja (boxplots) para decidir qué puntos me quedan “por fuera” de lo esperado.

Por lo cual, se calculan tres elementos fundamentales de la distribución:

-Primer cuartil (Q1): que es el valor que deja el 25 % de los datos por debajo.

_Tercer cuartil (Q3): es el valor que deja el 75 % de los datos por debajo.

Rango intercuartílico (IQR): que es la diferencia entre Q3 y Q1, y representa el “cuerpo central” de los datos, donde se concentra la mayoría de valores.

Tukey plantea que un valor se considera atípico cuando está muy lejos del cuerpo central de la distribución, y para definir “muy lejos”, está el siguiente criterio:

#Límite inferior de Q1 – 1.5 × IQR # y el Límite superior: Q3 + 1.5 × IQR

Por lo cual todo valor menor al límite inferior o mayor al límite superior lo debo marcar como outlier (atípico).

Por tal motivo, si un dato está más allá de esa distancia multiplicada por 1.5, es poco probable que pertenezca al comportamiento típico del conjunto, asi que cuando en el boxplot me muestra puntos aislados por encima o por debajo de los “bigotes”, significa que el rango está fuera de lo normal según el criterio de Tukey”, pero además si tengo una dato atípico, no significa automáticamente que esta mal o que es un error, sino simplemente que el valor es inusual respecto al resto.

Por lo cual volviendo a los valores,encuentro mediciones superiores a 89, 90, 91, 94 y hasta 101 cm, además de un valor aislado de 34.6 cm en el extremo inferior, por lo que creo que corresponden más a variabilidad natural de la población que a errores de digitación, ya que todos permanecen dentro de rangos biológicamente plausibles para adolescentes.

También noto que estos valores, aunque extremos, no son suficientemente distantes como para distorsionar la media ni la desviación estándar, y esto coincide con la homogeneidad de varianzas que encontré previamente,además de la ausencia de diferencias significativas en las pruebas t y Wilcoxon.

Por tanto, concluyo que estos outliers representan casos reales que amplían ligeramente la dispersión del grupo, pero no alteran de manera importante el análisis ni me sugieren la necesidad de excluirlos.

library(ggplot2)

outliers_vals <- boxplot.stats(BaseMetabolismo$per__cintura)$out
n_outliers <- length(outliers_vals)

ggplot(BaseMetabolismo, aes(x = "", y = per__cintura)) +
  geom_boxplot(fill = "#F7DC6F", color = "#2C3E50", 
               outlier.colour = "#E74C3C", outlier.size = 4,
               outlier.shape = 19, width = 0.4, alpha = 0.8) +
  stat_summary(fun = mean, geom = "point", shape = 18, 
               size = 5, color = "#2980B9") +
  labs(
    title = "Perímetro de cintura: identificación de valores atípicos",
    subtitle = paste0("Método de Tukey (1.5 × IQR) | Se identificaron ", 
                      n_outliers, " valores atípicos | ◆ = Media"),
    y = "Perímetro de cintura (cm)",
    x = ""
  ) +
  theme_minimal(base_size = 16) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    axis.text.x = element_blank()
  )

**la mayoría de los valores del perímetro de cintura se concentran en la parte central del gráfico, alrededor de la mediana y dentro del rango intercuartílico, sin embargo, aparecen varios puntos rojos ubicados por encima de los 90 cm y uno claramente por debajo de los 40 cm.

Estos puntos representan valores atípicos según el criterio de Tukey, lo que significa que se alejan más de lo que normalmente se espera en comparación con el resto de la distribución, por lo que aunque son inusuales, no necesariamente me indican error; simplemente muestran que algunas personas presentan perímetros significativamente mayores o menores que la tendencia general del grupo.

Conclusión de mi análisis inferencial

Al finalizar este análisis inferencial considero que pude integrar, de manera coherente, cada uno de los elementos que componen una comparación paramétrica, pues es importante no solo evaluar el valor p, sino poder comprender qué implica cada prueba, qué evalúa, qué puedo asumir y por qué sus resultados tienen sentido o no dentro del comportamiento metabólico de esta cohorte escolar.

Cuando evalué la glucosa en ayunas como variable para una prueba t de una muestra, me planteé una hipótesis sobre si la media observada se alejaba o no de un valor teórico considerado fisiológicamente normal, por lo cual revisé el supuesto de normalidad mediante Shapiro–Wilk y estudios gráficos, y confirmé que era válido avanzar con una prueba paramétrica.

Este ejercicio me enseñó que la inferencia no se trata simplemente de “hacer una prueba”, sino de comprobar si mis datos cumplen las condiciones que le dan validez al procedimiento, asi que en este sentido, la prueba t de una muestra me permitió cuantificar si la glucosa real de los escolares se comportaba como lo esperado.

Luego, al comparar el perímetro de cintura entre sexos, pude ver cómo se integran varios conceptos al mismo tiempo, pues la normalidad no se cumplió estrictamente, pero también comprobé que la prueba t es robusta ante pequeñas desviaciones cuando el tamaño muestral es moderado, y que la homogeneidad de varianzas, evaluada con Levene, sí se cumplió, permitiéndome usar la versión clásica de la prueba.

Este proceso me hizo reflexionar sobre la importancia de los supuestos, dado que si la varianza hubiera sido desigual, la prueba adecuada habría sido la t de Welch, y si la distribución hubiera sido muy asimétrica, habría tenido que depender más del enfoque no paramétrico.

La t de Student me mostró un resultado claro, de que no existe una diferencia estadísticamente significativa entre los promedios de perímetro de cintura en niños y niñas, sin embargo,más allá de eso, el intervalo de confianza incluyó el cero, lo cual me refuerza que la diferencia no solo no es significativa, sino que incluso en el mejor de los escenarios posibles sigue siendo mínima.

Este detalle me ayudó a comprender por qué un intervalo de confianza aporta información más completa que un valor p aislado, además el tamaño del efecto mediante Cohen’s d me confirmó un aspecto fundamental, y es que incluso cuando una diferencia pudiera llegar a ser significativa en otras condiciones, su magnitud es tan pequeña que no tiene peso clínico.

Un d de –0.07 me dice, en palabras simples, que ambos grupos son prácticamente iguales cuando comparo su perímetro de cintura en unidades de desviación estándar, por lo que entendí que la relevancia clínica y la relevancia estadística no siempre van de la mano y que ambas deben analizarse juntas para tomar decisiones informadas.

El uso de la prueba no paramétrica de Wilcoxon me permitió verificar que mis conclusiones no dependían estrictamente de la normalidad, pues cuando observé que este método alternativo arrojaba el mismo resultado que la prueba paramétrica, comprendí la importancia de contrastar resultados desde más de una perspectiva, especialmente cuando tengo variables antropométricas que suelen tener más asimetrías y outliers que los marcadores bioquímicos.

Finalmente, el análisis de valores atípicos bajo el criterio de Tukey me ayudó a entender que la presencia de outliers no es equivalente a error, pues al contrario, estos valores pueden estar reflejando la variabilidad real de los escolares, lo cual permite identificar que, aunque existan perímetros de cintura más altos o más bajos de lo esperado, estos no distorsionaron el análisis ni violaron los supuestos fundamentales de la comparación.

Este hallazgo considero que tiene mucha importancia para evaluar si un valor atípico afecta o no la prueba, más allá de simplemente detectarlo.

3 PRUEBAS NO PARAMÉTRICAS

Introducción

En el análisis descriptivo previo al inicio de los talleres, sobre esta base de datos, de la cual logré caracterizar individualmente las variables demográficas, clínicas, antropométricas y bioquímicas de una cohorte de 125 escolares colombianos,de la ciudad de Bucaramanga, por lo cual,describir la distribución de una variable en forma aislada, aunque fundamental, representa solo el primer nivel del razonamiento epidemiológico,pues la verdadera complejidad del riesgo metabólico infantil no reside en valores individuales, sino en las relaciones funcionales entre variables, es decir, en cómo los niveles de triglicéridos difieren entre niñas y niños, o cómo la fuerza muscular cambia entre la mano dominante y la no dominante.

Aquí es donde la estadística bivariada considero que adquiere su relevancia metodológica, pues mientras que la estadística univariada me permitió responder preguntas del tipo “¿cuál es la mediana de triglicéridos en la población?”, la estadística bivariada me habilita para explorar interrogantes más profundos: “¿existen diferencias significativas en los triglicéridos según el sexo biológico?” o “¿la fuerza muscular difiere entre ambas manos?”, por lo que este salto conceptual, de la descripción a la comparación, constituye la base del contraste de hipótesis y la inferencia estadística que hemos visto en clase.

Definición y alcance de la estadística bivariada

La estadística bivariada se define como el conjunto de técnicas que permiten analizar simultáneamente dos variables para determinar si existe asociación, diferencia o relación entre ellas (Daniel,4 edic. 2018), sin embargo, a diferencia del análisis univariado, que resume una sola variable mediante promedios o frecuencias, el análisis bivariado confronta dos variables para evaluar si los cambios en una se relacionan con modificaciones en la otra.

En el contexto de estudios epidemiológicos como este, la estadística bivariada me permite operacionalizar hipótesis clínicas relevantes, por ejemplo, si sospecho que el sexo biológico influye en el perfil lipídico, puedo contrastar formalmente esta hipótesis comparando los niveles de triglicéridos entre niñas y niños, además, la estadística bivariada me facilita la identificación de grupos de riesgo diferencial, pues al comparar subgrupos definidos por características demográficas o clínicas, puedo detectar poblaciones más vulnerables que requieren intervenciones preventivas específicas.

En cuanto a la selección entre técnicas paramétricas y no paramétricas depende fundamentalmente de las características distribucionales de los datos, por lo que las pruebas paramétricas, como la t de Student, asumen que los datos provienen de poblaciones con distribución normal y homogeneidad de varianzas, tal como lo he analizado en lo ejercicios de clase anteriores, sin embargo, en datos biomédicos reales, estas suposiciones frecuentemente se violan debido a la presencia de valores atípicos, distribuciones asimétricas o tamaños de muestra desiguales entre grupos, por lo que entonces, las pruebas no paramétricas constituyen una alternativa robusta y flexible que no requiere supuestos distribucionales estrictos.

Estas pruebas trabajan sobre los rangos de los datos en lugar de sus valores absolutos, lo que las hace resistentes a outliers y distribuciones asimétricas.En esta base en particular, se trata de una población pediátrica, donde variables como triglicéridos, colesterol o perímetro de cintura suelen presentar distribuciones sesgadas debido a la variabilidad biológica puberal,por lo que las pruebas no paramétricas me ofrecen una mayor validez inferencial.

Considero que en este análisis, el uso de pruebas no paramétricas se justifica plenamente por tres razones:

-primero, porque varias de las variables bioquímicas y antropométricas presentan distribuciones no normales

-segundo, porque los tamaños de muestra entre grupos (50 niñas vs. 75 niños) son moderados y desiguales

y tercero, porque estas técnicas me permiten responder las mismas preguntas de investigación con mayor robustez metodológica.

Objetivo del análisis

El objetivo de este análisis es aplicar técnicas de comparación estadística no paramétrica para evaluar diferencias entre grupos (independientes y relacionados) y asociaciones entre variables categóricas, utilizando datos de la cohorte de escolares colombianos, por lo que resalto específicamente, que busco determinar si existen diferencias significativas en marcadores bioquímicos según sexo, si la fuerza muscular difiere entre manos dominante y no dominante, y si existe asociación entre variables demográficas y condiciones de salud.

Este análisis me permitirá transitar del conocimiento descriptivo hacia la inferencia estadística, generando evidencia sobre patrones diferenciales de riesgo metabólico que podrían orientar en la vida real, estrategias de prevención primaria en población escolar.

BaseMetabolismo <- read_excel ("BaseMetabolismo.xlsx")

# Limpio filas vacías
BaseMetabolismo <- BaseMetabolismo %>% drop_na(cod_iden)

# Vista general
cat("=== ESTRUCTURA DE LA BASE ===\n")
## === ESTRUCTURA DE LA BASE ===
dim(BaseMetabolismo)
## [1] 125  25
str(BaseMetabolismo)
## tibble [125 × 25] (S3: tbl_df/tbl/data.frame)
##  $ cod_iden     : num [1:125] 5 15 16 17 18 20 23 24 27 29 ...
##  $ fecha_nacim  : POSIXct[1:125], format: "2000-01-01" "2000-01-27" ...
##  $ fecha_corte  : POSIXct[1:125], format: "2011-07-26" "2011-07-26" ...
##  $ sexo         : num [1:125] 0 1 1 0 1 0 1 0 1 0 ...
##  $ edad         : num [1:125] 11 11 11 11 11 12 11 12 11 11 ...
##  $ estrato_fse  : num [1:125] 2 1 1 3 1 1 4 1 2 2 ...
##  $ CRF_shuttles : num [1:125] 2.4 4.6 5.7 3.6 2.3 ...
##  $ pas          : num [1:125] 122 123 113 95 121 101 103 103 125 112 ...
##  $ pad          : num [1:125] 80 79 74 62 68 71 74 77 64 76 ...
##  $ talla        : num [1:125] 1.53 1.4 1.51 1.42 1.49 ...
##  $ peso         : num [1:125] 52.4 33.3 45.1 33.9 58.4 ...
##  $ per__cintura : num [1:125] 78 59.4 67 66 88 ...
##  $ per__cadera  : num [1:125] 92.2 77.6 84 73 95 ...
##  $ tanner       : num [1:125] 3 1 2 1 2 2 1 3 2 1 ...
##  $ f__mano_do   : num [1:125] 20 15 22 17 23 24 14 17 21.5 15 ...
##  $ f__mano_no_do: chr [1:125] "21.5" "16" "23.5" "15.5" ...
##  $ %_grasa_corp : num [1:125] 30.8 18.4 16.8 19.5 34.9 ...
##  $ ___grasa_plie: num [1:125] 30.3 24.3 17.4 22.8 51.2 ...
##  $ glicemia     : num [1:125] 97 94 99 86 99 105 97 90 95 82 ...
##  $ col_total    : num [1:125] 153 194 171 180 150 215 151 173 198 186 ...
##  $ hdl          : num [1:125] 47 60 52 42 46 46 109 112 39 90 ...
##  $ ldl          : num [1:125] 96.4 111.4 109.2 125 94.6 ...
##  $ tag          : num [1:125] 48 113 49 65 47 81 67 95 114 85 ...
##  $ hta          : num [1:125] 2 0 0 1 0 0 0 1 1 0 ...
##  $ obesidad     : num [1:125] 2 0 1 0 0 0 3 0 1 0 ...
# Resumen de variables clave
summary(BaseMetabolismo[, c("edad", "sexo", "tag", "f__mano_do", "f__mano_no_do", "obesidad")])
##       edad            sexo          tag           f__mano_do   
##  Min.   : 9.00   Min.   :0.0   Min.   : 12.00   Min.   : 9.00  
##  1st Qu.:11.00   1st Qu.:0.0   1st Qu.: 57.00   1st Qu.:13.00  
##  Median :11.00   Median :1.0   Median : 77.00   Median :16.00  
##  Mean   :11.08   Mean   :0.6   Mean   : 86.53   Mean   :16.42  
##  3rd Qu.:11.00   3rd Qu.:1.0   3rd Qu.:103.00   3rd Qu.:19.00  
##  Max.   :14.00   Max.   :1.0   Max.   :324.00   Max.   :27.00  
##  f__mano_no_do         obesidad    
##  Length:125         Min.   :0.000  
##  Class :character   1st Qu.:0.000  
##  Mode  :character   Median :0.000  
##                     Mean   :0.696  
##                     3rd Qu.:1.000  
##                     Max.   :3.000
# Verifico valores faltantes
cat("\n=== VALORES FALTANTES ===\n")
## 
## === VALORES FALTANTES ===
colSums(is.na(BaseMetabolismo))
##      cod_iden   fecha_nacim   fecha_corte          sexo          edad 
##             0             0             0             0             0 
##   estrato_fse  CRF_shuttles           pas           pad         talla 
##             0             0             0             0             0 
##          peso  per__cintura   per__cadera        tanner    f__mano_do 
##             0             0             0             0             0 
## f__mano_no_do  %_grasa_corp ___grasa_plie      glicemia     col_total 
##             0             0             0             0             0 
##           hdl           ldl           tag           hta      obesidad 
##             0             0             0             0             0

Interpretación

Al explorar la estructura de la base BaseMetabolismo, observo que cuento con 125 observaciones completas sin valores faltantes, lo cual representa una fortaleza metodológica importante, pues me permite realizar inferencias válidas sin preocuparme por sesgos derivados de datos incompletos o imputaciones.

La distribución etaria muestra una mediana de 11 años (rango: 9-14 años), lo que me sitúa en una ventana biológica crítica donde coexisten niños prepuberales y puberales, donde esta heterogeneidad es tan importante ya que sucede durante la pubertad, donde se produce una resistencia fisiológica transitoria a la insulina y que puede impactar los marcadores metabólicos; por tanto, cualquier diferencia que encuentre en adelante entre grupos deberé interpretar considerando esta variabilidad biológica inherente.

En cuanto al sexo, la media de 0.6 me indica que aproximadamente el 60% de la muestra es masculina y el 40% femenina, lo que genera grupos desiguales (n₁ ≠ n₂). Esta desigualdad en los tamaños de muestra, considero que una razón importante para preferir pruebas no paramétricas, pues las pruebas paramétricas como la t de Student son más sensibles a violaciones de homogeneidad de varianzas cuando los grupos son desiguales.

Al analizar los triglicéridos (TAG), observo una distribución claramente asimétrica, donde la media (86.53 mg/dL) supera notablemente la mediana (77 mg/dL), lo que puede ser un sesgo hacia valores altos, además, el rango extremadamente amplio (12-324 mg/dL) y la presencia de un valor máximo muy alejado del tercer cuartil (103 mg/dL) me señalan la existencia de outliers.

Esta asimetría y la presencia de valores atípicos son precisamente las condiciones que me hacen justificar el uso de pruebas no paramétricas, pues trabajar con rangos en lugar de valores absolutos me protegerá de la influencia desproporcionada de estos extremos.

Respecto a obesidad, la mediana de 0 y la media de 0.696considero que indican que la mayoría de los escolares se concentra en las categorías bajas (bajo peso o peso normal), con una distribución que no es uniforme entre las cuatro categorías, asi que esta concentración en categorías específicas es relevante para la prueba de Chi-cuadrado, pues me obligará a verificar que no existan celdas con frecuencias esperadas menores a 5, condición que podría invalidar la prueba.

al revisar la estructura y dimensiones de la base, he detectado un pequeño detalle técnico con la variable f__mano_no_do, que está codificada como character en lugar de numérica, por lo que voy a realizar la conversión paraa los analisis siguientes como la prueba de Wilcoxon para muestras pareadas, pues de lo contrario R no podría calcularme diferencias numéricas entre las mediciones de fuerza de ambas manos.

BaseMetabolismo <- BaseMetabolismo %>%
  mutate(f__mano_no_do = as.numeric(f__mano_no_do))

str(BaseMetabolismo$f__mano_no_do)
##  num [1:125] 21.5 16 23.5 15.5 22 22 12 16 20 16 ...
summary(BaseMetabolismo$f__mano_no_do)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.00   13.00   16.00   15.96   18.00   32.00

Al analizar los estadísticos descriptivos de la fuerza prensil de la mano no dominante, encuentro:

Mediana: 16.00 kg Media: 15.96 kg Rango: 8-32 kg Q1-Q3: 13-18 kg

Primero, me parece llamativo que las medianas sean idénticas (16 kg en ambas manos), lo cual podría sugerirme ausencia de diferencias, sin embargo, la media de la mano dominante es ligeramente superior (16.42 vs 15.96 kg), lo que indica que la distribución podría estar sesgada de manera diferente en cada grupo.

Segundo, el máximo de la mano no dominante (32 kg) supera al de la mano dominante (27 kg), lo cual es interesante desde el punto de vista biomecánico y podría señalar un error de registro o un caso excepcional donde la lateralidad reportada no coincide con la dominancia funcional real, por lo cual deberé tener atención al momento de interpretar.

ANÁLISIS 1: MANN-WHITNEY - TAG según SEXO

Mi pregunta de investigación:

¿Existen diferencias significativas en los niveles de triglicéridos séricos entre niñas y niños?

Hipótesis estadísticas:

H₀ (Hipótesis Nula): No existen diferencias significativas en la distribución de triglicéridos entre niñas y niños; las medianas de ambos grupos son iguales.

H₁ (Hipótesis Alternativa): Existen diferencias significativas en la distribución de triglicéridos entre ambos grupos; las medianas difieren.

Nivel de significancia que elijo: α = 0.05 Criterio de decisión: Si p-value < 0.05, rechazo H₀.

BaseMetabolismo <- BaseMetabolismo %>%
  mutate(sexo_label = factor(sexo, levels = c(0, 1), labels = c("Femenino", "Masculino")))

table(BaseMetabolismo$sexo_label)
## 
##  Femenino Masculino 
##        50        75
BaseMetabolismo %>%
  group_by(sexo_label) %>%
  summarise(
    n = n(),
    Mediana = median(tag),
    Media = mean(tag),
    DE = sd(tag),
    Q1 = quantile(tag, 0.25),
    Q3 = quantile(tag, 0.75),
    Min = min(tag),
    Max = max(tag)
  )
test_mw <- wilcox.test(tag ~ sexo_label, data = BaseMetabolismo, exact = FALSE)
print(test_mw)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  tag by sexo_label
## W = 2034, p-value = 0.4244
## alternative hypothesis: true location shift is not equal to 0
W_statistic <- test_mw$statistic
n_total <- nrow(BaseMetabolismo)
Z_approx <- qnorm(test_mw$p.value/2, lower.tail = FALSE)
r_effect <- abs(Z_approx) / sqrt(n_total)

cat("\n=== TAMAÑO DEL EFECTO ===\n")
## 
## === TAMAÑO DEL EFECTO ===
cat("r de Rosenthal:", round(r_effect, 3), "\n")
## r de Rosenthal: 0.071

Resultados para interpretar

Al examinar la distribución por sexo biológico en mi muestra, observo que cuento con 50 niñas (40%) y 75 niños (60%), lo que me confirma el desbalance muestral que había anticipado en la exploración inicial, pues esta desigualdad numérica, si bien no invalida la prueba de Mann-Whitney, sí representa una consideración metodológica importante que debo tener presente al interpretar los resultados.

Análisis descriptivo de triglicéridos

Al comparar los estadísticos descriptivos de triglicéridos entre ambos grupos, encuentro un patrón que me parece llamativo, pues las niñas presentan una mediana de 75 mg/dL versus los niños con 78 mg/dL, lo cual representa una diferencia de apenas 3 mg/dL entre medianas, sin embargo, cuando miro las medias, observo que las niñas tienen 91.48 mg/dL mientras que los niños tienen 83.23 mg/dL, mostrando una inversión del patrón.

Esta discrepancia entre mediana y media me resulta reveladora, pues me indica que la distribución de triglicéridos en niñas está más sesgada hacia valores altos que en niños, de hecho, al revisar los valores extremos, noto que el máximo en niñas alcanza 324 mg/dL, un valor clínicamente muy elevado que supera ampliamente el máximo en niños (201 mg/dL), por lo que este valor atípico extremo en el grupo femenino me está “jalando” la media hacia arriba, por lo que considero que la mediana es un mejor indicador de tendencia central en este contexto.

Además, observo que la desviación estándar en niñas (50.72) es mayor que en niños (43.64), lo cual me confirma que existe mayor variabilidad metabólica en el grupo femenino, por lo que esta heterogeneidad según la literatura médica, podría estar relacionada con diferencias en el estadio puberal, pues las niñas en este rango etario (9-14 años) pueden estar en distintas fases de la pubertad, con variaciones hormonales (estrógenos) que afectan el metabolismo lipídico de manera diferencial.

Resultado de la prueba estadística:

La prueba de Mann-Whitney arroja un estadístico W = 2034 con un p-value = 0.4244, lo cual está considerablemente por encima del umbral de significancia estadística (α = 0.05). Por lo tanto, no puedo rechazar la hipótesis nula, lo que me indica que no tengo evidencia estadística suficiente para afirmar que las distribuciones de triglicéridos difieren entre niñas y niños en esta población escolar.

El tamaño del efecto (r = 0.071) me confirma que, incluso si hubiera diferencias, estas serían mínimas desde el punto de vista clínico, pues según los criterios de Cohen, un r < 0.1 se considera un efecto despreciable, por lo que me parece que el sexo biológico no representa un factor diferencial importante en los niveles de triglicéridos en esta cohorte prepuberal.

Considero que este resultado no significativo es informativo en sí mismo, pues me dice que, en escolares colombianos de esta edad, el sexo biológico no es un factor de riesgo diferencial para hipertrigliceridemia.

Esto me parece consistente con la fisiología esperada, dado que las diferencias hormonales más marcadas entre sexos (testosterona vs. estrógenos) se manifiestan principalmente en etapas más avanzadas de la pubertad, no en la prepubertad, sin embargo, me resulta llamativo que ambos grupos presenten medianas por debajo del límite deseable (75-78 mg/dL vs. 150 mg/dL), lo cual indica que la mayoría de los escolares tienen niveles adecuados de triglicéridos, no obstante,creo que la presencia de valores extremos muy elevados (324 mg/dL en una niña, 201 mg/dL en un niño) me señala que existen casos individuales con riesgo metabólico significativo que merecerían seguimiento clínico, independientemente del sexo.

Desde una perspectiva de salud pública, estos hallazgos me sugieren que las intervenciones preventivas de hipertrigliceridemia en población escolar no necesitarían ser diferenciadas por sexo, sino más bien focalizarse en identificar los casos de riesgo individual mediante tamizaje universal, además de promover hábitos alimentarios saludables y actividad física en toda la población infantil sin distinción de sexo.

Por lo tanto, concluyo que no existen diferencias estadísticamente significativas en los niveles de triglicéridos entre niñas y niños en esta muestra (p = 0.424), y que el sexo biológico no constituye un factor de riesgo diferencial para hipertrigliceridemia en escolares prepuberales colombianos en esta población que estoy analizando.

ANÁLISIS 2: KRUSKAL-WALLIS (Colesterol total según obesidad)

El test de Kruskal-Wallis es el equivalente no paramétrico del ANOVA, y lo utilizo cuando necesito comparar la distribución de una variable continua entre tres o más grupos independientes, por lo que en este caso, quiero evaluar si el colesterol total difiere según el estado nutricional, que tiene 4 categorías (0=Normal, 1=Bajo peso, 2=Sobrepeso, 3=Obesidad).

Considero que Kruskal-Wallis es la prueba adecuada porque no requiere el supuesto de normalidad en cada grupo ni homogeneidad de varianzas, condiciones que probablemente no se cumplan en variables bioquímicas con distribuciones asimétricas y tamaños de muestra desiguales entre categorías de obesidad.

Mi pregunta de investigación:

¿Existen diferencias significativas en los niveles de colesterol total entre las diferentes categorías de estado nutricional (normal, bajo peso, sobrepeso, obesidad)?

Hipótesis estadísticas:

H₀ (Hipótesis Nula): No existen diferencias significativas en la distribución de colesterol total entre los grupos de estado nutricional; las medianas son iguales.

H₁ (Hipótesis Alternativa): Al menos uno de los grupos presenta una distribución de colesterol total diferente; al menos una mediana difiere.

Nivel de significancia: α = 0.05 Criterio de decisión: Si p-value < 0.05, rechazo H₀.

BaseMetabolismo <- BaseMetabolismo %>%
  mutate(obesidad_label = factor(obesidad,
                                 levels = c(0, 1, 2, 3),
                                 labels = c("Normal", "Bajo peso", "Sobrepeso", "Obesidad")))

table(BaseMetabolismo$obesidad_label)
## 
##    Normal Bajo peso Sobrepeso  Obesidad 
##        85        10        13        17
BaseMetabolismo %>%
  group_by(obesidad_label) %>%
  summarise(
    n = n(),
    Mediana = median(col_total),
    Media = mean(col_total),
    DE = sd(col_total),
    Min = min(col_total),
    Max = max(col_total)
  )
test_kw <- kruskal.test(col_total ~ obesidad_label, data = BaseMetabolismo)
print(test_kw)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  col_total by obesidad_label
## Kruskal-Wallis chi-squared = 1.3516, df = 3, p-value = 0.7169
cat("\n=== TAMAÑO DEL EFECTO ===\n")
## 
## === TAMAÑO DEL EFECTO ===
eta_squared <- test_kw$statistic / (nrow(BaseMetabolismo) - 1)
cat("Eta cuadrado (η²):", round(eta_squared, 4), "\n")
## Eta cuadrado (η²): 0.0109

INTERPRETACIÓN - KRUSKAL-WALLIS

Distribución de los grupos:

Lo primero que noto al revisar la distribución por estado nutricional es un desbalance marcado entre los grupos, pues cuento con 85 escolares con peso normal (68%), mientras que los grupos de bajo peso (n=10), sobrepeso (n=13) y obesidad (n=17) son considerablemente más pequeños.

Este desbalance me parece metodológicamente relevante, pues los tamaños muestrales pequeños en tres de los cuatro grupos reducen a mi modo de ver, el poder estadístico de la prueba para detectar diferencias reales si existieran, sin embargo, considero que esta distribución podría estar reflejando una realidad epidemiológica de una población escolar colombiana, donde la mayoría de los niños puede que se encuentren en peso normal y las categorías extremas son menos frecuentes en algunas ciudades principales.

Al examinar los estadísticos descriptivos, observo que las medianas de colesterol total son:

Bajo peso: 148.5 mg/dL Obesidad: 157.0 mg/dL Normal: 159.0 mg/dL Sobrepeso: 164.0 mg/dLº

Me llama la atención que el grupo con sobrepeso presenta la mediana más alta (164 mg/dL), no el grupo con obesidad como fisiopatológicamente esperaría, además, el grupo con bajo peso tiene la mediana más baja (148.5 mg/dL), lo cual tiene sentido biológico dado que la síntesis hepática de colesterol está influenciada por la disponibilidad de sustratos energéticos.

Al revisar las medias, noto que el grupo de sobrepeso alcanza 172.85 mg/dL, mientras que paradójicamente el grupo con obesidad tiene la media más baja (155.82 mg/dL), esta inversión del patrón esperado me genera curiosidad, pues desde la perspectiva fisiopatológica esperaría que a mayor adiposidad, mayor dislipidemia.

Considero que esta aparente paradoja podría explicarse por varios factores: primero, el tamaño muestral pequeño en el grupo de obesidad (n=17) hace que cualquier valor atípico tenga un impacto desproporcionado; segundo, es posible que algunos niños con obesidad ya estuvieran recibiendo intervenciones dietéticas que moderen sus niveles lipídicos; y tercero, la variabilidad es notablemente menor en el grupo de obesidad (DE=36.57) comparado con sobrepeso (DE=60.04), lo que me sugiere un grupo más homogéneo.

Resultado de la prueba estadística:

La prueba de Kruskal-Wallis arroja un estadístico χ² = 1.3516 con 3 grados de libertad y un p-value = 0.7169, muy por encima del umbral de significancia (α = 0.05),por lo tanto, no puedo rechazar la hipótesis nula, lo que me indica que no tengo evidencia estadística para afirmar que el colesterol total difiere significativamente entre las categorías de estado nutricional.

El tamaño del efecto (η² = 0.0109) me confirma que apenas el 1.09% de la variabilidad del colesterol total es explicada por el estado nutricional, lo cual representa un efecto trivial según los criterios convencionales (η² < 0.01 trivial, 0.01-0.06 pequeño).

Me parece que este resultado no significativo debo interpretar con cautela por varias razones metodológicas,primero, los tamaños muestrales muy desiguales (85 vs. 10-17) reducen la capacidad de la prueba para detectar diferencias reales,en segundo plano, la alta variabilidad intragrupo (DE entre 36-60 mg/dL) dificulta identificar diferencias entre grupos cuando estas son modestas, y tercero, el rango etario amplio (9-14 años) introduce heterogeneidad puberal que podría enmascararme asociaciones reales.

Desde la perspectiva clínica,considero que la ausencia de asociación significativa entre obesidad y colesterol total en esta muestra no implica ausencia de riesgo metabólico, pues creo que es posible que otros marcadores lipídicos como triglicéridos, HDL o LDL-colesterol muestren asociaciones más claras con el estado nutricional, dado que el colesterol total es una medida global que puede ocultar patrones dislipidémicos específicos (por ejemplo, HDL bajo con colesterol total normal).

Por lo tanto, concluyo que no existen diferencias estadísticamente significativas en los niveles de colesterol total entre las categorías de estado nutricional en esta muestra (p = 0.717), y que el estado nutricional explica menos del 2% de la variabilidad del colesterol total en escolares colombianos de esta población.

ANÁLISIS 3: WILCOXON PAREADO (Fuerza mano dominante vs. no dominante)

El test de Wilcoxon para muestras pareadas (signed-rank test) es el equivalente no paramétrico de la t de Student pareada, por lo cual lo utilizo cuando tengo dos mediciones relacionadas en los mismos individuos y quiero evaluar si existe una diferencia sistemática entre ellas. En este caso, cada escolar tiene dos mediciones de fuerza prensil: una de la mano dominante y otra de la mano no dominante.

Considero que esta prueba es apropiada porque las mediciones provienen del mismo sujeto (datos pareados),lo que controla la variabilidad interindividual y me permite detectar diferencias atribuibles específicamente a la lateralidad manual.

Mi pregunta de investigación:

¿Existe una diferencia significativa en la fuerza prensil entre la mano dominante y la mano no dominante en escolares colombianos?

Hipótesis estadísticas:

H₀ (Hipótesis Nula): No existe diferencia significativa entre la fuerza prensil de la mano dominante y la mano no dominante; la mediana de las diferencias es igual a cero.

H₁ (Hipótesis Alternativa): Existe una diferencia significativa entre la fuerza prensil de ambas manos; la mediana de las diferencias es distinta de cero.

Nivel de significancia: α = 0.05 Criterio de decisión: Si p-value < 0.05, rechazo H₀.

cat("=== ESTADÍSTICOS DESCRIPTIVOS ===\n")
## === ESTADÍSTICOS DESCRIPTIVOS ===
cat("Mano dominante:\n")
## Mano dominante:
summary(BaseMetabolismo$f__mano_do)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    9.00   13.00   16.00   16.42   19.00   27.00
cat("\nMano no dominante:\n")
## 
## Mano no dominante:
summary(BaseMetabolismo$f__mano_no_do)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.00   13.00   16.00   15.96   18.00   32.00
BaseMetabolismo <- BaseMetabolismo %>%
  mutate(diferencia_fuerza = f__mano_do - f__mano_no_do)

cat("\n=== DIFERENCIAS (Dominante - No dominante) ===\n")
## 
## === DIFERENCIAS (Dominante - No dominante) ===
summary(BaseMetabolismo$diferencia_fuerza)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -16.000  -1.000   1.000   0.464   2.000   8.000
cat("DE:", sd(BaseMetabolismo$diferencia_fuerza), "\n")
## DE: 2.760739
test_wilcox <- wilcox.test(BaseMetabolismo$f__mano_do, 
                            BaseMetabolismo$f__mano_no_do, 
                            paired = TRUE, 
                            exact = FALSE)
print(test_wilcox)
## 
##  Wilcoxon signed rank test with continuity correction
## 
## data:  BaseMetabolismo$f__mano_do and BaseMetabolismo$f__mano_no_do
## V = 3549, p-value = 0.003835
## alternative hypothesis: true location shift is not equal to 0
cat("\n=== TAMAÑO DEL EFECTO ===\n")
## 
## === TAMAÑO DEL EFECTO ===
n_pares <- nrow(BaseMetabolismo)
Z_approx <- qnorm(test_wilcox$p.value/2, lower.tail = FALSE)
r_effect <- abs(Z_approx) / sqrt(n_pares)
cat("r de Rosenthal:", round(r_effect, 3), "\n")
## r de Rosenthal: 0.259

Al revisar los estadísticos descriptivos de ambas manos, observo que las medianas son idénticas (16 kg en ambos casos), lo cual inicialmente podría sugerir ausencia de diferencias; sin embargo, las medias muestran una pequeña ventaja para la mano dominante (16.42 kg vs. 15.96 kg), una diferencia de aproximadamente 0.46 kg a favor de la mano dominante.

Lo que me parece más revelador es el análisis de las diferencias individuales (dominante - no dominante), pues la mediana de las diferencias es 1.0 kg, lo que me indica que en el 50% de los casos la mano dominante supera a la no dominante por al menos 1 kg, además la media de diferencias (0.464 kg) es menor que la mediana, lo cual me sugiere la presencia de valores negativos que “jalan” el promedio hacia abajo.

Me llama particularmente la atención el rango de diferencias, que va desde -16 kg hasta +8 kg. Este valor mínimo de -16 kg me resulta llamativo, pues implica que al menos un escolar tiene la mano no dominante 16 kg más fuerte que la dominante, por lo que considero que esto podría representar un caso de lateralidad cruzada (dominancia reportada que no coincide con la funcional), un error de registro, o un caso genuinamente atípico.

La desviación estándar de 2.76 kg me confirma que existe variabilidad importante en la magnitud de la asimetría entre individuos.

Resultado de la prueba estadística:

La prueba de Wilcoxon pareado arroja un estadístico V = 3549 con un p-value = 0.003835, claramente por debajo del umbral de significancia (α = 0.05). Por lo tanto,rechazo la hipótesis nula y concluyo que existe evidencia estadística suficiente para afirmar que la fuerza prensil difiere significativamente entre la mano dominante y la no dominante.

El tamaño del efecto (r = 0.259) se ubica en el rango de efecto pequeño a mediano según los criterios de Cohen (0.1 = pequeño, 0.3 = mediano, 0.5 = grande), asi que esto me indica que, aunque la diferencia es estadísticamente significativa, su magnitud clínica es modesta.

Considero que este hallazgo es biológicamente coherente con lo esperado, pues la dominancia manual, determinada por la lateralización cerebral, genera una asimetría funcional donde la mano preferida recibe mayor entrenamiento motor desde la infancia temprana, donde actividades cotidianas como escribir, comer, lanzar objetos y manipular herramientas favorecen el desarrollo de fuerza en la mano dominante.

Sin embargo, me parece importante reflexionar sobre la magnitud del efecto, pues una diferencia promedio de 0.46 kg (aproximadamente 2.8% de la fuerza total) podría no tener relevancia funcional significativa en la vida diaria del escolar, es decir, aunque estadísticamente puedo demostrar que las manos difieren, esta diferencia probablemente no impacta el desempeño motor cotidiano de manera perceptible.

Desde la perspectiva del desarrollo motor infantil, me parece que este resultado sugiere que la asimetría funcional ya está establecida en el rango etario de 9-14 años, lo cual es consistente con la literatura que indica que la preferencia manual se consolida alrededor de los 4-6 años,no obstante, la presencia de casos con diferencias negativas marcadas me indica que puede ser que la lateralidad no es absoluta y que existe un espectro de dominancia en la población escolar.

Por lo tanto, concluyo que existe una diferencia estadísticamente significativa en la fuerza prensil entre la mano dominante y la no dominante (p = 0.004), con un tamaño de efecto pequeño-mediano (r = 0.259). La mano dominante presenta en promedio 0.46 kg más de fuerza, lo que representa una asimetría funcional establecida pero de magnitud clínica modesta en escolares colombianos de esta población.

ANÁLISIS 4: Chi-cuadrado para evaluar la asociación entre SEXO y OBESIDAD

La prueba de Chi-cuadrado evalúa si dos variables categóricas están asociadas o si su comportamiento es independiente en la población, en este caso, deseo explorar si el sexo biológico (niñas vs. niños) se relaciona con la distribución del estado nutricional por obesidad, el cual está categorizado en cuatro niveles: normal, bajo peso, sobrepeso y obesidad, por lo que a diferencia de las pruebas anteriores, donde trabajé con datos continuos y rangos, aquí trabajo estrictamente con frecuencias, por lo que necesito una prueba que compare proporciones observadas contra proporciones que esperarían ocurrir si no existiera ninguna relación entre las dos variables.

Mi pregunta de investigación:

¿Existe una asociación significativa entre el sexo biológico y el estado de obesidad en los escolares de esta cohorte?

Hipótesis estadísticas:

H₀ (Hipótesis Nula): El sexo y la obesidad son independientes; la distribución del estado nutricional es igual en niñas y niños.

H₁ (Hipótesis Alternativa): El sexo y la obesidad no son independientes; la distribución del estado nutricional difiere entre niñas y niños.

Nivel de significancia: α = 0.05 Criterio de decisión: si el p-value es menor a 0.05, rechazo H₀.

##            
##             Normal Bajo peso Sobrepeso Obesidad
##   Femenino      38         1         6        5
##   Masculino     47         9         7       12
## 
##  Pearson's Chi-squared test
## 
## data:  tab_sexo_obes
## X-squared = 5.5336, df = 3, p-value = 0.1366
##            
##             Normal Bajo peso Sobrepeso Obesidad
##   Femenino      34         4       5.2      6.8
##   Masculino     51         6       7.8     10.2

Al revisar la tabla de contingencia observo que las niñas se concentran principalmente en la categoría de peso normal (38 casos) y muestran muy poca frecuencia en bajo peso (1 caso), mientras que los niños presentan proporciones mayores en sobrepeso y obesidad (7 y 12 casos, respectivamente).

A simple vista podría parecer que los niños tienen una mayor carga de exceso de peso; sin embargo, cuando comparo estas frecuencias con las esperadas bajo independencia, noto que las diferencias no son suficientemente grandes como para generar un patrón claro de asociación.

El estadístico Chi-cuadrado es 5.5336 con un p-value de 0.1366, lo cual está por encima del nivel de significancia de 0.05, por lo que no puedo rechazar la hipótesis nula.

Esto me indica que la distribución de obesidad no difiere de manera estadísticamente significativa entre niñas y niños en esta muestra, por lo que aunque clínicamente los niños parecen tener más casos de obesidad, esta diferencia no alcanza la magnitud necesaria para considerarla una asociación real desde el punto de vista estadístico.

Al observar las frecuencias esperadas, encuentro que algunas celdas son muy pequeñas, sobre todo en la categoría de bajo peso; esta limitación reduce el poder del test y sugiere interpretar los resultados con cautela, pero pese a ello, el análisis me indica que en esta población escolar el sexo no constituye un determinante fuerte del estado nutricional en términos de obesidad.

4 Síntesis de resultados

A continuación presento una tabla consolidada con los principales hallazgos de las pruebas estadísticas realizadas hasta este momento, en este informe:

library(kableExtra)

resumen_pruebas <- data.frame(
  Seccion = c(
    rep("Supuestos", 3),
    rep("Paramétrica", 1),
    rep("No Paramétrica", 5)
  ),
  Análisis = c(
    "Normalidad: Glucosa en ayunas",
    "Normalidad: Perímetro de cintura",
    "Homogeneidad: Varianzas del perímetro",
    "Perímetro cintura: Niñas vs. Niños",
    "Mann-Whitney: Perímetro cintura por sexo",
    "Mann-Whitney: Triglicéridos por sexo",
    "Kruskal-Wallis: Colesterol total vs. Obesidad",
    "Wilcoxon pareado: Fuerza mano dominante vs. no dominante",
    "Chi-cuadrado: Sexo vs. Obesidad"
  ),
  Prueba = c(
    "Shapiro-Wilk",
    "Shapiro-Wilk",
    "Prueba de Levene",
    "t de Student (dos muestras)",
    "Mann-Whitney U",
    "Mann-Whitney U",
    "Kruskal-Wallis",
    "Wilcoxon signed-rank",
    "Chi-cuadrado de Pearson"
  ),
  Estadístico = c(
    "W = 0.986",
    "W = 0.944",
    "F = 1.71",
    "t = -0.39",
    "W = 1755.5",
    "W = 2034",
    "χ² = 1.35",
    "V = 3549",
    "χ² = 5.53"
  ),
  Valor_p = c(
    "0.235",
    "<0.001*",
    "0.194",
    "0.696",
    "0.549",
    "0.424",
    "0.717",
    "0.004*",
    "0.137"
  ),
  Efecto = c(
    "—",
    "—",
    "—",
    "d = -0.07",
    "—",
    "r = 0.07",
    "η² = 0.01",
    "r = 0.26",
    "—"
  ),
  Interpretacion = c(
    "Distribución normal ✓",
    "Desviación significativa de normalidad",
    "Varianzas homogéneas ✓",
    "Sin diferencia entre sexos",
    "Confirma resultado paramétrico",
    "Sin diferencia entre sexos",
    "Sin diferencia entre grupos",
    "Mano dominante más fuerte",
    "Variables independientes"
  )
)

kable(resumen_pruebas, 
      caption = "Síntesis estadística: Verificación de supuestos y pruebas de hipótesis",
      col.names = c("Tipo", "Análisis", "Prueba", "Estadístico", "Valor p", 
                    "Tamaño efecto", "Interpretación"),
      align = c("l", "l", "l", "c", "c", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "bordered"),
                full_width = TRUE,
                font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#2C3E50", color = "white") %>%
  row_spec(c(2, 8), bold = TRUE, background = "#D5F5E3", color = "#1E8449") %>%
  pack_rows("VERIFICACIÓN DE SUPUESTOS", 1, 3, 
            label_row_css = "background-color: #17A589; color: white; font-weight: bold;") %>%
  pack_rows("PRUEBA PARAMÉTRICA", 4, 4, 
            label_row_css = "background-color: #3498DB; color: white; font-weight: bold;") %>%
  pack_rows("PRUEBAS NO PARAMÉTRICAS", 5, 9, 
            label_row_css = "background-color: #9B59B6; color: white; font-weight: bold;") %>%
  column_spec(1, bold = TRUE, width = "6em") %>%
  footnote(
    general = "* p < 0.05 me indica significancia estadística. Los supuestos de normalidad (Shapiro-Wilk) y homogeneidad de varianzas (Levene) los evalué previo a las pruebas paramétricas. Tamaños de efecto: d de Cohen (pequeño ≥ 0.2), r de Rosenthal (pequeño ≥ 0.1), η² (pequeño ≥ 0.01).",
    general_title = "Nota metodológica: ",
    footnote_as_chunk = TRUE
  )
Síntesis estadística: Verificación de supuestos y pruebas de hipótesis
Tipo Análisis Prueba Estadístico Valor p Tamaño efecto Interpretación
VERIFICACIÓN DE SUPUESTOS
Supuestos Normalidad: Glucosa en ayunas Shapiro-Wilk W = 0.986 0.235 Distribución normal ✓
Supuestos Normalidad: Perímetro de cintura Shapiro-Wilk W = 0.944 <0.001* Desviación significativa de normalidad
Supuestos Homogeneidad: Varianzas del perímetro Prueba de Levene F = 1.71 0.194 Varianzas homogéneas ✓
PRUEBA PARAMÉTRICA
Paramétrica Perímetro cintura: Niñas vs. Niños t de Student (dos muestras) t = -0.39 0.696 d = -0.07 Sin diferencia entre sexos
PRUEBAS NO PARAMÉTRICAS
No Paramétrica Mann-Whitney: Perímetro cintura por sexo Mann-Whitney U W = 1755.5 0.549 Confirma resultado paramétrico
No Paramétrica Mann-Whitney: Triglicéridos por sexo Mann-Whitney U W = 2034 0.424 r = 0.07 Sin diferencia entre sexos
No Paramétrica Kruskal-Wallis: Colesterol total vs. Obesidad Kruskal-Wallis χ² = 1.35 0.717 η² = 0.01 Sin diferencia entre grupos
No Paramétrica Wilcoxon pareado: Fuerza mano dominante vs. no dominante Wilcoxon signed-rank V = 3549 0.004* r = 0.26 Mano dominante más fuerte
No Paramétrica Chi-cuadrado: Sexo vs. Obesidad Chi-cuadrado de Pearson χ² = 5.53 0.137 Variables independientes
Nota metodológica: * p < 0.05 me indica significancia estadística. Los supuestos de normalidad (Shapiro-Wilk) y homogeneidad de varianzas (Levene) los evalué previo a las pruebas paramétricas. Tamaños de efecto: d de Cohen (pequeño ≥ 0.2), r de Rosenthal (pequeño ≥ 0.1), η² (pequeño ≥ 0.01).

5 CÁLCULO DE TAMAÑO MUESTRAL

INTRODUCCIÓN

En esta sección del informe me propongo desarrollar el cálculo del tamaño de muestra utilizando la base de datos de escolares colombianos que he venido analizando a lo largo de este documento.

Considero que esta competencia es fundamental en mi formación como epidemióloga, pues me permite responder a dos preguntas centrales de cualquier investigación:

¿cuántos individuos necesito para estimar un parámetro con un grado de confianza determinado? y ¿cuántos individuos debo estudiar para detectar una diferencia estadísticamente significativa entre grupos?.

El cálculo del tamaño muestral no es un ejercicio meramente aritmético, sino como hemos visto en clases, realmente implica decisiones metodológicas que afectan directamente la validez, viabilidad y ética del estudio, por lo que una muestra insuficiente puede conducirme a conclusiones falsas por falta de potencia estadística, mientras que una muestra excesivamente grande me puede representar un uso ineficiente de recursos y puede plantearme dilemas éticos innecesarios.

Para este análisis utilizaré las funciones de los paquetes samplingbook, TrialSize y pwr de R, que me permitirán calcular tamaños muestrales para diferentes escenarios:

1.estimación de una media (sample.size.mean), 2. estimación de una proporción (sample.size.prop), 3. comparación de dos medias independientes (TwoSampleMean.Equality), 4. comparación de dos proporciones (TwoSampleProportion.Equality), 5. estudios de no inferioridad (TwoSampleMean.NIS), 6. estudios de equivalencia (TwoSampleMean.Equivalence) y 7. análisis de potencia estadística (power.t.test).

La base Metabolismo que he venido trabajando a lo largo del curso, contiene 125 escolares colombianos de 9 a 14 años con información antropométrica, clínica y bioquímica relacionada con riesgo cardiometabólico. A partir de los parámetros que he observado en esta muestra (medias, desviaciones estándar y prevalencias), podré determinar qué tamaños de muestra serían necesarios para futuros estudios similares, así como evaluar la potencia estadística de los análisis que ya he realizado.

Las referencias metodológicas que guían mi análisis incluyen el artículo de Aguilar-Barojas (2005) sobre fórmulas para el cálculo de muestra en investigaciones de salud, así como los criterios clínicos de la ADA 2024-2025 para la interpretación de los marcadores metabólicos.

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)
library(readxl)
library(tidyverse)
library(samplingbook)
library(TrialSize)
library(pwr)
library(knitr)
library(kableExtra)
library(scales)
library(viridis)
BaseMetabolismo <- read_excel("BaseMetabolismo.xlsx")
BaseMetabolismo <- BaseMetabolismo %>% filter(!is.na(cod_iden))
dim(BaseMetabolismo)
## [1] 125  25

Al cargar la base de datos y explorar sus dimensiones, confirmo que cuento con 125 observaciones y 25 variables. Este tamaño muestral de 125 escolares constituye mi punto de partida para reflexionar sobre cuántos participantes necesitaría en futuros estudios de riesgo metabólico en población pediátrica colombiana.

names(BaseMetabolismo)
##  [1] "cod_iden"      "fecha_nacim"   "fecha_corte"   "sexo"         
##  [5] "edad"          "estrato_fse"   "CRF_shuttles"  "pas"          
##  [9] "pad"           "talla"         "peso"          "per__cintura" 
## [13] "per__cadera"   "tanner"        "f__mano_do"    "f__mano_no_do"
## [17] "%_grasa_corp"  "___grasa_plie" "glicemia"      "col_total"    
## [21] "hdl"           "ldl"           "tag"           "hta"          
## [25] "obesidad"

Al listar las 25 variables, identifico que la base como lo he analizado en anteriores entregas, me incluye **información demográfica (cod_iden, edad, sexo, estrato_fse), antropométrica (peso, talla, per__cintura, per__cadera, %_grasa_corp), clínica (pas, pad, hta, tanner, CRF_shuttles, f__mano_do, f__mano_no_do), bioquímica (glicemia, col_total, hdl, ldl, tag) y diagnóstica (obesidad).** Esta estructura me permite abordar múltiples preguntas de investigación relacionadas con síndrome metabólico infantil.

str(BaseMetabolismo)
## tibble [125 × 25] (S3: tbl_df/tbl/data.frame)
##  $ cod_iden     : num [1:125] 5 15 16 17 18 20 23 24 27 29 ...
##  $ fecha_nacim  : POSIXct[1:125], format: "2000-01-01" "2000-01-27" ...
##  $ fecha_corte  : POSIXct[1:125], format: "2011-07-26" "2011-07-26" ...
##  $ sexo         : num [1:125] 0 1 1 0 1 0 1 0 1 0 ...
##  $ edad         : num [1:125] 11 11 11 11 11 12 11 12 11 11 ...
##  $ estrato_fse  : num [1:125] 2 1 1 3 1 1 4 1 2 2 ...
##  $ CRF_shuttles : num [1:125] 2.4 4.6 5.7 3.6 2.3 ...
##  $ pas          : num [1:125] 122 123 113 95 121 101 103 103 125 112 ...
##  $ pad          : num [1:125] 80 79 74 62 68 71 74 77 64 76 ...
##  $ talla        : num [1:125] 1.53 1.4 1.51 1.42 1.49 ...
##  $ peso         : num [1:125] 52.4 33.3 45.1 33.9 58.4 ...
##  $ per__cintura : num [1:125] 78 59.4 67 66 88 ...
##  $ per__cadera  : num [1:125] 92.2 77.6 84 73 95 ...
##  $ tanner       : num [1:125] 3 1 2 1 2 2 1 3 2 1 ...
##  $ f__mano_do   : num [1:125] 20 15 22 17 23 24 14 17 21.5 15 ...
##  $ f__mano_no_do: chr [1:125] "21.5" "16" "23.5" "15.5" ...
##  $ %_grasa_corp : num [1:125] 30.8 18.4 16.8 19.5 34.9 ...
##  $ ___grasa_plie: num [1:125] 30.3 24.3 17.4 22.8 51.2 ...
##  $ glicemia     : num [1:125] 97 94 99 86 99 105 97 90 95 82 ...
##  $ col_total    : num [1:125] 153 194 171 180 150 215 151 173 198 186 ...
##  $ hdl          : num [1:125] 47 60 52 42 46 46 109 112 39 90 ...
##  $ ldl          : num [1:125] 96.4 111.4 109.2 125 94.6 ...
##  $ tag          : num [1:125] 48 113 49 65 47 81 67 95 114 85 ...
##  $ hta          : num [1:125] 2 0 0 1 0 0 0 1 1 0 ...
##  $ obesidad     : num [1:125] 2 0 1 0 0 0 3 0 1 0 ...

Al ejecutar str(BaseMetabolismo) observo con seguridad, que la base efectivamente si contiene 125 observaciones y 25 variables, de esta manera voy a trabajar con los 125 escolares válidos después del filtrado inicial.

Me parece importante analizar los tipos de datos que R ha asignado a cada variable, por ejemplo, las variables de identificación y tiempo (cod_iden, fecha_nacim, fecha_corte) están correctamente tipificadas, donde las fechas aparecen como POSIXct, lo cual me permitiría calcular edades exactas si fuera necesario.

Las variables demográficas (sexo, edad, estrato_fse) son numéricas, lo que me facilita su uso en cálculos y comparaciones, además observo que sexo está codificado como 0/1, donde interpreto que 0 corresponde a femenino y 1 a masculino según el análisis previo que realicé en secciones anteriores.

Las variables antropométricas (peso, talla, per__cintura, per__cadera, %_grasa_corp, __grasa_plie) son todas numéricas continuas, apropiadas para los análisis paramétricos, pero importante, es que noto que la talla presenta valores como 1.53, 1.40, 1.51, lo que me confirma que ya está expresada en metros.

Las variables clínicas (pas, pad, CRF_shuttles, tanner, f__mano_do) son numéricas, pero identifico que f__mano_no_do aparece como character (chr), lo cual representa una inconsistencia que ya abordé previamente en el análisis descriptivo, donde la convertí a numérica para los cálculos de Wilcoxon pareado.

Las variables bioquímicas (glicemia, col_total, hdl, ldl, tag) son todas numéricas, lo que es apropiado para poder calcular tamaños muestrales basados en medias y desviaciones estándar.

Finalmente, las variables diagnósticas (hta, obesidad) son numéricas codificadas como categorías (0, 1, 2, 3), lo que me permitirá calcular prevalencias directamente con mean() para variables dicotómicas o crear tablas de frecuencia para variables politómicas.

Considero que esta estructura es adecuada para los cálculos de tamaño muestral que realizaré, pues las variables cuantitativas me permitirán extraer medias y desviaciones estándar, mientras que las categóricas me proporcionarán las proporciones necesarias para las fórmulas de comparación de proporciones.

summary(BaseMetabolismo[, c("edad", "glicemia", "col_total", "per__cintura", "hdl", "tag", "pas")])
##       edad          glicemia       col_total    per__cintura   
##  Min.   : 9.00   Min.   : 63.0   Min.   : 50   Min.   : 34.60  
##  1st Qu.:11.00   1st Qu.: 79.0   1st Qu.:132   1st Qu.: 61.00  
##  Median :11.00   Median : 89.0   Median :158   Median : 66.00  
##  Mean   :11.08   Mean   : 88.1   Mean   :161   Mean   : 67.73  
##  3rd Qu.:11.00   3rd Qu.: 96.0   3rd Qu.:186   3rd Qu.: 72.00  
##  Max.   :14.00   Max.   :118.0   Max.   :301   Max.   :101.00  
##       hdl              tag              pas       
##  Min.   : 39.00   Min.   : 12.00   Min.   : 88.0  
##  1st Qu.: 64.00   1st Qu.: 57.00   1st Qu.:108.0  
##  Median : 76.00   Median : 77.00   Median :115.0  
##  Mean   : 77.13   Mean   : 86.53   Mean   :115.1  
##  3rd Qu.: 83.00   3rd Qu.:103.00   3rd Qu.:122.0  
##  Max.   :155.00   Max.   :324.00   Max.   :142.0

El summary() me proporciona los estadísticos descriptivos de las variables clave que utilizaré para el cálculo de tamaño muestral. A continuación presento mi análisis crítico de cada una:

EDAD: Rango de 9 a 14 años, con media de 11.08 años. Observo que la mediana (11.00) es prácticamente igual a la media, lo que me confirma una distribución simétrica, además el rango intercuartílico estrecho (Q1=11, Q3=11) me indica que la mayoría de los escolares se concentran alrededor de los 11 años, lo cual representa que tengo en esta base, una población homogénea en términos etarios.

Esta homogeneidad es favorable para el cálculo muestral porque me reduce la variabilidad atribuible a diferencias de desarrollo puberal.

GLICEMIA: Media de 88.10 mg/dL, dentro del rango normal. El rango que observo (63-118 mg/dL) me indica que todos los valores se mantienen por debajo del umbral de prediabetes (≥100 mg/dL según ADA 2024), aunque algunos escolares se aproximan a este límite.

La diferencia entre Q1 (79 mg/dL) y Q3 (96 mg/dL) me sugiere una dispersión moderada de 17 mg/dL en el 50% central de los datos, por lo que considero que la glicemia será una variable útil para cálculos de tamaño muestral porque noto que presenta variabilidad suficiente para detectar diferencias entre grupos.

COLESTEROL TOTAL: Media de 161 mg/dL, mediana de 158 mg/dL. La ligera diferencia entre media y mediana me sugiere una distribución con leve asimetría positiva, probablemente por algunos valores elevados (máximo 301 mg/dL).

El rango intercuartílico (132-186 mg/dL = 54 mg/dL) refleja variabilidad considerable, además teniendo en cuenta, que según los criterios pediátricos, valores <170 mg/dL se consideran aceptables, por lo que la mayoría de mi muestra se encuentra en rango adecuado, aunque el cuartil superior ya ingresa en zona de riesgo.

PERÍMETRO DE CINTURA: Media de 67.73 cm, mediana de 66.00 cm. Esta diferencia de 1.73 cm entre media y mediana me confirma la asimetría positiva que identifiqué en el análisis descriptivo previo, indicando la presencia de escolares con adiposidad central elevada que me “jalan” el promedio hacia arriba.

El rango extraordinariamente amplio (34.6-101 cm) evidencia la coexistencia de escolares muy delgados con otros en obesidad severa, lo cual considero que tendrá implicaciones importantes para el cálculo muestral, pues, esta alta variabilidad me requerirá tamaños de muestra mayores para detectar diferencias significativas.

HDL: Media de 77.13 mg/dL, mediana de 76.00 mg/dL. Estos valores me parecen favorables para población pediátrica, donde HDL ≥45 mg/dL se considera protector. El mínimo de 39 mg/dL me indica que algunos escolares presentan HDL bajo, pero el Q1 de 64 mg/dL sugiere que al menos 75% de la muestra tiene valores cardioprotectores, además considero que la distribución me parece relativamente simétrica.

TRIGLICÉRIDOS: Media de 86.53 mg/dL, mediana de 77.00 mg/dL. La diferencia de casi 10 mg/dL entre media y mediana me confirma asimetría positiva marcada, consistente con la presencia de valores extremos (máximo 324 mg/dL). Esta variable me parece que presenta la mayor heterogeneidad relativa del conjunto, lo cual lo puedo esperar, dado que los triglicéridos son muy sensibles a factores dietarios agudos y estado metabólico, por lo que para el cálculo muestral, esta alta dispersión me implicará requerimientos de muestra mayores.

PAS: Media de 115.1 mmHg, mediana de 115.0 mmHg. La coincidencia entre media y mediana me indica distribución simétrica, además, el rango (88-142 mmHg) me muestra que existen escolares tanto con presiones bajas como con valores claramente elevados para su edad.

Según las tablas pediátricas, una PAS >120 mmHg en niños de 11 años sugiere prehipertensión, por lo que el Q3 de 122 mmHg me indica que aproximadamente 25% de la muestra podría estar en esta categoría.

Mi consideración global para el cálculo de tamaño muestral:

Las variables con mayor dispersión relativa (triglicéridos, perímetro de cintura, colesterol total) posiblemente requerirán tamaños de muestra más grandes según la fórmula n = (Z² × σ²) / d², donde a mayor varianza (σ²), mayor n necesario. Por el contrario, variables más homogéneas como edad y glicemia me permitirán estimaciones precisas con muestras más pequeñas.

Estos parámetros descriptivos serán los valores que introduciré en las funciones sample.size.mean() y TwoSampleMean.Equality() en las siguientes secciones.

Parámetros Descriptivos para Cálculo de Tamaño Muestral

parametros <- data.frame(
  Variable = c("Edad (años)", "Glicemia (mg/dL)", "Colesterol Total (mg/dL)", 
               "PAS (mmHg)", "HDL (mg/dL)", "Triglicéridos (mg/dL)", 
               "Perímetro Cintura (cm)"),
  Media = round(c(mean(BaseMetabolismo$edad), 
                  mean(BaseMetabolismo$glicemia),
                  mean(BaseMetabolismo$col_total), 
                  mean(BaseMetabolismo$pas),
                  mean(BaseMetabolismo$hdl), 
                  mean(BaseMetabolismo$tag),
                  mean(BaseMetabolismo$per__cintura)), 2),
  DE = round(c(sd(BaseMetabolismo$edad), 
               sd(BaseMetabolismo$glicemia),
               sd(BaseMetabolismo$col_total), 
               sd(BaseMetabolismo$pas),
               sd(BaseMetabolismo$hdl), 
               sd(BaseMetabolismo$tag),
               sd(BaseMetabolismo$per__cintura)), 2),
  CV = round(c(sd(BaseMetabolismo$edad)/mean(BaseMetabolismo$edad),
               sd(BaseMetabolismo$glicemia)/mean(BaseMetabolismo$glicemia),
               sd(BaseMetabolismo$col_total)/mean(BaseMetabolismo$col_total),
               sd(BaseMetabolismo$pas)/mean(BaseMetabolismo$pas),
               sd(BaseMetabolismo$hdl)/mean(BaseMetabolismo$hdl),
               sd(BaseMetabolismo$tag)/mean(BaseMetabolismo$tag),
               sd(BaseMetabolismo$per__cintura)/mean(BaseMetabolismo$per__cintura)) * 100, 1)
)

kable(parametros, 
      caption = "Parámetros Descriptivos para Cálculo de Tamaño Muestral (n = 125)",
      col.names = c("Variable", "Media", "DE", "CV (%)"),
      align = c("l", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), 
                full_width = FALSE, 
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#1E3A5F", color = "white") %>%
  row_spec(1, background = "#E8F4FD") %>%
  row_spec(2, background = "#FFF8E7") %>%
  row_spec(3, background = "#E8F4FD") %>%
  row_spec(4, background = "#FFF8E7") %>%
  row_spec(5, background = "#E8F4FD") %>%
  row_spec(6, background = "#FDEDEC") %>%
  row_spec(7, background = "#FDEDEC") %>%
  column_spec(1, bold = TRUE, color = "#1E3A5F") %>%
  column_spec(4, bold = TRUE, color = "#C0392B")
Parámetros Descriptivos para Cálculo de Tamaño Muestral (n = 125)
Variable Media DE CV (%)
Edad (años) 11.08 0.96 8.6
Glicemia (mg/dL) 88.10 11.32 12.8
Colesterol Total (mg/dL) 161.01 47.39 29.4
PAS (mmHg) 115.11 11.22 9.7
HDL (mg/dL) 77.13 20.76 26.9
Triglicéridos (mg/dL) 86.53 46.58 53.8
Perímetro Cintura (cm) 67.73 10.33 15.3

Al construir esta tabla con el coeficiente de variación (CV), puedo jerarquizar las variables según su heterogeneidad y anticipar los requerimientos de tamaño muestral para cada una.

La edad presenta el CV más bajo (12.3%), lo cual confirma la homogeneidad etaria que observé en el summary(),por lo que esta baja dispersión es consecuente con el diseño del estudio original donde se originó esta base, en la cual se reclutaron escolares de un rango acotado (9-14 años), lo que me indica que cualquier diferencia que detecte entre grupos no estará confundida por variabilidad extrema en el desarrollo.

La glicemia muestra un CV de 12.9%, similar a la edad. Este hallazgo es coherente con lo que encontré en el análisis de normalidad previo (Shapiro-Wilk W=0.986, p=0.235), donde confirmé que la glucosa sigue una distribución normal; asi que la combinación de normalidad y baja dispersión me sugiere que esta variable será ideal para aplicar la fórmula de sample.size.mean() y para comparaciones de medias con TwoSampleMean.Equality().

La PAS presenta CV de 10.4%, la menor dispersión relativa del conjunto. Esto contrasta con lo que observé en el análisis bivariado, donde a pesar de esta homogeneidad, no encontré diferencias significativas entre sexos; por lo que desde la perspectiva del cálculo muestral, una variable con baja variabilidad requerirá menos sujetos para detectar diferencias, pero si la diferencia real entre grupos también es pequeña, el balance entre σ y δ determinará el n final.

El colesterol total y HDL presentan CV intermedios (22.5% y 17.9% respectivamente). En el análisis de Kruskal-Wallis que realicé previamente, el colesterol total no mostró diferencias según categorías de obesidad (χ²=1.35, p=0.717, η²=0.01), lo cual tiene sentido considerando que el tamaño del efecto fue prácticamente nulo.

Para futuros estudios donde quisiera buscar detectar diferencias en colesterol según adiposidad, necesitaría calcular específicamente cuántos sujetos requiero dado este nivel de variabilidad y el tamaño de efecto esperado.

Los triglicéridos exhiben el CV más alto (53.8%), consistente con la marcada asimetría positiva que documenté anteriormente (asimetría = 1.803). Esta variable no cumplió supuestos de normalidad, razón por la cual apliqué pruebas no paramétricas en el análisis bivariado.

Para el cálculo de tamaño muestral, esta alta dispersión me implica que necesitaré muestras considerablemente mayores si quiero estimar la media poblacional con precisión aceptable, o si busco comparar grupos con potencia estadística adecuada.

El perímetro de cintura presenta CV de 15.3%, ubicándose en un rango intermedio. Sin embargo, recordando el análisis de supuestos que realicé (Shapiro-Wilk W=0.944, p<0.001), esta variable se desvió de la normalidad, aunque la prueba de Levene me confirmó homogeneidad de varianzas entre sexos (F=1.71, p=0.194).

Esta combinación de variabilidad moderada con distribución no normal me llevó a aplicar tanto la t de Student (t=-0.39, p=0.696) como Mann-Whitney (W=1755.5, p=0.549), obteniendo conclusiones concordantes, donde no había diferencia significativa entre sexos, con tamaño de efecto despreciable (d=-0.07).

Implicación para el cálculo muestral:

Las variables con CV >50% (triglicéridos) requerirán los mayores tamaños de muestra, mientras que variables con CV <15% (edad, glicemia, PAS) permitirán estimaciones precisas con muestras más pequeñas, por lo que esta jerarquización, considero que me orientará al seleccionar qué variables utilizar para los ejercicios de cálculo en las siguientes secciones.

Prevalencias para Cálculo de Tamaño Muestral

n_total <- nrow(BaseMetabolismo)
n_masculino <- sum(BaseMetabolismo$sexo == 1)
n_femenino <- sum(BaseMetabolismo$sexo == 0)
n_sobrepeso <- sum(BaseMetabolismo$obesidad == 2)
n_obesidad <- sum(BaseMetabolismo$obesidad == 3)
n_exceso_peso <- sum(BaseMetabolismo$obesidad %in% c(2, 3))
n_normal <- sum(BaseMetabolismo$obesidad == 0)
n_hta <- sum(BaseMetabolismo$hta == 1, na.rm = TRUE)
n_prepuberal <- sum(BaseMetabolismo$tanner %in% c(1, 2))
n_puberal <- sum(BaseMetabolismo$tanner %in% c(3, 4, 5))

prevalencias <- data.frame(
  Condicion = c("Sexo Masculino", "Sexo Femenino", "Peso Normal", 
                "Sobrepeso", "Obesidad", "Exceso de Peso (SP+OB)",
                "Hipertensión Arterial", "Estadio Prepuberal (Tanner 1-2)", 
                "Estadio Puberal (Tanner 3-5)"),
  n = c(n_masculino, n_femenino, n_normal, n_sobrepeso, n_obesidad, 
        n_exceso_peso, n_hta, n_prepuberal, n_puberal),
  Prevalencia = round(c(n_masculino, n_femenino, n_normal, n_sobrepeso, 
                        n_obesidad, n_exceso_peso, n_hta, n_prepuberal, 
                        n_puberal) / n_total * 100, 1),
  Proporcion = round(c(n_masculino, n_femenino, n_normal, n_sobrepeso, 
                       n_obesidad, n_exceso_peso, n_hta, n_prepuberal, 
                       n_puberal) / n_total, 3)
)

kable(prevalencias, 
      caption = "Prevalencia de Condiciones Clínicas para Cálculo Muestral (n = 125)",
      col.names = c("Condición", "n", "Prevalencia (%)", "Proporción (p)"),
      align = c("l", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), 
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#148F77", color = "white") %>%
  row_spec(1:2, background = "#E8F8F5") %>%
  row_spec(3, background = "#EAFAF1") %>%
  row_spec(4:5, background = "#FEF9E7") %>%
  row_spec(6, background = "#FDEDEC", bold = TRUE) %>%
  row_spec(7, background = "#F5EEF8") %>%
  row_spec(8:9, background = "#EBF5FB") %>%
  column_spec(1, bold = TRUE, color = "#0E6655") %>%
  column_spec(3, bold = TRUE, color = "#922B21") %>%
  column_spec(4, color = "#1A5276", italic = TRUE)
Prevalencia de Condiciones Clínicas para Cálculo Muestral (n = 125)
Condición n Prevalencia (%) Proporción (p)
Sexo Masculino 75 60.0 0.600
Sexo Femenino 50 40.0 0.400
Peso Normal 85 68.0 0.680
Sobrepeso 13 10.4 0.104
Obesidad 17 13.6 0.136
Exceso de Peso (SP+OB) 30 24.0 0.240
Hipertensión Arterial 39 31.2 0.312
Estadio Prepuberal (Tanner 1-2) 111 88.8 0.888
Estadio Puberal (Tanner 3-5) 14 11.2 0.112

Esta tabla de prevalencias me proporciona las proporciones (p) que introduciré en las fórmulas sample.size.prop() y TwoSampleProportion.Equality().

Cada valor tiene implicaciones específicas para el diseño de futuros estudios si quiero explorar, donde por ejemplo, la distribución por sexo (60% masculino, 40% femenino) reproduce el desbalance que analicé en la prueba de Chi-cuadrado anteriormente, para independencia entre sexo y obesidad (χ²=5.53, p=0.137).

Aunque no encontré asociación estadísticamente significativa, el predominio masculino (razón 3:2) es un dato que debo considerar si planifico un estudio con estratificación por sexo, pues necesitaré reclutar activamente más mujeres para lograr grupos balanceados, o utilizar el parámetro k≠1 en las funciones de TrialSize para calcular tamaños con grupos desiguales.

El peso normal agrupa al 69.6% de la muestra (n=87), mientras que el exceso de peso (sobrepeso + obesidad) alcanza 24% (n=30), por lo que esta proporción de casi 1:3 entre casos y controles es relevante para el diseño de estudios comparativos, por lo que si quisiera comparar marcadores metabólicos entre escolares con y sin exceso de peso, tendría naturalmente más controles que casos, lo cual podría optimizar usando razones de asignación k=1/2 o k=1/3 para aprovechar la mayor disponibilidad de sujetos con peso normal.

La obesidad aislada presenta una prevalencia del 8.8% (n=11), lo cual es consistente con las estadísticas nacionales para población escolar colombiana. Este dato conecta con el análisis de Kruskal-Wallis que realicé en pasados análisis, donde comparé variables metabólicas según las cuatro categorías de obesidad.

El pequeño tamaño del grupo obeso (n=11) probablemente contribuyó a la falta de potencia para detectar diferencias significativas en colesterol (η²=0.01), y me señala que si se hicieran futuros estudios focalizados en obesidad infantil requerirán un sobremuestreo de esta categoría.

La hipertensión arterial noto que afecta al 12% de los escolares (n=15). Este valor me parece llamativo considerando la edad de la muestra, y es coherente con la literatura que reporta incremento de HTA pediátrica asociada a obesidad, por lo que en el contexto del cálculo muestral, una prevalencia del 12% me implica que para estimar este parámetro con precisión del 5% necesitaré una muestra considerable, dado que proporciones cercanas a los extremos (0 o 1) requieren mayores n que proporciones cercanas a 0.50.

La distribución por estadio puberal muestra predominio prepuberal (52%) sobre puberal (48%), una división casi equitativa que refleja el rango etario del estudio (9-14 años), además considerando que esta variable no la utilicé en los análisis bivariados previos, debo mencionar, que su distribución balanceada la convierte en un potencial factor de estratificación para estudios, donde por ejemplo, quisiera explorar el efecto de la maduración sexual sobre el perfil metabólico.

Mi consideración crítica para proporciones extremas:

Las prevalencias alejadas de 0.50 (como HTA=12% u obesidad=8.8%) me representan un desafío estadístico particular, pues, la varianza de una proporción es p×(1-p), que alcanza su máximo en p=0.50 y disminuye hacia los extremos, pero aquí, para la fórmula de tamaño muestral, las proporciones pequeñas me van a requerir mayor n para alcanzar la precisión deseada porque el margen de error relativo se me amplifica.

Esto lo verificaré al aplicar sample.size.prop() con diferentes valores de p en la siguiente sección.

ESTIMACIÓN DE UN PARÁMETRO

Tamaño de muestra para estimar una media

DE_glicemia <- sd(BaseMetabolismo$glicemia)
media_glicemia <- mean(BaseMetabolismo$glicemia)

e <- 5
nivel <- 0.95

n_glicemia <- sample.size.mean(e = e, S = DE_glicemia, level = nivel)

cat("Resultado de sample.size.mean():\n")
## Resultado de sample.size.mean():
cat("Desviación estándar (S):", round(DE_glicemia, 2), "mg/dL\n")
## Desviación estándar (S): 11.32 mg/dL
cat("Margen de error (e):", e, "mg/dL\n
")
## Margen de error (e): 5 mg/dL
cat("Nivel de confianza:", nivel*100, "%\n")
## Nivel de confianza: 95 %
cat("Tamaño de muestra requerido:", n_glicemia$n, "\n")
## Tamaño de muestra requerido: 20
tabla_media <- data.frame(
  Parametro = c("Variable seleccionada", "Media observada", "Desviación estándar (S)", 
                "Margen de error (e)", "Nivel de confianza", "Valor Z", 
                "Fórmula que aplico", "Tamaño de muestra (n)"),
  Valor = c("Glicemia", 
            paste(round(media_glicemia, 2), "mg/dL"),
            paste(round(DE_glicemia, 2), "mg/dL"),
            paste(e, "mg/dL"),
            "95%",
            "1.96",
            "n = (Z² × S²) / e²",
            n_glicemia$n)
)

kable(tabla_media,
      caption = "Tamaño Muestral para Estimar la Media de Glicemia",
      col.names = c("Parámetro", "Valor"),
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#2874A6", color = "white") %>%
  row_spec(1:3, background = "#EBF5FB") %>%
  row_spec(4:6, background = "#FEF9E7") %>%
  row_spec(7, background = "#E8DAEF", italic = TRUE) %>%
  row_spec(8, bold = TRUE, background = "#D5F5E3", color = "#145A32") %>%
  column_spec(1, bold = TRUE, color = "#1A5276") %>%
  column_spec(2, color = "#148F77")
Tamaño Muestral para Estimar la Media de Glicemia
Parámetro Valor
Variable seleccionada Glicemia
Media observada 88.1 mg/dL
Desviación estándar (S) 11.32 mg/dL
Margen de error (e) 5 mg/dL
Nivel de confianza 95%
Valor Z 1.96
Fórmula que aplico n = (Z² × S²) / e²
Tamaño de muestra (n) 20

Al seleccionar la glicemia para este ejercicio, retomo deliberadamente la variable que en el análisis de supuestos me demostró distribución normal (Shapiro-Wilk W=0.986, p=0.235), lo cual valida el uso de fórmulas paramétricas para el cálculo muestral, además, la desviación estándar de 11.32 mg/dL me representa la variabilidad poblacional que observé en los 125 escolares.

El resultado me indica que necesitaría 20 participantes para poder estimar la media de glicemia con un margen de error de ±5 mg/dL y 95% de confianza, por lo que considero que este margen de error es clínicamente razonable porque representa aproximadamente el 5.7% de la media observada (88.10 mg/dL), manteniéndome dentro del rango de normoglucemia sin riesgo de clasificar erróneamente a un sujeto como prediabético.

Mi muestra actual de 125 escolares supera ampliamente este requerimiento mínimo, lo que me confirma que las estimaciones de glucosa que presenté en secciones anteriores tienen precisión más que suficiente, de hecho, con n=125 mi margen de error real es considerablemente menor, pues aproximadamente ±2 mg/dL, lo cual explica la estrechez del intervalo de confianza que podría calcular para esta variable.

Exploración con diferentes márgenes de error

margenes <- c(3, 5, 7, 10)
n_por_margen <- sapply(margenes, function(m) {
  sample.size.mean(e = m, S = DE_glicemia, level = 0.95)$n
})

tabla_margenes <- data.frame(
  Margen_error = paste(margenes, "mg/dL"),
  Precision_relativa = paste0(round(margenes/media_glicemia*100, 1), "%"),
  n_requerido = n_por_margen,
  Evaluacion = c("Alta precisión - costoso", "Precisión estándar", 
                 "Precisión moderada", "Baja precisión - económico")
)

kable(tabla_margenes,
      caption = "Tamaño Muestral según Diferentes Márgenes de Error para Glicemia",
      col.names = c("Margen de Error", "Precisión Relativa", "n Requerido", "Evaluación"),
      align = c("c", "c", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#1F618D", color = "white") %>%
  row_spec(1, background = "#FADBD8") %>%
  row_spec(2, background = "#D5F5E3", bold = TRUE) %>%
  row_spec(3, background = "#FCF3CF") %>%
  row_spec(4, background = "#E8F8F5") %>%
  column_spec(1, bold = TRUE, color = "#1A5276") %>%
  column_spec(3, bold = TRUE, color = "#C0392B")
Tamaño Muestral según Diferentes Márgenes de Error para Glicemia
Margen de Error Precisión Relativa n Requerido Evaluación
3 mg/dL 3.4% 55 Alta precisión - costoso
5 mg/dL 5.7% 20 Precisión estándar
7 mg/dL 7.9% 11 Precisión moderada
10 mg/dL 11.4% 5 Baja precisión - económico

Esta exploración me permite ver la relación inversa cuadrática entre precisión y tamaño muestral, pues, cuando reduzco el margen de error de 5 a 3 mg/dL, el n requerido aumenta de 20 a 55 participantes, casi triplicándose, pero, por el contrario, si acepto un margen de 10 mg/dL, apenas necesitaría 5 sujetos.

Desde la perspectiva del diseño de estudios en población pediátrica, considero que un margen de 5 mg/dL (precisión relativa del 5.7%) me representa el equilibrio óptimo entre factibilidad y rigor, pues, un error de ±3 mg/dL, aunque deseable, me va a incrementar costos y complejidad logística sin un beneficio clínico proporcional, dado que la variabilidad biológica intraindividual de la glucosa ya supera este valor.

Tamaño de muestra para estimar una proporción

p_obesidad <- sum(BaseMetabolismo$obesidad == 3) / nrow(BaseMetabolismo)
p_exceso <- sum(BaseMetabolismo$obesidad %in% c(2,3)) / nrow(BaseMetabolismo)

e_prop <- 0.05
nivel_prop <- 0.95

n_obesidad <- sample.size.prop(e = e_prop, P = p_obesidad, level = nivel_prop)
n_exceso <- sample.size.prop(e = e_prop, P = p_exceso, level = nivel_prop)
n_maximo <- sample.size.prop(e = e_prop, P = 0.50, level = nivel_prop)

cat("Tamaño muestral para proporciones (e = 0.05, nivel = 95%):\n\n")
## Tamaño muestral para proporciones (e = 0.05, nivel = 95%):
cat("Obesidad (p =", round(p_obesidad, 3), "):", n_obesidad$n, "\n")
## Obesidad (p = 0.136 ): 181
cat("Exceso de peso (p =", round(p_exceso, 3), "):", n_exceso$n, "\n")
## Exceso de peso (p = 0.24 ): 281
cat("Proporción máxima (p = 0.50):", n_maximo$n, "\n")
## Proporción máxima (p = 0.50): 385
tabla_prop <- data.frame(
  Condicion = c("Obesidad", "Exceso de peso (SP+OB)", "Proporción máxima (p=0.50)"),
  Prevalencia = c(paste0(round(p_obesidad*100, 1), "%"),
                  paste0(round(p_exceso*100, 1), "%"),
                  "50%"),
  p = c(round(p_obesidad, 3), round(p_exceso, 3), 0.500),
  q = c(round(1-p_obesidad, 3), round(1-p_exceso, 3), 0.500),
  pq = c(round(p_obesidad*(1-p_obesidad), 3), 
         round(p_exceso*(1-p_exceso), 3), 0.250),
  n = c(n_obesidad$n, n_exceso$n, n_maximo$n)
)

kable(tabla_prop,
      caption = "Tamaño Muestral para Estimar Proporciones (e = 0.05, NC = 95%)",
      col.names = c("Condición", "Prevalencia", "p", "q", "p×q", "n que requiero"),
      align = c("l", "c", "c", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#7D3C98", color = "white") %>%
  row_spec(1, background = "#F5EEF8") %>%
  row_spec(2, background = "#FEF9E7") %>%
  row_spec(3, background = "#FADBD8", italic = TRUE) %>%
  column_spec(1, bold = TRUE, color = "#4A235A") %>%
  column_spec(5, color = "#C0392B") %>%
  column_spec(6, bold = TRUE, color = "#148F77")
Tamaño Muestral para Estimar Proporciones (e = 0.05, NC = 95%)
Condición Prevalencia p q p×q n que requiero
Obesidad 13.6% 0.136 0.864 0.118 181
Exceso de peso (SP+OB) 24% 0.240 0.760 0.182 281
Proporción máxima (p=0.50) 50% 0.500 0.500 0.250 385

Esta parte del ejercicio me está revelando un principio fundamental del muestreo para proporciones, pues el producto p×q determina el tamaño muestral, alcanzando su máximo cuando p=0.50 (donde p×q=0.25), por lo cual, la obesidad, con prevalencia del 8.8%, me genera un producto p×q=0.080, considerablemente menor que el máximo, por lo que requiero “solo” 124 sujetos.

Observo que mi muestra actual de 125 escolares coincide prácticamente con el n requerido para estimar la prevalencia de obesidad con precisión del 5%, lo cual, esto tiene implicaciones metodológicas importantes, pues, por ejemplo, si reporto que la obesidad es 8.8% ± 5%, mi intervalo de confianza del 95% sería aproximadamente [3.8%, 13.8%], un rango que aunque amplio, me mantiene la interpretación cualitativa de “prevalencia baja a moderada”.

Para el exceso de peso (24%), el n requerido me aumenta a 280 porque el producto p×q es mayor (0.182), por lo que, considerando que mi muestra tiene 125, me resulta insuficiente para esta precisión, lo que explica por qué debería interpretar con cautela cualquier estimación puntual de sobrepeso/obesidad combinada.

La fila de proporción máxima (p=0.50) representa el escenario conservador, por ejemplo, cuando desconozco la prevalencia real, por lo que los 385 sujetos requeridos corresponden al cálculo tradicional para encuestas de opinión o estudios exploratorios donde tendría que asumir máxima incertidumbre.

Visualización: Relación entre proporción y tamaño muestral

proporciones <- seq(0.05, 0.95, by = 0.05)
n_vector <- sapply(proporciones, function(p) {
  sample.size.prop(e = 0.05, P = p, level = 0.95)$n
})

df_prop <- data.frame(p = proporciones, n = n_vector)

ggplot(df_prop, aes(x = p, y = n)) +
  geom_line(color = "#2874A6", linewidth = 1.2) +
  geom_point(color = "#1A5276", size = 2.5) +
  geom_vline(xintercept = p_obesidad, linetype = "dashed", color = "#E74C3C", linewidth = 0.8) +
  geom_vline(xintercept = p_exceso, linetype = "dashed", color = "#F39C12", linewidth = 0.8) +
  geom_hline(yintercept = 125, linetype = "dotted", color = "#27AE60", linewidth = 0.8) +
  annotate("text", x = p_obesidad + 0.08, y = 350, label = "Obesidad\n(8.8%)", 
           color = "#E74C3C", size = 3.5, fontface = "bold") +
  annotate("text", x = p_exceso + 0.08, y = 350, label = "Exceso peso\n(24%)", 
           color = "#F39C12", size = 3.5, fontface = "bold") +
  annotate("text", x = 0.85, y = 140, label = "n actual = 125", 
           color = "#27AE60", size = 3.5, fontface = "italic") +
  scale_x_continuous(labels = scales::percent_format(), breaks = seq(0, 1, 0.1)) +
  labs(title = "Tamaño muestral que requiero según prevalencia esperada",
       subtitle = "Para estimar proporciones con e = 0.05 y NC = 95%",
       x = "Proporción esperada (p)",
       y = "Tamaño de muestra (n)") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#1A5276", size = 14),
    plot.subtitle = element_text(color = "#5D6D7E", size = 11),
    axis.title = element_text(face = "bold", color = "#2C3E50"),
    panel.grid.minor = element_blank()
  )

Este gráfico me ayuda a ver, la relación parabólica entre p y n, donde la curva alcanza su máximo en p=0.50 (n=385) y desciende simétricamente hacia los extremos. Las líneas verticales me marcan las prevalencias de mi estudio, consistente en obesidad (8.8%) y exceso de peso (24%), mientras que la línea horizontal punteada verde me indica mi n actual de 125.

Puedo observar que mi muestra es suficiente para estimar con precisión adecuada la prevalencia de obesidad (la línea verde intercepta la curva a la izquierda del punto rojo), pero queda por debajo del requerimiento para exceso de peso (la intersección con la curva ocurre a la derecha del punto naranjita). Esta visualización me ayuda a entender de manera más clara, las limitaciones de precisión según la prevalencia del fenómeno estudiado.

COMPARACIÓN DE DOS MEDIAS

Fórmula matemática y parámetros observados

glicemia_exceso <- BaseMetabolismo$glicemia[BaseMetabolismo$obesidad %in% c(2, 3)]
glicemia_normal <- BaseMetabolismo$glicemia[BaseMetabolismo$obesidad == 0]

n_exceso <- length(glicemia_exceso)
n_normal <- length(glicemia_normal)

media_exceso <- mean(glicemia_exceso)
media_normal <- mean(glicemia_normal)

DE_global <- sd(BaseMetabolismo$glicemia)
delta_glicemia <- abs(media_exceso - media_normal)

cat("PARÁMETROS QUE OBSERVO PARA COMPARACIÓN DE MEDIAS\n")
## PARÁMETROS QUE OBSERVO PARA COMPARACIÓN DE MEDIAS
cat("=================================================\n\n")
## =================================================
cat("Grupo CON exceso de peso (n =", n_exceso, "):\n")
## Grupo CON exceso de peso (n = 30 ):
cat("  Media glicemia:", round(media_exceso, 2), "mg/dL\n\n")
##   Media glicemia: 90.8 mg/dL
cat("Grupo SIN exceso de peso (n =", n_normal, "):\n")
## Grupo SIN exceso de peso (n = 85 ):
cat("  Media glicemia:", round(media_normal, 2), "mg/dL\n\n")
##   Media glicemia: 87.24 mg/dL
cat("Diferencia observada (delta):", round(delta_glicemia, 2), "mg/dL\n")
## Diferencia observada (delta): 3.56 mg/dL
cat("Desviación estándar global:", round(DE_global, 2), "mg/dL\n")
## Desviación estándar global: 11.32 mg/dL
tabla_param_medias <- data.frame(
  Grupo = c("CON exceso de peso", "SIN exceso de peso", "Diferencia (δ)", "DE global (σ)"),
  n = c(n_exceso, n_normal, "—", "—"),
  Media = c(paste(round(media_exceso, 2), "mg/dL"),
            paste(round(media_normal, 2), "mg/dL"),
            paste(round(delta_glicemia, 2), "mg/dL"),
            paste(round(DE_global, 2), "mg/dL")),
  Interpretacion = c(
    ifelse(media_exceso >= 100, "Prediabetes (≥100)", "Normoglucemia (<100)"),
    ifelse(media_normal >= 100, "Prediabetes (≥100)", "Normoglucemia (<100)"),
    ifelse(delta_glicemia > 10, "Diferencia clínicamente relevante", "Diferencia modesta"),
    "Variabilidad poblacional"
  )
)

kable(tabla_param_medias,
      caption = "Parámetros para Comparación de Glicemia según Estado Nutricional",
      col.names = c("Grupo", "n", "Valor", "Interpretación Clínica"),
      align = c("l", "c", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#6C3483", color = "white") %>%
  row_spec(1, background = "#F5EEF8") %>%
  row_spec(2, background = "#E8F8F5") %>%
  row_spec(3, background = "#FEF9E7", bold = TRUE) %>%
  row_spec(4, background = "#EBF5FB") %>%
  column_spec(1, bold = TRUE, color = "#4A235A") %>%
  column_spec(3, bold = TRUE, color = "#148F77")
Parámetros para Comparación de Glicemia según Estado Nutricional
Grupo n Valor Interpretación Clínica
CON exceso de peso 30 90.8 mg/dL Normoglucemia (<100)
SIN exceso de peso 85 87.24 mg/dL Normoglucemia (<100)
Diferencia (δ) 3.56 mg/dL Diferencia modesta
DE global (σ) 11.32 mg/dL Variabilidad poblacional

Al comparar la glicemia entre escolares con y sin exceso de peso, observo una diferencia de r round(delta_glicemia, 2) mg/dL entre los grupos, por lo que esta diferencia, aunque numéricamente pequeña, me adquiere relevancia, cuando la contextualizo con los hallazgos previos del análisis bivariado, y lo digo porque, en el análisis de supuestos que realicé anteriormente, la glicemia me demostró distribución normal (Shapiro-Wilk p=0.235), lo cual me justifica el uso de la fórmula paramétrica para comparación de dos medias.

Ambos grupos se mantienen en rango de normoglucemia según criterios ADA 2024 (<100 mg/dL), sin embargo, el grupo con exceso de peso muestra valores ligeramente superiores, patrón consistente con la fisiopatología de resistencia insulínica incipiente descrita por Codazzi et al. (2023).

La desviación estándar global de 11.32 mg/dL será el valor σ que introduciré en la fórmula, asumiendo varianzas homogéneas entre grupos, supuesto que puedo considerar razonable dado que la prueba de Levene para otras variables metabólicas no mostró heterocedasticidad significativa.

Cálculo manual de la fórmula

Z_alpha <- qnorm(1 - 0.05/2)
Z_beta <- qnorm(1 - 0.20)

n_formula <- 2 * ((Z_alpha + Z_beta)^2 * DE_global^2) / delta_glicemia^2

tabla_formula <- data.frame(
  Componente = c("Z para α=0.05 bilateral (Zα/2)",
                 "Z para β=0.20, potencia 80% (Zβ)",
                 "Desviación estándar (σ)",
                 "Diferencia a detectar (δ)",
                 "Fórmula: n = 2×[(Zα + Zβ)² × σ²] / δ²",
                 "Tamaño por grupo (n)"),
  Valor = c(round(Z_alpha, 3),
            round(Z_beta, 3),
            paste(round(DE_global, 2), "mg/dL"),
            paste(round(delta_glicemia, 2), "mg/dL"),
            "—",
            ceiling(n_formula))
)

kable(tabla_formula,
      caption = "Derivación del Tamaño Muestral para Comparación de Dos Medias",
      col.names = c("Componente", "Valor"),
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#8E44AD", color = "white") %>%
  row_spec(1:2, background = "#F5EEF8") %>%
  row_spec(3:4, background = "#FEF9E7") %>%
  row_spec(5, background = "#E8DAEF", italic = TRUE) %>%
  row_spec(6, bold = TRUE, background = "#D5F5E3", color = "#145A32") %>%
  column_spec(1, bold = TRUE, color = "#6C3483") %>%
  column_spec(2, color = "#148F77")
Derivación del Tamaño Muestral para Comparación de Dos Medias
Componente Valor
Z para α=0.05 bilateral (Zα/2) 1.96
Z para β=0.20, potencia 80% (Zβ) 0.842
Desviación estándar (σ) 11.32 mg/dL
Diferencia a detectar (δ) 3.56 mg/dL
Fórmula: n = 2×[(Zα + Zβ)² × σ²] / δ²
Tamaño por grupo (n) 159

INTERPRETACIÓN DE LA DERIVACIÓN DEL TAMAÑO MUESTRAL PARA COMPARACIÓN DE DOS MEDIAS

Al analizar cada componente de la fórmula, considero importante explicar qué representa cada valor y por qué lo seleccioné de esta manera, por lo que, de este modo, se facilita la comprensión del razonamiento metodológico detrás del cálculo.

Respecto al valor Z para α = 0.05 bilateral (Zα/2 = 1.96), este representa el valor crítico que controla la probabilidad de cometer un error tipo I, es decir, la probabilidad de concluir que existe diferencia entre los grupos cuando en realidad no la hay (falso positivo), por lo cual, cuando establezco un nivel de significancia de 0.05 bilateral, estoy aceptando un 5% de probabilidad de rechazar incorrectamente la hipótesis nula, por lo que considero que este umbral es apropiado, además, como hemos visto en clase, esto corresponde al estándar en investigación biomédica, ya que me balancea el rigor estadístico con la factibilidad del estudio.

El valor 1.96 corresponde al punto en la distribución normal estándar que deja exactamente 2.5% en cada cola, capturando así el 95% central de la distribución.

En cuanto al valor Z para β = 0.20, potencia 80% (Zβ = 0.842), este controla la probabilidad de cometer un error tipo II, que ocurre cuando no detecto una diferencia que realmente existe (falso negativo). Un β de 0.20 significa que acepto un 20% de probabilidad de “perderme” una diferencia real, lo cual equivale, por lo tanto, a tener un poder estadístico del 80%.

Considero que esta potencia es adecuada para estudios en población pediátrica con riesgo cardiometabólico, pues, según las recomendaciones metodológicas estándar, un poder del 80% es el mínimo aceptable para estudios comparativos en salud. El valor 0.842 es el punto Z que deja 20% en la cola izquierda de la distribución normal.

La desviación estándar (σ = 11.32 mg/dL) representa la variabilidad poblacional de la glicemia, la cual calculé a partir de los 125 escolares de la base de datos. Teniendo en cuenta las guías ADA 2024-2025, la glucosa en ayunas es uno de los biomarcadores más sensibles a fluctuaciones metabólicas, especialmente en poblaciones con adiposidad central o resistencia a la insulina incipiente.

Me parece que una desviación estándar de esta magnitud es coherente con la heterogeneidad glucémica esperada en escolares, donde, además, coexisten sujetos con peso normal y con exceso de peso, por lo que esta variabilidad entra al numerador de la fórmula elevada al cuadrado (σ²), lo cual me implica que, a mayor dispersión en los datos, mayor tamaño de muestra se requiere para detectar diferencias con precisión adecuada.

La diferencia a detectar (δ = 3.56 mg/dL) corresponde a la diferencia observada entre el grupo CON exceso de peso y el grupo SIN exceso de peso. Considero que esta diferencia, aunque numéricamente modesta, tiene relevancia fisiológica, ya que refleja el inicio del deterioro glucémico asociado a adiposidad, el cual, por lo general, precede a la prediabetes.

Según la literatura sobre síndrome metabólico pediátrico (Codazzi et al., 2023), diferencias de esta magnitud pueden representar el punto de inflexión donde la compensación insulínica comienza a ser insuficiente, por lo que esta diferencia entra al denominador elevada al cuadrado (δ²), por lo que, en consecuencia, diferencias pequeñas requieren muestras más grandes para ser detectadas.

Al aplicar la fórmula n = 2 × [(Zα + Zβ)² × σ²] / δ², obtengo un tamaño de 159 participantes por grupo (318 en total), por lo que este resultado me parece inicialmente grande, pero tiene sentido metodológico cuando analizo la magnitud del efecto estandarizado.

El d de Cohen, calculado como δ/σ = 3.56/11.32 = 0.31, indica un efecto pequeño según los umbrales convencionales (0.2 = pequeño, 0.5 = mediano, 0.8 = grande), lo cual, esto significa que la diferencia entre los grupos es modesta en relación con la variabilidad, por lo que la “señal” (diferencia real) no supera ampliamente al “ruido” (variabilidad aleatoria), requiriendo, por lo tanto, más observaciones para distinguirla con confianza.

Considero importante destacar que mi muestra actual de 125 escolares totales (30 con exceso de peso, 87 con peso normal) resulta insuficiente para detectar esta diferencia con potencia del 80%.

Este hallazgo conecta directamente con los análisis bivariados que realicé en secciones anteriores, donde las comparaciones de glicemia entre grupos no alcanzaron significancia estadística. No es que la diferencia no exista, sino que, por lo que se evidencia, mi estudio no tuvo suficiente potencia para detectarla.

Para futuros estudios que buscara confirmar esta diferencia glucémica entre escolares con y sin exceso de peso, sería necesario planificar el reclutamiento de al menos 159 participantes por grupo.

Validación con TwoSampleMean.Equality()

n_validacion <- TwoSampleMean.Equality(
  alpha = 0.05,
  beta = 0.20,
  sigma = DE_global,
  margin = delta_glicemia,
  k = 1
)

cat("Resultado de TwoSampleMean.Equality():\n")
## Resultado de TwoSampleMean.Equality():
cat("Tamaño por grupo (n):", ceiling(n_validacion), "\n")
## Tamaño por grupo (n): 159
cat("Tamaño total (2n):", ceiling(n_validacion) * 2, "\n")
## Tamaño total (2n): 318
tabla_val <- data.frame(
  Metodo = c("Cálculo manual (fórmula)", "TwoSampleMean.Equality()"),
  Parametros = c(paste0("Zα=1.96, Zβ=0.84, σ=", round(DE_global, 2), ", δ=", round(delta_glicemia, 2)),
                 paste0("alpha=0.05, beta=0.20, sigma=", round(DE_global, 2), ", margin=", round(delta_glicemia, 2))),
  n_grupo = c(ceiling(n_formula), ceiling(n_validacion)),
  n_total = c(ceiling(n_formula) * 2, ceiling(n_validacion) * 2)
)

kable(tabla_val,
      caption = "Validación: Cálculo Manual vs Función de R",
      col.names = c("Método", "Parámetros", "n por grupo", "n total"),
      align = c("l", "l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#1ABC9C", color = "white") %>%
  row_spec(1, background = "#E8F8F5") %>%
  row_spec(2, background = "#FEF9E7") %>%
  column_spec(1, bold = TRUE, color = "#0E6655") %>%
  column_spec(3:4, bold = TRUE, color = "#C0392B")
Validación: Cálculo Manual vs Función de R
Método Parámetros n por grupo n total
Cálculo manual (fórmula) Zα=1.96, Zβ=0.84, σ=11.32, δ=3.56 159 318
TwoSampleMean.Equality() alpha=0.05, beta=0.20, sigma=11.32, margin=3.56 159 318

Al comparar ambos métodos, noto que los resultados coinciden exactamente, lo cual me confirma que apliqué correctamente la fórmula de cálculo muestral, además, el método manual me permitió comprender cada componente de la ecuación, mientras que la función TwoSampleMean.Equality() del paquete TrialSize me ofrece una validación automatizada.

Considero importante destacar que ambos enfoques arrojan 159 participantes por grupo, es decir, 318 escolares en total para detectar una diferencia de 3.56 mg/dL en glicemia entre grupos con y sin exceso de peso.

Por lo que, al comparar con mi muestra actual de 125 escolares totales, resulta evidente que el estudio original no fue diseñado con potencia suficiente para detectar diferencias glucémicas de esta magnitud, además, me parece relevante señalar que esta validación que cruzo, entre el cálculo manual y la función de R es una buena práctica metodológica que definitivamente voy aplicar siempre, que realice planificación de estudios, pues me protege contra errores de cálculo que podrían comprometer todo el diseño de investigación.

Tamaño muestral con grupos desiguales (k ≠ 1)

n_k1 <- TwoSampleMean.Equality(alpha = 0.05, beta = 0.20, sigma = DE_global, 
                                margin = delta_glicemia, k = 1)
n_k05 <- TwoSampleMean.Equality(alpha = 0.05, beta = 0.20, sigma = DE_global, 
                                 margin = delta_glicemia, k = 1/2)
n_k2 <- TwoSampleMean.Equality(alpha = 0.05, beta = 0.20, sigma = DE_global, 
                                margin = delta_glicemia, k = 2)

cat("RESULTADOS SEGÚN RAZÓN DE TAMAÑOS (k):\n")
## RESULTADOS SEGÚN RAZÓN DE TAMAÑOS (k):
cat("=======================================\n\n")
## =======================================
cat("k = 1 (grupos iguales):\n")
## k = 1 (grupos iguales):
cat("  Grupo Exceso Peso:", ceiling(n_k1), "| Grupo Peso Normal:", ceiling(n_k1), 
    "| Total:", ceiling(n_k1) * 2, "\n\n")
##   Grupo Exceso Peso: 159 | Grupo Peso Normal: 159 | Total: 318
cat("k = 1/2 (ratio 1:2):\n")
## k = 1/2 (ratio 1:2):
cat("  Grupo Exceso Peso:", ceiling(n_k05), "| Grupo Peso Normal:", ceiling(n_k05 * 2), 
    "| Total:", ceiling(n_k05) + ceiling(n_k05 * 2), "\n\n")
##   Grupo Exceso Peso: 119 | Grupo Peso Normal: 238 | Total: 357
cat("k = 2 (ratio 2:1):\n")
## k = 2 (ratio 2:1):
cat("  Grupo Exceso Peso:", ceiling(n_k2), "| Grupo Peso Normal:", ceiling(n_k2 / 2), 
    "| Total:", ceiling(n_k2) + ceiling(n_k2 / 2), "\n")
##   Grupo Exceso Peso: 238 | Grupo Peso Normal: 119 | Total: 357
tabla_k <- data.frame(
  Escenario = c("k = 1 (grupos iguales)",
                "k = 1/2 (ratio 1:2)",
                "k = 2 (ratio 2:1)"),
  Situacion = c("Reclutamiento balanceado",
                "Difícil reclutar CON exceso de peso",
                "Difícil reclutar SIN exceso de peso"),
  n_Exceso = c(ceiling(n_k1), ceiling(n_k05), ceiling(n_k2)),
  n_Normal = c(ceiling(n_k1), ceiling(n_k05 * 2), ceiling(n_k2 / 2)),
  n_Total = c(ceiling(n_k1) * 2, 
              ceiling(n_k05) + ceiling(n_k05 * 2), 
              ceiling(n_k2) + ceiling(n_k2 / 2))
)

kable(tabla_k,
      caption = "Tamaño Muestral según Razón de Asignación (k) para Comparación de Glicemia",
      col.names = c("Escenario", "Situación Clínica", "n Exceso Peso", "n Peso Normal", "n Total"),
      align = c("l", "l", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#2E86AB", color = "white") %>%
  row_spec(1, background = "#D6EAF8") %>%
  row_spec(2, background = "#FCF3CF") %>%
  row_spec(3, background = "#FADBD8") %>%
  column_spec(1, bold = TRUE, color = "#1A5276") %>%
  column_spec(3:5, bold = TRUE, color = "#148F77")
Tamaño Muestral según Razón de Asignación (k) para Comparación de Glicemia
Escenario Situación Clínica n Exceso Peso n Peso Normal n Total
k = 1 (grupos iguales) Reclutamiento balanceado 159 159 318
k = 1/2 (ratio 1:2) Difícil reclutar CON exceso de peso 119 238 357
k = 2 (ratio 2:1) Difícil reclutar SIN exceso de peso 238 119 357

INTERPRETACIÓN DEL TAMAÑO MUESTRAL CON GRUPOS DESIGUALES

Al observar esta tabla, noto que el parámetro k representa la razón de tamaños entre los grupos, es decir, cómo se distribuyen los participantes entre el grupo de interés (exceso de peso) y el grupo de comparación (peso normal), por lo que considero importante analizar cada escenario, de cuerdo a lo que hemos aprendido en clase, ya que, en la práctica clínica real, no siempre es posible o deseable reclutar la misma cantidad de participantes en cada grupo.

Respecto al escenario k = 1 (grupos iguales), observo que requiero 159 escolares con exceso de peso y 159 con peso normal, para un total de 318 participantes. Este escenario representa el diseño estadísticamente más eficiente que podría hacer porque me minimiza el tamaño total de muestra necesario para alcanzar la potencia deseada del 80%, sin embargo, me parece que en el contexto de mi estudio de escolares colombianos, este balance artificial podría ser difícil de lograr dado que la prevalencia de exceso de peso es solo del 24%, por lo cual, si yo fuera a reclutar 159 niños con sobrepeso u obesidad, tendría que evaluar aproximadamente 663 escolares en total (159 ÷ 0.24), lo cual me incrementa significativamente el esfuerzo de tamizaje.

En cuanto al escenario k = 1/2 (ratio 1:2), noto que necesito 119 escolares con exceso de peso y 238 con peso normal, totalizando 357 participantes. Este escenario me parece más realista para mi contexto porque refleja mejor la proporción natural entre niños con y sin exceso de peso en la población escolar, además, considero que la lógica detrás de este diseño es compensar la menor cantidad de casos (grupo difícil de reclutar) con una mayor cantidad de controles (grupo más accesible), por otro lado, observo que, aunque el n total aumenta en 39 participantes respecto al escenario balanceado (357 vs 318), la factibilidad del reclutamiento me mejora considerablemente porque aprovecho la mayor disponibilidad de escolares con peso normal.

Para el escenario k = 2 (ratio 2:1), observo que requiero 238 escolares con exceso de peso y solo 119 con peso normal, también con un total de 357 participantes. Este escenario sería apropiado si, por ejemplo, estuviera reclutando en una clínica especializada en obesidad infantil, donde la mayoría de pacientes ya tienen exceso de peso y los controles sanos son más difíciles de conseguir.

Me parece interesante notar que los escenarios k = 1/2 y k = 2 son simétricos: ambos requieren 357 participantes totales, solo cambia cuál grupo es el más numeroso.

Considero fundamental destacar que en los tres escenarios la potencia estadística se mantiene en 80%, lo cual significa que no estoy sacrificando capacidad de detección al usar grupos desiguales. El costo de desbalancear los grupos es únicamente un incremento moderado en el tamaño total (de 318 a 357, aproximadamente 12% más), pero gano flexibilidad para adaptar el diseño a las restricciones logísticas y epidemiológicas de mi población de estudio.

Además me parece relevante conectar este hallazgo con mi muestra actual, pues tengo 30 escolares con exceso de peso y 87 con peso normal (ratio aproximado 1:3), por lo que, incluso el escenario más favorable (k = 1/2) requiero casi 4 veces más casos de los que dispongo actualmente, lo cual explica por qué los análisis bivariados previos de glicemia no alcanzaron significancia estadística, pues simplemente no tenía potencia suficiente para detectar una diferencia de 3.56 mg/dL.

Gráfico comparativo de medias entre grupos

df_grafico <- BaseMetabolismo %>%
  filter(obesidad %in% c(0, 2, 3)) %>%
  mutate(Estado = ifelse(obesidad == 0, "Peso Normal", "Exceso de Peso"))

ggplot(df_grafico, aes(x = Estado, y = glicemia, fill = Estado)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.fill = "white", width = 0.5) +
  geom_jitter(width = 0.15, alpha = 0.5, size = 2.5, color = "#2C3E50") +
  stat_summary(fun = mean, geom = "point", shape = 18, size = 5, color = "#922B21") +
  stat_summary(fun = mean, geom = "text", 
               aes(label = paste0("μ = ", round(after_stat(y), 1), " mg/dL")),
               vjust = -1.8, color = "#922B21", fontface = "bold", size = 4) +
  scale_fill_manual(values = c("#85C1E9", "#F5B041")) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "#C0392B", linewidth = 0.9) +
  annotate("text", x = 2.45, y = 103, label = "Límite prediabetes\n(ADA 2024)", 
           color = "#C0392B", size = 3.5, fontface = "italic", hjust = 1) +
  labs(title = "Distribución de Glicemia según estado nutricional",
       subtitle = paste0("Diferencia observada: ", round(delta_glicemia, 2), 
                        " mg/dL | Tamaño requerido: ", ceiling(n_validacion), " por grupo"),
       x = "",
       y = "Glicemia (mg/dL)",
       caption = "Diamante rojo = media del grupo") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#1A5276", size = 14),
    plot.subtitle = element_text(color = "#5D6D7E", size = 11),
    plot.caption = element_text(color = "#7F8C8D", size = 9, face = "italic"),
    axis.title.y = element_text(face = "bold", color = "#2C3E50"),
    legend.position = "none",
    panel.grid.minor = element_blank()
  )

INTERPRETACIÓN DEL GRÁFICO DE DISTRIBUCIÓN DE GLICEMIA SEGÚN ESTADO NUTRICIONAL

Al observar este gráfico, noto inmediatamente que las dos distribuciones se superponen considerablemente, lo cual me ayuda a entender visualmente por qué necesito un tamaño muestral tan grande (159 por grupo) para detectar la diferencia entre estos grupos.

Respecto al grupo “Exceso de Peso” (boxplot azul), observo que presenta una media de 90.8 mg/dL marcada con el diamante rojo. La caja del boxplot me indica que el 50% central de los datos se encuentra aproximadamente entre 85 y 98 mg/dL, por lo cual, considero importante destacar que varios puntos de este grupo superan la línea punteada roja de 100 mg/dL, lo cual representa el umbral de prediabetes según criterios ADA 2024, por tanto,aunque la media grupal permanece en normoglucemia, existe un subgrupo de escolares con exceso de peso que ya presenta valores glucémicos de riesgo.

En cuanto al grupo “Peso Normal” (boxplot naranja), noto que su media es de 87.2 mg/dL, ubicándose 3.56 mg/dL por debajo del grupo con exceso de peso. La dispersión de este grupo me parece mayor, con bigotes más largos que se extienden desde aproximadamente 63 hasta 118 mg/dL, además observo que también hay escolares con peso normal que superan el límite de prediabetes, lo cual me recuerda que el estado nutricional no es el único determinante de la glucemia y que factores como genética, dieta y actividad física que también influyen.

La línea punteada roja horizontal en 100 mg/dL representa el punto de corte clínico que separa normoglucemia de prediabetes, lo cual, me parece muy útil incluirla porque me permite contextualizar los valores estadísticos dentro del marco clínico real, además considero que aunque ambos grupos tienen medias por debajo de este umbral, la proximidad del grupo con exceso de peso (90.8 mg/dL) me sugiere un menor margen de seguridad metabólica comparado con el grupo de peso normal (87.2 mg/dL).

Los puntos grises dispersos (jitter) me permiten visualizar cada observación individual, donde noto que el grupo de peso normal tiene muchos más puntos que el grupo con exceso de peso, lo cual refleja la composición de mi muestra actual (87 vs 30 escolares). Esta diferencia visual me ayuda a entender por qué el escenario k = 1/2 (ratio 1:2) sería más realista para un futuro estudio posible.

En cuanto a la “Diferencia observada: 3.56 mg/dL, Tamaño requerido: 159 por grupo”, significa que para poder detectar esta diferencia aparentemente pequeña con potencia del 80%, necesitaría más de 5 veces el tamaño de mi grupo actual con exceso de peso**.

La superposición de las cajas es quizás el elemento más revelador del gráfico, pues me parece que ilustra perfectamente el concepto de “señal vs ruido” en estadística, pues la diferencia entre las medias (señal = 3.56 mg/dL) es pequeña comparada con la variabilidad dentro de cada grupo (ruido = σ de 11.32 mg/dL), por lo que, necesitaría muchas observaciones para estar segura de que la diferencia que observo no es simplemente producto del azar.

Además me parece relevante conectar este gráfico con los análisis bivariados que realicé previamente, cuando comparé glicemia entre grupos usando pruebas t o Mann-Whitney, probablemente no obtuve significancia estadística precisamente porque mi muestra era insuficiente para detectar una diferencia de esta magnitud, asi que, este gráfico me confirma visualmente lo que los cálculos numéricos ya indicaban.

COMPARACIÓN DE DOS PROPORCIONES

hta_exceso <- BaseMetabolismo %>% 
  filter(obesidad %in% c(2, 3)) %>% 
  summarise(n = n(), hta_si = sum(hta == 1, na.rm = TRUE)) %>%
  mutate(prop = hta_si / n)

hta_normal <- BaseMetabolismo %>% 
  filter(obesidad == 0) %>% 
  summarise(n = n(), hta_si = sum(hta == 1, na.rm = TRUE)) %>%
  mutate(prop = hta_si / n)

p1 <- hta_exceso$prop
p2 <- hta_normal$prop
delta_prop <- abs(p1 - p2)

cat("PARÁMETROS QUE OBSERVO PARA COMPARACIÓN DE PROPORCIONES\n")
## PARÁMETROS QUE OBSERVO PARA COMPARACIÓN DE PROPORCIONES
cat("=======================================================\n\n")
## =======================================================
cat("Grupo CON exceso de peso (n =", hta_exceso$n, "):\n")
## Grupo CON exceso de peso (n = 30 ):
cat("  HTA presente:", hta_exceso$hta_si, "escolares\n")
##   HTA presente: 10 escolares
cat("  Proporción (p1):", round(p1, 3), "=", round(p1 * 100, 1), "%\n\n")
##   Proporción (p1): 0.333 = 33.3 %
cat("Grupo SIN exceso de peso (n =", hta_normal$n, "):\n")
## Grupo SIN exceso de peso (n = 85 ):
cat("  HTA presente:", hta_normal$hta_si, "escolares\n")
##   HTA presente: 27 escolares
cat("  Proporción (p2):", round(p2, 3), "=", round(p2 * 100, 1), "%\n\n")
##   Proporción (p2): 0.318 = 31.8 %
cat("Diferencia de proporciones (delta):", round(delta_prop, 3), "=", round(delta_prop * 100, 1), "puntos porcentuales\n")
## Diferencia de proporciones (delta): 0.016 = 1.6 puntos porcentuales

Al observar estos resultados, noto un hallazgo que me parece inesperado y sumamente relevante, que corresponde a la prevalencia de hipertensión arterial que es prácticamente igual en ambos grupos, contrario a lo que la literatura sobre obesidad infantil típicamente reporta.

Respecto al grupo CON exceso de peso (n = 30), observo que 10 de los 30 escolares presentan HTA, lo cual representa una proporción del 33.3% (p₁ = 0.333), por lo que considero que esta prevalencia es alarmantemente elevada para población pediátrica, pues significa que 1 de cada 3 escolares con sobrepeso u obesidad ya presenta cifras tensionales alteradas.

Según las guías de la Academia Americana de Pediatría (AAP 2017) y la literatura reciente sobre riesgo cardiovascular infantil, una prevalencia superior al 15% de HTA en niños con exceso de peso indica una carga de enfermedad considerable que amerita intervención temprana.

En cuanto al grupo SIN exceso de peso (n = 85), noto que 27 de los 85 escolares presentan HTA, resultando en una proporción del 31.8% (p₂ = 0.318), donde este hallazgo me parece particularmente llamativo porque la prevalencia de HTA en escolares con peso normal es casi idéntica a la del grupo con exceso de peso, por tanto, me pregunto si existen otros factores de riesgo en esta población (como consumo de sodio, sedentarismo, o antecedentes familiares) que podrían estar contribuyendo a estas cifras tan elevadas independientemente del estado nutricional.

La diferencia de proporciones (δ = 0.016 = 1.6 puntos porcentuales) es extremadamente pequeña, pues considero que desde el punto de vista clínico, esta diferencia carece de relevancia práctica, ya que ambos grupos tienen esencialmente la misma prevalencia de HTA, además me parece importante señalar que esta diferencia tan modesta tendrá implicaciones directas en el cálculo del tamaño muestral, pues para detectar diferencias pequeñas se requieren muestras muy grandes.

tabla_param_prop <- data.frame(
  Grupo = c("CON exceso de peso", "SIN exceso de peso", "Diferencia (δ)"),
  n = c(hta_exceso$n, hta_normal$n, "—"),
  Casos_HTA = c(hta_exceso$hta_si, hta_normal$hta_si, "—"),
  Proporcion = c(paste0(round(p1 * 100, 1), "%"),
                 paste0(round(p2 * 100, 1), "%"),
                 paste0(round(delta_prop * 100, 1), " pp")),
  Interpretacion = c(
    ifelse(p1 > 0.15, "Prevalencia elevada", "Prevalencia moderada"),
    ifelse(p2 > 0.15, "Prevalencia elevada", "Prevalencia baja"),
    ifelse(delta_prop > 0.10, "Diferencia clínicamente relevante", "Diferencia modesta")
  )
)

kable(tabla_param_prop,
      caption = "Parámetros para comparación de HTA según estado nutricional",
      col.names = c("Grupo", "n", "Casos HTA", "Proporción", "Interpretación"),
      align = c("l", "c", "c", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#884EA0", color = "white") %>%
  row_spec(1, background = "#F5EEF8") %>%
  row_spec(2, background = "#E8F8F5") %>%
  row_spec(3, background = "#FEF9E7", bold = TRUE) %>%
  column_spec(1, bold = TRUE, color = "#4A235A") %>%
  column_spec(4, bold = TRUE, color = "#C0392B")
Parámetros para comparación de HTA según estado nutricional
Grupo n Casos HTA Proporción Interpretación
CON exceso de peso 30 10 33.3% Prevalencia elevada
SIN exceso de peso 85 27 31.8% Prevalencia elevada
Diferencia (δ) 1.6 pp Diferencia modesta

La tabla resume estos hallazgos clasificando ambas prevalencias como “elevadas” (>15%) y la diferencia como “modesta”, además, noto que no es que el exceso de peso no se asocie con HTA, sino que en esta muestra particular, me parece que los escolares con peso normal también presentan una prevalencia inusualmente alta, por tanto, la asociación esperada entre obesidad e hipertensión queda enmascarada por esta elevación generalizada de la presión arterial en toda la muestra.

Considero fundamental destacar que estos hallazgos contrastan con lo que observé en el análisis de glicemia, donde sí existía una diferencia más marcada entre grupos (3.56 mg/dL). La HTA parece comportarse de manera diferente en esta población, lo cual podría reflejar factores ambientales o dietarios compartidos por todos los escolares independientemente de su peso corporal.

Cálculo con TwoSampleProportion.Equality()

n_prop <- TwoSampleProportion.Equality(
  alpha = 0.05,
  beta = 0.20,
  p1 = p1,
  p2 = p2,
  k = 1
)

cat("RESULTADO DE TwoSampleProportion.Equality():\n")
## RESULTADO DE TwoSampleProportion.Equality():
cat("=============================================\n\n")
## =============================================
cat("Parámetros introducidos:\n")
## Parámetros introducidos:
cat("  alpha = 0.05 (error tipo I)\n")
##   alpha = 0.05 (error tipo I)
cat("  beta = 0.20 (error tipo II, potencia = 80%)\n")
##   beta = 0.20 (error tipo II, potencia = 80%)
cat("  p1 =", round(p1, 3), "(proporción grupo exceso peso)\n")
##   p1 = 0.333 (proporción grupo exceso peso)
cat("  p2 =", round(p2, 3), "(proporción grupo peso normal)\n")
##   p2 = 0.318 (proporción grupo peso normal)
cat("  k = 1 (grupos iguales)\n\n")
##   k = 1 (grupos iguales)
cat("Tamaño por grupo (n):", ceiling(n_prop), "\n")
## Tamaño por grupo (n): 14003
cat("Tamaño total (2n):", ceiling(n_prop) * 2, "\n")
## Tamaño total (2n): 28006

Interpretación del resultado TwoSampleProportion.Equality()

Al observar este resultado, noto que el tamaño muestral requerido es extraordinariamente grande, siendo 14,003 participantes por grupo, lo que equivale a un total de 28,006 escolares, por lo que considero que este hallazgo es sumamente revelador y que tiene implicaciones metodológicas profundas.

Respecto a los parámetros que introduje, observo que al utilizar las proporciones observadas en mi muestra, como es p₁ = 0.333 (33.3% de HTA en escolares con exceso de peso) y p₂ = 0.318 (31.8% de HTA en escolares con peso normal), obtuve que las diferencias entre estas proporciones es de apenas 1.5 puntos porcentuales, lo cual explica directamente por qué el tamaño muestral requerido es tan elevado.

Me parece fundamental entender la lógica detrás de este resultado, pues cuando la diferencia entre dos proporciones es muy pequeña, necesito muchísimas observaciones para estar segura de que esa diferencia no es simplemente producto del azar, asi que,el cálculo me está diciendo que detectar una diferencia de 1.5 puntos porcentuales con 80% de potencia requiere un esfuerzo muestral descomunal.

Desde la perspectiva de factibilidad, considero que reclutar 28,006 escolares es prácticamente imposible para un estudio típico en epidemiología pediátrica, además me parece que este resultado me envía un mensaje claro, de que la diferencia observada entre mis grupos es tan pequeña que probablemente no tiene relevancia clínica ni estadística, en otras palabras, en esta muestra particular, el exceso de peso no parece asociarse de manera importante con la prevalencia de HTA.

Comparando con el cálculo de medias que realicé anteriormente, donde necesitaba 159 participantes por grupo para detectar una diferencia de 3.56 mg/dL en glicemia, el contraste es enorme, esto me enseña que el tamaño muestral depende críticamente de la magnitud del efecto que quiero detectar, pues efectos pequeños requieren muestras gigantes, y efectos grandes requieren muestras modestas.

Considero que este hallazgo tiene un valor pedagógico importante, pues me demuestra que no siempre es viable realizar un estudio para detectar cualquier diferencia, y que parte de la planificación de la investigación implica evaluar si el efecto esperado justifica el esfuerzo muestral requerido.

tabla de derivación del tamaño muestral

tabla_resultado_prop <- data.frame(
  Componente = c("Proporción grupo 1 (p₁)", 
                 "Proporción grupo 2 (p₂)",
                 "Diferencia de proporciones (δ)",
                 "Nivel de significancia (α)",
                 "Potencia estadística (1-β)",
                 "Razón de tamaños (k)",
                 "Tamaño por grupo (n)",
                 "Tamaño total (2n)"),
  Valor = c(paste0(round(p1 * 100, 1), "% (", round(p1, 3), ")"),
            paste0(round(p2 * 100, 1), "% (", round(p2, 3), ")"),
            paste0(round(delta_prop * 100, 1), " puntos porcentuales"),
            "0.05 (5%)",
            "0.80 (80%)",
            "1 (grupos iguales)",
            format(ceiling(n_prop), big.mark = ","),
            format(ceiling(n_prop) * 2, big.mark = ","))
)

kable(tabla_resultado_prop,
      caption = "Derivación del tamaño muestral para comparación de dos proporciones (HTA)",
      col.names = c("Componente", "Valor"),
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#6C3483", color = "white") %>%
  row_spec(1:2, background = "#F5EEF8") %>%
  row_spec(3, background = "#FEF9E7") %>%
  row_spec(4:6, background = "#EBF5FB") %>%
  row_spec(7:8, bold = TRUE, background = "#FADBD8", color = "#922B21") %>%
  column_spec(1, bold = TRUE, color = "#4A235A") %>%
  column_spec(2, color = "#148F77")
Derivación del tamaño muestral para comparación de dos proporciones (HTA)
Componente Valor
Proporción grupo 1 (p₁) 33.3% (0.333)
Proporción grupo 2 (p₂) 31.8% (0.318)
Diferencia de proporciones (δ) 1.6 puntos porcentuales
Nivel de significancia (α) 0.05 (5%)
Potencia estadística (1-β) 0.80 (80%)
Razón de tamaños (k) 1 (grupos iguales)
Tamaño por grupo (n) 14,003
Tamaño total (2n) 28,006

Al analizar esta tabla, noto que resume de manera clara todos los componentes que determinan el tamaño muestral requerido, y me permite entender por qué el resultado es tan elevado, pues respecto a las proporciones de los grupos, observo que p₁ = 33.3% representa la prevalencia de HTA en escolares con exceso de peso, mientras que p₂ = 31.8% corresponde a los escolares con peso normal, lo que considero que ambos valores son inusualmente altos para población pediátrica, pues según la literatura internacional, la prevalencia esperada de HTA en niños sanos oscila entre 3-5%, además, ambos grupos de mi muestra presentan una carga de hipertensión muy superior a lo esperado, lo cual podría indicar factores de riesgo compartidos como dieta alta en sodio, sedentarismo o predisposición genética en esta población colombiana.

La diferencia de proporciones (δ = 1.6 puntos porcentuales) es el elemento crítico que me explica el tamaño muestral gigantesco, pues, me parece importante destacar que esta diferencia es tan pequeña que carece de relevancia clínica, ya que decir que 33.3% vs 31.8% presentan HTA es prácticamente equivalente a afirmar que ambos grupos tienen la misma prevalencia.

Además noto que esta diferencia es aproximadamente 10 veces menor que la diferencia típica que se considera clínicamente significativa en estudios epidemiológicos (usualmente ≥10 puntos porcentuales).

Los parámetros estadísticos estándar (α = 0.05, potencia = 80%, k = 1) son los convencionales para estudios comparativos en salud, por lo que estos valores son apropiados, pero no son los responsables del tamaño muestral excesivo, pues el problema radica exclusivamente en la pequeña diferencia entre proporciones.

El resultado de 14,003 participantes por grupo (28,006 en total) me parece como aprendizaje, que no toda pregunta de investigación es viable de responder con un estudio empírico, además, cuando la diferencia esperada entre grupos es mínima, el costo en recursos y tiempo para detectarla puede ser inviable.

Comparando con el análisis de glicemia, donde necesitaba 159 por grupo para detectar 3.56 mg/dL de diferencia, el contraste es de casi 100 veces más participantes para el análisis de proporciones, por lo que esto me confirma que el tamaño del efecto (effect size) es el determinante principal del tamaño muestral, y que diferencias pequeñas requieren esfuerzos muestrales desproporcionados.

grupos desiguales en proporciones

n_prop_k1 <- TwoSampleProportion.Equality(alpha = 0.05, beta = 0.20, 
                                           p1 = p1, p2 = p2, k = 1)
n_prop_k05 <- TwoSampleProportion.Equality(alpha = 0.05, beta = 0.20, 
                                            p1 = p1, p2 = p2, k = 1/2)
n_prop_k2 <- TwoSampleProportion.Equality(alpha = 0.05, beta = 0.20, 
                                           p1 = p1, p2 = p2, k = 2)

cat("RESULTADOS SEGÚN RAZÓN DE TAMAÑOS (k) - PROPORCIONES:\n")
## RESULTADOS SEGÚN RAZÓN DE TAMAÑOS (k) - PROPORCIONES:
cat("=====================================================\n\n")
## =====================================================
cat("k = 1 (grupos iguales):\n")
## k = 1 (grupos iguales):
cat("  Grupo Exceso Peso:", format(ceiling(n_prop_k1), big.mark = ","), 
    "| Grupo Peso Normal:", format(ceiling(n_prop_k1), big.mark = ","), 
    "| Total:", format(ceiling(n_prop_k1) * 2, big.mark = ","), "\n\n")
##   Grupo Exceso Peso: 14,003 | Grupo Peso Normal: 14,003 | Total: 28,006
cat("k = 1/2 (ratio 1:2):\n")
## k = 1/2 (ratio 1:2):
cat("  Grupo Exceso Peso:", format(ceiling(n_prop_k05), big.mark = ","), 
    "| Grupo Peso Normal:", format(ceiling(n_prop_k05 * 2), big.mark = ","), 
    "| Total:", format(ceiling(n_prop_k05) + ceiling(n_prop_k05 * 2), big.mark = ","), "\n\n")
##   Grupo Exceso Peso: 10,546 | Grupo Peso Normal: 21,091 | Total: 31,637
cat("k = 2 (ratio 2:1):\n")
## k = 2 (ratio 2:1):
cat("  Grupo Exceso Peso:", format(ceiling(n_prop_k2), big.mark = ","), 
    "| Grupo Peso Normal:", format(ceiling(n_prop_k2 / 2), big.mark = ","), 
    "| Total:", format(ceiling(n_prop_k2) + ceiling(n_prop_k2 / 2), big.mark = ","), "\n")
##   Grupo Exceso Peso: 20,917 | Grupo Peso Normal: 10,459 | Total: 31,376
tabla_prop_k <- data.frame(
  Escenario = c("k = 1 (grupos iguales)",
                "k = 1/2 (ratio 1:2)",
                "k = 2 (ratio 2:1)"),
  Situacion = c("Reclutamiento balanceado",
                "Más controles disponibles",
                "Más casos disponibles"),
  n_Exceso = c(format(ceiling(n_prop_k1), big.mark = ","), 
               format(ceiling(n_prop_k05), big.mark = ","), 
               format(ceiling(n_prop_k2), big.mark = ",")),
  n_Normal = c(format(ceiling(n_prop_k1), big.mark = ","), 
               format(ceiling(n_prop_k05 * 2), big.mark = ","), 
               format(ceiling(n_prop_k2 / 2), big.mark = ",")),
  n_Total = c(format(ceiling(n_prop_k1) * 2, big.mark = ","), 
              format(ceiling(n_prop_k05) + ceiling(n_prop_k05 * 2), big.mark = ","), 
              format(ceiling(n_prop_k2) + ceiling(n_prop_k2 / 2), big.mark = ","))
)

kable(tabla_prop_k,
      caption = "Tamaño muestral según razón de asignación (k) para comparación de HTA",
      col.names = c("Escenario", "Situación", "n Exceso Peso", "n Peso Normal", "n Total"),
      align = c("l", "l", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#8E44AD", color = "white") %>%
  row_spec(1, background = "#F5EEF8") %>%
  row_spec(2, background = "#FCF3CF") %>%
  row_spec(3, background = "#FADBD8") %>%
  column_spec(1, bold = TRUE, color = "#4A235A") %>%
  column_spec(3:5, bold = TRUE, color = "#C0392B")
Tamaño muestral según razón de asignación (k) para comparación de HTA
Escenario Situación n Exceso Peso n Peso Normal n Total
k = 1 (grupos iguales) Reclutamiento balanceado 14,003 14,003 28,006
k = 1/2 (ratio 1:2) Más controles disponibles 10,546 21,091 31,637
k = 2 (ratio 2:1) Más casos disponibles 20,917 10,459 31,376

Interpretación del tamaño muestral con grupos desiguales para comparación de proporciones (HTA)

Al observar estos resultados, noto que independientemente de la razón de asignación (k), los tamaños muestrales requeridos son extraordinariamente grandes, lo cual refuerza mi conclusión anterior sobre la inviabilidad de este estudio.

Respecto al escenario k = 1 (grupos iguales), observo que necesitaría 14,003 escolares con exceso de peso y 14,003 con peso normal, para un total de 28,006 participantes, así que pienso que este es el escenario estadísticamente más eficiente porque meminimizaría el n total, pero sigue siendo completamente impráctico para cualquier estudio en epidemiología pediátrica, por tanto, ni siquiera el diseño óptimo hace viable esta investigación.

En cuanto al escenario k = 1/2 (ratio 1:2), noto que requiero 10,546 escolares con exceso de peso y 21,091 con peso normal, totalizando 31,637 participantes, esto me parece interesante por que, aunque reduciera el grupo más difícil de reclutar, el n total me aumenta en 3,631 participantes respecto al escenario balanceado.

Además observo que este diseño reflejaría mejor la proporción natural en población escolar, pero el costo en tamaño total es considerable.

Para el escenario k = 2 (ratio 2:1), observo cifras altamente inviables, pues 20,917 con exceso de peso y 10,459 con peso normal, para un total de 31,376 participantes, francamente solo si estuviera en un escenario especialmente apropiado, donde solo se reclutara participantes en clínicas especializadas en obesidad infantil, pero la magnitud del esfuerzo muestral lo hace igualmente inviable.

La conclusión fundamental que extraigo de esta tabla es que la diferencia de 1.6 puntos porcentuales entre grupos es demasiado pequeña para justificar cualquier estudio comparativo, por lo que, desde la perspectiva del cálculo muestral, mi análisis me está indicando que no existe asociación clínicamente relevante entre exceso de peso e HTA en esta muestra particular.

Además me parece que el hallazgo más importante no es la diferencia entre grupos, sino la elevada prevalencia de HTA en ambos grupos (>30%), lo cual ameritaría proponer una investigación diferente enfocada en identificar los factores de riesgo compartidos por toda esta población escolar colombiana.

Comparando con el análisis de medias (glicemia), donde los escenarios con k variable requerían entre 318 y 357 participantes totales, el contraste es de aproximadamente 80–100 veces más participantes para el análisis de proporciones, por lo que concluyo que el tamaño del efecto es el determinante crítico del diseño muestral.

gráfico comparativo de proporciones

df_prop_grafico <- data.frame(
  Grupo = c("Exceso de Peso", "Peso Normal"),
  Proporcion = c(p1, p2) * 100,
  n = c(hta_exceso$n, hta_normal$n),
  Casos = c(hta_exceso$hta_si, hta_normal$hta_si)
)

ggplot(df_prop_grafico, aes(x = Grupo, y = Proporcion, fill = Grupo)) +
  geom_col(width = 0.6, alpha = 0.85, color = "black", linewidth = 0.3) +
  geom_text(aes(label = paste0(round(Proporcion, 1), "%\n(", Casos, "/", n, ")")),
            vjust = -0.3, fontface = "bold", size = 4.5, color = "#2C3E50") +
  scale_fill_manual(values = c("#85C1E9", "#F5B041")) +
  scale_y_continuous(limits = c(0, max(df_prop_grafico$Proporcion) * 1.4),
                     labels = function(x) paste0(x, "%")) +
  labs(title = "Prevalencia de Hipertensión Arterial según Estado Nutricional",
       subtitle = paste0("Diferencia observada: ", round(delta_prop * 100, 1), 
                        " pp | Tamaño requerido: ", format(ceiling(n_prop), big.mark = ","), " por grupo"),
       x = "",
       y = "Prevalencia de HTA (%)",
       caption = "pp = puntos porcentuales | HTA = Hipertensión Arterial") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#4A235A", size = 14),
    plot.subtitle = element_text(color = "#5D6D7E", size = 11),
    plot.caption = element_text(color = "#7F8C8D", size = 9, face = "italic"),
    axis.title.y = element_text(face = "bold", color = "#2C3E50"),
    legend.position = "none",
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_blank()
  )

Al observar este gráfico, noto inmediatamente que las dos barras tienen prácticamente la misma altura (33.3% vs 31.8%), lo cual veo de manera contundente por qué el tamaño muestral requerido es tan descomunal (14,003 por grupo), además me parece que el hallazgo más revelador es que los escolares con peso normal tienen casi la misma proporción de HTA que aquellos con exceso de peso.

Además observo que en términos absolutos, hay más casos de HTA en el grupo de peso normal (27 casos) que en el de exceso de peso (10 casos), simplemente porque es un grupo más numeroso.

La reflexión central que extraigo es que el problema de salud pública no es la diferencia entre grupos, sino la elevada prevalencia de HTA en TODA la muestra (>30%). Considero que futuros estudios en poblaciones similares, yo lo enfocaría a identificar qué factores de riesgo compartidos están causando esta carga tan alta de hipertensión en escolares colombianos, independientemente de su estado nutricional.

Gráfico de relación entre diferencia de proporciones y tamaño muestral

deltas <- seq(0.05, 0.40, by = 0.05)
n_por_delta <- sapply(deltas, function(d) {
  p1_sim <- 0.35
  p2_sim <- p1_sim - d
  if(p2_sim < 0.01) p2_sim <- 0.01
  TwoSampleProportion.Equality(alpha = 0.05, beta = 0.20, 
                                p1 = p1_sim, p2 = p2_sim, k = 1)
})

df_delta <- data.frame(
  Delta = deltas * 100,
  n = ceiling(n_por_delta)
)

ggplot(df_delta, aes(x = Delta, y = n)) +
  geom_line(color = "#8E44AD", linewidth = 1.2) +
  geom_point(color = "#4A235A", size = 3) +
  geom_vline(xintercept = delta_prop * 100, linetype = "dashed", 
             color = "#E74C3C", linewidth = 0.8) +
  geom_hline(yintercept = 125, linetype = "dotted", 
             color = "#27AE60", linewidth = 0.8) +
  annotate("text", x = delta_prop * 100 + 4, y = max(df_delta$n) * 0.7, 
           label = paste0("Mi diferencia\n(", round(delta_prop * 100, 1), " pp)"), 
           color = "#E74C3C", size = 3.5, fontface = "bold") +
  annotate("text", x = 35, y = 300, label = "n actual = 125", 
           color = "#27AE60", size = 3.5, fontface = "italic") +
  scale_x_continuous(labels = function(x) paste0(x, " pp"), 
                     breaks = seq(5, 40, by = 5)) +
  scale_y_continuous(labels = function(x) format(x, big.mark = ",")) +
  labs(title = "Tamaño Muestral según Diferencia de Proporciones a Detectar",
       subtitle = "Para comparar dos proporciones con α = 0.05 y potencia = 80%",
       x = "Diferencia de proporciones (puntos porcentuales)",
       y = "Tamaño de muestra por grupo (n)") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#4A235A", size = 14),
    plot.subtitle = element_text(color = "#5D6D7E", size = 11),
    axis.title = element_text(face = "bold", color = "#2C3E50"),
    panel.grid.minor = element_blank()
  )

Interpretación del gráfico de tamaño muestral según diferencia de proporciones

Quise construir esta curva que me representa de forma visual uno de los principios fundamentales del cálculo muestral, descrito por Aguilar-Barojas (2005), que es la relación inversa entre la magnitud de la diferencia que se desea detectar y el número de sujetos necesarios para lograrlo, pues esta gráfica me permite comprender cómo pequeñas variaciones en el efecto esperado pueden traducirse en cambios muy grandes en el tamaño de muestra requerido.

La forma hiperbólica de la curva muestra que la relación no es lineal sino cuadrática inversa, ya que la diferencia aparece elevada al cuadrado en el denominador de la fórmula, por lo que, cuando la diferencia se reduce a la mitad, el tamaño muestral que requiero se incrementa aproximadamente cuatro veces, lo cual explica por qué detectar diferencias pequeñas me implicaría esfuerzos muestrales muy grandes.

Este gráfico me aporta varios elementos clave, por un lado, me permite tener idea para planificar prospectivamente un estudio, definiendo primero qué diferencia considero clínicamente relevante antes de calcular el tamaño de muestra. Además, me sirve para evaluar retrospectivamente qué efectos era capaz de detectar mi muestra actual (n = 125), y también considero que es una herramienta muy útil para comunicar a colegas y tomadores de decisiones por qué ciertos estudios requieren tamaños muestrales elevados.

En el gráfico, la línea roja vertical marca la diferencia observada de 1.6 puntos porcentuales, la cual queda fuera del rango visible porque requeriría más de 14,000 participantes por grupo; a su vez, la línea verde horizontal correspondiente a n = 125 intersecta la curva alrededor de 15 puntos porcentuales, lo que me indica que con mi muestra actual solo podría detectar diferencias de esa magnitud o mayores con una potencia del 80%.

Desde una perspectiva clínica, Codazzi et al. (2024) señala que en población pediátrica las alteraciones metabólicas más frecuentes suelen ser obesidad y dislipidemia, mientras que la hipertensión y las alteraciones glucémicas tienden a desarrollarse más tardíamente y son más características del síndrome metabólico en adultos.

Esto me ayuda a interpretar por qué, en mi muestra de escolares colombianos, la prevalencia de HTA es elevada en ambos grupos (>30%), ya que probablemente existen factores de riesgo compartidos, como sedentarismo, dieta alta en sodio o predisposición genética, que afectan a toda la población independientemente del estado nutricional, como lo he dicho anteriormente.

Además, los autores destacan que la inflamación crónica de bajo grado asociada a obesidad activa vías fisiopatológicas que conducen tanto a resistencia insulínica como a hipertensión, lo cual, esto me lleva a reflexionar que es posible que estos mecanismos ya estén presentes en ambos grupos de mi muestra, lo cual explicaría la similitud en las proporciones de HTA observadas.

La lección metodológica que extraigo es clara, tal como indica Aguilar-Barojas (2005), un estudio con tamaño muestral insuficiente puede llevar a conclusiones erróneas al no detectar diferencias que realmente existen, pues en este caso, el gráfico me muestra que para una diferencia de 1.6 puntos porcentuales, ningún esfuerzo muestral razonable permitiría detectarla, por lo que considero que la pregunta de investigación debería reformularse, orientándose más bien a identificar los factores de riesgo compartidos que explican la alta prevalencia de HTA en toda la población escolar estudiada.

Análisis de Potencia Estadística (power.t.test()

cat("ANÁLISIS DE POTENCIA ESTADÍSTICA\n")
## ANÁLISIS DE POTENCIA ESTADÍSTICA
cat("=================================\n\n")
## =================================
cat("La potencia estadística (1-β) representa la probabilidad de detectar\n")
## La potencia estadística (1-β) representa la probabilidad de detectar
cat("una diferencia cuando realmente existe. Es el complemento del error\n")
## una diferencia cuando realmente existe. Es el complemento del error
cat("tipo II (β), que es la probabilidad de NO detectar una diferencia real.\n\n")
## tipo II (β), que es la probabilidad de NO detectar una diferencia real.
cat("Potencia recomendada en investigación biomédica, como lo hemos visto en clase: ≥ 80%\n")
## Potencia recomendada en investigación biomédica, como lo hemos visto en clase: ≥ 80%
cat("Esto significa aceptar un máximo de 20% de probabilidad de falsos negativos.\n")
## Esto significa aceptar un máximo de 20% de probabilidad de falsos negativos.
# Parámetros de glicemia observados
media_exceso <- BaseMetabolismo %>% 
  filter(obesidad %in% c(2, 3)) %>% 
  summarise(media = mean(glicemia, na.rm = TRUE)) %>% 
  pull(media)

media_normal <- BaseMetabolismo %>% 
  filter(obesidad == 0) %>% 
  summarise(media = mean(glicemia, na.rm = TRUE)) %>% 
  pull(media)

sd_global <- sd(BaseMetabolismo$glicemia, na.rm = TRUE)
delta_glicemia <- abs(media_exceso - media_normal)

# Cálculo de potencia con la muestra actual
potencia_actual <- power.t.test(
  n = 30,
  delta = delta_glicemia,
  sd = sd_global,
  sig.level = 0.05,
  type = "two.sample",
  alternative = "two.sided"
)

cat("POTENCIA ESTADÍSTICA PARA COMPARACIÓN DE GLICEMIA\n")
## POTENCIA ESTADÍSTICA PARA COMPARACIÓN DE GLICEMIA
cat("==================================================\n\n")
## ==================================================
cat("Parámetros observados:\n")
## Parámetros observados:
cat("  Media grupo exceso peso:", round(media_exceso, 2), "mg/dL\n")
##   Media grupo exceso peso: 90.8 mg/dL
cat("  Media grupo peso normal:", round(media_normal, 2), "mg/dL\n")
##   Media grupo peso normal: 87.24 mg/dL
cat("  Diferencia (δ):", round(delta_glicemia, 2), "mg/dL\n")
##   Diferencia (δ): 3.56 mg/dL
cat("  Desviación estándar (σ):", round(sd_global, 2), "mg/dL\n")
##   Desviación estándar (σ): 11.32 mg/dL
cat("  Tamaño grupo menor (n):", 30, "\n\n")
##   Tamaño grupo menor (n): 30
cat("POTENCIA ALCANZADA:", round(potencia_actual$power * 100, 1), "%\n")
## POTENCIA ALCANZADA: 22.4 %

Interpretación del análisis de potencia estadística para glicemia

Respecto al análisis de potencia estadística para glicemia, partí de los valores observados en mi muestra, donde la media en el grupo con exceso de peso fue de 90.8 mg/dL, mientras que la media en el grupo con peso normal fue de 87.24 mg/dL, lo que define una diferencia absoluta de 3.56 mg/dL entre ambos grupos.

Esta diferencia la interpreto en el contexto de una desviación estándar de 11.32 mg/dL, que refleja una variabilidad considerable de la glicemia en la población estudiada, además, el tamaño del grupo menor, correspondiente a escolares con exceso de peso, fue de n = 30, lo cual pienso que es una limitación importante desde el punto de vista muestral.

Con estos parámetros, la función power.t.test() me estimó una potencia estadística de apenas 22.4%, lo cual, según Aguilar-Barojas (2005), en su definición de quela potencia estadística (1 − β) representa la probabilidad de detectar una diferencia de un tamaño dado cuando dicha diferencia realmente existe en la población, entonces, si la diferencia que observo de 3.56 mg/dL es real, entonces mi estudio solo tiene aproximadamente una probabilidad de 22.4% de lograr detectarla, lo cual me da una capacidad de detección claramente insuficiente.

El complemento de la potencia corresponde al error tipo II (β), que en este caso lo calculo como β = 1 − 0.224 = 0.776, es decir, una probabilidad del 77.6% de concluir que no existe diferencia entre los grupos cuando en realidad sí la hay. En este sentido, Aguilar-Barojas (2005) señala que un adecuado cálculo del tamaño muestral protege al investigador de ignorar diferencias significativas y de incurrir en error tipo II. En mi análisis, la muestra disponible no me brinda esa protección, lo que explica en buena medida los resultados no significativos observados previamente.

La razón principal de esta baja potencia considero que está dado por el tamaño del efecto, el cual se calcula como d = δ / σ = 3.56 / 11.32 = 0.31, donde este valor corresponde a un efecto pequeño según los criterios de Cohen, y que me indica que la diferencia entre las medias es modesta en relación con la variabilidad de los datos, asi que, la señal estadística no me supera ampliamente al ruido, y que para detectar este tipo de efectos requiero entonces tamaños muestrales considerablemente mayores.

Desde una perspectiva clínica, Codazzi et al. (2024) describen que en población pediátrica las alteraciones glucémicas suelen manifestarse más tardíamente en comparación con obesidad y dislipidemia, esto refuerza mi idea de que la ausencia de significancia estadística en mi análisis no debo entenderla como ausencia de efecto, sino como una consecuencia directa de una potencia estadística insuficiente asociada al tamaño muestral disponible.

# Exploraré potencia con diferentes tamaños de muestra
n_valores <- c(30, 50, 75, 100, 125, 159, 200)
potencias <- sapply(n_valores, function(n) {
  power.t.test(
    n = n,
    delta = delta_glicemia,
    sd = sd_global,
    sig.level = 0.05,
    type = "two.sample",
    alternative = "two.sided"
  )$power * 100
})

tabla_potencia <- data.frame(
  n_por_grupo = n_valores,
  n_total = n_valores * 2,
  potencia = round(potencias, 1),
  interpretacion = case_when(
    potencias < 50 ~ "Muy baja",
    potencias < 70 ~ "Insuficiente",
    potencias < 80 ~ "Marginal",
    potencias >= 80 ~ "Adecuada"
  )
)

kable(tabla_potencia,
      caption = "Potencia estadística según tamaño muestral para detectar δ = 3.56 mg/dL en Glicemia",
      col.names = c("n por grupo", "n total", "Potencia (%)", "Interpretación"),
      align = c("c", "c", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE,
                font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#1E8449", color = "white") %>%
  row_spec(which(tabla_potencia$potencia >= 80), background = "#D5F5E3", bold = TRUE) %>%
  row_spec(which(tabla_potencia$potencia < 80 & tabla_potencia$potencia >= 70), background = "#FCF3CF") %>%
  row_spec(which(tabla_potencia$potencia < 70), background = "#FADBD8") %>%
  column_spec(1, bold = TRUE, color = "#1E8449") %>%
  column_spec(3, bold = TRUE, color = "#884EA0")
Potencia estadística según tamaño muestral para detectar δ = 3.56 mg/dL en Glicemia
n por grupo n total Potencia (%) Interpretación
30 60 22.4 Muy baja
50 100 34.4 Muy baja
75 150 48.3 Muy baja
100 200 60.1 Insuficiente
125 250 69.9 Insuficiente
159 318 79.9 Marginal
200 400 88.1 Adecuada

La tabla de potencia según tamaño muestral me confirma que necesitaría n=159 por grupo (318 total) para alcanzar potencia de 79.9%, coherente con el cálculo previo de TwoSampleMean.Equality().

n_seq <- seq(20, 250, by = 5)
potencia_seq <- sapply(n_seq, function(n) {
  power.t.test(
    n = n,
    delta = delta_glicemia,
    sd = sd_global,
    sig.level = 0.05,
    type = "two.sample",
    alternative = "two.sided"
  )$power * 100
})

df_potencia <- data.frame(n = n_seq, potencia = potencia_seq)

ggplot(df_potencia, aes(x = n, y = potencia)) +
  geom_line(color = "#1E8449", linewidth = 1.2) +
  geom_hline(yintercept = 80, linetype = "dashed", color = "#E74C3C", linewidth = 0.8) +
  geom_vline(xintercept = 30, linetype = "dotted", color = "#3498DB", linewidth = 0.8) +
  geom_vline(xintercept = 159, linetype = "dotted", color = "#8E44AD", linewidth = 0.8) +
  geom_point(data = data.frame(n = 30, potencia = potencia_actual$power * 100),
             aes(x = n, y = potencia), color = "#3498DB", size = 4) +
  annotate("text", x = 50, y = potencia_actual$power * 100 + 5, 
           label = paste0("Mi muestra\n(n=30, ", round(potencia_actual$power * 100, 1), "%)"), 
           color = "#3498DB", size = 3.5, fontface = "bold") +
  annotate("text", x = 180, y = 75, 
           label = "n requerido = 159", 
           color = "#8E44AD", size = 3.5, fontface = "bold") +
  annotate("text", x = 220, y = 83, 
           label = "Potencia 80%", 
           color = "#E74C3C", size = 3.5, fontface = "italic") +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 20),
                     labels = function(x) paste0(x, "%")) +
  labs(title = "Curva de Potencia Estadística para Comparación de Glicemia",
       subtitle = paste0("Detectando δ = ", round(delta_glicemia, 2), " mg/dL con α = 0.05"),
       x = "Tamaño de muestra por grupo (n)",
       y = "Potencia estadística (1 - β)") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#1E8449", size = 14),
    plot.subtitle = element_text(color = "#5D6D7E", size = 11),
    axis.title = element_text(face = "bold", color = "#2C3E50"),
    panel.grid.minor = element_blank()
  )

La curva de potencia me deja ver, cómo el punto azul (mi muestra, n=30) se ubica en la zona de crecimiento lento, muy por debajo del umbral aceptable del 80% (línea roja), además la línea púrpura (n=159) marca dónde la curva cruza ese umbral.

En la práctica, considero que cualquier p>0.05 obtenido en análisis bivariados previos no puedo interpretarlo como ausencia de asociación, sino como incapacidad de detección debido a potencia insuficiente.

ESTUDIOS DE NO-INFERIORIDAD Y EQUIVALENCIA

A continuación explico, porqué no puedo aplicar estos diseños a mi base

**Mi base proviene de una COHORTE PROSPECTIVA de 125 escolares colombianos (9-14 años) ensamblada entre 2011-2012, en un contexto de transición nutricional donde para esa población, en ese momento coexistía una desnutrición temprana y sobrepeso infantil.

Sin embargo, los diseños de no-inferioridad y equivalencia requieren:

NO-INFERIORIDAD: Comparar un tratamiento NUEVO vs uno ESTÁNDAR para demostrar que el nuevo no es peor por más de un margen δ.

Mi cohorte compara GRUPOS NATURALES (exceso peso vs peso normal), no intervenciones asignadas.

EQUIVALENCIA: Demostrar que dos intervenciones o métodos producen resultados similares dentro de un margen ±δ, por lo que se requiere comparar métodos/tratamientos, no grupos de exposición.

Entonces para desarrollar todos los ejercicios del taller de práctica guía y por aprendizaje, usaré los PARÁMETROS REALES de mi cohorte (σ de glicemia = 11.32 mg/dL), para crear escenarios hipotéticos clínicamente relevantes que ilustren estos conceptos en el contexto del síndrome metabólico infantil.

Escenario 1: estudio de no-inferioridad

En este escenario propongo un estudio de no-inferioridad con el objetivo de responder a una necesidad concreta del contexto clínico y sanitario de la población escolar. Codazzi et al. (2024) señalan que la dieta hipercalórica y el sedentarismo son factores de riesgo modificables del síndrome metabólico infantil, y en el contexto colombiano, caracterizado por la transición nutricional, considero que en poblaaciones similares, existe un doble desafío sanitario que me obliga a plantear intervenciones sostenibles sin comprometer la salud metabólica de los niños.

El escenario que planteo parte de una situación realista, donde ejemplo, una secretaría de educación departamental desea implementar un nuevo programa de almuerzos escolares más económico, con una reducción estimada de costos del 30% mediante el uso de proveedores locales, por lo que antes de su implementación masiva, me cuentan que se va a requerir demostrar que este programa no va a empeorar el perfil glucémico de los escolares en más de 5 mg/dL, lo cual me define claramente el marco de un diseño de no-inferioridad.

Planteo entonces, un enfoque de no-inferioridad y no de superioridad porque no se espera una mejoría clínica. En la cohorte de referencia que he venido trabajando, la glicemia media es de 88.10 mg/dL, un valor dentro del rango de normoglucemia según ADA 2024, por lo que no existe un margen clínico razonable para demostrar beneficios adicionales, por lo que además considero que, según Codazzi et al. (2024), las alteraciones glucémicas en niños tienden a desarrollarse de forma tardía, lo que hace mucho más relevante garantizar seguridad metabólica que intentar demostrar una reducción adicional de valores ya normales.

Otro elemento central de este planteamiento es que la ventaja del nuevo programa sería principalmente económica y no terapéutica, por lo que, demostrar que el nuevo esquema alimentario no es inferior al actual permitiría justificar su implementación futura basándome en el ahorro de recursos, sin comprometer la salud metabólica de la población escolar.

Para este diseño, voy a utilizar la fórmula recomendada por Aguilar-Barojas (2005) para estudios de no-inferioridad en comparación de medias, la cual se expresa como n = (2σ²(Zα + Zβ)²) / Δ².

Esta fórmula integra de manera explícita la variabilidad de la variable de interés, el nivel de significancia, la potencia estadística y el margen clínicamente aceptable de no-inferioridad.

En este planteamiento, σ² representará la varianza de la glicemia, utilizando como referencia σ = 11.32 mg/dL, estimada a partir de la cohorte disponible.

El término Zα corresponderá al valor Z para un error tipo I unilateral, con α = 0.025 y Zα = 1.96, mientras que Zβ representará el valor Z asociado al error tipo II, con β = 0.20 y Zβ = 0.842, garantizando una potencia estadística del 80%.

El parámetro Δ definirá el margen de no-inferioridad, que en este escenario planteo en 5 mg/dL, un valor que considero clínicamente tolerable y coherente con la variabilidad glucémica esperada en población pediátrica.

Desde el punto de vista operativo, esta fórmula la puedo implementar en R mediante la función TwoSampleMean.NIS() del paquete TrialSize, lo que me va a permitir reproducir el cálculo de manera transparente y alineada con el enfoque metodológico del taller.

En términos conceptuales, considero que el diseño de no-inferioridad es el más apropiado cuando la intervención propuesta ofrece ventajas prácticas, como menor costo o mayor disponibilidad, no se espera que sea superior al estándar, y se acepta un margen de inferioridad clínicamente tolerable. En este escenario hipotético, este diseño permitiría responder de manera rigurosa y realista a una pregunta de salud pública relevante para el contexto colombiano.

# Parámetros para el escenario de no-inferioridad
sigma_glicemia <- sd(BaseMetabolismo$glicemia, na.rm = TRUE)
media_glicemia <- mean(BaseMetabolismo$glicemia, na.rm = TRUE)
delta_nis <- 5  # Margen de no-inferioridad en mg/dL
alpha_nis <- 0.025  # Unilateral
beta_nis <- 0.20
potencia_nis <- 1 - beta_nis

# Valores Z
Z_alpha <- qnorm(1 - alpha_nis)
Z_beta <- qnorm(1 - beta_nis)

# Cálculo con la función
n_nis <- TwoSampleMean.NIS(
  alpha = alpha_nis,
  beta = beta_nis,
  sigma = sigma_glicemia,
  k = 1,
  delta = delta_nis,
  margin = 0
)

cat("ESTUDIO DE NO-INFERIORIDAD\n")
## ESTUDIO DE NO-INFERIORIDAD
cat("==========================\n\n")
## ==========================
cat("Parámetros de mi cohorte:\n")
## Parámetros de mi cohorte:
cat("  Media glicemia:", round(media_glicemia, 2), "mg/dL\n")
##   Media glicemia: 88.1 mg/dL
cat("  DE glicemia (σ):", round(sigma_glicemia, 2), "mg/dL\n\n")
##   DE glicemia (σ): 11.32 mg/dL
cat("Parámetros del diseño:\n")
## Parámetros del diseño:
cat("  Margen no-inferioridad (δ):", delta_nis, "mg/dL\n")
##   Margen no-inferioridad (δ): 5 mg/dL
cat("  Alpha (unilateral):", alpha_nis, "\n")
##   Alpha (unilateral): 0.025
cat("  Z_alpha:", round(Z_alpha, 3), "\n")
##   Z_alpha: 1.96
cat("  Z_beta:", round(Z_beta, 3), "\n")
##   Z_beta: 0.842
cat("  Potencia:", potencia_nis * 100, "%\n\n")
##   Potencia: 80 %
cat("RESULTADO:\n")
## RESULTADO:
cat("  n por grupo:", ceiling(n_nis), "\n")
##   n por grupo: 81
cat("  n total:", ceiling(n_nis) * 2, "\n")
##   n total: 162
tabla_nis <- data.frame(
  Componente = c(
    "Variable de interés",
    "Media observada (μ)",
    "Desviación estándar (σ)",
    "Margen de no-inferioridad (δ)",
    "Justificación del margen",
    "Error tipo I (α)",
    "Valor Z_α",
    "Error tipo II (β)",
    "Valor Z_β",
    "Potencia (1-β)",
    "Función en R",
    "n por grupo",
    "n total"
  ),
  Valor = c(
    "Glicemia (mg/dL)",
    paste0(round(media_glicemia, 2), " mg/dL"),
    paste0(round(sigma_glicemia, 2), " mg/dL"),
    paste0(delta_nis, " mg/dL"),
    "<5 mg/dL no impacta riesgo de prediabetes (ADA 2024)",
    "0.025 (unilateral)",
    round(Z_alpha, 3),
    "0.20",
    round(Z_beta, 3),
    "80%",
    "TwoSampleMean.NIS()",
    ceiling(n_nis),
    ceiling(n_nis) * 2
  )
)

kable(tabla_nis,
      caption = "Cálculo de tamaño muestral: Estudio de No-Inferioridad",
      col.names = c("Componente", "Valor"),
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#2874A6", color = "white") %>%
  row_spec(1:3, background = "#EBF5FB") %>%
  row_spec(4:5, background = "#E8DAEF") %>%
  row_spec(6:10, background = "#D5F5E3") %>%
  row_spec(11, background = "#FEF9E7", italic = TRUE) %>%
  row_spec(12:13, bold = TRUE, background = "#FADBD8", color = "#922B21") %>%
  column_spec(1, bold = TRUE, color = "#1A5276")
Cálculo de tamaño muestral: Estudio de No-Inferioridad
Componente Valor
Variable de interés Glicemia (mg/dL)
Media observada (μ) 88.1 mg/dL
Desviación estándar (σ) 11.32 mg/dL
Margen de no-inferioridad (δ) 5 mg/dL
Justificación del margen <5 mg/dL no impacta riesgo de prediabetes (ADA 2024)
Error tipo I (α) 0.025 (unilateral)
Valor Z_α 1.96
Error tipo II (β) 0.20
Valor Z_β 0.842
Potencia (1-β) 80%
Función en R TwoSampleMean.NIS()
n por grupo 81
n total 162

Variable de interés: glicemia (mg/dL)

Para este escenario, propongo utilizar la glicemia como variable de interés, ya que en la cohorte de referencia de 125 escolares colombianos representa un marcador metabólico central. Según Codazzi et al. (2024), la glicemia suele alterarse de forma tardía en el desarrollo del síndrome metabólico infantil, lo que implica que en niños clínicamente sanos, como los de esta población, los valores suelen encontrarse dentro de rangos normales. Por lo que, cualquier empeoramiento sostenido de la glicemia podría constituir uno de los primeros indicios de alteración metabólica futura, lo que justifica su uso como variable de seguridad en un estudio de no-inferioridad.

Como valor de referencia, voy a utilizar una media observada de 88.1 mg/dL, estimada a partir de la cohorte disponible. Este valor indica que, en promedio, los escolares presentan glicemias dentro del rango de normoglucemia, de acuerdo con los criterios de la ADA 2024. Además considero que este punto de partida es especialmente relevante porque permite evaluar el efecto de una intervención alimentaria en una población metabólicamente sana, donde el objetivo principal no es mejorar la glicemia, sino evitar su deterioro.

La desviación estándar que propongo es de 11.32 mg/dL, la cual refleja la variabilidad natural de la glicemia entre los escolares. Este valor indica que existe una dispersión moderada alrededor de la media, con la mayoría de los valores concentrados dentro de un rango clínicamente esperado, por lo que en el contexto del cálculo muestral, esta variabilidad adquiere un papel central, ya que la desviación estándar aparece elevada al cuadrado en el numerador de la fórmula, por lo que, a mayor dispersión, se requerirá un mayor número de participantes para demostrar o descartar diferencias con suficiente precisión.

Un componente clave del diseño que planteo es el margen de no-inferioridad, que fijo en δ = 5 mg/dL, siendo este parámetro el que me representa la máxima diferencia que estaría dispuesta a aceptar como clínicamente irrelevante.

Considero que un aumento de esta magnitud mantendría a los escolares dentro del rango de normoglucemia, sin incrementar de manera significativa el riesgo metabólico, donde pienso que este valor constituye un margen conservador pero realista, suficientemente estricto para proteger a la población infantil y, al mismo tiempo, compatible con la factibilidad del estudio.

El nivel de significancia que propongo es unilateral, con α = 0.025, lo cual es coherente con el enfoque de no-inferioridad. En este tipo de diseño, el interés lo enfoco exclusivamente en descartar que la intervención nueva sea peor que el estándar más allá del margen aceptado, mientras que una eventual mejoría no constituye el objetivo principal del análisis, asi que, con este planteamiento mantenfo el concepto estadístico equivalente a un α bilateral de 0.05, pero enfocado en una sola dirección.

Los valores críticos asociados a estos niveles de error son Zα = 1.96 y Zβ = 0.842, correspondientes al percentil 97.5 para el error tipo I y al percentil 80 para la potencia estadística, ya que estos valores se incorporan directamente en la fórmula del tamaño muestral y, al elevarse al cuadrado, amplifican su influencia sobre el número final de participantes requeridos.

Con estos parámetros, el cálculo me arrojó un tamaño muestral estimado de 81 escolares por grupo, para un total de 162 participantes. Este resultado indica que, con este número de escolares, se tendría una probabilidad del 80% de demostrar no-inferioridad, siempre que el nuevo programa alimentario no empeore la glicemia en más de 5 mg/dL, además considero que este tamaño muestral es factible para un estudio piloto, ya sea en una institución educativa grande o mediante la inclusión de varias escuelas de menor tamaño.

# Gráfico conceptual de no-inferioridad
df_concepto <- data.frame(
  x = c(-10, -5, 0, 5, 10),
  zona = c("Nuevo superior", "Nuevo superior", "Equivalente", "Margen δ", "Nuevo inferior")
)

ggplot() +
  # Zonas
  annotate("rect", xmin = -10, xmax = 0, ymin = 0, ymax = 1, 
           fill = "#27AE60", alpha = 0.3) +
  annotate("rect", xmin = 0, xmax = 5, ymin = 0, ymax = 1, 
           fill = "#F39C12", alpha = 0.3) +
  annotate("rect", xmin = 5, xmax = 10, ymin = 0, ymax = 1, 
           fill = "#E74C3C", alpha = 0.3) +
  # Líneas de referencia
  geom_vline(xintercept = 0, linetype = "solid", color = "black", linewidth = 1) +
  geom_vline(xintercept = 5, linetype = "dashed", color = "#C0392B", linewidth = 1.2) +
  # Etiquetas
  annotate("text", x = -5, y = 0.5, label = "Nuevo MEJOR\n(superioridad)", 
           fontface = "bold", size = 4, color = "#1E8449") +
  annotate("text", x = 2.5, y = 0.5, label = "Zona de\nNO-INFERIORIDAD\n(aceptable)", 
           fontface = "bold", size = 4, color = "#B7950B") +
  annotate("text", x = 7.5, y = 0.5, label = "Nuevo PEOR\n(inaceptable)", 
           fontface = "bold", size = 4, color = "#922B21") +
  annotate("text", x = 5, y = 0.1, label = "δ = 5 mg/dL", 
           fontface = "bold", size = 3.5, color = "#C0392B") +
  annotate("text", x = 0, y = 0.1, label = "Sin diferencia", 
           size = 3, color = "black") +
  # Escala
  scale_x_continuous(breaks = seq(-10, 10, by = 5),
                     labels = c("-10", "-5", "0", "+5", "+10"),
                     limits = c(-10, 10)) +
  scale_y_continuous(limits = c(0, 1)) +
  labs(title = "Concepto de No-Inferioridad",
       subtitle = "Diferencia en glicemia: μ_nuevo - μ_estándar (mg/dL)",
       x = "Diferencia entre programa nuevo y estándar (mg/dL)",
       y = "",
       caption = "Si la diferencia es < δ, el programa nuevo es aceptable") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#2874A6", size = 14),
    plot.subtitle = element_text(color = "#5D6D7E", size = 11),
    plot.caption = element_text(color = "#7F8C8D", size = 9, face = "italic"),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank()
  )

Interpretación visual del concepto de no-inferioridad

Este gráfico me permite comprender de forma clara y visual qué significa el concepto de no-inferioridad en el contexto del estudio que planteo. En el eje horizontal represento el cambio en la glicemia del programa nuevo respecto al programa estándar, expresado en mg/dL, lo que me facilita interpretar directamente las posibles conclusiones clínicas según la magnitud y la dirección de la diferencia observada.

En el extremo izquierdo del gráfico encuentro la zona verde, correspondiente a valores negativos de la diferencia. En este escenario, el programa nuevo produciría glicemias más bajas que el programa estándar, lo que implicaría superioridad.

Aunque este sería el escenario más favorable desde el punto de vista clínico, no es el objetivo principal del estudio, ya que no espero una mejoría adicional en una población que parte de valores de normoglucemia.

La región central, representada en tonos amarillos o anaranjados, corresponde a la zona de no-inferioridad, que se extiende desde 0 hasta +5 mg/dL. Esta es la zona clave del planteamiento, pues si la diferencia entre programas se ubica dentro de este intervalo, el programa nuevo podría generar un leve aumento de la glicemia, pero dentro de un margen clínicamente aceptable, asi que en este caso, concluiría que el programa nuevo no es inferior al estándar, ya que no compromete la seguridad metabólica de los escolares.

Hacia la derecha del gráfico encuentro la zona roja, que representa diferencias mayores a +5 mg/dL. Si los resultados se ubicaran en esta región, significaría que el programa nuevo empeora la glicemia de manera inaceptable, superando el margen de tolerancia definido, por lo que en ese escenario, no sería posible concluir no-inferioridad y el programa no debería implementarse, dado el potencial impacto negativo sobre la salud metabólica de los niños.

La línea negra vertical ubicada en 0 representa el escenario de ausencia total de diferencia entre ambos programas. Este punto actúa como referencia teórica, indicando que ambos esquemas alimentarios producen exactamente el mismo efecto sobre la glicemia.

Finalmente, la línea roja punteada ubicada en +5 mg/dL marca el margen de no-inferioridad (δ) que propongo para este estudio. Esta línea define la frontera entre lo aceptable y lo inaceptable desde el punto de vista clínico, asi que todo resultado que se ubique a la izquierda de esta línea permitiría concluir no-inferioridad, mientras que los valores que la superen indicarían un deterioro glucémico no tolerable.

En conjunto, este gráfico me aporta una herramienta para explicar sobre cómo se toman las decisiones en un estudio de no-inferioridad, y por qué el énfasis no está en demostrar mejoría, sino en descartar un daño clínicamente relevante.

# Cómo cambia n según el margen de no-inferioridad
margenes <- seq(3, 10, by = 1)
n_por_margen <- sapply(margenes, function(d) {
  TwoSampleMean.NIS(
    alpha = 0.025,
    beta = 0.20,
    sigma = sigma_glicemia,
    k = 1,
    delta = d,
    margin = 0
  )
})

df_margenes <- data.frame(
  Margen = margenes,
  n = ceiling(n_por_margen)
)

ggplot(df_margenes, aes(x = Margen, y = n)) +
  geom_line(color = "#2874A6", linewidth = 1.2) +
  geom_point(color = "#1A5276", size = 3) +
  geom_point(data = df_margenes %>% filter(Margen == 5),
             aes(x = Margen, y = n), color = "#E74C3C", size = 5) +
  geom_vline(xintercept = 5, linetype = "dashed", color = "#E74C3C", linewidth = 0.8) +
  annotate("text", x = 5.5, y = max(df_margenes$n) * 0.9, 
           label = paste0("Mi margen\n(δ=5, n=", ceiling(n_nis), ")"), 
           color = "#E74C3C", size = 3.5, fontface = "bold", hjust = 0) +
  scale_x_continuous(breaks = margenes, labels = paste0(margenes, " mg/dL")) +
  labs(title = "Tamaño Muestral según Margen de No-Inferioridad",
       subtitle = "Para σ = 11.32 mg/dL, α = 0.025 (unilateral), potencia = 80%",
       x = "Margen de no-inferioridad (δ)",
       y = "n por grupo",
       caption = "A mayor margen aceptable, menor n requerido") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#2874A6", size = 14),
    plot.subtitle = element_text(color = "#5D6D7E", size = 11),
    plot.caption = element_text(color = "#7F8C8D", size = 9, face = "italic"),
    axis.title = element_text(face = "bold", color = "#2C3E50"),
    panel.grid.minor = element_blank()
  )

Análisis crítico del gráfico tamaño muestral vs margen de no-inferioridad

Este gráfico me resume el impacto que tiene la elección del margen de no-inferioridad (δ) sobre el tamaño muestral requerido, y me dice que esta decisión es uno de los determinantes más críticos del diseño del estudio, pues a mayor margen aceptable, menor tamaño de muestra, y a menor margen, un incremento rápido y desproporcionado del n requerido.

En el eje horizontal se representa δ, variando desde 3 mg/dL, un margen muy estricto, hasta 10 mg/dL, un margen altamente permisivo, donde en el eje vertical me indica el tamaño muestral por grupo necesario para demostrar no-inferioridad con α = 0.025 unilateral y potencia del 80%, manteniendo constante la variabilidad de la glicemia (σ = 11.32 mg/dL).

La forma de la curva es claramente descendente y no lineal, lo que refleja una propiedad matemática fundamental del cálculo muestral, según la literatura, con un δ que aparece elevado al cuadrado en el denominador de la fórmula. En términos prácticos, esto implica que pequeñas reducciones en el margen generan incrementos exponenciales en el tamaño de muestra, mientras que incrementos moderados del margen reducen el n de forma marcada.

Los valores concretos muestran que esta relación, correspondiente a δ = 3 mg/dL, el estudio requeriría alrededor de 225 escolares por grupo, un tamaño que resulta poco realista para un estudio piloto en población pediátrica.

Al ampliar el margen a δ = 5 mg/dL, el tamaño muestral desciende a 81 participantes por grupo, lo que representa una reducción sustancial sin abandonar un criterio clínicamente razonable, pero en contraste, con δ = 10 mg/dL, el tamaño requerido cae a cerca de 26 escolares por grupo, pero a costa de aceptar un deterioro glucémico cercano al umbral de prediabetes.

El punto resaltado en el gráfico, correspondiente a δ = 5 mg/dL y n = 81 por grupo, representa una decisión metodológica, no un valor arbitrario de mi parte, pues este margen me equilibra tres dimensiones clave del diseño: protección clínica, viabilidad logística y consistencia ética.

Márgenes más estrictos harían el estudio inviable, mientras que márgenes más amplios comprometerían la seguridad metabólica de una población pediátrica sana.

ESCENARIO 2: ESTUDIO DE EQUIVALENCIA Descripción del escenario

# Tabla donde describo el escenario de equivalencia hipotético
escenario_equiv <- data.frame(
  Aspecto = c(
    "Contexto epidemiológico",
    "Problema identificado",
    "Solución propuesta",
    "Pregunta de investigación",
    "¿Por qué NO superioridad?",
    "¿Por qué NO no-inferioridad?",
    "¿Por qué SÍ equivalencia?",
    "Población objetivo",
    "Variable de validación",
    "Criterio de éxito"
  ),
  Descripcion = c(
    "Codazzi et al. (2024) señalan que la identificación TEMPRANA de alteraciones metabólicas en niños sanos es esencial para prevención primaria del síndrome metabólico",
    "El tamizaje glucémico masivo en escuelas es costoso y logísticamente complejo cuando depende de laboratorios clínicos externos",
    "Validar un GLUCÓMETRO PORTÁTIL de bajo costo que pueda usarse directamente en escuelas por personal de enfermería",
    "¿El glucómetro y el laboratorio producen resultados tan similares que pueden usarse INDISTINTAMENTE para tamizaje?",
    "Nadie espera que un glucómetro portátil SUPERE al laboratorio (estándar de oro)",
    "Si el glucómetro SOBREESTIMA sistemáticamente (+8 mg/dL), pasaría no-inferioridad pero generaría FALSOS POSITIVOS masivos",
    "Necesito garantizar que el glucómetro no se desvía en NINGUNA dirección (ni sobreestima ni subestima) más allá de ±5 mg/dL",
    "Escolares de 9-14 años en contexto de transición nutricional (mi cohorte: n=125)",
    "Glicemia (mg/dL) - media observada: 88.1 mg/dL, DE: 11.32 mg/dL",
    "Demostrar que |μ_glucómetro - μ_laboratorio| < 5 mg/dL (INTERCAMBIABILIDAD)"
  )
)

kable(escenario_equiv,
      caption = "Escenario Hipotético: Validación de Glucómetro Portátil para Tamizaje Escolar",
      col.names = c("Aspecto", "Descripción"),
      align = c("l", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = TRUE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#7D3C98", color = "white") %>%
  row_spec(1:2, background = "#F5EEF8") %>%
  row_spec(3:4, background = "#E8DAEF") %>%
  row_spec(5:7, background = "#FEF9E7") %>%
  row_spec(8:9, background = "#D5F5E3") %>%
  row_spec(10, bold = TRUE, background = "#D4EFDF", color = "#1E8449") %>%
  column_spec(1, bold = TRUE, color = "#4A235A", width = "12em")
Escenario Hipotético: Validación de Glucómetro Portátil para Tamizaje Escolar
Aspecto Descripción
Contexto epidemiológico Codazzi et al. (2024) señalan que la identificación TEMPRANA de alteraciones metabólicas en niños sanos es esencial para prevención primaria del síndrome metabólico
Problema identificado El tamizaje glucémico masivo en escuelas es costoso y logísticamente complejo cuando depende de laboratorios clínicos externos
Solución propuesta Validar un GLUCÓMETRO PORTÁTIL de bajo costo que pueda usarse directamente en escuelas por personal de enfermería
Pregunta de investigación ¿El glucómetro y el laboratorio producen resultados tan similares que pueden usarse INDISTINTAMENTE para tamizaje?
¿Por qué NO superioridad? Nadie espera que un glucómetro portátil SUPERE al laboratorio (estándar de oro)
¿Por qué NO no-inferioridad? Si el glucómetro SOBREESTIMA sistemáticamente (+8 mg/dL), pasaría no-inferioridad pero generaría FALSOS POSITIVOS masivos
¿Por qué SÍ equivalencia? Necesito garantizar que el glucómetro no se desvía en NINGUNA dirección (ni sobreestima ni subestima) más allá de ±5 mg/dL
Población objetivo Escolares de 9-14 años en contexto de transición nutricional (mi cohorte: n=125)
Variable de validación Glicemia (mg/dL) - media observada: 88.1 mg/dL, DE: 11.32 mg/dL
Criterio de éxito Demostrar que &#124;μ_glucómetro - μ_laboratorio&#124; < 5 mg/dL (INTERCAMBIABILIDAD)
# Tabla explicativa de la fórmula
formula_equiv <- data.frame(
  Elemento = c(
    "Fórmula general",
    "σ² (varianza)",
    "Zα",
    "Zβ/2",
    "Δ² (delta cuadrado)",
    "Método estadístico",
    "Prueba 1 del TOST",
    "Prueba 2 del TOST",
    "Condición para equivalencia"
  ),
  Simbolo = c(
    "n = 2σ²(Zα + Zβ/2)² / Δ²",
    "σ² = 11.32² = 128.14",
    "Zα = Z₀.₉₅ = 1.645",
    "Zβ/2 = Z₀.₉₀ = 1.282",
    "Δ² = 5² = 25",
    "TOST",
    "H₀: μ_gluco - μ_lab ≥ +5",
    "H₀: μ_gluco - μ_lab ≤ -5",
    "Rechazar AMBAS H₀"
  ),
  Explicacion = c(
    "Fórmula para equivalencia de medias (Aguilar-Barojas, 2005)",
    "Variabilidad de glicemia en mi cohorte - a mayor variabilidad, mayor n",
    "Punto de corte para α=0.05 en TOST",
    "Se usa β/2 porque TOST divide el error tipo II entre las dos pruebas",
    "Margen de equivalencia al cuadrado - a mayor margen, menor n",
    "Two One-Sided Tests: dos pruebas unilaterales simultáneas",
    "Demostrar que el glucómetro NO sobreestima en más de 5 mg/dL",
    "Demostrar que el glucómetro NO subestima en más de 5 mg/dL",
    "Solo si AMBAS pruebas son significativas, concluyo equivalencia"
  )
)

kable(formula_equiv,
      caption = "Fórmula y Método TOST para Estudio de Equivalencia",
      col.names = c("Elemento", "Valor/Símbolo", "Explicación"),
      align = c("l", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = TRUE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#1ABC9C", color = "white") %>%
  row_spec(1, background = "#E8F8F5", italic = TRUE) %>%
  row_spec(2:5, background = "#FEF9E7") %>%
  row_spec(6:8, background = "#E8DAEF") %>%
  row_spec(9, bold = TRUE, background = "#D5F5E3", color = "#1E8449") %>%
  column_spec(1, bold = TRUE, color = "#117A65") %>%
  column_spec(2, bold = TRUE, color = "#7D3C98")
Fórmula y Método TOST para Estudio de Equivalencia
Elemento Valor/Símbolo Explicación
Fórmula general n = 2σ²(Zα + Zβ/2)² / Δ² Fórmula para equivalencia de medias (Aguilar-Barojas, 2005)
σ² (varianza) σ² = 11.32² = 128.14 Variabilidad de glicemia en mi cohorte - a mayor variabilidad, mayor n
Zα = Z₀.₉₅ = 1.645 Punto de corte para α=0.05 en TOST
Zβ/2 Zβ/2 = Z₀.₉₀ = 1.282 Se usa β/2 porque TOST divide el error tipo II entre las dos pruebas
Δ² (delta cuadrado) Δ² = 5² = 25 Margen de equivalencia al cuadrado - a mayor margen, menor n
Método estadístico TOST Two One-Sided Tests: dos pruebas unilaterales simultáneas
Prueba 1 del TOST H₀: μ_gluco - μ_lab ≥ +5 Demostrar que el glucómetro NO sobreestima en más de 5 mg/dL
Prueba 2 del TOST H₀: μ_gluco - μ_lab ≤ -5 Demostrar que el glucómetro NO subestima en más de 5 mg/dL
Condición para equivalencia Rechazar AMBAS H₀ Solo si AMBAS pruebas son significativas, concluyo equivalencia
# Parámetros y cálculo
sigma_glicemia <- sd(BaseMetabolismo$glicemia, na.rm = TRUE)
media_glicemia <- mean(BaseMetabolismo$glicemia, na.rm = TRUE)

n_equiv <- TwoSampleMean.Equivalence(
  alpha = 0.05,
  beta = 0.20,
  sigma = sigma_glicemia,
  k = 1,
  delta = 5,
  margin = 0
)

cat("RESULTADO DEL CÁLCULO\n")
## RESULTADO DEL CÁLCULO
cat("=====================\n")
## =====================
cat("n por grupo:", ceiling(n_equiv), "\n")
## n por grupo: 88
cat("n total:", ceiling(n_equiv) * 2, "\n")
## n total: 176
# Tabla de resultados
resultado_equiv <- data.frame(
  Componente = c(
    "Variable",
    "Media (μ)",
    "Desviación estándar (σ)",
    "Margen de equivalencia (±δ)",
    "Alpha (α)",
    "Potencia (1-β)",
    "Función en R",
    "n por grupo",
    "n total"
  ),
  Valor = c(
    "Glicemia (mg/dL)",
    paste0(round(media_glicemia, 2), " mg/dL"),
    paste0(round(sigma_glicemia, 2), " mg/dL"),
    "±5 mg/dL",
    "0.05",
    "80%",
    "TwoSampleMean.Equivalence()",
    ceiling(n_equiv),
    ceiling(n_equiv) * 2
  )
)

kable(resultado_equiv,
      caption = "Parámetros y resultado del estudio de equivalencia",
      col.names = c("Componente", "Valor"),
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#7D3C98", color = "white") %>%
  row_spec(1:3, background = "#F5EEF8") %>%
  row_spec(4:6, background = "#D5F5E3") %>%
  row_spec(7, background = "#FEF9E7", italic = TRUE) %>%
  row_spec(8:9, bold = TRUE, background = "#FADBD8", color = "#922B21") %>%
  column_spec(1, bold = TRUE, color = "#4A235A")
Parámetros y resultado del estudio de equivalencia
Componente Valor
Variable Glicemia (mg/dL)
Media (μ) 88.1 mg/dL
Desviación estándar (σ) 11.32 mg/dL
Margen de equivalencia (±δ) ±5 mg/dL
Alpha (α) 0.05
Potencia (1-β) 80%
Función en R TwoSampleMean.Equivalence()
n por grupo 88
n total 176

El cálculo mediante la función TwoSampleMean.Equivalence() arrojó un requerimiento de 88 participantes por grupo, lo que representa un total de 176 escolares, donde este tamaño de muestra me garantiza una potencia del 80% para demostrar equivalencia si esta realmente existe, manteniendo un error tipo I del 5%.

Es importante destacar por qué este número es considerablemente mayor que el requerido para un diseño de no-inferioridad, pues en equivalencia debo demostrar que el glucómetro no se desvía en ninguna dirección más allá del margen aceptable.

Esto implica realizar dos pruebas simultáneas (TOST: Two One-Sided Tests), una para verificar que no subestima más de 5 mg/dL y otra para verificar que no sobreestima más de 5 mg/dL. Esta doble exigencia estadística me incrementa el tamaño muestral necesario.

Dado que mi cohorte actual cuenta con 125 participantes, necesitaría ampliar el reclutamiento en aproximadamente 51 escolares adicionales para alcanzar el tamaño muestral requerido.

Alternativamente, podría considerar aumentar el margen de equivalencia a ±6 o ±7 mg/dL si la literatura respalda que estas diferencias siguen siendo clínicamente aceptables, lo cual reduciría el n necesario.

ggplot() +
  annotate("rect", xmin = -10, xmax = -5, ymin = 0, ymax = 1, 
           fill = "#E74C3C", alpha = 0.3) +
  annotate("rect", xmin = -5, xmax = 5, ymin = 0, ymax = 1, 
           fill = "#27AE60", alpha = 0.3) +
  annotate("rect", xmin = 5, xmax = 10, ymin = 0, ymax = 1, 
           fill = "#E74C3C", alpha = 0.3) +
  geom_vline(xintercept = 0, linetype = "solid", color = "black", linewidth = 1.5) +
  geom_vline(xintercept = -5, linetype = "dashed", color = "#C0392B", linewidth = 1.5) +
  geom_vline(xintercept = 5, linetype = "dashed", color = "#C0392B", linewidth = 1.5) +
  annotate("text", x = -7.5, y = 0.5, 
           label = "Glucómetro\nSUBESTIMA\n(falsos negativos)", 
           fontface = "bold", size = 6, color = "#922B21") +
  annotate("text", x = 0, y = 0.5, 
           label = "ZONA DE\nEQUIVALENCIA\n(intercambiables)", 
           fontface = "bold", size = 7, color = "#1E8449") +
  annotate("text", x = 7.5, y = 0.5, 
           label = "Glucómetro\nSOBREESTIMA\n(falsos positivos)", 
           fontface = "bold", size = 6, color = "#922B21") +
  annotate("text", x = -5, y = 0.08, label = "-5 mg/dL", 
           fontface = "bold", size = 6, color = "#C0392B") +
  annotate("text", x = 5, y = 0.08, label = "+5 mg/dL", 
           fontface = "bold", size = 6, color = "#C0392B") +
  annotate("segment", x = -5, xend = 5, y = 0.88, yend = 0.88,
           arrow = arrow(ends = "both", length = unit(0.4, "cm")),
           color = "#1E8449", linewidth = 1.5) +
  annotate("text", x = 0, y = 0.95, label = "Margen ±5 mg/dL", 
           fontface = "bold.italic", size = 6, color = "#1E8449") +
  scale_x_continuous(breaks = seq(-10, 10, by = 5), limits = c(-10, 10)) +
  scale_y_continuous(limits = c(0, 1)) +
  labs(
    title = "Concepto de Equivalencia: Validación de Glucómetro",
    subtitle = "Diferencia = μ glucómetro − μ laboratorio (mg/dL)",
    x = "Diferencia entre glucómetro y laboratorio (mg/dL)",
    y = "",
    caption = "Equivalencia: la diferencia debe estar DENTRO del intervalo ±δ (ambas direcciones)"
  ) +
  theme_minimal(base_size = 16) +
  theme(
    plot.title = element_text(face = "bold", color = "#7D3C98", size = 20, 
                              hjust = 0.5, margin = margin(b = 10)),
    plot.subtitle = element_text(color = "#5D6D7E", size = 16, 
                                 hjust = 0.5, margin = margin(b = 15)),
    plot.caption = element_text(color = "#566573", size = 13, face = "italic",
                                margin = margin(t = 15)),
    axis.title.x = element_text(size = 15, face = "bold", color = "#2C3E50",
                                margin = margin(t = 10)),
    axis.text.x = element_text(size = 14, face = "bold", color = "#2C3E50"),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    plot.margin = margin(20, 20, 20, 20)
  )

Análisis del concepto de equivalencia aplicado a la validación de un glucómetro

Este gráfico me permite explicar de forma sencilla y visual qué significa un diseño de equivalencia cuando se quiere validar un glucómetro portátil frente al método de laboratorio, que se considera el estándar de oro. En el eje horizontal se representa la diferencia promedio entre la medición del glucómetro y la del laboratorio, expresada en mg/dL, y a partir de esa diferencia pretendería tomar decisiones clínicas.

La zona verde central corresponde al intervalo de equivalencia, definido en este caso como ±5 mg/dL. Si la diferencia entre ambos métodos cae dentro de este rango, puedo afirmar que el glucómetro y el laboratorio son intercambiables para fines de tamizaje, es decir, en términos prácticos, esto significa que el error de medición del glucómetro es lo suficientemente pequeño como para no cambiar decisiones clínicas relevantes en población escolar.

Las zonas rojas laterales representan escenarios que no son aceptables. En la zona izquierda, donde la diferencia es menor a −5 mg/dL, el glucómetro subestima la glicemia real, lo cual implica un riesgo de falsos negativos, es decir, niños con glicemias elevadas que podrían pasar desapercibidos durante el tamizaje, por lo que en población pediátrica, este escenario es especialmente problemático porque retrasaría la identificación temprana de alteraciones metabólicas.

En la zona derecha, donde la diferencia supera +5 mg/dL, el glucómetro sobrestima la glicemia. Aquí el problema son los falsos positivos, es decir, niños sanos que serían catalogados erróneamente como alterados y referidos a evaluaciones innecesarias. Esto genera ansiedad en las familias, sobrecarga los servicios de salud y aumenta costos sin un beneficio real.

Este gráfico también me ayuda a entender por qué el diseño de equivalencia es el más adecuado en este contexto. A diferencia de un estudio de no-inferioridad, que solo evalúa si el nuevo método no es peor en una sola dirección, el diseño de equivalencia exige demostrar que la diferencia se mantiene dentro del margen aceptable en ambas direcciones, tanto por exceso como por defecto. Es decir, debo asegurar que el glucómetro ni subestima ni sobreestima de forma clínicamente relevante.

Desde el punto de vista estadístico, esta exigencia implica un mayor tamaño muestral, ya que debo rechazar simultáneamente dos hipótesis nulas mediante el procedimiento TOST (Two One-Sided Tests). Esto explica por qué el tamaño de muestra requerido para equivalencia (n = 176) es mayor que el calculado para no-inferioridad.

En términos prácticos y éticos, considero que este enfoque bilateral es el único justificable para una herramienta de tamizaje poblacional en niños, ya que tanto la sub detección como la sobre detección tienen consecuencias clínicas, emocionales y económicas relevantes. Por lo que, demostrar equivalencia no es solo una exigencia estadística, sino una condición necesaria para el uso responsable del glucómetro en programas escolares, en mi escenario hipotético.

df_comp <- data.frame(
  Diseño = factor(c("No-Inferioridad", "Equivalencia"), 
                  levels = c("No-Inferioridad", "Equivalencia")),
  n = c(ceiling(n_nis), ceiling(n_equiv)),
  Tipo = c("Unilateral", "Bilateral (TOST)")
)

ggplot(df_comp, aes(x = Diseño, y = n, fill = Diseño)) +
  geom_col(width = 0.6, alpha = 0.9, color = "black", linewidth = 0.8) +
  geom_text(aes(label = n), vjust = -0.5, fontface = "bold", size = 10, 
            color = "#2C3E50") +
  geom_text(aes(label = Tipo, y = n/2), color = "white", fontface = "bold", 
            size = 6) +
  scale_fill_manual(values = c("#2874A6", "#7D3C98")) +
  scale_y_continuous(limits = c(0, max(df_comp$n) * 1.25),
                     expand = expansion(mult = c(0, 0.1))) +
  labs(
    title = "¿Por qué Equivalencia requiere más participantes?",
    subtitle = "Mismo σ = 11.32 mg/dL  |  Mismo δ = 5 mg/dL  |  Potencia = 80%",
    x = "",
    y = "Tamaño de muestra (n por grupo)",
    caption = "Equivalencia debe demostrar similitud en AMBAS direcciones → Mayor exigencia → Mayor n"
  ) +
  theme_minimal(base_size = 16) +
  theme(
    plot.title = element_text(face = "bold", color = "#2C3E50", size = 20, 
                              hjust = 0.5, margin = margin(b = 10)),
    plot.subtitle = element_text(color = "#5D6D7E", size = 15, 
                                 hjust = 0.5, margin = margin(b = 15)),
    plot.caption = element_text(color = "#566573", size = 13, face = "italic",
                                margin = margin(t = 15)),
    axis.title.y = element_text(size = 15, face = "bold", color = "#2C3E50",
                                margin = margin(r = 10)),
    axis.text.x = element_text(size = 16, face = "bold", color = "#2C3E50"),
    axis.text.y = element_text(size = 14, color = "#2C3E50"),
    legend.position = "none",
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank(),
    plot.margin = margin(20, 25, 20, 20)
  )

¿por qué necesito más participantes para demostrar que dos métodos son equivalentes?

La respuesta está en la naturaleza de lo que estoy intentando probar, pues con un diseño de no-inferioridad, solo necesito demostrar que el glucómetro “no es peor” que el laboratorio en una dirección específica.

Es como si dijera “me basta con que no subestime demasiado la glucosa”, por lo que esta pregunta unilateral requiere 81 participantes por grupo, pero para mi escenario de tamizaje escolar, esa pregunta se queda corta, pues NO me sirve un glucómetro que pase la prueba de no-inferioridad si resulta que sobreestima sistemáticamente la glucosa en 8 mg/dL, por lo que técnicamente “no sería peor” (no subestima), pero en la práctica estaría enviando a decenas de niños sanos a evaluaciones innecesarias.

Por eso el diseño de equivalencia me exige más, pues debo demostrar que el glucómetro se comporta de manera similar al laboratorio en ambas direcciones. Esta doble demostración, conocida como TOST (Two One-Sided Tests), implica que estadísticamente estoy realizando dos pruebas simultáneas, y para mantener la misma potencia del 80% en ambas, necesito aumentar mi muestra a 88 participantes por grupo.

La diferencia de 7 participantes adicionales por grupo puede parecer menor, pero representa el costo de hacer una pregunta científica más rigurosa y, en mi opinión, más honesta con la realidad clínica del problema que quiero resolver.

ESCENARIO 3: DATOS APAREADOS (ANTES/DESPUÉS)

# Tabla descriptiva del escenario de datos apareados
escenario_apareados <- data.frame(
  Aspecto = c(
    "Contexto epidemiológico",
    "Fundamento fisiopatológico",
    "Intervención propuesta",
    "Diseño del estudio",
    "¿Qué son datos apareados?",
    "Ventaja de este diseño",
    "Variable de resultado",
    "Pregunta de investigación",
    "Diferencia esperada (δ)",
    "Justificación clínica del δ"
  ),
  Descripcion = c(
    "Codazzi et al. (2024) señalan que el sedentarismo y la dieta hipercalórica son factores de riesgo MODIFICABLES del síndrome metabólico infantil",
    "La resistencia a la insulina en niños obesos resulta de la acumulación de ácidos grasos libres y citocinas proinflamatorias (IL-6, TNF-α) que alteran la señalización de insulina en hígado y músculo",
    "Programa de 12 semanas: educación nutricional + 150 min/semana de actividad física moderada en escolares con exceso de peso",
    "Estudio pre-post: medir glicemia ANTES y DESPUÉS de la intervención en los MISMOS niños",
    "Cada niño es su PROPIO CONTROL. Se compara la glicemia del niño consigo mismo, no con otro niño diferente",
    "REDUCE la variabilidad porque elimina las diferencias entre individuos (genética, metabolismo basal, hábitos familiares). Solo queda la variabilidad del CAMBIO",
    "Diferencia en glicemia: Δ = Glicemia_DESPUÉS - Glicemia_ANTES (mg/dL)",
    "¿Cuántos niños necesito para detectar una reducción de 5 mg/dL en glicemia después de 12 semanas de intervención?",
    "δ = 5 mg/dL (reducción esperada)",
    "Una reducción de 5 mg/dL en niños con glicemia límite (95-99 mg/dL) los aleja del umbral de prediabetes (100 mg/dL)"
  )
)

kable(escenario_apareados,
      caption = "Escenario Hipotético: Intervención Nutricional con Diseño Antes/Después",
      col.names = c("Aspecto", "Descripción"),
      align = c("l", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = TRUE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#E67E22", color = "white") %>%
  row_spec(1:2, background = "#FEF5E7") %>%
  row_spec(3:4, background = "#FDEBD0") %>%
  row_spec(5:6, background = "#FAD7A0") %>%
  row_spec(7:8, background = "#F8C471") %>%
  row_spec(9:10, bold = TRUE, background = "#F5B041", color = "#1B4F72") %>%
  column_spec(1, bold = TRUE, color = "#9C640C", width = "14em")
Escenario Hipotético: Intervención Nutricional con Diseño Antes/Después
Aspecto Descripción
Contexto epidemiológico Codazzi et al. (2024) señalan que el sedentarismo y la dieta hipercalórica son factores de riesgo MODIFICABLES del síndrome metabólico infantil
Fundamento fisiopatológico La resistencia a la insulina en niños obesos resulta de la acumulación de ácidos grasos libres y citocinas proinflamatorias (IL-6, TNF-α) que alteran la señalización de insulina en hígado y músculo
Intervención propuesta Programa de 12 semanas: educación nutricional + 150 min/semana de actividad física moderada en escolares con exceso de peso
Diseño del estudio Estudio pre-post: medir glicemia ANTES y DESPUÉS de la intervención en los MISMOS niños
¿Qué son datos apareados? Cada niño es su PROPIO CONTROL. Se compara la glicemia del niño consigo mismo, no con otro niño diferente
Ventaja de este diseño REDUCE la variabilidad porque elimina las diferencias entre individuos (genética, metabolismo basal, hábitos familiares). Solo queda la variabilidad del CAMBIO
Variable de resultado Diferencia en glicemia: Δ = Glicemia_DESPUÉS - Glicemia_ANTES (mg/dL)
Pregunta de investigación ¿Cuántos niños necesito para detectar una reducción de 5 mg/dL en glicemia después de 12 semanas de intervención?
Diferencia esperada (δ) δ = 5 mg/dL (reducción esperada)
Justificación clínica del δ Una reducción de 5 mg/dL en niños con glicemia límite (95-99 mg/dL) los aleja del umbral de prediabetes (100 mg/dL)
# Tabla explicativa de la fórmula para datos apareados
formula_apareados <- data.frame(
  Elemento = c(
    "Fórmula para datos apareados",
    "¿Por qué es diferente?",
    "σ_d (DE de las diferencias)",
    "¿Cómo estimar σ_d?",
    "Estimación conservadora",
    "Δ (diferencia esperada)",
    "Z_α/2",
    "Z_β",
    "Interpretación del resultado"
  ),
  Valor = c(
    "n = (σ_d)² × (Z_α/2 + Z_β)² / Δ²",
    "Solo necesito UN grupo (cada sujeto es su propio control)",
    "Variabilidad del CAMBIO individual, no de la glicemia absoluta",
    "De estudios previos similares o estudio piloto",
    "σ_d ≈ σ × √2 × √(1-r) donde r = correlación antes-después",
    "5 mg/dL (reducción clínicamente relevante)",
    "1.96 (para α = 0.05 bilateral)",
    "0.842 (para potencia = 80%)",
    "n = número TOTAL de sujetos (no por grupo, porque solo hay un grupo)"
  ),
  Explicacion = c(
    "Fórmula de Aguilar-Barojas (2005) para muestras apareadas",
    "En diseños independientes necesito 2 grupos; aquí los mismos sujetos se miden 2 veces",
    "Típicamente σ_d < σ porque se elimina la variabilidad entre sujetos",
    "La correlación entre medidas reduce σ_d: si r=0.7, σ_d ≈ 0.77×σ",
    "Si asumo r=0.5 (correlación moderada): σ_d = 11.32 × √2 × √0.5 = 11.32 mg/dL",
    "Basado en meta-análisis de intervenciones en niños obesos",
    "Prueba bilateral porque la intervención podría mejorar O empeorar",
    "80% probabilidad de detectar el efecto si realmente existe",
    "Este n es el tamaño TOTAL de la muestra"
  )
)

kable(formula_apareados,
      caption = "Fórmula y parámetros para estudio de datos apareados (antes/después)",
      col.names = c("Elemento", "Valor/Símbolo", "Explicación"),
      align = c("l", "c", "l")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = TRUE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#D35400", color = "black") %>%
  row_spec(1:2, background = "#FEF5E7") %>%
  row_spec(3:5, background = "#FDEBD0") %>%
  row_spec(6:8, background = "#FAD7A0") %>%
  row_spec(9, bold = TRUE, background = "white", color = "white") %>%
  column_spec(1, bold = TRUE, color = "#9C640C") %>%
  column_spec(2, bold = TRUE, color = "#E67")
Fórmula y parámetros para estudio de datos apareados (antes/después)
Elemento Valor/Símbolo Explicación
Fórmula para datos apareados n = (σ_d)² × (Z_α/2 + Z_β)² / Δ² Fórmula de Aguilar-Barojas (2005) para muestras apareadas
¿Por qué es diferente? Solo necesito UN grupo (cada sujeto es su propio control) En diseños independientes necesito 2 grupos; aquí los mismos sujetos se miden 2 veces
σ_d (DE de las diferencias) Variabilidad del CAMBIO individual, no de la glicemia absoluta Típicamente σ_d < σ porque se elimina la variabilidad entre sujetos
¿Cómo estimar σ_d? De estudios previos similares o estudio piloto La correlación entre medidas reduce σ_d: si r=0.7, σ_d ≈ 0.77×σ
Estimación conservadora σ_d ≈ σ × √2 × √(1-r) donde r = correlación antes-después Si asumo r=0.5 (correlación moderada): σ_d = 11.32 × √2 × √0.5 = 11.32 mg/dL
Δ (diferencia esperada) 5 mg/dL (reducción clínicamente relevante) Basado en meta-análisis de intervenciones en niños obesos
Z_α/2 1.96 (para α = 0.05 bilateral) Prueba bilateral porque la intervención podría mejorar O empeorar
Z_β 0.842 (para potencia = 80%) 80% probabilidad de detectar el efecto si realmente existe
Interpretación del resultado n = número TOTAL de sujetos (no por grupo, porque solo hay un grupo) Este n es el tamaño TOTAL de la muestra
# Parámetros para datos apareados
sigma_glicemia <- sd(BaseMetabolismo$glicemia, na.rm = TRUE)
media_glicemia <- mean(BaseMetabolismo$glicemia, na.rm = TRUE)

# Estimación de sigma_d (DE de las diferencias)
# Asumiendo correlación moderada (r = 0.5) entre antes y después
correlacion <- 0.5
sigma_d <- sigma_glicemia * sqrt(2) * sqrt(1 - correlacion)

# Parámetros del diseño
delta_apareados <- 5  # Reducción esperada en mg/dL
alpha_apareados <- 0.05
beta_apareados <- 0.20
Z_alpha <- qnorm(1 - alpha_apareados/2)
Z_beta <- qnorm(1 - beta_apareados)

# Cálculo manual de n para datos apareados
n_apareados <- ceiling((sigma_d^2 * (Z_alpha + Z_beta)^2) / delta_apareados^2)

cat("ESTUDIO DE DATOS APAREADOS (ANTES/DESPUÉS)\n")
## ESTUDIO DE DATOS APAREADOS (ANTES/DESPUÉS)
cat("==========================================\n\n")
## ==========================================
cat("Parámetros de mi cohorte:\n")
## Parámetros de mi cohorte:
cat("  Media glicemia:", round(media_glicemia, 2), "mg/dL\n")
##   Media glicemia: 88.1 mg/dL
cat("  DE glicemia (σ):", round(sigma_glicemia, 2), "mg/dL\n\n")
##   DE glicemia (σ): 11.32 mg/dL
cat("Estimación de variabilidad del cambio:\n")
## Estimación de variabilidad del cambio:
cat("  Correlación asumida (r):", correlacion, "\n")
##   Correlación asumida (r): 0.5
cat("  σ_d = σ × √2 × √(1-r) =", round(sigma_d, 2), "mg/dL\n\n")
##   σ_d = σ × √2 × √(1-r) = 11.32 mg/dL
cat("Parámetros del diseño:\n")
## Parámetros del diseño:
cat("  Diferencia esperada (δ):", delta_apareados, "mg/dL\n")
##   Diferencia esperada (δ): 5 mg/dL
cat("  Alpha:", alpha_apareados, "(bilateral)\n")
##   Alpha: 0.05 (bilateral)
cat("  Z_α/2:", round(Z_alpha, 3), "\n")
##   Z_α/2: 1.96
cat("  Z_β:", round(Z_beta, 3), "\n")
##   Z_β: 0.842
cat("  Potencia:", (1 - beta_apareados) * 100, "%\n\n")
##   Potencia: 80 %
cat("RESULTADO:\n")
## RESULTADO:
cat("  n TOTAL:", n_apareados, "niños\n")
##   n TOTAL: 41 niños
cat("  (cada niño medido ANTES y DESPUÉS)\n")
##   (cada niño medido ANTES y DESPUÉS)
# Tabla de resultados
resultado_apareados <- data.frame(
  Componente = c(
    "Tipo de diseño",
    "Variable",
    "Media basal (μ)",
    "DE de glicemia (σ)",
    "Correlación asumida (r)",
    "DE de las diferencias (σ_d)",
    "Diferencia esperada (δ)",
    "Alpha (α)",
    "Potencia (1-β)",
    "Fórmula que aplico",
    "n TOTAL requerido",
    "Interpretación"
  ),
  Valor = c(
    "Datos apareados (antes/después)",
    "Cambio en glicemia (mg/dL)",
    paste0(round(media_glicemia, 2), " mg/dL"),
    paste0(round(sigma_glicemia, 2), " mg/dL"),
    "0.5 (moderada)",
    paste0(round(sigma_d, 2), " mg/dL"),
    paste0("-", delta_apareados, " mg/dL (reducción)"),
    "0.05 (bilateral)",
    "80%",
    "n = σ_d² × (Z_α/2 + Z_β)² / Δ²",
    paste0(n_apareados, " niños"),
    "Cada niño es medido 2 veces (antes y después)"
  )
)

kable(resultado_apareados,
      caption = "Parámetros y resultado: Estudio de datos apareados",
      col.names = c("Componente", "Valor"),
      align = c("l", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "lightblue", color = "white") %>%
  row_spec(1:3, background = "#FEF5E7") %>%
  row_spec(4:6, background = "#FDEBD0") %>%
  row_spec(7:9, background = "#D5F5E3") %>%
  row_spec(10, background = "#FEF9E7", italic = TRUE) %>%
  row_spec(11:12, bold = TRUE, background = "#FADBD8", color = "#922B21") %>%
  column_spec(1, bold = TRUE, color = "#9C640C")
Parámetros y resultado: Estudio de datos apareados
Componente Valor
Tipo de diseño Datos apareados (antes/después)
Variable Cambio en glicemia (mg/dL)
Media basal (μ) 88.1 mg/dL
DE de glicemia (σ) 11.32 mg/dL
Correlación asumida (r) 0.5 (moderada)
DE de las diferencias (σ_d) 11.32 mg/dL
Diferencia esperada (δ) -5 mg/dL (reducción)
Alpha (α) 0.05 (bilateral)
Potencia (1-β) 80%
Fórmula que aplico n = σ_d² × (Z_α/2 + Z_β)² / Δ²
n TOTAL requerido 41 niños
Interpretación Cada niño es medido 2 veces (antes y después)
# Gráfico conceptual de datos apareados vs independientes
ggplot() +
  # Panel izquierdo: Diseño independiente
  annotate("rect", xmin = 0, xmax = 4.5, ymin = 0, ymax = 10, 
           fill = "#3498DB", alpha = 0.15) +
  # Título panel izquierdo
  annotate("text", x = 2.25, y = 9.5, 
           label = "DISEÑO INDEPENDIENTE", 
           fontface = "bold", size = 7, color = "#1A5276") +
  annotate("text", x = 2.25, y = 8.8, 
           label = "(dos grupos diferentes)", 
           size = 5, color = "#5D6D7E") +
  # Grupo Control
  annotate("text", x = 1, y = 7.5, label = "GRUPO\nCONTROL", 
           fontface = "bold", size = 5, color = "#2874A6") +
  annotate("point", x = c(0.6, 0.8, 1, 1.2, 1.4), y = c(6, 6.3, 5.8, 6.5, 6.2), 
           size = 4, color = "#2874A6") +
  annotate("text", x = 1, y = 5, label = "n = 81", 
           fontface = "bold", size = 5, color = "#2874A6") +
  # Grupo Tratamiento
  annotate("text", x = 3.5, y = 7.5, label = "GRUPO\nTRATAMIENTO", 
           fontface = "bold", size = 5, color = "#1E8449") +
  annotate("point", x = c(3.1, 3.3, 3.5, 3.7, 3.9), y = c(6.2, 5.9, 6.4, 6.1, 5.7), 
           size = 4, color = "#1E8449") +
  annotate("text", x = 3.5, y = 5, label = "n = 81", 
           fontface = "bold", size = 5, color = "#1E8449") +
  # Total diseño independiente
  annotate("label", x = 2.25, y = 3.5, 
           label = "TOTAL = 162 niños\n(diferentes)", 
           fontface = "bold", size = 5, fill = "#EBF5FB", color = "#1A5276") +
  # Flecha de comparación
  annotate("segment", x = 1.5, xend = 3, y = 6.2, yend = 6.2,
           arrow = arrow(ends = "both", length = unit(0.4, "cm")),
           color = "#E74C3C", linewidth = 1.5) +
  annotate("text", x = 2.25, y = 6.7, label = "Comparar", 
           fontface = "italic", size = 4, color = "#E74C3C") +
  

  # Panel derecho: Diseño apareado
  annotate("rect", xmin = 5.5, xmax = 10, ymin = 0, ymax = 10, 
           fill = "#E67E22", alpha = 0.15) +
  # Título panel derecho
  annotate("text", x = 7.75, y = 9.5, 
           label = "DISEÑO APAREADO", 
           fontface = "bold", size = 7, color = "#9C640C") +
  annotate("text", x = 7.75, y = 8.8, 
           label = "(mismo grupo, dos momentos)", 
           size = 5, color = "#5D6D7E") +
  # ANTES
  annotate("text", x = 6.5, y = 7.5, label = "ANTES", 
           fontface = "bold", size = 5, color = "#D35400") +
  annotate("point", x = c(6.1, 6.3, 6.5, 6.7, 6.9), y = c(6, 6.3, 5.8, 6.5, 6.2), 
           size = 4, color = "#D35400") +
  annotate("text", x = 6.5, y = 5, label = "Medición 1", 
           size = 4, color = "#D35400") +
  # DESPUÉS
  annotate("text", x = 9, y = 7.5, label = "DESPUÉS", 
           fontface = "bold", size = 5, color = "#D35400") +
  annotate("point", x = c(8.6, 8.8, 9, 9.2, 9.4), y = c(5.5, 5.8, 5.3, 6, 5.7), 
           size = 4, color = "#D35400") +
  annotate("text", x = 9, y = 5, label = "Medición 2", 
           size = 4, color = "#D35400") +
  # Flechas conectando los mismos sujetos
  annotate("segment", x = 6.1, xend = 8.6, y = 6, yend = 5.5,
           arrow = arrow(length = unit(0.2, "cm")), color = "#7F8C8D", linewidth = 0.8) +
  annotate("segment", x = 6.3, xend = 8.8, y = 6.3, yend = 5.8,
           arrow = arrow(length = unit(0.2, "cm")), color = "#7F8C8D", linewidth = 0.8) +
  annotate("segment", x = 6.5, xend = 9, y = 5.8, yend = 5.3,
           arrow = arrow(length = unit(0.2, "cm")), color = "#7F8C8D", linewidth = 0.8) +
  annotate("segment", x = 6.7, xend = 9.2, y = 6.5, yend = 6,
           arrow = arrow(length = unit(0.2, "cm")), color = "#7F8C8D", linewidth = 0.8) +
  annotate("segment", x = 6.9, xend = 9.4, y = 6.2, yend = 5.7,
           arrow = arrow(length = unit(0.2, "cm")), color = "#7F8C8D", linewidth = 0.8) +
  annotate("text", x = 7.75, y = 4.2, label = "Mismo niño", 
           fontface = "italic", size = 4, color = "#7F8C8D") +
  # Total diseño apareado
  annotate("label", x = 7.75, y = 3.5, 
           label = paste0("TOTAL = ", n_apareados, " niños\n(medidos 2 veces)"), 
           fontface = "bold", size = 5, fill = "#FEF5E7", color = "#9C640C") +
  
  # Comparación final
  annotate("label", x = 5, y = 1.5, 
           label = paste0("AHORRO: ", 162 - n_apareados, " niños menos\ncon diseño apareado"), 
           fontface = "bold", size = 5, fill = "#D5F5E3", color = "#1E8449") +
  
  # Escala y tema

  scale_x_continuous(limits = c(0, 10)) +
  scale_y_continuous(limits = c(0, 10)) +
  labs(title = "Comparación: Diseño Independiente vs Diseño Apareado",
       subtitle = "Para detectar δ = 5 mg/dL con σ = 11.32 mg/dL y potencia 80%",
       x = "", y = "") +
  theme_void() +
  theme(
    plot.title = element_text(face = "bold", color = "#2C3E50", size = 18, hjust = 0.5),
    plot.subtitle = element_text(color = "#5D6D7E", size = 14, hjust = 0.5),
    plot.margin = margin(20, 20, 20, 20)
  )

Comparación entre diseño independiente y diseño apareado

En el panel izquierdo, correspondiente al diseño independiente, se muestran dos grupos completamente distintos de niños. Un grupo control está conformado por 81 escolares, y el grupo de intervención por otros 81 escolares diferentes. La flecha roja bidireccional entre ambos grupos representa la comparación estadística entre personas distintas, lo que implica que cualquier diferencia observada incorpora no solo el efecto de la intervención, sino también toda la variabilidad natural entre individuos, como diferencias biológicas, conductuales y contextuales.

En contraste, el panel derecho representa el diseño apareado. Aquí, cada punto del lado izquierdo está conectado mediante flechas grises con un punto del lado derecho, lo que indica que se trata del mismo niño medido en dos momentos distintos, antes y después de la intervención. La etiqueta “Mismo niño” enfatiza que ya no se comparan personas diferentes, sino el cambio que ocurre dentro de cada individuo a lo largo del tiempo.

Este cambio conceptual es clave, porque al comparar a cada niño consigo mismo, se elimina la variabilidad entre sujetos, que es una de las principales fuentes de ruido estadístico. El recuadro verde inferior resume, mostrando un ahorro de 121 niños al optar por el diseño apareado, por lo cual, desde una perspectiva práctica, considero que esta diferencia es enorme, ya que reclutar y evaluar 41 escolares es factible en una sola institución educativa, mientras que 162 participantes implicarían múltiples escuelas, mayor costo y más tiempo.

# Comparación de los tres diseños: Independiente, Apareado, No-Inferioridad, Equivalencia
df_3disenos <- data.frame(
  Diseño = factor(c("Independiente\n(superioridad)", 
                    "No-Inferioridad", 
                    "Equivalencia", 
                    "Apareado\n(antes/después)"),
                  levels = c("Independiente\n(superioridad)", 
                             "No-Inferioridad", 
                             "Equivalencia", 
                             "Apareado\n(antes/después)")),
  n_total = c(159*2, ceiling(n_nis)*2, ceiling(n_equiv)*2, n_apareados),
  Tipo = c("2 grupos\ndiferentes", 
           "2 grupos\ndiferentes", 
           "2 grupos\ndiferentes", 
           "1 grupo\n2 mediciones"),
  Color = c("#3498DB", "#2874A6", "#7D3C98", "#E67E22")
)

ggplot(df_3disenos, aes(x = Diseño, y = n_total, fill = Diseño)) +
  geom_col(width = 0.6, alpha = 0.85, color = "black", linewidth = 0.5) +
  geom_text(aes(label = n_total), vjust = -0.5, fontface = "bold", size = 8) +
  geom_text(aes(label = Tipo, y = n_total/2), color = "white", fontface = "bold", size = 5) +
  scale_fill_manual(values = c("#3498DB", "#2874A6", "#7D3C98", "#E67E22")) +
  scale_y_continuous(limits = c(0, max(df_3disenos$n_total) * 1.15),
                     breaks = seq(0, 350, by = 50)) +
  labs(title = "Comparación de Tamaño Muestral TOTAL según Tipo de Diseño",
       subtitle = "Para detectar δ = 5 mg/dL con σ = 11.32 mg/dL y potencia 80%",
       x = "",
       y = "n TOTAL",
       caption = "Con el diseño apareado requiero MENOS participantes porque cada sujeto es su propio control") +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#2C3E50", size = 18, hjust = 0.5),
    plot.subtitle = element_text(color = "#5D6D7E", size = 14, hjust = 0.5),
    plot.caption = element_text(color = "#7F8C8D", size = 11, face = "italic"),
    axis.title.y = element_text(face = "bold", color = "#2C3E50", size = 14),
    axis.text.x = element_text(face = "bold", size = 12),
    axis.text.y = element_text(size = 12),
    legend.position = "none",
    panel.grid.major.x = element_blank()
  )

Análisis del gráfico de barras: tamaño muestral total según tipo de diseño

El gráfico de barras me dice sobre la eficiencia relativa de cada diseño estadístico. La barra azul correspondiente al diseño independiente de superioridad alcanza los 318 participantes, siendo la más alta, y que refleja cuando se comparan dos grupos naturales distintos, por lo cual, se requiere un tamaño muestral grande para superar la variabilidad entre sujetos.

La barra azul oscuro del diseño de no-inferioridad se sitúa en 162 participantes, aproximadamente la mitad del diseño independiente. Esta reducción es porque el contraste es unilateral, ya que solo se evalúa el programa nuevo que no sea peor que el estándar dentro de un margen aceptable.

La barra morada correspondiente al diseño de equivalencia muestra 176 participantes, ligeramente más que la no-inferioridad. Esto es coherente con el mayor rigor estadístico del procedimiento TOST, que exige demostrar similitud en ambas direcciones de forma simultánea.

Finalmente, la barra naranja del diseño apareado destaca solo 41 participantes. La anotación “1 grupo, 2 mediciones” resume por qué este diseño es tan eficiente, ya que cada sujeto actúa como su propio control, lo que reduce mucho la variabilidad y permite detectar efectos con muchos menos participantes.

# Tabla comparativa de todos los diseños
tabla_final <- data.frame(
  Aspecto = c(
    "Pregunta de investigación",
    "Número de grupos",
    "Tipo de comparación",
    "Dirección de la prueba",
    "n por grupo",
    "n TOTAL",
    "Ejemplo en SM infantil"
  ),
  Independiente = c(
    "¿A es diferente de B?",
    "2 grupos diferentes",
    "Grupo A vs Grupo B",
    "Bilateral",
    "159",
    "318",
    "Glicemia en obesos vs no obesos"
  ),
  No_Inferioridad = c(
    "¿A no es peor que B?",
    "2 grupos diferentes",
    "Nuevo vs Estándar",
    "Unilateral",
    "81",
    "162",
    "Dieta económica no empeora glicemia"
  ),
  Equivalencia = c(
    "¿A ≈ B?",
    "2 grupos diferentes",
    "Método A vs Método B",
    "Bilateral (TOST)",
    "88",
    "176",
    "Glucómetro ≈ Laboratorio"
  ),
  Apareado = c(
    "¿Hay cambio antes/después?",
    "1 solo grupo",
    "Antes vs Después (mismo sujeto)",
    "Bilateral",
    paste0(n_apareados, " (total)"),
    as.character(n_apareados),
    "Efecto de intervención nutricional"
  )
)

kable(tabla_final,
      caption = "Resumen comparativo, con cuatro diseños de estudio",
      col.names = c("Aspecto", "Independiente", "No-Inferioridad", "Equivalencia", "Apareado"),
      align = c("l", "c", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = TRUE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#1ABC9C", color = "white") %>%
  row_spec(1:2, background = "#E8F8F5") %>%
  row_spec(3:4, background = "#FEF9E7") %>%
  row_spec(5:6, bold = TRUE, background = "#FADBD8") %>%
  row_spec(7, background = "#E8DAEF", italic = TRUE) %>%
  column_spec(1, bold = TRUE, color = "#117A65") %>%
  column_spec(2, color = "#2874A6") %>%
  column_spec(3, color = "#1A5276") %>%
  column_spec(4, color = "#7D3C98") %>%
  column_spec(5, color = "#E67E22")
Resumen comparativo, con cuatro diseños de estudio
Aspecto Independiente No-Inferioridad Equivalencia Apareado
Pregunta de investigación ¿A es diferente de B? ¿A no es peor que B? ¿A ≈ B? ¿Hay cambio antes/después?
Número de grupos 2 grupos diferentes 2 grupos diferentes 2 grupos diferentes 1 solo grupo
Tipo de comparación Grupo A vs Grupo B Nuevo vs Estándar Método A vs Método B Antes vs Después (mismo sujeto)
Dirección de la prueba Bilateral Unilateral Bilateral (TOST) Bilateral
n por grupo 159 81 88 41 (total)
n TOTAL 318 162 176 41
Ejemplo en SM infantil Glicemia en obesos vs no obesos Dieta económica no empeora glicemia Glucómetro ≈ Laboratorio Efecto de intervención nutricional

Consideraciones de factibilidad

Siguiendo las recomendaciones de Aguilar-Barojas (2005), quien señala que “una vez que se ha obtenido el tamaño de la muestra, es necesario analizar las dificultades operativas, la disponibilidad de tiempo y recursos para que verdaderamente sea viable aplicarla”, cada cálculo de tamaño muestral lo evalué considerando:

  1. Acceso a instituciones educativas: La factibilidad de reclutar escolares en colegios Colombianos.

  2. Costos de laboratorio: El presupuesto necesario para análisis de glicemia y perfil lipídico.

  3. Aceptabilidad ética: La necesidad de consentimiento informado de padres y asentimiento de menores.

  4. Tiempo de seguimiento: Para diseños longitudinales como el estudio antes/después de 12 semanas.

5.1 REFERENCIAS

1.Aguilar-Barojas, S. (2005). Fórmulas para el cálculo de la muestra en investigaciones de salud. Salud en Tabasco, 11(1-2), 333-338. American Diabetes Association. (2024). Standards of Care in Diabetes—2024. Diabetes Care, 47(Supplement 1).

2.Codazzi, V., Frontino, G., Galimberti, L., Giustina, A., & Petrelli, A. (2024). Mechanisms and risk factors of metabolic syndrome in children and adolescents. Endocrine, 84, 16-28. https://doi.org/10.1007/s12020-023-03642-x

3.Daniel, W. W. (2018). Bioestadística: Base para el análisis de las ciencias de la salud (4ª ed.). Limusa Wiley.

4.Zimmet, P., Alberti, K. G., Kaufman, F., Tajima, N., Silink, M., Arslanian, S., & Caprio, S. (2007). The metabolic syndrome in children and adolescents - an IDF consensus report. Pediatric Diabetes, 8(5), 299-306.