1 Marco conceptual

En la práctica clínica una prueba diagnóstica rara vez se interpreta sola, por tanto, considero que entender cómo se combinan varias pruebas es uno de los aprendizajes más útiles de la epidemiología clínica, porque casi ningún diagnóstico real se construye con una sola pieza de evidencia; por lo que en este documento desarrollaré paso a paso el ejercicio trabajado en la clase del 21 de mayo, replicando primero los cálculos del archivo de Excel en R y posteriormente aplicando la misma lógica al taller de la semana con una enfermedad de mi elección.

Una prueba diagnóstica actualiza mi sospecha clínica previa, no la dictamina; desde mi perspectiva, esto cambia completamente la forma de leer un resultado, porque me obliga a describir el comportamiento de la prueba con varias medidas complementarias en lugar de una sola.

Necesito por tanto saber: - cuántos enfermos detecta (sensibilidad) - cuántos sanos clasifica correctamente (especificidad) - qué probabilidad real de enfermedad tiene un paciente con resultado positivo o negativo (valores predictivos) y - cuánto mueve mi sospecha cada resultado (razones de verosimilitud).

Cuando una sola prueba no me alcanza para tomar una decisión clínica con confianza, puedo combinar varias bajo dos lógicas opuestas: - 1. En serie: cundo considero positivo el diagnóstico final solo si todas las pruebas resultan positivas, lo cual exige más evidencia, reduce los falsos positivos y aumenta la especificidad, aunque a costa de perder algunos enfermos.

  • 2. En paralelo considero positivo el diagnóstico si al menos una prueba resulta positiva, lo cual detecta más enfermos y eleva la sensibilidad, aunque a costa de aceptar más falsos positivos.

1.1 Mi estructura del documento

Organizaré el desarrollo en tres partes progresivas que comparten la misma lógica conceptual pero se aplican a problemas distintos:

  • La primera parte reproduce el ejercicio teórico del Excel con dos pruebas hipotéticas en una población de 10.000 personas con prevalencia del 10%, construyendo desde cero las tablas individuales, las combinaciones en serie y paralelo, el nomograma de Fagan y el coeficiente kappa de concordancia.

  • La segunda parte aplica la misma lógica a uno de los escenarios reales que aparece en la segunda hoja del Excel de la clase, que nos quedó de práctica a realizar, con parámetros publicados en la literatura científica.

  • La tercera parte desarrollaré el taller calificado de la semana con una enfermedad de mi elección, siguiendo los puntos solicitados en la guía, como es el planteamiento del problema en formato PI/ECOT, descripción de la población, justificación clínica, dos estrategias de combinación aplicadas a 1.000 personas, decisión final y explicación al paciente.

2 Configuración del entorno

Antes de cualquier cálculo establezco las opciones globales del documento, cargo las librerías que voy a usar a lo largo del trabajo y definiré la paleta de colores que mantendrá la coherencia visual entre tablas y gráficos.

2.1 Carga de librerías

Trabajo con un conjunto de librerías especializadas que cubren las cuatro funcionalidades que voy a necesitar, como la manipulación de datos, construcción de tablas, visualización gráfica y cálculo automatizado de métricas diagnósticas.

Considero importante mencionar que epiR es la librería recomendada en el material de clase para validar resultados, y la incluyo precisamente para contrastar mis cálculos manuales con su salida automática a lo largo del documento.

library(dplyr)
library(tidyr)
library(gt)
library(ggplot2)
library(patchwork)
library(scales)
library(epiR)
library(irr)
library(glue)
paleta <- list(
  rosa     = "#F8C8DC",
  lila     = "#D4BBE0",
  verde    = "#C5E4C9",
  durazno  = "#F9DCC4",
  azul     = "#CDE2EC",
  amarillo = "#F5EAB8",
  gris     = "#EFEFEF",
  texto    = "#3C3C3C"
)

tema_doc <- theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", color = paleta$texto, size = 14),
    plot.subtitle = element_text(color = paleta$texto, size = 11),
    axis.title = element_text(color = paleta$texto),
    axis.text = element_text(color = paleta$texto),
    panel.grid.minor = element_blank(),
    legend.position = "bottom"
  )

2.2 Funciones auxiliares

construir_2x2 <- function(sensibilidad, especificidad, enfermos, sanos) {
  vp <- enfermos * sensibilidad
  fn <- enfermos - vp
  vn <- sanos * especificidad
  fp <- sanos - vn
  
  tibble(
    Resultado = c("Prueba positiva", "Prueba negativa", "Total"),
    Enfermo   = c(vp, fn, vp + fn),
    Sano      = c(fp, vn, fp + vn),
    Total     = c(vp + fp, fn + vn, vp + fp + fn + vn)
  )
}

mostrar_tabla_2x2 <- function(tabla, titulo, color_acento = NULL) {
  if (is.null(color_acento)) color_acento <- paleta$lila
  
  tabla |>
    mutate(across(c(Enfermo, Sano, Total),
                  ~ scales::comma(.x, big.mark = ".", accuracy = 1))) |>
    gt() |>
    tab_header(title = md(glue("**{titulo}**")),
               subtitle = "Distribución esperada en la población analizada") |>
    tab_style(style = list(cell_fill(color = color_acento),
                           cell_text(weight = "bold", color = paleta$texto)),
              locations = cells_column_labels()) |>
    tab_style(style = cell_text(weight = "bold"),
              locations = cells_body(rows = Resultado == "Total")) |>
    tab_style(style = cell_fill(color = paleta$gris),
              locations = cells_body(rows = Resultado == "Total")) |>
    cols_align(align = "center", columns = c(Enfermo, Sano, Total)) |>
    tab_options(table.font.size = 13)
}

calcular_metricas <- function(tabla, nombre_prueba) {
  vp <- tabla$Enfermo[1]
  fn <- tabla$Enfermo[2]
  fp <- tabla$Sano[1]
  vn <- tabla$Sano[2]
  
  sens <- vp / (vp + fn)
  esp  <- vn / (vn + fp)
  vpp  <- vp / (vp + fp)
  vpn  <- vn / (vn + fn)
  lr_pos <- sens / (1 - esp)
  lr_neg <- (1 - sens) / esp
  
  tibble(
    Prueba = nombre_prueba,
    Sensibilidad = sens,
    Especificidad = esp,
    `Valor predictivo positivo` = vpp,
    `Valor predictivo negativo` = vpn,
    `Razón de verosimilitud positiva` = lr_pos,
    `Razón de verosimilitud negativa` = lr_neg
  )
}

3 PARTE 1. Reproducción del ejercicio teórico del Excel

En esta primera parte reproduzco en R el ejercicio teórico que realizamos durante la clase, donde se analizan dos pruebas diagnósticas hipotéticas aplicadas a una población simulada de 10.000 personas con prevalencia del 10%.

Considero importante empezar por este ejercicio porque me permite entender la mecánica completa de combinación de pruebas en un escenario controlado, donde puedo verificar cada cálculo paso a paso antes de aplicarlo a datos reales en las partes siguientes.

3.1 Parámetros del ejercicio

poblacion   <- 10000
prevalencia <- 0.10

sens_t1 <- 0.90
esp_t1  <- 0.70

sens_t2 <- 0.80
esp_t2  <- 0.75

enfermos <- poblacion * prevalencia
sanos    <- poblacion - enfermos

tibble(
  Parámetro = c("Población total", "Prevalencia esperada", 
                "Sensibilidad Prueba 1", "Especificidad Prueba 1",
                "Sensibilidad Prueba 2", "Especificidad Prueba 2",
                "Total de enfermos esperados", "Total de sanos esperados"),
  Valor = c(scales::comma(poblacion, big.mark = "."),
            scales::percent(prevalencia, decimal.mark = ","),
            scales::percent(sens_t1, decimal.mark = ","),
            scales::percent(esp_t1,  decimal.mark = ","),
            scales::percent(sens_t2, decimal.mark = ","),
            scales::percent(esp_t2,  decimal.mark = ","),
            scales::comma(enfermos, big.mark = "."),
            scales::comma(sanos,    big.mark = "."))
) |>
  gt() |>
  tab_header(title = md("**Parámetros del ejercicio teórico de excel**"),
             subtitle = "Población hipotética de 10.000 personas con prevalencia del 10%") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$gris),
            locations = cells_body(rows = seq(1, 8, 2))) |>
  cols_align(align = "center", columns = Valor) |>
  tab_options(table.font.size = 13)
Parámetros del ejercicio teórico de excel
Población hipotética de 10.000 personas con prevalencia del 10%
Parámetro Valor
Población total 10.000
Prevalencia esperada 10%
Sensibilidad Prueba 1 90%
Especificidad Prueba 1 70%
Sensibilidad Prueba 2 80%
Especificidad Prueba 2 75%
Total de enfermos esperados 1.000
Total de sanos esperados 9.000

3.1.1 Análisis epidemiológico de los parámetros

Considero importante detenerme en estos números antes de calcular nada, porque esconden tres decisiones de diseño que van a condicionar todo el análisis.

  • Primero, el tamaño de la población es a propósito grande para que los porcentajes se traduzcan en personas contables, sin decimales que dificulten la interpretación.

  • Segundo, la prevalencia del 10% genera una asimetría fundamental, pues hay nueve veces más sanos que enfermos en la población, lo cual significa que en términos absolutos los falsos positivos pesarán mucho más que los falsos negativos en los resultados finales.

  • Tercero, las dos pruebas tienen perfiles complementarios pero no idénticos, pues la Prueba 1 es más sensible (90% frente a 80%) mientras que la Prueba 2 es más específica (75% frente a 70%), por lo que al combinarlas voy a poder observar cómo se compensan sus fortalezas individuales.

3.2 Análisis de cada prueba por separado

Antes de combinarlas, necesito caracterizar el comportamiento de cada prueba individualmente, por lo que considero que este paso es indispensable porque las propiedades de cada prueba son el insumo para todos los cálculos posteriores.

Construiré la tabla 2×2 esperada aplicando los parámetros de cada prueba a la población hipotética, y desde mi perspectiva la mejor manera de hacerlo es razonar la lógica del cálculo en palabras antes de mostrar los números; por lo cual,si tengo 1.000 enfermos en la población y la Prueba 1 detecta correctamente al 90% de ellos, entonces los verdaderos positivos serían 900 y los falsos negativos serían 100.

Por otro lado, *si tengo 9.000 sanos y la Prueba 1 los clasifica bien al 70%, entonces los verdaderos negativos son 6.300 y los falsos positivos son 2.700, en consecuencia, este será el mismo razonamiento que aplicaré para la Prueba 2 con sus propios parámetros.

tabla_p1 <- construir_2x2(sens_t1, esp_t1, enfermos, sanos)
tabla_p2 <- construir_2x2(sens_t2, esp_t2, enfermos, sanos)

3.2.1 Tabla 2×2 de la Prueba 1

mostrar_tabla_2x2(tabla_p1, "Tabla 2×2 — Prueba 1")
Tabla 2×2 — Prueba 1
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 900 2.700 3.600
Prueba negativa 100 6.300 6.400
Total 1.000 9.000 10.000

Observo que la Prueba 1 detecta correctamente a 900 de los 1.000 enfermos esperados, lo cual representa una sensibilidad alta, sin embargo, deja escapar a 100 enfermos como falsos negativos, y desde la perspectiva clínica esta es la celda crítica porque corresponde a pacientes con la enfermedad que reciben un resultado tranquilizador.

Por el lado de los sanos, la prueba clasifica correctamente a 6.300 pero etiqueta erróneamente a 2.700 como positivos, por tanto, estos falsos positivos representan un costo importante para el sistema de salud porque van a desencadenar estudios adicionales, generando ansiedad en pacientes que no tienen la enfermedad y mayor consumo de recursos que podrían destinarse a otros usos.

Considero relevante observar lo que ocurre cuando leo la tabla por filas, pues de los 3.600 pacientes con resultado positivo, solo 900 realmente tienen la enfermedad, por lo que la mayoría de los positivos son sanos mal clasificados.

Esta observación me adelanta una conclusión importante que voy a confirmar matemáticamente más adelante, pues un resultado positivo en la Prueba 1 no es suficiente para confirmar el diagnóstico. En cambio, de los 6.400 pacientes con resultado negativo, solo 100 estaban enfermos, lo cual sugiere que un resultado negativo en la Prueba 1 es bastante tranquilizador.

3.2.2 Tabla 2×2 de la Prueba 2

mostrar_tabla_2x2(tabla_p2, "Tabla 2×2 — Prueba 2")
Tabla 2×2 — Prueba 2
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 800 2.250 3.050
Prueba negativa 200 6.750 6.950
Total 1.000 9.000 10.000

Observo que la Prueba 2 tiene un comportamiento distinto, pues me detecta a 800 enfermos como verdaderos positivos, cien menos que la Prueba 1, por lo que deja escapar al doble de enfermos (200 frente a 100).

Por el lado de los sanos, clasifica correctamente a 6.750 y solo genera 2.250 falsos positivos, es decir, 450 menos que la Prueba 1, por consiguiente, considero que esto ilustra el intercambio clásico entre sensibilidad y especificidad, cuando la prueba se vuelve más exigente para llamar “positivo” a un paciente, ganando sanos bien clasificados pero pierde enfermos detectados.

La pregunta clínicamente relevante que surge al comparar las dos pruebas es cuál tipo de error me resulta menos tolerable, pues si pierdo 100 enfermos extra con la Prueba 2, ¿es peor que estudiar 450 sanos adicionales con la Prueba 1?, por lo que la respuesta depende del contexto clínico, como es la gravedad de la enfermedad, costo del tratamiento erróneo, costo del estudio adicional y consecuencias emocionales para el paciente.

Considero que esta decisión nunca es puramente estadística, pues se debe tener en cuenta los criterios clínicos y éticos.

3.3 Métricas diagnósticas de cada prueba y el Cálculo manual paso a paso

3.3.1 Métricas de la Prueba 1

Antes de calcular cualquier métrica, traigo nuevamente la tabla 2×2 de la Prueba 1 a la vista para tener todos los valores presentes durante el desarrollo.

mostrar_tabla_2x2(tabla_p1, "Tabla 2×2 — Prueba 1 (referencia para los cálculos)")
Tabla 2×2 — Prueba 1 (referencia para los cálculos)
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 900 2.700 3.600
Prueba negativa 100 6.300 6.400
Total 1.000 9.000 10.000

De esta tabla extraigo los cuatro valores que voy a usar en todas las fórmulas:

  • Verdaderos positivos = 900
  • Falsos negativos = 100
  • Falsos positivos = 2.700
  • Verdaderos negativos = 6.300
  • Total de enfermos = 1.000
  • Total de sanos = 9.000
  • Total de positivos = 3.600
  • Total de negativos = 6.400

3.3.1.1 Sensibilidad de la Prueba 1

La sensibilidad responde cuántos enfermos detecta correctamente la prueba sobre el total de enfermos reales en la población:

\[\text{Sensibilidad} = \frac{\text{Verdaderos positivos}}{\text{Verdaderos positivos} + \text{Falsos negativos}} = \frac{\text{Verdaderos positivos}}{\text{Total de enfermos}}\]

\[\text{Sensibilidad}_{P1} = \frac{900}{900 + 100} = \frac{900}{1.000} = 0{,}900 = 90{,}0\,\%\]

La Prueba 1 detecta correctamente a 9 de cada 10 enfermos, por lo cual, esta es una sensibilidad alta para estándares clínicos, por lo que la Prueba 1 sería preferible cuando mi prioridad es no perder casos.

3.3.1.2 Especificidad de la Prueba 1

La especificidad responde cuántos sanos clasifica correctamente la prueba sobre el total de sanos reales en la población:

\[\text{Especificidad} = \frac{\text{Verdaderos negativos}}{\text{Verdaderos negativos} + \text{Falsos positivos}} = \frac{\text{Verdaderos negativos}}{\text{Total de sanos}}\]

\[\text{Especificidad}_{P1} = \frac{6.300}{6.300 + 2.700} = \frac{6.300}{9.000} = 0{,}700 = 70{,}0\,\%\]

La Prueba 1 clasifica correctamente a 7 de cada 10 sanos, por lo que 3 de cada 10 sanos terminan etiquetados erróneamente como positivos. Considero que esta especificidad es moderada-baja, lo cual anticipa un problema con los falsos positivos cuando la prueba se aplique en una población con baja prevalencia.

3.3.1.3 Valor predictivo positivo de la Prueba 1

El valor predictivo positivo responde la pregunta clínica más importante para los médicos, frente a un resultado positivo, sobre qué probabilidad real de enfermedad tiene mi paciente.

\[\text{Valor predictivo positivo} = \frac{\text{Verdaderos positivos}}{\text{Verdaderos positivos} + \text{Falsos positivos}} = \frac{\text{Verdaderos positivos}}{\text{Total de positivos}}\]

\[\text{VPP}_{P1} = \frac{900}{900 + 2.700} = \frac{900}{3.600} = 0{,}250 = 25{,}0\,\%\]

Si la Prueba 1 sale positiva, solo uno de cada cuatro pacientes realmente está enfermo, por lo este es el resultado más revelador del análisis individual, porque a pesar de que la prueba tiene sensibilidad del 90%, un resultado positivo dice mucho menos de lo que parece, de ahí, que la sensibilidad alta no equivale a capacidad confirmatoria, por lo que es uno de los errores clásicos en la interpretación de pruebas diagnósticas.

3.3.1.4 Valor predictivo negativo de la Prueba 1

El valor predictivo negativo responde la pregunta complementaria, de si la prueba sale negativa, entonces qué probabilidad real de estar sano tiene mi paciente?.

\[\text{Valor predictivo negativo} = \frac{\text{Verdaderos negativos}}{\text{Verdaderos negativos} + \text{Falsos negativos}} = \frac{\text{Verdaderos negativos}}{\text{Total de negativos}}\]

\[\text{VPN}_{P1} = \frac{6.300}{6.300 + 100} = \frac{6.300}{6.400} = 0{,}9844 = 98{,}4\,\%\]

Si la Prueba 1 sale negativa, prácticamente puedo descartar la enfermedad. Considero que este resultado, junto con la sensibilidad del 90%, confirma que la Prueba 1 es una buena herramienta para descartar enfermedad cuando da negativa, aunque no para confirmarla cuando da positiva.

3.3.1.5 Razón de verosimilitud positiva de la Prueba 1

La razón de verosimilitud positiva cuantifica cuánto se multiplica la probabilidad a favor de la enfermedad cuando el resultado es positivo:

\[\text{Razón de verosimilitud positiva} = \frac{\text{Sensibilidad}}{1 - \text{Especificidad}}\]

\[\text{LR}^{+}_{P1} = \frac{0{,}900}{1 - 0{,}700} = \frac{0{,}900}{0{,}300} = 3{,}00\]

Un resultado positivo es tres veces más probable en un enfermo que en un sano, y según la escala de Sackett, valores entre 2 y 5 representan un aumento pequeño de la probabilidad de enfermedad, por lo que un positivo en la Prueba 1 aporta evidencia pero no confirma con fuerza.

3.3.1.6 Razón de verosimilitud negativa de la Prueba 1

La razón de verosimilitud negativa cuantifica cuánto se multiplica la probabilidad a favor de la enfermedad cuando el resultado es negativo, por tanto, cuanto más cerca de cero esté, mejor descarta la prueba.

\[\text{Razón de verosimilitud negativa} = \frac{1 - \text{Sensibilidad}}{\text{Especificidad}}\]

\[\text{LR}^{-}_{P1} = \frac{1 - 0{,}900}{0{,}700} = \frac{0{,}100}{0{,}700} = 0{,}143\]

Un resultado negativo es 0,143 veces tan probable en un enfermo como en un sano, es decir, mucho menos probable, y según Sackett, valores menores de 0,1 descartan fuertemente y entre 0,1 y 0,2 lo hacen de manera moderada,asi que la Prueba 1, con LR negativa de 0,143, descarta la enfermedad de manera moderada cuando da negativa.

3.3.2 Resumen de las métricas de la Prueba 1

tibble(
  Métrica = c("Sensibilidad",
              "Especificidad",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  Cálculo = c("900 / 1.000",
              "6.300 / 9.000",
              "900 / 3.600",
              "6.300 / 6.400",
              "0,900 / 0,300",
              "0,100 / 0,700"),
  Resultado = c("90,0 %", "70,0 %", "25,0 %", "98,4 %", "3,00", "0,143"),
  Interpretación = c("Detecta correctamente al 90% de los enfermos",
                     "Clasifica correctamente al 70% de los sanos",
                     "Solo 1 de cada 4 positivos está realmente enfermo",
                     "Un negativo descarta enfermedad con alta confianza",
                     "Aumento pequeño de la probabilidad de enfermedad",
                     "Disminución moderada de la probabilidad de enfermedad")
) |>
  gt() |>
  tab_header(title = md("**Resumen de las seis métricas de la Prueba 1**"),
             subtitle = "Cálculos paso a paso e interpretación clínica") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  cols_align(align = "left", columns = c(Métrica, Interpretación)) |>
  cols_align(align = "center", columns = c(Cálculo, Resultado)) |>
  tab_options(table.font.size = 12, data_row.padding = px(8))
Resumen de las seis métricas de la Prueba 1
Cálculos paso a paso e interpretación clínica
Métrica Cálculo Resultado Interpretación
Sensibilidad 900 / 1.000 90,0 % Detecta correctamente al 90% de los enfermos
Especificidad 6.300 / 9.000 70,0 % Clasifica correctamente al 70% de los sanos
Valor predictivo positivo 900 / 3.600 25,0 % Solo 1 de cada 4 positivos está realmente enfermo
Valor predictivo negativo 6.300 / 6.400 98,4 % Un negativo descarta enfermedad con alta confianza
Razón de verosimilitud positiva 0,900 / 0,300 3,00 Aumento pequeño de la probabilidad de enfermedad
Razón de verosimilitud negativa 0,100 / 0,700 0,143 Disminución moderada de la probabilidad de enfermedad

3.3.3 Métricas de la Prueba 2

Aplico el mismo procedimiento manual a la Prueba 2; considero útil contrastar los resultados con los de la Prueba 1 para entender cómo dos pruebas con perfiles distintos producen historias diagnósticas distintas. Antes de empezar, traigo nuevamente la tabla 2×2 a la vista.

mostrar_tabla_2x2(tabla_p2, "Tabla 2×2 — Prueba 2 (mi referencia para los cálculos)")
Tabla 2×2 — Prueba 2 (mi referencia para los cálculos)
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 800 2.250 3.050
Prueba negativa 200 6.750 6.950
Total 1.000 9.000 10.000

De esta tabla extraigo los valores que voy a usar:

  • Verdaderos positivos = 800
  • Falsos negativos = 200
  • Falsos positivos = 2.250
  • Verdaderos negativos = 6.750
  • Total de positivos = 3.050
  • Total de negativos = 6.950

3.3.3.1 Sensibilidad de la Prueba 2

\[\text{Sensibilidad} = \frac{\text{Verdaderos positivos}}{\text{Verdaderos positivos} + \text{Falsos negativos}}\]

\[\text{Sensibilidad}_{P2} = \frac{800}{800 + 200} = \frac{800}{1.000} = 0{,}800 = 80{,}0\,\%\]

Observo que la Prueba 2 detecta a 8 de cada 10 enfermos; pierde el doble de enfermos que la Prueba 1, lo cual constituye su principal debilidad como herramienta de tamizaje.

3.3.3.2 Especificidad de la Prueba 2

\[\text{Especificidad} = \frac{\text{Verdaderos negativos}}{\text{Verdaderos negativos} + \text{Falsos positivos}}\]

\[\text{Especificidad}_{P2} = \frac{6.750}{6.750 + 2.250} = \frac{6.750}{9.000} = 0{,}750 = 75{,}0\,\%\]

Aquí la Prueba 2 ha clasificado correctamente a 7,5 de cada 10 sanos, ligeramente mejor que la Prueba 1; sin embargo, sigue siendo una especificidad modesta para un contexto de baja prevalencia.

3.3.3.3 Valor predictivo positivo de la Prueba 2

\[\text{Valor predictivo positivo} = \frac{\text{Verdaderos positivos}}{\text{Verdaderos positivos} + \text{Falsos positivos}}\]

\[\text{VPP}_{P2} = \frac{800}{800 + 2.250} = \frac{800}{3.050} = 0{,}262 = 26{,}2\,\%\]

Si la Prueba 2 sale positiva, apenas uno de cada cuatro pacientes está realmente enfermo; un resultado prácticamente equivalente al de la Prueba 1, lo cual confirma que en este escenario de baja prevalencia ninguna de las dos pruebas confirma la enfermedad por sí sola.

3.3.3.4 Valor predictivo negativo de la Prueba 2

\[\text{Valor predictivo negativo} = \frac{\text{Verdaderos negativos}}{\text{Verdaderos negativos} + \text{Falsos negativos}}\]

\[\text{VPN}_{P2} = \frac{6.750}{6.750 + 200} = \frac{6.750}{6.950} = 0{,}971 = 97{,}1\,\%\]

Si la Prueba 2 sale negativa, entonces puedo descartar la enfermedad con alta confianza; aunque ligeramente menor que el de la Prueba 1, sigue siendo un valor predictivo negativo clínicamente útil.

3.3.3.5 Razón de verosimilitud positiva de la Prueba 2

\[\text{Razón de verosimilitud positiva} = \frac{\text{Sensibilidad}}{1 - \text{Especificidad}}\]

\[\text{LR}^{+}_{P2} = \frac{0{,}800}{1 - 0{,}750} = \frac{0{,}800}{0{,}250} = 3{,}20\]

Un positivo en la Prueba 2 es 3,2 veces más probable en un enfermo que en un sano; ligeramente mejor que la Prueba 1 (3,00), pero todavía dentro del rango de “aumento pequeño” según la escala de Sackett.

3.3.3.6 Razón de verosimilitud negativa de la Prueba 2

\[\text{Razón de verosimilitud negativa} = \frac{1 - \text{Sensibilidad}}{\text{Especificidad}}\]

\[\text{LR}^{-}_{P2} = \frac{1 - 0{,}800}{0{,}750} = \frac{0{,}200}{0{,}750} = 0{,}267\]

Un LR negativo en la Prueba 2 reduce la probabilidad de enfermedad, pero menos que en la Prueba 1; cae en el rango de “disminución pequeña” (entre 0,2 y 0,5 según Sackett), por lo que un negativo en la Prueba 2 descarta con menos fuerza.

3.3.4 Resumen de las métricas de la Prueba 2

tibble(
  Métrica = c("Sensibilidad",
              "Especificidad",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  Cálculo = c("800 / 1.000",
              "6.750 / 9.000",
              "800 / 3.050",
              "6.750 / 6.950",
              "0,800 / 0,250",
              "0,200 / 0,750"),
  Resultado = c("80,0 %", "75,0 %", "26,2 %", "97,1 %", "3,20", "0,267"),
  Interpretación = c("Detecta correctamente al 80% de los enfermos",
                     "Clasifica correctamente al 75% de los sanos",
                     "Solo 1 de cada 4 positivos está realmente enfermo",
                     "Un negativo descarta enfermedad con alta confianza",
                     "Aumento pequeño de la probabilidad de enfermedad",
                     "Disminución pequeña de la probabilidad de enfermedad")
) |>
  gt() |>
  tab_header(title = md("**Resumen de las seis métricas de la Prueba 2**"),
             subtitle = "Cálculos paso a paso e interpretación clínica") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  cols_align(align = "left", columns = c(Métrica, Interpretación)) |>
  cols_align(align = "center", columns = c(Cálculo, Resultado)) |>
  tab_options(table.font.size = 12, data_row.padding = px(8))
Resumen de las seis métricas de la Prueba 2
Cálculos paso a paso e interpretación clínica
Métrica Cálculo Resultado Interpretación
Sensibilidad 800 / 1.000 80,0 % Detecta correctamente al 80% de los enfermos
Especificidad 6.750 / 9.000 75,0 % Clasifica correctamente al 75% de los sanos
Valor predictivo positivo 800 / 3.050 26,2 % Solo 1 de cada 4 positivos está realmente enfermo
Valor predictivo negativo 6.750 / 6.950 97,1 % Un negativo descarta enfermedad con alta confianza
Razón de verosimilitud positiva 0,800 / 0,250 3,20 Aumento pequeño de la probabilidad de enfermedad
Razón de verosimilitud negativa 0,200 / 0,750 0,267 Disminución pequeña de la probabilidad de enfermedad

3.3.5 Comparación integrada de las dos pruebas y reglas SNOUT–SPIN

Una vez calculadas las seis métricas para cada prueba, considero indispensable detenerme a integrar lo que cada una significa antes de avanzar:

Primero, la sensibilidad y la especificidad son las dos propiedades estructurales de la prueba, es decir, describen su comportamiento intrínseco frente a la enfermedad.

La sensibilidad responde una pregunta dirigida hacia los enfermos, es decir, de todos los que realmente tienen la enfermedad, ¿a cuántos detecto?, en cambio, la especificidad responde una pregunta dirigida hacia los sanos: de todos los que realmente están sanos, ¿a cuántos clasifico bien como negativos.

La razón de esta distinción es importante porque cada una se calcula sobre un denominador distinto (enfermos por un lado, sanos por el otro);por consiguiente, son medidas independientes entre sí y no compiten por el mismo grupo de pacientes.

Comparando con lo anterior, los valores predictivos cambian completamente la dirección de mi lectura; de modo que ya no parten de la enfermedad para describir la prueba, sino que parten del resultado de la prueba para estimar la probabilidad real de enfermedad.

Dicho en otras palabras, el valor predictivo positivo es la pregunta que más nos importa como clínicos frente a nuestro paciente, pues si el resultado dio positivo, ¿qué probabilidad real tiene mi paciente de estar enfermo?.

Es necesario resaltar que esta pregunta depende fuertemente de la prevalencia del escenario; por esta razón, dos pruebas con idéntica sensibilidad y especificidad pueden tener valores predictivos muy distintos según la población en la que se apliquen.

Las razones de verosimilitud, por su parte, ocupan un lugar intermedio entre las dos lecturas anteriores, y vale la pena aclarar que no dependen de la prevalencia, lo cual las convierte en propiedades más estables de la prueba; al mismo tiempo, traducen el comportamiento de la prueba a una escala práctica que permite mover una sospecha clínica preprueba hacia una sospecha posprueba, de ahí que sean tan útiles en el razonamiento clínico bayesiano que veré más adelante con el nomograma de Fagan.

Sobre la lectura conjunta de las dos pruebas, tengo que la Prueba 1 detecta más enfermos (sensibilidad del 90 %) y su razón de verosimilitud negativa de 0,143 confirma que descarta razonablemente bien cuando da negativa; sin embargo, su especificidad modesta del 70 % genera muchos falsos positivos en términos absolutos,lo cual castiga su valor predictivo positivo hasta el 25%.

Por su parte, la Prueba 2 es algo más específica (75 %) y tiene una razón de verosimilitud positiva ligeramente mejor (3,20); no obstante, su sensibilidad menor (80 %) y su razón de verosimilitud negativa de 0,267 muestran que descarta con menos fuerza que la Prueba 1.

Las dos reglas nemotécnicas clásicas condensan esta lectura en una forma operativa para la práctica, donde la regla SNOUT (Sensitive test, when Negative, rules OUT) establece que una prueba con sensibilidad alta, cuando da negativa, descarta la enfermedad; dado que la Prueba 1 combina sensibilidad del 90 % con una razón de verosimilitud negativa cercana al umbral de descarte fuerte, considero que cumple razonablemente esta regla.

La regla SPIN (Specific test, when Positive, rules IN) establece, por el contrario, que una prueba con especificidad alta, cuando da positiva, confirma la enfermedad; a pesar de esto, ninguna de las dos pruebas cumple este criterio porque sus especificidades son apenas moderadas y sus razones de verosimilitud positivas caen en la zona de aumento pequeño según Sackett.

Como resultado de todo este análisis, puedo formular una conclusión que justifica el resto del ejercicio, pues tengo dos pruebas que descartan razonablemente bien pero ninguna confirma bien por sí sola.

Siendo así, la pregunta natural es si puedo combinarlas para que la combinación supere la limitación individual. En este orden de ideas, las próximas dos secciones cuantificaré exactamente cuánto gano y cuánto pierdo con cada estrategia de combinación:

  • primero la estrategia en serie, donde exijo que ambas pruebas coincidan en positivo, y luego la estrategia en paralelo, donde basta con que una de las dos detecte la enfermedad.

4 Estrategia de combinación en serie

Una vez analizadas las dos pruebas por separado, la pregunta natural es cómo puedo combinarlas para superar sus limitaciones individuales. La estrategia en serie responde una necesidad clínica muy concreta, sobre confirmar el diagnóstico antes de actuar.

Considero que tiene sentido aplicarla cuando un resultado positivo va a desencadenar consecuencias importantes para el paciente, como un tratamiento invasivo, una cirugía, una quimioterapia o una intervención costosa; siendo así, no puedo permitirme actuar sobre falsos positivos.

La lógica operativa de la estrategia en serie es la siguiente: aplico primero una prueba y, solamente si esa sale positiva, aplico la segunda; considero positivo el diagnóstico final únicamente cuando ambas pruebas coinciden en positivo, por lo cual,la regla de decisión es una conjunción lógica: positivo final equivale a Prueba 1 positiva y Prueba 2 positiva.

Desde la perspectiva matemática, esta lógica corresponde a una intersección de eventos, dado que la regla exige la coincidencia simultánea de dos resultados positivos, la probabilidad conjunta se obtiene multiplicando las probabilidades individuales, asumiendo que las dos pruebas son condicionalmente independientes dentro de los enfermos y dentro de los sanos.

Vale la pena aclarar que este supuesto de independencia es razonable cuando las dos pruebas miden mecanismos biológicos distintos y se vuelve problemático cuando miden esencialmente lo mismo; por consiguiente, los resultados que voy a obtener asumen que las dos pruebas aportan información complementaria, no redundante.

4.1 Construcción de la tabla 2×2 combinada

sens_serie <- sens_t1 * sens_t2
esp_serie  <- 1 - ((1 - esp_t1) * (1 - esp_t2))

tabla_serie <- construir_2x2(sens_serie, esp_serie, enfermos, sanos)

mostrar_tabla_2x2(tabla_serie, "Tabla 2×2 — Estrategia en serie")
Tabla 2×2 — Estrategia en serie
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 720 675 1.395
Prueba negativa 280 8.325 8.605
Total 1.000 9.000 10.000

4.2 Cálculo de las métricas combinadas

A partir de la tabla 2×2 que acabo de generar, calculo las seis métricas que describen el comportamiento conjunto de las dos pruebas combinadas en serie, por lo cual, consolido los cálculos en una tabla integradora donde cada fila muestra la fórmula completa, la sustitución matemática con los valores conocidos y el resultado final.

vp_s <- tabla_serie$Enfermo[1]
fn_s <- tabla_serie$Enfermo[2]
fp_s <- tabla_serie$Sano[1]
vn_s <- tabla_serie$Sano[2]

sens_serie <- vp_s / (vp_s + fn_s)
esp_serie  <- vn_s / (vn_s + fp_s)
vpp_serie  <- vp_s / (vp_s + fp_s)
vpn_serie  <- vn_s / (vn_s + fn_s)
lr_pos_serie <- sens_serie / (1 - esp_serie)
lr_neg_serie <- (1 - sens_serie) / esp_serie

tibble(
  Métrica = c("Sensibilidad neta",
              "Especificidad neta",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  `Fórmula completa` = c(
    "Sensibilidad de la Prueba 1 × Sensibilidad de la Prueba 2",
    "1 − [(1 − Especificidad de la Prueba 1) × (1 − Especificidad de la Prueba 2)]",
    "Verdaderos positivos finales / (Verdaderos positivos finales + Falsos positivos finales)",
    "Verdaderos negativos finales / (Verdaderos negativos finales + Falsos negativos finales)",
    "Sensibilidad neta / (1 − Especificidad neta)",
    "(1 − Sensibilidad neta) / Especificidad neta"
  ),
  `Valores conocidos` = c(
    "Sensibilidad Prueba 1 = 0,90  ;  Sensibilidad Prueba 2 = 0,80",
    "Especificidad Prueba 1 = 0,70  ;  Especificidad Prueba 2 = 0,75",
    glue::glue("Verdaderos positivos finales = {round(vp_s)}  ;  Falsos positivos finales = {round(fp_s)}"),
    glue::glue("Verdaderos negativos finales = {round(vn_s)}  ;  Falsos negativos finales = {round(fn_s)}"),
    "Sensibilidad neta = 0,720  ;  Especificidad neta = 0,925",
    "Sensibilidad neta = 0,720  ;  Especificidad neta = 0,925"
  ),
  Sustitución = c(
    "0,90 × 0,80",
    "1 − [(1 − 0,70) × (1 − 0,75)]  =  1 − (0,30 × 0,25)  =  1 − 0,075",
    glue::glue("{round(vp_s)} / ({round(vp_s)} + {round(fp_s)})  =  {round(vp_s)} / {round(vp_s + fp_s)}"),
    glue::glue("{round(vn_s)} / ({round(vn_s)} + {round(fn_s)})  =  {round(vn_s)} / {round(vn_s + fn_s)}"),
    "0,720 / (1 − 0,925)  =  0,720 / 0,075",
    "(1 − 0,720) / 0,925  =  0,280 / 0,925"
  ),
  Resultado = c(
    scales::percent(sens_serie, accuracy = 0.1, decimal.mark = ","),
    scales::percent(esp_serie, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpp_serie, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpn_serie, accuracy = 0.1, decimal.mark = ","),
    scales::number(lr_pos_serie, accuracy = 0.01, decimal.mark = ","),
    scales::number(lr_neg_serie, accuracy = 0.001, decimal.mark = ",")
  )
) |>
  gt() |>
  tab_header(title = md("**Cálculo paso a paso de las métricas en estrategia en serie**"),
             subtitle = "Fórmula completa, valores conocidos, sustitución y resultado") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = c(1, 2))) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = c(3, 4))) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = c(5, 6))) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = c(Métrica, Resultado))) |>
  cols_align(align = "left", columns = c(Métrica, `Fórmula completa`, `Valores conocidos`, Sustitución)) |>
  cols_align(align = "center", columns = Resultado) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Cálculo paso a paso de las métricas en estrategia en serie
