library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.5.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(dplyr)
library(car)
## Warning: package 'car' was built under R version 4.5.2
## Cargando paquete requerido: carData
## Warning: package 'carData' was built under R version 4.5.2
## 
## Adjuntando el paquete: 'car'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following object is masked from 'package:purrr':
## 
##     some
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.5.2
## Cargando paquete requerido: zoo
## 
## Adjuntando el paquete: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(readxl)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.2
## corrplot 0.95 loaded
cardio_data <- read_excel("cardiovascular_data.xls")

#1. Preparación y exploración de datos.

head(cardio_data)
## # A tibble: 6 × 15
##      id   age sex   bmi   systolic_bp diastolic_bp total_cholesterol hdl   ldl  
##   <dbl> <dbl> <chr> <chr>       <dbl>        <dbl>             <dbl> <chr> <chr>
## 1     1    74 Fema… 21.7          133           84               208 48    135  
## 2     2    47 Male  26.2          125           72               185 61    107  
## 3     3    48 Male  27.6          120           81               212 45    143  
## 4     4    71 Male  25.2          141           86               191 62    105  
## 5     5    41 Male  26.3          122           74               183 53    112  
## 6     6    54 Male  34.7          142           89               191 48    137  
## # ℹ 6 more variables: triglycerides <chr>, glucose <chr>, smoking <dbl>,
## #   physical_activity <chr>, family_history <dbl>, diabetes <dbl>
str(cardio_data)
## tibble [300 × 15] (S3: tbl_df/tbl/data.frame)
##  $ id               : num [1:300] 1 2 3 4 5 6 7 8 9 10 ...
##  $ age              : num [1:300] 74 47 48 71 41 54 90 20 46 69 ...
##  $ sex              : chr [1:300] "Female" "Male" "Male" "Male" ...
##  $ bmi              : chr [1:300] "21.7" "26.2" "27.6" "25.2" ...
##  $ systolic_bp      : num [1:300] 133 125 120 141 122 142 134 132 137 137 ...
##  $ diastolic_bp     : num [1:300] 84 72 81 86 74 89 88 82 80 88 ...
##  $ total_cholesterol: num [1:300] 208 185 212 191 183 191 240 195 193 187 ...
##  $ hdl              : chr [1:300] "48" "61" "45" "62" ...
##  $ ldl              : chr [1:300] "135" "107" "143" "105" ...
##  $ triglycerides    : chr [1:300] "121" "85" "87" "63" ...
##  $ glucose          : chr [1:300] "101" "99" "97" "78" ...
##  $ smoking          : num [1:300] 0 1 0 0 1 0 0 1 0 1 ...
##  $ physical_activity: chr [1:300] "Moderate" "Active" "Very Active" "Moderate" ...
##  $ family_history   : num [1:300] 0 0 0 0 0 0 1 0 0 0 ...
##  $ diabetes         : num [1:300] 1 0 0 0 0 0 0 0 0 1 ...
summary(cardio_data)
##        id              age            sex                bmi           
##  Min.   :  1.00   Min.   :20.00   Length:300         Length:300        
##  1st Qu.: 75.75   1st Qu.:48.00   Class :character   Class :character  
##  Median :150.50   Median :56.00   Mode  :character   Mode  :character  
##  Mean   :150.50   Mean   :56.55                                        
##  3rd Qu.:225.25   3rd Qu.:66.00                                        
##  Max.   :300.00   Max.   :90.00                                        
##   systolic_bp     diastolic_bp    total_cholesterol     hdl           
##  Min.   :103.0   Min.   : 63.00   Min.   :150.0     Length:300        
##  1st Qu.:124.0   1st Qu.: 77.00   1st Qu.:192.0     Class :character  
##  Median :130.0   Median : 83.00   Median :206.0     Mode  :character  
##  Mean   :130.6   Mean   : 83.05   Mean   :207.1                       
##  3rd Qu.:137.0   3rd Qu.: 88.00   3rd Qu.:219.0                       
##  Max.   :164.0   Max.   :106.00   Max.   :273.0                       
##      ldl            triglycerides        glucose             smoking      
##  Length:300         Length:300         Length:300         Min.   :0.0000  
##  Class :character   Class :character   Class :character   1st Qu.:0.0000  
##  Mode  :character   Mode  :character   Mode  :character   Median :0.0000  
##                                                           Mean   :0.4033  
##                                                           3rd Qu.:1.0000  
##                                                           Max.   :1.0000  
##  physical_activity  family_history      diabetes     
##  Length:300         Min.   :0.0000   Min.   :0.0000  
##  Class :character   1st Qu.:0.0000   1st Qu.:0.0000  
##  Mode  :character   Median :0.0000   Median :0.0000  
##                     Mean   :0.3233   Mean   :0.2133  
##                     3rd Qu.:1.0000   3rd Qu.:0.0000  
##                     Max.   :1.0000   Max.   :1.0000
colSums(is.na(cardio_data))
##                id               age               sex               bmi 
##                 0                 0                 0                 0 
##       systolic_bp      diastolic_bp total_cholesterol               hdl 
##                 0                 0                 0                 0 
##               ldl     triglycerides           glucose           smoking 
##                 0                 0                 0                 0 
## physical_activity    family_history          diabetes 
##                 0                 0                 0
cardio_data %>% select(age, systolic_bp, diastolic_bp, bmi, total_cholesterol, hdl, ldl) %>% summary()
##       age         systolic_bp     diastolic_bp        bmi           
##  Min.   :20.00   Min.   :103.0   Min.   : 63.00   Length:300        
##  1st Qu.:48.00   1st Qu.:124.0   1st Qu.: 77.00   Class :character  
##  Median :56.00   Median :130.0   Median : 83.00   Mode  :character  
##  Mean   :56.55   Mean   :130.6   Mean   : 83.05                     
##  3rd Qu.:66.00   3rd Qu.:137.0   3rd Qu.: 88.00                     
##  Max.   :90.00   Max.   :164.0   Max.   :106.00                     
##  total_cholesterol     hdl                ldl           
##  Min.   :150.0     Length:300         Length:300        
##  1st Qu.:192.0     Class :character   Class :character  
##  Median :206.0     Mode  :character   Mode  :character  
##  Mean   :207.1                                          
##  3rd Qu.:219.0                                          
##  Max.   :273.0

