1. Introducción

En esta sesión pondremos en práctica los conocimientos adquiridos sobre evaluación de efectividad de vacunas utilizando el lenguaje de programación R. Utilizaremos el diseño de cohortes para estimar la efectividad vacunal. Utilizando la librería vaccineff en R analizaremos los resultados obtenidos.

2. Objetivos de aprendizaje

3. Conceptos básicos a desarrollar

En esta práctica se desarrollarán los siguientes conceptos:

3.1. Eficacia vs Efectividad vacunal

Eficacia:

  • Se refiere a la capacidad de lograr un efecto deseado o esperado bajo condiciones ideales o controladas.

  • Es una medida teórica. En experimentos clínicos, por ejemplo, la eficacia de un medicamento se evalúa en condiciones controladas, donde todos los factores externos están cuidadosamente regulados para determinar el rendimiento puro del medicamento.

  • Puede considerarse como “lo que puede hacer” una intervención en las mejores circunstancias posibles.

Efectividad:

  • Se refiere a qué tan bien funciona una intervención en condiciones “reales” o prácticas, fuera de un entorno controlado.

  • Es una medida práctica. En el contexto de los medicamentos, la efectividad se refiere a qué tan bien funciona un medicamento en el “mundo real”, donde las condiciones no están tan controladas y hay muchos factores variables.

  • Puede considerarse como “lo que realmente hace” una intervención en circunstancias típicas o cotidianas.

Un ejemplo podría ser un medicamento que en experimentos clínicos (en condiciones ideales) mostró una eficacia del 95% en prevenir el desenlace. Sin embargo, cuando se usó en el contexto general, considerando factores como la adherencia al tratamiento, interacciones con otros medicamentos y variabilidad en la población, su efectividad fue del 85%. Aquí, la eficacia muestra el potencial del medicamento bajo condiciones ideales, mientras que la efectividad muestra cómo funciona en situaciones cotidianas.

En el caso de las vacunas la efectividad hace referencia a la disminución proporcional de casos de una enfermedad o evento en una población vacunada comparada con una población no vacunada, en condiciones del mundo real.

3.2. Tiempo de inducción

El tiempo de inducción o “delay” se refiere al periodo necesario para que la vacuna administrada induzca una respuesta inmune protectora frente a la infección o la enfermedad provocada por un patógeno. Si ocurre una infección entre el momento de la vacunación y el momento donde se prevé exista una respuesta inmune protectora, ocurrirá la infección de manera natural y no se considera un fallo de la vacuna en cuestión, puesto que la persona inmunizada aún no contaba con la protección conferida por la vacuna.

3.3. Diseños observacionales para el estudio de la efectividad vacunal

Por múltiples razones, los estudios observacionales son los más utilizados en la estimación de la efectividad vacunal. Existen múltiples diseños, entre ellos: diseño de cohortes, diseño de casos y controles, diseño de test-negativo, diseño “screening-method”. La elección del diseño, dependerá de la disponibilidad de información y los recursos disponibles para llevar a cabo el estudio.

3.4. Diseño de cohorte para el estudio de la efectividad vacunal

El término cohorte se refiere a un grupo de personas que comparten una característica común. En los estudios con diseño de cohorte, existen dos o más poblaciones que difieren en una característica o exposición y se realiza un seguimiento a ambos grupos para evaluar la aparición de uno o más desenlaces de interés y comparar la incidencia de los eventos entre ambos grupos. Para el caso de los estudios de la efectividad de vacunas, la exposición de interés corresponde a la aplicación de la vacuna y los desenlaces pueden incluir:

  • Infección: contagio con el patógeno de interés tras una exposición a alguien infeccioso

  • Enfermedad: desarrollo de signos y síntomas relacionados con la infección con un patógeno. Puede tener diferentes grados de severidad, requerir ingreso a hospitalización, UCI o incluso conducir a la muerte.

  • A la hora de llevar a cabo estos estudios se debe garantizar que las personas incluidas en cada población no tengan el desenlace de interés que será evaluado durante el seguimiento. Así mismo, es importante que el seguimiento se lleve a cabo de manera igual de rigurosa y por el mismo tiempo en ambos grupos.

