---
title: "Conocimiento, percepción y conductas de uso de antibióticos en Puerto Rico"
subtitle: "Análisis univariado, bivariado y multivariado"
author: "Cassandra De Jesús Náter"
date: "`r format(Sys.Date(), '%d de %B de %Y')`"
output:
  html_document:
    toc: true
    toc_depth: 2
    toc_float:
      collapsed: false
      smooth_scroll: true
    number_sections: true
    theme: spacelab
    highlight: tango
    code_folding: show
    df_print: paged
    fig_caption: true
    self_contained: true
    css: styles.css
---



Código preparado por [Giovanni Castro Irizarry](https://castroirizarry.com/) (giovannicastro\@ucla.edu)

```{=html}
<style>
/* === Tipografía general === */
body {
  font-family: 'Helvetica Neue', 'Segoe UI', Arial, sans-serif;
  font-size: 16px;
  line-height: 1.7;
  color: #2c3e50;
  background-color: #fafafa;
}

/* === Contenedor principal === */
.main-container {
  max-width: 1100px;
  margin-left: auto;
  margin-right: auto;
  padding: 30px;
  background-color: #ffffff;
  box-shadow: 0 2px 12px rgba(0,0,0,0.06);
  border-radius: 8px;
  margin-top: 30px;
  margin-bottom: 30px;
}

/* === Título principal === */
h1.title {
  color: #1a5490;
  font-weight: 700;
  font-size: 2.2em;
  border-bottom: 4px solid #1a5490;
  padding-bottom: 12px;
  margin-bottom: 8px;
}

h1.subtitle {
  color: #6c757d;
  font-weight: 400;
  font-size: 1.3em;
  font-style: italic;
  margin-top: 0;
  margin-bottom: 20px;
}

/* === Autor y fecha === */
h4.author, h4.date {
  color: #495057;
  font-size: 1em;
  font-weight: 500;
  margin: 4px 0;
}

/* === Encabezados de secciones === */
h1 {
  color: #1a5490;
  font-weight: 600;
  border-bottom: 2px solid #e9ecef;
  padding-bottom: 8px;
  margin-top: 50px;
}

h2 {
  color: #2874a6;
  font-weight: 600;
  margin-top: 35px;
}

h3 {
  color: #5d6d7e;
  font-weight: 600;
}

/* === Bloques de código === */
pre {
  background-color: #f4f6f8 !important;
  border-left: 4px solid #1a5490;
  border-radius: 4px;
  padding: 14px;
  font-size: 0.9em;
}

code {
  color: #c0392b;
  background-color: #f8f9fa;
  padding: 2px 5px;
  border-radius: 3px;
  font-size: 0.9em;
}

pre code {
  color: #2c3e50;
  background-color: transparent;
  padding: 0;
}

/* === Tabla de contenidos flotante === */
#TOC {
  background-color: #f8f9fa;
  border-radius: 6px;
  padding: 15px;
  border-left: 3px solid #1a5490;
}

#TOC a {
  color: #2874a6;
}

#TOC a:hover {
  color: #1a5490;
  text-decoration: underline;
}

/* === Botones de code folding === */
.btn-default {
  background-color: #1a5490 !important;
  color: white !important;
  border: none !important;
  border-radius: 4px !important;
  font-size: 0.85em !important;
  padding: 4px 10px !important;
}

.btn-default:hover {
  background-color: #2874a6 !important;
}

/* === Enlaces === */
a {
  color: #1a5490;
  text-decoration: none;
}

a:hover {
  color: #c0392b;
  text-decoration: underline;
}

/* === Tablas (gt y gtsummary) === */
.gt_table {
  margin: 25px auto !important;
  box-shadow: 0 2px 6px rgba(0,0,0,0.08) !important;
  border-radius: 6px !important;
}

/* === Citas y bloques destacados === */
blockquote {
  background-color: #e8f4f8;
  border-left: 5px solid #1a5490;
  padding: 12px 18px;
  margin: 20px 0;
  color: #2c3e50;
  font-style: italic;
}

/* === Listas === */
ul li, ol li {
  margin-bottom: 6px;
}

/* === Figuras === */
.figure {
  margin: 30px 0;
  text-align: center;
}

img {
  max-width: 100%;
  border-radius: 4px;
}
</style>
```

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  echo = TRUE,        # muestra el código
  warning = FALSE,
  message = FALSE,
  results = "markup"
)
```

# Felicidades!

Felicidades por llegar a esta etapa en la que estás a punto de graduarte. Aquí encontrarás un análisis de los datos de tu investigación sobre conocimiento, percepción y conductas de uso de antibióticos en Puerto Rico.

Este análisis incluye el proceso completo de limpieza, recodificación, análisis descriptivo, análisis bivariado, regresión logística multivariada y visualización de resultados. La idea es que tengas un documento organizado, reproducible y fácil de revisar mientras preparas la versión final de tu trabajo.

# Descargar este código

Puedes descargar este código [aquí](https://drive.google.com/file/d/1Eiik1FtEuncnihFHHGWQZc7KcSst6tN3/view?usp=share_link).

# Paquetes

```{r paquetes}
library(tidyverse)
library(readxl)
library(gtsummary)
library(gt)
library(broom)
```

# Cargar datos

```{r cargar-datos}
data_raw <- read_excel("Data limpia 5-7.xlsx", sheet = "Base de Datos Limpia")
```

# Renombrar variables

```{r renombrar-variables}
data <- data_raw %>%
  rename(
    id                     = record_id,
    edad                   = Edad,
    nivel_educativo        = `Nivel Educativo`,
    region                 = `Región`,
    genero                 = Genero,
    exp_previas            = `Experiencias_Previas_1_4 _ 9`,
    conoc_mecanismo        = `Conocimiento_mecanismo_acción_antibioticos_2`,
    conoc_resistencia      = `Conocimiento _resistencia_8`,
    percepcion_resistencia = Percepción_resistencia_10,
    conductas_uso          = Conductas_uso_3_5,
    orientacion_medico     = `Orientación_Médico_6_7`
  )
