ruta_datos <- "C:/Users/LAURA/Downloads/BASE DE DATOS.xlsx"
library(readxl)
library(moments)
library(ggplot2)
library(grid)
library(gridExtra)
library(aplpack)
library(gplots)
library(abind)
library(e1071)
library(scales)
library(corrplot)
library(scatterplot3d)
library(aplpack)
library(rmarkdown)
library(Rcmdr)
library(RcmdrMisc)
El presente informe expone el análisis exploratorio de datos de una muestra de pacientes, enfocado en caracterizar sus variables sociodemográficas y sus marcadores de riesgo cardiovascular, metabólico y tiroideo. Metodológicamente, se empleó el software R para calcular medidas de tendencia central, dispersión y forma, así como para la construcción de representaciones gráficas avanzadas como diagramas de caja, tallo y hoja, y gráficos de barras apiladas al 100%.
Los resultados evidencian dos comportamientos poblacionales distintos. Por un lado, variables como el Colesterol Total y la Tensión Diastólica presentaron una distribución mesocúrtica y simétrica, permitiendo el uso de la Media y la Desviación Estándar como parámetros poblacionales fiables. En contraste, marcadores como la TSH mostraron un sesgo fuertemente positivo y un comportamiento leptocúrtico (curtosis > 7) debido a la presencia de pacientes con valores extremos. Esto justificó la necesidad clínica y estadística de reportar la Mediana y la MEDA para evitar un perfil epidemiológico sesgado. Adicionalmente, el análisis bivariado demostró fluctuaciones importantes de estos marcadores según el género y los diferentes grupos de edad (ej. variabilidad en niveles de colesterol en el grupo de 46-60 años).
El estudio demuestra que el rigor en la selección de estimadores estadísticos, guiado por el análisis de la forma de la distribución, es indispensable para aislar valores atípicos y obtener una interpretación de resultados fiel y clínicamente útil de la salud de la población estudiada.
El presente informe estadístico se basa en el análisis de una base de datos obtenida a partir de las historias clínicas de pacientes que asistieron a consulta general en el Hospital Universitario San Ignacio. La selección de los casos se realizó considerando aquellos pacientes en quienes, durante la valoración inicial, se identificaron hallazgos clínicos sugestivos de riesgo cardiovascular.
La muestra está conformada por 132 pacientes, residentes en la ciudad de Bogotá, quienes acudieron por primera vez a la institución, lo que permite un análisis inicial de características clínicas y posibles factores de riesgo en población de primer contacto.
En la práctica clínica, la evaluación del riesgo cardiovascular, metabólico y tiroideo como el perfil lipídico, control glucémico y la TSH, es fundamental para la prevención de enfermedades crónicas. Sin embargo, un desafío recurrente al analizar bases de datos de pacientes es la alta variabilidad biológica y la presencia de valores atípicos extremos de pacientes descompensados. Aplicar medidas estadísticas tradicionales sin analizar previamente la forma y dispersión de los datos, conduce a sesgos interpretativos que pueden alterar gravemente el perfil de salud real de una población.
Pregunta de Investigación: ¿Cuál es el perfil descriptivo cardiovascular, metabólico y tiroideo de la muestra estudiada, y cómo la aplicación de un análisis exploratorio de datos permite caracterizar adecuadamente a los subgrupos poblacionales según su edad, género y localidad de residencia?
R SOFTWARE: R es un lenguaje para el análisis estadístico y gráfico. Se trata de un ambiente de programación formado por un conjunto de herramientas muy flexibles, que pueden ampliarse fácilmente mediante paquetes, librerías o funciones propias. Además, es gratuito y de código abierto (Open Source), parte del proyecto GNU, como Linux o Mozilla Firefox. (Ferrero, 2018)
OVERLEAF: Overleaf es una herramienta de publicación y redacción colaborativa en línea que hace que todo el proceso de redacción, edición y publicación de documentos científicos sea mucho más rápido y sencillo. Overleaf brinda la conveniencia de un editor LaTeX fácil de usar con colaboración en tiempo real y la salida totalmente compilada producida automáticamente en segundo plano a medida que escribe. (Universidad Carlos III de Madrid, 2020)
GÉNERO: En términos generales, el género puede entenderse como una construcción social de normas, roles y conductas asociadas al sexo que se asigna a una persona al nacer y que condicionan su acceso al poder, a los recursos y al disfrute equitativo de los derechos, entre otras áreas. (Amnistía Internacional, 2025)
SEXO: El sexo se refiere al sexo biológico de la persona. Según la OMS, el “sexo” hace referencia a las características biológicas y fisiológicas que definen a hombres y mujeres. (Definición Sexo, n.d.)
Para términos de este análisis se va a utilizar “Género” como una correspondencia al sexo asignado al nacer: Femenino: indicando que el paciente cuenta con características biológicas de una mujer; masculino: indicando que el paciente cuenta con características biológicas de un hombre.
CARDIOVASCULAR: El término cardiovascular se refiere al corazón (cardio) y a los vasos sanguíneos (vascular). El sistema cardiovascular comprende: las arterias, las arteriolas, los capilares, el corazón y las vénulas. (MedlinePlus, n.d.)
METABÓLICO: Relacionado con el metabolismo (el conjunto de todos los cambios químicos que ocurren en una célula o un organismo para producir la energía y los materiales básicos necesarios para importantes procesos vitales). (Instituto Nacional del Cáncer, n.d.)
OMS: La OMS es la organización de Naciones Unidas responsable de liderar asuntos sanitarios a nivel mundial. Nació tras la II Guerra Mundial, cuando la salud pública internacional ganó relevancia, y ha logrado erradicar del planeta la viruela y la polio, controlar el cólera y poner en marcha campañas de vacunación infantil. (BBVA, 2024)
MTC: Entiéndase como Medidas de Tendencia Central.
MEDA: Entiéndase como Desviación Absoluta Mediana.
MAD: Entiéndase como Desviación Media Absoluta.
CV: Entiéndase como Coeficiente de Variación.
mmHg: El mmHg o milímetro de mercurio es la unidad de medida que se utiliza en medicina para conocer la presión. Principalmente sirve para medir la fuerza con la que la sangre empuja las paredes de las arterias o la presión dentro de los ojos. Esta medida se basa en cuánto sube una columna de mercurio dentro de un tubo ante una presión específica. En la presión arterial, se obtienen dos números: el más alto indica la fuerza cuando el corazón late y el bajo cuando descansa. (Reis, n.d.)
mg/dL: Significa miligramos por decilitro. Un miligramo es una milésima parte de un gramo. Un decilitro mide el volumen de un líquido, equivalente a 1/10 de litro. (Comité de revisión clínica, 2025)
mIU/L: Significa miliunidades internacionales por litro. Es una unidad de medida estándar, frecuentemente utilizada en análisis de sangre para medir la concentración de la hormona estimulante de la tiroides (TSH). (Memorial Sloan Kettering, 2022)
IMC: El índice de masa corporal (IMC) es una medida ampliamente utilizada en la Medicina para evaluar la adecuación del peso corporal de una persona en relación con su altura. Representa una fórmula sencilla: el peso del individuo en kilogramos dividido por el cuadrado de su altura en metros (kg/m²). (Clínica Universidad de Navarra, 2025)
ERROR ESTÁNDAR: El error estándar proporciona una medida de la incertidumbre en torno a las estadísticas muestrales, lo que ayuda a comprender en qué medida podrían variar nuestras estimaciones si repitiéramos el mismo estudio varias veces. Mide la variabilidad de una estadística muestral en muestras repetidas de la misma población. (¿Qué es el error estándar?…, 2025)
Población, muestra, análisis exploratorio, sociodemográfico, variables, hospital, salud, cardiovascular, metabólico, tiroideo, riesgo, distribución, edad, género, sexo.
Población de estudio: La población de estudio corresponde a ciudadanos/pacientes de la ciudad de Bogotá, Colombia del año 2026.
Muestra de estudio: La muestra utilizada corresponde a 132 pacientes del Hospital Universitario San Ignacio ingresados por consulta de medicina general, a los cuales se les destaca su historia clínica por posibles problemas en parámetros de salud cardiovascular.
Software: Para el análisis de los datos con ayuda de las gráficas y tablas, se utilizó el entorno de R y la programación en lenguaje LaTeX en Overleaf respectivamente.
Describir y contextualizar las variables de interés en salud, resaltando su importancia en la detección temprana de riesgo cardiovascular, metabólico apoyado en referentes internacionales como la Organización Mundial de la Salud, y contrastándolas con la realidad observada.
Presentar la información de manera clara y comprensible mediante recursos visuales como gráficos y tablas, con el fin de facilitar la interpretación de los datos y evidenciar cómo se distribuyen las características de la muestra.
Analizar los hallazgos identificados en la población evaluada, destacando patrones relevantes y su posible implicación en la salud cardiovascular, para generar una clara comprensión que pueda ser útil tanto en el ámbito clínico como en la toma de decisiones en salud pública.
Estas variables describen características poblacionales de los individuos y permiten identificar grupos específicos.
i. Edad: Es una variable numérica continua. El concepto de edad, utilizado de forma más corriente, se refiere al período de tiempo transcurrido desde el nacimiento hasta el momento concreto de la vida de una persona. A este tipo de edad, que sólo es un número, se le denomina “edad cronológica” y está determinada simplemente por el año de nacimiento.
ii. Localidad de residencia: Es una variable categórica nominal que indica el lugar donde vive el paciente dentro de la ciudad. Permite analizar cómo varían los indicadores de salud según el territorio, identificando diferencias entre localidades. Esto facilita reconocer posibles inequidades en salud y orientar intervenciones específicas según la zona. (Eustat, n.d.)
Son mediciones descriptivas del paciente, obtenidas durante la consulta médica.
i. Presión sistólica: Es una variable numérica continua expresada en milímetros de mercurio (mmHg). Representa la presión máxima ejercida a las paredes de las arterias durante la contracción del ventrículo izquierdo, llamada “sístole”. Según la guía de la Sociedad Europea de Cardiología (ESH/ESH 2018), conforma el factor de riesgo cardiovascular modificable de mayor riesgo a nivel mundial. (Pasos para bajar la tensión arterial, 2022)
ii. Presión diastólica: Es una variable numérica continua expresada en milímetros de mercurio (mmHg). Corresponde a la mínima presión registrada en las arterias durante la fase de relajación cardiaca. (Pasos para bajar la tensión arterial, 2022)
iii. Peso: Variable numérica continua medida en kilogramos (Kg). Es un indicador fundamental para el cálculo del IMC.
iv. Estatura: Variable numérica continua medida en metros (m). Se usa para hacer el cálculo del IMC y así poder clasificar el estado nutricional del individuo.
v. Género: Es una variable categórica nominal dicotómica, ya que categoriza en masculino/femenino, esto haciendo referencia a las características biológicas y fisiológicas del individuo. Esta variable es de gran importancia porque determina diferencias hormonales, anatómicas y metabólicas que modifican el factor de riesgo, presentación y manifestación de las enfermedades.
Son resultados de pruebas de laboratorio que permiten evaluar y cuantificar procesos bioquímicos internos que no se pueden observar directamente en la exploración física. (Clínica Universidad de Navarra, 2023)
i. Glucosa: Variable numérica continua expresada en mg/dL. Mide la concentración de glucosa o sacarosa en sangre, generalmente se toma este examen en ayuno. (Clínica Universidad de Navarra, 2026)
ii. HbA1c: Hemoglobina glucosilada, es una variable continua expresada en porcentaje (en este estudio); representa la fracción de hemoglobina que se ha unido irreversiblemente a moléculas de glucosa en la sangre, marca el promedio de los últimos 2 a 3 meses. (Medline Plus, 2023)
iii. Perfil lipídico: Conjunto de variables numéricas continuas:
iv. TSH: Hormona estimulante de la tiroides, variable numérica continua expresada en mIU/L, prueba más sensible y de mayor especificidad para detectar disfunciones tiroideas. (Clínica Universidad de Navarra, 2026)
Tabla 1: Resumen de variables — nombre, unidad de medida y tipo
library(readxl)
library(gridExtra)
library(grid)
datos <- read_excel(ruta_datos)
tabla_variables <- data.frame(
Variable = c("Edad", "Género", "Localidad de residencia",
"Tensión Sistólica", "Tensión Diastólica",
"Estatura", "Peso", "Glucosa", "HbA1c",
"Colesterol Total", "LDL", "Triglicéridos", "TSH"),
Unidad = c("Años", "---", "---", "mmHg", "mmHg", "cm", "kg",
"mg/dL", "%", "mg/dL", "mg/dL", "mg/dL", "mIU/L"),
Tipo = c("Numerica continua", "No numerica nominal",
"No numerica nominal", "Numerica continua",
"Numerica continua", "Numerica continua",
"Numerica continua", "Numerica continua",
"Numerica continua", "Numerica continua",
"Numerica continua", "Numerica continua",
"Numerica continua")
)
print(tabla_variables)
## Variable Unidad Tipo
## 1 Edad Años Numerica continua
## 2 Género --- No numerica nominal
## 3 Localidad de residencia --- No numerica nominal
## 4 Tensión Sistólica mmHg Numerica continua
## 5 Tensión Diastólica mmHg Numerica continua
## 6 Estatura cm Numerica continua
## 7 Peso kg Numerica continua
## 8 Glucosa mg/dL Numerica continua
## 9 HbA1c % Numerica continua
## 10 Colesterol Total mg/dL Numerica continua
## 11 LDL mg/dL Numerica continua
## 12 Triglicéridos mg/dL Numerica continua
## 13 TSH mIU/L Numerica continua
grid.newpage()
grid.table(tabla_variables, row=NULL)
Se realizó un estudio observacional y descriptivo, respaldado por una base de datos que incluyó variables sociodemográficas (edad, localidad de residencia), clínicas (presión sistólica, presión diastólica, peso, género, estatura) y paraclínicas (glucosa, perfil lipídico, TSH, HbA1c).
Se calcularon medidas de tendencia central y de dispersión para variables cuantitativas, y tablas de contingencia para variables cualitativas. Adicionalmente, se estimó el IMC (Índice de Masa Corporal) mediante la fórmula: (Luna, n.d.)
\[IMC = \frac{peso}{estatura^2}\]
Figura 1: Porcentaje de pacientes según género
datos <- read_excel(ruta_datos)
table <- table(datos$Género)
porcentajes <- round(prop.table(table) * 100, 2)
colores_lindos <- c("#FF85A2", "#4FC3F7")
etiquetas <- paste(names(table), porcentajes, "%")
pie(table, main = "Porcentaje de pacientes de cada género",
col = colores_lindos, labels = etiquetas, border = "black")
leyenda <- c("Femenino", "Masculino")
legend("topright", legend = leyenda, cex = 1, fill = colores_lindos,
border = "black")
Globalmente se estima que las mujeres sufren de enfermedades cardiovasculares más seguido que los hombres, inclusive es la principal causa de muerte para este grupo, superando a cualquier tipo de cáncer. Esta muestra comprueba que, aunque con poca diferencia, las mujeres suelen asistir a consultas con mayor regularidad por problemas cardiovasculares y con indicadores de variables clínicas fuera del rango adecuado.
Figura 2: Tablas de contingencia Localidad y Género (Absoluta | Total % | Fila % | Columna %)
Table <- xtabs(~Localidad_de_residencia + Género, data = datos)
tab1 <- addmargins(Table) # Frecuencias Absolutas
tab2 <- totPercents(Table) # % Totales
tab3 <- rowPercents(Table) # % Por Fila
tab4 <- colPercents(Table) # % Por Columna
# 2. TRANSFORMACIÓN
preparar <- function(tabla, con_pct = FALSE) {
df <- as.data.frame.matrix(tabla)
if(con_pct) {
df[] <- lapply(df, function(x) paste0(round(x, 1), "%"))
}
df <- cbind(Localidad = rownames(df), df)
return(df)
}
df1 <- preparar(tab1, con_pct = FALSE)
df2 <- preparar(tab2, con_pct = TRUE)
df3 <- preparar(tab3, con_pct = TRUE)
df4 <- preparar(tab4, con_pct = TRUE)
# 3. CREAR LOS OBJETOS VISUALES (REDUCIMOS TAMAÑO)
tema <- ttheme_default(base_size = 8,
padding = unit(c(1, 1), "mm"))
g1 <- tableGrob(df1, rows = NULL, theme = tema)
g2 <- tableGrob(df2, rows = NULL, theme = tema)
g3 <- tableGrob(df3, rows = NULL, theme = tema)
g4 <- tableGrob(df4, rows = NULL, theme = tema)
# 4. Dibujamos con el layout ajustado
grid.newpage()
grid.arrange(
g1, g2,
g3, g4,
ncol = 2,
nrow = 2,
top = textGrob("Análisis de Contingencia: Absoluto | Total % | Fila % | Columna %",
gp = gpar(fontsize = 10))
)
Figura 3: Diagrama de barras de pacientes por localidad, agrupados según género
ggplot(datos, aes(x = Localidad_de_residencia, fill = Género)) +
geom_bar(position = "stack") +
geom_text(stat = "count", aes(label = after_stat(count)),
position = position_stack(vjust = 0.5), size = 4) +
labs(x = "Localidad de residencia", y = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
Figura 4: Diagrama de barras apiladas al 100% de pacientes por localidad, agrupados según género
library(readxl)
library(ggplot2)
library(scales)
datos <- read_excel(ruta_datos)
ggplot(datos, aes(x = Localidad_de_residencia, fill = Género)) +
geom_bar(position = "fill") +
geom_text(stat = "count", aes(label = after_stat(paste0(round(after_stat(count) /
tapply(after_stat(count), after_stat(x), sum)[after_stat(x)] * 100, 1),
"%"))),
position = position_fill(vjust = 0.5), size = 3) +
# Formatear el eje Y para que muestre porcentajes de 0 a 100
scale_y_continuous(labels = percent_format()) +
labs(x = "Localidad de residencia",
y = "Porcentaje",
fill = "Género",
title = "Distribución Porcentual de Género por Localidad") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 10))
El Hospital Universitario San Ignacio se ubica en la localidad de Chapinero. La distribución de la población en localidad y género es una forma acertada de estudiar la variabilidad que se puede encontrar entre hombres y mujeres dependiendo de la zona. Se observa una mayor concentración de pacientes en localidades como Engativá, Tunjuelito y Teusaquillo, los cuales son cercanos a la locación del hospital. Sin embargo, pacientes que residen en localidades más lejanas como Ciudad Bolívar o San Cristóbal, no suelen concurrir al hospital muy seguido.
Tanto para las localidades lejanas como cercanas, las mujeres suelen asistir más; caso contrario en las distancias medias, donde los pacientes más frecuentes son hombres.
Figura 5: Histogramas de presión sistólica y diastólica según género
library(readxl)
library(RcmdrMisc)
datos <- read_excel(ruta_datos)
with(datos, Hist(`Tensión Sistólica (mmHg)`, groups = Género, scale = "frequency",
breaks = "Sturges", col = "lightgreen", xlab = "mmHg", ylab = "Número de pacientes",
main = "Tensión sistólica"))
with(datos, Hist(`Tensión Diastólica (mmHg)`, groups = Género,
scale = "frequency", breaks = "Sturges", col = "lightgreen", xlab = "mmHg",
ylab = "Número de pacientes", main = "Tensión diastólica"))
Tabla 2: Tensión Sistólica y Diastólica con su respectiva Moda según el género
library(readxl)
library(gridExtra)
library(grid)
DATOS <- read_excel(ruta_datos)
# Función para calcular la moda
moda <- function(x) {
names(sort(table(x), decreasing = TRUE))[1]
}
# Moda de presión sistólica y diastólica
moda_sistolica <- tapply(DATOS$`Tensión Sistólica (mmHg)`, DATOS$Género, moda)
moda_diastolica <- tapply(DATOS$`Tensión Diastólica (mmHg)`, DATOS$Género, moda)
# Tabla para mostrar resultados
tabla_moda <- data.frame(
"Variable" = c("Tensión Sistólica (mmHg)", "Tensión Diastólica (mmHg)"),
"Moda Femenino" = c(moda_sistolica["F"], moda_diastolica["F"]),
"Moda Masculino" = c(moda_sistolica["M"], moda_diastolica["M"]),
check.names = FALSE)
grid.newpage()
grid.table(tabla_moda, rows = NULL)
Tabla 3: Tensión Sistólica y Diastólica con su respectiva MAD según el género
library(readxl)
library(gridExtra)
library(grid)
DATOS <- read_excel(ruta_datos)
calcular_mad <- function(x) {
mean(abs(x - mean(x)))
}
tension_sistolica_mad <- round(tapply(DATOS$`Tensión Sistólica (mmHg)`,
DATOS$Género, calcular_mad), 2)
tension_diastolica_mad <- round(tapply(DATOS$`Tensión Diastólica (mmHg)`,
DATOS$Género, calcular_mad), 2)
# Empaquetar todo en un Data Frame (Tabla bidimensional)
tabla_resultados_mad <- data.frame(
"Variable" = c("Tensión Sistólica", "Tensión Diastólica"),
"MAD Femenino" = c(tension_sistolica_mad["F"], tension_diastolica_mad["F"]),
"MAD Masculino" = c(tension_sistolica_mad["M"], tension_diastolica_mad["M"]),
check.names = FALSE)
tema <- ttheme_default(base_size = 12)
gforma_sis <- tableGrob(tabla_resultados_mad, rows = NULL, theme = tema)
grid.newpage()
grid.arrange(gforma_sis)
La tensión sistólica adecuada debe estar dentro de 120-129 mmHg y la tensión diastólica adecuada debe estar entre 80-84 mmHg. (Pasos para bajar la tensión arterial, 2022).
Al analizar la tensión sistólica, las medidas de tendencia central y dispersión (Figuras 8 y 9) revelan una diferencia clínica importante entre géneros. La distribución gráfica en los hombres presenta un comportamiento relativamente simétrico, con un valor modal de 119 mmHg, ubicándose de manera favorable en el límite inferior del rango óptimo. Por el contrario, el histograma femenino muestra una mayor concentración de datos hacia la derecha de la gráfica, lo cual respalda su valor modal de 134 mmHg. Este indicador supera el límite superior recomendado, sugiriendo una tendencia poblacional a presentar hipertensión. A pesar de la diferencia en sus valores centrales, la heterogeneidad de los datos es casi idéntica. El análisis de la MAD indica que los pacientes de ambos géneros varían aproximadamente 10.5 mmHg de su respectivo promedio.
Respecto a la tensión diastólica, se observa un comportamiento general más estable. Las mujeres presentan un valor modal de 83 mmHg, manteniéndose en el límite superior del rango adecuado, mientras que los hombres registran una moda de 78 mmHg. A pesar de que la mayoría de la población femenina está controlada, al examinar su histograma, se evidencia la existencia de un caso atípico (>100 mmHg). Fisiológicamente coherente, la dispersión diastólica es más estrecha que la sistólica, mostrando una variabilidad absoluta parecida entre hombres y mujeres, oscilando alrededor de los 7.5 mmHg de su promedio (MAD).
El PMC se usa comúnmente como parte de un chequeo de rutina. Puede entregar información sobre su salud general y ayudar a encontrar ciertas afecciones antes de que presente síntomas. Por ejemplo, un PMC puede revisar:
Es necesario recopilar información estadística de las variables que se tuvieron en cuenta en el chequeo. Para esto hacemos uso de las Medidas de Tendencia Central, de Dispersión y de Forma:
Tablas 4, 5, 6, 7, 8, 9, 10 y 11 con las variables respecto al género, y sus respectivas MTC, desviación estándar, coeficiente de variación, coeficiente de asimetría y coeficiente de curtosis
library(readxl)
library(dplyr)
library(e1071)
library(knitr)
library(kableExtra)
datos <- read_excel(ruta_datos)
vars_mtc <- c(
"Colesterol Total (mg/dL)" = "Medidas del colesterol (mg/dL) según género",
"Glucosa (mg/dL)" = "Medidas de la glucosa (mg/dL) según género",
"HbA1c (%)" = "Medidas de hemoglobina glicosilada (porcentaje) según género",
"LDL (mg/dL)" = "Medidas del LDL (mg/dL) según género",
"Tensión Diastólica (mmHg)" = "Medidas de la Tensión Diastólica (mmHg) según género",
"Tensión Sistólica (mmHg)" = "Medidas de la Tensión Sistólica (mmHg) según género",
"Triglicéridos (mg/dL)" = "Medidas de los Triglicéridos (mg/dL) según género",
"TSH (mIU/L)" = "Medidas del TSH (mIU/L) según género"
)
genero_label <- c(F = "Femenino", M = "Masculino")
for (v in names(vars_mtc)) {
tabla_v <- datos %>%
group_by(Género) %>%
summarise(
Media = round(mean(.data[[v]], na.rm = TRUE), 2),
Mediana = round(median(.data[[v]], na.rm = TRUE), 2),
`Desv. Estandar` = round(sd(.data[[v]], na.rm = TRUE), 2),
CV = round(sd(.data[[v]], na.rm = TRUE) / mean(.data[[v]], na.rm = TRUE), 2),
Asimetria = round(skewness(.data[[v]], na.rm = TRUE, type = 2), 2),
Curtosis = round(kurtosis(.data[[v]], na.rm = TRUE, type = 2), 2),
.groups = "drop"
) %>%
mutate(Género = genero_label[Género])
print(
kable(tabla_v, caption = vars_mtc[[v]], align = "c") %>%
kable_styling(
bootstrap_options = c("bordered", "striped"),
latex_options = c("hold_position"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE) %>%
column_spec(1, bold = TRUE)
)
}
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 190.4 | 192.6 | 33.63 | 0.18 | -0.18 | 0.16 |
| Masculino | 191.1 | 195.2 | 34.00 | 0.18 | -0.03 | -0.50 |
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 89.66 | 88.6 | 16.78 | 0.19 | 0.35 | -0.58 |
| Masculino | 90.07 | 90.0 | 18.97 | 0.21 | 0.33 | -0.91 |
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 4.92 | 4.9 | 0.55 | 0.11 | 0.12 | -0.81 |
| Masculino | 4.98 | 4.9 | 0.56 | 0.11 | 0.21 | -0.95 |
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 115.09 | 115.0 | 21.26 | 0.18 | -0.24 | 0.29 |
| Masculino | 115.68 | 116.3 | 22.59 | 0.20 | -0.04 | -0.23 |
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 78.13 | 79 | 9.92 | 0.13 | 0.17 | 0.12 |
| Masculino | 79.97 | 80 | 9.30 | 0.12 | -0.10 | -0.19 |
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 125.78 | 128 | 12.39 | 0.1 | -0.36 | -0.85 |
| Masculino | 125.10 | 126 | 12.87 | 0.1 | 0.00 | -0.78 |
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 148.12 | 155.0 | 51.84 | 0.35 | 0.16 | -0.37 |
| Masculino | 147.67 | 155.5 | 49.14 | 0.33 | 0.27 | -0.25 |
| Género | Media | Mediana | Desv. Estandar | CV | Asimetria | Curtosis |
|---|---|---|---|---|---|---|
| Femenino | 2.69 | 2.58 | 1.52 | 0.57 | 2.00 | 8.34 |
| Masculino | 2.43 | 2.03 | 1.40 | 0.57 | 1.16 | 0.43 |
Aclaraciones:
La Media es ideal cuando los datos son simétricos (Asimetría entre -0.5 y 0.5) y no hay valores extremos que deformen la campana.
El CV es idóneo cuando los datos son <= 0.10; moderado cuando es 0.10 < CV <= 0.30; alto cuando 0.30 < CV <= 0.50.
La Mediana es la mejor opción cuando los datos están sesgados (Asimetría alta) o cuando hay valores atípicos severos (Curtosis alta), ya que la Mediana resiste el jalón de esos extremos.
En la gran mayoría de las variables, se muestra un comportamiento bastante cómodo a nivel estadístico, pues la Media y la Mediana resultan siendo casi que exactas (a excepción de un par de casos que se explicarán más adelante), lo que demuestra que en su mayoría, la Media resulta siendo un método de referencia óptimo y adecuado para su análisis, además de que el comportamiento de los datos se ajusta hacia la normalidad.
9.4.1 Tabla 6 (HbA1c) y Tabla 9 (Tensión Sistólica): Estas son las variables más estables de todo el estudio. Tienen un Coeficiente de Variación (CV) bajo, alrededor del 10%. Sus asimetrías están muy cerca de 0. Clínicamente, vemos un control glucémico y tensional excelente en ambos géneros, sin diferencias relevantes entre hombres y mujeres.
9.4.2 Tabla 8 (Tensión Diastólica): Muestra un comportamiento similar, con un CV de apenas 11-12%. La Media (78 F / 79 M) representa fielmente a la población general.
9.4.3 Tablas 4 (Colesterol), 5 (Glucosa) y 7 (LDL): Presentan una variabilidad moderada y esperable en la práctica clínica (CV entre 17% y 21%).
9.4.4 Alta variabilidad en tabla 10 (Triglicéridos): El CV salta a más del 33% en ambos géneros, lo que demuestra que los datos están muy dispersos (Desviación estándar de ~50 mg/dL).
Curiosamente, la Mediana (155 mg/dL en ambos) es notablemente más alta que la Media (~148 mg/dL). Además, hay una alta desviación estándar, lo que sugiere que hay una concentración fuerte de pacientes en el límite superior (155), pero también un grupo poblacional con niveles bastante bajos que jalan el promedio general hacia abajo.
Conclusión: Por la alta variabilidad y dispersión, la Mediana empieza a ser un mejor reflejo del paciente típico que la Media. No hay diferencias importantes entre hombres y mujeres.
Tabla 12: MEDA de los triglicéridos por género
library(readxl)
library(gridExtra)
library(grid)
datos <- read_excel(ruta_datos)
mad_resultado <- tapply(datos$`Triglicéridos (mg/dL)`, datos$Género, mad, na.rm = TRUE)
# Convertir el resultado a dataframe para poder graficarlo
mad_df <- data.frame(Género = names(mad_resultado),
MEDA = round(as.numeric(mad_resultado), 2))
grid.newpage()
grid.table(mad_df, rows = NULL)
9.4.5 TSH Según género:
Conclusión: A pesar de esto, en la tabla de TSH, la Media no sirve como valor de referencia poblacional. Está sesgada. Para reportar la normalidad de este grupo, hay que usar obligatoriamente la Mediana (2.58 en mujeres y 2.03 en hombres) y la MEDA como medida de dispersión para el análisis.
Tabla 13: MEDA de la TSH por género
library(readxl)
library(gridExtra)
library(grid)
datos <- read_excel(ruta_datos)
mad_resultado <- tapply(datos$`TSH (mIU/L)`, datos$Género, mad, na.rm = TRUE)
mad_df <- data.frame(Género = names(mad_resultado),
MEDA = round(as.numeric(mad_resultado), 2))
grid.newpage()
grid.table(mad_df, rows = NULL)
La MEDA confirma que el núcleo de la población femenina está perfectamente estable. Esos pocos casos con niveles disparados no afectan este indicador. La dispersión real de la población central femenina (1.32) es solo un poco mayor que la masculina (1.00).
Tabla 14: Coeficiente para la asimetría y curtosis de las variables numéricas
library(readxl)
library(moments)
library(grid)
library(gridExtra)
library(moments)
library(e1071)
datos <- read_excel(ruta_datos)
variables <- c("Edad", "Tensión Sistólica (mmHg)", "Tensión Diastólica (mmHg)",
"Estatura (cm)", "Peso (kg)", "Glucosa (mg/dL)", "HbA1c (%)",
"Colesterol Total (mg/dL)", "LDL (mg/dL)",
"Triglicéridos (mg/dL)", "TSH (mIU/L)")
tabla_estadisticas <- data.frame(Variable = character(),
Asimetria = numeric(),
Curtosis = numeric(),
stringsAsFactors = FALSE)
for (v in variables) {
asim <- round(skewness(datos[[v]], na.rm = TRUE, type = 1), 2)
curt <- round(kurtosis(datos[[v]], na.rm = TRUE, type = 1) + 3, 2)
tabla_estadisticas <- rbind(tabla_estadisticas,
data.frame(Variable = v, Asimetria = asim, Curtosis = curt))
}
grid.newpage()
grid.table(tabla_estadisticas, row=NULL)
Figura 6: Curva de densidad de las variables cuantitativas
library(readxl)
library(moments)
library(ggplot2)
library(gridExtra)
datos <- read_excel(ruta_datos)
# Variables cuantitativas
variables <- c("Edad", "Tensión Sistólica (mmHg)", "Tensión Diastólica (mmHg)",
"Estatura (cm)", "Peso (kg)", "Glucosa (mg/dL)", "HbA1c (%)",
"Colesterol Total (mg/dL)", "LDL (mg/dL)",
"Triglicéridos (mg/dL)", "TSH (mIU/L)")
# Graficar cada variable
plots <- list()
for (v in variables) {
asim <- round(skewness(datos[[v]], na.rm = TRUE), 2)
curt <- round(kurtosis(datos[[v]], na.rm = TRUE), 2)
plots[[v]] <- ggplot(datos, aes(x = .data[[v]])) +
geom_density(fill = "#698B22", alpha = 0.7) +
labs(title = v, x = NULL, y = NULL) + # Sin títulos de ejes
theme_minimal(base_size = 7) + # Texto base pequeño
theme(
plot.title = element_text(size = 6, hjust = 0.5), # Título centrado
axis.text.x = element_text(angle = 45, hjust = 1) # Números rotados
) +
scale_x_continuous(n.breaks = 4) # Pocos ticks en X
}
do.call(grid.arrange, c(plots, ncol = 3))
En este apartado entran los valores que tengan la asimetría muy cerca de 0 y la curtosis muy cerca de 3.
Análisis: Estas variables dibujan una campana casi perfecta. Los datos están muy bien distribuidos y equilibrados. La Media es la medida perfecta aquí.
Busca valores de curtosis que estén muy por debajo de 3.
Análisis: Como vimos en las gráficas, la edad no tiene un pico central. Hay pacientes de todas las edades repartidos de forma bastante uniforme, la campana se muestra en una forma aplastada.
Busca valores de curtosis muy por encima de 3 y asimetrías alejadas de 0.
Análisis: Tiene una curtosis alta (3.89, muy concentrada en el centro), pero una asimetría negativa importante (-0.65). Esto significa que la mayoría de la población tiene estaturas similares, pero hay unos cuantos pacientes con estaturas muy bajas que están jalando la cola de la gráfica hacia la izquierda.
Análisis: El 7.97 confirma numéricamente lo que vimos en la gráfica, una montaña súper delgada y puntiaguda a la izquierda (casi todos los pacientes tienen TSH normal), pero con una asimetría de 1.63 que nos dice que hay una cola larga hacia la derecha con pacientes con TSH anormalmente alta.
RANGO: 54 (Dato máximo - Dato mínimo). El paciente con menor edad dista de 54 unidades del paciente con mayor edad.
Tabla 15: Edad vs Colesterol Total y su categoría
library(readxl)
library(gridExtra)
library(grid)
datos <- read_excel(ruta_datos)
# Categorizar Edad
datos$edad_cat <- cut(datos$Edad,
breaks = c(0, 30, 45, 60, 100),
labels = c("18-30", "31-45", "46-60", "61+"))
# Categorizar Colesterol
datos$colesterol_cat <- cut(datos$`Colesterol Total (mg/dL)`,
breaks = c(0, 200, 239, 500),
labels = c("Deseable", "Límite", "Alto"))
# Tabla de contingencia
tabla <- table(datos$edad_cat, datos$colesterol_cat)
tabla_con_margenes <- addmargins(tabla)
# Mostrar en Plots con leyendas
grid.newpage()
grid.text("Tabla de Contingencia: Edad vs Colesterol Total",
x = 0.5, y = 0.95,
gp = gpar(fontsize = 13, fontface = "bold"))
grid.text("Edad (años)",
x = 0.08, y = 0.5,
gp = gpar(fontsize = 10, fontface = "bold"), rot = 90)
grid.text("Colesterol Total (mg/dL)",
x = 0.5, y = 0.08,
gp = gpar(fontsize = 10, fontface = "bold"))
pushViewport(viewport(x = 0.5, y = 0.5, width = 0.8, height = 0.75))
grid.table(tabla_con_margenes, rows = rownames(tabla_con_margenes))
Tabla 16: Edad vs LDL y su categoría
library(readxl)
library(gridExtra)
library(grid)
DATOS <- read_excel(ruta_datos)
# Categorizar Edad
DATOS$edad_cat <- cut(DATOS$Edad,
breaks = c(0, 30, 45, 60, 100),
labels = c("18-30", "31-45", "46-60", "61+"))
# Categorizar LDL
DATOS$LDL_cat <- cut(DATOS$`LDL (mg/dL)`,
breaks = c(0, 100, 129, 159, 189, 500),
labels = c("Óptimo", "Casi óptimo", "Límite alto", "Alto", "Muy alto"))
# Tabla de contingencia
tabla <- table(DATOS$edad_cat, DATOS$LDL_cat)
tabla_con_margenes <- addmargins(tabla)
# Mostrar en Plots con leyendas
grid.newpage()
grid.text("Tabla de Contingencia: Edad vs LDL",
x = 0.5, y = 0.95,
gp = gpar(fontsize = 13, fontface = "bold"))
grid.text("Edad (años)",
x = 0.08, y = 0.5,
gp = gpar(fontsize = 10, fontface = "bold"), rot = 90)
grid.text("Colesterol Total (mg/dL)",
x = 0.5, y = 0.08,
gp = gpar(fontsize = 10, fontface = "bold"))
pushViewport(viewport(x = 0.5, y = 0.5, width = 0.8, height = 0.75))
grid.table(tabla_con_margenes, rows = rownames(tabla_con_margenes))
library(readxl)
library(gridExtra)
library(grid)
datos <- read_excel(ruta_datos)
datos$edad_cat <- cut(datos$Edad,
breaks = c(0, 30, 45, 60, 100),
labels = c("18-30", "31-45", "46-60", "61+"))
datos$LDL_cat <- cut(datos$`LDL (mg/dL)`,
breaks = c(0, 100, 129, 159, 189, 500),
labels = c("Óptimo", "Casi óptimo", "Límite alto", "Alto", "Muy alto"))
tabla <- addmargins(table(datos$edad_cat, datos$LDL_cat))
grid.newpage()
grid.table(tabla)
print(tabla)
Figura 7: Distribución del colesterol total (mg/dL) en el registro de pacientes
library(readxl)
datos <- read_excel(ruta_datos)
# Categorizar Edad según OMS
datos$edad_cat <- cut(datos$Edad,
breaks = c(0, 30, 45, 60, 100),
labels = c("18-30", "31-45", "46-60", "61+"))
boxplot(datos$`Colesterol Total (mg/dL)` ~ datos$edad_cat,
col = c("#FF0000", "#FF7F00", "#FFFF00", "#7F00FF"),
ylab = "Colesterol Total (mg/dL)",
xlab = "Grupo de Edad (años)",
main = "Diagrama de caja de Colesterol por Grupo de Edad")
stripchart(datos$`Colesterol Total (mg/dL)` ~ datos$edad_cat,
method = "jitter",
pch = 19,
add = TRUE,
col = "black",
vertical = TRUE)
library(readxl)
datos <- read_excel(ruta_datos)
datos$edad_cat <- cut(datos$Edad,
breaks = c(0, 30, 45, 60, 100),
labels = c("18-30", "31-45", "46-60", "61+"))
boxplot(datos$`Glucosa (mg/dL)` ~ datos$edad_cat,
col = c("#2ECC71", "#F39C12", "#E74C3C", "#193A8C"),
ylab = "Glucosa (mg/dL)",
xlab = "Grupo de Edad (años)",
main = "Diagrama de caja de Glucosa por Grupo de Edad")
stripchart(datos$`Glucosa (mg/dL)` ~ datos$edad_cat,
method = "jitter",
pch = 19,
add = TRUE,
col = "black",
vertical = TRUE)
El análisis clínico revela un perfil consistentemente favorable a lo largo de todas las etapas vitales, con la inmensa mayoría de la población (94 de 132 pacientes) concentrada en niveles de LDL “óptimo” o “casi óptimo”. Resulta clínicamente llamativo que el envejecimiento no parece estar asociado a un deterioro de este marcador de riesgo cardiovascular; por el contrario, los únicos dos casos clasificados con LDL y de colesterol “alto” se registran paradójicamente en los grupos más jóvenes (menores de 45 años), mientras que los pacientes mayores de 46 y 61 años mantienen un control estricto sin reportar ningún valor de alto riesgo. Esto sugiere un excelente manejo metabólico o preventivo generalizado en la muestra, evidenciando que, para esta muestra en particular, la edad avanzada no significa un descontrol lipídico severo.
Sin embargo, es importante recalcar que existe una mayor densidad poblacional dentro de este rango de 18 a 45 años, por lo que los datos se pueden ver sesgados a contar con 23 personas más, por lo que puede aumentar la incertidumbre y el error estándar en el grupo más pequeño.
Figura 8: Diagrama de tallos y hojas. Representa la distribución decimal de la TSH (mIU/L) en el registro de los pacientes
library(readxl)
library(aplpack)
library(gplots)
DATOS <- read_excel(ruta_datos)
res_tallo <- capture.output(with(DATOS, stem.leaf(`TSH (mIU/L)`, na.rm = TRUE)))
texto_final <- paste(res_tallo, collapse = "\n")
textplot(texto_final, halign = "left", valign = "top", cex = 0.9, family = "mono")
Media Aritmética: 2.57 Media recortada al 10%: 2.39
Los niveles de TSH adecuados rondan desde el 0.4 y el 4.0. (Prueba de TSH: Prueba de laboratorio de MedlinePlus, 2024).
La mayoría de la población de esta muestra ronda dentro de los niveles óptimos y el diagrama de tallos y hojas logra reflejar los resultados de manera sencilla y concisa, pero es importante recalcar un dato atípico de 10.38, donde muy probablemente este paciente cuenta con problemas de tiroides sumamente graves. Este dato, junto con los que rondan el 5, hacen que la Media crezca; sin embargo podemos observar que este es un dato atípico pero no un dato influyente, ya que al recortar la Media al 10% donde entra este dato, podemos observar que la diferencia de las medias no es significativa.
Figura 9: Histograma de distribución del IMC de los pacientes según categorías y Produccion del numero índice
library(readxl)
library(ggplot2)
library(dplyr)
library(gridExtra)
library(grid) # Necesario para limpiar la pantalla entre gráficas
# 1. Cargar datos (recuerda poner tu ruta_datos real)
datos <- read_excel(ruta_datos)
# 2. Calcular IMC
datos$IMC <- datos$`Peso (kg)` / (datos$`Estatura (cm)` / 100)^2
# 3. Cortes de la OMS
datos$IMC_cat <- cut(datos$IMC,
breaks = c(0, 18.5, 24.9, 29.9, 100),
labels = c("Bajo peso", "Normal", "Sobrepeso", "Obesidad"))
# 4. Guardar el histograma
grafico_imc <- ggplot(datos, aes(x = IMC, fill = IMC_cat)) +
geom_histogram(color = "black", bins = 20) +
scale_fill_manual(values = c("Bajo peso" = "#8B8B00",
"Normal" = "#008B45",
"Sobrepeso" = "#F39C12",
"Obesidad" = "#FF0000")) +
geom_vline(xintercept = c(18.5, 24.9, 29.9),
linetype = "dashed", color = "black", linewidth = 0.3) +
labs(title = "Distribución del IMC",
subtitle = "Clasificación según OMS",
x = "IMC (kg/m²)",
y = "Frecuencia",
fill = "Categoría IMC",
caption = "Líneas punteadas: límites de cada categoría") +
theme_minimal() +
theme(plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 10),
legend.position = "top")
print(grafico_imc)
Nota de fuente para esta figura: Grundy, S. M., Stone, N. J., Bailey, A. L., et al. (2019). 2018 AHA/ACC/AACVPR/AAPA/ABC/ACPM/ADA/AGS/APhA/ASPC/NLA/PCNA guideline on the management of blood cholesterol. Circulation, 139, e1082–e1143. https://doi.org/10.1161/CIR.0000000000000625
Este histograma nos demuestra que el IMC de la mayoría de los pacientes se encuentra en estados óptimos al categorizarse como normal o con sobrepeso moderado. Aún así encontramos casos de pacientes que están sufriendo de desnutrición y de obesidad, donde ambos grupos cuentan con la misma cantidad de personas.
Los números índices son medidas estadísticas que sirven para comparar una magnitud o variable en diferentes momentos del tiempo o lugares. Se dividen principalmente en índices simples (una sola variable) e índices complejos (varias variables juntas), ayudando a entender cambios económicos como la inflación o el costo de vida.
Tipos de números índices - Simples: Miden el cambio de una sola variable (como el precio de un solo producto como la leche o el trigo) frente a un periodo base.
Complejos sin ponderar: Agrupan varios bienes o productos dándoles a todos la misma importancia o peso en el cálculo.
Complejos ponderados: Combinan varios elementos asignando a cada uno un peso o importancia distinta, como el Índice de Precios al Consumidor (IPC) que usa fórmulas famosas como las de Laspeyres o Paasche.
Elementos clave y prioridades:
Periodo base (0): El momento o año inicial que se usa como punto de referencia para hacer la comparación.
Periodo actual (t): El momento o año más reciente que se quiere evaluar frente a la base.
Identidad: Si el periodo base y el actual son el mismo, el valor del índice siempre debe ser 1 (o 100 si se mide en porcentaje).
Sin unidades: Al ser cocientes o proporciones, no dependen de las unidades de medida (no son kilos, ni dólares, sino un número puro).
1. Índices simples
Miden la variación de un único producto entre el periodo base (\(0\)) y el periodo actual (\(t\)).Í -Índice de precio simple \[I_p = \frac{P_t}{P_0} \times 100\] -Índice de cantidad simple: \[I_q = \frac{q_t}{q_0} \times 100\] 2. Índices complejos Ponderados
Se usan para varios productos a la vez, asignando a cada uno una ponderación (importancia) según la cantidad consumida.
-Índice de LaspeyresUsa las cantidades del periodo base (\(q_{0}\)) como ponderación fija. Tiende a sobreestimar la inflación. \[I_L = \frac{\sum_{i=1}^{n} p_{it} q_{i0}}{\sum_{i=1}^{n} p_{i0} q_{i0}} \times 100 \]
-Índice de Paasche : Usa las cantidades del periodo actual (\(q_{t}\)) como ponderación. Tiende a subestimar la inflación porque requiere actualizar los datos de consumo constantemente. \[I_P = \frac{\sum_{i=1}^{n} p_{it} q_{it}}{\sum_{i=1}^{n} p_{i0} q_{it}} \times 100\]
-Índice de Fisher: Es el “índice ideal”. Calcula la media geométrica de los dos índices anteriores para corregir sus sesgos. \[I_F = \sqrt{I_L \times I_P}\] 3.Índices complejos sin ponderar:
Tratan a todos los productos por igual, sin importar si se consumen mucho o poco (son menos precisos).
Media aritmética simple (Índice de Sauerbeck): \[I = \frac{1}{n} \sum_{i=1}^{n} \left( \frac{p_{it}}{p_{i0}} \right) \times 100\] (Donde \(n\) es el número total de productos estudiados).
Agregativo simple (Índice de Bradstreet-Dûtot): \[I = \frac{\sum_{i=1}^{n} p_{it}}{\sum_{i=1}^{n} p_{i0}} \times 100\]
library(readxl)
library(ggplot2)
library(dplyr)
library(gridExtra)
library(grid)
datos <- read_excel(ruta_datos)
datos$IMC <- datos$`Peso (kg)` / (datos$`Estatura (cm)` / 100)^2
# 1. Cortes de la OMS
datos$IMC_cat <- cut(datos$IMC,
breaks = c(0, 18.5, 24.9, 29.9, 100),
labels = c("Bajo peso", "Normal", "Sobrepeso", "Obesidad"))
# 2. Definir la base ideal de la OMS (IMC = 22)
imc_ideal <- 22
# 3. Armar la tabla de números índices con formato limpio
tabla_indices <- datos %>%
filter(!is.na(IMC_cat)) %>%
group_by(`Categoría OMS` = IMC_cat) %>%
summarise(
Pacientes = n(),
`Promedio IMC` = round(mean(IMC, na.rm = TRUE), 1),
`Relacion Al IMC Ideal (100%)` = round((mean(IMC, na.rm = TRUE) / imc_ideal) * 100, 1)
) %>%
mutate(
Interpretación = paste0(
ifelse(`Relacion Al IMC Ideal (100%)` > 100, "+", ""),
round(`Relacion Al IMC Ideal (100%)` - 100, 1), "% vs ideal"
),
# Agregar el símbolo de % a la columna del índice
`Relacion Al IMC Ideal (100%)` = paste0(`Relacion Al IMC Ideal (100%)`, "%")
)
grid.newpage()
grid.table(tabla_indices, row=NULL)
También se desarrolló la producción de un número índice en relación a los grupos.Para dicho indice se decidió usar el IMC 22 como referencia, ya que presenta una relación ideal con el estado de masa corporal. Siendo su formula matematica esta:
\[I_g = \frac{\bar{X}_g}{X_{base}} \times 100\] \[{X_{base}}= 22Kg/m^2\] En este tipo de muestras pequeñas, hay una variabilidad alta, donde uno de los mayores inconvenientes sigue siendo el exceso de peso como muestra la tabla (+47.4%).
Este factor es uno de los más importantes al momento de evaluar problemas cardiovasculares, pues el exceso de grasa corporal junto con los malos hábitos empeoran indicadores como la tensión arterial, los triglicéridos y el colesterol.
En Colombia, este es un problema de salud pública, pues según datos de la Encuesta Nacional de Situación Nutricional (ENSIN) de 2015, el 56.4% de los colombianos tenía exceso de peso y el 18.7% presentaba obesidad. Según la Organización Mundial de la Salud (OMS), las comidas ultra procesadas y las bebidas azucaradas son desencadenantes de obesidad en Latinoamérica. (Camargo, 2025)
El índice muestra una relación creciente y proporcional.
El grupo normal es el mas cercano a la base, mientras que la obesidad presenta mayor desviacion a este. Esto confirma que la clasificación refleja el comportamiento real del IMC de la muestra, y en la práctica ayuda a determinar la gravedad que presentan los grupos. En este caso el grupo con obesidad se encuentra casi un 50% por encima del ideal. Esti demuestra la necesidad de prestar vital atención a estos pacientes y hacerles un seguimiento especial de las razones por las cuales su IMC se encuentra tan elevado.
library(readxl)
datos <- read_excel(ruta_datos)
base_numérica<-datos[sapply(datos, is.numeric)]
Figura 10: Matriz de covarianza
datos <- read_excel(ruta_datos)
covarianza<-round(cov(base_numérica),2)
corrplot(covarianza,
method = "color",
is.corr = FALSE,#especifica que no es una matriz de corr
addCoef.col = "brown",
number.cex = 1,
main= "Matriz de covarianza",
tl.cex = 0.9,
tl.col = "black",
tl.srt = 45,
mar = c(0, 0, 2, 0))
La matriz de covarianza permite resumir de manera concisa la relación entre las variables analizadas. Si bien ofrece una visión general del comportamiento conjunto, presenta una limitación importante: informa sobre la dirección de la relación, pero no sobre su intensidad, ya que depende de la escala de medición de cada variable. Un valor positivo indica una relación directamente proporcional, un valor negativo denota una relación inversamente proporcional, y un valor cercano a cero sugiere independencia entre variables.
Al analizar los datos, destaca que, a mayor edad, la frecuencia de indicadores clínicos como glucosa, colesterol total, LDL, triglicéridos y TSH tiende a disminuir; un comportamiento opuesto al observado en la tensión arterial (sistólica y diastólica).
Una tendencia similar se aprecia en la glucosa, la cual presenta una relación inversa con variables como la edad, el peso y la tensión arterial.Por su parte, el colesterol total muestra una relación inversa con la tensión arterial, el peso, los triglicéridos y la estatura, mientras que mantiene una relación directa con el LDL y la glucosa, lo cual resulta clínicamente coherente: El colesterol total es la cantidad combinada de todo el colesterol en la sangre, donde el LDL (colesterol “malo”) constituye la mayor parte. Dado que el LDL representa cerca del 60% a 70% del total, un nivel elevado de este impacta directamente aumentando el colesterol total (Mediline Plus,2026).
En términos generales, esta matriz facilita la identificación preliminar de cómo la varianza de un marcador afecta al resto del perfil clínico.
Figura 11: Matriz de correlación de Pearson
#Matriz de correlación de Pearson
datos <- read_excel(ruta_datos)
correlación<-round(cor(base_numérica),2)
corrplot(correlación,
method = "color",
addCoef.col = "brown",
number.cex = 0.9,
main = "Matriz de correlación (Método Pearson)",
tl.col = "black",
tl.cex = 0.9,
tl.srt = 45,
mar = c(0, 0, 2, 0))
La matriz de correlación de Pearson complementa el análisis anterior al estandarizar las relaciones, permitiendo medir la intensidad de la relación mediante un coeficiente que varía entre -1 y 1. De forma análoga a la covarianza, un valor positivo denota una correlación directa y uno negativo una inversa, siendo el 0 un indicador de independencia.
Es fundamental resaltar la ausencia de correlaciones inversas fuertes entre las variables estudiadas; el valor más bajo registrado es de -0.19 (entre LDL y tensión diastólica). Esto indica que, aunque ciertas variables presentan asociaciones negativas, estas no poseen la intensidad suficiente para representar una tendencia clínica de especial relevancia.
Por el contrario, se identifican correlaciones positivas elevadas, tales como la de 0.86 entre glucosa y HbA1c, y de 0.94 entre colesterol total y LDL. Estos resultados son clínicamente esperados: una mayor glucemia se asocia con un aumento en la hemoglobina glicosilada (reflejando un control glucémico deficiente a largo plazo), y un mayor nivel de LDL eleva inevitablemente el colesterol total.
Este último caso refuerza la importancia de analizar ambas matrices de manera conjunta. Por ejemplo, mientras que la covarianza entre colesterol y triglicéridos arroja un valor de -125.17, que erróneamente podría sugerir una relación inversa fuerte, la correlación de Pearson revela un valor de -0.07, confirmando que la asociación es prácticamente nula.
Finalmente, resulta notable la existencia de coeficientes de correlación cercanos a 0 en la mayoría de las variables, destacando el caso de la TSH, la cual muestra una independencia casi total frente al resto de los marcadores, presentando incluso una correlación de 0.00 respecto a la edad. Este hallazgo resulta inesperado en esta muestra desde una perspectiva clínica, dado que la literatura endocrinológica sostiene que “los niveles de TSH tienden a aumentar de manera gradual y progresiva conforme avanza la edad” (National Library of Medicine, 2023).
Figura 12: Matriz de correlación de Kendall
#Matriz de Kendall
kendall <- round(cor(base_numérica, method = "kendall"),2)
corrplot(kendall,
method = "color",
addCoef.col = "brown",
number.cex = 0.8,
tl.col = "black",
tl.srt = 45,
tl.cex = 0.9,
main = "Matriz de correlación (Método Kendall)",
mar = c(0, 0, 2, 0)) # Ajusta márgenes para que el título no se corte
La comparación de la matriz de correlación de Pearson con la de Kendall, revela una consistencia estructural entre asociaciones como la de la Glucosa-HbA1c (0.86/0.68) y Colesterol Total-LDL (0.94/0.79). La persistencia de estos coeficientes en ambos métodos, revela que estas relaciones son tanto lineales como monótonas, validando su soporte biológico. No obstante, se observa una disminución de los coeficientes de Kendall con respecto a los de Pearson en otras variables. Este comportamiento es esperado en asociaciones como la de la presión arterial con la edad, que exhiben un comportamiento completamente no lineal y que son susceptibles a la variabilidad individual.
Mientras que Pearson muestra la tendencia del comportamiento, en promedio, de las relaciones de las variables, Kendall confirma que el tipo de relación es real, es decir, que ambas aumentan de manera progresiva sin ser estrictamente de una manera geométrica lineal.
Esta comparativa demuestra la robustez de las conclusiones. Las asociaciones más críticas no dependen del método estadístico utilizado, lo que demuestra que los resultados son verdaderos y genuinos, y que no dependen de una simple distribución de datos.
Figura 13: Matriz de correlación de Spearman
library(readxl)
library(corrplot)
library(Hmisc)
base <- read_excel(ruta_datos)
X <- base[, c("Tensión Sistólica (mmHg)","Tensión Diastólica (mmHg)",
"Glucosa (mg/dL)","HbA1c (%)","Colesterol Total (mg/dL)",
"LDL (mg/dL)","Triglicéridos (mg/dL)","TSH (mIU/L)")]
colnames(X) <- c("Sistólica","Diastólica","Glucosa","HbA1c",
"Colesterol","LDL","Triglicéridos","TSH")
X <- as.data.frame(X)
sp <- rcorr(as.matrix(X), type = "spearman")
# Arregla la diagonal de la matriz de p-valores
p_mat <- sp$P
diag(p_mat) <- 0
corrplot(sp$r, method = "color", type = "upper",
addCoef.col = "black", p.mat = p_mat, sig.level = 0.05, insig = "pch",
number.cex = 0.9,
tl.col = "black",
tl.srt = 45,
tl.cex = 0.9,
title = "Matriz de correlación (Método Spearman)",
mar = c(0,0,2,0))
Las correlaciones significativas halladas en las relaciones monótona de
spearman son: Glucosa-HbA1c. (0.85) Colesterol-LDL. (0.94)
Sistólica-Diastólica (0.41) Estas relaciones son consistentes con
relaciones fisiológicas, dadas en la literatura clínica, validando la
coherencia de la base de datos. En contraste la ausencia de correlación
estadísticamente significativa entre TSH y el resto de la variable
sugiere una independencia relativa respecto al perfil metabólico y
cardiovascular, lo cual podría deberse a una independencia fisiológica
genuina como a limitaciones de la estadística debido al tamaño
muestral.
Figura 14: Matriz de diagramas de dispersión
#Matriz de diagramas
panel.hist <- function(x, ...)
{
usr <- par("usr")
par(usr = c(usr[1:2], 0, 1.5) )
h <- hist(x, plot = FALSE)
breaks <- h$breaks; nB <- length(breaks)
y <- h$counts; y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col ="#72C9ED")
}
pairs(base_numérica,
pch = 16,
diag.panel = panel.hist,
cex.labels = 1,
cex.main = 1.5,
cex.axis =1.5,
main = "Matriz de Dispersión - Datos Clínicos")
Esta matriz trabaja de manera conjunta con la matriz de covarianza y la de Pearson. Es la vista de forma gráfica de todas las relaciones y ayuda a reafirmar las conclusiones anteriormente hechas. Se observa la existencia de una relación casi lineal entre Colesterol Total y LDL (la línea de puntos es creciente y casi perfecta). Una demostración acorde a su valor de correlación de 0.94. Pasa de forma similar con el diagrama de correlación entre el HbA1c y la Glucosa. Por otro lado, variables como Edad vs. TSH muestran una nube de puntos dispersa, indicando que no hay una relación lineal clara, acorde a su coeficiente de 0.00 de correlación.
Esta matriz permite identificar de manera directa qué variables merecen el estudio con un modelo de regresión lineal y cuales son independientes. Además el uso de los histogramas permite brindar mayor información dentro de la matriz, dando a conocer la frecuencia con la que se distribuyen los pacientes en los intervalos correspondientes a cada variable.
Figura 15: Gráfico 3D Relación de síndrome metabólico
#Gráfico 1
scatterplot3d(x = datos$`Peso (kg)`,
y = datos$`Triglicéridos (mg/dL)`,
z = datos$`Glucosa (mg/dL)`,
xlab = "Peso (kg)",
ylab = "Triglicéridos (mg/dL)",
zlab = "Glucosa (mg/dL)",
main = "Relación de Síndrome Metabólico",
highlight.3d = TRUE,
angle = 55,
scale.y = 0.7,
pch = 16)
Al observar la gráfica, se aprecia una dispersión de puntos que no sigue una trayectoria lineal ascendente clara en el espacio tridimensional. Aunque hay individuos con valores altos en los tres ejes, existen muchos casos de pacientes con un peso elevado que mantienen niveles controlados de glucosa y triglicéridos, y viceversa. La ausencia de una agrupación compacta en el gráfico sugiere que, en esta muestra poblacional, la obesidad por sí sola no predice de forma inmediata el descontrol glucémico y lipídico. Esto indica que existen otros factores (genéticos, dieta, actividad física) que actúan como variables mediadoras, impidiendo que el síndrome metabólico se manifieste de forma uniforme en todos los pacientes con sobrepeso.
Figura 16: Gráfico 3D Perfil lipídico
#Gráfico 2
scatterplot3d(x= datos$`Tensión Sistólica (mmHg)`,
y= datos$`LDL (mg/dL)`,
z= datos$`Colesterol Total (mg/dL)`,
xlab = "Tensión Sistólica (mmHg)",
ylab = "LDL (mg/dL)",
zlab = "Colesterol Total (mg/dL)",
main = "Perfil lipídico",
highlight.3d = TRUE,
angle = 55,
scale.y = 0.7,
pch= 16)
A diferencia del gráfico anterior, aquí los puntos muestran una distribución espacial que, si bien es dispersa, mantiene una estructura más alineada.
Figura 17: Gráfico de dispersión del Colesterol Total v.s LDL
plot(DATOS$`Colesterol Total (mg/dL)`, DATOS$`LDL (mg/dL)`, xlab="Colesterol total (mg/dL)", ylab="LDL (mg/dL)")
Figura 18: Gráfico de dispersión del Colesterol Total v.s Tensión sistólica
plot(DATOS$`Colesterol Total (mg/dL)`,DATOS$`Tensión Sistólica (mmHg)`, xlab="Colesterol Total (mg/dL)", ylab = "Tensión sistólica (mmHg)")
Se puede visualizar cómo, conforme el LDL aumenta (eje Y), el colesterol total (eje Z) también incrementa su valor de manera proporcional, independientemente de la tensión sistólica (eje X). Interpretación clínica: Este gráfico confirma la fuerte dependencia cuantitativa entre el LDL y el colesterol total, validando la lógica biológica. Sin embargo, la tensión sistólica se comporta de manera relativamente independiente a estos niveles de colesterol en este grupo. Esto sugiere que la hipertensión en estos pacientes podría estar originada por causas distintas al perfil lipídico, o bien, que el rango de tensión arterial observado es independiente de la carga de colesterol LDL en esta población específica.
# CLASIFICACIÓN DE PACIENTES: DISTANCIA EUCLIDIANA Y PENALIDAD
# PREPARACIÓN:
# Extraemos las variables que la OMS pide en la tabla.
variables_oms <- c("Tensión Sistólica (mmHg)", "Tensión Diastólica (mmHg)",
"Glucosa (mg/dL)", "HbA1c (%)", "Colesterol Total (mg/dL)",
"LDL (mg/dL)", "Triglicéridos (mg/dL)", "TSH (mIU/L)")
# Creamos un subconjunto solo con estas 8 variables
base_oms <- datos[ , variables_oms]
Determinacion de los sujetos ideales según la OMS
Tabla 17: Crierios de salubridad según la OMS
library(gridExtra)
library(grid)
# Crear la tabla
tabla <- data.frame(
Variables = c(
"Tensión Sistólica",
"Tensión Diastólica",
"Glucosa",
"HbA1c",
"Colesterol Total",
"LDL",
"Triglicéridos",
"TSH"
),
`Valor objetivo` = c(
"110 mmHg",
"70 mmHg",
"85 mg/dL",
"4.5 %",
"175 mg/dL",
"100 mg/dL",
"110 mg/dL",
"2.0 mIU/L"
),
`Rango óptimo` = c(
"< 120",
"< 80",
"70-100",
"< 5.7 %",
"< 200",
"< 130",
"< 150",
"0.4 - 4.0"
),
check.names = FALSE
)
# Estilo de la tabla
tema <- ttheme_minimal(
core = list(
fg_params = list(fontsize = 11),
bg_params = list(fill = "white", col = "black")
),
colhead = list(
fg_params = list(fontface = "bold", fontsize = 11),
bg_params = list(fill = "grey85", col = "black")
)
)
# Dibujar la tabla
grid.newpage()
grid.draw(tableGrob(tabla, rows = NULL, theme = tema))
1.1 Criterio 1
La distancia de Euclides estandarizada (normalizar variabilidad ). Cuantificación de la lejanía que se encuentra cada individuo respecto a nuestro sujeto ideal.
Para ello se calcula la distancia euclidiana estandarizada por su desviación estándar, para que las variables contribuyan de manera proporcional e independiente de sus unidades o escalas de medida, valores más altos expresan mayor separación del sujeto ideal. \[d(x,r) = \sqrt{\sum_{i=1}^{n} \left[\frac{x_i - r_i}{\sigma_i}\right]^2}\]
# CRITERIO 1: Distancia de Euclides estandarizada
# 1. Vector con los valores objetivo exactos de la tabla
valores_objetivo <- c(110, 70, 85, 4.5, 175, 100, 110, 2.0)
# 2. Calculamos la desviación estándar (sigma) de cada variable
desviaciones <- apply(base_oms, 2, sd)
# 3. Calculamos la fórmula
matriz_estandarizada <- scale(base_oms, center = valores_objetivo, scale = desviaciones)
distancia_euclidiana <- sqrt(rowSums(matriz_estandarizada^2))
1.2 Criterio 2
Este criterio se basa en asignar una penalidad de valor de 1 por cada factor que se encuentre fuera del rango óptimo. Pero al HbA1c se le asigna una penalidad de valor de 2, es el único marcador con capacidad diagnóstica autónoma según criterios ADA.
# CRITERIO 2: Penalidad Clínica (Sumar +1 o +2 si están fuera de rango)
penalidad <-
(base_oms$`Tensión Sistólica (mmHg)` >= 120) * 1 +
(base_oms$`Tensión Diastólica (mmHg)` >= 80) * 1 +
(base_oms$`Glucosa (mg/dL)` < 70 | base_oms$`Glucosa (mg/dL)` > 100) * 1 +
(base_oms$`HbA1c (%)` >= 5.7) * 2 + # NOTA: Este multiplica por 2 según el criterio
(base_oms$`Colesterol Total (mg/dL)` >= 200) * 1 +
(base_oms$`LDL (mg/dL)` >= 130) * 1 +
(base_oms$`Triglicéridos (mg/dL)` >= 150) * 1 +
(base_oms$`TSH (mIU/L)` < 0.4 | base_oms$`TSH (mIU/L)` > 4.0) * 1
1.3 Criterio 3
Se une en un mismo puntaje la distancia euclidiana y la penalidad clínica, a este último se le asignó mayor ponderación debido a que el factor de riesgo en la salud de los pacientes es más significativo que la distancia geométrica. \[puntaje_{concatenado} = 0.4 \cdot d_{euclidiana} + 0.6 \cdot penalidad_{clínica}\]
# CRITERIO 3: Concatenar Puntajes
puntaje_concatenado <- (0.4 * distancia_euclidiana) + (0.6 * penalidad)
1.4 Criterio 4
Se implementa un sistema de estratificación con amplitud constante K = 1.5 partiendo desde el origen, esto para establecer tres grupos de riesgo; bajo control | alteración inconsistente (0 - 1.5], moderado | tratamiento prioritario (1.5- 3.0) y alto | atención inmediata(3.0>).
# CRITERIO 4: Estratificación
grupo_riesgo <- cut(puntaje_concatenado,
breaks = c(-Inf, 1.5, 3.0, Inf),
labels = c("Bajo control", "Moderado", "Atención inmediata"),
right = FALSE)
1.5 Resultado final
# Pegamos esta nueva columna "Grupo_Riesgo" a nuestra base de datos original
datos_clasificados <- cbind(datos, Grupo_Riesgo = grupo_riesgo)
# PASO 1: Preparar los datos
datos_para_caras <- cbind(base_oms, Grupo_Riesgo = datos_clasificados$Grupo_Riesgo)
# PASO 2: Calcular promedios por grupo
promedios_reales <- aggregate(. ~ Grupo_Riesgo, data = datos_para_caras, FUN = mean)
# PASO 3: Dar formato de matriz para las caras
row.names(promedios_reales) <- promedios_reales$Grupo_Riesgo
promedios_reales <- promedios_reales[ , -1]
Figura 19: Caras de Chernoff según tipo necesario de atención
par(cex.main = 1.5)
faces(promedios_reales,
main = "Rostros de Chernoff por Nivel de Riesgo",
face.type = 1,
print.info = FALSE)
legend("bottomright",
inset=c(0.05,0.15),
legend = c(
"Altura de la cara: Tensión Sistólica",
"Anchura de la cara: Tensión Diastólica",
"Estructura de la cara: Glucosa",
"Altura de la boca: HbA1c",
"Anchura de la boca: Colesterol Total",
"Sonrisa: LDL",
"Altura de los ojos: Triglicéridos",
"Anchura de los ojos: TSH"
),
title = "Convenciones del Rostro:",
cex = 0.9,
text.col = "black")
Las Caras de Chernoff son una técnica de reducción de dimensionalidad para humanos.
2.1 Bajo Control (El perfil saludable) La cara es pequeña y compacta. En términos clínicos, esto refleja valores estables y cercanos a los objetivos óptimos de la OMS. Al ser un rostro pequeño (tensión sistólica/diastólica controlada) y con una expresión contenida, visualiza a un paciente sin alteraciones metabólicas significativas. Es la referencia de equilibrio clínico.
2.2 Moderado (El perfil de alerta) La cara aumenta significativamente de volumen y la estructura se ensancha. Observamos rasgos más pronunciados que en el grupo anterior. El crecimiento del rostro evidencia una elevación en los marcadores de tensión arterial y una mayor carga metabólica (glucosa). Este paciente ya no es “pequeño” o “compacto” como el perfil saludable; el aumento en las proporciones faciales alerta sobre una transición hacia un estado de riesgo que, aunque no es crítico, requiere vigilancia activa.
2.3 Atención Inmediata (El perfil de riesgo crítico) Es la cara con mayor tamaño, con una sonrisa prominente y ojos muy abiertos. Sonrisa (LDL): En Chernoff, la curvatura de la boca suele representar el LDL. Una sonrisa amplia indica niveles de colesterol LDL muy por encima de lo saludable. Ojos (Triglicéridos/TSH): La prominencia en la mirada refleja la elevación marcada en triglicéridos. Volumen total: La expansión de toda la estructura facial (tensión arterial + glucosa + HbA1c) comunica una “saturación” de variables clínicas. Visualmente, esta cara transmite una “sobrecarga” de rasgos. Es un rostro que muestra descompensación metabólica. La diferencia visual respecto a los otros dos grupos es tan drástica que confirma que la estratificación realizada mediante la distancia euclidiana fue efectiva, este grupo es cualitativamente distinto a los demás.
La estratificación realizada mediante la distancia euclidiana y la penalidad clínica no fue un proceso puramente matemático. Los rostros de Chernoff validan que los grupos obtenidos poseen identidades clínicas coherentes. Mientras que el grupo de “Bajo Control” presenta una morfología que transmite estabilidad, el grupo de “Atención Inmediata” transmite una desconfiguración facial proporcional a su descompensación metabólica. Esta visualización facilita una toma de decisiones más rápida para el personal de salud al reconocer patrones de riesgo de forma inmediata.
ACLARACIÓN IMPORTANTE: Para la generación de los rostros de Chernoff se utilizó la librería ‘aplpack’ en el software R. Dicho algoritmo parametriza 15 rasgos faciales distintos. Dado que el presente modelo de estratificación cuenta con 8 variables metabólicas principales, las facciones correspondientes a la estructura general, boca y ojos representan la asignación primaria de los datos. Por diseño del algoritmo, los rasgos secundarios como cabello, nariz y orejas, actúan como una representación visual redundante de las primeras 7 métricas evaluadas (Tensión Sistólica hasta Triglicéridos), reforzando así la diferenciación visual global entre los tres grupos de riesgo.
Debido a la naturaleza de las variables categóricas de escala nominal Género y Localidad de Residencia, se decidió usar dos medidas de similaridad: Sokal & Michener(1958): Con propósito de cuantificar que tan similares son los sujetos entre sí. \[S_{SM}(i,j) = \frac{a+d}{a+b+c+d}\] Roger & Tanimoto (1960): El fin de R&T es penalizar mayormente las discordancias \[S_{RT}(i,j) = \frac{a+d}{a+d+2(b+c)}\]
Notación: \[a = \text{ambos sujetos tienen presencia (coincidencia positiva)}\] \[b = \text{sujeto } i \text{ ausente, sujeto } j \text{ presente}\] \[c = \text{sujeto } i \text{ presente, sujeto } j \text{ ausente}\] \[d = \text{ambos sujetos tienen ausencia (coincidencia negativa)}\] \[a + b + c + d = n = \text{total de variables binarias comparadas}\]
Tabla 18: Medidas de similaridad
library(readxl)
library(grid)
library(gridExtra)
# 1. Cargar Datos
base <- read_excel(ruta_datos)
# 2. Codificación binaria
g <- ifelse(base$Género == "M", 1, 0)
localidades <- sort(unique(base$Localidad_de_residencia))
# Cambiamos df por base
loc_matrix <- sapply(localidades, function(l) as.integer(base$Localidad_de_residencia == l))
X <- cbind(g, loc_matrix)
# 3. Funciones de Similitud / Distancia
sokal_michener <- function(vi, vj) {
a <- sum(vi == 1 & vj == 1)
b <- sum(vi == 0 & vj == 1)
c <- sum(vi == 1 & vj == 0)
d <- sum(vi == 0 & vj == 0)
(a + d) / (a + b + c + d)
}
roger_tanimoto <- function(vi, vj) {
a <- sum(vi == 1 & vj == 1)
b <- sum(vi == 0 & vj == 1)
c <- sum(vi == 1 & vj == 0)
d <- sum(vi == 0 & vj == 0)
(a + d) / (a + d + 2 * (b + c))
}
# 4. Todos los pares
pares <- combn(nrow(X), 2)
sokal_vals <- apply(pares, 2, function(p) sokal_michener(X[p[1],], X[p[2],]))
roger_vals <- apply(pares, 2, function(p) roger_tanimoto(X[p[1],], X[p[2],]))
# 5. Tabla resumen
resumen <- data.frame(
Medida = c("Sokal & Michener", "Roger & Tanimoto"),
Media = round(c(mean(sokal_vals), mean(roger_vals)), 4),
Mediana = round(c(median(sokal_vals), median(roger_vals)), 4),
Minimo = round(c(min(sokal_vals), min(roger_vals)), 4),
Maximo = round(c(max(sokal_vals), max(roger_vals)), 4),
Pares_ID = c(sum(sokal_vals == 1), sum(roger_vals == 1))
)
# 6. Renderizar tabla
grid.newpage()
grid.table(resumen, rows = NULL)
En promedio, al comparar los pares de los sujetos el 85% en Sokal y Michener, y el 74% en Roger y Tanimoto concordoron. Esto quiere decir que la mayoría de los pares de sujetos comparten perfil similar en estas dos variables categóricas. Las discordancias (aunque existen), bajan aproximadamente un 10%. En ambas medidas la mediana fue más alta que la media, lo que sugiere que existe un sesgo hacia la izquierda. Hay algunos pares de sujetos con similaridad bastante baja, lo que arrastra el promedio hacia abajo mientras la mayoría de pares se concentran en valores altos: próximos o igual al máximo.
Figura 20: Kernel Gaussiano variando el ancho de banda (2, 10, 18)
datos <- read_excel(ruta_datos)
variable_estudio <- base_numérica$`Glucosa (mg/dL)`
datos_hist<-hist(variable_estudio, plot=FALSE)
ancho_banda<-datos_hist$breaks[2]-datos_hist$breaks[1]
print(ancho_banda)
## [1] 10
par(mfrow= c(1,3))
crear_cortes <- function(datos, ancho)
{seq(from = floor(min(datos) / ancho) * ancho,
to = ceiling(max(datos) / ancho) * ancho + ancho,
by = ancho)}
ancho_min<-2
ancho_opt<-10
ancho_gr<-18
hist(variable_estudio,
breaks = crear_cortes(variable_estudio,ancho_min),
prob=TRUE,
main="Variación de la glucosa, nbw=Pequeño(2)",
cex.main=1.5,
cex.lab = 1.5,
cex.axis = 1.5,
xlab = "Glucosa (mg/dL)",
ylab = "Densidad",
col = "#27CFF5",
border = "black")
lines(density(variable_estudio, kernel ="gaussian", bw=ancho_min),
col="blue",lwd=2)
hist(variable_estudio,
breaks = crear_cortes(variable_estudio, ancho_opt),
prob=TRUE,
main="Variación de la glucosa, nbw=Óptimo(10)",
cex.main=1.5,
xlab = "Glucosa (mg/dL)",
ylab = "Densidad",
cex.lab = 1.5,
cex.axis = 1.5,
col = "#FF9494",
border = "black")
lines(density(variable_estudio, kernel = "gaussian", bw=ancho_opt),
col="red", lwd=2, lty=2)
hist(variable_estudio,
breaks = crear_cortes(variable_estudio, ancho_gr),
prob=TRUE,
main="Variación de la glucosa, nbw=Grande(18)",
cex.main=1.5,
xlab = "Glucosa (mg/dL)",
ylab = "Densidad",
cex.lab = 1.5,
cex.axis = 1.5,
col = "#94FFAF",
border = "black")
lines(density(variable_estudio, kernel = "gaussian", bw=ancho_gr),
col="#136E40", lwd=2, lty=2)
par(mfrow=c(1,1))
El análisis nos muestra lo siguiente:
Ancho de banda= 2 (Pequeño): Este ancho de banda es poco confiable para generalizar. El diagrama muestra demasiados “picos” y está intentando seguir todas las fluctuaciones de los datos. Clínicamente esto resulta engañoso debido a que esos picos realmente son ruido estadístico o casualidad de la muestra, no características reales de la población.
Ancho de banda= 10 (Óptimo): Este resulta ser el mejor al presentar un equilibrio claro. Ayuda a suavizar el ruido y revela una distribución clara y real de la glucosa.
Ancho de banda= 18 (Grande): La curva se vuelve demasiado plana y es propicia para ocultar información importante como la asimetría real.
El ancho de banda de 10 es el más adecuado porque captura la tendencia poblacional sin dejarse engañar por variaciones aleatorias.
El gráfico de 10 nos muestra dónde está la mayoría de la población. La curva roja nos dice que el grueso de los pacientes se concentra entre los 80 y 100 mg/dL de glucosa. Por otro lado se evidencia la existencia de asimetría, pues la cola de la curva roja se extiende hacia la derecha (valores >120 mg/dL). Esto significa que, aunque la mayoría está sana, existe un subgrupo significativo de pacientes con tendencia a la hiperglucemia. Un ancho de banda de 18 escondería este riesgo haciéndolo pasar como una distribución normal, y uno de 2 lo confundiría con ruido estadístico, impidiendo hacer una atención inmediata a los pacientes que si poseen esta enfermedad.
Se decidió usar una validación visual para estimar cuál de estos tres kernels tuvo la mejor aproximación, también como un método menos subjetivo se decidió usar el “Error Cuadrático Integrado Estimado”.
Hipotesis El Gaussiano y Epanechnikov se espera que tengan un comportamiento muy similar, con ligeras diferencias no tan notorias, practicamente una superposicion entre ellos dos, y el mas desacertado seria el Rectangular.
Figura 21: Comparacion de Kernels con el mismo ancho de banda BW=1
# 1. Cargar librería y datos
library(readxl)
base_numerica <- read_excel(ruta_datos)
variable_estudio <- base_numerica$`TSH (mIU/L)`
# Definimos el ancho de banda fijo (óptimo)
ancho_opt <- 1
# Función auxiliar para cortes continuos del histograma
crear_cortes <- function(datos, ancho) {
seq(floor(min(datos) / ancho) * ancho,
ceiling(max(datos) / ancho) * ancho + ancho,
by = ancho)
}
# 2. DEFINICIÓN DE KERNELS
kernels <- list(
list(nombre="Gaussiano", kernel="gaussian", color="blue", fondo="#AED6F1"),
list(nombre="Epanechnikov", kernel="epanechnikov", color="red", fondo="#F1948A"),
list(nombre="Rectangular", kernel="rectangular", color="#136E40", fondo="#A9DFBF")
)
# 3. GRÁFICOS: DISTINTOS KERNELS, MISMO ANCHO DE BANDA
# 3.1 Gráficas individuales (1 fila, 3 columnas)
par(mfrow = c(1, 3))
for (k in kernels) {
hist(variable_estudio, breaks = crear_cortes(variable_estudio, ancho_opt),
prob = TRUE, col = k$fondo, border = "black",
main = paste("Kernel", k$nombre, "| bw =", ancho_opt),
xlab = "TSH (mIU/L)", ylab = "Densidad", cex.lab = 1.5,
cex.axis = 1.5, cex.main = 1.5)
lines(density(variable_estudio, kernel = k$kernel, bw = ancho_opt),
col = k$color, lwd = 2.5)
}
Figura 22: Comparación del uso de distintos Kernel para la TSH
par(mfrow = c(1, 1))
hist(variable_estudio, breaks = crear_cortes(variable_estudio, ancho_opt),
prob = TRUE, main = paste("Comparación Kernels | bw =", ancho_opt),
xlab = "TSH (mIU/L)", ylab = "Densidad", col = "gray90", border = "white")
for (i in seq_along(kernels)) {
lines(density(variable_estudio, kernel = kernels[[i]]$kernel, bw = ancho_opt),
col = kernels[[i]]$color, lwd = 2, lty = i)
}
legend("topright", legend = sapply(kernels, `[[`, "nombre"),
col = sapply(kernels, `[[`, "color"), lty = 1:length(kernels), lwd = 2, bty = "n")
Tabla 19: Error de estimación para cada Kernel usado
# Función que calcula el Error Cuadrático Integrado Estimado (siempre > 0)
calcular_ise_positivo <- function(datos, kernel, bw) {
n <- length(datos)
# a. Densidad evaluada y su integral
f_completa <- density(datos, kernel = kernel, bw = bw, n = 1024)
dx <- diff(f_completa$x)[1]
int_f2 <- sum(f_completa$y^2) * dx
# b. Densidad piloto de referencia para estimar int(f_verdadera^2)
f_piloto <- density(datos, bw = "nrd0", n = 1024)
dx_piloto <- diff(f_piloto$x)[1]
int_f_true <- sum(f_piloto$y^2) * dx_piloto
# c. Leave-One-Out f_(-i)(x_i)
f_loo <- sapply(1:n, function(i) {
f_i <- density(datos[-i], kernel = kernel, bw = bw,
from = min(f_completa$x), to = max(f_completa$x), n = 512)
approx(f_i$x, f_i$y, xout = datos[i])$y
})
# d. LSCV clásico
lscv_raw <- int_f2 - 2 * mean(f_loo, na.rm = TRUE)
# e. Error ISE Positivo = LSCV + int(f_verdadera^2)
ise_estimado <- lscv_raw + int_f_true
return(abs(ise_estimado))
}
# Calculamos la tabla de errores positivos
resultados <- data.frame(
Kernel = sapply(kernels, `[[`, "nombre"),
Error_ISE = sapply(kernels, function(k) round(calcular_ise_positivo(variable_estudio, k$kernel, ancho_opt), 6))
)
# Ordenamos de menor a mayor error
resultados <- resultados[order(resultados$Error_ISE), ]
resultados$Ranking <- 1:nrow(resultados)
grid.newpage()
grid.table(resultados, row = NULL)
Comportamiento
Sí existe una diferencia visual entre el kernel Gaussiano y el de Epanechnikov, siendo el primero el que está más centrado con el histograma de fondo, y el segundo tiene mayor similitud con el Rectangular. Al obtener el “Error Cuadrático Integrado Estimado” se confirma lo mencionado anteriormente. El mejor kernel fue el Gaussiano.
12.1 A nivel clínico podemos concluir que el estudio presenta índices de salud muy diversos en cuestión a tomas de índices cardiovasculares. A nivel glucémico (HbA1c), los pacientes presentan niveles muy estables con un Coeficiente de Variación casi del 10%, sin mostrar alguna diferencia significativa entre hombres y mujeres; por el contrario, resulta ser una de las variables donde la diferencia biológica no muestra muchas repercusiones.
12.2 Caso contrario sucede en las variables como la TSH, donde en el grupo de las mujeres suele haber algunas pacientes específicamente con unos índices sumamente altos que expresan una tendencia a tener hipotiroidismo, ya sea en su fase clínica como subclínica no controlada. Aunque las medianas son relativamente similares, la población femenina presenta una “cola” de valores atípicos con valores más extremos (reflejada en esa curtosis de 8.33 vs 0.42 en hombres), algo coherente con la mayor prevalencia de patologías tiroideas en mujeres.
12.3 Algo importante a recalcar con respecto al caso anterior, es que a nivel general, el grupo cuenta con niveles de TSH óptimos, sobre todo teniendo en cuenta los niveles de la mayoría de los hombres, lo que nos ayuda a reafirmar que aquellos casos donde se presentan niveles de hipotiroidismo con niveles extremos, son en las mujeres, esto debido principalmente a factores hormonales y a la exposición de enfermedades autoinmunes.
12.4 Las variables como el colesterol total y el LDL suelen afectar drásticamente a la mayoría de la población con problemas cardiovasculares, y han representado para esta muestra valores relativamente estables, pero con una particularidad importante a recalcar: los únicos dos casos donde se presentan los valores más altos son en poblaciones jóvenes de entre 18 a 46 años. Este es un indicador suficiente, junto con el hecho de que la mayoría de la muestra a la que se le tomó este registro de variables clínicas por riesgo cardiovascular también pertenece a este grupo, para concluir que la población juvenil en Colombia se está viendo mucho más propensa a sufrir de enfermedades cardiovasculares a temprana edad.
12.5 A nivel nutricional y metabólico podemos concluir que en la población general existe una tendencia en índices de un IMC “Normal”, con algunos casos extremos sobre obesidad mórbida o desnutrición. Sin embargo, indicadores como los triglicéridos cuentan con una variabilidad impresionante, pero que clínicamente tiene todo el sentido, ya que los triglicéridos son sumamente sensibles a los hábitos dietéticos y el tiempo de ayuno, por lo que es normal ver oscilaciones masivas de ±50 mg/dL en una evaluación poblacional normal.
12.6 En el ámbito estadístico, es importante recalcar que el uso de las MTC sirve de manera óptima siempre y cuando el análisis se acompañe junto con Medidas de Dispersión. Como se mostró en el análisis de los resultados, la mayoría de variables suelen tener a la Media como un indicador funcional para el análisis estadístico; sin embargo, hay algunos casos como el de los triglicéridos y la TSH, que pueden presentar inconsistencias, y para esto es necesario utilizar otro indicador como la Mediana (y la MEDA como medida de dispersión), para lograr reafirmar si aquellos casos atípicos afectan en general a la muestra, o si son compensables entre ellos.
12.7 La muestra presenta en términos generales una salud cardiovascular dentro del rango “adecuado”. Sin embargo, es importante prestar atención a ciertos indicadores de riesgo que presentan algunos pacientes, en su gran mayoría mujeres y población joven, con índices de presión sistólica altos y niveles de colesterol elevados respectivamente.
12.8 El análisis multivariado es una herramienta práctica que permite analizar patrones, descubrir relaciones complejas y establecer predicciones simultáneas entre conjuntos de variables. Esto es de mucha ayuda en el ámbito clínico y en este análisis ayudó a encontrar relaciones directas entre marcadores como el LDL v.s Colesterol Total y entre la Tensión sistólica v.s Edad . Por otra parte, ayudó a determinar la independencia de marcadores como la TSH, el peso y la Tensión diastólica. Esto indica que es necesario estudiar externamente otras razones por las cuales se presentan indicadores altos en estos marcadores.
12.9 Las Caras de Chernoff son herramientas útiles para hacer una estratificación rápida y precisa. Dentro del ámbito clínico, se vuelve indispensable para prestar atención urgente a los pacientes que la necesiten. Sin embargo, requieren de la preparación de criterios precisos y útiles para garantizar la asignación de un grupo adecuado, pues de lo contrario, un error puede dejar por fuera a un paciente que requiera atención inmediata o pronosticar enfermedades de manera prematura por contar con información incorrecta.
12.10 Las medidas de similaridad usadas evidencian que existe una tendencia general hacia la semejanza entre los individuos, esto principalmente debido al enfoque con el cual se tomaron los datos y la ubicación del hospital; aunque existe variabilidad consistente entre los sujetos analizados.
12.11 En la comparación de kernels se identificó que la elección del método influye ampliamente en la calidad de la representación de los datos.
Age-related variation in thyroid function – a narrative review highlighting important implications for research and clinical practice. (2023, April 13). PMC. Retrieved July 19, 2026, from https://pmc.ncbi.nlm.nih.gov/articles/PMC10069079/
AMNISTÍA INTERNACIONAL. (2025, June 24). ¿Qué es el género? Y por qué es importante entenderlo. Amnistía Internacional. Retrieved April 29, 2026, from https://www.amnesty.org/es/latest/campaigns/2025/06/what-is-gender-and-why-understanding-it-is-important/
American Diabetes Association Professional Practice Committee. (2024).
BBVA. (2024, October 16). ¿Qué es la Organización Mundial de la Salud (OMS) y para qué sirve? BBVA. Retrieved April 29, 2026, from https://www.bbva.com/es/sostenibilidad/que-es-la-organizacion-mundial-de-la-salud-oms-historia-del-vigia-de-la-salud-global/
Camargo, D. C. (2025, March 4). La obesidad en Colombia: un desafío de salud pública que requiere más atención. Universidad del Rosario. Retrieved April 29, 2026, from https://urosario.edu.co/periodico-nova-et-vetera/salud/la-obesidad-en-colombia
Clínica Universidad de Navarra. (2023). Variable. Clínica Universidad de Navarra. Retrieved Abril 29, 2026, from https://www.cun.es/diccionario-medico/terminos/variable
Clínica Universidad de Navarra. (2025). Qué es el índice de masa corporal (IMC) y para qué sirve | CUN. Clínica Universidad de Navarra. Retrieved April 29, 2026, from https://www.cun.es/escuela-salud/indice-masa-corporal
Clínica Universidad de Navarra. (2026). Glucosa: qué es y definición médica | Diccionario CUN. Clínica Universidad de Navarra. Retrieved April 29, 2026, from https://www.cun.es/diccionario-medico/terminos/glucosa
Comité de revisión clínica. (2025, Mayo 1). Miligramos por decilitro (mg/dL). Biblioteca de salud. Retrieved Abril 29, 2026, from https://www-nyp-org.translate.goog/healthlibrary/definitions/milligrams-per-deciliter-mgdl?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=tc
Definición Sexo. (n.d.). Eustat. Retrieved May 2, 2026, from https://es.eustat.eus/documentos/elem_25007/definicion.html
edad | Definición | Diccionario de la lengua española | RAE - ASALE. (n.d.). Diccionario de la lengua española. Retrieved April 29, 2026, from https://dle.rae.es/edad
El Sevier. (2014, Diciembre). Índice triglicéridos y glucosa: un indicador útil de insulinorresistencia. Retrieved julio 19, 2026, from https://www.elsevier.es/es-revista-endocrinologia-nutricion-12-articulo-indice-trigliceridos-glucosa-un-indicador-S1575092214002009
Eustat. (n.d.). Lugar de residencia. Eustat. Retrieved Abril 29, 2026, from https://es.eustat.eus/documentos/elem_15350/definicion.html
Ferrero, R. (2018, Julio 28). Qué es R Software: Guía sobre el Lenguaje Estadístico. Máxima Formación. Retrieved April 29, 2026, from https://www.maximaformacion.es/blog-dat/que-es-r-software/
Gómez, A. (2025, May 13). Repercusión de los tipos de edades en el envejecimiento. ¿A qué edad empezamos a envejecer? Sociedad Española de Medicina Estética. Retrieved May 2, 2026, from https://www.seme.org/revista/articulos/repercusion-de-los-tipos-de-edades-en-el-envejecimiento-a-que-edad-empezamos-a-envejecer
Instituto Nacional del Cáncer. (n.d.). Definición de metabólico - Diccionario de cáncer del NCI - NCI. National Cancer Institute. Retrieved May 5, 2026, from https://www.cancer.gov/espanol/publicaciones/diccionarios/diccionario-cancer/def/metabolico
Luna, R. (n.d.). ¿Cuál es la Fórmula del Índice de Masa Corporal? | Dr. Rubén. Dr Ruben Luna. Retrieved April 29, 2026, from https://drrubenluna.com/cual-es-la-formula-del-indice-de-masa-corporal/
Mediline Plus. (2023, August 31). Prueba de hemoglobina glicosilada (HbA1c). MedlinePlus. Retrieved April 29, 2026, from https://medlineplus.gov/spanish/a1c.html
MedinePlus. (n.d.). Cardiovascular. MedlinePlus. Retrieved May 5, 2026, from https://medlineplus.gov/spanish/ency/article/002310.htm
Memorial Sloan Kattering. (2022, Junio 16). Exámenes de la función tiroidea (TFT). Memorial Sloan Kettering Cancer Center. Retrieved April 29, 2026, from https://www.mskcc.org/es/cancer-care/patient-education/thyroid-function-tests-tfts
Niveles de colesterol: Lo que usted debe saber. (2026, June 18). MedlinePlus. Retrieved July 19, 2026, from https://medlineplus.gov/spanish/cholesterollevelswhatyouneedtoknow.html
Pasos para bajar la tensión arterial. (2022, December 31). Cuídate Plus. Retrieved April 29, 2026, from https://cuidateplus.marca.com/alimentacion/nutricion/2018/09/10/pasos-bajar-tension-arterial-167116.html
Prueba de TSH: Prueba de laboratorio de MedlinePlus. (2024, October 30). MedlinePlus. Retrieved April 29, 2026, from https://medlineplus.gov/spanish/pruebas-de-laboratorio/prueba-de-tsh/
Reis, M. (n.d.). ¿Qué es mmHg y para qué se utiliza? Tua Saúde. Retrieved Abril 29, 2026, from https://www.tuasaude.com/es/medico-responde/mmhg-que-es/
Rogers, D. J., & Tanimoto, T. T. (1960). A computer program for classifying plants. Science, 132(3434), 1115–1118. Retrieved July 19, 2026, from https://doi.org/10.1126/science.132.3434.1115
Sneath, P. H. A., & Sokal, R. R. (1973). Numerical taxonomy: The principles and practice of numerical classification.
Sokal, R. R., & Michener, C. D. (1958). A statistical method for evaluating systematic relationships. University of Kansas Science Bulletin, 38(22), 1409–1438. Retrieved July 19, 2026, from
Universidad Carlos III de Madrid. (2020). Servicios - Overleaf - Editor online LaTeX. UC3M. Retrieved April 29, 2026, from https://www.uc3m.es/sdic/servicios/overleaf
Vida saludable para el corazón - Controlar la presión arterial y el colesterol | NHLBI, NIH. (2022, March 24). National Heart, Lung, and Blood Institute (NHLBI). Retrieved July 19, 2026, from https://www.nhlbi.nih.gov/es/health/heart-healthy-living/blood-pressure
¿Qué es el error estándar? La clave para la precisión y la confianza estadísticas. (2025, September 17). DataCamp. Retrieved May 2, 2026, from https://www.datacamp.com/es/tutorial/what-is-standard-error