La efectividad vacunal corresponde a la reducción relativa del riesgo de desarrollar la infección y/o enfermedad. En los estudios de cohorte se puede estimar el riesgo relativo, los odds ratio o los hazard ratio que expresa el riesgo que tiene la cohorte no expuesta comparado con la cohorte de los expuestos. La efectividad vacunal será, por lo tanto, el complemento del riesgo proporcional en la cohorte de expuestos.

Veamos esto con un ejemplo: para evaluar la efectividad de una vacuna para prevenir el desarrollo de enfermedad en una población, al cabo del seguimiento la incidencia en la cohorte vacunada fue de 1 por 1000 habitantes y en la cohorte no vacunada fue de 5 por 1000 habitantes. En este caso, tenemos que el riesgo relativo en la población vacunada fue 0.001/0.005 = 0,2. Es decir, la población vacunada tuvo una incidencia correspondiente al 20% de la incidencia de la población no vacunada. Esta reducción se puede atribuir a la vacuna y para estimarla usaríamos el complemento, que corresponde a 1 - 0,2= 0,8. Es decir que la reducción que se observó corresponde a un 80% y se puede atribuir a la vacuna, por lo tanto, la efectividad de la vacunación fue del 80% para evitar la enfermedad.

3.5. Métodos estadísticos para análisis de efectividad vacunal

Crucialmente, en el diseño de cohortes se usan dos métodos: Modelo de Cox, y Método de Kapplan Meir

Modelo de Regresión de Cox

En el modelo Cox, utilizamos la métrica hazard ratio. Esta es una medida del riesgo de un evento en el tiempo, en los estudios de cohorte las personas en cada cohorte deben estar en riesgo de presentar el desenlace de interés y la diferencia en el riesgo del evento al final del periodo de seguimiento será comparado entre ambos grupos. El hazard ratio se refiere a esta diferencia en los riesgos de cada población de desarrollar un desenlace de interés en el tiempo del estudio.

Análisis de Kaplan-Meier

En los análisis de Kaplan-Meier se utilizan las tasas de incidencia de un evento que refleja el riesgo de cada población de presentar el desenlace de interés durante el tiempo de seguimiento. La comparación entre ambos grupos genera la razón de riesgos y es la medida que se puede utilizar en los estudios para estimar la efectividad vacunal.

4. Instalación

Para llevar a cabo los análisis del taller es necesario instalar el paquete vaccineff para esto ejecute las siguientes líneas en R:

if(!require("pak")) install.packages("pak")
pak::pak("epiverse-trace/vaccineff@dev")

Posterior a la instalación, deben cargarse las librerías que vamos a usar

library(vaccineff)
library(ggplot2)

5. Descripción del caso de uso

Para este ejercicio utilizaremos uno de los conjuntos de datos integrados en el paquete vaccineff, instalado previamente. Se trata de una población hipotética, compuesta por 100.000 habitantes, que recibió dos dosis de una vacuna para disminuir el riesgo de muerte por una enfermedad respiratoria viral. Sobre esta población se realizó seguimiento por 1 año, entre el 1 de enero y 31 de diciembre de 2044. En el conjunto de datos se presenta la información desagregada para cada uno de los participantes.

Delay de acción de la vacuna (Tiempo de inducción)

Es necesario tener presente que la vacuna aplicada a esta población hipotética demostró en los estudios de eficacia que brindaba protección ante infección (desarrollo de anticuerpos neutralizantes protectores) 14 días posteriores a la aplicación de la vacuna. Este periodo de tiempo estará incluido como “delay” en el análisis, y quiere decir que las personas que presenten el desenlace de interés antes de esos 14 días posteriores a la aplicación de la vacuna no serán contabilizadas entre las vacunadas.

