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 3

Tabla 3

# 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",
  age_group = "Edad categorizada",
  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",
  cursmoke = "Fumador actual",
  diabetes = "Diabetes diagnosticada",
  bpmeds = "Uso de medicación para presión",
  prevhyp = "Hipertensión previa",
  prevchd = "CHD previa",
  prevap = "Angina previa",
  prevmi = "Infarto previo",
  prevstrk = "ACV previo",
  death = "Fallecido",
  angina = "Angina incidente",
  hospmi = "Infarto hospitalizado",
  mi_fchd = "Infarto por CHD",
  anychd = "Alguna CHD",
  stroke = "ACV incidente",
  hyperten = "Hipertensión desarrollada",
  timeap = "Tiempo hasta angina",
  timemi = "Tiempo hasta infarto",
  timemifc = "Tiempo hasta infarto clínico",
  timechd = "Tiempo hasta CHD",
  timestrk = "Tiempo hasta ACV",
  timecvd = "Tiempo hasta CVD",
  timedth = "Tiempo hasta muerte",
  timehyp = "Tiempo hasta hipertensión",
  cvd = "CVD"
)

# 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 el 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 eventos y su tiempo asociado
eventos <- c(
  "Tiempo hasta angina" = "Angina incidente",
  "Tiempo hasta infarto" = "Infarto hospitalizado",
  "Tiempo hasta infarto clínico" = "Infarto por CHD",
  "Tiempo hasta CHD" = "Alguna CHD",
  "Tiempo hasta ACV" = "ACV incidente",
  "Tiempo hasta CVD" = "CVD",
  "Tiempo hasta muerte" = "Fallecido",
  "Tiempo hasta hipertensión" = "Hipertensión desarrollada"
)

# Asegurarse que todos los eventos estén codificados como 0 y 1
for (evento in eventos) {
  data[[evento]] <- ifelse(data[[evento]] == "Sí", 1,
                           ifelse(data[[evento]] == "No", 0, data[[evento]]))
}

# Guardar resultados
resultados_cox <- list()
var_exposicion <- "Colesterol total (mg/dL)"

for (tiempo in names(eventos)) {
  evento <- eventos[[tiempo]]

  df <- data %>%
    select(all_of(tiempo), all_of(evento), all_of(var_exposicion)) %>%
    filter(!is.na(.data[[tiempo]]) & !is.na(.data[[evento]]) & !is.na(.data[[var_exposicion]]))

  # Verificar condiciones mínimas
  if (nrow(df) >= 10 && length(unique(df[[evento]])) == 2) {
    formula <- as.formula(paste0("Surv(`", tiempo, "`, `", evento, "`) ~ `", var_exposicion, "`"))
    modelo <- tryCatch(coxph(formula, data = df), error = function(e) NULL)

    if (!is.null(modelo)) {
      resumen <- summary(modelo)
      beta <- resumen$coefficients[1, ]
      conf <- resumen$conf.int[1, ]

      resultados_cox[[tiempo]] <- tibble(
        `Variable de tiempo` = tiempo,
        Evento = evento,
        HR = round(conf["exp(coef)"], 3),
        `IC 95% Inferior` = round(conf["lower .95"], 3),
        `IC 95% Superior` = round(conf["upper .95"], 3),
        `Valor p` = as.character(
          ifelse(beta["Pr(>|z|)"] < 0.0001, "<0.0001", round(beta["Pr(>|z|)"], 4))
        ),
        n = nrow(df)
      )
    }
  }
}

# Combinar resultados
tabla3_cox <- bind_rows(resultados_cox)

