Sesión 4: Documentos dinámicos y Quarto

Métodos Cuantitativos para la Administración Pública

Autor/a

Cristóbal Mejías

Fecha de publicación

17 de abril de 2026

1 ¿Por qué documentos dinámicos?

En el trabajo cuantitativo, el flujo habitual consiste en correr código en R, copiar resultados a un procesador de texto, ajustar manualmente tablas y gráficos, y repetir el ciclo cada vez que algo cambia. Este proceso es lento, propenso a errores y dificulta la reproducibilidad: la capacidad de que cualquier persona pueda llegar exactamente a los mismos resultados a partir de los mismos datos y procedimientos.

Los documentos dinámicos resuelven este problema al integrar en un solo archivo el texto, el código y los resultados del análisis. Si los datos cambian, el documento se actualiza automáticamente al renderizarlo.

1.1 Reproducibilidad

La reproducibilidad es un principio central de la ciencia abierta. Un análisis es reproducible cuando:

  • El código fuente está disponible y documentado.
  • Los datos de entrada están accesibles o descritos con precisión.
  • El entorno de trabajo (paquetes, versiones) está registrado.
  • Cualquier persona puede llegar al mismo resultado siguiendo los mismos pasos.

1.2 Markdown vs. Quarto

Concepto Descripción
Markdown Lenguaje de texto plano con marcas mínimas de formato (.md). Solo texto y estructura.
R Markdown Extensión de Markdown que permite incluir código R ejecutable (.Rmd). Específico para R.
Quarto Sistema moderno y multilenguaje (R, Python, Julia) para documentos dinámicos (.qmd). Estándar actual del curso.

2 Creamos nuestro primer archivo .qmd

2.1 Creación del archivo

  1. Nos vamos a la sección File -> New File -> Quarto Document…

quarto-1
  1. Creamos un nombre del documento y autor/a. Le damos a Create.

quarto-2

2.2 Trabajando el documento

2.2.1 Escritura plana

Todo el texto de un archivo .qmd se escribe en Markdown.

