Introducción

El sarampión es una enfermedad prevenible por vacunación que continúa siendo un indicador clave del desempeño de los sistemas de salud. Este estudio analiza la tendencia temporal de los casos notificados de sarampión en Japón, utilizando datos oficiales de la Organización Mundial de la Salud (OMS). El objetivo es identificar dicha tendencia y evaluar cómo puede orientar la planificación y asignación de recursos sanitarios, tales como vacunas, personal de salud y vigilancia epidemiológica.

El análisis se estructura a partir de un modelo principal de regresión lineal simple, complementado con modelos alternativos más adecuados para datos de conteo, con el fin de reforzar la robustez de los hallazgos.


1. Preparación del entorno y carga de paquetes

En este paso se garantiza la reproducibilidad del análisis estadístico, eliminando objetos previamente almacenados en el entorno de trabajo que podrían interferir con los resultados. Desde una perspectiva metodológica, esta práctica reduce el riesgo de contaminación del análisis por variables residuales. La carga explícita de los paquetes dplyr, ggplot2 y MASS establece el marco técnico del estudio: manipulación de datos, visualización y modelamiento estadístico avanzado, respectivamente, asegurando coherencia y transparencia en las operaciones posteriores.

rm(list = ls())
gc()
##           used (Mb) gc trigger (Mb) max used (Mb)
## Ncells  613843 32.8    1402798   75   702077 37.5
## Vcells 1147167  8.8    8388608   64  1927490 14.8
paquetes <- c("dplyr", "ggplot2", "MASS")
paquetes_faltantes <- setdiff(paquetes, rownames(installed.packages()))
if (length(paquetes_faltantes) > 0) {
  install.packages(paquetes_faltantes)
}
invisible(lapply(paquetes, library, character.only = TRUE))

2. Lectura de la base de datos

Se importa la base de datos correspondiente a Japón.

La lectura de la base de datos proveniente de la OMS constituye el punto de partida empírico del estudio. En términos de modelamiento matemático, esta etapa define el espacio muestral observado, sobre el cual se realizarán inferencias estadísticas. La inspección inicial de las filas y nombres de variables permite verificar la estructura del conjunto de datos y evaluar su idoneidad para representar la evolución temporal del sarampión en Japón.

datos <- read.csv(file.choose(), stringsAsFactors = FALSE)
head(datos)
names(datos)
##  [1] "index"                          "GHO..CODE."                    
##  [3] "GHO..DISPLAY."                  "GHO..URL."                     
##  [5] "PUBLISHSTATE..CODE."            "PUBLISHSTATE..DISPLAY."        
##  [7] "PUBLISHSTATE..URL."             "YEAR..CODE."                   
##  [9] "YEAR..DISPLAY."                 "YEAR..URL."                    
## [11] "REGION..CODE."                  "REGION..DISPLAY."              
## [13] "REGION..URL."                   "WORLDBANKINCOMEGROUP..CODE."   
## [15] "STARTYEAR"                      "ENDYEAR"                       
## [17] "WORLDBANKINCOMEGROUP..DISPLAY." "WORLDBANKINCOMEGROUP..URL."    
## [19] "COUNTRY..CODE."                 "COUNTRY..DISPLAY."             
## [21] "COUNTRY..URL."                  "Display.Value"                 
## [23] "Numeric"                        "Low"                           
## [25] "High"                           "StdErr"                        
## [27] "StdDev"                         "Comments"

3. Limpieza inicial de la base

La eliminación de filas vacías y metadatos no observacionales responde a un principio fundamental del análisis cuantitativo: trabajar únicamente con observaciones válidas y comparables. Matemáticamente, este proceso busca minimizar sesgos introducidos por datos faltantes o irrelevantes, mejorando la calidad de las estimaciones posteriores. La revisión de la estructura del dataset permite confirmar la naturaleza de las variables (temporales, numéricas y categóricas).