# Mostrar tabla
tabla3_cox %>%
  kable(format = "html", caption = "Tabla 3: Regresión de Cox para Colesterol total (mg/dL)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 3: Regresión de Cox para Colesterol total (mg/dL)
Variable de tiempo Evento HR IC 95% Inferior IC 95% Superior Valor p n
Tiempo hasta angina Angina incidente 1.005 1.004 1.006 <0.0001 11218
Tiempo hasta infarto Infarto hospitalizado 1.006 1.004 1.007 <0.0001 11218
Tiempo hasta infarto clínico Infarto por CHD 1.005 1.004 1.006 <0.0001 11218
Tiempo hasta CHD Alguna CHD 1.005 1.004 1.005 <0.0001 11218
Tiempo hasta ACV ACV incidente 1.001 1.000 1.002 0.1252 11218
Tiempo hasta CVD CVD 1.003 1.003 1.004 <0.0001 11218
Tiempo hasta muerte Fallecido 1.001 1.001 1.002 3e-04 11218
Tiempo hasta hipertensión Hipertensión desarrollada 1.003 1.003 1.004 <0.0001 11218

Tabla 3 ajustada

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",
  age_group = "Edad categorizada",
  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",
  cursmoke = "Fumador actual",
  diabetes = "Diabetes diagnosticada",
  bpmeds = "Uso de medicación para presión",
  prevhyp = "Hipertensión previa",
  prevchd = "CHD previa",
  prevap = "Angina previa",
  prevmi = "Infarto previo",
  prevstrk = "ACV previo",
  death = "Fallecido",
  angina = "Angina incidente",
  hospmi = "Infarto hospitalizado",
  mi_fchd = "Infarto por CHD",
  anychd = "Alguna CHD",
  stroke = "ACV incidente",
  hyperten = "Hipertensión desarrollada",
  timeap = "Tiempo hasta angina",
  timemi = "Tiempo hasta infarto",
  timemifc = "Tiempo hasta infarto clínico",
  timechd = "Tiempo hasta CHD",
  timestrk = "Tiempo hasta ACV",
  timecvd = "Tiempo hasta CVD",
  timedth = "Tiempo hasta muerte",
  timehyp = "Tiempo hasta hipertensión",
  cvd = "CVD"
)

# 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 el 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)]

# Asegurarse de que Sexo esté codificado como factor (Hombre/Mujer)
if (!is.factor(data$Sexo)) {
  data$Sexo <- factor(data$Sexo, levels = c(1, 2), labels = c("Hombre", "Mujer"))
}

# Asegurarse que eventos estén codificados como 0/1
eventos <- c(
  "Tiempo hasta angina" = "Angina incidente",
  "Tiempo hasta infarto" = "Infarto hospitalizado",
  "Tiempo hasta infarto clínico" = "Infarto por CHD",
  "Tiempo hasta CHD" = "Alguna CHD",
  "Tiempo hasta ACV" = "ACV incidente",
  "Tiempo hasta CVD" = "CVD",
  "Tiempo hasta muerte" = "Fallecido",
  "Tiempo hasta hipertensión" = "Hipertensión desarrollada"
)

for (evento in eventos) {
  data[[evento]] <- ifelse(data[[evento]] == "Sí", 1,
                           ifelse(data[[evento]] == "No", 0, data[[evento]]))
}

# Variable de exposición
var_exposicion <- "Colesterol total (mg/dL)"

# Ejecutar regresiones ajustadas
resultados_ajustados <- list()

for (tiempo in names(eventos)) {
  evento <- eventos[[tiempo]]

  df <- data %>%
    select(all_of(tiempo), all_of(evento), all_of(var_exposicion), Edad, Sexo) %>%
    filter(!is.na(.data[[tiempo]]) & !is.na(.data[[evento]]) &
           !is.na(.data[[var_exposicion]]) & !is.na(Edad) & !is.na(Sexo))

  if (nrow(df) >= 10 && length(unique(df[[evento]])) == 2) {
    formula <- as.formula(paste0("Surv(`", tiempo, "`, `", evento, "`) ~ `", var_exposicion, "` + Edad + Sexo"))
    modelo <- tryCatch(coxph(formula, data = df), error = function(e) NULL)

    if (!is.null(modelo)) {
      resumen <- summary(modelo)
      row <- resumen$coefficients[rownames(resumen$coefficients) == paste0("`", var_exposicion, "`"), ]
      conf <- resumen$conf.int[rownames(resumen$conf.int) == paste0("`", var_exposicion, "`"), ]

      resultados_ajustados[[tiempo]] <- tibble(
        `Variable de tiempo` = tiempo,
        Evento = evento,
        HR = round(conf["exp(coef)"], 3),
        `IC 95% Inferior` = round(conf["lower .95"], 3),
        `IC 95% Superior` = round(conf["upper .95"], 3),
        `Valor p` = as.character(
          ifelse(row["Pr(>|z|)"] < 0.0001, "<0.0001", round(row["Pr(>|z|)"], 4))
        ),
        n = nrow(df)
      )
    }
  }
}

# Combinar resultados
tabla3_cox_ajustada <- bind_rows(resultados_ajustados)

