Predictores del desempeño

Author
Published

April 15, 2026

Code
# options to customize chunk outputs
knitr::opts_chunk$set(
  tidy.opts = list(width.cutoff = 65), 
  tidy = TRUE,
  message = FALSE
 )

Objetivo

  • Evaluar predictores del desempeño en la Olimpiada Costarricense de Biología (OLICOCIBI)

Cargar paquetes

Code
# | message: false | warning: false

# install/ load packages
sketchy::load_packages(packages = c("readxl", "emmeans", "ggplot2",
    "viridis"))

1 Leer datos

Code
datos_org <- read_excel("/home/m/Dropbox/Projects/olimpiadas_biologia/OLICOCIBI_Total_Recopilado.xlsx")
# dat$ names(dat)

dat <- datos_org[complete.cases(datos_org[, c("Provincia", "Zona",
    "Tipo", "Sexo", "Año", "Categoría (A o B)", "Nota eliminatoria")]),
    ]

dat$Medalla.bin <- ifelse(is.na(dat$Medalla), "No", "Si")


# nrow(dat)


dat <- dat[, c("Provincia", "Zona", "Tipo", "Sexo", "Año", "Categoría (A o B)",
    "Nota eliminatoria", "Medalla.bin")]

names(dat) <- c("Provincia", "Zona", "Tipo", "Sexo", "Año", "Categoria",
    "Nota", "Medalla.bin")

dat$Sexo[dat$Sexo == "FF"] <- "F"

dat$Sexo[dat$Sexo == "f"] <- "F"
dat$Sexo[dat$Sexo == "m"] <- "M"


dat <- dat[dat$Sexo != "*", ]
# nrow(dat) table(dat$Sexo) table(dat$Tipo)

dat$Notap <- dat$Nota/100

2 Analisis

2.1 Nota eliminatoria

2.1.1 Regresión

Code
dat$Provincia <- factor(dat$Provincia, levels = c("San Jose", "Alajuela",
    "Heredia", "Cartago", "Limon", "Puntarenas", "Guanacaste"))


formula <- "Notap ~ Provincia + Zona + Tipo + Sexo + Categoria"


mod <- glm(formula, data = dat)


summary(mod)

Call:
glm(formula = formula, data = dat)

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.492565   0.006246  78.864  < 2e-16 ***
ProvinciaAlajuela    0.011823   0.003871   3.054 0.002263 ** 
ProvinciaHeredia     0.025837   0.004774   5.412 6.35e-08 ***
ProvinciaCartago    -0.019392   0.005532  -3.506 0.000457 ***
ProvinciaLimon      -0.033419   0.004783  -6.987 2.97e-12 ***
ProvinciaPuntarenas -0.028782   0.004891  -5.884 4.12e-09 ***
ProvinciaGuanacaste -0.053954   0.005162 -10.453  < 2e-16 ***
ZonaUrbano           0.007551   0.004101   1.841 0.065589 .  
TipoPNC             -0.145983   0.004104 -35.575  < 2e-16 ***
TipoPrivado         -0.102684   0.003947 -26.017  < 2e-16 ***
TipoSubvencionado   -0.103792   0.006568 -15.804  < 2e-16 ***
SexoM                0.004325   0.002678   1.615 0.106366    
CategoriaB           0.021684   0.002671   8.118 5.25e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for gaussian family taken to be 0.01953633)

    Null deviance: 257.94  on 11267  degrees of freedom
Residual deviance: 219.88  on 11255  degrees of freedom
AIC: -12353

Number of Fisher Scoring iterations: 2

2.1.2 Comparaciones multiples

Code
# contrasts by tipo
emmeans(mod, pairwise ~ Tipo, type = "response")
$emmeans
 Tipo          emmean      SE    df lower.CL upper.CL
 PC             0.495 0.00370 11255    0.488    0.503
 PNC            0.349 0.00227 11255    0.345    0.354
 Privado        0.393 0.00300 11255    0.387    0.399
 Subvencionado  0.392 0.00586 11255    0.380    0.403