```

# Recodificación de variables

```{r recodificacion}
data <- data %>%
  mutate(
    exp_previas = case_when(
      exp_previas == 1 ~ 1,
      exp_previas %in% c(0, 2) ~ 0,
      TRUE ~ NA_real_
    ),
    
    conductas_uso = case_when(
      conductas_uso == 1 ~ 1,
      conductas_uso %in% c(0, 2) ~ 0,
      TRUE ~ NA_real_
    ),
    
    orientacion_medico = case_when(
      orientacion_medico == 1 ~ 1,
      orientacion_medico %in% c(0, 2) ~ 0,
      TRUE ~ NA_real_
    ),
    
    # Conocimiento sobre mecanismo de acción de antibióticos recodificado:
    # - Correcta = 1: reconoce que los antibióticos NO matan virus
    # - Incorrecta / No estoy seguro = 0
    
    conoc_mecanismo_correcto = case_when(
      conoc_mecanismo == 0 ~ 1,
      conoc_mecanismo %in% c(1, 2) ~ 0,
      TRUE ~ NA_real_
    ),
    
    conoc_mecanismo_correcto_f = factor(
      conoc_mecanismo_correcto,
      levels = c(0, 1),
      labels = c("Incorrecta / No estoy seguro", "Correcta")
    ),
    
    # Conocimiento sobre resistencia antimicrobiana
    
    conoc_resistencia_f = factor(
      conoc_resistencia,
      levels = c(1, 2, 3),
      labels = c(
        "Incorrecta",
        "Parcialmente correcta",
        "Correcta"
      )
    ),
    
    percepcion_f = factor(
      percepcion_resistencia,
      levels = c(1, 2, 3),
      labels = c(
        "Nada preocupado (1-4)",
        "Algo preocupado (5-7)",
        "Extremadamente preocupado (8-10)"
      )
    ),
    
    # Edad
    
    edad_f = factor(
      edad,
      levels = 1:6,
      labels = c(
        "21-29", "30-39", "40-49",
        "50-59", "60-69", "70+"
      )
    ),
    
    # Género
    
    genero_f = factor(
      genero,
      levels = c(1, 2),
      labels = c("Masculino", "Femenino")
    ),
    
    # Educación
    # El dataset tiene 3 niveles agregados:
    # 1 = Educación secundaria o menor
    # 2 = Postsecundaria no universitaria
    # 3 = Universitaria o avanzada
    #
    # Lo recodifiqué como variable dicotómica:
    # 1-2 = Menos de bachillerato
    # 3   = Bachillerato o más
    
    nivel_educativo_f = factor(
      nivel_educativo,
      levels = 1:3,
      labels = c(
        "Educación secundaria o menor",
        "Postsecundaria no universitaria",
        "Universitaria o avanzada"
      )
    ),
    
    educ_dicotica = factor(
      case_when(
        nivel_educativo %in% c(1, 2) ~ "Menos de bachillerato",
        nivel_educativo == 3 ~ "Bachillerato o más",
        TRUE ~ NA_character_
      ),
      levels = c("Menos de bachillerato", "Bachillerato o más")
    ),
    
    # Región
    
    region_f = factor(
      region,
      levels = 1:7,
      labels = c(
        "Arecibo", "Bayamón", "Caguas",
        "Fajardo", "Metro", "Mayagüez", "Ponce"
      )
    ),
    
    # Factores binarios para tablas
    
    exp_previas_f = factor(
      exp_previas,
      levels = c(0, 1),
      labels = c("No", "Sí")
    ),
    
    conductas_uso_f = factor(
      conductas_uso,
      levels = c(0, 1),
      labels = c("No", "Sí")
    ),
    
    orientacion_medico_f = factor(
      orientacion_medico,
      levels = c(0, 1),
      labels = c("No", "Sí")
    )
  )