# Mostrar tabla
tabla3_cox_ajustada %>%
  kable(format = "html", caption = "Tabla 3: Regresión de Cox ajustada por edad y sexo (colesterol total)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 3: Regresión de Cox ajustada por edad y sexo (colesterol total)
Variable de tiempo Evento HR IC 95% Inferior IC 95% Superior Valor p n
Tiempo hasta angina Angina incidente 1.005 1.004 1.006 <0.0001 11218
Tiempo hasta infarto Infarto hospitalizado 1.007 1.006 1.008 <0.0001 11218
Tiempo hasta infarto clínico Infarto por CHD 1.006 1.005 1.007 <0.0001 11218
Tiempo hasta CHD Alguna CHD 1.005 1.004 1.006 <0.0001 11218
Tiempo hasta ACV ACV incidente 1.000 0.998 1.001 0.738 11218
Tiempo hasta CVD CVD 1.004 1.003 1.005 <0.0001 11218
Tiempo hasta muerte Fallecido 1.001 1.000 1.002 0.0038 11218
Tiempo hasta hipertensión Hipertensión desarrollada 1.002 1.002 1.003 <0.0001 11218

Tabla 3 MICE

Tabla 3 MICE

# 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`
data2 <- data

# Subconjunto de variables a imputar
vars_imputar <- c("sex", "age", "totchol")

# Asegurar que las variables estén en el formato correcto 
if (!is.numeric(data2$sex)) {
  data2$sex <- as.numeric(as.character(data2$sex))
}

# Aplicar MICE solo a esas columnas
set.seed(123)
imp <- mice(data2[, vars_imputar], m = 5, method = "pmm", seed = 123)
## 
##  iter imp variable
##   1   1  totchol
##   1   2  totchol
##   1   3  totchol
##   1   4  totchol
##   1   5  totchol
##   2   1  totchol
##   2   2  totchol
##   2   3  totchol
##   2   4  totchol
##   2   5  totchol
##   3   1  totchol
##   3   2  totchol
##   3   3  totchol
##   3   4  totchol
##   3   5  totchol
##   4   1  totchol
##   4   2  totchol
##   4   3  totchol
##   4   4  totchol
##   4   5  totchol
##   5   1  totchol
##   5   2  totchol
##   5   3  totchol
##   5   4  totchol
##   5   5  totchol
# Recuperar la versión completa imputada
imputados <- complete(imp)

# Reemplazar en data original
data$sex <- imputados$sex
data$age <- imputados$age
data$totchol <- imputados$totchol

# Diccionario de nombres traducidos
diccionario <- c(
  sex = "Sexo",
  age = "Edad",
  age_group = "Edad categorizada",
  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",
  cursmoke = "Fumador actual",
  diabetes = "Diabetes diagnosticada",
  bpmeds = "Uso de medicación para presión",
  prevhyp = "Hipertensión previa",
  prevchd = "CHD previa",
  prevap = "Angina previa",
  prevmi = "Infarto previo",
  prevstrk = "ACV previo",
  death = "Fallecido",
  angina = "Angina incidente",
  hospmi = "Infarto hospitalizado",
  mi_fchd = "Infarto por CHD",
  anychd = "Alguna CHD",
  stroke = "ACV incidente",
  hyperten = "Hipertensión desarrollada",
  timeap = "Tiempo hasta angina",
  timemi = "Tiempo hasta infarto",
  timemifc = "Tiempo hasta infarto clínico",
  timechd = "Tiempo hasta CHD",
  timestrk = "Tiempo hasta ACV",
  timecvd = "Tiempo hasta CVD",
  timedth = "Tiempo hasta muerte",
  timehyp = "Tiempo hasta hipertensión",
  cvd = "CVD"
)

# 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 el 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 eventos y su tiempo asociado
eventos <- c(
  "Tiempo hasta angina" = "Angina incidente",
  "Tiempo hasta infarto" = "Infarto hospitalizado",
  "Tiempo hasta infarto clínico" = "Infarto por CHD",
  "Tiempo hasta CHD" = "Alguna CHD",
  "Tiempo hasta ACV" = "ACV incidente",
  "Tiempo hasta CVD" = "CVD",
  "Tiempo hasta muerte" = "Fallecido",
  "Tiempo hasta hipertensión" = "Hipertensión desarrollada"
)

# Asegurarse que todos los eventos estén codificados como 0 y 1
for (evento in eventos) {
  data[[evento]] <- ifelse(data[[evento]] == "Sí", 1,
                           ifelse(data[[evento]] == "No", 0, data[[evento]]))
}

# Guardar resultados
resultados_cox <- list()
var_exposicion <- "Colesterol total (mg/dL)"

for (tiempo in names(eventos)) {
  evento <- eventos[[tiempo]]

  df <- data %>%
    select(all_of(tiempo), all_of(evento), all_of(var_exposicion)) %>%
    filter(!is.na(.data[[tiempo]]) & !is.na(.data[[evento]]) & !is.na(.data[[var_exposicion]]))

  # Verificar condiciones mínimas
  if (nrow(df) >= 10 && length(unique(df[[evento]])) == 2) {
    formula <- as.formula(paste0("Surv(`", tiempo, "`, `", evento, "`) ~ `", var_exposicion, "`"))
    modelo <- tryCatch(coxph(formula, data = df), error = function(e) NULL)

    if (!is.null(modelo)) {
      resumen <- summary(modelo)
      beta <- resumen$coefficients[1, ]
      conf <- resumen$conf.int[1, ]

      resultados_cox[[tiempo]] <- tibble(
        `Variable de tiempo` = tiempo,
        Evento = evento,
        HR = round(conf["exp(coef)"], 3),
        `IC 95% Inferior` = round(conf["lower .95"], 3),
        `IC 95% Superior` = round(conf["upper .95"], 3),
        `Valor p` = as.character(
          ifelse(beta["Pr(>|z|)"] < 0.0001, "<0.0001", round(beta["Pr(>|z|)"], 4))
        ),
        n = nrow(df)
      )
    }
  }
}

# Combinar resultados
tabla3_cox <- bind_rows(resultados_cox)

# Mostrar tabla
tabla3_cox %>%
  kable(format = "html", caption = "Tabla 3 MICE: Regresión de Cox para Colesterol total (mg/dL)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 3 MICE: Regresión de Cox para Colesterol total (mg/dL)
Variable de tiempo Evento HR IC 95% Inferior IC 95% Superior Valor p n
Tiempo hasta angina Angina incidente 1.005 1.004 1.006 <0.0001 11627
Tiempo hasta infarto Infarto hospitalizado 1.005 1.004 1.007 <0.0001 11627
Tiempo hasta infarto clínico Infarto por CHD 1.005 1.004 1.006 <0.0001 11627
Tiempo hasta CHD Alguna CHD 1.004 1.004 1.005 <0.0001 11627
Tiempo hasta ACV ACV incidente 1.001 1.000 1.002 0.1277 11627
Tiempo hasta CVD CVD 1.003 1.002 1.004 <0.0001 11627
Tiempo hasta muerte Fallecido 1.001 1.001 1.002 4e-04 11627
Tiempo hasta hipertensión Hipertensión desarrollada 1.003 1.003 1.004 <0.0001 11627

Tabla 3 ajustada MICE

# 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`
data2 <- data

# Subconjunto de variables a imputar
vars_imputar <- c("sex", "age", "totchol")

# Asegurar que las variables estén en el formato correcto 
if (!is.numeric(data2$sex)) {
  data2$sex <- as.numeric(as.character(data2$sex))
}

# Aplicar MICE solo a esas columnas
set.seed(123)
imp <- mice(data2[, vars_imputar], m = 5, method = "pmm", seed = 123)
## 
##  iter imp variable
##   1   1  totchol
##   1   2  totchol
##   1   3  totchol
##   1   4  totchol
##   1   5  totchol
##   2   1  totchol
##   2   2  totchol
##   2   3  totchol
##   2   4  totchol
##   2   5  totchol
##   3   1  totchol
##   3   2  totchol
##   3   3  totchol
##   3   4  totchol
##   3   5  totchol
##   4   1  totchol
##   4   2  totchol
##   4   3  totchol
##   4   4  totchol
##   4   5  totchol
##   5   1  totchol
##   5   2  totchol
##   5   3  totchol
##   5   4  totchol
##   5   5  totchol
# Recuperar la versión completa imputada
imputados <- complete(imp)

# Reemplazar en data original
data$sex <- imputados$sex
data$age <- imputados$age
data$totchol <- imputados$totchol

# Diccionario de nombres traducidos
diccionario <- c(
  sex = "Sexo",
  age = "Edad",
  age_group = "Edad categorizada",
  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",
  cursmoke = "Fumador actual",
  diabetes = "Diabetes diagnosticada",
  bpmeds = "Uso de medicación para presión",
  prevhyp = "Hipertensión previa",
  prevchd = "CHD previa",
  prevap = "Angina previa",
  prevmi = "Infarto previo",
  prevstrk = "ACV previo",
  death = "Fallecido",
  angina = "Angina incidente",
  hospmi = "Infarto hospitalizado",
  mi_fchd = "Infarto por CHD",
  anychd = "Alguna CHD",
  stroke = "ACV incidente",
  hyperten = "Hipertensión desarrollada",
  timeap = "Tiempo hasta angina",
  timemi = "Tiempo hasta infarto",
  timemifc = "Tiempo hasta infarto clínico",
  timechd = "Tiempo hasta CHD",
  timestrk = "Tiempo hasta ACV",
  timecvd = "Tiempo hasta CVD",
  timedth = "Tiempo hasta muerte",
  timehyp = "Tiempo hasta hipertensión",
  cvd = "CVD"
)

# 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 el 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)]

# Asegurarse de que Sexo esté codificado como factor (Hombre/Mujer)
if (!is.factor(data$Sexo)) {
  data$Sexo <- factor(data$Sexo, levels = c(1, 2), labels = c("Hombre", "Mujer"))
}

# Asegurarse que eventos estén codificados como 0/1
eventos <- c(
  "Tiempo hasta angina" = "Angina incidente",
  "Tiempo hasta infarto" = "Infarto hospitalizado",
  "Tiempo hasta infarto clínico" = "Infarto por CHD",
  "Tiempo hasta CHD" = "Alguna CHD",
  "Tiempo hasta ACV" = "ACV incidente",
  "Tiempo hasta CVD" = "CVD",
  "Tiempo hasta muerte" = "Fallecido",
  "Tiempo hasta hipertensión" = "Hipertensión desarrollada"
)

for (evento in eventos) {
  data[[evento]] <- ifelse(data[[evento]] == "Sí", 1,
                           ifelse(data[[evento]] == "No", 0, data[[evento]]))
}

# Variable de exposición
var_exposicion <- "Colesterol total (mg/dL)"

# Ejecutar regresiones ajustadas
resultados_ajustados <- list()

for (tiempo in names(eventos)) {
  evento <- eventos[[tiempo]]

  df <- data %>%
    select(all_of(tiempo), all_of(evento), all_of(var_exposicion), Edad, Sexo) %>%
    filter(!is.na(.data[[tiempo]]) & !is.na(.data[[evento]]) &
           !is.na(.data[[var_exposicion]]) & !is.na(Edad) & !is.na(Sexo))

  if (nrow(df) >= 10 && length(unique(df[[evento]])) == 2) {
    formula <- as.formula(paste0("Surv(`", tiempo, "`, `", evento, "`) ~ `", var_exposicion, "` + Edad + Sexo"))
    modelo <- tryCatch(coxph(formula, data = df), error = function(e) NULL)

    if (!is.null(modelo)) {
      resumen <- summary(modelo)
      row <- resumen$coefficients[rownames(resumen$coefficients) == paste0("`", var_exposicion, "`"), ]
      conf <- resumen$conf.int[rownames(resumen$conf.int) == paste0("`", var_exposicion, "`"), ]

      resultados_ajustados[[tiempo]] <- tibble(
        `Variable de tiempo` = tiempo,
        Evento = evento,
        HR = round(conf["exp(coef)"], 3),
        `IC 95% Inferior` = round(conf["lower .95"], 3),
        `IC 95% Superior` = round(conf["upper .95"], 3),
        `Valor p` = as.character(
          ifelse(row["Pr(>|z|)"] < 0.0001, "<0.0001", round(row["Pr(>|z|)"], 4))
        ),
        n = nrow(df)
      )
    }
  }
}

# Combinar resultados
tabla3_cox_ajustada <- bind_rows(resultados_ajustados)

# Mostrar tabla
tabla3_cox_ajustada %>%
  kable(format = "html", caption = "Tabla 3: Regresión de Cox ajustada por edad y sexo (colesterol total)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 3: Regresión de Cox ajustada por edad y sexo (colesterol total)
Variable de tiempo Evento HR IC 95% Inferior IC 95% Superior Valor p n
Tiempo hasta angina Angina incidente 1.005 1.004 1.006 <0.0001 11627
Tiempo hasta infarto Infarto hospitalizado 1.007 1.006 1.008 <0.0001 11627
Tiempo hasta infarto clínico Infarto por CHD 1.006 1.005 1.007 <0.0001 11627
Tiempo hasta CHD Alguna CHD 1.005 1.004 1.006 <0.0001 11627
Tiempo hasta ACV ACV incidente 1.000 0.998 1.001 0.7974 11627
Tiempo hasta CVD CVD 1.004 1.003 1.005 <0.0001 11627
Tiempo hasta muerte Fallecido 1.001 1.000 1.002 0.0044 11627
Tiempo hasta hipertensión Hipertensión desarrollada 1.002 1.002 1.003 <0.0001 11627