##
## 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
# Cargar los datos
data = read_csv("C:\\Users\\gio73\\Documents\\Tesis\\Rmarkdown\\Framingham\\framingham_dataset.csv") #para csv se ocupa readr
## 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)]
# Crear variable edad categorizada
data <- data %>%
mutate(
`Edad categorizada` = cut(Edad,
breaks = c(18, 40, 60, 80, Inf),
right = TRUE,
labels = c("18–40", "41–60", "61–80", ">80")),
`Sexo` = factor(Sexo, levels = c(1, 2), labels = c("Hombre", "Mujer")),
CVD = factor(CVD, levels = c(0, 1), labels = c("No", "Sí")),
`Fumador actual` = factor(`Fumador actual`, levels = c(0, 1), labels = c("No", "Sí")),
`Diabetes diagnosticada` = factor(`Diabetes diagnosticada`, levels = c(0, 1), labels = c("No", "Sí")),
`Uso de medicación para presión` = factor(`Uso de medicación para presión`, levels = c(0, 1), labels = c("No", "Sí")),
`Hipertensión previa` = factor(`Hipertensión previa`, levels = c(0, 1), labels = c("No", "Sí")),
`CHD previa` = factor(`CHD previa`, levels = c(0, 1), labels = c("No", "Sí")),
`Angina previa` = factor(`Angina previa`, levels = c(0, 1), labels = c("No", "Sí")),
`Infarto previo` = factor(`Infarto previo`, levels = c(0, 1), labels = c("No", "Sí")),
`ACV previo` = factor(`ACV previo`, levels = c(0, 1), labels = c("No", "Sí")),
`Fallecido` = factor(`Fallecido`, levels = c(0, 1), labels = c("No", "Sí")),
`Angina incidente` = factor(`Angina incidente`, levels = c(0, 1), labels = c("No", "Sí")),
`Infarto hospitalizado` = factor(`Infarto hospitalizado`, levels = c(0, 1), labels = c("No", "Sí")),
`Infarto por CHD` = factor(`Infarto por CHD`, levels = c(0, 1), labels = c("No", "Sí")),
`Alguna CHD` = factor(`Alguna CHD`, levels = c(0, 1), labels = c("No", "Sí")),
`ACV incidente` = factor(`ACV incidente`, levels = c(0, 1), labels = c("No", "Sí")),
`Hipertensión desarrollada` = factor(`Hipertensión desarrollada`, levels = c(0, 1), labels = c("No", "Sí")),
)
# Organizar variables en bloques (ya en español)
vars_sex <- "Sexo"
vars_edad <- "Edad categorizada"
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")
vars_binarias <- c("Fumador actual", "Diabetes diagnosticada", "Uso de medicación para presión", "Hipertensión previa", "CHD previa", "Angina previa", "Infarto previo", "ACV previo", "Fallecido", "Angina incidente", "Infarto hospitalizado", "Infarto por CHD", "Alguna CHD", "ACV incidente", "Hipertensión desarrollada")
vars_tiempo <- c("Tiempo hasta angina", "Tiempo hasta infarto", "Tiempo hasta infarto clínico", "Tiempo hasta CHD", "Tiempo hasta ACV", "Tiempo hasta CVD", "Tiempo hasta muerte", "Tiempo hasta hipertensión")
# Unir todas las variables
all_vars <- c(vars_sex, "Edad", vars_edad, vars_clinicas, vars_binarias) #vars_tiempo no incluir
# Variables categóricas
factorVars <- c("Sexo", "Edad categorizada", vars_binarias)
# Crear tabla 1
tabla1 <- CreateTableOne(vars = all_vars, strata = "CVD",
data = data, factorVars = factorVars)
# Imprimir tabla SIN columnas p ni test
tabla1_df <- print(tabla1,
showAllLevels = TRUE,
printToggle = FALSE,
noSpaces = TRUE)
# Eliminar columnas p y test si existen
cols_quitar <- c("p", "test")
cols_presentes <- intersect(cols_quitar, colnames(tabla1_df))
if (length(cols_presentes) > 0) {
tabla1_df <- tabla1_df[, !(colnames(tabla1_df) %in% cols_presentes)]
}
#Imprimir tabla
kable(tabla1_df,
format = "html", # usa "latex" si generas PDF
caption = "Tabla 1: Características basales por presencia de enfermedad cardiovascular (CVD)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center")
level | No | Sí | |
---|---|---|---|
n | 8728 | 2899 | |
Sexo (%) | Hombre | 3333 (38.2) | 1689 (58.3) |
Mujer | 5395 (61.8) | 1210 (41.7) | |
Edad (mean (SD)) | 53.63 (9.35) | 58.28 (9.35) | |
Edad categorizada (%) | 18–40 | 685 (7.8) | 93 (3.2) |
41–60 | 5917 (67.8) | 1543 (53.2) | |
61–80 | 2125 (24.3) | 1261 (43.5) | |
>80 | 1 (0.0) | 2 (0.1) | |
Colesterol total (mg/dL) (mean (SD)) | 239.15 (44.23) | 247.18 (48.12) | |
Presión sistólica (mm Hg) (mean (SD)) | 133.32 (21.35) | 145.36 (24.56) | |
Presión diastólica (mm Hg) (mean (SD)) | 81.97 (11.05) | 86.25 (12.79) | |
Índice de masa corporal (kg/m²) (mean (SD)) | 25.62 (4.00) | 26.65 (4.29) | |
Glucosa en ayunas (mg/dL) (mean (SD)) | 82.48 (20.76) | 88.99 (34.15) | |
Frecuencia cardíaca (lpm) (mean (SD)) | 76.69 (12.26) | 77.06 (13.05) | |
Colesterol HDL (mg/dL) (mean (SD)) | 50.64 (15.63) | 45.16 (14.86) | |
Colesterol LDL (mg/dL) (mean (SD)) | 175.19 (46.29) | 180.66 (48.50) | |
Cigarrillos por día (mean (SD)) | 8.03 (12.01) | 8.93 (12.69) | |
Fumador actual (%) | No | 5010 (57.4) | 1588 (54.8) |
Sí | 3718 (42.6) | 1311 (45.2) | |
Diabetes diagnosticada (%) | No | 8494 (97.3) | 2603 (89.8) |
Sí | 234 (2.7) | 296 (10.2) | |
Uso de medicación para presión (%) | No | 7725 (93.3) | 2365 (85.9) |
Sí | 557 (6.7) | 387 (14.1) | |
Hipertensión previa (%) | No | 5235 (60.0) | 1048 (36.2) |
Sí | 3493 (40.0) | 1851 (63.8) | |
CHD previa (%) | No | 8472 (97.1) | 2313 (79.8) |
Sí | 256 (2.9) | 586 (20.2) | |
Angina previa (%) | No | 8487 (97.2) | 2513 (86.7) |
Sí | 241 (2.8) | 386 (13.3) | |
Infarto previo (%) | No | 8715 (99.9) | 2538 (87.5) |
Sí | 13 (0.1) | 361 (12.5) | |
ACV previo (%) | No | 8728 (100.0) | 2747 (94.8) |
Sí | 0 (0.0) | 152 (5.2) | |
Fallecido (%) | No | 6995 (80.1) | 1105 (38.1) |
Sí | 1733 (19.9) | 1794 (61.9) | |
Angina incidente (%) | No | 7920 (90.7) | 1805 (62.3) |
Sí | 808 (9.3) | 1094 (37.7) | |
Infarto hospitalizado (%) | No | 8643 (99.0) | 1830 (63.1) |
Sí | 85 (1.0) | 1069 (36.9) | |
Infarto por CHD (%) | No | 8643 (99.0) | 1196 (41.3) |
Sí | 85 (1.0) | 1703 (58.7) | |
Alguna CHD (%) | No | 7865 (90.1) | 604 (20.8) |
Sí | 863 (9.9) | 2295 (79.2) | |
ACV incidente (%) | No | 8728 (100.0) | 1838 (63.4) |
Sí | 0 (0.0) | 1061 (36.6) | |
Hipertensión desarrollada (%) | No | 2605 (29.8) | 380 (13.1) |
Sí | 6123 (70.2) | 2519 (86.9) |
# Total de observaciones
n_total <- nrow(data)
# Calcular total de NA y porcentaje
total_na <- sapply(data[vars_clinicas], function(x) sum(is.na(x)))
porcentaje_na <- round(100 * total_na / n_total, 2)
# Crear tibble con resultados
tabla_na <- tibble(
Variable = names(total_na),
`Total NA` = total_na,
`Porcentaje NA (%)` = porcentaje_na
)
# Mostrar tabla con kableExtra
tabla_na %>%
kable(format = "html", caption = "Porcentaje de datos faltantes en variables clínicas") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center")
Variable | Total NA | Porcentaje NA (%) |
---|---|---|
Colesterol total (mg/dL) | 409 | 3.52 |
Presión sistólica (mm Hg) | 0 | 0.00 |
Presión diastólica (mm Hg) | 0 | 0.00 |
Índice de masa corporal (kg/m²) | 52 | 0.45 |
Glucosa en ayunas (mg/dL) | 1440 | 12.38 |
Frecuencia cardíaca (lpm) | 6 | 0.05 |
Colesterol HDL (mg/dL) | 8600 | 73.97 |
Colesterol LDL (mg/dL) | 8601 | 73.97 |
Cigarrillos por día | 79 | 0.68 |
## Colesterol total (mg/dL) Presión sistólica (mm Hg) Presión diastólica (mm Hg)
## Min. :107.0 Min. : 83.5 Min. : 30.00
## 1st Qu.:210.0 1st Qu.:120.0 1st Qu.: 75.00
## Median :238.0 Median :132.0 Median : 82.00
## Mean :241.2 Mean :136.3 Mean : 83.04
## 3rd Qu.:268.0 3rd Qu.:149.0 3rd Qu.: 90.00
## Max. :696.0 Max. :295.0 Max. :150.00
## NA's :409
## Índice de masa corporal (kg/m²) Glucosa en ayunas (mg/dL)
## Min. :14.43 Min. : 39.00
## 1st Qu.:23.09 1st Qu.: 72.00
## Median :25.48 Median : 80.00
## Mean :25.88 Mean : 84.12
## 3rd Qu.:28.07 3rd Qu.: 89.00
## Max. :56.80 Max. :478.00
## NA's :52 NA's :1440
## Frecuencia cardíaca (lpm) Colesterol HDL (mg/dL) Colesterol LDL (mg/dL)
## Min. : 37.00 Min. : 10.00 Min. : 20.0
## 1st Qu.: 69.00 1st Qu.: 39.00 1st Qu.:145.0
## Median : 75.00 Median : 48.00 Median :173.0
## Mean : 76.78 Mean : 49.37 Mean :176.5
## 3rd Qu.: 85.00 3rd Qu.: 58.00 3rd Qu.:205.0
## Max. :220.00 Max. :189.00 Max. :565.0
## NA's :6 NA's :8600 NA's :8601
## Cigarrillos por día
## Min. : 0.00
## 1st Qu.: 0.00
## Median : 0.00
## Mean : 8.25
## 3rd Qu.:20.00
## Max. :90.00
## NA's :79
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)"
)
# Generar un histograma con curva normal por cada variable
for (var in vars_clinicas) {
# Datos limpios
b <- na.omit(data[[var]])
# Establecer límites del eje x en ±4 desviaciones estándar
media <- mean(b)
desv <- sd(b)
x_min <- media - 4 * desv
x_max <- media + 4 * desv
# Crear histograma
hist(b, probability = TRUE,
main = paste("Histograma con curva normal:", var),
col = "lightblue", xlab = var,
xlim = c(x_min, x_max))
# Superponer curva normal
curve(dnorm(x, mean = media, sd = desv),
from = x_min, to = x_max,
col = "red", lwd = 2, add = TRUE)
}