Veamos esto con un ejemplo: una persona que recibe la primera dosis de la vacuna el 23 de febrero de 2044 y fallece a causa de infección con el patógeno el 28 de febrero de 2044 no será contabilizada como inmunizada, debido a que no había transcurrido el tiempo necesario para el desarrollo respuesta inmune protectora (Figura 1).

Figura 1.Tiempos clave en la efectividad vacunal

6. Análisis descriptivo de datos

Vaccineff cuenta con un conjunto de funciones que facilitan el análisis exploratorio, la agrupación de datos de forma categórica y la construcción de las variables necesarias para la estimación de la efectividad vacunal.

6.1 Descripción del conjunto de datos y las variables

En esta sección describiremos las características generales del conjunto de datos que se utilizará para estimar la efectividad vacunal con el diseño de cohorte. Pero primero es necesario cargar el conjunto datos, para esto debe ejecutar el siguiente comando en R.

data("cohortdata")

En el ambiente de RStudio aparecerá el objeto “cohortdata” que cuenta con 100.000 observaciones y 8 variables.

Para explorar las características generales de las variables, ingrese el siguiente comando en R:

str(cohortdata)
## Classes 'data.table' and 'data.frame':   100000 obs. of  8 variables:
##  $ sex           : chr  "F" "M" "F" "M" ...
##  $ age           : int  6 79 34 26 66 10 46 21 60 39 ...
##  $ subsidy       : num  0 0 0 0 0 1 0 0 0 0 ...
##  $ death_date    : IDate, format: NA NA ...
##  $ vaccine_date_1: IDate, format: NA "2044-03-31" ...
##  $ vaccine_date_2: IDate, format: NA "2044-05-07" ...
##  $ vaccine_1     : chr  NA "BRAND2" "BRAND2" NA ...
##  $ vaccine_2     : chr  NA "BRAND2" "BRAND2" NA ...
##  - attr(*, ".internal.selfref")=<externalptr>

Como puede observarse, la primera línea describe la clase del objeto cohortdata. En particular, vemos que es de tipo ‘data.table’ y ‘data.frame’, lo que implica que a este son aplicables las funciones compatibles con ambas clases de objetos. En las siguientes líneas se describen las variables contenidas en el conjunto de datos. Tres de estas son tipo cadena de caracteres (‘chr’), tres tipo fecha (‘IDate’), una tipo entero (‘int’) y una tipo numérica (‘num’). Para todas las columnas se presenta también en la salida el contendio de las primeras filas del conjunto de datos.

Complete la siguiente tabla con la información de las variables del conjunto de datos

Variable Código Tipo Valores
Sexo $sex nominal F, M
Edad $age 0 a 100
Fecha de defunción IDate
Fecha vacuna 1 NA, “yyyy-mm-dd”
Fecha vacuna 2 $va ccine_date_2
Marca vacuna 1 $vaccine_1
nominal

NA,

“BRAND1”, “BRAND2”

6.2. Análisis exploratorio de datos

6.2.1. Grupo etario

Para agrupar la población por grupo etario y graficar la distribución por edad utilizaremos la función “get_age_group”. Para esto, ejectute el siguiente comando en R:

cohortdata$age_group <- get_age_group(
  data = cohortdata,
  col_age = "age",
  max_val = 80,
  min_val = 0,
  step = 9)

Esta función permite agrupar la población en intervalos etarios a partir de la variable “age” del conjunto de datos. En particular, para construir la agrupación por decenios se asigna el ancho del intervalo con step = 9, el mínimo valor de edad en 0 con “min_val” y el máximo valor en 80 con “max_val”. Esto significa que cualquier registro con edad mayor o igual a 80 años se agrupará en “>80”

Puede graficar de forma rápida la distribución etaria asociada a la variable “age_group” utilizando la función “geom_bar” de la librería ggplot2. Para esto, ejecute el siguiente comando en R:

ggplot(data = cohortdata,
  aes(x = age_group)) +
  geom_bar() +
  theme_classic()

6.2.2. Cobertura vacunal en las cohortes