Descripción de forma resumida la base de datos: Esta base de datos se basó en el análisis del riesgo cardiovascular de 300 personas, de las cuales se obtuvo información clinica, de su estilo de vida (actividad física y si fuma o no) y sobre sus antecedentes familiares.

#Creación de nuevas variables: hypertension y bmi_category.
cardio_data <- cardio_data %>% mutate(hypertension = ifelse(systolic_bp >= 140 | diastolic_bp >= 90, 1, 0), bmi_category = case_when(bmi < 18.5 ~ "Bajo peso", bmi >= 18.5 & bmi < 25 ~ "Normal", bmi >= 25 & bmi < 30 ~ "Sobrepeso", bmi >= 30 ~ "Obesidad"))

Interpretación de las nuevas variables: hypertension y bmi_category. Las nuevas variables creadas permiten clasifícar respecto a los datos si el paciente cumple con los criterios de presión arterial elevada (hipertensión) mientras que la otra variable clasifíca al paciente en una de las cuatro categorías de peso basadas en el IMC (bmi_category).

#2. Estimación puntual de parametros poblacionales. a) Estimación de la presión arterial media y desviación estándar:

#Estimación de la presión arterial sistólica
systolic_mean <- mean(cardio_data$systolic_bp)
systolic_sd <- sd(cardio_data$systolic_bp)
systolic_median <- median(cardio_data$systolic_bp)

Resultados. El promedio de la presión sistólica es de 130.56mmHg, la mediana es de 130mmHg, la desviación estándar es de 10.68mmHg.

#Estimación de la presión arterial diastólica
diastolic_mean <- mean(cardio_data$diastolic_bp)
diastolic_sd <- sd(cardio_data$diastolic_bp)
diastolic_median <- median(cardio_data$diastolic_bp)