Results are averaged over the levels of: Provincia, Zona, Sexo, Categoria 
Confidence level used: 0.95 

$contrasts
 contrast                estimate      SE    df t.ratio p.value
 PC - PNC                 0.14598 0.00410 11255  35.575  <.0001
 PC - Privado             0.10268 0.00395 11255  26.017  <.0001
 PC - Subvencionado       0.10379 0.00657 11255  15.804  <.0001
 PNC - Privado           -0.04330 0.00351 11255 -12.339  <.0001
 PNC - Subvencionado     -0.04219 0.00627 11255  -6.724  <.0001
 Privado - Subvencionado  0.00111 0.00600 11255   0.185  0.9978

Results are averaged over the levels of: Provincia, Zona, Sexo, Categoria 
P value adjustment: tukey method for comparing a family of 4 estimates 

2.1.3 Gráficos

Code
dat$Tipo <- factor(dat$Tipo, levels = c("PC", "Privado", "Subvencionado", "PNC"))

# raincoud plot:
fill_color <- mako(10, alpha = 0.4)[7]

ggplot(dat, aes(y = Nota, x = Tipo)) +
  # add half-violin from {ggdist} package
  ggdist::stat_halfeye(
    fill = fill_color,
    alpha = 0.5,
    # custom bandwidth
    adjust = .5,
    # adjust height
    width = .6,
    .width = 0,
    # move geom to the cright
    justification = -.2,
    point_colour = NA
  ) +
  geom_boxplot(fill = fill_color,
    width = .15,
    # remove outliers
    outlier.shape = NA # `outlier.shape = NA` works as well
  ) +
  # add justified jitter from the {gghalves} package
  gghalves::geom_half_point(
    color = fill_color,
    # draw jitter on the left
    side = "l",
    # control range of jitter
    range_scale = .4,
    # add some transparency
    alpha = .5,
  ) +
   # ylim(c(-30, 310)) +
  # geom_text(data = agg_dat, aes(y = rep(-25, 5), x = sensory_input, label = n.labels), nudge_x = -0.13, size = 6) + 
  #  scale_x_discrete(labels=c("Control" = "Noise control", "Sound vision" = "Sound & vision", "Vision" = "Vision", "Lessen input" = "Lessen input")) +
  labs(x = "Tipo de colegio", y = "Nota (%)") + theme(axis.text.x = element_text(angle = 15, hjust = 1))

Code
agg <- aggregate(Notap ~ Provincia, data = dat, mean)
agg <- agg[order(agg$Notap, decreasing = T),]


dat$Provincia <- factor(dat$Provincia, levels = agg$Provincia)


ggplot(dat, aes(y = Nota, x = Provincia)) +
  # add half-violin from {ggdist} package
  ggdist::stat_halfeye(
    fill = fill_color,
    alpha = 0.5,
    # custom bandwidth
    adjust = .5,
    # adjust height
    width = .6,
    .width = 0,
    # move geom to the cright
    justification = -.2,
    point_colour = NA
  ) +
  geom_boxplot(fill = fill_color,
    width = .15,
    # remove outliers
    outlier.shape = NA # `outlier.shape = NA` works as well
  ) +
  # add justified jitter from the {gghalves} package
  gghalves::geom_half_point(
    color = fill_color,
    # draw jitter on the left
    side = "l",
    # control range of jitter
    range_scale = .4,
    # add some transparency
    alpha = .5,
  ) +
   # ylim(c(-30, 310)) +
  # geom_text(data = agg_dat, aes(y = rep(-25, 5), x = sensory_input, label = n.labels), nudge_x = -0.13, size = 6) + 
  #  scale_x_discrete(labels=c("Control" = "Noise control", "Sound vision" = "Sound & vision", "Vision" = "Vision", "Lessen input" = "Lessen input")) +
  labs(x = "Provincia", y = "Nota (%)") + theme(axis.text.x = element_text(angle = 15, hjust = 1))

2.2 Medallas

2.2.1 Regresión