```

# Verificaciones

```{r verificaciones}
table(data$conoc_mecanismo_correcto_f, useNA = "always")
table(data$exp_previas_f, useNA = "always")
table(data$conductas_uso_f, useNA = "always")
table(data$orientacion_medico_f, useNA = "always")
```

# Tabla 1: Análisis univariado descriptivo

```{r tabla-univariada}
tabla_univariada <- data %>%
  select(
    edad_f,
    genero_f,
    educ_dicotica,
    nivel_educativo_f,
    region_f,
    conoc_mecanismo_correcto_f,
    conoc_resistencia_f,
    percepcion_f,
    exp_previas_f,
    conductas_uso_f,
    orientacion_medico_f
  ) %>%
  tbl_summary(
    label = list(
      edad_f                      ~ "Edad",
      genero_f                    ~ "Género",
      educ_dicotica               ~ "Educación dicotómica",
      nivel_educativo_f           ~ "Nivel educativo",
      region_f                    ~ "Región de residencia",
      conoc_mecanismo_correcto_f  ~ "Conocimiento correcto: antibióticos no matan virus",
      conoc_resistencia_f         ~ "Conocimiento sobre resistencia antimicrobiana",
      percepcion_f                ~ "Preocupación por resistencia antimicrobiana",
      exp_previas_f               ~ "Experiencias previas con antibióticos",
      conductas_uso_f             ~ "Conductas de uso de antibióticos",
      orientacion_medico_f        ~ "Orientación médica recibida"
    ),
    missing = "no"
  ) %>%
  bold_labels() %>%
  modify_header(
    label ~ "**Variables**",
    stat_0 ~ "**n (%)**"
  ) %>%
  modify_footnote(
    all_stat_cols() ~ NA
  ) %>%
  modify_caption("**Tabla 1. Análisis univariado descriptivo**")

tabla_univariada %>%
  as_gt() %>%
  gt::tab_source_note(
    gt::md(paste0("**_N_ = ", nrow(data), "**"))
  )