Resultados. El promedio de la presión diastólica es de 83.053mmHg, la mediana es de 83mmHg y la desviación estándar es de 8.56mmHg.

# Resultados
bp_estimates <- data.frame(Parameter = c("Sistólica - Media", "Sistólica - DE", "Sistólica - Mediana", "Diastólica - Media", "Diastólica - DE", "Diastólica - Mediana"), Value = c(systolic_mean, systolic_sd, systolic_median, diastolic_mean, diastolic_sd, diastolic_median))
print(bp_estimates)
##              Parameter      Value
## 1    Sistólica - Media 130.563333
## 2       Sistólica - DE  10.688004
## 3  Sistólica - Mediana 130.000000
## 4   Diastólica - Media  83.053333
## 5      Diastólica - DE   8.565144
## 6 Diastólica - Mediana  83.000000

¿Los datos se encuentran en valores normales? Los valores no se encuentran normales ya que una presión arterial sistólica normal es igual o menor a 120mmHg y la presión arterial diastólica normal es igual a 80mmHg y en esta muestra se ve que la media de la presión arterial sistólica es de 130,56 y de la diastólica es de 83,05 lo cual nos indíca una Hipertensión Arterial Etapa 1. Lo que sugiere que la población estudiada tiene un riesgo cardiovascular.

  1. Estimación de la proporción de personas con hipertensión:
# Prevalencia de hipertensión
hypertension_prev <- mean(cardio_data$hypertension)
# Por sexo
hypertension_by_sex <- cardio_data %>% group_by(sex) %>% summarise(prevalence = mean(hypertension), count = n())
 
# Por grupo de edad
cardio_data <- cardio_data %>% mutate(age_group = cut(age, breaks = c(20, 40, 60, 80, 100), labels = c("20-39", "40-59", "60-79", "80+")))
 
hypertension_by_age <- cardio_data %>% group_by(age_group) %>% summarise(prevalence = mean(hypertension), count = n())
 
print(hypertension_prev)
## [1] 0.28
print(hypertension_by_sex)
## # A tibble: 2 × 3
##   sex    prevalence count
##   <chr>       <dbl> <int>
## 1 Female      0.246   175
## 2 Male        0.328   125
print(hypertension_by_age)
## # A tibble: 5 × 3
##   age_group prevalence count
##   <fct>          <dbl> <int>
## 1 20-39          0.105    38
## 2 40-59          0.119   143
## 3 60-79          0.495    95
## 4 80+            0.789    19
## 5 <NA>           0.2       5

Descripción de la prevalencia. La prevalencia de hipertensión de esta muestra es de un 28%, los hombres tienen un porcentaje de 32,8% y las mujeres de 24,6%. El grupo etario con mayor prevalencia son las personas con 80 o más años con un 78,9% de prevalencia.

¿Estos resultados son comparables a nuestra realidad nacional? Estos resultados si son comparables con la realidad chilena, ya que se observa una mayor frecuencia en hombres que mujeres y una prevalencia general del 28% que coincide con el reportado para la población nacional. Los datos de la Encuesta Nacional de Salud de Chile se ven reflejados en esta muestra. #3. Cálculo de intervalos de confianza a) Intervalos de confianza para medias:

# Función para calcular IC 95% para la media
calculate_ci <- function(x) {n <- length(x)
error <- qt(0.975, df = n-1) * sd(x) / sqrt(n)
ci_lower <- mean(x) - error
ci_upper <- mean(x) + error
return(c(mean = mean(x), ci_lower = ci_lower, ci_upper = ci_upper))}
 
# IC para presión sistólica
systolic_ci <- calculate_ci(cardio_data$systolic_bp)
 
# IC para presión diastólica
diastolic_ci <- calculate_ci(cardio_data$diastolic_bp)
 