En un conjunto de datos típico de un estudio de cohorte se tiene información desagregada por persona de la(s) dosis aplicada(s) durante el seguimiento. En este sentido, es importante dimensionar el nivel de cobertura en la vacunación alcanzado durante el seguimiento. Vaccineff ofrece la función “plot_coverage” que permite llevar a cabo esta tarea con facilidad. Para esto, ejecute el siguiente comando en R:

plot_coverage(
  data = cohortdata,
  vacc_date_col = "vaccine_date_1",
  unit = "month",
  doses_count_color = "steelblue",
  coverage_color = "mediumpurple",
  date_interval = NULL,
  cumulative = FALSE)

Esta función evalúa la cobertura con base en alguna dosis, la cual se especifica en el parámetro “vacc_date_col”. En particular, en el ejemplo anterior se utiliza la primera dosis del conjunto de datos de ejemplo (“vaccine_date_1”). Además, es posible agrupar el conteo de dosis y el cálculo de cobertura en días, meses y años utilizando el parámetro “unit” y personalizar los colores de la gráfica con los parámetros “doses_count_color” y “coverage_color”. El parámetro “date_interval” se utiliza para personalizar el intervalo de datos que se quiere observar, en caso de usar “FALSE” la función toma las fechas mínima y máxima de la tabla. Finalmente, el parámetro “cumulative” permite graficar el conteo de dosis de forma acumulada en el tiempo.

Ahora prueba la función cambiando vaccine_date_1 por vaccine_date_2 y la unidad de tiempo por días.

plot_coverage(
  data = cohortdata,
  vacc_date_col = "vaccine_date_2",
  unit = "day",
  doses_count_color = "steelblue",
  coverage_color = "mediumpurple",
  date_interval = NULL,
  cumulative = FALSE)

7. Análisis estadístico para el diseño de cohortes.

Como mencionamos previamente, en los estudios con diseño de cohorte es necesario llevar a cabo un seguimiento de la cohorte vacunada y la cohorte no vacunada con igual intensidad hasta que termine el tiempo de seguimiento o hasta que se presente el desenlace de interés.

7.1. Definir la pregunta a evaluar

En este taller, la pregunta que se requiere responder para el caso de estudio es: ¿Cuál es la efectividad de la vacuna para evitar la muerte debido a la infección ocasionada por el virus respiratorio de interés?.

7.2. Definir el periodo de estudio

Por lo tanto, el desenlace de interés será el fallecimiento debido a la infección por el virus. El seguimiento de las cohortes empieza el 1 de enero de 2044 y el periodo de seguimiento fue de un año.

Como el seguimiento de las cohortes inicia el 1 de enero de 2044 vamos a definir la fecha del inicio del seguimiento (tiempo 0), para esto ejecute el siguiente comando en R:

start_cohort <- as.Date("2044-01-01")

Luego, definamos la fecha del final del seguimiento que corresponde a la fecha donde se detiene el seguimiento de la cohorte, para esto ejecute el siguiente comando en R:

end_cohort <- as.Date("2044-12-31")

7.3. Definir el tiempo de inducción del efecto (delay)

Ahora defina el “delay” de 14 días entre la fecha de la aplicación de la vacuna y el momento del desarrollo de inmunidad protectora, para esto escriba la siguiente inscripción en R y ejecútelo:

cohortdata$immunization <-
  get_immunization_date(
    data = cohortdata,
    outcome_date_col = "death_date",
    outcome_delay = 0,
    immunization_delay = 14,
    vacc_date_col = c("vaccine_date_1", "vaccine_date_2"),
    end_cohort = end_cohort,
    take_first = FALSE)

Al ejecutar este comando, se añadirá una columna nueva al conjunto de datos del caso de estudio, esta columna contiene una variable de tipo “Date” que corresponde la fecha 14 días posteriores a la última dosis de cualquiera de las dos vacunas utilizadas en el caso de estudio y se está integrando el concepto de delay al tener en cuenta los 14 días que se espera que transcurran antes de considerar que existe inmunidad protectora. Puede evidenciar la nueva columna en el conjunto de datos.