Code
dat$Provincia <- factor(dat$Provincia, levels = c("San Jose", "Alajuela",
    "Heredia", "Cartago", "Limon", "Puntarenas", "Guanacaste"))

dat$medalla <- ifelse(dat$Medalla.bin == "Si", 1, 0)
formula <- "medalla ~ Provincia + Zona + Tipo + Sexo + Categoria"

mod <- glm(formula, data = dat, family = binomial(link = "logit"))


summary(mod)

Call:
glm(formula = formula, family = binomial(link = "logit"), data = dat)

Coefficients:
                    Estimate Std. Error z value Pr(>|z|)    
(Intercept)         -2.02055    0.24579  -8.220  < 2e-16 ***
ProvinciaAlajuela    0.22167    0.10851   2.043  0.04106 *  
ProvinciaHeredia     0.20663    0.15772   1.310  0.19016    
ProvinciaCartago    -0.59420    0.19720  -3.013  0.00259 ** 
ProvinciaLimon      -0.96287    0.17928  -5.371 7.84e-08 ***
ProvinciaPuntarenas -0.73822    0.18502  -3.990 6.61e-05 ***
ProvinciaGuanacaste -2.19322    0.31686  -6.922 4.46e-12 ***
ZonaUrbano           0.49134    0.20901   2.351  0.01874 *  
TipoPrivado         -1.53743    0.10379 -14.812  < 2e-16 ***
TipoSubvencionado   -2.07364    0.24290  -8.537  < 2e-16 ***
TipoPNC             -2.43238    0.15425 -15.769  < 2e-16 ***
SexoM                0.42719    0.08618   4.957 7.15e-07 ***
CategoriaB           0.05307    0.08671   0.612  0.54050    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 4857.9  on 11267  degrees of freedom
Residual deviance: 4165.6  on 11255  degrees of freedom
AIC: 4191.6

Number of Fisher Scoring iterations: 7

2.2.2 Comparaciones multiples

Code
# contrasts by tipo
emmeans(mod, pairwise ~ Tipo, type = "response")
$emmeans
 Tipo            prob      SE  df asymp.LCL asymp.UCL
 PC            0.1077 0.01200 Inf   0.08631    0.1335
 Privado       0.0253 0.00324 Inf   0.01965    0.0325
 Subvencionado 0.0149 0.00370 Inf   0.00918    0.0242
 PNC           0.0105 0.00147 Inf   0.00797    0.0138

Results are averaged over the levels of: Provincia, Zona, Sexo, Categoria 
Confidence level used: 0.95 
Intervals are back-transformed from the logit scale 

$contrasts
 contrast                odds.ratio    SE  df null z.ratio p.value
 PC / Privado                  4.65 0.483 Inf    1  14.812  <.0001
 PC / Subvencionado            7.95 1.930 Inf    1   8.537  <.0001
 PC / PNC                     11.39 1.760 Inf    1  15.769  <.0001
 Privado / Subvencionado       1.71 0.407 Inf    1   2.251  0.1097
 Privado / PNC                 2.45 0.382 Inf    1   5.735  <.0001
 Subvencionado / PNC           1.43 0.383 Inf    1   1.342  0.5358

Results are averaged over the levels of: Provincia, Zona, Sexo, Categoria 
P value adjustment: tukey method for comparing a family of 4 estimates 
Tests are performed on the log odds ratio scale 

2.2.3 Gráficos

Code
dat$Tipo <- factor(dat$Tipo, levels = c("PC", "Privado", "Subvencionado",
    "PNC"))

# raincoud plot:
fill_color <- mako(10, alpha = 0.7)[7]


ggplot(dat, aes(y = medalla, x = Tipo)) + geom_bar(stat = "identity",
    fill = fill_color) + labs(x = "Tipo de colegio", y = "Total de medallas") +
    theme(axis.text.x = element_text(angle = 15, hjust = 1))

Code
agg_med <- aggregate(medalla ~ Tipo, data = dat, function(x) sum(x)/length(x))