datos_limpios <- datos[-1, ]
datos_limpios <- datos_limpios[rowSums(is.na(datos_limpios)) < ncol(datos_limpios), ]
str(datos_limpios)
## 'data.frame':    396 obs. of  28 variables:
##  $ index                         : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ GHO..CODE.                    : chr  "WHS3_40" "CHOLERA_0000000002" "CHOLERA_0000000002" "CHOLERA_0000000002" ...
##  $ GHO..DISPLAY.                 : chr  "Cholera - number of reported cases" "Number of reported deaths from cholera" "Number of reported deaths from cholera" "Number of reported deaths from cholera" ...
##  $ GHO..URL.                     : chr  "https://www.who.int/data/gho/indicator-metadata-registry/imr-details/42" "https://www.who.int/data/gho/indicator-metadata-registry/imr-details/2446" "https://www.who.int/data/gho/indicator-metadata-registry/imr-details/2446" "https://www.who.int/data/gho/indicator-metadata-registry/imr-details/2446" ...
##  $ PUBLISHSTATE..CODE.           : chr  "PUBLISHED" "PUBLISHED" "PUBLISHED" "PUBLISHED" ...
##  $ PUBLISHSTATE..DISPLAY.        : chr  "Published" "Published" "Published" "Published" ...
##  $ PUBLISHSTATE..URL.            : logi  NA NA NA NA NA NA ...
##  $ YEAR..CODE.                   : num  2011 1995 1977 1978 1983 ...
##  $ YEAR..DISPLAY.                : chr  "2011" "1995" "1977" "1978" ...
##  $ YEAR..URL.                    : logi  NA NA NA NA NA NA ...
##  $ REGION..CODE.                 : chr  "WPR" "WPR" "WPR" "WPR" ...
##  $ REGION..DISPLAY.              : chr  "Western Pacific" "Western Pacific" "Western Pacific" "Western Pacific" ...
##  $ REGION..URL.                  : logi  NA NA NA NA NA NA ...
##  $ WORLDBANKINCOMEGROUP..CODE.   : logi  NA NA NA NA NA NA ...
##  $ STARTYEAR                     : chr  "2011" "1995" "1977" "1978" ...
##  $ ENDYEAR                       : chr  "2011" "1995" "1977" "1978" ...
##  $ WORLDBANKINCOMEGROUP..DISPLAY.: logi  NA NA NA NA NA NA ...
##  $ WORLDBANKINCOMEGROUP..URL.    : logi  NA NA NA NA NA NA ...
##  $ COUNTRY..CODE.                : chr  "JPN" "JPN" "JPN" "JPN" ...
##  $ COUNTRY..DISPLAY.             : chr  "Japan" "Japan" "Japan" "Japan" ...
##  $ COUNTRY..URL.                 : logi  NA NA NA NA NA NA ...
##  $ Display.Value                 : chr  "12.00" "1" "1" "1" ...
##  $ Numeric                       : chr  "12.00000" "1.00000" "1.00000" "1.00000" ...
##  $ Low                           : logi  NA NA NA NA NA NA ...
##  $ High                          : logi  NA NA NA NA NA NA ...
##  $ StdErr                        : logi  NA NA NA NA NA NA ...
##  $ StdDev                        : logi  NA NA NA NA NA NA ...
##  $ Comments                      : chr  "" "" "" "" ...

4.Selección del indicador de interés

En este paso se define formalmente la variable dependiente del estudio: el número de casos notificados de sarampión. Desde la perspectiva del modelamiento, esta decisión operacionaliza el fenómeno epidemiológico bajo análisis. Al filtrar un único indicador, se asegura que las estimaciones reflejen exclusivamente la dinámica del sarampión, evitando confusión con otros eventos sanitarios.

sarampion <- datos_limpios %>%
  dplyr::filter(GHO..DISPLAY. == "Measles - number of reported cases") %>%
  dplyr::select(
    Anio = YEAR..DISPLAY.,
    Casos = Numeric,
    Pais = COUNTRY..DISPLAY.
  )

5. Conversión de tipos y ordenamiento

La conversión de las variables a formato numérico permite tratarlas como variables cuantitativas continuas o discretas, condición necesaria para los modelos de regresión. El ordenamiento cronológico establece explícitamente la dimensión temporal del análisis, fundamental para interpretar el año como variable explicativa. Matemáticamente, se prepara el vector de observaciones (xi,yi) donde xi representa el tiempo y yi el número de casos.

sarampion <- sarampion %>%
mutate(
Anio = as.numeric(Anio),
Casos = as.numeric(Casos)
) %>%
filter(!is.na(Anio), !is.na(Casos)) %>%
arrange(Anio)

sarampion

6. Estadística descriptiva

Los estadísticos descriptivos permiten caracterizar la distribución empírica de los casos de sarampión. La media y la mediana informan sobre la tendencia central, mientras que el mínimo, máximo y desviación estándar reflejan la variabilidad temporal del fenómeno. Esta etapa es clave para anticipar posibles problemas de dispersión, asimetría o valores extremos que influyen en la selección del modelo matemático adecuado.