Fórmula completa, valores conocidos, sustitución y resultado
Métrica Fórmula completa Valores conocidos Sustitución Resultado
Sensibilidad neta Sensibilidad de la Prueba 1 × Sensibilidad de la Prueba 2 Sensibilidad Prueba 1 = 0,90 ; Sensibilidad Prueba 2 = 0,80 0,90 × 0,80 72,0%
Especificidad neta 1 − [(1 − Especificidad de la Prueba 1) × (1 − Especificidad de la Prueba 2)] Especificidad Prueba 1 = 0,70 ; Especificidad Prueba 2 = 0,75 1 − [(1 − 0,70) × (1 − 0,75)] = 1 − (0,30 × 0,25) = 1 − 0,075 92,5%
Valor predictivo positivo Verdaderos positivos finales / (Verdaderos positivos finales + Falsos positivos finales) Verdaderos positivos finales = 720 ; Falsos positivos finales = 675 720 / (720 + 675) = 720 / 1395 51,6%
Valor predictivo negativo Verdaderos negativos finales / (Verdaderos negativos finales + Falsos negativos finales) Verdaderos negativos finales = 8325 ; Falsos negativos finales = 280 8325 / (8325 + 280) = 8325 / 8605 96,7%
Razón de verosimilitud positiva Sensibilidad neta / (1 − Especificidad neta) Sensibilidad neta = 0,720 ; Especificidad neta = 0,925 0,720 / (1 − 0,925) = 0,720 / 0,075 9,60
Razón de verosimilitud negativa (1 − Sensibilidad neta) / Especificidad neta Sensibilidad neta = 0,720 ; Especificidad neta = 0,925 (1 − 0,720) / 0,925 = 0,280 / 0,925 0,303

4.3 Interpretación epidemiológica de las métricas en serie

Ya tengo los seis valores calculados en la tabla anterior; ahora voy a leerlos uno por uno e ir entendiendo qué me está diciendo cada métrica sobre el comportamiento de las dos pruebas combinadas en serie.

Observo que la sensibilidad neta cayó al 72,0 %, claramente por debajo del 90 % de la Prueba 1 y del 80 % de la Prueba 2. Esto me hace sentido cuando lo pienso clínicamente, porque ahora le estoy exigiendo al paciente enfermo que dé positivo en las dos pruebas para considerarlo enfermo al final; entonces, si una sola de las dos lo deja escapar, lo pierdo del diagnóstico positivo, mientras que en las pruebas individuales bastaba con que una lo detectara.

Es decir, cada vez que combino en serie estoy acumulando las fallas de detección de las dos pruebas, y por eso la sensibilidad final tiene que bajar, por lo cual, considero que la estrategia en serie no es buena para tamizar ni para escenarios donde no me puedo permitir perder enfermos.

En cambio, la especificidad neta subió al 92,5 %, muy por encima del 70 % de la Prueba 1 y del 75 % de la Prueba 2; esto quiere decir, que para que un sano termine mal etiquetado como positivo, ahora necesito que las dos pruebas se equivoquen al mismo tiempo en él, y eso es mucho más difícil que una sola se equivoque.

Por consiguiente, la serie funciona como un doble filtro, donde la segunda prueba va depurando los falsos positivos que dejó pasar la primera; de ahí que la especificidad mejore tanto, y considero que esta es la ganancia más importante de esta estrategia.

Ahora observo que el valor predictivo positivo subió al 51,6 %, mientras que las pruebas individuales apenas llegaban al 25 % y 26 %. Esto significa que cuando un paciente acude con un resultado positivo obtenido en serie, ahora más de la mitad de las veces realmente tiene la enfermedad, mientras que antes solo uno de cada cuatro la tenía.

Para mí esta es la traducción clínica más relevante de lo que hice, porque el valor predictivo positivo es lo que realmente me importa como médica, frente al paciente, y duplicarlo me da mucha más confianza para iniciar un plan terapéutico basado en ese positivo.

Por otro lado, el valor predictivo negativo bajó ligeramente al 96,7 %, frente al 98,4 % y 97,1 % de las pruebas individuales. Esta caída es pequeña pero tiene su explicación, porque ahora los negativos finales acumulan tanto a los enfermos que perdió la primera prueba como a los que perdió la segunda; de manera que el grupo de pacientes con resultado negativo final contiene un poco más de enfermos no detectados que antes.

Considero que esta es una pérdida aceptable, ya que la estrategia en serie está diseñada precisamente para confirmar, no para descartar, y a cambio gano mucho en el lado positivo.

La razón de verosimilitud positiva subió a 9,60, mientras que en las pruebas individuales apenas superaba 3. Esto me dice que un resultado positivo en serie es casi diez veces más probable en un enfermo que en un sano, lo cual se acerca al umbral de confirmación fuerte de Sackett (mayor a 10).

Considero que esta es la métrica más útil, en el razonamiento clínico bayesiano, porque permite tomar la sospecha previa que tengo del paciente y actualizarla con fuerza tras un resultado positivo; por consiguiente, la serie sí cumple su promesa confirmatoria.

Por el contrario, la razón de verosimilitud negativa quedó en 0,303, que cae en el rango de “disminución pequeña” según Sackett; es decir, un negativo en serie no descarta con tanta fuerza como se quisiera, porque ahora ese resultado negativo puede provenir simplemente de que una sola de las dos pruebas falló en el enfermo, no necesariamente de que el paciente realmente esté sano.

Esto refuerza la lectura general de la estrategia, que la serie es buena para confirmar pero no para descartar, y eso se debe tener presente al momento de elegir cómo combinar las pruebas.

4.3.1 Síntesis clínica de la estrategia en serie

Habiendo leído las seis métricas, se puede cerrar la idea con una mirada de conjunto; pues lo que se obtuvo con la estrategia en serie es un perfil claramente confirmatorio, ya que mejoró la especificidad, mejoró el valor predictivo positivo y se elevó la razón de verosimilitud positiva al borde del umbral confirmatorio fuerte; a cambio, se perdió sensibilidad y se debilitó un poco la capacidad de descarte. En consecuencia, considero que esta estrategia es la indicada cuando se enfrentan decisiones clínicas donde el costo de un falso positivo es alto, por ejemplo, antes de iniciar un tratamiento invasivo, costoso o estigmatizante.