ggplot(agg_med, aes(y = medalla, x = Tipo)) + geom_bar(stat = "identity",
    fill = fill_color) + labs(x = "Tipo de colegio", y = "Proporción con medalla") +
    theme(axis.text.x = element_text(angle = 15, hjust = 1))

Code
ggplot(dat, aes(y = medalla, x = Provincia)) + geom_bar(stat = "identity",
    fill = fill_color) + labs(x = "Tipo de colegio", y = "Total de medallas") +
    theme(axis.text.x = element_text(angle = 15, hjust = 1))

Code
agg_med <- aggregate(medalla ~ Provincia, data = dat, function(x) sum(x)/length(x))

agg_med <- agg_med[order(agg_med$medalla, decreasing = T), ]


agg_med$Provincia <- factor(agg_med$Provincia, levels = agg_med$Provincia)


ggplot(agg_med, aes(y = medalla, x = Provincia)) + geom_bar(stat = "identity",
    fill = fill_color) + labs(x = "Provincia", y = "Proporción con medalla") +
    theme(axis.text.x = element_text(angle = 15, hjust = 1))

2.3 Nota final

2.3.1 Regresión

Code
# | message: false | warning: false

dat <- datos_org[complete.cases(datos_org[, c("Provincia", "Zona",
    "Tipo", "Sexo", "Año", "Categoría (A o B)", "Nota final")]),
    ]

dat$Medalla.bin <- ifelse(is.na(dat$Medalla), "No", "Si")

dat <- dat[, c("Provincia", "Zona", "Tipo", "Sexo", "Año", "Categoría (A o B)",
    "Nota final")]

names(dat) <- c("Provincia", "Zona", "Tipo", "Sexo", "Año", "Categoria",
    "Nota")

dat$Sexo[dat$Sexo == "FF"] <- "F"

dat$Sexo[dat$Sexo == "f"] <- "F"
dat$Sexo[dat$Sexo == "m"] <- "M"


dat <- dat[dat$Sexo != "*", ]
# nrow(dat) table(dat$Sexo) table(dat$Tipo)

dat$Notap <- dat$Nota/100
Code
dat$Provincia <- factor(dat$Provincia, levels = c("San Jose", "Alajuela",
    "Heredia", "Cartago", "Limon", "Puntarenas", "Guanacaste"))


formula <- "Notap ~ Provincia + Zona + Tipo + Sexo + Categoria"


mod <- glm(formula, data = dat)


summary(mod)

Call:
glm(formula = formula, data = dat)

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.586187   0.014621  40.091  < 2e-16 ***
ProvinciaAlajuela   -0.011826   0.007394  -1.599   0.1099    
ProvinciaHeredia     0.014788   0.010198   1.450   0.1472    
ProvinciaCartago    -0.003081   0.014628  -0.211   0.8332    
ProvinciaLimon      -0.025182   0.011670  -2.158   0.0311 *  
ProvinciaPuntarenas -0.024353   0.011724  -2.077   0.0379 *  
ProvinciaGuanacaste -0.078667   0.016853  -4.668 3.28e-06 ***
ZonaUrbano          -0.019626   0.011727  -1.674   0.0944 .  
TipoPNC             -0.080680   0.009365  -8.615  < 2e-16 ***
TipoPrivado         -0.040463   0.007006  -5.775 9.13e-09 ***
TipoSubvencionado   -0.094616   0.014963  -6.323 3.26e-10 ***
SexoM                0.025698   0.005747   4.472 8.28e-06 ***
CategoriaB          -0.110457   0.005867 -18.827  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for gaussian family taken to be 0.01358634)

    Null deviance: 30.345  on 1712  degrees of freedom
Residual deviance: 23.097  on 1700  degrees of freedom
AIC: -2487.4

Number of Fisher Scoring iterations: 2

2.3.2 Comparaciones multiples

Code
# contrasts by tipo
emmeans(mod, pairwise ~ Tipo, type = "response")
$emmeans
 Tipo          emmean      SE   df lower.CL upper.CL
 PC             0.516 0.00718 1700    0.502     0.53
 PNC            0.435 0.00776 1700    0.420     0.45
 Privado        0.475 0.00761 1700    0.460     0.49
 Subvencionado  0.421 0.01480 1700    0.392     0.45

