FECHA_INICIO_SINTOMAS ... PROFESIONAL_O_TRABAJADOR_DE_LA_SALUD
0 20/05/2021 ... No
1 25/06/2021 ... No
2 3/02/2022 ... No
3 10/01/2022 ... No
4 30/01/2021 ... No
[5 rows x 10 columns]
Warning in instance$preRenderHook(instance): It seems your data is too big for
client-side DataTables. You may consider server-side processing:
https://rstudio.github.io/DT/server.html
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
Anaisis en personal de salud
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
Source Code
---title: "Reporte Covid 19"format: html: self-contained: true code-tools: true---```{r setup, message=FALSE, include=FALSE,warning=FALSE}# Cargar las librerías necesariaslibrary(readxl)library(lubridate)# Para trabajar con fechaslibrary(dplyr)library(zoo)library(gridExtra)library(ggplot2)# ===============================# CONFIGURACIÓN INICIAL Y CARGA DE PAQUETES# ===============================# Configurar entorno virtual de Python para reticulateSys.setenv(RETICULATE_PYTHON ="C:/Users/Windows 11/Documents/.virtualenvs/env_covid/Scripts/python.exe")library(reticulate)use_virtualenv("env_covid", required =TRUE)# Gestor de paquetesif (!require("pacman")) install.packages("pacman")# Lista completa de paquetes necesarios (sin duplicados)paquetes <-c(# Análisis y manipulación de datos"tidyverse", "dplyr", "tidyr", "stringr", "lubridate", "forcats","haven", "readr", "readxl", "writexl", "rio", "janitor", "cleaner","naniar", "skimr", "bench",# Visualización"ggplot2", "ggthemes", "ggridges", "ggforce", "GGally", "gridExtra","gplots", "corrplot", "RColorBrewer", "pheatmap", "plotly", "leaflet","leaflet.extras", "esquisse", "DT", "kableExtra", "flextable", "scales",# Estadística y modelado"caret", "pROC", "ROSE", "rcompanion", "psych", "PerformanceAnalytics","effsize", "effectsize", "car", "DescTools", "binom", "qgraph","FactoMineR", "factoextra", "FactoClass", "Rcpp",# Series temporales y epidemiología"tseries", "forecast", "tsibble", "incidence", "epicontacts", "distcrete","epitrix", "EpiEstim", "projections", "outbreaker2",# Otros"shiny", "pander", "broom", "knitr", "magrittr", "ape", "detectseparation","easypackages"# aunque easypackages no es necesario si ya usas pacman, lo dejo por si acaso)# Instalar y cargar todos los paquetespacman::p_load(char = paquetes)# ===============================# FUNCIONES PERSONALIZADAS# ===============================# Función para calcular intervalos de confianza para proporcionescalc_ci <-function(count, total, conf.level =0.95) { prop <- count / total z <-qnorm(1- (1- conf.level) /2) se <-sqrt(prop * (1- prop) / total) lower <-max(0, prop - z * se) # Asegura que no haya valores negativos upper <-min(1, prop + z * se) # Opcional: garantiza que no supere 100%return(sprintf("%.1f-%.1f", lower *100, upper *100)) # Devuelve porcentaje}calcular_ic <-function(x) { n <-sum(!is.na(x)) error_est <-sd(x, na.rm =TRUE) /sqrt(n) media <-mean(x, na.rm =TRUE) margen_error <-qnorm(0.975) * error_est media <-round(media, 2) margen_error <-round(margen_error, 2)return(paste(media, "±", margen_error))}```## Leemos la data```{python, echo=FALSE, warning=FALSE, message=FALSE}# Importamos pandasimport pandas as pdimport warningswarnings.filterwarnings('ignore')# Leemos el archivo CSV (ajusta el nombre si es diferente)Pacientes_covid_p = pd.read_csv("D:/nocturno/temporales/elena amatista/2026/02-febrero/OSB_EnfTransm_COVID_code.csv" ,sep=';')# Función para unificar las categoríasdef unificar_profesional(valor):if pd.isna(valor):return"Sin Ocupacion en Sivigila" v =str(valor).strip()if v.upper() in ["NO", "NO "] or v =="No":return"No"elif v.upper() in ["SI", "SI "] or v =="Si":return"Si"else:return"Sin Ocupacion en Sivigila"# Aplicar la transformaciónPacientes_covid_p["PROFESIONAL_O_TRABAJADOR_DE_LA_SALUD"] = Pacientes_covid_p["PROFESIONAL_O_TRABAJADOR_DE_LA_SALUD"].apply(unificar_profesional)# Mostramos información básicaprint("Dimensiones:", Pacientes_covid_p.shape)print("\nPrimeras 5 filas:")print(Pacientes_covid_p.head())# Si quieres ver los nombres de las columnasprint("\nColumnas:", Pacientes_covid_p.columns.tolist())``````{r, echo=FALSE, message=FALSE, warning=FALSE}Pacientes_covid_r <- py$Pacientes_covid_p#factorizamosPacientes_covid_r <- Pacientes_covid_r %>%mutate(# Conversión de tipos de datosFECHA_INICIO_SINTOMAS =as.Date(FECHA_INICIO_SINTOMAS, format ="%d/%m/%Y"),FECHA_DE_CONSULTA =as.Date(FECHA_DE_CONSULTA, format ="%d/%m/%Y"),across(3, as.factor),across(4:6, as.factor),across(7, as.numeric),across(8:10, as.factor))Pacientes_covid_r <- Pacientes_covid_r %>%arrange(across(2))``````{r,echo=FALSE}datatable( Pacientes_covid_r,rownames =FALSE,extensions =c("Buttons", "Scroller"),options =list(scrollX =TRUE,scrollY ="500px",scroller =TRUE,dom ="Bfrtip",buttons =c("copy", "csv", "excel") ))```## Descriptivos Basicos```{r, echo=FALSE, warning=FALSE, message=FALSE}edades_caja<-ggplot(data = Pacientes_covid_r, aes(x= EDAD,y =SEXO)) +geom_boxplot(fill ="#69b3a2", color ="#2d5c5a", width =0.6) +labs(title ="Distribución de Edades",y ="Sexo",x ="Edad") +theme_minimal() +theme(plot.title =element_text(hjust =0.5, face ="bold"),panel.grid.major.x =element_blank(),panel.grid.minor =element_blank(),axis.text =element_text(size =10),axis.title =element_text(size =12)) +coord_flip() # Opcional para orientación horizontal#colnames(MME_2024_desc)edades_caja# Calcular estadísticas y datos faltantessin_dato <-sum(is.na(Pacientes_covid_r$EDAD))datos_limpios <- Pacientes_covid_r %>%filter(!is.na(EDAD))cuartiles <-quantile(datos_limpios$EDAD, probs =c(0.25, 0.5, 0.75))N <-nrow(datos_limpios) # Total de observaciones válidas# Gráfico con eje Y en números absolutosgrafico1 <-ggplot(datos_limpios, aes(x = EDAD )) +geom_density(aes(y =after_stat(density * N)), # Escalar densidad a conteosfill ="steelblue", alpha =0.3,color =NA ) +geom_line(aes(y =after_stat(density * N)), # Línea escaladastat ="density", color ="steelblue", linewidth =0.8 ) +geom_vline(xintercept = cuartiles, color ="red", linetype ="dashed" ) +annotate("text", x = cuartiles, y =0, label =c("", "Med", ""), vjust =1.5, color ="red" ) +labs(title ="Distribución de edades",x ="Edad",y ="N" ) +scale_x_continuous(breaks =seq(0, 60, 10)) +scale_y_continuous(labels = comma) +# Formato con comastheme_minimal()grafico1##inicio tablas descriptivascolnames(Pacientes_covid_r[8:10])Pacientes_covid_r_desc<-cbind.data.frame(Pacientes_covid_r[9],Pacientes_covid_r[3:4],Pacientes_covid_r[6],Pacientes_covid_r[8],Pacientes_covid_r[10])# Crear una lista para almacenar las tablas de resultadosresults_list <-list()colnames(Pacientes_covid_r_desc)<-c("sexo","Año","Localidad","Edad por quinquenios","Migrante","Personal de salud")col_name_temp <-colnames(Pacientes_covid_r_desc)results_list <-list()# Renombrar columnas#colnames(resultados_finales)[3:(ncol(resultados_finales)-4)] <- colnames(tabla)k <-4filtrada <- Pacientes_covid_r_desc##inicio tablas descriptivas#colnames(Pacientes_covid_r[8:10])Pacientes_covid_r_desc<-cbind.data.frame(Pacientes_covid_r[9],Pacientes_covid_r[3:4],Pacientes_covid_r[6],Pacientes_covid_r[8],Pacientes_covid_r[10])# Crear una lista para almacenar las tablas de resultadosresults_list <-list()colnames(Pacientes_covid_r_desc)<-c("sexo","Año","Localidad","Edad por quinquenios","Migrante","Personal de salud")col_name_temp <-colnames(Pacientes_covid_r_desc)results_list <-list()# Renombrar columnas#colnames(resultados_finales)[3:(ncol(resultados_finales)-4)] <- colnames(tabla)k <-4filtrada <- Pacientes_covid_r_desc#table(filtrada[[2]])# Inicio del ciclo for#length(colnames(filtrada))# Crear una lista para almacenar las tablas de resultadosresults_list <-list()i<-3# Inicio del ciclo forfor (i in2:length(colnames(filtrada))) {# Obtener el nombre de la columna basada en el índice col_name <- col_name_temp[i] tabla <-table(filtrada[[i]], filtrada[[1]])# 2. Calcular porcentajes porcentajes <-prop.table(tabla, margin =1) *100# 3. Formatear tabla combinando counts y porcentajes tabla_con_porcentajes <-matrix(paste0(tabla, " (", round(porcentajes, 2), "%)"),nrow =nrow(tabla),dimnames =dimnames(tabla) )####################################### Suponiendo que 'tabla' es la matriz de frecuencias absolutas con años en filas y géneros en columnas# Ejemplo: tabla <- table(filtrada[[i]], filtrada[[1]]) donde i es la columna de género (F/M)# Convertir a data frame para trabajar tabla_df <-as.data.frame.matrix(tabla) tabla_df$Categorias <-rownames(tabla_df) tabla_df$variable <-rep(col_name_temp[i],length(rownames(tabla_df)))rownames(tabla_df) <-NULL# Verificar que los nombres de columna sean "F" y "M" (ajustar si es necesario)if (!all(c("F", "M") %in%colnames(tabla_df))) {stop("Las columnas de género deben llamarse 'F' y 'M'") }# Función para calcular IC de proporción (usando la función calc_ci del usuario) calc_ci <-function(count, total, conf.level =0.95) { prop <- count / total z <-qnorm(1- (1- conf.level) /2) se <-sqrt(prop * (1- prop) / total) lower <-max(0, prop - z * se) upper <-min(1, prop + z * se)return(sprintf("%.1f-%.1f", lower *100, upper *100)) }# Función para prueba de dos proporciones (F vs M) prueba_proporciones <-function(f_F, f_M) { total <- f_F + f_M# Prueba de proporciones: prop.test con dos muestras test <-prop.test(x =c(f_F, f_M), n =c(total, total), correct =FALSE) p_valor <- test$p.value# Formatear p-valor (redondear a 4 decimales o usar notación científica si es muy pequeño)if (p_valor <0.0001) {return("<0.0001") } else {return(sprintf("%.4f", p_valor)) } }# Calcular para cada año resultados <- tabla_df %>%mutate(Total = F + M,# Para FFrec_F = F,Porc_F =sprintf("%.2f%%", 100* F / Total),IC_F =calc_ci(F, Total),# Para MFrec_M = M,Porc_M =sprintf("%.2f%%", 100* M / Total),IC_M =calc_ci(M, Total),# Prueba de hipótesisp_valor =mapply(prueba_proporciones, F, M) ) %>%select(variable,Categorias, Frec_F, Porc_F, IC_F, Frec_M, Porc_M, IC_M, p_valor)# Mostrar la tabla con kableExtra (opcional) results_list[[col_name]] <- resultados}# Unir todas las tablas en una solacombined_table <-do.call(rbind, results_list)# Procesar la tabla combinada para eliminar duplicados en las columnas de interpretación y pcombined_table_processed <- combined_table# Ajustar nombres de columnascolnames(combined_table_processed) <-c("Variable","Categoria", "Frecuencia fem", "Porcentaje fem","IC_ fem", "Frecuencia masc", "Porcentaje masc","IC_ masc", "p")datatable( combined_table_processed,rownames =FALSE,extensions =c("Buttons", "Scroller"),options =list(scrollX =TRUE,scrollY ="500px",scroller =TRUE,dom ="Bfrtip",buttons =c("copy", "csv", "excel") ))```## Curvas epidemicas```{r, echo=FALSE, message=FALSE, message=FALSE}calcular_periodo_epi <-function(fecha) {# Obtener el número de la semana del año semana <-as.numeric(format(fecha, "%U")) +1# Calcular el periodo epidemiológico (7 periodos por año) periodo <-ceiling(semana / (52/7))# Convertir a números romanos periodo_romano <-as.character(as.roman(periodo))return(periodo_romano)}# Agregar la columna del periodo epidemiológicoPacientes_covid_r$Periodo_Epidemiologico <-sapply(Pacientes_covid_r$FECHA_DE_CONSULTA, calcular_periodo_epi)# Definir las fechas de inicio de la semana 1 para cada año (modifica según sea necesario)fechas_inicio_epi <-data.frame(ano =2020:2026,inicio_semana_1 =as.Date(c( "2019-12-29", "2021-01-03", "2022-01-02", "2023-01-01", "2023-12-31", "2024-12-29", "2026-01-04")) # Fechas personalizadas)# Función para calcular la semana epidemiológicacalcular_semana_epi <-function(fecha, fechas_inicio_epi) {# Extraer el año de la fecha ano <-year(fecha)# Obtener la fecha de inicio de la semana 1 para ese año inicio_semana_1 <- fechas_inicio_epi$inicio_semana_1[fechas_inicio_epi$ano == ano]# Calcular la diferencia en días entre la fecha y el inicio de la semana 1 dias_diferencia <-as.numeric(difftime(fecha, inicio_semana_1, units ="days"))# Calcular la semana epidemiológica (cada semana tiene 7 días) semana_epi <-floor(dias_diferencia /7) +1return(semana_epi)}Pacientes_covid_r_f<-Pacientes_covid_r%>%filter(ANO_INICIO_DE_SINTOMAS==2020|ANO_INICIO_DE_SINTOMAS==2021|ANO_INICIO_DE_SINTOMAS==2022)inc.week.gender <-incidence(Pacientes_covid_r_f$FECHA_DE_CONSULTA, interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f$ANO_INICIO_DE_SINTOMAS)#FIS ES LA VARIABLE A ESTUDIAR# --- 1. Extraer fechas y datos del objeto incidence ---fechas <- inc.week.gender$datesn <-length(fechas)# Crear data frame auxiliar con fecha, año y semana epidemiológica (ISO)df_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas) # semana epidemiológica (domingo a sábado))# --- 2. Definir periodo epidemiológico (ejemplo: cada 4 semanas) ---# Ajusta según la definición de tu país (Colombia: 13 periodos de 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4), # periodo 1 a 13periodo_romano =as.character(as.roman(periodo)) )# --- 3. Crear etiquetas para los periodos (solo en la primera semana de cada periodo) ---df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# --- 4. Crear etiquetas para los años (solo en la primera semana de cada año) ---df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()# --- 5. Vectores finales para usar en scale_x_continuous ---vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# --- 6. Gráfico de la curva epidémica (barras + media móvil) ---colores <-c("2020"="#C6CDE9", "2021"="#9BAEF3", "2022"="#B8A7EA","2023"="#B387D6", "2024"="#AF65B9", "2025"="#E898AF","2026"="#D47C9B")colores <-c("2020"="#E6F1FF","2021"="#CEE2FF","2022"="#B3D1F8","2023"="#95BDED","2024"="#5898D6","2025"="#1581C6","2026"="#0067A7")FISCURVEEPI0 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="none") +scale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica COVID19 General 20-22") +scale_fill_manual(values = colores)#FISCURVEEPI0# Media móvil (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <-rollmean(inc_week_df$counts, k =3, fill =NA, align ="right")FISCURVEEPI1 <- FISCURVEEPI0 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# --- 7. Gráfico inferior con los años ---plot_years <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# --- 8. Combinar ambos gráficos ---grafica_final <-grid.arrange(FISCURVEEPI0, plot_years, ncol =1, heights =c(0.9, 0.1))grafica_final#####################################################################################genero# ----------------------------------------------------------------------# Curva epidémica por género (automática, con periodos y años)# ----------------------------------------------------------------------library(incidence)library(dplyr)library(zoo)library(ggplot2)library(gridExtra)# Crear objeto incidence agrupado por género (ajusta el nombre de la columna)inc.week.gender <-incidence(Pacientes_covid_r_f$FECHA_DE_CONSULTA,interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f$SEXO) # <--- cambiar según tu variable# Extraer fechasfechas <- inc.week.gender$datesn <-length(fechas)# Data frame auxiliar con fecha, año y semana epidemiológicadf_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas))# Periodo epidemiológico (cada 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4),periodo_romano =as.character(as.roman(periodo)) )# Etiquetas de periodo (solo primera semana de cada periodo)df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# Etiquetas de año (solo primera semana de cada año)df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# Colores para los géneros (automático según niveles)generos <-levels(inc.week.gender$groups)colores_genero <-setNames(c("#F2AEB4", "#1E90FF"), generos) # rosa y azul# Gráfico de barras apiladas por géneroFISCURVEEPI01 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="right") +# muestra la leyenda para identificar génerosscale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica por Género 20-22") +scale_fill_manual(values = colores_genero, name ="Género")# Media móvil total (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts_total =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <- zoo::rollmean(inc_week_df$counts_total, k =3, fill =NA, align ="right")FISCURVEEPI11 <- FISCURVEEPI01 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# Gráfico inferior con los añosplot_years1 <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# Combinar ambos gráficosgrafica_final1 <-grid.arrange(FISCURVEEPI01, plot_years1, ncol =1, heights =c(0.9, 0.1))grafica_final1######################################################Pacientes_covid_r_f<-Pacientes_covid_r%>%filter(ANO_INICIO_DE_SINTOMAS==2023|ANO_INICIO_DE_SINTOMAS==2024|ANO_INICIO_DE_SINTOMAS==2025|ANO_INICIO_DE_SINTOMAS==2026)inc.week.gender <-incidence(Pacientes_covid_r_f$FECHA_DE_CONSULTA, interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f$ANO_INICIO_DE_SINTOMAS)#FIS ES LA VARIABLE A ESTUDIAR# --- 1. Extraer fechas y datos del objeto incidence ---fechas <- inc.week.gender$datesn <-length(fechas)# Crear data frame auxiliar con fecha, año y semana epidemiológica (ISO)df_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas) # semana epidemiológica (domingo a sábado))# --- 2. Definir periodo epidemiológico (ejemplo: cada 4 semanas) ---# Ajusta según la definición de tu país (Colombia: 13 periodos de 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4), # periodo 1 a 13periodo_romano =as.character(as.roman(periodo)) )# --- 3. Crear etiquetas para los periodos (solo en la primera semana de cada periodo) ---df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# --- 4. Crear etiquetas para los años (solo en la primera semana de cada año) ---df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()# --- 5. Vectores finales para usar en scale_x_continuous ---vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# --- 6. Gráfico de la curva epidémica (barras + media móvil) ---colores <-c("2020"="#C6CDE9", "2021"="#9BAEF3", "2022"="#B8A7EA","2023"="#B387D6", "2024"="#AF65B9", "2025"="#E898AF","2026"="#D47C9B")colores <-c("2020"="#E6F1FF","2021"="#CEE2FF","2022"="#B3D1F8","2023"="#95BDED","2024"="#5898D6","2025"="#1581C6","2026"="#0067A7")FISCURVEEPI01 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="none") +scale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica COVID19 General 23-26") +scale_fill_manual(values = colores)#FISCURVEEPI0# Media móvil (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <-rollmean(inc_week_df$counts, k =3, fill =NA, align ="right")FISCURVEEPI1 <- FISCURVEEPI0 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# --- 7. Gráfico inferior con los años ---plot_years1 <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# --- 8. Combinar ambos gráficos ---grafica_final1 <-grid.arrange(FISCURVEEPI01, plot_years1, ncol =1, heights =c(0.9, 0.1))grafica_final1#####################################################################################genero# ----------------------------------------------------------------------# Curva epidémica por género (automática, con periodos y años)# ----------------------------------------------------------------------library(incidence)library(dplyr)library(zoo)library(ggplot2)library(gridExtra)# Crear objeto incidence agrupado por género (ajusta el nombre de la columna)inc.week.gender <-incidence(Pacientes_covid_r_f$FECHA_DE_CONSULTA,interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f$SEXO) # <--- cambiar según tu variable# Extraer fechasfechas <- inc.week.gender$datesn <-length(fechas)# Data frame auxiliar con fecha, año y semana epidemiológicadf_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas))# Periodo epidemiológico (cada 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4),periodo_romano =as.character(as.roman(periodo)) )# Etiquetas de periodo (solo primera semana de cada periodo)df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# Etiquetas de año (solo primera semana de cada año)df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# Colores para los géneros (automático según niveles)generos <-levels(inc.week.gender$groups)colores_genero <-setNames(c("#F2AEB4", "#1E90FF"), generos) # rosa y azul# Gráfico de barras apiladas por géneroFISCURVEEPI02 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="right") +# muestra la leyenda para identificar génerosscale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica por Género 23-26") +scale_fill_manual(values = colores_genero, name ="Género")# Media móvil total (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts_total =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <- zoo::rollmean(inc_week_df$counts_total, k =3, fill =NA, align ="right")FISCURVEEPI12 <- FISCURVEEPI01 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# Gráfico inferior con los añosplot_years2 <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# Combinar ambos gráficosgrafica_final2 <-grid.arrange(FISCURVEEPI02, plot_years2, ncol =1, heights =c(0.9, 0.1))grafica_final2```## Anaisis en personal de salud```{r, echo=FALSE, message=FALSE, message=FALSE}calcular_periodo_epi <-function(fecha) {# Obtener el número de la semana del año semana <-as.numeric(format(fecha, "%U")) +1# Calcular el periodo epidemiológico (7 periodos por año) periodo <-ceiling(semana / (52/7))# Convertir a números romanos periodo_romano <-as.character(as.roman(periodo))return(periodo_romano)}# Agregar la columna del periodo epidemiológicoPacientes_covid_r$Periodo_Epidemiologico <-sapply(Pacientes_covid_r$FECHA_DE_CONSULTA, calcular_periodo_epi)# Definir las fechas de inicio de la semana 1 para cada año (modifica según sea necesario)fechas_inicio_epi <-data.frame(ano =2020:2026,inicio_semana_1 =as.Date(c( "2019-12-29", "2021-01-03", "2022-01-02", "2023-01-01", "2023-12-31", "2024-12-29", "2026-01-04")) # Fechas personalizadas)# Función para calcular la semana epidemiológicacalcular_semana_epi <-function(fecha, fechas_inicio_epi) {# Extraer el año de la fecha ano <-year(fecha)# Obtener la fecha de inicio de la semana 1 para ese año inicio_semana_1 <- fechas_inicio_epi$inicio_semana_1[fechas_inicio_epi$ano == ano]# Calcular la diferencia en días entre la fecha y el inicio de la semana 1 dias_diferencia <-as.numeric(difftime(fecha, inicio_semana_1, units ="days"))# Calcular la semana epidemiológica (cada semana tiene 7 días) semana_epi <-floor(dias_diferencia /7) +1return(semana_epi)}Pacientes_covid_r_f1<-Pacientes_covid_r%>%filter((ANO_INICIO_DE_SINTOMAS==2020|ANO_INICIO_DE_SINTOMAS==2021|ANO_INICIO_DE_SINTOMAS==2022) & PROFESIONAL_O_TRABAJADOR_DE_LA_SALUD=="Si")inc.week.gender <-incidence(Pacientes_covid_r_f1$FECHA_DE_CONSULTA, interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f1$ANO_INICIO_DE_SINTOMAS)#FIS ES LA VARIABLE A ESTUDIAR# --- 1. Extraer fechas y datos del objeto incidence ---fechas <- inc.week.gender$datesn <-length(fechas)# Crear data frame auxiliar con fecha, año y semana epidemiológica (ISO)df_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas) # semana epidemiológica (domingo a sábado))# --- 2. Definir periodo epidemiológico (ejemplo: cada 4 semanas) ---# Ajusta según la definición de tu país (Colombia: 13 periodos de 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4), # periodo 1 a 13periodo_romano =as.character(as.roman(periodo)) )# --- 3. Crear etiquetas para los periodos (solo en la primera semana de cada periodo) ---df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# --- 4. Crear etiquetas para los años (solo en la primera semana de cada año) ---df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()# --- 5. Vectores finales para usar en scale_x_continuous ---vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# --- 6. Gráfico de la curva epidémica (barras + media móvil) ---colores <-c("2020"="#C6CDE9", "2021"="#9BAEF3", "2022"="#B8A7EA","2023"="#B387D6", "2024"="#AF65B9", "2025"="#E898AF","2026"="#D47C9B")colores <-c("2020"="#E6F1FF","2021"="#CEE2FF","2022"="#B3D1F8","2023"="#95BDED","2024"="#5898D6","2025"="#1581C6","2026"="#0067A7")FISCURVEEPI03 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="none") +scale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica COVID19 General 20-22") +scale_fill_manual(values = colores)#FISCURVEEPI0# Media móvil (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <-rollmean(inc_week_df$counts, k =3, fill =NA, align ="right")FISCURVEEPI3 <- FISCURVEEPI0 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# --- 7. Gráfico inferior con los años ---plot_years3 <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# --- 8. Combinar ambos gráficos ---grafica_final3 <-grid.arrange(FISCURVEEPI03, plot_years3, ncol =1, heights =c(0.9, 0.1))grafica_final3#####################################################################################genero# ----------------------------------------------------------------------# Curva epidémica por género (automática, con periodos y años)# ----------------------------------------------------------------------library(incidence)library(dplyr)library(zoo)library(ggplot2)library(gridExtra)# Crear objeto incidence agrupado por género (ajusta el nombre de la columna)inc.week.gender <-incidence(Pacientes_covid_r_f1$FECHA_DE_CONSULTA,interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f1$SEXO) # <--- cambiar según tu variable# Extraer fechasfechas <- inc.week.gender$datesn <-length(fechas)# Data frame auxiliar con fecha, año y semana epidemiológicadf_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas))# Periodo epidemiológico (cada 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4),periodo_romano =as.character(as.roman(periodo)) )# Etiquetas de periodo (solo primera semana de cada periodo)df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# Etiquetas de año (solo primera semana de cada año)df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# Colores para los géneros (automático según niveles)generos <-levels(inc.week.gender$groups)colores_genero <-setNames(c("#F2AEB4", "#1E90FF"), generos) # rosa y azul# Gráfico de barras apiladas por géneroFISCURVEEPI04 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="right") +# muestra la leyenda para identificar génerosscale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica por Género 20-22") +scale_fill_manual(values = colores_genero, name ="Género")# Media móvil total (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts_total =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <- zoo::rollmean(inc_week_df$counts_total, k =3, fill =NA, align ="right")FISCURVEEPI14 <- FISCURVEEPI01 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# Gráfico inferior con los añosplot_years4 <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# Combinar ambos gráficosgrafica_final4 <-grid.arrange(FISCURVEEPI04, plot_years4, ncol =1, heights =c(0.9, 0.1))grafica_final4######################################################Pacientes_covid_r_f1<-Pacientes_covid_r%>%filter((ANO_INICIO_DE_SINTOMAS==2023|ANO_INICIO_DE_SINTOMAS==2024|ANO_INICIO_DE_SINTOMAS==2025|ANO_INICIO_DE_SINTOMAS==2026) & PROFESIONAL_O_TRABAJADOR_DE_LA_SALUD=="Si")inc.week.gender <-incidence(Pacientes_covid_r_f1$FECHA_DE_CONSULTA, interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f1$ANO_INICIO_DE_SINTOMAS)#FIS ES LA VARIABLE A ESTUDIAR# --- 1. Extraer fechas y datos del objeto incidence ---fechas <- inc.week.gender$datesn <-length(fechas)# Crear data frame auxiliar con fecha, año y semana epidemiológica (ISO)df_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas) # semana epidemiológica (domingo a sábado))# --- 2. Definir periodo epidemiológico (ejemplo: cada 4 semanas) ---# Ajusta según la definición de tu país (Colombia: 13 periodos de 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4), # periodo 1 a 13periodo_romano =as.character(as.roman(periodo)) )# --- 3. Crear etiquetas para los periodos (solo en la primera semana de cada periodo) ---df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# --- 4. Crear etiquetas para los años (solo en la primera semana de cada año) ---df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()# --- 5. Vectores finales para usar en scale_x_continuous ---vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# --- 6. Gráfico de la curva epidémica (barras + media móvil) ---colores <-c("2020"="#C6CDE9", "2021"="#9BAEF3", "2022"="#B8A7EA","2023"="#B387D6", "2024"="#AF65B9", "2025"="#E898AF","2026"="#D47C9B")colores <-c("2020"="#E6F1FF","2021"="#CEE2FF","2022"="#B3D1F8","2023"="#95BDED","2024"="#5898D6","2025"="#1581C6","2026"="#0067A7")FISCURVEEPI05 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="none") +scale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica COVID19 General 23-26") +scale_fill_manual(values = colores)#FISCURVEEPI0# Media móvil (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <-rollmean(inc_week_df$counts, k =3, fill =NA, align ="right")FISCURVEEPI5 <- FISCURVEEPI0 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# --- 7. Gráfico inferior con los años ---plot_years5 <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# --- 8. Combinar ambos gráficos ---grafica_final5 <-grid.arrange(FISCURVEEPI05, plot_years5, ncol =1, heights =c(0.9, 0.1))grafica_final5#####################################################################################genero# ----------------------------------------------------------------------# Curva epidémica por género (automática, con periodos y años)# ----------------------------------------------------------------------library(incidence)library(dplyr)library(zoo)library(ggplot2)library(gridExtra)# Crear objeto incidence agrupado por género (ajusta el nombre de la columna)inc.week.gender <-incidence(Pacientes_covid_r_f1$FECHA_DE_CONSULTA,interval ="1 epiweeks: sunday",groups = Pacientes_covid_r_f1$SEXO) # <--- cambiar según tu variable# Extraer fechasfechas <- inc.week.gender$datesn <-length(fechas)# Data frame auxiliar con fecha, año y semana epidemiológicadf_fechas <-data.frame(fecha = fechas, año =format(fechas, "%Y"),semana = lubridate::epiweek(fechas))# Periodo epidemiológico (cada 4 semanas)df_fechas <- df_fechas %>%mutate(periodo =ceiling(semana /4),periodo_romano =as.character(as.roman(periodo)) )# Etiquetas de periodo (solo primera semana de cada periodo)df_fechas <- df_fechas %>%group_by(año, periodo) %>%mutate(etiqueta_periodo =if_else(row_number() ==1, periodo_romano, "")) %>%ungroup()# Etiquetas de año (solo primera semana de cada año)df_fechas <- df_fechas %>%group_by(año) %>%mutate(etiqueta_año =if_else(row_number() ==1, año, "")) %>%ungroup()vector_final <- df_fechas$etiqueta_periodoyear_labels <- df_fechas$etiqueta_año# Colores para los géneros (automático según niveles)generos <-levels(inc.week.gender$groups)colores_genero <-setNames(c("#F2AEB4", "#1E90FF"), generos) # rosa y azul# Gráfico de barras apiladas por géneroFISCURVEEPI06 <-plot(inc.week.gender) +theme(axis.title =element_text(size =10),axis.text =element_text(size =4),axis.ticks.x =element_blank(),axis.ticks.length =unit(0, "cm"),legend.title =element_text(size =10),legend.position ="right") +# muestra la leyenda para identificar génerosscale_x_continuous(breaks =as.numeric(fechas),labels = vector_final,expand =c(0, 0) ) +ylab("Casos") +labs(title ="Curva Epidemiológica por Género 23-26") +scale_fill_manual(values = colores_genero, name ="Género")# Media móvil total (ventana de 3 semanas)inc_week_df <-data.frame(dates = fechas,counts_total =rowSums(inc.week.gender$counts))inc_week_df$moving_avg <- zoo::rollmean(inc_week_df$counts_total, k =3, fill =NA, align ="right")FISCURVEEPI16 <- FISCURVEEPI01 +geom_line(data = inc_week_df, aes(x = dates, y = moving_avg),inherit.aes =FALSE, color ="#068FAB", size =0.5)# Gráfico inferior con los añosplot_years6 <-ggplot(df_fechas, aes(x =as.numeric(fecha), y =0)) +geom_blank() +theme_classic() +scale_x_continuous(breaks =as.numeric(fechas),labels = year_labels,expand =c(0, 0) ) +theme(axis.title.x =element_blank(),axis.text.x =element_text(size =6, vjust =1),axis.line.y =element_blank(),axis.text.y =element_blank(),axis.ticks.y =element_blank(),axis.title.y =element_blank(),axis.line.x =element_blank(),axis.ticks.x =element_blank() ) +xlab("Periodo Epidemiológico") +theme(panel.background =element_rect(fill ="white"))# Combinar ambos gráficosgrafica_final6 <-grid.arrange(FISCURVEEPI06, plot_years6, ncol =1, heights =c(0.9, 0.1))grafica_final6```