Vale la pena resaltar un hallazgo importante al desarrollar esta estrategia, y es que el orden en que se aplican las dos pruebas no cambia el resultado matemático final, porque la multiplicación es conmutativa; sin embargo, sí cambia el costo operativo, porque la segunda prueba solo se le aplica a los pacientes que dieron positivo en la primera.

En este sentido, conviene empezar por la prueba más sensible para no perder enfermos en el primer filtro y dejar la más específica para el segundo paso, donde se depuran los falsos positivos que pasaron; de manera que aplicar primero la Prueba 1 y luego la Prueba 2 resulta ser la secuencia más eficiente en términos clínicos y económicos.

Una vez cuantificado lo que se gana y lo que se pierde con la estrategia en serie, paso analizar la estrategia opuesta, es decir, la combinación en paralelo, donde se considera positivo el diagnóstico final si basta con que una de las dos pruebas detecte la enfermedad.

5 Estrategia de combinación en paralelo

Una vez analizada la estrategia en serie, llega el momento de explorar su lógica opuesta, pues la estrategia en paralelo responde a una necesidad clínica muy distinta de la confirmatoria; busca no dejar escapar enfermos, aun a costa de aceptar más estudios innecesarios en sanos.

Considero que tiene sentido aplicarla cuando un falso negativo tiene consecuencias graves para el paciente, por ejemplo, en sospechas de embolia pulmonar, sepsis, meningitis, infarto agudo del miocardio o tamizaje de cánceres en estadios tempranos.

La lógica operativa de la estrategia en paralelo es la siguiente:

  • se aplican las dos pruebas simultáneamente al paciente y se considera positivo el diagnóstico final si al menos una de las dos resulta positiva. Dicho en otras palabras, la regla de decisión es positivo final equivale a Prueba 1 positiva o Prueba 2 positiva.

Desde la perspectiva matemática, esta lógica corresponde a una unión de eventos, lo cual obliga a calcular las métricas combinadas mediante la regla del complemento.

Dado que un enfermo solo se pierde si las dos pruebas le salen negativas a la vez, lo más sencillo es calcular primero la probabilidad de pérdida conjunta y restarla de uno; por lo tanto, la sensibilidad mejora notablemente con esta estrategia.

En el caso opuesto, un sano queda bien clasificado solo si las dos pruebas le salen negativas simultáneamente, evento más exigente que en cada prueba individual; de ahí que la especificidad caiga al combinar en paralelo.

Vale la pena aclarar que se mantiene el supuesto de independencia condicional entre las dos pruebas, tanto en el grupo de enfermos como en el de sanos; lo cual significa que el resultado de una no influye en el de la otra más allá del estado real del paciente.

Si las dos pruebas miden mecanismos biológicos muy parecidos, este supuesto se debilita y los resultados que se obtienen sobreestiman el rendimiento real de la combinación.

5.1 Construcción de la tabla 2×2 combinada

sens_paralelo <- 1 - ((1 - sens_t1) * (1 - sens_t2))
esp_paralelo  <- esp_t1 * esp_t2

tabla_paralelo <- construir_2x2(sens_paralelo, esp_paralelo, enfermos, sanos)

mostrar_tabla_2x2(tabla_paralelo, "Tabla 2×2 — Estrategia en paralelo")
Tabla 2×2 — Estrategia en paralelo
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 980 4.275 5.255
Prueba negativa 20 4.725 4.745
Total 1.000 9.000 10.000

5.2 Cálculo de las métricas combinadas

A partir de la tabla 2×2 que se acaba de generar, calculo las seis métricas que describen el comportamiento conjunto de las dos pruebas combinadas en paralelo.

vp_p <- tabla_paralelo$Enfermo[1]
fn_p <- tabla_paralelo$Enfermo[2]
fp_p <- tabla_paralelo$Sano[1]
vn_p <- tabla_paralelo$Sano[2]

vpp_paralelo  <- vp_p / (vp_p + fp_p)
vpn_paralelo  <- vn_p / (vn_p + fn_p)
lr_pos_paralelo <- sens_paralelo / (1 - esp_paralelo)
lr_neg_paralelo <- (1 - sens_paralelo) / esp_paralelo

tibble(
  Métrica = c("Sensibilidad neta",
              "Especificidad neta",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  `Fórmula completa` = c(
    "1 − [(1 − Sensibilidad de la Prueba 1) × (1 − Sensibilidad de la Prueba 2)]",
    "Especificidad de la Prueba 1 × Especificidad de la Prueba 2",
    "Verdaderos positivos finales / (Verdaderos positivos finales + Falsos positivos finales)",
    "Verdaderos negativos finales / (Verdaderos negativos finales + Falsos negativos finales)",
    "Sensibilidad neta / (1 − Especificidad neta)",
    "(1 − Sensibilidad neta) / Especificidad neta"
  ),
  `Valores conocidos` = c(
    "Sensibilidad Prueba 1 = 0,90  ;  Sensibilidad Prueba 2 = 0,80",
    "Especificidad Prueba 1 = 0,70  ;  Especificidad Prueba 2 = 0,75",
    glue::glue("Verdaderos positivos finales = {round(vp_p)}  ;  Falsos positivos finales = {round(fp_p)}"),
    glue::glue("Verdaderos negativos finales = {round(vn_p)}  ;  Falsos negativos finales = {round(fn_p)}"),
    "Sensibilidad neta = 0,980  ;  Especificidad neta = 0,525",
    "Sensibilidad neta = 0,980  ;  Especificidad neta = 0,525"
  ),
  Sustitución = c(
    "1 − [(1 − 0,90) × (1 − 0,80)]  =  1 − (0,10 × 0,20)  =  1 − 0,02",
    "0,70 × 0,75",
    glue::glue("{round(vp_p)} / ({round(vp_p)} + {round(fp_p)})  =  {round(vp_p)} / {round(vp_p + fp_p)}"),
    glue::glue("{round(vn_p)} / ({round(vn_p)} + {round(fn_p)})  =  {round(vn_p)} / {round(vn_p + fn_p)}"),
    "0,980 / (1 − 0,525)  =  0,980 / 0,475",
    "(1 − 0,980) / 0,525  =  0,020 / 0,525"
  ),
  Resultado = c(
    scales::percent(sens_paralelo, accuracy = 0.1, decimal.mark = ","),
    scales::percent(esp_paralelo, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpp_paralelo, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpn_paralelo, accuracy = 0.1, decimal.mark = ","),
    scales::number(lr_pos_paralelo, accuracy = 0.01, decimal.mark = ","),
    scales::number(lr_neg_paralelo, accuracy = 0.001, decimal.mark = ",")
  )
) |>
  gt() |>
  tab_header(title = md("**Cálculo paso a paso de las métricas en estrategia en paralelo**"),
             subtitle = "Fórmula completa, valores conocidos, sustitución y resultado") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = c(1, 2))) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = c(3, 4))) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = c(5, 6))) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = c(Métrica, Resultado))) |>
  cols_align(align = "left", columns = c(Métrica, `Fórmula completa`, `Valores conocidos`, Sustitución)) |>
  cols_align(align = "center", columns = Resultado) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Cálculo paso a paso de las métricas en estrategia en paralelo
Fórmula completa, valores conocidos, sustitución y resultado
Métrica Fórmula completa Valores conocidos Sustitución Resultado
Sensibilidad neta 1 − [(1 − Sensibilidad de la Prueba 1) × (1 − Sensibilidad de la Prueba 2)] Sensibilidad Prueba 1 = 0,90 ; Sensibilidad Prueba 2 = 0,80 1 − [(1 − 0,90) × (1 − 0,80)] = 1 − (0,10 × 0,20) = 1 − 0,02 98,0%
Especificidad neta Especificidad de la Prueba 1 × Especificidad de la Prueba 2 Especificidad Prueba 1 = 0,70 ; Especificidad Prueba 2 = 0,75 0,70 × 0,75 52,5%
Valor predictivo positivo Verdaderos positivos finales / (Verdaderos positivos finales + Falsos positivos finales) Verdaderos positivos finales = 980 ; Falsos positivos finales = 4275 980 / (980 + 4275) = 980 / 5255 18,6%
Valor predictivo negativo Verdaderos negativos finales / (Verdaderos negativos finales + Falsos negativos finales) Verdaderos negativos finales = 4725 ; Falsos negativos finales = 20 4725 / (4725 + 20) = 4725 / 4745 99,6%
Razón de verosimilitud positiva Sensibilidad neta / (1 − Especificidad neta) Sensibilidad neta = 0,980 ; Especificidad neta = 0,525 0,980 / (1 − 0,525) = 0,980 / 0,475 2,06
Razón de verosimilitud negativa (1 − Sensibilidad neta) / Especificidad neta Sensibilidad neta = 0,980 ; Especificidad neta = 0,525 (1 − 0,980) / 0,525 = 0,020 / 0,525 0,038

5.3 Interpretación epidemiológica de las métricas en paralelo

Una vez consolidados los cálculos en la tabla anterior, procedo a leer las seis métricas:

Se observa que la sensibilidad neta subió al 98,0 %, claramente por encima del 90 % de la Prueba 1 y del 80 % de la Prueba 2. Esto tiene sentido clínicamente, porque ahora basta con que una sola prueba detecte al paciente para clasificarlo como positivo final; en consecuencia, si una prueba lo deja escapar, la otra todavía puede rescatarlo.

Considero que esta ganancia confirma que la estrategia en paralelo es ideal cuando no se puede permitir perder enfermos, especialmente ante enfermedades graves o de progresión rápida; en cambio, la especificidad neta cayó al 52,5 %, muy por debajo del 70 % de la Prueba 1 y del 75 % de la Prueba 2, por lo cual, la razón es directa, ya que ahora basta con que una sola prueba se equivoque para que un sano salga positivo final; por consiguiente, los falsos positivos se acumulan y la especificidad se deteriora, lo cual constituye la principal limitación de esta estrategia.

El valor predictivo positivo bajó al 18,7 %, frente al 25 % y 26 % de las pruebas individuales, considero que esta caída traduce clínicamente lo que ocurrió con la especificidad, ya que el aumento absoluto de falsos positivos diluyó la proporción de enfermos verdaderos dentro del grupo de positivos finales; en consecuencia, un positivo en paralelo no orienta al diagnóstico, sino que funciona como una alerta que obliga a estudios adicionales.

En contraste, el valor predictivo negativo subió al 99,6 %, frente al 98,4 % y 97,1 % de las pruebas individuales; considero que esta mejora tiene una explicación clara, porque los negativos finales solo incluyen pacientes en quienes las dos pruebas coincidieron en negativo, condición muy estricta que deja casi ningún enfermo sin detectar, por lo queesta es la ganancia clínica más valiosa de la estrategia en paralelo, ya que un negativo aquí prácticamente descarta la enfermedad.

La razón de verosimilitud positiva bajó a 2,06, lo cual cae en el rango de “aumento pequeño” según Sackett (entre 2 y 5). Esto confirma matemáticamente que un positivo en paralelo no confirma la enfermedad; en consecuencia, este resultado refuerza la necesidad de seguir investigando ante un positivo obtenido bajo esta estrategia.

Por el contrario, la razón de verosimilitud negativa cayó a 0,038, muy por debajo del umbral de descarte fuerte de Sackett (menor a 0,1), lo cual significa que un negativo en paralelo es aproximadamente veinticinco veces menos probable en un enfermo que en un sano, lo cual constituye evidencia descartativa muy potente; de ahí que esta estrategia se considere óptima cuando el objetivo prioritario es excluir enfermedad.

5.3.1 Síntesis clínica de la estrategia en paralelo

Con las seis métricas integradas, se obtiene un perfil claramente descartativo, ya que mejoró la sensibilidad, mejoró el valor predictivo negativo y se llevó la razón de verosimilitud negativa muy por debajo del umbral de descarte fuerte; a cambio, se perdió especificidad de manera importante y el valor predictivo positivo cayó por debajo del de las pruebas individuales.

En consecuencia, esta estrategia es la indicada cuando el costo clínico de un falso negativo es alto, por ejemplo, ante sospechas de embolia pulmonar, sepsis, meningitis o cáncer en estadios tempranos.

Me parece importante resaltar un contraste con la estrategia en serie, y es que en paralelo las dos pruebas se aplican simultáneamente a todos los pacientes, lo cual duplica el costo operativo; sin embargo, este gasto adicional se justifica cuando el objetivo es no perder enfermos.

En este sentido, serie y paralelo no son estrategias intercambiables, sino complementarias, y se eligen según el tipo de error que sea menos tolerable en cada escenario clínico.

Una vez cuantificado lo que se gana y lo que se pierde con cada estrategia por separado, paso a realizar una comparación integrada, donde se ponen las cuatro situaciones diagnósticas frente a frente para ver con claridad el intercambio entre las métricas.

5.4 Tabla comparativa de las cuatro estrategias

metricas_p1 <- calcular_metricas(tabla_p1, "Prueba 1 sola")
metricas_p2 <- calcular_metricas(tabla_p2, "Prueba 2 sola")
metricas_s  <- calcular_metricas(tabla_serie, "En serie")
metricas_pa <- calcular_metricas(tabla_paralelo, "En paralelo")

comparacion <- bind_rows(metricas_p1, metricas_p2, metricas_s, metricas_pa)

comparacion |>
  mutate(across(Sensibilidad:`Valor predictivo negativo`,
                ~ scales::percent(.x, accuracy = 0.1, decimal.mark = ",")),
         across(starts_with("Razón"),
                ~ scales::number(.x, accuracy = 0.01, decimal.mark = ","))) |>
  gt() |>
  tab_header(title = md("**Comparación de las cuatro situaciones diagnósticas**"),
             subtitle = "Pruebas individuales y estrategias combinadas") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$rosa),
            locations = cells_body(rows = Prueba == "Prueba 1 sola")) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = Prueba == "Prueba 2 sola")) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = Prueba == "En serie")) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = Prueba == "En paralelo")) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = Prueba)) |>
  cols_align(align = "center", columns = -Prueba) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Comparación de las cuatro situaciones diagnósticas
Pruebas individuales y estrategias combinadas
Prueba Sensibilidad Especificidad Valor predictivo positivo Valor predictivo negativo Razón de verosimilitud positiva Razón de verosimilitud negativa
Prueba 1 sola 90,0% 70,0% 25,0% 98,4% 3,00 0,14
Prueba 2 sola 80,0% 75,0% 26,2% 97,1% 3,20 0,27
En serie 72,0% 92,5% 51,6% 96,7% 9,60 0,30
En paralelo 98,0% 52,5% 18,6% 99,6% 2,06 0,04

La tabla muestra de forma compacta cómo se mueven las seis métricas al pasar de las pruebas individuales a las estrategias combinadas. Considero que el patrón más evidente es el intercambio simétrico entre sensibilidad y especificidad, ya que la serie favorece la especificidad (92,5 %) mientras que el paralelo favorece la sensibilidad (98,0 %), siempre a costa de la métrica opuesta.

En los valores predictivos se observa el mismo intercambio, aunque amplificado por la prevalencia del escenario; la serie duplica el valor predictivo positivo (51,6 %) respecto a las pruebas individuales, mientras que el paralelo lleva el valor predictivo negativo al máximo (99,6 %).

