library(readr)
library(tableone)
library(knitr)
library(kableExtra)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tibble)
library(survival)
library(broom)
library(mice)
## 
## Adjuntando el paquete: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind

Tabla 2

Tabla 2

# Cargar los datos
data = read_csv("C:\\Users\\gio73\\Documents\\Tesis\\Rmarkdown\\Framingham\\framingham_dataset.csv") 
## New names:
## Rows: 11627 Columns: 40
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," dbl
## (40): ...1, randid, sex, totchol, age, sysbp, diabp, cursmoke, cigpday, ...
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
# Diccionario de nombres traducidos
diccionario <- c(
  sex = "Sexo",
  age = "Edad",
  totchol = "Colesterol total (mg/dL)",
  sysbp = "Presión sistólica (mm Hg)",
  diabp = "Presión diastólica (mm Hg)",
  bmi = "Índice de masa corporal (kg/m²)",
  glucose = "Glucosa en ayunas (mg/dL)",
  heartrte = "Frecuencia cardíaca (lpm)",
  hdlc = "Colesterol HDL (mg/dL)",
  ldlc = "Colesterol LDL (mg/dL)",
  cigpday = "Cigarrillos por día"
)

# Generar vector completo con nombres nuevos
nombres_originales = names(data)
nombres_nuevos = sapply(nombres_originales, function(nombre) {
  if (nombre %in% names(diccionario)) {
    diccionario[[nombre]]
  } else {
    nombre  # para conservar nombre original si no está en diccionario
  }
})

# Asignar los nuevos nombres
names(data) = nombres_nuevos

# Eliminar columnas solo si existen
cols_quitar <- c("Unnamed: 0", "randid")
cols_quitar <- cols_quitar[cols_quitar %in% colnames(data)]
data <- data[, !(colnames(data) %in% cols_quitar)]

# Variables continuas
vars_clinicas <- c("Colesterol total (mg/dL)", "Presión sistólica (mm Hg)",
                   "Presión diastólica (mm Hg)", "Índice de masa corporal (kg/m²)",
                   "Glucosa en ayunas (mg/dL)", "Frecuencia cardíaca (lpm)",
                   "Colesterol HDL (mg/dL)", "Colesterol LDL (mg/dL)",
                   "Cigarrillos por día")

# Definir variable de exposición
total_data <- data  
var_exposicion <- "Colesterol total (mg/dL)"

# Lista para resultados
resultados <- list()

# Regresión lineal para variables continuas
for (var in vars_clinicas) {
  if (var != var_exposicion) {
    df <- total_data %>% select(all_of(var), all_of(var_exposicion)) %>% na.omit()
    if (nrow(df) >= 10) {
      modelo <- lm(as.formula(paste0("`", var, "` ~ `", var_exposicion, "`")), data = df)
      resumen <- tidy(modelo, conf.int = TRUE)
      beta <- resumen[2, ]

      resultados[[var]] <- tibble(
        Variable = var,
        Beta = round(beta$estimate, 3),
        `IC 95% Inferior` = round(beta$conf.low, 3),
        `IC 95% Superior` = round(beta$conf.high, 3),
        `Valor p` = as.character(
          ifelse(beta$p.value < 0.0001, "<0.0001", round(beta$p.value, 4))
        ),
        n = nrow(df)
      )
    }
  }
}

# Unir resultados
tabla2 <- bind_rows(resultados)

# Mostrar con kableExtra
tabla2 %>%
  kable(format = "html", caption = "Tabla 2 usando Colesterol total (mg/dL)") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, position = "center")
Tabla 2 usando Colesterol total (mg/dL)
Variable Beta IC 95% Inferior IC 95% Superior Valor p n
Presión sistólica (mm Hg) 0.075 0.066 0.084 <0.0001 11218
Presión diastólica (mm Hg) 0.033 0.029 0.038 <0.0001 11218
Índice de masa corporal (kg/m²) 0.007 0.006 0.009 <0.0001 11173
Glucosa en ayunas (mg/dL) -0.001 -0.012 0.010 0.8372 10054
Frecuencia cardíaca (lpm) 0.022 0.017 0.027 <0.0001 11214
Colesterol HDL (mg/dL) 0.062 0.050 0.074 <0.0001 3027
Colesterol LDL (mg/dL) 0.903 0.884 0.923 <0.0001 3026
Cigarrillos por día -0.009 -0.014 -0.004 4e-04 11143

Tabla 2 ajustada por edad y sexo

# Lista para resultados ajustados
resultados_ajustados <- list()

