knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
library(readxl)
library(ggplot2)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.2
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(lmtest)
## Cargando paquete requerido: zoo
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(car)
## Cargando paquete requerido: carData
##
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(knitr)
library(kableExtra)
##
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
Para el desarrollo de esta práctica de regresión lineal, considero pertinente trabajar con la misma base de datos Endocrino, trabajada en la asignatura y que como sé, esta contiene información clínica y metabólica de 100 pacientes, por lo cual, el objetivo principal de este análisis es que yo pueda identificar la función matemática que mejor me explique el comportamiento de la glucosa basal (GLUCB) como variable dependiente, a partir de dos variables independientes, como es la circunferencia de cintura (CINTURA) y los niveles de triglicéridos (TG).
Me parece fundamental esta selección de variables, por lo que desde el punto de vista fisiopatológico, la obesidad central medida por la cintura constituye un predictor reconocido de resistencia a la insulina, mientras quelos triglicéridos elevados forman parte de los criterios diagnósticos del síndrome metabólico.
Además, pienso que este modelo me permitirá explorar cómo estos factores de riesgo cardiovascular se relacionan con la homeostasis glucémica.
BaseEndocrino <- read_excel("BaseEndocrino.xlsx")
datos_regresion <- BaseEndocrino %>%
select(GLUCB, CINTURA, TG) %>%
na.omit()
summary(datos_regresion)
## GLUCB CINTURA TG
## Min. : 59.0 Min. : 68.00 Min. : 38.0
## 1st Qu.: 85.0 1st Qu.: 88.75 1st Qu.: 63.5
## Median : 91.0 Median : 97.00 Median : 91.5
## Mean :100.9 Mean : 96.24 Mean :116.8
## 3rd Qu.:105.2 3rd Qu.:103.00 3rd Qu.:131.5
## Max. :223.0 Max. :135.00 Max. :843.0
Análisis Descriptivo de las Variables
GLUCB (Variable dependiente - Glucosa basal mg/dL)
Considero que la glucosa basal presenta una distribución asimétrica positiva, por lo que la media (100.9 mg/dL) supera notablemente a la mediana (91.0 mg/dL), por lo que este comportamiento es consistente según la literatura, con lo esperado en poblaciones con riesgo metabólico, donde existe un subgrupo de individuos con valores elevados que desplazan el promedio hacia la derecha,además, pienso que el rango intercuartílico (Q1-Q3: 85-105 mg/dL) ubica al 50% central de la muestra en la transición entre normalidad y prediabetes según los criterios de la American Diabetes Association.
El valor máximo de 223 mg/dL corresponde claramente a un estado de diabetes mellitus establecida, como se ve en la tabla de resumen.
CINTURA (Variable independiente X1 - cm)
Me parece que esta variable muestra una distribución simétrica, dado que la media (96.24 cm) y la mediana (97.00 cm) son prácticamente equivalentes. Este hallazgo me parece relevante considerando que la Comisión Lancet de Diabetes y Endocrinología ha señalado que las medidas antropométricas como la circunferencia de cintura constituyen predictores más precisos de riesgo cardiometabólico que el IMC, debido a su capacidad para reflejar la adiposidad visceral y la acumulación de grasa ectópica (Rubino et al., 2025), por lo que, considerando los puntos de corte del ATP-III para obesidad central (≥88 cm en mujeres, ≥102 cm en hombres), una proporción considerable de la muestra de esta población de la base, muy seguramente presenta adiposidad abdominal clínicamente significativa.
TG (Variable independiente X2 - Triglicéridos mg/dL)
Este hallazgo me parece crítico desde el punto de vista analítico, pues existe una marcada asimetría positiva, por lo que la media (116.8 mg/dL) supera considerablemente a la mediana (91.5 mg/dL).
El valor máximo de 843 mg/dL representa un outlier severo que infla el promedio, además, considero fundamental señalar que la Comisión Lancet ha identificado el clúster metabólico de hiperglucemia, triglicéridos elevados y HDL-colesterol bajo como criterio diagnóstico central de la obesidad clínica metabólicamente no saludable (Rubino et al., 2025.
Por tanto,la inclusión de los triglicéridos en mi modelo de riesgo metabólico tiene coherencia con el fundamento fisiopatológico, dado su rol en la dislipidemia aterogénica asociada a resistencia insulínica.
Referencias
Rubino, F., Cummings, D. E., Eckel, R. H., Cohen, R. V., Wilding, J. P. H., Brown, W. A., Stanford, F. C., Batterham, R. L., Farooqi, I. S., Farpour-Lambert, N. J., le Roux, C. W., Sattar, N., Baur, L. A., Morrison, K. M., Branca, F., … Mingrone, G. (2025). Definition and diagnostic criteria of clinical obesity. The Lancet Diabetes & Endocrinology, 13(3), 221–262. https://doi.org/10.1016/S2213-8587(24)00316-4
Diagrama de Dispersión GLUCB vs CINTURA
Considero fundamental representar gráficamente la relación entre las variables antes de ajustar cualquier modelo, pues el diagrama de dispersión me permite visualizar si existe un patrón de asociación lineal entre la glucosa basal y la circunferencia de cintura, lo cual justificaría que yo haga el planteamiento de un modelo de regresión lineal simple.
ggplot(datos_regresion, aes(x = CINTURA, y = GLUCB)) +
geom_point(color = "#E91E63", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", color = "#4A148C", fill = "#CE93D8", se = TRUE) +
labs(
title = "Diagrama de Dispersión: Glucosa Basal vs Cintura",
x = "Circunferencia de Cintura (cm)",
y = "Glucosa Basal (mg/dL)"
) +
theme_minimal()
Análisis del Diagrama de Dispersión de GLUCB vs CINTURA
A la vista del gráfico de dispersión, considero que puedo asumir un cierto grado de relación lineal positiva entre ambas variables, pues me parece evidente que a medida que aumenta la circunferencia de cintura, los valores de glucosa basal tienden a incrementarse, lo cual es consistente con la fisiopatología de la obesidad visceral.
Además, pienso que la pendiente positiva de la recta de regresión refleja el mecanismo por el cual la adiposidad abdominal induce resistencia a la insulina a través de la liberación de ácidos grasos libres, adipocinas proinflamatorias y disfunción del tejido adiposo (Rubino et al., 2025), por lo que tiene sentido que yo haga el planteamiento de un modelo de regresión lineal simple para cuantificar esta asociación.
Sin embargo, observo la presencia de algunos puntos alejados de la nube principal, particularmente valores de glucosa superiores a 150 mg/dL, que podrían corresponder a pacientes con diabetes establecida y que ameritarán que haga la evaluación mas adelante en el análisis de residuos.
Diagrama de Dispersión GLUCB vs TG
ggplot(datos_regresion, aes(x = TG, y = GLUCB)) +
geom_point(color = "#26A69A", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", color = "#004D40", fill = "#B2DFDB", se = TRUE) +
labs(
title = "Diagrama de Dispersión de Glucosa Basal vs Triglicéridos",
x = "Triglicéridos (mg/dL)",
y = "Glucosa Basal (mg/dL)"
) +
theme_minimal()
Análisis del Diagrama de Dispersión de GLUCB vs TG
Con este gráfico de dispersión, considero que existe una tendencia lineal positiva entre triglicéridos y glucosa basal, aunque visualmente más débil que la que obtuve antes con la circunferencia de cintura, lo cual me parece evidente que lamayoría de los datos (puntitos verdes) se concentran en valores de triglicéridos inferiores a 200 mg/dL, con una dispersión considerable alrededor de la recta de regresión.
Además, pienso que mi hallazgo más relevante es la presencia de un outlier extremo con triglicéridos cercanos a 843 mg/dL, el cual ejerce una influencia notable sobre la pendiente de la recta y me amplía considerablemente el intervalo de confianza en el extremo derecho del gráfico en color verde, de hecho, este tipo de valores extremos corresponden a hipertrigliceridemias severas que pueden tener etiología genética o secundaria, según (Rubino et al., 2025).
Por lo que, desde el punto de vista fisiopatológico, considero que esta asociación positiva es consistente con lo descrito por la Comisión Lancet, que identifica el clúster de hiperglucemia con triglicéridos elevados y HDL bajo como marcador del fenotipo metabólicamente no saludable de la obesidad clínica (Rubino et al., 2025), sin embargo, la mayor dispersión que noto es que la relación GLUCB-TG podría ser menos robusta que la relación GLUCB-CINTURA para fines predictivos.
Regresión Lineal Simple con CINTURA (X1)
Luego de comprobar visualmente en la gráfica, la existencia de una relación lineal entre las variables, procedo a ajustar el primer modelo de regresión lineal simple, donde la glucosa basal es la variable dependiente y la circunferencia de cintura actúa como variable independiente.
modelo_cintura <- lm(GLUCB ~ CINTURA, data = datos_regresion)
summary(modelo_cintura)
##
## Call:
## lm(formula = GLUCB ~ CINTURA, data = datos_regresion)
##
## Residuals:
## Min 1Q Median 3Q Max
## -41.754 -16.438 -4.619 6.546 120.779
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 30.3300 21.1239 1.436 0.15424
## CINTURA 0.7336 0.2176 3.371 0.00107 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 27.47 on 98 degrees of freedom
## Multiple R-squared: 0.1039, Adjusted R-squared: 0.09475
## F-statistic: 11.36 on 1 and 98 DF, p-value: 0.001074
Análisis del Modelo de Regresión Lineal Simple con GLUCB ~ CINTURA
Ecuación del modelo
A partir de los coeficientes que obtuve, el modelo lineal se pueda expresar así:
GLUCB = 30.33 + 0.7336 × CINTURA
Mi interpretación de los coeficientes
Considero que el intercepto (β₀ = 30.33) representa el valor teórico de glucosa basal cuando la circunferencia de cintura es igual a cero, lo cual carece de sentido biológico en la práctica clínica, por lo que, como señala la guía del taller, en la mayoría de los casos la interpretación del intercepto no es relevante y todo el interés recae sobre la pendiente.
Me parece fundamental entender el coeficiente de CINTURA (β₁ = 0.7336): pues, por cada centímetro de incremento en la circunferencia de cintura, la glucosa basal aumenta en promedio 0.73 mg/dL, manteniendo constantes las demás condiciones, lo cual este hallazgo es consistente con la fisiopatología descrita por Rubino et al. (2025), donde la adiposidad visceral induce resistencia insulínica a través de lipotoxicidad y disfunción del tejido adiposo.
Significancia estadística
Pienso que los p-valores me van a permitir resolver los contrastes de hipótesis:
coef_cintura <- summary(modelo_cintura)$coefficients
coef_cintura <- as.data.frame(coef_cintura)
coef_cintura$Decision <- ifelse(coef_cintura$`Pr(>|t|)` < 0.05, "Significativo", "No significativo")
kable(coef_cintura,
digits = 4,
col.names = c("Estimación", "Error Estándar", "t-value", "p-value", "Decisión"),
caption = "Coeficientes del Modelo de Regresión: GLUCB ~ CINTURA",
align = "c")
| Estimación | Error Estándar | t-value | p-value | Decisión | |
|---|---|---|---|---|---|
| (Intercept) | 30.3300 | 21.1239 | 1.4358 | 0.1542 | No significativo |
| CINTURA | 0.7336 | 0.2176 | 3.3708 | 0.0011 | Significativo |
Considerando un nivel de significación α = 0.05, el p-value de CINTURA (0.0011) es menor que 0.05, por lo que rechazo la hipótesis nula H₀: β₁ = 0 y concluyo que existe una relación lineal estadísticamente significativa entre la circunferencia de cintura y la glucosa basal.
Regresión Lineal Simple con TG (X2)
modelo_tg <- lm(GLUCB ~ TG, data = datos_regresion)
summary(modelo_tg)
##
## Call:
## lm(formula = GLUCB ~ TG, data = datos_regresion)
##
## Residuals:
## Min 1Q Median 3Q Max
## -39.300 -15.503 -8.673 5.023 117.244
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 94.38933 4.44224 21.248 <2e-16 ***
## TG 0.05599 0.02918 1.919 0.0579 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 28.48 on 98 degrees of freedom
## Multiple R-squared: 0.03621, Adjusted R-squared: 0.02637
## F-statistic: 3.682 on 1 and 98 DF, p-value: 0.05792
coef_tg <- summary(modelo_tg)$coefficients
coef_tg <- as.data.frame(coef_tg)
coef_tg$Decision <- ifelse(coef_tg$`Pr(>|t|)` < 0.05, "Significativo", "No significativo")
kable(coef_tg,
digits = 4,
col.names = c("Estimación", "Error Estándar", "t-value", "p-value", "Decisión"),
caption = "Coeficientes del Modelo de Regresión: GLUCB ~ TG",
align = "c")
| Estimación | Error Estándar | t-value | p-value | Decisión | |
|---|---|---|---|---|---|
| (Intercept) | 94.3893 | 4.4422 | 21.2481 | 0.0000 | Significativo |
| TG | 0.0560 | 0.0292 | 1.9188 | 0.0579 | No significativo |
Explicación de la tabla
1.Estimación
Este valor representa los coeficientes β₀ y β₁ de la ecuación de regresión, calculados mediante el método de mínimos cuadrados ordinarios, donde el objetivo es que pueda encontrar la recta que minimiza la suma de las distancias verticales al cuadrado entre los puntos observados y la recta ajustada.
Por lo que mi ecuación queda:
GLUCB = 94.39 + 0.056 × TG
2.Error Estándar
Considero que este valor mide la precisión de cada estimación, por lo que es la desviación estándar del coeficiente estimado, es decir, cuánto variaría β si yo tomára muchas muestras diferentes de la misma población.
error_est <- data.frame(
Parametro = c("Intercepto", "TG"),
Error_Estandar = c(4.4422, 0.0292),
Interpretacion = c("El intercepto podría variar ± 4.44 en muestras repetidas",
"El coeficiente de TG podría variar ± 0.029 en muestras repetidas")
)
kable(error_est,
col.names = c("Parámetro", "Error Estándar", "Interpretación"),
caption = "Precisión de las Estimaciones",
align = "clc")
| Parámetro | Error Estándar | Interpretación |
|---|---|---|
| Intercepto | 4.4422 | El intercepto podría variar ± 4.44 en muestras repetidas |
| TG | 0.0292 | El coeficiente de TG podría variar ± 0.029 en muestras repetidas |
Me parece importante señalar, según la literatura de revisión, que a menor error estándar, mayor precisión tendré en la estimación del coeficiente.
3.t-value (Estadístico t de Student)
Este valor es importante porque me permite contrastar si el coeficiente es significativamente diferente de cero, y se se calcula como: t = Estimación / Error Estándar
tvalue_calc <- data.frame(
Parametro = c("Intercepto", "TG"),
Calculo = c("94.3893 / 4.4422", "0.0560 / 0.0292"),
Resultado = c(21.25, 1.92)
)
kable(tvalue_calc,
col.names = c("Parámetro", "Cálculo (Estimación / Error Estándar)", "Resultado"),
caption = "Cálculo del Estadístico t de Student",
align = "ccc")
| Parámetro | Cálculo (Estimación / Error Estándar) | Resultado |
|---|---|---|
| Intercepto | 94.3893 / 4.4422 | 21.25 |
| TG | 0.0560 / 0.0292 | 1.92 |
Además, pienso que la lógica detrás del t-value es que si el coeficiente verdadero fuera cero, ¿qué tan improbable sería obtener una estimación tan alejada de cero como la que observo? Un t-value grande en valor absoluto (generalmente > 2) sugiere que el coeficiente es significativamente diferente de cero.**
4. p-value (Pr(>|t|))
Considero que este es el valor más crítico para la toma de decisiones, pues el p-value responde a la pregunta, ¿Cuál es la probabilidad de obtener un t-value tan extremo o más, si el verdadero coeficiente fuera cero?
pvalue_int <- data.frame(
Parametro = c("Intercepto", "TG"),
P_value = c("< 0.0001", "0.0579"),
Interpretacion = c("Probabilidad nula de que β₀ sea igual a 0",
"5.79% de probabilidad si β₁ fuera 0")
)
kable(pvalue_int,
col.names = c("Parámetro", "p-value", "Interpretación"),
caption = "Interpretación del p-value",
align = "c")
| Parámetro | p-value | Interpretación |
|---|---|---|
| Intercepto | < 0.0001 | Probabilidad nula de que β₀ sea igual a 0 |
| TG | 0.0579 | 5.79% de probabilidad si β₁ fuera 0 |
Por lo que aplico la regla de decisión con α = 0.05:
-Si p-value < 0.05 → Rechazo H₀ → El coeficiente es significativo
-Si p-value ≥ 0.05 → No rechazo H₀ → El coeficiente no es significativo
Decisión Aplicando el criterio anterior:
decision_est <- data.frame(
Parametro = c("Intercepto", "TG"),
P_value = c("0.0000", "0.0579"),
Comparacion = c("Sí", "No (muy cerca, pero no)"),
Decision = c("Significativo", "No significativo")
)
kable(decision_est,
col.names = c("Parámetro", "p-value", "¿p < 0.05?", "Decisión"),
caption = "Decisión Estadística (α = 0.05)",
align = "cccc")
| Parámetro | p-value | ¿p < 0.05? | Decisión |
|---|---|---|---|
| Intercepto | 0.0000 | Sí | Significativo |
| TG | 0.0579 | No (muy cerca, pero no) | No significativo |
Me parece importante destacar que aunque el p-value de TG (0.0579) está muy cerca del umbral de 0.05, estadísticamente no alcanza la significancia, por tanto, esto significa que no tengo evidencia suficiente para afirmar que existe una relación lineal entre triglicéridos y glucosa basal en este modelo simple.
Además, considero relevante mencionar que el R² = 0.036 indica que los triglicéridos explican apenas el 3.6% de la variabilidad de la glucosa, lo cual me dice que la conclusión de que TG es por sí solo un predictor débil, por lo que si hago la comparación de ambos modelos simples:
comparacion <- data.frame(
Modelo = c("GLUCB ~ CINTURA", "GLUCB ~ TG"),
R2 = c(0.1039, 0.0362),
P_value = c(0.0011, 0.0579),
Significativo = c("Sí", "No")
)
kable(comparacion,
col.names = c("Modelo", "R²", "p-value del predictor", "¿Significativo?"),
caption = "Comparación de Modelos de Regresión Simple",
align = "cccc")
| Modelo | R² | p-value del predictor | ¿Significativo? |
|---|---|---|---|
| GLUCB ~ CINTURA | 0.1039 | 0.0011 | Sí |
| GLUCB ~ TG | 0.0362 | 0.0579 | No |
concluyo entonces que la circunferencia de cintura resulta ser un mejor predictor individual de la glucosa basal que los triglicéridos.
Regresión Lineal Múltiple (GLUCB ~ CINTURA + TG)
Hasta este punto he ajustado dos modelos de regresión lineal simple de forma independiente:
-uno con la circunferencia de cintura y otro con los triglicéridos
Considero que, aunque este enfoque me permitió evaluar la capacidad predictiva individual de cada variable, en la realidad clínica los fenómenos metabólicos no ocurren de manera aislada, por lo que me parece fundamental dar el paso hacia un modelo de regresión lineal múltiple.
Pienso que la glucosa basal, como marcador de homeostasis glucémica, está influenciada simultáneamente por múltiples factores de riesgo, pues según la Comisión Lancet de Diabetes y Endocrinología se ha identificado que el clúster metabólico de hiperglucemia, triglicéridos elevados y obesidad central actúan de manera conjunta en la fisiopatología de la obesidad clínica (Rubino et al., 2025).
Por lo que analizar estas variables por separado podría subestimar o sobreestimar su verdadero efecto sobre la glucemia, además, considero que este enfoque me permite responder preguntas más complejas, como por ejemplo:
¿Cuánto aporta cada variable al explicar la glucosa basal cuando la otra ya está en el modelo? ¿Mejora la capacidad predictiva al incluir ambas variables? ¿Alguna variable pierde significancia cuando se ajusta por la otra?
Con el modelo GLUCB ~ CINTURA + TG voy a plantear que la glucosa basal puede expresarse como una función lineal de ambos predictores simultáneamente, por lo que quiero entender, como cada coeficiente me representa el efecto de esa variable manteniendo constante la otra, es decir, el coeficiente de CINTURA me indicará cuánto cambia la glucosa por cada centímetro adicional de cintura, asumiendo que los triglicéridos permanecen fijos, por lo que voy a aislar la contribución independiente de cada factor de riesgo sobre la glucemia.
modelo_multiple <- lm(GLUCB ~ CINTURA + TG, data = datos_regresion)
summary(modelo_multiple)
##
## Call:
## lm(formula = GLUCB ~ CINTURA + TG, data = datos_regresion)
##
## Residuals:
## Min 1Q Median 3Q Max
## -39.928 -16.438 -5.062 7.522 117.877
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 32.57390 21.15560 1.540 0.12688
## CINTURA 0.66777 0.22383 2.983 0.00361 **
## TG 0.03501 0.02894 1.210 0.22933
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 27.4 on 97 degrees of freedom
## Multiple R-squared: 0.1172, Adjusted R-squared: 0.09901
## F-statistic: 6.44 on 2 and 97 DF, p-value: 0.002366
coef_multiple <- summary(modelo_multiple)$coefficients
coef_multiple <- as.data.frame(coef_multiple)
coef_multiple$Decision <- ifelse(coef_multiple$`Pr(>|t|)` < 0.05, "Significativo", "No significativo")
kable(coef_multiple,
digits = 4,
col.names = c("Estimación", "Error Estándar", "t-value", "p-value", "Decisión"),
caption = "Coeficientes del Modelo de Regresión Múltiple
GLUCB ~ CINTURA + TG",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(2, background = "#E8F5E9", color = "#1B5E20") %>%
row_spec(3, background = "#FFEBEE", color = "#B71C1C")
| Estimación | Error Estándar | t-value | p-value | Decisión | |
|---|---|---|---|---|---|
| (Intercept) | 32.5739 | 21.1556 | 1.5397 | 0.1269 | No significativo |
| CINTURA | 0.6678 | 0.2238 | 2.9834 | 0.0036 | Significativo |
| TG | 0.0350 | 0.0289 | 1.2097 | 0.2293 | No significativo |
Análisis del Modelo de Regresión Múltiple GLUCB ~ CINTURA + TG
Ecuación del modelo
A partir de los coeficientes que obtuve, el modelo de regresión múltiple lo puedo expresar como:
GLUCB = 32.57 + 0.668 × CINTURA + 0.035 × TG
Interpretación del Intercepto (β₀ = 32.57)C
Considero que el intercepto representa el valor teórico de glucosa basal cuando tanto la circunferencia de cintura como los triglicéridos son iguales a cero, por lo que me parece evidente que esta situación carece de sentido biológico, por lo que su interpretación clínica no es relevante, donde además, el p-value de 0.1269 indica que este valor no es estadísticamente diferente de cero, lo cual es limitada su utilidad a la hora de interpretarlo.
Interpretación de CINTURA (β₁ = 0.668)
Considero que este es el hallazgo más relevante del modelo, pues el coeficiente indica que por cada centímetro de incremento en la circunferencia de cintura, la glucosa basal aumenta en promedio 0.67 mg/dL, manteniendo los triglicéridos constantes.
Me parece importante señalar que este valor es ligeramente menor al obtenido en el modelo simple (β₁ = 0.734).
Creo que es en parte por el efecto que antes se atribuía exclusivamente a la cintura y que estaba parcialmente “mezclado” con el efecto de los triglicéridos, pues al incluir ambas variables en el modelo, logré aislar el efecto puro de cada una.
El p-value de 0.0036 es menor que 0.05, por lo que rechazo la hipótesis nula y concluyo que la circunferencia de cintura tiene una relación estadísticamente significativa con la glucosa basal. Este hallazgo es consistente con lo descrito por la Comisión Lancet, que reconoce la adiposidad visceral como predictor central de disfunción metabólica (Rubino et al., 2025).
Interpretación de TG (β₂ = 0.035)
El coeficiente indica que por cada mg/dL de incremento en triglicéridos,la glucosa basal aumentaría apenas 0.035 mg/dL, manteniendo la cintura constante, pñor lo que considero que este efecto es clínicamente poco relevante,además, me parece crucial destacar que elp-value de 0.2293 es mayor que 0.05, por lo que no rechazo la hipótesis nula,y esto significa que los triglicéridos no aportan información significativa al modelo cuando la circunferencia de cintura ya está incluida.
resumen_multiple <- data.frame(
Elemento = c("Ecuación", "CINTURA", "TG", "R²", "Modelo global"),
Resultado = c("GLUCB = 32.57 + 0.668 × CINTURA + 0.035 × TG",
"Significativa (p = 0.0036) → Entra al modelo",
"No significativa (p = 0.2293) → No entra al modelo",
"0.1172 (11.7% de variabilidad explicada)",
"Significativo (F = 6.44, p = 0.0024)")
)
kable(resumen_multiple,
col.names = c("Elemento", "Resultado"),
caption = "Resumen del Modelo de Regresión Múltiple: GLUCB ~ CINTURA + TG",
align = "ll") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#E3F2FD") %>%
row_spec(2, background = "#E8F5E9", color = "#1B5E20", bold = TRUE) %>%
row_spec(3, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(4, background = "#FFF3E0") %>%
row_spec(5, background = "#E8F5E9", color = "#1B5E20")
| Elemento | Resultado |
|---|---|
| Ecuación | GLUCB = 32.57 + 0.668 × CINTURA + 0.035 × TG |
| CINTURA | Significativa (p = 0.0036) → Entra al modelo |
| TG | No significativa (p = 0.2293) → No entra al modelo |
| R² | 0.1172 (11.7% de variabilidad explicada) |
| Modelo global | Significativo (F = 6.44, p = 0.0024) |
Intervalos de Confianza
Según la guía del taller, ahora voy a calcular los intervalos de confianza para los coeficientes usando confint().
Para complementar la estimación puntual de los coeficientes, considero necesario calcular los intervalos de confianza al 95%, por tanto estos intervalos me permiten conocer el rango de valores plausibles para cada parámetro poblacional, proporcionando una medida de la incertidumbre asociada a las estimaciones,por lo que, si el intervalo de confianza de un coeficiente me incluye el valor cero, esto me lleva a la conclusión de que dicha variable no es estadísticamente significativa.
confint(modelo_multiple)
## 2.5 % 97.5 %
## (Intercept) -9.41411321 74.56191636
## CINTURA 0.22353990 1.11200953
## TG -0.02242881 0.09244781
ic_multiple <- as.data.frame(confint(modelo_multiple))
ic_multiple$Parametro <- rownames(ic_multiple)
ic_multiple$Incluye_Cero <- ifelse(ic_multiple$`2.5 %` <= 0 & ic_multiple$`97.5 %` >= 0,
"Sí → No significativo",
"No → Significativo")
ic_tabla <- data.frame(
Parametro = c("Intercepto", "CINTURA", "TG"),
Limite_Inferior = c(-9.4141, 0.2235, -0.0224),
Limite_Superior = c(74.5619, 1.1120, 0.0924),
Incluye_Cero = c("Sí → No significativo", "No → Significativo", "Sí → No significativo")
)
kable(ic_tabla,
col.names = c("Parámetro", "Límite Inferior (2.5%)", "Límite Superior (97.5%)", "¿Incluye el 0?"),
caption = "Intervalos de Confianza al 95% - Modelo Múltiple",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#FFF3E0") %>%
row_spec(2, background = "#E8F5E9", color = "#1B5E20", bold = TRUE) %>%
row_spec(3, background = "#FFEBEE", color = "#B71C1C")
| Parámetro | Límite Inferior (2.5%) | Límite Superior (97.5%) | ¿Incluye el 0? |
|---|---|---|---|
| Intercepto | -9.4141 | 74.5619 | Sí → No significativo |
| CINTURA | 0.2235 | 1.1120 | No → Significativo |
| TG | -0.0224 | 0.0924 | Sí → No significativo |
Análisis de los Intervalos de Confianza
Considero que los intervalos de confianza al 95% complementan la información proporcionada por los p-values y me permiten visualizar el rango de valores plausibles para cada coeficiente poblacional.
Intercepto [-9.41, 74.56]: Este intervalo incluye el valor cero, lo cual me confirma que el intercepto no es estadísticamente significativo, además,el amplio rango refleja una alta incertidumbre en su estimación.
CINTURA [0.22, 1.11]: Me parece fundamental destacar que este intervalo no incluye el cero, por lo que puedo afirmar con 95% de confianza que el verdadero efecto de la cintura sobre la glucosa basal se encuentra entre 0.22 y 1.11 mg/dL por cada centímetro adicional, pues este hallazgo habla de la significancia estadística de la variable.
TG [-0.02, 0.09]: Este intervalo incluye el cero, lo cual me confirma que los triglicéridos no tienen un efecto estadísticamente significativo sobre la glucosa basal cuando se ajusta por la cintura, por lo que no puedo descartar que el verdadero efecto poblacional sea nulo.
ANOVA del Modelo Múltiple
Comienzo recordando tal como hemos visto en las clases, sobre el Análisis de Varianza (ANOVA), pues es una técnica estadística que me descompone la variabilidad total de la variable dependiente en dos componentes:
-la variabilidad explicada por el modelo y la variabilidad no explicada (residual).
Considero que la lógica detrás del ANOVA es sencilla, pues si el modelo de regresión es útil, entonces debería explicarme una porción significativa de la variabilidad observada en la glucosa basal.
El ANOVA me evalúa la contribución secuencial de cada variable al modelo,es decir, primero me evalúa cuánto aporta CINTURA, y luego evalúa cuánto aporta TG después de que CINTURA ya está en el modelo.
Por lo que esta prueba me permite responder esta inquietud ¿agregar esta variable me reducirá significativamente el error del modelo?
El estadístico F compara la varianza explicada por cada variable contra la varianza residual. Si el valor F es grande y el p-value es menor que 0.05, concluyo que esa variable aporta significativamente al modelo,además, pienso que el ANOVA es una herramienta complementaria a los p-values individuales de los coeficientes, ya que ambos enfoques deberían conducir a conclusiones similares.
anova(modelo_multiple)
## Analysis of Variance Table
##
## Response: GLUCB
## Df Sum Sq Mean Sq F value Pr(>F)
## CINTURA 1 8572 8571.7 11.4160 0.00105 **
## TG 1 1099 1098.8 1.4634 0.22933
## Residuals 97 72832 750.8
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova_tabla <- data.frame(
Variable = c("CINTURA", "TG", "Residuos"),
Df = c(1, 1, 97),
Sum_Sq = c(8572, 1099, 72832),
Mean_Sq = c(8571.7, 1098.8, 750.8),
F_value = c(11.416, 1.463, NA),
P_value = c(0.00105, 0.22933, NA),
Decision = c("Entra al modelo", "No entra al modelo", "")
)
kable(anova_tabla,
col.names = c("Variable", "Df", "Sum Sq", "Mean Sq", "F value", "Pr(>F)", "Decisión"),
caption = "Tabla ANOVA del Modelo Múltiple: GLUCB ~ CINTURA + TG",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#E8F5E9", color = "#1B5E20", bold = TRUE) %>%
row_spec(2, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(3, background = "#F5F5F5")
| Variable | Df | Sum Sq | Mean Sq | F value | Pr(>F) | Decisión |
|---|---|---|---|---|---|---|
| CINTURA | 1 | 8572 | 8571.7 | 11.416 | 0.00105 | Entra al modelo |
| TG | 1 | 1099 | 1098.8 | 1.463 | 0.22933 | No entra al modelo |
| Residuos | 97 | 72832 | 750.8 | NA | NA |
Análisis de la Tabla ANOVA
Interpretación de los componentes
Considero importante desglosar cada elemento de la tabla para entender su significado:
Sum Sq (Suma de Cuadrados):
Representa la variabilidad explicada por cada variable, donde CINTURA explica 8572 unidades de variabilidad, mientras que TG solo aporta 1099 unidades adicionales, pero los residuos (72832) representan la variabilidad que el modelo no logra explicar.
Mean Sq (Cuadrado Medio):
Es la suma de cuadrados dividida por los grados de libertad, de hecho me parece que este valor estandariza la variabilidad para poder compararla.
F value: Es el cociente entre el cuadrado medio de cada variable y el cuadrado medio residual, donde un valor F grande indica que esa variable me explica mucha más variabilidad de la que se esperaría por azar.
Decisión estadística:
Considerando α = 0.05:
CINTURA: F = 11.42, p = 0.00105 → Sí entra al modelo., pues me aporta una reducción significativa en la variabilidad no explicada.
TG: F = 1.46, p = 0.2293 → No entra al modelo., después de incluir CINTURA, los triglicéridos no me aportan una reducción significativa adicional.
Por lo que estos resultados confirman exactamente lo que observo en el análisis de coeficientes, donde la circunferencia de cintura es el predictor relevante, mientras que los triglicéridos no me contribuyen significativamente al modelo cuando la cintura ya está incluida.
Validación de Supuestos del Modelo
Recordando el concepto, de que el modelo de regresión lineal se fundamenta en una serie de supuestos que deben cumplirse para que las estimaciones sean válidas y las inferencias estadísticas sean confiables, es por esto que considero que ignorar estos supuestos podría llevarme a conclusiones erróneas sobre la relación entre las variables.
Los supuestos fundamentales que debo verificar son:
Linealidad: La relación entre las variables independientes y la dependiente debe ser lineal.
Normalidad de los residuos: Los errores del modelo deben seguir una distribución normal . Homocedasticidad: La varianza de los residuos debe ser constante a lo largo de todos los valores predichos.
Independencia de los residuos: Los errores no deben estar correlacionados entre sí.
Me parece fundamental entender que si estos supuestos se violan, los p-values, intervalos de confianza y predicciones del modelo podrían no ser fiables. Por lo que la validación de supuestos es un paso obligatorio antes de aceptar las conclusiones del análisis de regresión.
En R, la función plot() aplicada al objeto del modelo me generará 4 gráficos diagnósticos que me permitirán evaluar visualmente estos supuestos, además, complementaré el análisis gráfico con pruebas estadísticas formales, como el test de Kolmogorov-Smirnov para normalidad y el test de Durbin-Watson para independencia.
par(mfrow = c(2, 2))
plot(modelo_multiple)
Análisis de los Gráficos Diagnósticos
Gráfico 1: Residuals vs Fitted (Residuos vs Valores Ajustados)
Considero que este gráfico evalúa simultáneamente la linealidad y la homocedasticidad, considero que lo ideal sería observar los puntos distribuidos aleatoriamente alrededor de la línea horizontal en cero, sin patrones, sin embargo, la línea roja me muestra una ligera curvatura, lo cual me podría sugerir que la relación no es perfectamente lineal, además noto que hay mayor dispersión de residuos en los valores intermedios y puedo identificar claramente las observaciones 55, 93 y 99 como valores atípicos con residuos muy elevados.
Gráfico 2: Q-Q Residuals (Gráfico de Normalidad)
Este gráfico me evalúa si los residuos siguen una distribución normal, cabe anotar que lo ideal es que los puntos se alineen sobre la línea diagonal punteada, y veo en la gráfica que la mayoría de los puntos centrales se ajustan razonablemente bien a la línea, sin embargo, observo desviaciones importantes en la cola superior derecha (observaciones 55, 93, 99), por lo que esto me sugiere una distribución con asimetría positiva, donde hay algunos residuos extremadamente grandes.
Gráfico 3: Scale-Location (Escala-Ubicación)
Este gráfico evalúa la homocedasticidad (varianza constante de los residuos), por lo que me parece que, la línea roja tiene una pendiente positiva, lo cual me indica que la variabilidad de los residuos aumenta con los valores ajustados, y sugiere heterocedasticidad, pues la varianza no es constante, por lo que las predicciones del modelo son menos precisas para valores altos de glucosa.
Gráfico 4: Residuals vs Leverage (Residuos vs Apalancamiento)
Este gráfico identifica puntos influyentes que podrían estar afectando desproporcionadamente las estimaciones del modelo, por ejemplo, la observación 100 tiene alto leverage (está muy a la derecha), probablemente corresponde al paciente con TG = 843 mg/dL.
Las observaciones 93 y 98 tienen residuos estandarizados muy elevados, afortunadamente, ningún punto cae fuera de las líneas de distancia de Cook, lo cual indica que no hay observaciones con influencia extrema sobre los coeficientes.
supuestos_graficos <- data.frame(
Supuesto = c("Linealidad", "Normalidad", "Homocedasticidad", "Puntos influyentes"),
Grafico = c("Residuals vs Fitted", "Q-Q Plot", "Scale-Location", "Residuals vs Leverage"),
Observacion = c("Ligera curvatura en línea roja",
"Desviaciones en cola superior",
"Pendiente positiva en línea roja",
"Obs. 100 con alto leverage"),
Conclusion = c("Se cumple parcialmente",
"Desviación de normalidad en extremos",
"Indicios de heterocedasticidad",
"Sin puntos con influencia extrema")
)
kable(supuestos_graficos,
col.names = c("Supuesto", "Gráfico", "Observación", "Conclusión"),
caption = "Evaluación Gráfica de Supuestos del Modelo",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#FFF3E0") %>%
row_spec(2, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(3, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(4, background = "#E8F5E9", color = "#1B5E20")
| Supuesto | Gráfico | Observación | Conclusión |
|---|---|---|---|
| Linealidad | Residuals vs Fitted | Ligera curvatura en línea roja | Se cumple parcialmente |
| Normalidad | Q-Q Plot | Desviaciones en cola superior | Desviación de normalidad en extremos |
| Homocedasticidad | Scale-Location | Pendiente positiva en línea roja | Indicios de heterocedasticidad |
| Puntos influyentes | Residuals vs Leverage | Obs. 100 con alto leverage | Sin puntos con influencia extrema |
Test de Normalidad (Kolmogorov-Smirnov)
Vuelvo a recordar que esta prueba estadística, me compara la distribución de los residuos del modelo contra una distribución normal teórica. Considero que esta prueba complementa el análisis visual del gráfico Q-Q, proporcionandome un criterio más objetivo para decidir si los residuos se distribuyen normalmente.
Esro me parece importante porque el supuesto de normalidad de los residuos es necesario para que los intervalos de confianza y los p-values sean válidos,por lo que, si este supuesto se violara severamente, las inferencias estadísticas del modelo podrían no ser confiables.
Hipótesis del contraste
-H₀: Los residuos siguen una distribución normal
-H₁: Los residuos no siguen una distribución normal
ks.test(residuals(modelo_multiple), "pnorm",
mean = mean(residuals(modelo_multiple)),
sd = sd(residuals(modelo_multiple)))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residuals(modelo_multiple)
## D = 0.16937, p-value = 0.006446
## alternative hypothesis: two-sided
Interpretación de los resultados
Estadístico D = 0.169
Este valor representa la máxima diferencia entre la distribución empírica de los residuos y la distribución normal teórica. Considero que un valor D cercano a 0 indicaría un ajuste perfecto a la normalidad, mientras que valores más altos sugieren mayor discrepancia.
p-value = 0.0064
Este resultado me parece crítico, pues dado que p-value = 0.0064 es menor que 0.05, debo rechazar la hipótesis nula, por lo que concluyo que los residuos no siguen una distribución normal.
Este hallazgo confirma lo que note antes visualmente en el gráfico Q-Q, donde las desviaciones en la cola superior (observaciones 55, 93, 99) generan una distribución asimétrica que se aleja de la normalidad.
normalidad_tabla <- data.frame(
Elemento = c("Estadístico D", "p-value", "Nivel de significación", "Decisión", "Conclusión"),
Valor = c("0.169", "0.0064", "α = 0.05", "p < 0.05 → Rechazo H₀", "Residuos NO son normales")
)
kable(normalidad_tabla,
col.names = c("Elemento", "Resultado"),
caption = "Test de Kolmogorov-Smirnov para Normalidad de Residuos",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#F5F5F5") %>%
row_spec(2, background = "#F5F5F5") %>%
row_spec(3, background = "#F5F5F5") %>%
row_spec(4, background = "#FFEBEE", color = "#B71C1C", bold = TRUE) %>%
row_spec(5, background = "#FFEBEE", color = "#B71C1C", bold = TRUE)
| Elemento | Resultado |
|---|---|
| Estadístico D | 0.169 |
| p-value | 0.0064 |
| Nivel de significación | α = 0.05 |
| Decisión | p < 0.05 → Rechazo H₀ |
| Conclusión | Residuos NO son normales |
Implicaciones para el modelo
Pienso que la violación del supuesto de normalidad se debe principalmente a la presencia de valores atípicos con glucosas muy elevadas (pacientes diabéticos), estos outliers me generan residuos extremos que distorsionan la distribución, por lo que, aunque el modelo me captura la tendencia general, las inferencias estadísticas (p-values e intervalos de confianza) debo interpretar con cautela.
Test de Independencia (Durbin-Watson)
Recordando nuevamente lo visto en clase, esta es una prueba estadística que evalúa si existe autocorrelación entre los residuos del modelo, por lo que considero que la autocorrelación ocurre cuando los residuos no son independientes entre sí, es decir, cuando el valor de un residuo está relacionado con el valor del residuo anterior.
Me parece fundamental comprender porque el supuesto de independencia de los errores es esencial para que las estimaciones de los coeficientes sean eficientes, por lo que, si existe autocorrelación, los errores estándar estarían subestimados y los p-values no serían confiables.
El estadístico de Durbin-Watson oscila entre 0 y 4:
DW ≈ 2 → No hay autocorrelación (ideal) DW < 2 → Autocorrelación positiva DW > 2 → Autocorrelación negativa
Hipótesis del contraste:
H₀: No hay autocorrelación (los residuos son independientes)
H₁: Existe autocorrelación positiva
dwtest(modelo_multiple)
##
## Durbin-Watson test
##
## data: modelo_multiple
## DW = 1.5556, p-value = 0.01183
## alternative hypothesis: true autocorrelation is greater than 0
Análisis del Test de Durbin-Watson
Estadístico DW = 1.5556
Considero importante señalar que este valor está por debajo de 2,según lo establecido un DW ≈ 2 indica ausencia de autocorrelación, mientras que valores menores sugieren autocorrelación positiva, por lo que un DW de 1.56 indica una desviación moderada del valor ideal.
p-value = 0.0118
Este resultado me parece relevante, pues dado que p-value = 0.0118 siendo menor que 0.05, debo entonces rechazar la hipótesis nula, por lo que concluyo que existe evidencia estadística de autocorrelación positiva entre los residuos.
¿Qué significa esto clínicamente?
Pienso que la autocorrelación detectada podría deberse a que los datos tienen algún tipo de ordenamiento de base (por ejemplo, si los pacientes fueron registrados secuencialmente en el tiempo o agrupados por alguna característica), además, considero que este hallazgo indica que los errores estándar de los coeficientes podrían estar subestimados, lo cual afecta la precisión de los p-values.
independencia_tabla <- data.frame(
Elemento = c("Estadístico DW", "Valor ideal", "p-value", "Nivel de significación", "Decisión", "Conclusión"),
Valor = c("1.5556", "≈ 2", "0.0118", "α = 0.05", "p < 0.05 → Rechazo H₀", "Existe autocorrelación positiva")
)
kable(independencia_tabla,
col.names = c("Elemento", "Resultado"),
caption = "Test de Durbin-Watson para Independencia de Residuos",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#FFF3E0") %>%
row_spec(2, background = "#F5F5F5") %>%
row_spec(3, background = "#FFF3E0") %>%
row_spec(4, background = "#F5F5F5") %>%
row_spec(5, background = "#FFEBEE", color = "#B71C1C", bold = TRUE) %>%
row_spec(6, background = "#FFEBEE", color = "#B71C1C", bold = TRUE)
| Elemento | Resultado |
|---|---|
| Estadístico DW | 1.5556 |
| Valor ideal | ≈ 2 |
| p-value | 0.0118 |
| Nivel de significación | α = 0.05 |
| Decisión | p < 0.05 → Rechazo H₀ |
| Conclusión | Existe autocorrelación positiva |
resumen_supuestos <- data.frame(
Supuesto = c("Linealidad", "Normalidad", "Homocedasticidad", "Independencia"),
Metodo = c("Gráfico Residuals vs Fitted", "Test Kolmogorov-Smirnov", "Gráfico Scale-Location", "Test Durbin-Watson"),
Resultado = c("Ligera curvatura", "D = 0.169, p = 0.0064", "Pendiente positiva", "DW = 1.56, p = 0.0118"),
Cumple = c("Parcialmente", "No cumple", "No cumple", "No cumple")
)
kable(resumen_supuestos,
col.names = c("Supuesto", "Método de Evaluación", "Resultado", "¿Se cumple?"),
caption = "Resumen de Validación de Supuestos del Modelo",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#FFF3E0") %>%
row_spec(2, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(3, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(4, background = "#FFEBEE", color = "#B71C1C")
| Supuesto | Método de Evaluación | Resultado | ¿Se cumple? |
|---|---|---|---|
| Linealidad | Gráfico Residuals vs Fitted | Ligera curvatura | Parcialmente |
| Normalidad | Test Kolmogorov-Smirnov | D = 0.169, p = 0.0064 | No cumple |
| Homocedasticidad | Gráfico Scale-Location | Pendiente positiva | No cumple |
| Independencia | Test Durbin-Watson | DW = 1.56, p = 0.0118 | No cumple |
Correlación Lineal
El coeficiente de correlación de Pearson (r) es una medida que cuantifica la fuerza y dirección de la relación lineal entre dos variables cuantitativas, por lo que este coeficiente oscila entre -1 y +1, donde valores cercanos a los extremos indican relaciones más fuertes.
Me parece útil establecer los siguientes criterios de interpretación:
|r| < 0.3 → Correlación débil 0.3 ≤ |r| < 0.7 → Correlación moderada |r| ≥ 0.7 → Correlación fuerte
Pienso que es necesario calcularla, porque el análisis de correlación complementa el modelo de regresión al permitirme visualizar la matriz de asociaciones entre todas las variables del estudio, además,el test de significancia (cor.test) me permitirá contrastar si la correlación observada es estadísticamente diferente de cero en la población.
Hipótesis del contraste:
H₀: ρ = 0 (no existe correlación lineal poblacional) H₁: ρ ≠ 0 (existe correlación lineal poblacional)
cor(datos_regresion)
## GLUCB CINTURA TG
## GLUCB 1.0000000 0.3223290 0.1902845
## CINTURA 0.3223290 1.0000000 0.2430419
## TG 0.1902845 0.2430419 1.0000000
matriz_cor <- data.frame(
Variable = c("GLUCB", "CINTURA", "TG"),
GLUCB = c("1.000", "0.322", "0.190"),
CINTURA = c("0.322", "1.000", "0.243"),
TG = c("0.190", "0.243", "1.000")
)
kable(matriz_cor,
col.names = c("Variable", "GLUCB", "CINTURA", "TG"),
caption = "Matriz de Correlaciones de Pearson",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#E8F5E9") %>%
row_spec(2, background = "#E3F2FD") %>%
row_spec(3, background = "#FFF3E0")
| Variable | GLUCB | CINTURA | TG |
|---|---|---|---|
| GLUCB | 1.000 | 0.322 | 0.190 |
| CINTURA | 0.322 | 1.000 | 0.243 |
| TG | 0.190 | 0.243 | 1.000 |
Correlación GLUCB - CINTURA (r = 0.322):
Considero que esta correlación es positiva y moderada,pues veo que a medida que aumenta la circunferencia de cintura, la glucosa basal tiende a incrementarse. Este hallazgo es consistente con el modelo de regresión, donde CINTURA fue el predictor significativo.
Correlación GLUCB - TG (r = 0.190):
Me parece que esta correlación es positiva pero débil, puies aunque existe una tendencia a que mayores niveles de triglicéridos se asocien con mayor glucosa, la fuerza de esta asociación es limitada, por lo que esto explica por qué TG no resultó significativo en el modelo de regresión.
Correlación CINTURA - TG (r = 0.243):
Pienso que esta correlación débil a moderada entre las dos variables independientes es importante, pues me indica que existe cierta asociación entre la adiposidad central y los triglicéridos, lo cual es fisiopatológicamente coherente, además, considero que esta correlación no es lo suficientemente alta como para generar problemas de multicolinealidad en el modelo.
cor.test(datos_regresion$GLUCB, datos_regresion$CINTURA)
##
## Pearson's product-moment correlation
##
## data: datos_regresion$GLUCB and datos_regresion$CINTURA
## t = 3.3708, df = 98, p-value = 0.001074
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.1344212 0.4878601
## sample estimates:
## cor
## 0.322329
Análisis del Test de Correlación: GLUCB - CINTURA
Coeficiente de correlación (r = 0.322):
Considero que este valor indica una correlación positiva moderada entre la glucosa basal y la circunferencia de cintura, por lo que, a medida que aumenta la adiposidad central, los niveles de glucemia tienden a elevarse.
Estadístico t = 3.371:
Este valor me permite contrastar si la correlación observada es estadísticamente diferente de cero, pues un t elevado sugiere que es improbable que la correlación sea producto del azar.
p-value = 0.001074:
Me parece fundamental este resultado, puesme dio un p-value = 0.001 que es menor que 0.05, rechazo la hipótesis nula H₀: ρ = 0. P
or lo que concluyo que existe una correlación lineal estadísticamente significativa entre la glucosa basal y la circunferencia de cintura en la población.
Intervalo de confianza al 95% [0.134, 0.488]:
Pienso que este intervalo es muy informativo, pues me indica que, con 95% de confianza, la verdadera correlación poblacional se encuentra entre 0.13 y 0.49, además, considero relevante que el intervalo no incluye el cero, lo cual me confirma la significancia de la correlación.
cor_cintura_tabla <- data.frame(
Elemento = c("Coeficiente r", "Estadístico t", "Grados de libertad", "p-value", "IC 95%", "Decisión"),
Valor = c("0.322", "3.371", "98", "0.0011", "[0.134 , 0.488]", "Correlación significativa")
)
kable(cor_cintura_tabla,
col.names = c("Elemento", "Resultado"),
caption = "Test de Correlación: GLUCB - CINTURA",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#E8F5E9", color = "#1B5E20", bold = TRUE) %>%
row_spec(2, background = "#F5F5F5") %>%
row_spec(3, background = "#F5F5F5") %>%
row_spec(4, background = "#E8F5E9", color = "#1B5E20") %>%
row_spec(5, background = "#F5F5F5") %>%
row_spec(6, background = "#E8F5E9", color = "#1B5E20", bold = TRUE)
| Elemento | Resultado |
|---|---|
| Coeficiente r | 0.322 |
| Estadístico t | 3.371 |
| Grados de libertad | 98 |
| p-value | 0.0011 |
| IC 95% | [0.134 , 0.488] |
| Decisión | Correlación significativa |
cor.test(datos_regresion$GLUCB, datos_regresion$TG)
##
## Pearson's product-moment correlation
##
## data: datos_regresion$GLUCB and datos_regresion$TG
## t = 1.9188, df = 98, p-value = 0.05792
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.006371795 0.372770185
## sample estimates:
## cor
## 0.1902845
Análisis del Test de Correlación: GLUCB - TG
Coeficiente de correlación (r = 0.190):
Considero que este valor me indica una correlación positiva débil entre la glucosa basal y los triglicéridos, por lo que la asociación entre estas variables es mucho menor que la observada con la cintura.
Estadístico t = 1.919:
Este valor es considerablemente menor al obtenido con CINTURA (t = 3.37), lo cual refleja una asociación más débil.
p-value = 0.0579:
Me parece crucial este resultado, dado que p-value = 0.058 es mayor que 0.05 (aunque muy cercano al límite), no rechazo la hipótesis nula H₀: ρ = 0.
por lo que concluyo que no existe evidencia estadística suficiente para afirmar que hay correlación lineal significativa entre la glucosa basal y los triglicéridos.
Intervalo de confianza al 95% [-0.006, 0.373]:
Pienso que este intervalo confirma la no significancia, pues el límite inferior es -0.006, lo cual significa que el intervalo incluye el cero, por lo que no puedo descartar que la verdadera correlación poblacional sea nula.
Coherencia con el modelo de regresión:
Considero fundamental destacar que este resultado es perfectamente consistente con lo observado en el análisis de regresión, donde TG tampoco alcanzó significancia estadística (p = 0.058 en el modelo simple y p = 0.229 en el múltiple).
cor_tg_tabla <- data.frame(
Elemento = c("Coeficiente r", "Estadístico t", "Grados de libertad", "p-value", "IC 95%", "Decisión"),
Valor = c("0.190", "1.919", "98", "0.0579", "[-0.006 , 0.373]", "Correlación NO significativa")
)
kable(cor_tg_tabla,
col.names = c("Elemento", "Resultado"),
caption = "Test de Correlación: GLUCB - TG",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#FFF3E0") %>%
row_spec(2, background = "#F5F5F5") %>%
row_spec(3, background = "#F5F5F5") %>%
row_spec(4, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(5, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(6, background = "#FFEBEE", color = "#B71C1C", bold = TRUE)
| Elemento | Resultado |
|---|---|
| Coeficiente r | 0.190 |
| Estadístico t | 1.919 |
| Grados de libertad | 98 |
| p-value | 0.0579 |
| IC 95% | [-0.006 , 0.373] |
| Decisión | Correlación NO significativa |
tabla comparativa final de ambas correlaciones
comparacion_cor <- data.frame(
Correlacion = c("GLUCB - CINTURA", "GLUCB - TG"),
Coef_r = c(0.322, 0.190),
Fuerza = c("Moderada", "Débil"),
P_value = c(0.0011, 0.0579),
IC_incluye_cero = c("No", "Sí"),
Significativa = c("Sí", "No")
)
kable(comparacion_cor,
col.names = c("Correlación", "Coef. r", "Fuerza", "p-value", "¿IC incluye 0?", "¿Significativa?"),
caption = "Comparación de Correlaciones con Glucosa Basal",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#E8F5E9", color = "#1B5E20", bold = TRUE) %>%
row_spec(2, background = "#FFEBEE", color = "#B71C1C")
| Correlación | Coef. r | Fuerza | p-value | ¿IC incluye 0? | ¿Significativa? |
|---|---|---|---|---|---|
| GLUCB - CINTURA | 0.322 | Moderada | 0.0011 | No | Sí |
| GLUCB - TG | 0.190 | Débil | 0.0579 | Sí | No |
CONCLUSIONES
A lo largo de este taller he desarrollado un modelo de regresión lineal para explorar la relación entre la glucosa basal y dos predictores de riesgo metabólico:
la circunferencia de cintura y los triglicéridos.
Considero que los hallazgos obtenidos tienen implicaciones importantes tanto desde el punto de vista estadístico como clínico.
Hallazgos principales:
Por cada centímetro de incremento en la cintura, la glucosa basal aumenta aproximadamente 0.67 mg/dL. Este hallazgo es consistente con la evidencia científica actual que reconoce la adiposidad visceral como un determinante central de la resistencia insulínica y la disfunción metabólica (Rubino et al., 2025).
Pienso que esto no significa que los triglicéridos carezcan de relevancia clínica, sino que su efecto sobre la glucemia está parcialmente mediado por la adiposidad central.
Limitaciones del modelo:
Considero importante reconocer que el modelo presenta algunas limitaciones, pues el R² de 0.117 indica que solo el 11.7% de la variabilidad de la glucosa basal es explicada por las variables incluidas, lo cual me sugiere que existen otros factores no considerados, además, la validación de supuestos me reveló desviaciones de la normalidad y presencia de autocorrelación en los residuos, por lo que las inferencias debo interpretarlas con atención.
Implicaciones clínicas:
Desde una perspectiva epidemiológica, estos resultados me muestran la importancia de la medición de la circunferencia de cintura como herramienta de tamizaje del riesgo metabólico, por lo que, en concordancia con las recomendaciones de la Comisión Lancet de Diabetes y Endocrinología, la evaluación de la adiposidad central debería ser un componente esencial de la valoración clínica de pacientes con factores de riesgo cardiometabólico.
conclusiones <- data.frame(
Aspecto = c("Mejor predictor",
"Ecuación final",
"Variabilidad explicada",
"TG en modelo múltiple",
"Supuesto de normalidad",
"Supuesto de independencia",
"Correlación más fuerte"),
Resultado = c("Circunferencia de cintura (p = 0.0011)",
"GLUCB = 32.57 + 0.668 × CINTURA",
"R² = 11.7%",
"No significativo (p = 0.229) → No entra",
"No se cumple (K-S: p = 0.006)",
"No se cumple (D-W: p = 0.012)",
"GLUCB - CINTURA (r = 0.32)")
)
kable(conclusiones,
col.names = c("Aspecto Evaluado", "Resultado"),
caption = "Resumen de Conclusiones del Análisis de Regresión",
align = "ll") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
font_size = 14) %>%
row_spec(0, background = "#4A148C", color = "white", bold = TRUE) %>%
row_spec(1, background = "#E8F5E9", color = "#1B5E20", bold = TRUE) %>%
row_spec(2, background = "#E3F2FD") %>%
row_spec(3, background = "#FFF3E0") %>%
row_spec(4, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(5, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(6, background = "#FFEBEE", color = "#B71C1C") %>%
row_spec(7, background = "#E8F5E9", color = "#1B5E20")
| Aspecto Evaluado | Resultado |
|---|---|
| Mejor predictor | Circunferencia de cintura (p = 0.0011) |
| Ecuación final | GLUCB = 32.57 + 0.668 × CINTURA |
| Variabilidad explicada | R² = 11.7% |
| TG en modelo múltiple | No significativo (p = 0.229) → No entra |
| Supuesto de normalidad | No se cumple (K-S: p = 0.006) |
| Supuesto de independencia | No se cumple (D-W: p = 0.012) |
| Correlación más fuerte | GLUCB - CINTURA (r = 0.32) |
Referencias
Rubino, F., Cummings, D. E., Eckel, R. H., Cohen, R. V., Wilding, J. P. H., Brown, W. A., Stanford, F. C., Batterham, R. L., Farooqi, I. S., Farpour-Lambert, N. J., le Roux, C. W., Sattar, N., Baur, L. A., Morrison, K. M., Branca, F., & Mingrone, G. (2025). Definition and diagnostic criteria of clinical obesity. The Lancet Diabetes & Endocrinology, 13*(3), 221-262. https://doi.org/10.1016/S2213-8587(24)00316-4