# IC para IMC
bmi_ci <- calculate_ci(cardio_data$bmi)
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
bmi_ci <- calculate_ci(cardio_data$bmi)
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
# Resultados
ci_results <- data.frame(
  Parameter = c("Presión Sistólica", "Presión Diastólica", "IMC"),
  Mean = c(systolic_ci[1], diastolic_ci[1], bmi_ci[1]),
  Lower_CI = c(systolic_ci[2], diastolic_ci[2], bmi_ci[2]),
  Upper_CI = c(systolic_ci[3], diastolic_ci[3], bmi_ci[3]))
 
print(ci_results)
##            Parameter      Mean  Lower_CI  Upper_CI
## 1  Presión Sistólica 130.56333 129.34898 131.77769
## 2 Presión Diastólica  83.05333  82.08017  84.02649
## 3                IMC        NA        NA        NA
#Convertir variable de character a numérica
cardio_data$bmi2 <- as.numeric(cardio_data$bmi)
# IC para presión sistólica
systolic_ci <- calculate_ci(cardio_data$systolic_bp)
 
# IC para presión diastólica
diastolic_ci <- calculate_ci(cardio_data$diastolic_bp)
# IC para IMC
bmi_ci <- calculate_ci(cardio_data$bmi)
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
bmi_ci <- calculate_ci(cardio_data$bmi)
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## Warning in mean.default(x): argument is not numeric or logical: returning NA
# Resultados
ci_results <- data.frame(Parameter = c("Presión Sistólica", "Presión Diastólica", "IMC"), Mean = c(systolic_ci[1], diastolic_ci[1], bmi_ci[1]), Lower_CI = c(systolic_ci[2], diastolic_ci[2], bmi_ci[2]), Upper_CI = c(systolic_ci[3], diastolic_ci[3], bmi_ci[3]))
 
print(ci_results)
##            Parameter      Mean  Lower_CI  Upper_CI
## 1  Presión Sistólica 130.56333 129.34898 131.77769
## 2 Presión Diastólica  83.05333  82.08017  84.02649
## 3                IMC        NA        NA        NA
  1. Intervalos de confianza para proporciones:
# Función para calcular IC 95% para proporciones
prop_ci <- function(successes, n) {prop <- successes/n 
error <- qnorm(0.975) * sqrt(prop*(1-prop)/n)
ci_lower <- prop - error
ci_upper <- prop + error
return(c(proportion = prop, ci_lower = ci_lower, ci_upper = ci_upper))}
 
# IC para prevalencia de hipertensión
ht_count <- sum(cardio_data$hypertension)
total_count <- nrow(cardio_data)
hypertension_ci <- prop_ci(ht_count, total_count)
 
# Mostrar resultados
hypertension_ci_result <- data.frame(Parameter = "Prevalencia Hipertensión", Proportion = hypertension_ci[1], Lower_CI = hypertension_ci[2], Upper_CI = hypertension_ci[3])
 
print(hypertension_ci_result)
##                           Parameter Proportion  Lower_CI  Upper_CI
## proportion Prevalencia Hipertensión       0.28 0.2291919 0.3308081
#BONUS: desarrollen e interpreten el siguiente gráfico 
# Visualizar IC para medias
ggplot(ci_results, aes(x = Parameter, y = Mean)) + geom_point(size = 3) + geom_errorbar(aes(ymin = Lower_CI, ymax = Upper_CI), width = 0.2) + theme_minimal() + labs(title = "Intervalos de confianza 95% para parámetros cardiovasculares", y = "Valor", x = "") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

Describan e interpreten la prevalencia de hipertensión. Comparen con datos en Chile. #4. Regresión lineal simple a) Análisis de correlacion entre IMC y presión arterial:

# Coeficiente de correlación
cor_bmi_sys <- cor(cardio_data$bmi2, cardio_data$systolic_bp)
 
# Gráfico de dispersión
ggplot(cardio_data, aes(x = bmi2, y = systolic_bp)) + geom_point(alpha = 0.5) + geom_smooth(method = "lm", color = "blue") + theme_minimal() + labs(title = paste("Correlación entre IMC y Presión Sistólica (r =", round(cor_bmi_sys, 3), ")"), x = "Índice de Masa Corporal (kg/m²)", y = "Presión Arterial Sistólica (mmHg)")
## `geom_smooth()` using formula = 'y ~ x'