Las razones de verosimilitud confirman el contraste, donde la LR positiva de la serie (9,60) se acerca al umbral confirmatorio fuerte, y la LR negativa del paralelo (0,04) descarta la enfermedad con mucha potencia.

5.5 Visualización del intercambio entre métricas

Para complementar la tabla, utilizaré un gráfico de barras facetadas que organiza las seis métricas en paneles independientes, donde cada panel muestra el comportamiento de las cuatro situaciones diagnósticas con la misma escala interna.

Considero que esta visualización es ideal porque me permite comparar de un vistazo cómo cambia cada métrica entre estrategias y, al mismo tiempo, observar las relaciones cruzadas entre métricas; por ejemplo, cómo el panel de sensibilidad y el de especificidad muestran patrones inversos entre serie y paralelo.

datos_grafico <- comparacion |>
  pivot_longer(-Prueba, names_to = "Métrica", values_to = "Valor") |>
  mutate(Prueba = factor(Prueba, 
                         levels = c("Prueba 1 sola", "Prueba 2 sola",
                                    "En serie", "En paralelo")),
         Métrica = factor(Métrica,
                          levels = c("Sensibilidad", "Especificidad",
                                     "Valor predictivo positivo",
                                     "Valor predictivo negativo",
                                     "Razón de verosimilitud positiva",
                                     "Razón de verosimilitud negativa")),
         Tipo = ifelse(grepl("Razón", Métrica), "Razón", "Proporción"))

ggplot(datos_grafico, aes(x = Prueba, y = Valor, fill = Prueba)) +
  geom_col(width = 0.7, color = "white") +
  geom_text(aes(label = ifelse(Tipo == "Proporción",
                               scales::percent(Valor, accuracy = 0.1, decimal.mark = ","),
                               scales::number(Valor, accuracy = 0.01, decimal.mark = ","))),
            vjust = -0.5, size = 3.2, color = paleta$texto) +
  facet_wrap(~ Métrica, nrow = 2, scales = "free_y") +
  scale_fill_manual(values = c("Prueba 1 sola" = paleta$rosa,
                               "Prueba 2 sola" = paleta$verde,
                               "En serie"      = paleta$durazno,
                               "En paralelo"   = paleta$azul)) +
  labs(title = "Comparación de las seis métricas en las cuatro situaciones",
       subtitle = "Cada estrategia privilegia métricas distintas",
       x = NULL, y = NULL) +
  tema_doc +
  theme(axis.text.x = element_text(angle = 25, hjust = 1),
        legend.position = "none",
        strip.background = element_rect(fill = paleta$gris, color = NA),
        strip.text = element_text(face = "bold", color = paleta$texto))

## Lectura integrada de la comparación

El gráfico evidencia con claridad el principio diagnóstico central, donde ninguna estrategia es óptima en todas las dimensiones, y la elección depende del objetivo clínico que se priorice.

La estrategia en serie domina los paneles de especificidad, valor predictivo positivo y razón de verosimilitud positiva, lo cual confirma su perfil confirmatorio; en cambio, la estrategia en paralelo domina los paneles de sensibilidad, valor predictivo negativo y razón de verosimilitud negativa, lo cual confirma su perfil descartativo.

Las pruebas individuales ocupan posiciones intermedias en todos los paneles y no destacan en ningún extremo. Considero que los valores más reveladores son las dos razones de verosimilitud extremas, ya que no dependen de la prevalencia y traducen directamente la utilidad clínica de cada estrategia; una LR positiva de 9,60 en serie permite confirmar con mucha fuerza tras un resultado positivo, y una LR negativa de 0,04 en paralelo permite descartar con seguridad tras un resultado negativo.

6 PARTE 2. Aplicación al escenario real: tamizaje de cáncer de cérvix

6.1 Contexto clínico y justificación del escenario

El cáncer de cuello uterino constituye una de las principales causas de mortalidad por cáncer en mujeres a nivel mundial; sin embargo, es una enfermedad altamente prevenible cuando se detecta en etapas tempranas mediante tamizaje.

En Colombia, la Resolución 3280 de 2018 estableció las rutas integrales de atención para la promoción y mantenimiento de la salud, donde se actualizaron las estrategias de tamizaje del cáncer de cérvix.

Para esta sección, considero pertinente aplicar la lógica de combinación de pruebas a tres alternativas diagnósticas:

  • citología convencional, citología en base líquida y prueba de ADN del virus del papiloma humano.

Dado que las tres pruebas comparten una especificidad muy alta (cercana al 98 %) pero difieren en sensibilidad, el escenario resulta clínicamente interesante para observar cómo se comporta la combinación cuando las pruebas tienen perfiles más homogéneos que los del ejercicio teórico.

6.2 Parámetros de las tres pruebas y prevalencia del escenario

Los valores de sensibilidad y especificidad provienen de Pankaj et al. (2018); por consiguiente, son parámetros publicados y validados en literatura científica.

Para la prevalencia, se utiliza una estimación del 2 %, valor coherente con la prevalencia esperada de lesiones precursoras de alto grado y cáncer en mujeres tamizadas en programas poblacionales.

poblacion_c   <- 10000
prevalencia_c <- 0.02

sens_cito  <- 0.758
esp_cito   <- 0.981

sens_cbl   <- 0.765
esp_cbl    <- 0.989

sens_vph   <- 0.899
esp_vph    <- 0.980

enfermos_c <- poblacion_c * prevalencia_c
sanos_c    <- poblacion_c - enfermos_c

tibble(
  Parámetro = c("Población simulada",
                "Prevalencia esperada",
                "Sensibilidad citología convencional",
                "Especificidad citología convencional",
                "Sensibilidad citología en base líquida",
                "Especificidad citología en base líquida",
                "Sensibilidad ADN del virus del papiloma humano",
                "Especificidad ADN del virus del papiloma humano",
                "Total de enfermas esperadas",
                "Total de sanas esperadas"),
  Valor = c(scales::comma(poblacion_c, big.mark = "."),
            scales::percent(prevalencia_c, accuracy = 0.1, decimal.mark = ","),
            scales::percent(sens_cito, accuracy = 0.1, decimal.mark = ","),
            scales::percent(esp_cito,  accuracy = 0.1, decimal.mark = ","),
            scales::percent(sens_cbl,  accuracy = 0.1, decimal.mark = ","),
            scales::percent(esp_cbl,   accuracy = 0.1, decimal.mark = ","),
            scales::percent(sens_vph,  accuracy = 0.1, decimal.mark = ","),
            scales::percent(esp_vph,   accuracy = 0.1, decimal.mark = ","),
            scales::comma(enfermos_c, big.mark = "."),
            scales::comma(sanos_c,    big.mark = "."))
) |>
  gt() |>
  tab_header(title = md("**Parámetros del escenario de cáncer de cérvix**"),
             subtitle = "Población simulada de 10.000 mujeres con prevalencia del 2%") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$gris),
            locations = cells_body(rows = seq(1, 10, 2))) |>
  cols_align(align = "center", columns = Valor) |>
  tab_options(table.font.size = 12)
Parámetros del escenario de cáncer de cérvix
Población simulada de 10.000 mujeres con prevalencia del 2%
Parámetro Valor
Población simulada 10.000
Prevalencia esperada 2,0%
Sensibilidad citología convencional 75,8%
Especificidad citología convencional 98,1%
Sensibilidad citología en base líquida 76,5%
Especificidad citología en base líquida 98,9%
Sensibilidad ADN del virus del papiloma humano 89,9%
Especificidad ADN del virus del papiloma humano 98,0%
Total de enfermas esperadas 200
Total de sanas esperadas 9.800

Como se observa, las tres pruebas tienen especificidades muy similares y cercanas al 98 %, mientras que la sensibilidad varía sustancialmente; en este sentido, la citología convencional y la citología en base líquida se mueven alrededor del 76 %, mientras que la prueba de ADN del virus del papiloma humano alcanza el 89,9 %. Por consiguiente, el ADN del virus del papiloma humano es la prueba individual más sensible, lo cual coincide con su rol actual como prueba primaria de tamizaje en la Resolución 3280 de 2018 para mujeres entre 30 y 65 años en Colombia.

6.3 Selección de las dos pruebas para la combinación

Para aplicar las estrategias de combinación, se eligen las dos pruebas con perfiles más complementarios, es decir,la citología convencional (75,8 % de sensibilidad y 98,1 % de especificidad) y el ADN del virus del papiloma humano (89,9 % de sensibilidad y 98,0 % de especificidad). Considero que esta elección es la más informativa porque combina una técnica morfológica clásica con una técnica molecular moderna, lo cual maximiza la independencia condicional entre las pruebas y refleja una estrategia real de cotesting que la literatura recomienda para tamizaje.

A continuación, se construyen las tablas 2×2 individuales de cada una de las dos pruebas seleccionadas.

tabla_cito <- construir_2x2(sens_cito, esp_cito, enfermos_c, sanos_c)
tabla_vph  <- construir_2x2(sens_vph, esp_vph, enfermos_c, sanos_c)

6.3.1 Tabla 2×2 — Citología convencional

mostrar_tabla_2x2(tabla_cito, "Citología convencional aplicada a 10.000 mujeres")
Citología convencional aplicada a 10.000 mujeres
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 152 186 338
Prueba negativa 48 9.614 9.662
Total 200 9.800 10.000

6.3.2 Tabla 2×2 — ADN del virus del papiloma humano

mostrar_tabla_2x2(tabla_vph, "ADN del virus del papiloma humano aplicado a 10.000 mujeres")
ADN del virus del papiloma humano aplicado a 10.000 mujeres
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 180 196 376
Prueba negativa 20 9.604 9.624
Total 200 9.800 10.000

Se observa que el número absoluto de enfermas detectadas difiere notablemente entre las dos pruebas; la citología convencional detecta cerca de 152 mujeres con lesión, mientras que el ADN del virus del papiloma humano detecta cerca de 180. Por consiguiente, la prueba molecular pierde menos enfermas que la citología, lo cual constituye su ventaja principal como herramienta de tamizaje.

Por el lado de los sanos, ambas pruebas se comportan de manera muy parecida y generan un número bajo de falsos positivos absolutos, gracias a sus especificidades altas y a la baja prevalencia del escenario.

6.4 Estrategia en serie aplicada al escenario de cérvix

Bajo la estrategia en serie, se considera positivo el diagnóstico final cuando ambas pruebas coinciden en positivo; en consecuencia, el resultado se reserva para mujeres en quienes la lesión es detectada simultáneamente por la citología y por el ADN del virus del papiloma humano.

Considero que esta estrategia tiene sentido clínico cuando se busca confirmar el hallazgo antes de avanzar a colposcopia, biopsia o conización.

sens_serie_c <- sens_cito * sens_vph
esp_serie_c  <- 1 - ((1 - esp_cito) * (1 - esp_vph))

tabla_serie_c <- construir_2x2(sens_serie_c, esp_serie_c, enfermos_c, sanos_c)

mostrar_tabla_2x2(tabla_serie_c, "Tabla 2×2 — Estrategia en serie (cérvix)")
Tabla 2×2 — Estrategia en serie (cérvix)
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 136 4 140
Prueba negativa 64 9.796 9.860
Total 200 9.800 10.000
vp_sc <- tabla_serie_c$Enfermo[1]
fn_sc <- tabla_serie_c$Enfermo[2]
fp_sc <- tabla_serie_c$Sano[1]
vn_sc <- tabla_serie_c$Sano[2]

vpp_serie_c  <- vp_sc / (vp_sc + fp_sc)
vpn_serie_c  <- vn_sc / (vn_sc + fn_sc)
lr_pos_serie_c <- sens_serie_c / (1 - esp_serie_c)
lr_neg_serie_c <- (1 - sens_serie_c) / esp_serie_c

tibble(
  Métrica = c("Sensibilidad neta",
              "Especificidad neta",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  `Fórmula completa` = c(
    "Sensibilidad citología × Sensibilidad ADN-VPH",
    "1 − [(1 − Especificidad citología) × (1 − Especificidad ADN-VPH)]",
    "Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales)",
    "Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales)",
    "Sensibilidad neta / (1 − Especificidad neta)",
    "(1 − Sensibilidad neta) / Especificidad neta"
  ),
  `Valores conocidos` = c(
    "Sens citología = 0,758  ;  Sens ADN-VPH = 0,899",
    "Esp citología = 0,981  ;  Esp ADN-VPH = 0,980",
    glue::glue("VP finales = {round(vp_sc)}  ;  FP finales = {round(fp_sc)}"),
    glue::glue("VN finales = {round(vn_sc)}  ;  FN finales = {round(fn_sc)}"),
    glue::glue("Sens neta = {round(sens_serie_c, 3)}  ;  Esp neta = {round(esp_serie_c, 4)}"),
    glue::glue("Sens neta = {round(sens_serie_c, 3)}  ;  Esp neta = {round(esp_serie_c, 4)}")
  ),
  Sustitución = c(
    "0,758 × 0,899",
    "1 − [(1 − 0,981) × (1 − 0,980)]  =  1 − (0,019 × 0,020)",
    glue::glue("{round(vp_sc)} / {round(vp_sc + fp_sc)}"),
    glue::glue("{round(vn_sc)} / {round(vn_sc + fn_sc)}"),
    glue::glue("{round(sens_serie_c, 3)} / (1 − {round(esp_serie_c, 4)})"),
    glue::glue("(1 − {round(sens_serie_c, 3)}) / {round(esp_serie_c, 4)}")
  ),
  Resultado = c(
    scales::percent(sens_serie_c, accuracy = 0.1, decimal.mark = ","),
    scales::percent(esp_serie_c, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpp_serie_c, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpn_serie_c, accuracy = 0.1, decimal.mark = ","),
    scales::number(lr_pos_serie_c, accuracy = 0.01, decimal.mark = ","),
    scales::number(lr_neg_serie_c, accuracy = 0.001, decimal.mark = ",")
  )
) |>
  gt() |>
  tab_header(title = md("**Cálculo paso a paso — Estrategia en serie (cérvix)**"),
             subtitle = "Citología convencional + ADN del virus del papiloma humano") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = c(1, 2))) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = c(3, 4))) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = c(5, 6))) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = c(Métrica, Resultado))) |>
  cols_align(align = "left", columns = c(Métrica, `Fórmula completa`, `Valores conocidos`, Sustitución)) |>
  cols_align(align = "center", columns = Resultado) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Cálculo paso a paso — Estrategia en serie (cérvix)