# Regresión lineal ajustada por edad y sexo
for (var in vars_clinicas) {
  if (var != var_exposicion) {
    df <- total_data %>%
      select(all_of(var), all_of(var_exposicion), Edad, Sexo) %>%
      na.omit()

    if (nrow(df) >= 10) {
      modelo <- lm(as.formula(paste0("`", var, "` ~ `", var_exposicion, "` + Edad + Sexo")), data = df)
      resumen <- tidy(modelo, conf.int = TRUE)
      beta <- resumen[resumen$term == paste0("`", var_exposicion, "`"), ]

      resultados_ajustados[[var]] <- tibble(
        Variable = var,
        Beta = round(beta$estimate, 3),
        `IC 95% Inferior` = round(beta$conf.low, 3),
        `IC 95% Superior` = round(beta$conf.high, 3),
        `Valor p` = as.character(ifelse(beta$p.value < 0.0001, "<0.0001", round(beta$p.value, 4))),
        n = nrow(df)
      )
    }
  }
}

# Unir resultados
tabla2_ajustada <- bind_rows(resultados_ajustados)

# Mostrar tabla ajustada
tabla2_ajustada %>%
  kable(format = "html", caption = "Tabla 2 Ajustada: usando Colesterol total (mg/dL)") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, position = "center")
Tabla 2 Ajustada: usando Colesterol total (mg/dL)
Variable Beta IC 95% Inferior IC 95% Superior Valor p n
Presión sistólica (mm Hg) 0.046 0.037 0.054 <0.0001 11218
Presión diastólica (mm Hg) 0.034 0.029 0.039 <0.0001 11218
Índice de masa corporal (kg/m²) 0.008 0.006 0.009 <0.0001 11173
Glucosa en ayunas (mg/dL) -0.013 -0.024 -0.003 0.0152 10054
Frecuencia cardíaca (lpm) 0.018 0.013 0.023 <0.0001 11214
Colesterol HDL (mg/dL) 0.040 0.028 0.052 <0.0001 3027
Colesterol LDL (mg/dL) 0.924 0.904 0.943 <0.0001 3026
Cigarrillos por día 0.009 0.004 0.014 3e-04 11143

Tabla 2 (MICE)

Tabla 2

data = read_csv("C:\\Users\\gio73\\Documents\\Tesis\\Rmarkdown\\Framingham\\framingham_dataset.csv") 
## New names:
## Rows: 11627 Columns: 40
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," dbl
## (40): ...1, randid, sex, totchol, age, sysbp, diabp, cursmoke, cigpday, ...
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
# Diccionario de nombres traducidos
diccionario <- c(
  sex = "Sexo",
  age = "Edad",
  totchol = "Colesterol total (mg/dL)",
  sysbp = "Presión sistólica (mm Hg)",
  diabp = "Presión diastólica (mm Hg)",
  bmi = "Índice de masa corporal (kg/m²)",
  glucose = "Glucosa en ayunas (mg/dL)",
  heartrte = "Frecuencia cardíaca (lpm)",
  hdlc = "Colesterol HDL (mg/dL)",
  ldlc = "Colesterol LDL (mg/dL)",
  cigpday = "Cigarrillos por día"
)

# Generar vector completo con nombres nuevos
nombres_originales = names(data)
nombres_nuevos = sapply(nombres_originales, function(nombre) {
  if (nombre %in% names(diccionario)) {
    diccionario[[nombre]]
  } else {
    nombre  # para conservar nombre original si no está en diccionario
  }
})

# Asignar los nuevos nombres
names(data) = nombres_nuevos

# Eliminar columnas solo si existen
cols_quitar <- c("Unnamed: 0", "randid")
cols_quitar <- cols_quitar[cols_quitar %in% colnames(data)]
data <- data[, !(colnames(data) %in% cols_quitar)]

# Definir variables a analizar
vars_clinicas <- c("Colesterol total (mg/dL)", "Presión sistólica (mm Hg)",
                   "Presión diastólica (mm Hg)", "Índice de masa corporal (kg/m²)",
                   "Glucosa en ayunas (mg/dL)", "Frecuencia cardíaca (lpm)",
                   "Colesterol HDL (mg/dL)", "Colesterol LDL (mg/dL)",
                   "Cigarrillos por día")

var_exposicion <- "Colesterol total (mg/dL)"

# Variables para imputar
subset_vars <- unique(c(vars_clinicas, "Edad", "Sexo"))

# Fijar semilla para reproducibilidad
set.seed(123)