Interpreten el gráfico. b) Ajuste del modelo de regresión lineal simple;

# Modelo de regresión IMC vs. Presión Sistólica
model_bmi_sys <- lm(systolic_bp ~ bmi2, data = cardio_data)
 
# Resumen del modelo
summary_model <- summary(model_bmi_sys)
print(summary_model)
## 
## Call:
## lm(formula = systolic_bp ~ bmi2, data = cardio_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -25.1602  -5.6540  -0.6566   6.7064  28.7830 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 102.7089     3.1098  33.028   <2e-16 ***
## bmi2          1.0320     0.1134   9.099   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.471 on 298 degrees of freedom
## Multiple R-squared:  0.2174, Adjusted R-squared:  0.2148 
## F-statistic: 82.79 on 1 and 298 DF,  p-value: < 2.2e-16
# Extraer coeficientes
intercept <- coef(model_bmi_sys)[1]
slope <- coef(model_bmi_sys)[2]
 
# Ecuación de regresión
equation <- paste("Presión Sistólica =", round(intercept, 2), "+", round(slope, 2), "× IMC")
 
print(equation)
## [1] "Presión Sistólica = 102.71 + 1.03 × IMC"

Interpreten la ecuación lineal. c) Interpretación del modelo:

# R² y significancia
r_squared <- summary_model$r.squared
p_value <- summary_model$coefficients[2,4]
 
# Interpretación clínica
bmi_effect <- paste("Por cada unidad de aumento en el IMC, la presión sistólica cambia en promedio", round(slope, 2), "mmHg (p =", round(p_value, 4), ")")
 
variance_explained <- paste("El modelo explica el", round(r_squared*100, 1), "% de la variabilidad en la presión sistólica")
 
print(bmi_effect)
## [1] "Por cada unidad de aumento en el IMC, la presión sistólica cambia en promedio 1.03 mmHg (p = 0 )"
print(variance_explained)
## [1] "El modelo explica el 21.7 % de la variabilidad en la presión sistólica"

Interpreten el valor de R^2 y la variabilidad explicada por el modelo. Reflexionen sibre otras variabnles que podrían incorporar en el modelo, para mejorar el ajuste. Justifiquen con referencias. #5. Regresión lineal múltiple a) Exploración de predictores adicionales:

# Matriz de correlación
cardio_data$hdl2 <- as.numeric(cardio_data$hdl)
## Warning: NAs introducidos por coerción
cardio_data$ldl2 <- as.numeric(cardio_data$ldl)
## Warning: NAs introducidos por coerción
 cor_matrix <- cor(cardio_data %>% select(systolic_bp, age, bmi2, total_cholesterol, hdl2, ldl2))
print(round(cor_matrix, 3))
##                   systolic_bp   age  bmi2 total_cholesterol hdl2 ldl2
## systolic_bp             1.000 0.530 0.466             0.367   NA   NA
## age                     0.530 1.000 0.149             0.301   NA   NA
## bmi2                    0.466 0.149 1.000             0.299   NA   NA
## total_cholesterol       0.367 0.301 0.299             1.000   NA   NA
## hdl2                       NA    NA    NA                NA    1   NA
## ldl2                       NA    NA    NA                NA   NA    1
# Visualización de correlaciones
corrplot(cor_matrix, method = "circle", type = "upper", tl.col = "black", tl.srt = 45)

Interpreten el gráfico de correlación. b) Ajuste del modelo multivariado:

# Modelo de regresión múltiple
model_multi <- lm(systolic_bp ~ age + bmi2 + total_cholesterol + sex, data = cardio_data)
 