7.4. Definir la exposición: cohorte vacunada y cohorte no vacunada

A continuación, cree una columna nueva donde categorice cada uno de los sujetos según su estado vacunal, vacunados como “v” y no vacunados como “u” (unvaccinated, en inglés). Para esto ejecute el siguiente comando en R:

cohortdata$vaccine_status <- set_status(
  data = cohortdata,
  col_names = "immunization",
  status = c("vacc", "unvacc"))

Al ejecutar el comando encontrará que se ha creado una nueva columna en el conjunto de datos y podrá evidenciar en la base de datos que en la nueva columna se consignó “vacc” o “unvacc” para cada uno de los registros de acuerdo a su estado de vacunación de acuerdo a las consideraciones del punto anterior, donde se integraron los delay y para cualquiera de las dos vacunas que se utilizaron en el caso de estudio.

7.5. Definir el desenlace: estado vivo vs estado fallecido

El desenlace para este ejercicio va a ser la condición vital al final del estudio. En otros ejercicios el desenlace de interés podría ser la hospitalización o la infección, dependiendo del conjunto de datos utilizado.

Tenga en cuenta que en conjunto de datos del caso de estudio todas las defunciones son debidas a la infección por el virus de interés. Para definir el desenlace de interés de acuerdo a la condición vital de los participantes en la cohorte, ejecute el siguiente comando en R:

cohortdata$death_status <- set_status(
  data = cohortdata,
  col_names = "death_date")

Al ejecutar este comando, nuevamente aparecerá una nueva columna en el conjunto de datos con el que se está realizando el caso de estudio. Al explorar la base de datos completa, se verifica que en la nueva columna aparece 0 = vivo y 1 = fallecido.

7.6. Calcular el tiempo al evento (desde exposición hasta desenlace)

Ahora, calcule para cada una de las personas el tiempo que fue seguido en el estudio. Recuerde que el seguimiento se hace igual para ambas cohortes (vacunada y no vacunada) y finaliza cuando termina el estudio o cuando se presenta el desenlace de interés. Para obtener este dato ejecute el siguiente comando en R:

cohortdata$time_to_death <- get_time_to_event(
  data = cohortdata,
  outcome_date_col = "death_date",
  start_cohort = start_cohort,
  end_cohort = end_cohort,
  start_from_immunization = FALSE)

Nuevamente, al ejecutar este comando se creará una nueva variable en el conjunto de datos y como se puede evidenciar al explorar los datos completos, la nueva variable estima los días de seguimiento para cada una de las personas. Esta función permite crear tiempos al evento desde el inicio del seguimiento en el caso de estudio, en este caso se utiliza la opción “start_from_immunization = FALSE” o desde la fecha de inmunización. Para este último caso es necesario asignar “start_from_immunization = TRUE” y pasar el nombre de la columna con la información sobre la fecha de inmunización en el parámetro “immunization_date_col”

7.6. Calcular las curvas de riesgo acumulado y supervivencia al desenlace en cada cohorte

Como aproximación cualitativa a la efectividad vacunal, graficaremos la curva de riesgos acumulados (1 menos la supervivencia de las poblaciones). Esta nos permite entender de forma cualitativa cuál de las poblaciones acumula mayor riesgo durante el estudio de cohorte. Y por tanto, evaluar hipótesis sobre el potencial efecto de la vacunación sobre la cohorte. Para graficar el riesgo acumulado ejecute el siguiente comando en R:

plot_survival(data = cohortdata,
  outcome_status_col = "death_status",
  time_to_event_col = "time_to_death",
  vacc_status_col = "vaccine_status",
  vaccinated_status = "vacc",
  unvaccinated_status = "unvacc",
  vaccinated_color = "steelblue",
  unvaccinated_color = "darkred",
  start_cohort = start_cohort,
  end_cohort = end_cohort,
  percentage = TRUE,
  cumulative = TRUE)