Results are averaged over the levels of: Provincia, Zona, Sexo, Categoria 
Confidence level used: 0.95 

$contrasts
 contrast                estimate      SE   df t.ratio p.value
 PC - PNC                  0.0807 0.00936 1700   8.615  <.0001
 PC - Privado              0.0405 0.00701 1700   5.775  <.0001
 PC - Subvencionado        0.0946 0.01500 1700   6.323  <.0001
 PNC - Privado            -0.0402 0.00932 1700  -4.316  0.0001
 PNC - Subvencionado       0.0139 0.01580 1700   0.882  0.8142
 Privado - Subvencionado   0.0542 0.01470 1700   3.689  0.0013

Results are averaged over the levels of: Provincia, Zona, Sexo, Categoria 
P value adjustment: tukey method for comparing a family of 4 estimates 

2.3.3 Gráficos

Code
dat$Tipo <- factor(dat$Tipo, levels = c("PC", "Privado", "Subvencionado", "PNC"))

# raincoud plot:
fill_color <- mako(10, alpha = 0.4)[7]

ggplot(dat, aes(y = Nota, x = Tipo)) +
  # add half-violin from {ggdist} package
  ggdist::stat_halfeye(
    fill = fill_color,
    alpha = 0.5,
    # custom bandwidth
    adjust = .5,
    # adjust height
    width = .6,
    .width = 0,
    # move geom to the cright
    justification = -.2,
    point_colour = NA
  ) +
  geom_boxplot(fill = fill_color,
    width = .15,
    # remove outliers
    outlier.shape = NA # `outlier.shape = NA` works as well
  ) +
  # add justified jitter from the {gghalves} package
  gghalves::geom_half_point(
    color = fill_color,
    # draw jitter on the left
    side = "l",
    # control range of jitter
    range_scale = .4,
    # add some transparency
    alpha = .5,
  ) +
   # ylim(c(-30, 310)) +
  # geom_text(data = agg_dat, aes(y = rep(-25, 5), x = sensory_input, label = n.labels), nudge_x = -0.13, size = 6) + 
  #  scale_x_discrete(labels=c("Control" = "Noise control", "Sound vision" = "Sound & vision", "Vision" = "Vision", "Lessen input" = "Lessen input")) +
  labs(x = "Tipo de colegio", y = "Nota (%)") + theme(axis.text.x = element_text(angle = 15, hjust = 1))

Code
agg <- aggregate(Notap ~ Provincia, data = dat, mean)
agg <- agg[order(agg$Notap, decreasing = T),]


dat$Provincia <- factor(dat$Provincia, levels = agg$Provincia)


ggplot(dat, aes(y = Nota, x = Provincia)) +
  # add half-violin from {ggdist} package
  ggdist::stat_halfeye(
    fill = fill_color,
    alpha = 0.5,
    # custom bandwidth
    adjust = .5,
    # adjust height
    width = .6,
    .width = 0,
    # move geom to the cright
    justification = -.2,
    point_colour = NA
  ) +
  geom_boxplot(fill = fill_color,
    width = .15,
    # remove outliers
    outlier.shape = NA # `outlier.shape = NA` works as well
  ) +
  # add justified jitter from the {gghalves} package
  gghalves::geom_half_point(
    color = fill_color,
    # draw jitter on the left
    side = "l",
    # control range of jitter
    range_scale = .4,
    # add some transparency
    alpha = .5,
  ) +
   # ylim(c(-30, 310)) +
  # geom_text(data = agg_dat, aes(y = rep(-25, 5), x = sensory_input, label = n.labels), nudge_x = -0.13, size = 6) + 
  #  scale_x_discrete(labels=c("Control" = "Noise control", "Sound vision" = "Sound & vision", "Vision" = "Vision", "Lessen input" = "Lessen input")) +
  labs(x = "Provincia", y = "Nota (%)") + theme(axis.text.x = element_text(angle = 15, hjust = 1))