Código Resultado
**negrita** negrita
*cursiva* cursiva
# Título 1 # Encabezado de nivel 1
## Título 2 ## Encabezado de nivel 2
[texto](https://https://www.markdownguide.org/) link
![alt](path/images.png) texto imagen
> cita > cita
- ítem Lista
1. lista Lista ordenada

2.2.2 Códigos: Chunks!!!

Para poder escribir código de análisis en un documento Quarto debemos generar un trozo de código llamado ‘Chunk’, que se puede crear con ctrl+alt+i o directamente en el menú de arriba en ‘Code -> Insert Chunk’.

quarto-3
  • Los chunks comienzan y terminan con ```
  • {R} Se refiere al lenguaje de programación. En este caso: R
  • Cada chunks puede ir con diferentes opciones. Por defecto, si no se introduce ninguna especificación, vienen como TRUE
Opción Descripción
echo Muestra u oculta el código fuente
eval Ejecuta o no el código
output Incluye o excluye los resultados
warning Muestra u oculta advertencias
message Muestra u oculta mensajes de carga
include Control global: suprime código y resultados
label Identifica el chunk para referencias cruzadas
fig-cap Título para gráficos (label: fig-...)
tbl-cap Título para tablas (label: tbl-...)

2.2.3 Referencias Cruzadas: Tablas y gráficos!!!

  1. Label en tablas

Para tablas, debe empezar con el prefijo label: tbl-nombre

Esto permite que Quarto reconozca el bloque como una tabla numerable y que puedas crear enlaces hacia ella desde el texto.

  1. Referencias Cruzadas

Sintaxis Estándar: Se usa @tbl-label. Quarto lo reemplazará automáticamente por “Tabla 1”, “Tabla 2”, etc.

La numeración (1, 2, 3…) depende exclusivamente del orden de aparición en el documento.

No puedes forzar que la quinta tabla creada sea la “Tabla 1” manualmente mediante código; si necesitas cambiar el orden, debes mover el bloque de código físicamente hacia arriba o hacia abajo en el archivo.

  1. Tips!!!
  • Sintaxis Personalizada: Si quieres que el enlace tenga un nombre propio (ej: “ver resumen de datos”), usa el formato de link: [texto personalizado](@tbl-label).

  • Al inicio de tu documento, crea un chunk (sin necesidad de label o cap) donde realices todo el procesamiento estadístico. Aquí guardas el resultado final en un objeto de R.

Más adelante, en el lugar exacto donde quieres que aparezca la tabla en tu informe, creas un chunk pequeño que solo contenga el label, el caption y el nombre del objeto

  1. Gráficos:

Para los gráficos el label cambia a @fig-nombre


3 Aplicación práctica: Estatus Social Subjetivo

3.1 Preparación

Primero veamos un chunks creado desde 0. Cargaremos nuestras librerías:

pacman::p_load(ggplot2, dplyr, kable, kableExtra)
Installing package into 'C:/Users/cmeji/AppData/Local/R/win-library/4.5'
(as 'lib' is unspecified)
Warning: package 'kable' is not available for this version of R

A version of this package for your version of R might be available elsewhere,
see the ideas at
https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
Warning: unable to access index for repository http://www.stats.ox.ac.uk/pub/RWin/bin/windows/contrib/4.5:
  no fue posible abrir la URL 'http://www.stats.ox.ac.uk/pub/RWin/bin/windows/contrib/4.5/PACKAGES'
Warning: 'BiocManager' not available.  Could not check Bioconductor.

Please use `install.packages('BiocManager')` and then retry.
Warning in p_install(package, character.only = TRUE, ...):
Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
logical.return = TRUE, : no hay paquete llamado 'kable'
Warning in pacman::p_load(ggplot2, dplyr, kable, kableExtra): Failed to install/load:
kable


Para no ver estos warning o mensajes cambiamos las opciones del chunks a FALSE

pacman::p_load(tidyverse, dplyr, sjmisc, sjPlot, ggplot2, kableExtra, parameters)

options(scipen = 999)
rm(list = ls())

3.2 Carga de datos

load(url("https://github.com/Cristobal-Mejias-G/Clase-4-MC-FAGOB/raw/main/input/data/issp_2009_chile.RData"))

names(issp)
 [1] "sex"           "age"           "educyrs"       "income"       
 [5] "topbot"        "pref_redis"    "perc_ineq"     "conflict_rp"  
 [9] "conflict_wcmc" "conflict_mw"   "conflict_tb"  
glimpse(issp)
Rows: 1,505
Columns: 11
$ sex           <fct> 1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1,…
$ age           <dbl> 23, 33, 36, 65, 20, 19, 41, 42, 50, 47, 21, 55, 58, 35, …
$ educyrs       <dbl> 12, 13, 7, 6, 13, 13, 13, 10, 13, 22, 12, 6, 8, 10, 8, 1…
$ income        <dbl> 5, 5, 7, 3, 1, 5, 9, 1, 5, 10, 8, 1, 6, 6, 9, 9, 1, 4, 9…
$ topbot        <dbl> 5, 5, 5, 6, 6, 4, 5, 6, 4, 6, 4, 6, 4, 1, 3, 5, 2, 5, 4,…
$ pref_redis    <dbl> 1, 4, 5, 2, 5, 4, 4, 3, 4, 3, 4, 4, 4, 4, 4, 3, 4, 4, 4,…
$ perc_ineq     <dbl> 3, 5, 5, 4, 5, 4, 5, 5, 5, 4, 5, 2, 2, 4, 5, 2, 4, 4, 4,…
$ conflict_rp   <dbl> 4, 1, 4, 3, 3, 2, 2, 2, 3, 2, 3, 1, 1, 3, 2, 4, 3, 3, 2,…
$ conflict_wcmc <dbl> 3, 2, 4, 3, 3, 1, 3, 1, 3, 1, 2, 1, 3, 3, 1, 2, 2, 3, NA…
$ conflict_mw   <dbl> 1, 3, 4, 2, 4, 3, 3, 3, 3, 2, 3, 1, 4, 3, 2, 2, 2, 3, 3,…
$ conflict_tb   <dbl> 4, 1, 3, 3, 3, 2, 3, 2, 3, 1, 1, 2, 4, 3, 2, 4, 3, 4, 3,…

3.3 Tabla descriptiva

sjmisc::descr(issp,
      show = c("label","range", "mean", "sd", "NA.prc", "n"))%>% # Selecciona estadísticos
      kable(.,"markdown") # Esto es para que se vea bien en quarto
Tabla 1: Estadísticos descriptivos de variables seleccionadas
var label n NA.prc mean sd range
10 sex Sexo 1505 0.0000000 1.582060 0.4933842 1 (1-2)
1 age Edad 1505 0.0000000 46.561462 17.6353912 73 (18-91)
6 educyrs Nivel educativo 1451 3.5880399 10.762922 4.4097420 24 (1-25)
7 income Decil ingreso 1146 23.8538206 5.489529 2.8723002 9 (1-10)
11 topbot Estatus social subjetivo 1490 0.9966777 4.025503 1.6599884 9 (1-10)
9 pref_redis Preferencia por redistribución 1477 1.8604651 3.828030 0.8835747 4 (1-5)
8 perc_ineq Percepción desigualdad 1492 0.8637874 4.188338 0.8271374 4 (1-5)
3 conflict_rp Conflictos: ricos - pobres 1438 4.4518272 2.613352 0.8665370 3 (1-4)
5 conflict_wcmc Conflictos: clase trabajadora - clase media 1426 5.2491694 2.289621 0.8965377 3 (1-4)
2 conflict_mw Conflictos: directivos - trabajadores 1427 5.1827243 2.714085 0.8304120 3 (1-4)
4 conflict_tb Conflictos: gente de arriba - gente de abajo 1425 5.3156146 2.661754 0.9044854 3 (1-4)

La tabla descriptiva resume las variables a trabajar

3.4 Modelo de regresión lineal

modelo_1 <- lm(topbot ~ educyrs,          data = issp)
modelo_2 <- lm(topbot ~ educyrs + income, data = issp)

3.5 Tabla de regresión con sjPlot

sjPlot::tab_model(
  modelo_1, modelo_2,
  show.ci     = FALSE,
  show.se     = TRUE,
  dv.labels   = c("Modelo 1", "Modelo 2"),
  pred.labels = c("(Intercepto)", "Educación (nivel educativo)", "Ingreso (decíles"),
  title       = "Variable dependiente: Estatus Social Subjetivo (1–10)"
)
Tabla 2: Modelos de regresión: Estatus Social Subjetivo
Variable dependiente: Estatus Social Subjetivo (1–10)
  Modelo 1 Modelo 2
Predictors Estimates std. Error p Estimates std. Error p
(Intercepto) 2.45 0.11 <0.001 2.14 0.13 <0.001
Educación (nivel educativo) 0.15 0.01 <0.001 0.12 0.01 <0.001
Ingreso (decíles 0.11 0.02 <0.001
Observations 1440 1099
R2 / R2 adjusted 0.162 / 0.161 0.190 / 0.189

3.6 Visualización

ggplot(issp, aes(x = educyrs, y = topbot)) +
  geom_jitter(alpha = 0.2, color = "#3498db", width = 0.3, height = 0.3) +
  geom_smooth(method = "lm", se = TRUE, color = "#e74c3c", linewidth = 1.2) +
  labs(
    title   = "Estatus social subjetivo según nivel educativo",
    x       = "Educación (nivel educativo)",
    y       = "Estatus social subjetivo (1–10)",
    caption = "Fuente: Elaboración propia en base a ISSP."
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold"))
Figura 1: Relación entre educación y estatus social subjetivo

La Figura 1 muestra la asociación positiva entre años de escolaridad y el estatus percibido.


4 De Documento a Presentación

Una ventaja clave de Quarto es que el mismo archivo puede convertirse en distintos formatos simplemente cambiando el YAML.

4.1 Cambiar el formato

Documento HTML:

format: html

Presentación RevealJS:

format: revealjs

4.2 Separar diapositivas

Los encabezados # y ## crean diapositivas automáticamente. También se puede usar --- para separar manualmente:

## Primera diapositiva

Contenido aquí.

---

Nueva diapositiva sin título.

4.3 Opciones útiles de RevealJS

format:
  revealjs:
    theme: simple
    slide-number: true
    incremental: true

5 Recursos para profundizar


Documento creado para el curso Métodos Cuantitativos para la Administración Pública· Cristóbal Mejías
Sesión 4 · 17 de abril de 2026