A partir de la función anterior también es posible realizar la gráfica de supervivencia de las cohortes o gráfica de Kaplan-Meier en la cual se parte del 100% de ambas cohortes en el eje de las ordenadas y en el eje de las abscisas se representa el tiempo y se observa la disminución que hay debido a las defunciones en cada cohorte. Tenga en cuenta que este no es el estimador de Kaplan-Meir, es sólo la gráfica sobre las curvas de supervivencia y de riesgo acumulado. Para obtener este gráfico, se ejecuta la misma función y se cambia el argumento “percentage” por FALSE:

plot_survival(data = cohortdata,
  outcome_status_col = "death_status",
  time_to_event_col = "time_to_death",
  vacc_status_col = "vaccine_status",
  vaccinated_status = "vacc",
  unvaccinated_status = "unvacc",
  vaccinated_color = "steelblue",
  unvaccinated_color = "darkred",
  start_cohort = start_cohort,
  end_cohort = end_cohort,
  percentage = TRUE,
  cumulative = FALSE)

7.7. Estimar la efectividad vacunal mediante modelo de Cox

En todos los estudios observacionales de efectividad vacunal de cohorte se compara el riesgo (o tasa de incidencia) entre los vacunados y no vacunados de desarrollar el desenlace de interés (infección, enfermedad, muerte, etc). La medida de riesgo a utilizar dependerá de las características de la cohorte y puede expresarse en términos de relative risk (RR) o hazard ratio (HR).

En este ejercicio utilizaremos el modelo de regresión de riesgos proporcionales de Cox para estimar el hazar ratio y con esta medida estimar la efectividad mediante

VE= 1-HR

Para estimar la efectividad vacunal en términos de HR, ejecute el siguiente comando en R:

coh_eff_noconf(
  data = cohortdata,
  outcome_status_col = "death_status",
  time_to_event_col = "time_to_death",
  status_vacc_col = "vaccine_status")
##       HR HR_low HR_high  V_eff V_eff_low V_eff_high     PH      p_value
## 1 0.6445 0.5488  0.7568 0.3555    0.2432     0.4512 reject 2.047998e-15

9. Interpretación

El término HR hace referencia a la estimador puntual del hazard ratio de la población vacunada (expuesta) comparada con la población no expuesta (no vacunada). HR_low y HR_high hacen referencia a los límites inferior y superior, respectivamente, del intervalo de confianza del 95% para ese estimador puntual. Por lo tanto, el hazard ratio de la población vacunada para presentar muerte por infección debida al virus es 0.6445 con un intervalo de confianza del 95% entre 0.5488 y 0.7568. 

Por su parte V_eff se refiere al estimador puntual de la efectividad vacunal derivada de la fórmula (VE=1-HR). Veff_low y Veff_high hacen referencia a los límites inferior y superior, respectivamente, del intervalo de confianza del 95% para ese estimador puntual. Por lo tanto, la efectividad de la vacuna para prevenir muerte por infección debida al virus es 0.3555 con un intervalo de confianza del 95% entre 0.2432 y 0.4512.

Sin embargo, al final de la salida se evidencia que el término PH que se refiere a la prueba de hipótesis de igualdad de los riesgos proporcionales. En esta prueba de hipótesis, la hipótesis nula es que los riesgos son proporcionales entre dos sujetos a lo largo del tiempo. La hipótesis alterna es que los riesgos no son proporcionales a lo largo del tiempo. Como se evidencia, la hipótesis nula es rechazada, es decir en la población de nuestro caso de estudio los riesgos no son proporcionales.

Realice la interpretación del HR y la V_eff con sus intervalos de confianza y la prueba de hipótesis de riesgos proporcionales.

10. Siguientes pasos

En el pipeline del desarrollo de Vaccineff se encuentran algunas funciones en implementación, que permitirán ampliar los análisis que se pueden realizar con los datos de los estudios con diseño de cohorte, así como la utilización de análisis de otros diseños de estimación de efectividad vacunal. Entre las funciones que se espera tener implementadas en el corto plazo se encuentran:

Sobre este documento

Este documento puede ser usado para propósitos no comerciales y de enseñanza.