Citología convencional + ADN del virus del papiloma humano
Métrica Fórmula completa Valores conocidos Sustitución Resultado
Sensibilidad neta Sensibilidad citología × Sensibilidad ADN-VPH Sens citología = 0,758 ; Sens ADN-VPH = 0,899 0,758 × 0,899 68,1%
Especificidad neta 1 − [(1 − Especificidad citología) × (1 − Especificidad ADN-VPH)] Esp citología = 0,981 ; Esp ADN-VPH = 0,980 1 − [(1 − 0,981) × (1 − 0,980)] = 1 − (0,019 × 0,020) 100,0%
Valor predictivo positivo Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales) VP finales = 136 ; FP finales = 4 136 / 140 97,3%
Valor predictivo negativo Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales) VN finales = 9796 ; FN finales = 64 9796 / 9860 99,4%
Razón de verosimilitud positiva Sensibilidad neta / (1 − Especificidad neta) Sens neta = 0,681 ; Esp neta = 0,9996 0,681 / (1 − 0,9996) 1 793,27
Razón de verosimilitud negativa (1 − Sensibilidad neta) / Especificidad neta Sens neta = 0,681 ; Esp neta = 0,9996 (1 − 0,681) / 0,9996 0,319

6.4.1 Interpretación de las métricas en serie para cérvix

Se observa que la sensibilidad neta cayó al 68,1 %, claramente por debajo del 75,8 % de la citología y del 89,9 % del ADN del virus del papiloma humano; la razón es directa, dado que exigir la coincidencia de las dos pruebas multiplica sus sensibilidades y, en consecuencia, acumula los errores de detección. Considero que esta pérdida tiene implicaciones clínicas serias en un contexto de tamizaje, ya que se estarían dejando sin diagnóstico cerca de un tercio de las mujeres con lesión.

La especificidad neta subió al 99,96 %, prácticamente perfecta, dado que para que una mujer sana sea mal clasificada se requeriría que ambas pruebas se equivocaran simultáneamente, evento extremadamente improbable cuando las especificidades individuales ya son altísimas. En consecuencia, los falsos positivos prácticamente desaparecen y el sistema de salud se ahorra colposcopias innecesarias.

El valor predictivo positivo se eleva por encima del 97 %, lo cual significa que casi todas las mujeres con resultado positivo final tienen realmente la lesión; por consiguiente, un positivo en serie justifica plenamente avanzar al estudio histopatológico.

El valor predictivo negativo se mantiene cercano al 99 %, ya que la baja prevalencia favorece que el grupo de negativas contenga muy pocas enfermas pese a la pérdida de sensibilidad.

La razón de verosimilitud positiva alcanza 1.793,27, valor extraordinariamente alto que confirma el perfil ultraconfirmatorio de la estrategia; en cambio, la razón de verosimilitud negativa queda alrededor de 0,32, cerca del rango de “disminución pequeña” según Sackett, lo cual indica que un negativo en serie no descarta con tanta fuerza. Por consiguiente, la serie es excelente para confirmar, pero no debería usarse como estrategia única de tamizaje, dado que la pérdida de sensibilidad es demasiado costosa cuando el objetivo poblacional es no perder lesiones.

6.5 Estrategia en paralelo aplicada al escenario de cérvix

Bajo la estrategia en paralelo, se considera positivo el diagnóstico final si al menos una de las dos pruebas detecta la lesión; en este sentido, esta estrategia corresponde al cotesting que la literatura internacional recomienda como alternativa al tamizaje con una sola prueba, ya que maximiza la sensibilidad combinada y reduce al máximo la pérdida de casos.

sens_paralelo_c <- 1 - ((1 - sens_cito) * (1 - sens_vph))
esp_paralelo_c  <- esp_cito * esp_vph

tabla_paralelo_c <- construir_2x2(sens_paralelo_c, esp_paralelo_c, enfermos_c, sanos_c)

mostrar_tabla_2x2(tabla_paralelo_c, "Tabla 2×2 — Estrategia en paralelo (cérvix)")
Tabla 2×2 — Estrategia en paralelo (cérvix)
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 195 378 574
Prueba negativa 5 9.422 9.426
Total 200 9.800 10.000
vp_pc <- tabla_paralelo_c$Enfermo[1]
fn_pc <- tabla_paralelo_c$Enfermo[2]
fp_pc <- tabla_paralelo_c$Sano[1]
vn_pc <- tabla_paralelo_c$Sano[2]

vpp_paralelo_c  <- vp_pc / (vp_pc + fp_pc)
vpn_paralelo_c  <- vn_pc / (vn_pc + fn_pc)
lr_pos_paralelo_c <- sens_paralelo_c / (1 - esp_paralelo_c)
lr_neg_paralelo_c <- (1 - sens_paralelo_c) / esp_paralelo_c

tibble(
  Métrica = c("Sensibilidad neta",
              "Especificidad neta",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  `Fórmula completa` = c(
    "1 − [(1 − Sensibilidad citología) × (1 − Sensibilidad ADN-VPH)]",
    "Especificidad citología × Especificidad ADN-VPH",
    "Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales)",
    "Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales)",
    "Sensibilidad neta / (1 − Especificidad neta)",
    "(1 − Sensibilidad neta) / Especificidad neta"
  ),
  `Valores conocidos` = c(
    "Sens citología = 0,758  ;  Sens ADN-VPH = 0,899",
    "Esp citología = 0,981  ;  Esp ADN-VPH = 0,980",
    glue::glue("VP finales = {round(vp_pc)}  ;  FP finales = {round(fp_pc)}"),
    glue::glue("VN finales = {round(vn_pc)}  ;  FN finales = {round(fn_pc)}"),
    glue::glue("Sens neta = {round(sens_paralelo_c, 3)}  ;  Esp neta = {round(esp_paralelo_c, 3)}"),
    glue::glue("Sens neta = {round(sens_paralelo_c, 3)}  ;  Esp neta = {round(esp_paralelo_c, 3)}")
  ),
  Sustitución = c(
    "1 − [(1 − 0,758) × (1 − 0,899)]  =  1 − (0,242 × 0,101)",
    "0,981 × 0,980",
    glue::glue("{round(vp_pc)} / {round(vp_pc + fp_pc)}"),
    glue::glue("{round(vn_pc)} / {round(vn_pc + fn_pc)}"),
    glue::glue("{round(sens_paralelo_c, 3)} / (1 − {round(esp_paralelo_c, 3)})"),
    glue::glue("(1 − {round(sens_paralelo_c, 3)}) / {round(esp_paralelo_c, 3)}")
  ),
  Resultado = c(
    scales::percent(sens_paralelo_c, accuracy = 0.1, decimal.mark = ","),
    scales::percent(esp_paralelo_c, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpp_paralelo_c, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpn_paralelo_c, accuracy = 0.1, decimal.mark = ","),
    scales::number(lr_pos_paralelo_c, accuracy = 0.01, decimal.mark = ","),
    scales::number(lr_neg_paralelo_c, accuracy = 0.001, decimal.mark = ",")
  )
) |>
  gt() |>
  tab_header(title = md("**Cálculo paso a paso — Estrategia en paralelo (cérvix)**"),
             subtitle = "Citología convencional + ADN del virus del papiloma humano") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = c(1, 2))) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = c(3, 4))) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = c(5, 6))) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = c(Métrica, Resultado))) |>
  cols_align(align = "left", columns = c(Métrica, `Fórmula completa`, `Valores conocidos`, Sustitución)) |>
  cols_align(align = "center", columns = Resultado) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Cálculo paso a paso — Estrategia en paralelo (cérvix)
Citología convencional + ADN del virus del papiloma humano
Métrica Fórmula completa Valores conocidos Sustitución Resultado
Sensibilidad neta 1 − [(1 − Sensibilidad citología) × (1 − Sensibilidad ADN-VPH)] Sens citología = 0,758 ; Sens ADN-VPH = 0,899 1 − [(1 − 0,758) × (1 − 0,899)] = 1 − (0,242 × 0,101) 97,6%
Especificidad neta Especificidad citología × Especificidad ADN-VPH Esp citología = 0,981 ; Esp ADN-VPH = 0,980 0,981 × 0,980 96,1%
Valor predictivo positivo Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales) VP finales = 195 ; FP finales = 378 195 / 574 34,0%
Valor predictivo negativo Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales) VN finales = 9422 ; FN finales = 5 9422 / 9426 99,9%
Razón de verosimilitud positiva Sensibilidad neta / (1 − Especificidad neta) Sens neta = 0,976 ; Esp neta = 0,961 0,976 / (1 − 0,961) 25,26
Razón de verosimilitud negativa (1 − Sensibilidad neta) / Especificidad neta Sens neta = 0,976 ; Esp neta = 0,961 (1 − 0,976) / 0,961 0,025

6.5.1 Interpretación de las métricas en paralelo para cérvix

Se observa que la sensibilidad neta sube al 97,6 %, muy por encima de cualquiera de las dos pruebas individuales; en consecuencia, casi todas las mujeres con lesión son detectadas, lo cual responde al objetivo prioritario de un programa de tamizaje poblacional.

La especificidad neta cae al 96,1 %; sin embargo, esta caída es modesta porque las especificidades individuales ya eran muy altas, y el producto de dos números cercanos a uno se mantiene cercano a uno. En este sentido, considero que el cotesting de cérvix se comporta de manera excepcional, dado que conserva una alta especificidad mientras gana mucho en sensibilidad, condición que solo se logra cuando las pruebas individuales tienen especificidades cercanas al techo del 100 %.

El valor predictivo positivo alcanza el 34,0 %, muy superior al de cualquier escenario con prevalencia baja; este resultado refleja que la combinación logra concentrar los positivos finales mayoritariamente en mujeres con lesión real.

El valor predictivo negativo alcanza prácticamente el 100 %, lo cual significa que un negativo en paralelo permite descartar la enfermedad con total tranquilidad; este es precisamente el argumento clínico que sostiene el uso del cotesting en programas de tamizaje, dado que un resultado negativo doble permite extender el intervalo entre pruebas con seguridad.

La razón de verosimilitud positiva queda alrededor de 25, claramente por encima del umbral confirmatorio fuerte de Sackett; por consiguiente, un positivo en paralelo aporta evidencia robusta a favor de la lesión. La razón de verosimilitud negativa cae a 0,025, muy por debajo del umbral de descarte fuerte, lo cual confirma el perfil descartativo excepcional de la estrategia.

6.6 Comparación de las cuatro situaciones diagnósticas en cérvix

metricas_cito <- calcular_metricas(tabla_cito, "Citología sola")
metricas_vph  <- calcular_metricas(tabla_vph, "ADN-VPH solo")
metricas_sc   <- calcular_metricas(tabla_serie_c, "En serie")
metricas_pc   <- calcular_metricas(tabla_paralelo_c, "En paralelo")

comparacion_c <- bind_rows(metricas_cito, metricas_vph, metricas_sc, metricas_pc)

comparacion_c |>
  mutate(across(Sensibilidad:`Valor predictivo negativo`,
                ~ scales::percent(.x, accuracy = 0.1, decimal.mark = ",")),
         across(starts_with("Razón"),
                ~ scales::number(.x, accuracy = 0.01, decimal.mark = ","))) |>
  gt() |>
  tab_header(title = md("**Comparación de las cuatro situaciones — Cérvix**"),
             subtitle = "Pruebas individuales y estrategias combinadas") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$rosa),
            locations = cells_body(rows = Prueba == "Citología sola")) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = Prueba == "ADN-VPH solo")) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = Prueba == "En serie")) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = Prueba == "En paralelo")) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = Prueba)) |>
  cols_align(align = "center", columns = -Prueba) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Comparación de las cuatro situaciones — Cérvix
Pruebas individuales y estrategias combinadas
Prueba Sensibilidad Especificidad Valor predictivo positivo Valor predictivo negativo Razón de verosimilitud positiva Razón de verosimilitud negativa
Citología sola 75,8% 98,1% 44,9% 99,5% 39,89 0,25
ADN-VPH solo 89,9% 98,0% 47,8% 99,8% 44,95 0,10
En serie 68,1% 100,0% 97,3% 99,4% 1 793,27 0,32
En paralelo 97,6% 96,1% 34,0% 99,9% 25,26 0,03

La tabla muestra que el comportamiento general replica el patrón teórico observado en la Parte 1; en consecuencia, la estrategia en serie privilegia la especificidad y los valores predictivos positivos, mientras que la paralelo privilegia la sensibilidad y los valores predictivos negativos.

Sin embargo, desde mi perspectiva, este escenario revela un hallazgo clínicamente importante, donde el cotesting en paralelo no sacrifica casi especificidad gracias a que las pruebas individuales tienen especificidades altísimas; por consiguiente, la combinación en paralelo es operativamente viable como estrategia poblacional de tamizaje.

6.6.1 Lectura clínica final del escenario de cérvix

A partir del análisis completo del escenario, considero que para la estrategia en paralelo, es decir, el cotesting con citología y ADN del virus del papiloma humano, es la mejor opción para el tamizaje poblacional, dado que combina sensibilidad muy alta con especificidad clínicamente aceptable.

Considero que la estrategia en serie quedaría reservada como paso confirmatorio previo a colposcopia o biopsia, lo cual es coherente con la organización actual de los algoritmos clínicos en Colombia bajo la Resolución 3280 de 2018.

Una vez aplicada la lógica de combinación a un escenario real con parámetros publicados en la literatura, procedo a la Parte 3, desarrollo del taller con una enfermedad de elección propia, donde se sigue la guía metodológica del taller con planteamiento PI/ECOT, justificación clínica y aplicación a una población simulada de 1.000 personas.

7 PARTE 3. Taller combinación de pruebas para tuberculosis pulmonar

7.1 Planteamiento del problema en formato PI/ECOT

Considero pertinente desarrollar el taller bajo el escenario clínico de tuberculosis pulmonar en pacientes sintomáticos respiratorios en Colombia, dado que esta enfermedad combina alta carga epidemiológica nacional con un algoritmo diagnóstico que tradicionalmente utiliza dos pruebas complementarias: baciloscopia seriada y prueba molecular GeneXpert MTB/RIF. La pregunta PI/ECOT se formula de la siguiente manera.

P (Paciente o problema): adultos sintomáticos respiratorios con tos productiva mayor a 15 días, atendidos en instituciones de salud de primer nivel en Colombia.

I (Intervención): combinación diagnóstica de baciloscopia seriada de esputo y prueba molecular GeneXpert MTB/RIF.

E (Estrategia de combinación): comparar estrategia en serie versus estrategia en paralelo.

C (Comparación): uso individual de baciloscopia o GeneXpert MTB/RIF.

O (Outcome o resultado): rendimiento diagnóstico medido en sensibilidad, especificidad, valores predictivos y razones de verosimilitud.

T (Tiempo): evaluación transversal al momento del diagnóstico.

7.2 Descripción de la población

La población objetivo corresponde a adultos sintomáticos respiratorios atendidos en el primer nivel de atención, donde la captación de casos se realiza siguiendo los lineamientos del Programa Nacional de Control de la Tuberculosis.

Considero relevante esta población porque Colombia tiene una incidencia estimada cercana a 26 casos por 100.000 habitantes según los reportes del Instituto Nacional de Salud, con concentración en grupos vulnerables como personas privadas de la libertad, habitantes de calle, personas viviendo con VIH y población migrante.

Para efectos del ejercicio, se simula una población de 1.000 sintomáticos respiratorios con una prevalencia esperada del 10 %, valor consistente con la tasa de positividad reportada en programas de tamizaje activo en Colombia.

