##
## 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
##
## Adjuntando el paquete: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
# 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"))
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 |
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"))
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 |
# 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"))
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 |
# 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"))
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 |