7 votos

Cómo calcular los intervalos de confianza de los cocientes de probabilidad a partir de una tabla de 2x2 en presencia de celdas con ceros

Estoy analizando una prueba diagnóstica (frente a un patrón oro, utilizando una tabla de 2x2). Quiero calcular los cocientes de probabilidad (sensibilidad / (1-especificidad), etc.), pero tengo varios conjuntos de datos con 0 falsos positivos y, por tanto, una especificidad de 1.....

Me he encontrado con otros datos (por ejemplo, en las bases de evidencia de las guías clínicas para la investigación de la infección periprotésica de cadera o rodilla de la AAOS) donde sé que los autores tenían 0 falsos positivos pero aún así han presentado intervalos de confianza para los cocientes de probabilidad.

¿Alguien sabe cómo han ajustado sus cálculos para permitir esto?

Gracias

8voto

mehturt Puntos 13

El documento de Koopman (1984) Intervalos de confianza para la razón de dos proporciones binomiales ofrece dos métodos para calcular el intervalo de confianza. Voy a explicar aquí el primero, ya que los intervalos de confianza se pueden calcular analíticamente (el segundo método utiliza un procedimiento iterativo para encontrar los intervalos de confianza numéricamente). En primer lugar, considere la siguiente tabla de 2x2:

                 Gold standard
               Positive Negative
Test positive     a        b
Test negative     c        d

El ratio de probabilidad de una prueba positiva es: $$ LR_{+}=\frac{a/(a+c)}{b/(b+d)} $$ y la razón de probabilidad de una prueba negativa es: $$ LR_{-}=\frac{c/(a+c)}{d/(b+d)} $$

Son básicamente la relación de dos proporciones.


Intervalos de confianza utilizando una aproximación normal

Dejemos que $T = \frac{X/m}{Y/n}$ entonces la variable $\ln(T)$ tiene una distribución aproximadamente normal con una media aproximada $\ln(\theta)$ y la varianza estimada $\widehat{\sigma}^{2}=(1/x) - (1/m) + (1/y) - (1/n)$ . Una aproximación de dos lados $1-\alpha$ intervalo de confianza para $\theta$ está dada por: $$ \{t\cdot \exp(-\xi_{1-\alpha/2}\cdot\hat{\sigma}), t\cdot \exp(\xi_{1-\alpha/2}\cdot\hat{\sigma})\} $$ donde $\xi_{1-\alpha/2}$ es el $1-\frac{1}{2}\alpha$ cuantil de la distribución normal estándar $\mathcal{N}(0,1)$ (para $\alpha = 0.05$ $\xi=1.96$ ) y $t$ es el valor observado de $T$ (en su caso, $t$ serían simplemente los cocientes de probabilidad observados). En su caso, $T$ es simplemente los cocientes de probabilidad y $x=a, m=a+c, y=b, n=b+d$ para el LR positivo o $x=c, m=a+c, y=d, n=b+d$ para el LR negativo. Es importante: El documento también establece los procedimientos si $x=0, x=m, y=0$ o $y=n$ :

Special cases

Si no tiene falsos positivos ( $b=y=0$ en la tabla anterior), entonces puedes sustituirlo por $b=1/2$ para calcular el límite inferior del intervalo de confianza.

En este puesto , @whuber ofrece un enfoque similar: añadir $1/2$ a ambos $x$ y $y$ y añadir $1$ tanto a la $n$ y $m$ . En este caso concreto, añada $1/2$ a $a$ y $b$ y añadir $1$ a $(a+c)$ y $(b+d)$ para el LR positivo y añadir $1/2$ a $c$ y $d$ y añadir $1$ a $(a+c)$ y $(b+d)$ para el LR negativo.


Otra formulación

El intervalo de confianza anterior puede escribirse de otra manera: $$ LR_{x}=\exp\left[\ln\left(\frac{p_1}{p_2}\right)\pm \xi_{1-\alpha/2}\cdot \sqrt{\frac{1-p_1}{p_{1}n_{1}}+\frac{1-p_2}{p_{2}n_{2}}} \right] $$ donde $\xi_{1-\alpha/2}$ es el $1-\frac{1}{2}\alpha$ cuantil de la distribución normal estándar. Nota: Para el LR positivo, $p_1=\text{sensitivity}$ y $p_2=1-\text{specificity}$ y para el LR negativo, $p_1=1-\text{sensitivity}$ y $p_2=\text{specificity}$ y $n_1 = a+c, n_2=b+d$ .


Aquí hay un poco de R que realiza los cálculos:

lr.ci <- function( m, sig.level=0.95 ) {

  alpha <- 1 - sig.level

  a <- m[1, 1]
  b <- m[1, 2]
  c <- m[2, 1]
  d <- m[2, 2]

  spec <- d/(b+d)
  sens <- a/(a+c)

  lr.pos <- sens/(1 - spec)  

  if ( a != 0 & b != 0 ) {

    sigma2 <- (1/a) - (1/(a+c)) + (1/b) - (1/(b+d))

    lower.pos <- lr.pos * exp(-qnorm(1-(alpha/2))*sqrt(sigma2))

    upper.pos <- lr.pos * exp(qnorm(1-(alpha/2))*sqrt(sigma2)) 

  } else if ( a == 0 & b == 0 ) {

    lower.pos <- 0
    upper.pos <- Inf

  } else if ( a == 0 & b != 0 ) {

    a.temp <- (1/2)

    spec.temp <- d/(b+d)
    sens.temp <- a.temp/(a+c)

    lr.pos.temp <- sens.temp/(1 - spec.temp)  

    lower.pos <- 0

    sigma2 <- (1/a.temp) - (1/(a.temp+c)) + (1/b) - (1/(b+d))

    upper.pos <- lr.pos.temp * exp(qnorm(1-(alpha/2))*sqrt(sigma2))

  } else if ( a != 0 & b == 0 ) {

    b.temp <- (1/2)

    spec.temp <- d/(b.temp+d)
    sens.temp <- a/(a+c)

    lr.pos.temp <- sens.temp/(1 - spec.temp) 

    sigma2 <- (1/a) - (1/(a+c)) + (1/b.temp) - (1/(b.temp+d))

    lower.pos <- lr.pos.temp * exp(-qnorm(1-(alpha/2))*sqrt(sigma2))

    upper.pos <- Inf  

  } else if ( (a == (a+c)) & (b == (b+d)) ) {

    a.temp <- a - (1/2)
    b.temp <- b - (1/2)

    spec.temp <- d/(b.temp+d)
    sens.temp <- a.temp/(a+c)

    lr.pos.temp <- sens.temp/(1 - spec.temp) 

    sigma2 <- (1/a.temp) - (1/(a.temp+c)) + (1/b.temp) - (1/(b.temp+d))

    lower.pos <- lr.pos.temp * exp(-qnorm(1-(alpha/2))*sqrt(sigma2))

    upper.pos <- lr.pos.temp * exp(qnorm(1-(alpha/2))*sqrt(sigma2)) 

  }

  lr.neg <- (1 - sens)/spec

  if ( c != 0 & d != 0 ) {

    sigma2 <- (1/c) - (1/(a+c)) + (1/d) - (1/(b+d))

    lower.neg <- lr.neg * exp(-qnorm(1-(alpha/2))*sqrt(sigma2))

    upper.neg <- lr.neg * exp(qnorm(1-(alpha/2))*sqrt(sigma2)) 

  } else if ( c == 0 & d == 0 ) {

    lower.neg<- 0
    upper.neg <- Inf

  } else if ( c == 0 & d != 0 ) {

    c.temp <- (1/2)

    spec.temp <- d/(b+d)
    sens.temp <- a/(a+c.temp)

    lr.neg.temp <- (1 - sens.temp)/spec.temp    

    lower.neg <- 0

    sigma2 <- (1/c.temp) - (1/(a+c)) + (1/d) - (1/(b+d))

    upper.neg <- lr.neg.temp * exp(qnorm(1-(alpha/2))*sqrt(sigma2))

  } else if ( c != 0 & d == 0 ) {

    d.temp <- (1/2)

    spec.temp <- d.temp/(b+d)
    sens.temp <- a/(a+c)

    lr.neg.temp <- (1 - sens.temp)/spec.temp  

    sigma2 <- (1/c) - (1/(a+c)) + (1/d.temp) - (1/(b+d))

    lower.neg <- lr.neg.temp * exp(-qnorm(1-(alpha/2))*sqrt(sigma2))

    upper.neg <- Inf  

  } else if ( (c == (a+c)) & (d == (b+d)) ) {

    c.temp <- c - (1/2)
    d.temp <- d - (1/2)

    spec.temp <- d.temp/(b+d)
    sens.temp <- a/(a+c.temp)

    lr.neg.temp <- (1 - sens.temp)/spec.temp   

    sigma2 <- (1/c.temp) - (1/(a+c)) + (1/d.temp) - (1/(b+d))

    lower.neg <- lr.neg.temp * exp(-qnorm(1-(alpha/2))*sqrt(sigma2))

    upper.neg <- lr.neg.temp * exp(qnorm(1-(alpha/2))*sqrt(sigma2)) 

  }

  list(
    lr.pos=lr.pos, lower.pos=lower.pos, upper.pos=upper.pos,
    lr.neg=lr.neg, lower.neg=lower.neg, upper.neg=upper.neg
    )

}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X