7.3 Justificación clínica del problema

La tuberculosis pulmonar es una enfermedad infecciosa de alta carga epidemiológica donde el retraso diagnóstico tiene consecuencias graves; en consecuencia, un falso negativo implica continuidad de la transmisión comunitaria, progresión clínica del paciente y mayor riesgo de resistencia antimicrobiana.

Por otra parte, un falso positivo lleva al paciente a iniciar tratamiento prolongado con cuatro fármacos durante seis meses, con sus efectos adversos, costos y estigma social asociados.

Dado que ninguna prueba individual ofrece simultáneamente sensibilidad y especificidad óptimas, la combinación diagnóstica resulta indispensable. La baciloscopia es económica y ampliamente disponible, pero tiene sensibilidad baja, especialmente en pacientes paucibacilares o coinfectados con VIH; el GeneXpert MTB/RIF, por su parte, es altamente sensible y específico, pero requiere infraestructura de mayor complejidad y tiene mayor costo.

Por consiguiente, la pregunta clínica del taller es cuál estrategia de combinación optimiza el diagnóstico en este escenario.

7.4 Necesidad diagnóstica: sensibilidad o especificidad

Considero que en el contexto de tamizaje activo de tuberculosis, la prioridad es aumentar la sensibilidad, dado que el costo epidemiológico de un falso negativo es mucho mayor que el de un falso positivo. En este sentido, se necesita una estrategia que minimice los casos no detectados para cortar la cadena de transmisión, lo cual orienta hacia una combinación en paralelo como hipótesis inicial. Sin embargo, el análisis cuantitativo permitirá confirmar o ajustar esta hipótesis.

7.5 Parámetros de las pruebas y construcción de tablas individuales

Los valores de sensibilidad y especificidad provienen de metaanálisis publicados; baciloscopia con sensibilidad del 61 % y especificidad del 98 % según Steingart et al. (2006), y GeneXpert MTB/RIF con sensibilidad del 85 % y especificidad del 98 % según los reportes de la Organización Mundial de la Salud sobre la prueba en su versión Ultra.

poblacion_tbc   <- 1000
prevalencia_tbc <- 0.10

sens_bk    <- 0.61
esp_bk     <- 0.98

sens_xpert <- 0.85
esp_xpert  <- 0.98

enfermos_tbc <- poblacion_tbc * prevalencia_tbc
sanos_tbc    <- poblacion_tbc - enfermos_tbc

tibble(
  Parámetro = c("Población simulada",
                "Prevalencia esperada",
                "Sensibilidad baciloscopia",
                "Especificidad baciloscopia",
                "Sensibilidad GeneXpert MTB/RIF",
                "Especificidad GeneXpert MTB/RIF",
                "Total de enfermos esperados",
                "Total de sanos esperados"),
  Valor = c(scales::comma(poblacion_tbc, big.mark = "."),
            scales::percent(prevalencia_tbc, decimal.mark = ","),
            scales::percent(sens_bk, decimal.mark = ","),
            scales::percent(esp_bk,  decimal.mark = ","),
            scales::percent(sens_xpert, decimal.mark = ","),
            scales::percent(esp_xpert, decimal.mark = ","),
            scales::comma(enfermos_tbc, big.mark = "."),
            scales::comma(sanos_tbc,    big.mark = "."))
) |>
  gt() |>
  tab_header(title = md("**Parámetros del taller — Tuberculosis pulmonar**"),
             subtitle = "Población simulada de 1.000 sintomáticos respiratorios") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$gris),
            locations = cells_body(rows = seq(1, 8, 2))) |>
  cols_align(align = "center", columns = Valor) |>
  tab_options(table.font.size = 12)
Parámetros del taller — Tuberculosis pulmonar
Población simulada de 1.000 sintomáticos respiratorios
Parámetro Valor
Población simulada 1.000
Prevalencia esperada 10%
Sensibilidad baciloscopia 61%
Especificidad baciloscopia 98%
Sensibilidad GeneXpert MTB/RIF 85%
Especificidad GeneXpert MTB/RIF 98%
Total de enfermos esperados 100
Total de sanos esperados 900

7.6 Tablas 2×2 individuales para cada prueba

tabla_bk <- construir_2x2(sens_bk, esp_bk, enfermos_tbc, sanos_tbc)
mostrar_tabla_2x2(tabla_bk, "Tabla 2×2 — Baciloscopia seriada")
Tabla 2×2 — Baciloscopia seriada
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 61 18 79
Prueba negativa 39 882 921
Total 100 900 1.000
tabla_xpert <- construir_2x2(sens_xpert, esp_xpert, enfermos_tbc, sanos_tbc)
mostrar_tabla_2x2(tabla_xpert, "Tabla 2×2 — GeneXpert MTB/RIF")
Tabla 2×2 — GeneXpert MTB/RIF
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 85 18 103
Prueba negativa 15 882 897
Total 100 900 1.000

Se observa que la baciloscopia detecta solo 61 de los 100 enfermos esperados, lo cual deja 39 casos sin diagnóstico, cifra preocupante en un programa de salud pública.

El GeneXpert MTB/RIF, en cambio, detecta 85 casos y deja escapar solo 15; por el lado de los sanos, ambas pruebas se comportan de manera muy similar, dado que sus especificidades son prácticamente idénticas, de allí que ambas generen alrededor de 18 falsos positivos.

7.7 Estrategia en serie: baciloscopia seguida de GeneXpert MTB/RIF

Bajo la estrategia en serie, se considera positivo el diagnóstico final únicamente cuando ambas pruebas coinciden en positivo; el paciente se somete primero a baciloscopia y, solo si esa es positiva, se solicita GeneXpert MTB/RIF como prueba confirmatoria.

sens_serie_tbc <- sens_bk * sens_xpert
esp_serie_tbc  <- 1 - ((1 - esp_bk) * (1 - esp_xpert))

tabla_serie_tbc <- construir_2x2(sens_serie_tbc, esp_serie_tbc, enfermos_tbc, sanos_tbc)

mostrar_tabla_2x2(tabla_serie_tbc, "Tabla 2×2 — Estrategia en serie (Tuberculosis)")
Tabla 2×2 — Estrategia en serie (Tuberculosis)
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 52 0 52
Prueba negativa 48 900 948
Total 100 900 1.000
vp_st <- tabla_serie_tbc$Enfermo[1]
fn_st <- tabla_serie_tbc$Enfermo[2]
fp_st <- tabla_serie_tbc$Sano[1]
vn_st <- tabla_serie_tbc$Sano[2]

vpp_serie_tbc <- vp_st / (vp_st + fp_st)
vpn_serie_tbc <- vn_st / (vn_st + fn_st)
lr_pos_serie_tbc <- sens_serie_tbc / (1 - esp_serie_tbc)
lr_neg_serie_tbc <- (1 - sens_serie_tbc) / esp_serie_tbc

tibble(
  Métrica = c("Sensibilidad neta",
              "Especificidad neta",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  `Fórmula completa` = c(
    "Sensibilidad baciloscopia × Sensibilidad GeneXpert",
    "1 − [(1 − Especificidad baciloscopia) × (1 − Especificidad GeneXpert)]",
    "Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales)",
    "Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales)",
    "Sensibilidad neta / (1 − Especificidad neta)",
    "(1 − Sensibilidad neta) / Especificidad neta"
  ),
  `Valores conocidos` = c(
    "Sens baciloscopia = 0,61  ;  Sens GeneXpert = 0,85",
    "Esp baciloscopia = 0,98  ;  Esp GeneXpert = 0,98",
    glue::glue("VP finales = {round(vp_st)}  ;  FP finales = {round(fp_st)}"),
    glue::glue("VN finales = {round(vn_st)}  ;  FN finales = {round(fn_st)}"),
    glue::glue("Sens neta = {round(sens_serie_tbc, 3)}  ;  Esp neta = {round(esp_serie_tbc, 4)}"),
    glue::glue("Sens neta = {round(sens_serie_tbc, 3)}  ;  Esp neta = {round(esp_serie_tbc, 4)}")
  ),
  Sustitución = c(
    "0,61 × 0,85",
    "1 − [(1 − 0,98) × (1 − 0,98)]  =  1 − (0,02 × 0,02)",
    glue::glue("{round(vp_st)} / {round(vp_st + fp_st)}"),
    glue::glue("{round(vn_st)} / {round(vn_st + fn_st)}"),
    glue::glue("{round(sens_serie_tbc, 3)} / (1 − {round(esp_serie_tbc, 4)})"),
    glue::glue("(1 − {round(sens_serie_tbc, 3)}) / {round(esp_serie_tbc, 4)}")
  ),
  Resultado = c(
    scales::percent(sens_serie_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::percent(esp_serie_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpp_serie_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpn_serie_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::number(lr_pos_serie_tbc, accuracy = 0.01, decimal.mark = ","),
    scales::number(lr_neg_serie_tbc, accuracy = 0.001, decimal.mark = ",")
  )
) |>
  gt() |>
  tab_header(title = md("**Cálculo paso a paso — Estrategia en serie (Tuberculosis)**"),
             subtitle = "Baciloscopia + GeneXpert MTB/RIF") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = c(1, 2))) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = c(3, 4))) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = c(5, 6))) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = c(Métrica, Resultado))) |>
  cols_align(align = "left", columns = c(Métrica, `Fórmula completa`, `Valores conocidos`, Sustitución)) |>
  cols_align(align = "center", columns = Resultado) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Cálculo paso a paso — Estrategia en serie (Tuberculosis)
Baciloscopia + GeneXpert MTB/RIF
Métrica Fórmula completa Valores conocidos Sustitución Resultado
Sensibilidad neta Sensibilidad baciloscopia × Sensibilidad GeneXpert Sens baciloscopia = 0,61 ; Sens GeneXpert = 0,85 0,61 × 0,85 51,8%
Especificidad neta 1 − [(1 − Especificidad baciloscopia) × (1 − Especificidad GeneXpert)] Esp baciloscopia = 0,98 ; Esp GeneXpert = 0,98 1 − [(1 − 0,98) × (1 − 0,98)] = 1 − (0,02 × 0,02) 100,0%
Valor predictivo positivo Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales) VP finales = 52 ; FP finales = 0 52 / 52 99,3%
Valor predictivo negativo Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales) VN finales = 900 ; FN finales = 48 900 / 948 94,9%
Razón de verosimilitud positiva Sensibilidad neta / (1 − Especificidad neta) Sens neta = 0,518 ; Esp neta = 0,9996 0,518 / (1 − 0,9996) 1 296,25
Razón de verosimilitud negativa (1 − Sensibilidad neta) / Especificidad neta Sens neta = 0,518 ; Esp neta = 0,9996 (1 − 0,518) / 0,9996 0,482

7.7.1 Interpretación de la estrategia en serie aplicada a tuberculosis

Se observa que la sensibilidad neta cayó al 51,8 %, lo cual significa que casi la mitad de los pacientes con tuberculosis pulmonar quedarían sin diagnóstico bajo esta estrategia; considero que esta pérdida es clínicamente inaceptable en un programa de salud pública, dado que cada caso no diagnosticado representa una fuente activa de transmisión comunitaria. La razón matemática de esta caída es directa, porque al multiplicar la sensibilidad de la baciloscopia (0,61) por la del GeneXpert (0,85), los errores de detección de ambas pruebas se acumulan en contra de la capacidad global.

La especificidad neta alcanzó el 100,0 %, prácticamente perfecta, dado que al ser ambas especificidades del 98 % la probabilidad de que ambas pruebas se equivoquen simultáneamente en un sano es extremadamente baja; en consecuencia, los falsos positivos prácticamente desaparecen.

El valor predictivo positivo del 99,3 % confirma este perfil, ya que casi todos los pacientes con resultado positivo en serie tendrían realmente tuberculosis; por consiguiente, un positivo en serie justifica plenamente iniciar tratamiento.

El valor predictivo negativo bajó al 94,9 %, claramente inferior al de las pruebas individuales; esta caída se explica porque ahora el grupo de negativos acumula tanto los enfermos perdidos por la baciloscopia como los perdidos por el GeneXpert. De manera que aproximadamente 5 de cada 100 pacientes con resultado negativo tendrían realmente tuberculosis sin diagnosticar, lo cual constituye un riesgo de salud pública considerable.

La razón de verosimilitud positiva alcanzó 1.296,25, valor extraordinariamente alto que confirma el perfil ultraconfirmatorio de la estrategia; sin embargo, la razón de verosimilitud negativa quedó en 0,482, lo cual cae en el rango de “disminución pequeña” según Sackett, muy por encima del umbral de descarte fuerte. En consecuencia, un negativo en serie no descarta con suficiente confianza, lo cual refuerza que la estrategia en serie no es adecuada como tamizaje en este escenario.

Considero que esta estrategia podría reservarse exclusivamente como paso confirmatorio antes de iniciar tratamiento, especialmente en escenarios donde se requiera máxima certeza diagnóstica para documentar el caso ante el sistema de vigilancia epidemiológica; sin embargo, no debe utilizarse como única estrategia diagnóstica en pacientes sintomáticos respiratorios, dado que la pérdida de sensibilidad sería epidemiológicamente costosa.

7.8 Estrategia en paralelo: baciloscopia y GeneXpert MTB/RIF simultáneos

Bajo la estrategia en paralelo, se solicitan las dos pruebas al mismo tiempo y se considera positivo el diagnóstico final si al menos una de las dos resulta positiva; en consecuencia, esta estrategia maximiza la captación de casos, lo cual es coherente con el objetivo poblacional de no perder enfermos en un programa de tamizaje activo.

Considero que esta es la lógica más adecuada para tuberculosis pulmonar, dado que el costo epidemiológico de un falso negativo (continuidad de la transmisión comunitaria) supera ampliamente el costo operativo de aplicar las dos pruebas simultáneamente.

sens_paralelo_tbc <- 1 - ((1 - sens_bk) * (1 - sens_xpert))
esp_paralelo_tbc  <- esp_bk * esp_xpert

tabla_paralelo_tbc <- construir_2x2(sens_paralelo_tbc, esp_paralelo_tbc, enfermos_tbc, sanos_tbc)

mostrar_tabla_2x2(tabla_paralelo_tbc, "Tabla 2×2 — Estrategia en paralelo (Tuberculosis)")
Tabla 2×2 — Estrategia en paralelo (Tuberculosis)
Distribución esperada en la población analizada
Resultado Enfermo Sano Total
Prueba positiva 94 36 130
Prueba negativa 6 864 870
Total 100 900 1.000
vp_pt <- tabla_paralelo_tbc$Enfermo[1]
fn_pt <- tabla_paralelo_tbc$Enfermo[2]
fp_pt <- tabla_paralelo_tbc$Sano[1]
vn_pt <- tabla_paralelo_tbc$Sano[2]

vpp_paralelo_tbc <- vp_pt / (vp_pt + fp_pt)
vpn_paralelo_tbc <- vn_pt / (vn_pt + fn_pt)
lr_pos_paralelo_tbc <- sens_paralelo_tbc / (1 - esp_paralelo_tbc)
lr_neg_paralelo_tbc <- (1 - sens_paralelo_tbc) / esp_paralelo_tbc

