Adherencia HM en el Centro de Simulación

Ingesta de datos

Authors
Affiliation

Mario Camacho

Facultad de Medicina

Fernando Neria

Facultad de Medicina

Published

November 19, 2025

Modified

February 3, 2025

Set up

wd <- "C:/Users/mario.camacho/OneDrive - UFV/Hospitales CAM"
wd <- file.path(wd, "Sureste/Bea Isidoro 202511/20251118 Adherencia Higiene Manos en Centro de Simulación Clínica")
setwd(wd)                       # cambia el WD de la sesión
knitr::opts_knit$set(root.dir = wd)  # mantiene el WD en todos los chunks al render
source('scr/zz_libraries.R')
source('scr/zz_funciones.R')

# Opciones globales de chunk
opts_chunk$set(
  fig.width = 6,
  fig.height = 4,
  fig.align = "center",
  out.width = "80%",
  fig.show = "hold"
)

# Espaciado entre imágenes en HTML
cat("<style>img { margin-bottom: 20px; }</style>")
<style>img { margin-bottom: 20px; }</style>
options(skimr.max_char = 100) # Para que no trunque los nombres de los factores

Ingesta

# Al hacer render y un nuevo hedline, se crea un nu
data_raw <- read_excel("raw/20251118 Base datos Registros HM UFV.xlsx", sheet = "Registros HM")
data <- data_raw
# View(data)
# View(data |> filter(id_video=='v153738-578'), title = "id_video v153738-578")

Evaluación de medidas repetidas

# Registros por cada id
id_count <- data |>
  group_by(id) |>
  summarise(n_registros = n(), .groups = "drop")

unicos <- sum(id_count$n_registros == 1)
multiples <- sum(id_count$n_registros > 1)

if (multiples == 0) {
  print("Solo un registro por cada id en la base de datos")
} else {
  print(paste(unicos, "id tienen un único registro y", multiples, "id tienen más de un registro"))
}
[1] "Solo un registro por cada id en la base de datos"
# Cursos por cada id
id_curso_count <- data |>
  group_by(id,curso) |>
  summarise(n_registros = n(), .groups = "drop")

unicos <- sum(id_curso_count$n_registros == 1)
multiples <- sum(id_curso_count$n_registros > 1)

if (multiples == 0) {
  print("Ningún alumno (id) ha sido evaluado en más de un curso")
} else {
  print(paste(unicos, "alumnos (id) han sido evaluados en un único curso y", multiples, "alumnos han sido evaluados en más de una vez"))
}
[1] "Ningún alumno (id) ha sido evaluado en más de un curso"

Formatos

### Solo para hacer pruebas con las continuas
# data <- data |>  mutate(guantes = as.numeric(guantes == "SI"))
####

var <- c('curso','escenario','situacion','indicacion','accion','guantes')

data[var] |> mutate(across(everything(), factor)) |> summary()
                             curso                      escenario               situacion   
 4º (post-formación corto plazo): 73   Box                   :572   Entrada          :  12  
 4º (pre-formación)             :371   Consulta              :325   Punto de atención:1130  
 5º (post-formación largo plazo):698   Procedimiento invasivo:245                           
                                                                                            
                                                                                            
                                            indicacion           accion    guantes  
 Antes de realizar una técnica aséptica          :136   Agua + Jabón:  9   NO:1021  
 Antes del contacto con el paciente              :472   No HM       :885   SI: 121  
 Después del contacto con el entorno del paciente: 41   PBA         :248            
 Después del contacto con el paciente            :355                               
 Después del riesgo de exposición a fluidos      :138                               
data <- data |> mutate(across(var[1], ~factor(., levels = c("4º (pre-formación)", "4º (post-formación corto plazo)", "5º (post-formación largo plazo)"),
                                               ordered = TRUE)))
data <- data |> mutate(across(var[4], ~factor(., levels = c("Antes del contacto con el paciente",
                                                            "Antes de realizar una técnica aséptica",
                                                            "Después del riesgo de exposición a fluidos",
                                                            "Después del contacto con el paciente",
                                                            "Después del contacto con el entorno del paciente"),
                                               labels = c("M1", "M2", "M3", "M4", "M5"),
                                               ordered = FALSE))) # Puse TRUE pero creo que es FALSE

data[var] |> select(where(is.character)) |> mutate(across(where(is.character), factor)) |> summary()
                  escenario               situacion             accion    guantes  
 Box                   :572   Entrada          :  12   Agua + Jabón:  9   NO:1021  
 Consulta              :325   Punto de atención:1130   No HM       :885   SI: 121  
 Procedimiento invasivo:245                            PBA         :248            
data <- data |> mutate(across(any_of(var) & where(is.character), factor))

# View(data |> filter(id_video=='v153738-578'), title = "id_video v153738-578")

data <- data |> select(-all_of(intersect("id", names(data))))
data <- data |> select(-all_of(intersect("id_video", names(data)))) # OJO QUE SE PODRÍA USAR EL VÍDEO COMO UN FACTOR ALEATORIO
# (cada vídeo es revisado en por gente diferente, por gente diferente... y eso afectase a la evaluación - no sé si evaluar HM es muy subjetivo o no)

data |> str()
tibble [1,142 × 6] (S3: tbl_df/tbl/data.frame)
 $ curso     : Ord.factor w/ 3 levels "4º (pre-formación)"<..: 1 1 1 1 1 1 1 1 1 1 ...
 $ escenario : Factor w/ 3 levels "Box","Consulta",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ situacion : Factor w/ 2 levels "Entrada","Punto de atención": 2 2 2 2 2 2 2 2 2 2 ...
 $ indicacion: Factor w/ 5 levels "M1","M2","M3",..: 1 4 1 4 1 4 1 4 1 4 ...
 $ accion    : Factor w/ 3 levels "Agua + Jabón",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ guantes   : Factor w/ 2 levels "NO","SI": 1 1 1 1 1 1 1 1 1 1 ...

Variable respuesta

cat("La variable respuesta 'oportunidad de HM realizada' no depende del producto y ya se ha tenido en cuenta la variable 'guantes'.")
La variable respuesta 'oportunidad de HM realizada' no depende del producto y ya se ha tenido en cuenta la variable 'guantes'.
table(data$guantes, data$accion)
    
     Agua + Jabón No HM PBA
  NO            8   788 225
  SI            1    97  23
data <- data |> mutate(accion = factor(if_else(accion=='No HM', 'No HM', 'HM'), levels = c('No HM', 'HM')))

table(data$guantes, data$accion)
    
     No HM  HM
  NO   788 233
  SI    97  24
# Definir los colores fijos
colores_accion <- c("HM" = "green", "No HM" = "yellow")
# Sobrescribir las escalas por defecto
# update_geom_defaults("bar", list(fill = colores_accion["No HM"]))
# update_geom_defaults("point", list(color = colores_accion["No HM"]))
# Función que aplica la escala automáticamente
escala_accion <- function() {
  list(
    scale_fill_manual(values = colores_accion),
    scale_color_manual(values = colores_accion)
  )
}

Guardar

saveRDS(list(data = data, data_raw = data_raw), "raw/data.RDA")
saveRDS(list(colores_accion = colores_accion, escala_accion = escala_accion), "raw/HM_colores.RDA")