Información de la sesión

─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.5.2 (2025-10-31)
 os       Ubuntu 22.04.5 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Costa_Rica
 date     2026-04-15
 pandoc   3.2 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/x86_64/ (via rmarkdown)
 quarto   1.7.31 @ /usr/local/bin/quarto

─ Packages ───────────────────────────────────────────────────────────────────
 package        * version  date (UTC) lib source
 cachem           1.1.0    2024-05-16 [1] CRAN (R 4.5.0)
 cellranger       1.1.0    2016-07-27 [3] CRAN (R 4.0.1)
 cli              3.6.6    2026-04-09 [1] CRAN (R 4.5.2)
 coda             0.19-4.1 2024-01-31 [1] CRAN (R 4.5.0)
 codetools        0.2-20   2024-03-31 [4] CRAN (R 4.5.0)
 crayon           1.5.3    2024-06-20 [1] CRAN (R 4.5.0)
 devtools         2.4.5    2022-10-11 [1] CRAN (R 4.5.0)
 digest           0.6.39   2025-11-19 [1] CRAN (R 4.5.0)
 distributional   0.5.0    2024-09-17 [1] CRAN (R 4.5.0)
 dplyr            1.1.4    2023-11-17 [1] CRAN (R 4.5.0)
 ellipsis         0.3.2    2021-04-29 [3] CRAN (R 4.1.1)
 emmeans        * 1.11.1   2025-05-04 [3] CRAN (R 4.5.0)
 estimability     1.5.1    2024-05-12 [3] CRAN (R 4.5.0)
 evaluate         1.0.5    2025-08-27 [1] CRAN (R 4.5.0)
 farver           2.1.2    2024-05-13 [1] CRAN (R 4.5.0)
 fastmap          1.2.0    2024-05-15 [1] CRAN (R 4.5.0)
 formatR          1.14     2023-01-17 [1] CRAN (R 4.5.0)
 fs               2.0.1    2026-03-24 [1] CRAN (R 4.5.2)
 generics         0.1.4    2025-05-09 [1] CRAN (R 4.5.0)
 ggdist           3.3.3    2025-04-23 [1] CRAN (R 4.5.0)
 gghalves         0.1.4    2025-12-03 [1] Github (teunbrand/gghalves@58ed08b)
 ggplot2        * 4.0.2    2026-02-03 [1] CRAN (R 4.5.2)
 glue             1.8.0    2024-09-30 [1] CRAN (R 4.5.0)
 gridExtra        2.3      2017-09-09 [1] CRAN (R 4.5.0)
 gtable           0.3.6    2024-10-25 [1] CRAN (R 4.5.0)
 htmltools        0.5.9    2025-12-04 [1] CRAN (R 4.5.0)
 htmlwidgets      1.6.4    2023-12-06 [1] RSPM (R 4.5.0)
 httpuv           1.6.16   2025-04-16 [1] RSPM (R 4.5.0)
 jsonlite         2.0.0    2025-03-27 [1] CRAN (R 4.5.0)
 knitr            1.51     2025-12-20 [1] CRAN (R 4.5.2)
 labeling         0.4.3    2023-08-29 [1] CRAN (R 4.5.0)
 later            1.4.2    2025-04-08 [1] RSPM (R 4.5.0)
 lattice          0.22-9   2026-02-09 [4] CRAN (R 4.5.2)
 lifecycle        1.0.5    2026-01-08 [1] CRAN (R 4.5.2)
 magrittr         2.0.5    2026-04-04 [1] CRAN (R 4.5.2)
 MASS             7.3-65   2025-02-28 [4] CRAN (R 4.4.3)
 Matrix           1.7-4    2025-08-28 [4] CRAN (R 4.5.1)
 memoise          2.0.1    2021-11-26 [1] CRAN (R 4.5.0)
 mime             0.13     2025-03-17 [1] CRAN (R 4.5.0)
 miniUI           0.1.2    2025-04-17 [3] CRAN (R 4.5.0)
 multcomp         1.4-28   2025-01-29 [3] CRAN (R 4.5.0)
 mvtnorm          1.3-3    2025-01-10 [1] CRAN (R 4.5.0)
 packrat          0.9.3    2025-06-16 [1] CRAN (R 4.5.2)
 pillar           1.11.1   2025-09-17 [1] CRAN (R 4.5.0)
 pkgbuild         1.4.8    2025-05-26 [1] CRAN (R 4.5.0)
 pkgconfig        2.0.3    2019-09-22 [1] CRAN (R 4.5.0)
 pkgload          1.4.1    2025-09-23 [1] CRAN (R 4.5.0)
 profvis          0.4.0    2024-09-20 [1] CRAN (R 4.5.0)
 promises         1.3.3    2025-05-29 [1] RSPM (R 4.5.0)
 purrr            1.2.0    2025-11-04 [1] CRAN (R 4.5.0)
 R6               2.6.1    2025-02-15 [1] CRAN (R 4.5.0)
 RColorBrewer     1.1-3    2022-04-03 [1] CRAN (R 4.5.0)
 Rcpp             1.1.1-1  2026-04-15 [1] local
 readxl         * 1.4.5    2025-03-07 [3] CRAN (R 4.5.0)
 remotes          2.5.0    2024-03-17 [1] CRAN (R 4.5.0)
 rlang            1.2.0    2026-04-06 [1] CRAN (R 4.5.2)
 rmarkdown        2.31     2026-03-26 [1] CRAN (R 4.5.2)
 rstudioapi       0.17.1   2024-10-22 [1] CRAN (R 4.5.0)
 S7               0.2.1-1  2025-11-14 [1] CRAN (R 4.5.2)
 sandwich         3.1-1    2024-09-15 [3] CRAN (R 4.5.0)
 scales           1.4.0    2025-04-24 [1] CRAN (R 4.5.0)
 sessioninfo      1.2.3    2025-02-05 [3] CRAN (R 4.5.0)
 shiny            1.10.0   2024-12-14 [1] CRAN (R 4.5.0)
 sketchy          1.0.7    2026-01-28 [1] CRANs (R 4.5.2)
 stringi          1.8.7    2025-03-27 [1] CRAN (R 4.5.0)
 stringr          1.6.0    2025-11-04 [1] CRAN (R 4.5.0)
 survival         3.8-6    2026-01-16 [4] CRAN (R 4.5.2)
 TH.data          1.1-3    2025-01-17 [3] CRAN (R 4.5.0)
 tibble           3.3.0    2025-06-08 [1] RSPM (R 4.5.0)
 tidyselect       1.2.1    2024-03-11 [1] CRAN (R 4.5.0)
 urlchecker       1.0.1    2021-11-30 [1] CRAN (R 4.5.0)
 usethis          3.1.0    2024-11-26 [3] CRAN (R 4.5.0)
 vctrs            0.7.3    2026-04-11 [1] CRAN (R 4.5.2)
 viridis        * 0.6.5    2024-01-29 [1] CRAN (R 4.5.0)
 viridisLite    * 0.4.3    2026-02-04 [1] CRAN (R 4.5.2)
 withr            3.0.2    2024-10-28 [1] CRAN (R 4.5.0)
 xaringanExtra    0.8.0    2024-05-19 [1] CRAN (R 4.5.0)
 xfun             0.57     2026-03-20 [1] CRAN (R 4.5.2)
 xtable           1.8-8    2026-02-22 [1] CRAN (R 4.5.2)
 yaml             2.3.12   2025-12-10 [1] CRAN (R 4.5.2)
 zoo              1.8-14   2025-04-10 [3] CRAN (R 4.5.0)

 [1] /home/m/R/x86_64-pc-linux-gnu-library/4.5
 [2] /usr/local/lib/R/site-library
 [3] /usr/lib/R/site-library
 [4] /usr/lib/R/library
 * ── Packages attached to the search path.

──────────────────────────────────────────────────────────────────────────────