tibble(
  Métrica = c("Sensibilidad neta",
              "Especificidad neta",
              "Valor predictivo positivo",
              "Valor predictivo negativo",
              "Razón de verosimilitud positiva",
              "Razón de verosimilitud negativa"),
  `Fórmula completa` = c(
    "1 − [(1 − Sensibilidad baciloscopia) × (1 − Sensibilidad GeneXpert)]",
    "Especificidad baciloscopia × Especificidad GeneXpert",
    "Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales)",
    "Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales)",
    "Sensibilidad neta / (1 − Especificidad neta)",
    "(1 − Sensibilidad neta) / Especificidad neta"
  ),
  `Valores conocidos` = c(
    "Sens baciloscopia = 0,61  ;  Sens GeneXpert = 0,85",
    "Esp baciloscopia = 0,98  ;  Esp GeneXpert = 0,98",
    glue::glue("VP finales = {round(vp_pt)}  ;  FP finales = {round(fp_pt)}"),
    glue::glue("VN finales = {round(vn_pt)}  ;  FN finales = {round(fn_pt)}"),
    glue::glue("Sens neta = {round(sens_paralelo_tbc, 3)}  ;  Esp neta = {round(esp_paralelo_tbc, 4)}"),
    glue::glue("Sens neta = {round(sens_paralelo_tbc, 3)}  ;  Esp neta = {round(esp_paralelo_tbc, 4)}")
  ),
  Sustitución = c(
    "1 − [(1 − 0,61) × (1 − 0,85)]  =  1 − (0,39 × 0,15)",
    "0,98 × 0,98",
    glue::glue("{round(vp_pt)} / {round(vp_pt + fp_pt)}"),
    glue::glue("{round(vn_pt)} / {round(vn_pt + fn_pt)}"),
    glue::glue("{round(sens_paralelo_tbc, 3)} / (1 − {round(esp_paralelo_tbc, 4)})"),
    glue::glue("(1 − {round(sens_paralelo_tbc, 3)}) / {round(esp_paralelo_tbc, 4)}")
  ),
  Resultado = c(
    scales::percent(sens_paralelo_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::percent(esp_paralelo_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpp_paralelo_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::percent(vpn_paralelo_tbc, accuracy = 0.1, decimal.mark = ","),
    scales::number(lr_pos_paralelo_tbc, accuracy = 0.01, decimal.mark = ","),
    scales::number(lr_neg_paralelo_tbc, accuracy = 0.001, decimal.mark = ",")
  )
) |>
  gt() |>
  tab_header(title = md("**Cálculo paso a paso — Estrategia en paralelo (Tuberculosis)**"),
             subtitle = "Baciloscopia + GeneXpert MTB/RIF") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = c(1, 2))) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = c(3, 4))) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = c(5, 6))) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = c(Métrica, Resultado))) |>
  cols_align(align = "left", columns = c(Métrica, `Fórmula completa`, `Valores conocidos`, Sustitución)) |>
  cols_align(align = "center", columns = Resultado) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Cálculo paso a paso — Estrategia en paralelo (Tuberculosis)
Baciloscopia + GeneXpert MTB/RIF
Métrica Fórmula completa Valores conocidos Sustitución Resultado
Sensibilidad neta 1 − [(1 − Sensibilidad baciloscopia) × (1 − Sensibilidad GeneXpert)] Sens baciloscopia = 0,61 ; Sens GeneXpert = 0,85 1 − [(1 − 0,61) × (1 − 0,85)] = 1 − (0,39 × 0,15) 94,2%
Especificidad neta Especificidad baciloscopia × Especificidad GeneXpert Esp baciloscopia = 0,98 ; Esp GeneXpert = 0,98 0,98 × 0,98 96,0%
Valor predictivo positivo Verdaderos positivos finales / (Verdaderos positivos + Falsos positivos finales) VP finales = 94 ; FP finales = 36 94 / 130 72,5%
Valor predictivo negativo Verdaderos negativos finales / (Verdaderos negativos + Falsos negativos finales) VN finales = 864 ; FN finales = 6 864 / 870 99,3%
Razón de verosimilitud positiva Sensibilidad neta / (1 − Especificidad neta) Sens neta = 0,942 ; Esp neta = 0,9604 0,942 / (1 − 0,9604) 23,78
Razón de verosimilitud negativa (1 − Sensibilidad neta) / Especificidad neta Sens neta = 0,942 ; Esp neta = 0,9604 (1 − 0,942) / 0,9604 0,061

7.8.1 Interpretación de la estrategia en paralelo aplicada a tuberculosis

Se observa que la sensibilidad neta subió al 94,2 %, muy por encima del 61 % de la baciloscopia y del 85 % del GeneXpert por separado; en consecuencia, prácticamente todos los pacientes con tuberculosis serían detectados bajo esta estrategia, lo cual responde directamente al objetivo poblacional de cortar la cadena de transmisión comunitaria.

Considero que esta ganancia es la justificación clínica más sólida para implementar el paralelo en tamizaje activo, dado que reduce los casos no diagnosticados de 39 (baciloscopia sola) o 15 (GeneXpert solo) a apenas 6 por cada 100 enfermos.

La especificidad neta cayó al 96,0 %, pérdida muy modesta dado que las especificidades individuales eran del 98 %; por consiguiente, este escenario se comporta de manera excepcional, ya que conserva una especificidad alta mientras gana mucho en sensibilidad.

De manera que el cotesting baciloscopia más GeneXpert es operativamente viable como estrategia poblacional, condición que solo se logra cuando las pruebas individuales tienen especificidades cercanas al techo del 100 %.

El valor predictivo positivo se mantiene en 72,5 %, valor razonable que permite tomar decisiones clínicas iniciales sobre el paciente con resultado positivo; en consecuencia, aunque no alcanza el nivel confirmatorio del 99 % que mostró la serie, sigue siendo lo suficientemente alto para justificar el inicio del estudio clínico complementario y la notificación al sistema de vigilancia epidemiológica.

El valor predictivo negativo alcanzó el 99,3 %, lo cual otorga una tranquilidad clínica considerable ante un resultado doblemente negativo; por consiguiente, considero que esta es la ganancia más relevante de la estrategia, ya que un paciente con baciloscopia y GeneXpert negativos puede descartar tuberculosis con muy alta confianza y continuar el algoritmo diagnóstico hacia otras causas de su sintomatología respiratoria.

La razón de verosimilitud positiva alcanzó 23,78, valor claramente por encima del umbral confirmatorio fuerte de Sackett (mayor a 10); en consecuencia, un positivo en paralelo aporta evidencia robusta a favor de tuberculosis.

La razón de verosimilitud negativa cayó a 0,06, muy por debajo del umbral de descarte fuerte (menor a 0,1); por lo cual, un negativo en paralelo descarta la enfermedad con una potencia diagnóstica excepcional, lo cual confirma el perfil descartativo de la estrategia.

7.9 Tabla comparativa final de las cuatro situaciones

metricas_bk    <- calcular_metricas(tabla_bk, "Baciloscopia sola")
metricas_xpert <- calcular_metricas(tabla_xpert, "GeneXpert solo")
metricas_st    <- calcular_metricas(tabla_serie_tbc, "En serie")
metricas_pt    <- calcular_metricas(tabla_paralelo_tbc, "En paralelo")

comparacion_tbc <- bind_rows(metricas_bk, metricas_xpert, metricas_st, metricas_pt)

comparacion_tbc |>
  mutate(across(Sensibilidad:`Valor predictivo negativo`,
                ~ scales::percent(.x, accuracy = 0.1, decimal.mark = ",")),
         across(starts_with("Razón"),
                ~ scales::number(.x, accuracy = 0.01, decimal.mark = ","))) |>
  gt() |>
  tab_header(title = md("**Comparación de las cuatro situaciones — Tuberculosis pulmonar**"),
             subtitle = "Baciloscopia, GeneXpert MTB/RIF y sus combinaciones") |>
  tab_style(style = list(cell_fill(color = paleta$lila),
                         cell_text(weight = "bold", color = paleta$texto)),
            locations = cells_column_labels()) |>
  tab_style(style = cell_fill(color = paleta$rosa),
            locations = cells_body(rows = Prueba == "Baciloscopia sola")) |>
  tab_style(style = cell_fill(color = paleta$verde),
            locations = cells_body(rows = Prueba == "GeneXpert solo")) |>
  tab_style(style = cell_fill(color = paleta$durazno),
            locations = cells_body(rows = Prueba == "En serie")) |>
  tab_style(style = cell_fill(color = paleta$azul),
            locations = cells_body(rows = Prueba == "En paralelo")) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = Prueba)) |>
  cols_align(align = "center", columns = -Prueba) |>
  tab_options(table.font.size = 11, data_row.padding = px(10))
Comparación de las cuatro situaciones — Tuberculosis pulmonar
Baciloscopia, GeneXpert MTB/RIF y sus combinaciones
Prueba Sensibilidad Especificidad Valor predictivo positivo Valor predictivo negativo Razón de verosimilitud positiva Razón de verosimilitud negativa
Baciloscopia sola 61,0% 98,0% 77,2% 95,8% 30,50 0,40
GeneXpert solo 85,0% 98,0% 82,5% 98,3% 42,50 0,15
En serie 51,8% 100,0% 99,3% 94,9% 1 296,25 0,48
En paralelo 94,2% 96,0% 72,5% 99,3% 23,78 0,06

7.9.1 Lectura integrada de la comparación final

La tabla muestra de forma compacta el comportamiento de las cuatro alternativas diagnósticas disponibles para tuberculosis pulmonar; considero que el contraste entre la serie (sensibilidad del 51,8 %) y el paralelo (sensibilidad del 94,2 %) ilustra de manera nítida cuánto se puede ganar al ajustar la lógica de combinación según el objetivo clínico.

En consecuencia, mientras la serie privilegia la confirmación con valor predictivo positivo cercano al 99 %, el paralelo privilegia la captación de casos sin sacrificar especificidad significativamente.

Las razones de verosimilitud confirman este intercambio; la LR positiva de la serie alcanza 1.296,25 (perfil ultraconfirmatorio) mientras que la LR negativa del paralelo cae a 0,06 (perfil ultradescartativo). Por lo tanto, ninguna de las dos pruebas individuales se acerca a estos niveles de poder diagnóstico, lo cual justifica plenamente combinar las pruebas en un programa de salud pública.

7.10 Decisión clínica: ¿con cuál estrategia me quedo?

A partir del análisis cuantitativo completo, considero que la estrategia óptima para este escenario es la combinación en paralelo de baciloscopia y GeneXpert MTB/RIF, dado que cumple simultáneamente con varios criterios fundamentales para un programa de tamizaje activo de tuberculosis pulmonar.

En primer lugar, alcanza una sensibilidad del 94,2 %, lo cual significa que se reduce drásticamente el número de casos no detectados; en consecuencia, se corta la cadena de transmisión comunitaria, objetivo prioritario en salud pública.

En segundo lugar, mantiene una especificidad del 96,0 %, lo cual evita un aumento operativo desproporcionado de falsos positivos en el sistema de salud.

En tercer lugar, la razón de verosimilitud negativa de 0,06 permite descartar enfermedad con mucha confianza, lo cual es coherente con el objetivo poblacional de no perder enfermos.

Por último, este enfoque es operativamente viable en Colombia, dado que la Resolución 227 de 2020 ya contempla el uso prioritario de pruebas moleculares en sintomáticos respiratorios.

La estrategia en serie quedaría reservada como paso confirmatorio antes de iniciar tratamiento, dado que su valor predictivo positivo cercano al 99,3 % y su razón de verosimilitud positiva de 1.296,25 aportan certeza adicional cuando se requiere documentar el caso ante el sistema de vigilancia epidemiológica; sin embargo, no debería utilizarse como estrategia primaria de tamizaje, dado que su sensibilidad del 51,8 % implica perder casi la mitad de los enfermos.

7.11 Explicación al paciente sobre los resultados

Para comunicar los resultados al paciente, considero importante traducir el lenguaje técnico a una explicación clara, breve y empática; en consecuencia, la conversación se estructuraría de dos maneras según el resultado obtenido.

Si el resultado de la combinación en paralelo es negativo, se le diría al paciente lo siguiente:

“Señor (a): Le realizamos dos pruebas diferentes para detectar tuberculosis y ambas dieron negativas; esto significa que la probabilidad de que usted tenga tuberculosis es muy baja, cerca del 1 %. Por lo tanto, vamos a buscar otra causa que explique su tos y sus síntomas.

Si los síntomas continúan o empeoran en las próximas semanas, debe consultar nuevamente para reevaluar la situación.”

Si el resultado es positivo en al menos una de las dos pruebas, se le diría al paciente lo siguiente:

“Señor (a): El resultado de las pruebas sugiere que usted tiene tuberculosis pulmonar; en este momento la probabilidad de que realmente tenga la enfermedad es alta y por eso vamos a iniciar tratamiento. La tuberculosis es una enfermedad curable, pero requiere tomar los medicamentos durante seis meses sin interrupción; en consecuencia, es muy importante que asista a todos los controles programados. También es necesario que se realicen pruebas a las personas con quienes convive en casa, para garantizar que ellas también estén bien.”

8 Referencias bibliográficas

  1. Ministerio de Salud y Protección Social de Colombia. Resolución 227 de 2020, por la cual se adoptan los lineamientos técnicos y operativos del Programa Nacional de Prevención y Control de la Tuberculosis. Bogotá: MinSalud; 2020.

  2. Ministerio de Salud y Protección Social de Colombia. Resolución 3280 de 2018, por la cual se adoptan los lineamientos técnicos y operativos de la Ruta Integral de Atención para la Promoción y Mantenimiento de la Salud y la Ruta Integral de Atención en Salud para la Población Materno Perinatal. Bogotá: MinSalud; 2018.

  3. Pankaj S, Kumari A, Kumari S, Choudhary V, Kumari J, Kumari A, Nazneen S. Evaluation of sensitivity and specificity of pap smear, LBC and HPV in screening of cervical cancer. Indian Journal of Gynecologic Oncology. 2018;16(3):82. doi:10.1007/s40944-018-0221-x

  4. Sackett DL, Straus SE, Richardson WS, Rosenberg W, Haynes RB. Evidence-Based Medicine: How to Practice and Teach EBM. 2.ª ed. Edinburgh: Churchill Livingstone; 2000.

  5. Steingart KR, Henry M, Ng V, Hopewell PC, Ramsay A, Cunningham J, et al. Fluorescence versus conventional sputum smear microscopy for tuberculosis: a systematic review. Lancet Infectious Diseases. 2006;6(9):570-581. doi:10.1016/S1473-3099(06)70578-3

  6. World Health Organization. WHO consolidated guidelines on tuberculosis. Module 3: Diagnosis - Rapid diagnostics for tuberculosis detection, 2021 update. Geneva: WHO; 2021.