# Resumen del modelo
summary_multi <- summary(model_multi)
print(summary_multi)
## 
## Call:
## lm(formula = systolic_bp ~ age + bmi2 + total_cholesterol + sex, 
##     data = cardio_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -23.2020  -4.8150   0.5455   5.2892  22.4699 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       74.91779    4.56177  16.423  < 2e-16 ***
## age                0.32096    0.03215   9.984  < 2e-16 ***
## bmi2               0.76382    0.09813   7.784 1.20e-13 ***
## total_cholesterol  0.07371    0.02264   3.256  0.00126 ** 
## sexMale            3.86748    0.91884   4.209 3.41e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.766 on 295 degrees of freedom
## Multiple R-squared:  0.4791, Adjusted R-squared:  0.472 
## F-statistic: 67.83 on 4 and 295 DF,  p-value: < 2.2e-16
# Comparación con modelo simple
anova(model_bmi_sys, model_multi)
## Analysis of Variance Table
## 
## Model 1: systolic_bp ~ bmi2
## Model 2: systolic_bp ~ age + bmi2 + total_cholesterol + sex
##   Res.Df   RSS Df Sum of Sq      F    Pr(>F)    
## 1    298 26730                                  
## 2    295 17793  3    8937.4 49.394 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Intenten interpretar la salida anterior. ¿Qué modelos estamos utilizando? ¿Se modificó el R^2? ¿Es mejor este ajuste que el modelo simple? c) Verificación de supuestos:

# Normalidad de residuos
shapiro.test(residuals(model_multi))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model_multi)
## W = 0.99557, p-value = 0.5541
# Homogeneidad de varianzas
ncvTest(model_multi)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 0.1349669, Df = 1, p = 0.71334
# Independencia de residuos
dwtest(model_multi)
## 
##  Durbin-Watson test
## 
## data:  model_multi
## DW = 2.1239, p-value = 0.858
## alternative hypothesis: true autocorrelation is greater than 0
# Gráficos diagnóstico
par(mfrow = c(2, 2))
plot(model_multi)

par(mfrow = c(1, 1))

¿Se confirman algunos de los supuestos para realizar modelo de regresión lineal? d) Interpretación del moedleo ajustado:

# Coeficientes y significancia
coef_table <- round(summary_multi$coefficients, 3)
 
# R² ajustado
adj_r_squared <- summary_multi$adj.r.squared
 
# Interpretación clínica de cada coeficiente
age_effect <- paste("Efecto de la edad: Por cada año adicional, la presión sistólica cambia en promedio", coef_table[2,1], "mmHg (p =", coef_table[2,4], ")")
 
bmi_effect_adj <- paste("Efecto del IMC (ajustado): Por cada unidad de aumento en el IMC, la presión sistólica cambia en promedio", coef_table[3,1], "mmHg (p =", coef_table[3,4], ")")
 
chol_effect <- paste("Efecto del colesterol total: Por cada mg/dL adicional, la presión sistólica cambia en promedio", coef_table[4,1], "mmHg (p =", coef_table[4,4], ")")
 
sex_effect <- paste("Efecto del sexo: La diferencia promedio en presión sistólica entre hombres y mujeres es de", coef_table[5,1], "mmHg (p =", coef_table[5,4], ")")
 
model_quality <- paste("El modelo ajustado explica el", round(adj_r_squared*100, 1), "% de la variabilidad en la presión sistólica")
 
# Imprimir interpretaciones
cat(age_effect, "\n")
## Efecto de la edad: Por cada año adicional, la presión sistólica cambia en promedio 0.321 mmHg (p = 0 )
cat(bmi_effect_adj, "\n")
## Efecto del IMC (ajustado): Por cada unidad de aumento en el IMC, la presión sistólica cambia en promedio 0.764 mmHg (p = 0 )
cat(chol_effect, "\n")
## Efecto del colesterol total: Por cada mg/dL adicional, la presión sistólica cambia en promedio 0.074 mmHg (p = 0.001 )
cat(sex_effect, "\n")
## Efecto del sexo: La diferencia promedio en presión sistólica entre hombres y mujeres es de 3.867 mmHg (p = 0 )
cat(model_quality, "\n")
## El modelo ajustado explica el 47.2 % de la variabilidad en la presión sistólica

Expliquen las interpretaciones anterioress en el contexto clínico. ¿Son coherentes los resultados con la clínica? Pueden usar referencias para justificar.