summary(sarampion$Casos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      35     459    2960    6397    8402   33812
sd(sarampion$Casos)
## [1] 8316.051

7. Modelo principal: regresión lineal simple

El modelo lineal simple plantea una relación funcional del tipo:

Casosi = β0 + β1 ⋅ Ano + εi

Desde el punto de vista matemático, este modelo estima una tendencia promedio lineal en el tiempo. El parámetro 𝛽1 cuantifica el cambio esperado en el número de casos por cada año adicional. Este modelo se selecciona como principal por su simplicidad, interpretabilidad y utilidad para la planificación sanitaria, al resumir la evolución temporal en un único parámetro clave.

modelo_1_lin <- lm(Casos ~ Anio, data = sarampion)
summary(modelo_1_lin)
## 
## Call:
## lm(formula = Casos ~ Anio, data = sarampion)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -6823  -3805  -2923   2639  28033 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 436516.1   232417.9   1.878   0.0701 .
## Anio          -215.2      116.3  -1.851   0.0741 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8009 on 30 degrees of freedom
## Multiple R-squared:  0.1025, Adjusted R-squared:  0.07255 
## F-statistic: 3.425 on 1 and 30 DF,  p-value: 0.07409

8. Diagnóstico del modelo principal

El análisis gráfico de los residuos evalúa los supuestos clásicos del modelo lineal: linealidad, homocedasticidad y normalidad aproximada de los errores. Desde una perspectiva matemática, estos supuestos garantizan que los estimadores de mínimos cuadrados sean insesgados y eficientes. La verificación de estos criterios es esencial para validar la inferencia estadística basada en el modelo principal.

par(mfrow = c(1, 2))
plot(modelo_1_lin, which = 1)
plot(modelo_1_lin, which = 2)

par(mfrow = c(1, 1))

9. Modelo alternativo 1: regresión cuadrática

La inclusión de un término cuadrático para capturar posibles cambios no lineales amplía el modelo a:

Casosi = β0+β1⋅Anoc,i+β2⋅Anoc,i2+εi

Este modelo permite capturar curvaturas en la tendencia, representando escenarios donde la incidencia disminuye pero con posibles repuntes. Matemáticamente, se explora si la relación tiempo–casos es no lineal, lo cual es plausible en enfermedades prevenibles con brotes episódicos.

sarampion <- sarampion %>%
mutate(
Anio_c = Anio - mean(Anio),
Anio_c2 = Anio_c^2
)

modelo_2_cuad <- lm(Casos ~ Anio_c + Anio_c2, data = sarampion)
summary(modelo_2_cuad)
## 
## Call:
## lm(formula = Casos ~ Anio_c + Anio_c2, data = sarampion)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -7970  -4649  -1983   1291  25935 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  8639.03    2309.76   3.740 0.000806 ***
## Anio_c       -221.42     115.43  -1.918 0.064967 .  
## Anio_c2       -15.12      12.37  -1.222 0.231429    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7944 on 29 degrees of freedom
## Multiple R-squared:  0.1464, Adjusted R-squared:  0.08758 
## F-statistic: 2.488 on 2 and 29 DF,  p-value: 0.1007

10. Modelo alternativo 2: GLM Poisson

El modelo Poisson reconoce que los casos son conteos discretos, modelados mediante: Casosi∼Poisson(μi), log(μi)=α0+α1⋅An~oi Este enfoque es matemáticamente más apropiado para variables de conteo. El coeficiente α1 se interpreta como un cambio multiplicativo en el número esperado de casos por año, proporcionando una lectura epidemiológica más natural que la regresión lineal.

modelo_3_pois <- glm(Casos ~ Anio, data = sarampion,
family = poisson(link = "log"))
summary(modelo_3_pois)
## 
## Call:
## glm(formula = Casos ~ Anio, family = poisson(link = "log"), data = sarampion)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) 78.2386664  0.3823430   204.6   <2e-16 ***
## Anio        -0.0347969  0.0001917  -181.5   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 283199  on 31  degrees of freedom
## Residual deviance: 248320  on 30  degrees of freedom
## AIC: 248628
## 
## Number of Fisher Scoring iterations: 6

11. Modelo alternativo 3: GLM Quasi-Poisson

El modelo Quasi-Poisson relaja el supuesto de igualdad entre media y varianza del modelo Poisson. Matemáticamente, introduce un parámetro de dispersión 𝜙, permitiendo varianza mayor que la media. Este ajuste es crucial cuando los datos presentan mayor variabilidad de la esperada, mejorando la robustez de la inferencia sin cambiar la estructura funcional del modelo.

modelo_4_qpois <- glm(Casos ~ Anio, data = sarampion,
family = quasipoisson(link = "log"))
summary(modelo_4_qpois)
## 
## Call:
## glm(formula = Casos ~ Anio, family = quasipoisson(link = "log"), 
##     data = sarampion)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 78.23867   41.23623   1.897   0.0674 .
## Anio        -0.03480    0.02068  -1.683   0.1028  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for quasipoisson family taken to be 11631.93)
## 
##     Null deviance: 283199  on 31  degrees of freedom
## Residual deviance: 248320  on 30  degrees of freedom
## AIC: NA
## 
## Number of Fisher Scoring iterations: 6

12. Modelo alternativo 4: Binomial Negativo

El modelo binomial negativo constituye una alternativa más flexible para datos con alta sobre-dispersión. Desde el punto de vista matemático, incorpora un parámetro adicional que modela explícitamente la heterogeneidad no observada. Este modelo es especialmente útil en series epidemiológicas con brotes irregulares

modelo_5_nb <- MASS::glm.nb(Casos ~ Anio, data = sarampion)
summary(modelo_5_nb)
## 
## Call:
## MASS::glm.nb(formula = Casos ~ Anio, data = sarampion, init.theta = 0.6414211961, 
##     link = log)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) 127.69265   36.23854   3.524 0.000426 ***
## Anio         -0.05956    0.01813  -3.286 0.001017 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(0.6414) family taken to be 1)
## 
##     Null deviance: 44.908  on 31  degrees of freedom
## Residual deviance: 39.142  on 30  degrees of freedom
## AIC: 616.88
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  0.641 
##           Std. Err.:  0.136 
## 
##  2 x log-likelihood:  -610.882

13. Comparación de modelos

La comparación entre modelos se basa en criterios cuantitativos como el AIC, el R² y el factor de dispersión. Matemáticamente, se evalúa el equilibrio entre bondad de ajuste y complejidad del modelo. Esta etapa permite justificar la selección del modelo principal y entender cómo los modelos alternativos complementan la interpretación del fenómeno.

data.frame(
Modelo = c("Lineal", "Cuadrático", "Poisson", "Quasi-Poisson", "Binomial Negativo"),
AIC = c(
AIC(modelo_1_lin),
AIC(modelo_2_cuad),
AIC(modelo_3_pois),
NA,
AIC(modelo_5_nb)
)
)

14. Visualización de la tendencia

La visualización integra los datos observados con la recta de regresión estimada, proporcionando una representación geométrica del modelo lineal. Desde el punto de vista analítico, el gráfico facilita la evaluación visual del ajuste y comunica de manera intuitiva la tendencia temporal a tomadores de decisiones en salud.

ggplot(sarampion, aes(x = Anio, y = Casos)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE) +
labs(
title = "Evolución temporal del sarampión en Japón",
x = "Año",
y = "Número de casos"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

## 15. Conclusiones e implicaciones para la gestión sanitaria

A partir de los resultados obtenidos en el análisis estadístico de los casos notificados de sarampión en Japón, se evidencia una tendencia temporal globalmente decreciente a lo largo del período observado. El modelo principal de regresión lineal simple muestra una pendiente negativa, lo que indica que, en promedio, el número de casos ha disminuido con el paso de los años, coherente con el fortalecimiento de las estrategias de vacunación y vigilancia epidemiológica implementadas en el país. No obstante, el valor del R² sugiere que el año por sí solo explica solo una parte de la variabilidad observada, lo que indica la influencia de otros factores relevantes como cambios en la cobertura vacunal, brotes puntuales, modificaciones en los sistemas de notificación y políticas sanitarias específicas.

Los modelos de conteo (Poisson, Quasi-Poisson y Binomial Negativo) confirman esta tendencia descendente desde una perspectiva más adecuada para datos discretos, y además ponen en evidencia la presencia de sobre-dispersión, lo que justifica el uso de modelos más flexibles como el Quasi-Poisson o el Binomial Negativo. En conjunto, los resultados permiten concluir que, aunque la carga de sarampión ha disminuido en el tiempo, persiste una variabilidad que obliga a mantener capacidades mínimas de respuesta. Desde la gestión de recursos sanitarios, estos hallazgos respaldan una planificación eficiente y focalizada, que combine una posible redistribución gradual de recursos con el mantenimiento de programas de inmunización, personal capacitado y sistemas de vigilancia robustos para prevenir reemergencias de la enfermedad.