# Ejecutar MICE con 1 imputación (m = 1) para análisis simple
imp <- mice(data[, subset_vars], m = 1, method = "pmm", maxit = 10, seed = 123)
## 
##  iter imp variable
##   1   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   2   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   3   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   4   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   5   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   6   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   7   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   8   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   9   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
##   10   1  Colesterol total (mg/dL)  Índice de masa corporal (kg/m²)  Glucosa en ayunas (mg/dL)  Frecuencia cardíaca (lpm)  Colesterol HDL (mg/dL)  Colesterol LDL (mg/dL)  Cigarrillos por día
# Extraer datos imputados completos
data_imputada <- complete(imp, 1)
data_imputada$`Sexo` <- factor(data_imputada$`Sexo`, levels = c(1, 2), labels = c("Hombre", "Mujer"))

resultados <- list()

for (var in vars_clinicas) {
  if (var != var_exposicion) {
    df <- data_imputada %>% select(all_of(var), all_of(var_exposicion))
    modelo <- lm(as.formula(paste0("`", var, "` ~ `", var_exposicion, "`")), data = df)
    resumen <- tidy(modelo, conf.int = TRUE)
    beta <- resumen[2, ]

    resultados[[var]] <- tibble(
      Variable = var,
      Beta = round(beta$estimate, 3),
      `IC 95% Inferior` = round(beta$conf.low, 3),
      `IC 95% Superior` = round(beta$conf.high, 3),
      `Valor p` = as.character(ifelse(beta$p.value < 0.0001, "<0.0001", round(beta$p.value, 4))),
      n = nrow(df)
    )
  }
}

tabla2_mice <- bind_rows(resultados)

tabla2_mice %>%
  kable(format = "html", caption = "Tabla 2 (MICE): usando Colesterol total (mg/dL)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 2 (MICE): usando Colesterol total (mg/dL)
Variable Beta IC 95% Inferior IC 95% Superior Valor p n
Presión sistólica (mm Hg) 0.075 0.066 0.084 <0.0001 11627
Presión diastólica (mm Hg) 0.033 0.029 0.038 <0.0001 11627
Índice de masa corporal (kg/m²) 0.007 0.006 0.009 <0.0001 11627
Glucosa en ayunas (mg/dL) -0.002 -0.013 0.008 0.6497 11627
Frecuencia cardíaca (lpm) 0.022 0.017 0.027 <0.0001 11627
Colesterol HDL (mg/dL) 0.044 0.038 0.050 <0.0001 11627
Colesterol LDL (mg/dL) 0.896 0.886 0.906 <0.0001 11627
Cigarrillos por día -0.009 -0.014 -0.004 2e-04 11627

Tabla 2 ajustada por edad y sexo

for (var in vars_clinicas) {
  if (var != var_exposicion) {
    df <- data_imputada %>% select(all_of(var), all_of(var_exposicion), Edad, Sexo)
    modelo <- lm(as.formula(paste0("`", var, "` ~ `", var_exposicion, "` + Edad + Sexo")), data = df)
    resumen <- tidy(modelo, conf.int = TRUE)
    beta <- resumen[resumen$term == paste0("`", var_exposicion, "`"), ]

    resultados_ajustados[[var]] <- tibble(
      Variable = var,
      Beta = round(beta$estimate, 3),
      `IC 95% Inferior` = round(beta$conf.low, 3),
      `IC 95% Superior` = round(beta$conf.high, 3),
      `Valor p` = as.character(ifelse(beta$p.value < 0.0001, "<0.0001", round(beta$p.value, 4))),
      n = nrow(df)
    )
  }
}

tabla2_mice_ajustada <- bind_rows(resultados_ajustados)

tabla2_mice_ajustada %>%
  kable(format = "html", caption = "Tabla 2 Ajustada (MICE): usando Colesterol total (mg/dL)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 2 Ajustada (MICE): usando Colesterol total (mg/dL)
Variable Beta IC 95% Inferior IC 95% Superior Valor p n
Presión sistólica (mm Hg) 0.045 0.036 0.054 <0.0001 11627
Presión diastólica (mm Hg) 0.034 0.029 0.038 <0.0001 11627
Índice de masa corporal (kg/m²) 0.008 0.006 0.009 <0.0001 11627
Glucosa en ayunas (mg/dL) -0.014 -0.025 -0.004 0.0063 11627
Frecuencia cardíaca (lpm) 0.018 0.013 0.023 <0.0001 11627
Colesterol HDL (mg/dL) 0.030 0.025 0.036 <0.0001 11627
Colesterol LDL (mg/dL) 0.913 0.903 0.924 <0.0001 11627
Cigarrillos por día 0.009 0.004 0.013 3e-04 11627