```

# Tabla 2: Análisis bivariado

La variable independiente es **conductas de uso de antibióticos**. La tabla compara las características de los participantes según si reportaron o no conductas de uso de antibióticos.

```{r tabla-bivariada}
tabla_bivariada <- data %>%
  select(
    conductas_uso_f,
    conoc_mecanismo_correcto_f,
    conoc_resistencia_f,
    percepcion_f,
    edad_f,
    genero_f,
    educ_dicotica,
    region_f,
    orientacion_medico_f
  ) %>%
  tbl_summary(
    by = conductas_uso_f,
    label = list(
      conoc_mecanismo_correcto_f  ~ "Conocimiento correcto: antibióticos no matan virus",
      conoc_resistencia_f         ~ "Conocimiento sobre resistencia antimicrobiana",
      percepcion_f                ~ "Preocupación por resistencia antimicrobiana",
      edad_f                      ~ "Edad",
      genero_f                    ~ "Género",
      educ_dicotica               ~ "Educación",
      region_f                    ~ "Región de residencia",
      orientacion_medico_f        ~ "Orientación médica recibida"
    ),
    missing = "no"
  ) %>%
  bold_labels() %>%
  modify_header(
    label ~ "**Variable**",
    stat_1 ~ "**No conductas de uso**",
    stat_2 ~ "**Sí conductas de uso**"
  ) %>%
  modify_footnote(
    all_stat_cols() ~ NA
  ) %>%
  modify_caption("**Tabla 2. Análisis bivariado según conductas de uso de antibióticos**")

tabla_bivariada %>%
  as_gt() %>%
  gt::tab_source_note(
    gt::md(paste0("**_N_ = ", nrow(data), "**"))
  )
```
# Tabla 3: Análisis multivariado

Se usa una regresión logística binaria porque la variable independiente, `conductas_uso`, es binaria:

- `0 = No`
- `1 = Sí`

Por eso no se usa una regresión lineal OLS. El modelo estima la asociación entre conocimiento, percepción y características sociodemográficas con la probabilidad de reportar conductas de uso de antibióticos.

Antes de correr el modelo multivariado, revisé la distribución de conductas_uso por región Fajardo y Mayagüez tienen cero casos en la categoría "No", lo que produce separación perfecta en la regresión logística. Por eso, la variable región se presenta en las Tablas 1 y 2, pero se excluye del modelo multivariado para evitar estimaciones inestables.

```{r tabla-region-conductas}
table(data$region_f, data$conductas_uso_f)
```

```{r modelo-logit}
modelo_logit <- glm(
  conductas_uso ~
    conoc_mecanismo_correcto_f +
    conoc_resistencia_f +
    percepcion_f +
    edad_f +
    genero_f +
    educ_dicotica +
    orientacion_medico_f,
  family = binomial(link = "logit"),
  data = data
)

summary(modelo_logit)
```

La Tabla 3 presenta los resultados como **odds ratios (OR)**, con errores estándar y _p_-values. La variable región no se incluye en este modelo debido a separación perfecta en algunas categorías regionales.

```{r tabla-multivariada}
# Para que los p-values en la tabla 3 se muestren con dos espacios decimales
p_fmt <- function(x) {gtsummary::style_number(x, digits = 2)}
tabla_multivariada <- broom::tidy(modelo_logit) %>%
  filter(term != "(Intercept)") %>%
  mutate(OR = exp(estimate),
    term = case_when(term == "conoc_mecanismo_correcto_fCorrecta" ~ "Conocimiento correcto: Correcta",
      term == "conoc_resistencia_fParcialmente correcta" ~ "Conocimiento resistencia: Parcialmente correcta",
      term == "conoc_resistencia_fCorrecta" ~ "Conocimiento resistencia: Correcta",
      term == "percepcion_fAlgo preocupado (5-7)" ~ "Preocupación RAM: Algo preocupado (5-7)",
      term == "percepcion_fExtremadamente preocupado (8-10)" ~ 
        "Preocupación RAM: Extremadamente preocupado (8-10)",
      term == "edad_f30-39" ~ "Edad: 30-39",
      term == "edad_f40-49" ~ "Edad: 40-49",
      term == "edad_f50-59" ~ "Edad: 50-59",
      term == "edad_f60-69" ~ "Edad: 60-69",
      term == "edad_f70+"   ~ "Edad: 70+",
      term == "genero_fFemenino" ~ "Género: Femenino",
      term == "educ_dicoticaBachillerato o más" ~ "Educación: Bachillerato o más",
      term == "orientacion_medico_fSí" ~ "Orientación médica recibida: Sí",
      TRUE ~ term), OR_SE = paste0(gtsummary::style_number(OR, digits = 2),
      "<br>(", gtsummary::style_number(std.error, digits = 2),
 ")"
    ),
p.value = p_fmt(p.value)
  ) %>%
  select(`Variables dependientes` = term, `Odds Ratios (Standard Errors)` = OR_SE, `p-value` = p.value) %>%
  gt() %>%
  fmt_markdown(columns = `Odds Ratios (Standard Errors)`) %>%
  tab_caption("Tabla 3. Regresión logística multivariada: conductas de uso de antibióticos") %>%
  tab_source_note(gt::md(paste0("**_N_ = ", nobs(modelo_logit), "**")))

tabla_multivariada

```

# Gráfica de coeficientes

La siguiente gráfica muestra los resultados del modelo multivariado como **odds ratios (OR)**. La línea vertical en OR = 1 representa ausencia de asociación. Valores mayores de 1 indican mayor probabilidad de reportar conductas de uso de antibióticos; valores menores de 1 indican menor probabilidad.

```{r coefplot-tabla3, fig.width=9, fig.height=6}
coefplot_data <- broom::tidy(modelo_logit, conf.int = TRUE, exponentiate = TRUE) %>%
  filter(term != "(Intercept)") %>%
  mutate(
    term = case_when(
      term == "conoc_mecanismo_correcto_fCorrecta" ~ "Conocimiento correcto: Correcta",
      term == "conoc_resistencia_fParcialmente correcta" ~ "Conocimiento resistencia: Parcialmente correcta",
      term == "conoc_resistencia_fCorrecta" ~ "Conocimiento resistencia: Correcta",
      term == "percepcion_fAlgo preocupado (5-7)" ~ "Preocupación RAM: Algo preocupado (5-7)",
      term == "percepcion_fExtremadamente preocupado (8-10)" ~ 
        "Preocupación RAM: Extremadamente preocupado (8-10)",
      term == "edad_f30-39" ~ "Edad: 30-39",
      term == "edad_f40-49" ~ "Edad: 40-49",
      term == "edad_f50-59" ~ "Edad: 50-59",
      term == "edad_f60-69" ~ "Edad: 60-69",
      term == "edad_f70+"   ~ "Edad: 70+",
      term == "genero_fFemenino" ~ "Género: Femenino",
      term == "educ_dicoticaBachillerato o más" ~ "Educación: Bachillerato o más",
      term == "orientacion_medico_fSí" ~ "Orientación médica recibida: Sí",
      TRUE ~ term),
    # Orden manual: igual que Tabla 3
    term = factor(term, levels = rev(c(
        "Conocimiento correcto: Correcta",
        "Conocimiento resistencia: Parcialmente correcta",
        "Conocimiento resistencia: Correcta",
        "Preocupación RAM: Algo preocupado (5-7)",
        "Preocupación RAM: Extremadamente preocupado (8-10)",
        "Edad: 30-39",
        "Edad: 40-49",
        "Edad: 50-59",
        "Edad: 60-69",
        "Edad: 70+",
        "Género: Femenino",
        "Educación: Bachillerato o más",
        "Orientación médica recibida: Sí"
      ))
    )
  )
coefplot <- ggplot(coefplot_data, aes(x = estimate, y = term)) +
  geom_vline(xintercept = 1, linetype = "dashed") +
  geom_point(size = 2.5) +
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0.2) +
  scale_x_log10() +
  labs(subtitle = "Odds ratios con intervalos de confianza al 95%",
    x = "Odds Ratio (escala logarítmica)",
    y = NULL
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold"),
    axis.text.y = element_text(size = 9)
  )

## Figura 1. Resultados del modelo multivariado

coefplot
```


```{r, include=FALSE}
ggsave(
  filename = "CDJN.pdf",
  plot = coefplot,
  width = 9,
  height = 6
)

ggsave(
  filename = "CDJN.jpeg",
  plot = coefplot,
  width = 9,
  height = 6,
  dpi = 300
)
```


Puedes descargar esta gráfica en formato PDF [aquí](https://castroirizarry.com/CDJN.pdf) y en formato JPEG [aquí](https://castroirizarry.com/CDJN.jpeg).
