Hace poco, Nassim Nicholas Taleb hecho ce poste sobre la reciente Estudio sobre la máscara danesa Un ensayo controlado aleatorizado que concluyó que la proporción de infecciones por coronavirus diagnosticadas recientemente no era significativamente diferente entre el grupo con mascarillas y el grupo de control sin mascarillas (42/2392=1,8% frente a 53/2470=2,1%), basándose en un valor p de 2 colas a partir de una regresión logística.
Taleb señala que si nos centramos sólo en los casos en los que la infección se ha confirmado mediante una prueba qRT PCR obtenemos 0/2392 frente a 5/2470. Escribe "Consideremos ahora el error más obvio. ¿Cuáles son las probabilidades de obtener 0 PCR frente a 5 al azar?
La probabilidad de tener 0 realizaciones en 2392 si la media es 5/2470 es de 0,0078518, es decir, 1 en 127. Podemos volver a expresarlo en valores p, que serían muy inferiores a 0,05, es decir, muy por encima de los valores p en el intervalo de 0,21 a 0,33 que muestra el artículo. No entiendo cómo estos investigadores pasaron por alto este punto".
Para mí, este cálculo no parece tener mucho sentido, ya que ese cálculo basado en la binomial PMF ignora la incertidumbre de muestreo en 5/2470. A esto, Taleb respondió "Yo no hago valores P: https://arxiv.org/pdf/1603.07532.pdf ", sólo para añadir más tarde este cálculo basado en el doble Bernoulli de Monte Carlo, en notación Mathematica, en el que obtiene un valor p de 1 cola de
ta=Table[data1=RandomVariate[BernoulliDistribution[5/2470],2470]//Total;
data2=RandomVariate[BernoulliDistribution[5/2470],2400]//Total;
data1-data2,{10^5}];
[[Select[ta,#<-5&]//Length] / 10^5]//N
0.03483
¿Podría alguien arrojar luz sobre lo que Taleb estaba calculando exactamente aquí? Si él está tratando de lograr una prueba binomial de 2 muestras utilizando Monte Carlo aquí no entiendo muy bien de dónde viene el 2400 y por qué no hay Bernoulli allí con una expectativa 0/2392 (que en sí mismo sería problemático como uno tendría varianza cero entonces). Para una prueba binomial MC de 2 muestras hubiera esperado algo como (en R, y usando un ajuste +1 de todos los recuentos para evitar la expectativa binomial p=0 en un grupo) :
p1=rbinom(1E8, 2470, (5+1)/(2470+1))/(2470+1)
p2=rbinom(1E8, 2392, (0+1)/(2392+1))/(2392+1)
mean(p1<=p2) # 1-tailed p = 0.03401019
2*mean(p1<=p2) # 2-tailed p = 0.06802038
pero parece que en su lugar intenta algo como (he corregido el 2400, que presumiblemente era un error tipográfico, y también he cambiado el > por un >=):
mean((rbinom(1E7, 2470, 5/2470)-rbinom(1E7, 2392, 5/2470))>=5)
# 1-tailed p = 0.0811906
lo cual creo que está mal, ¿no? En todo caso, me habría parecido más lógico :
mean((rbinom(1E8, 2470, 5/(2470+2392))/2470-rbinom(1E8, 2392, 5/(2470+2392))/2392)>=(5/2470-0/2392))
# 1-tailed p = 0.01446185
mean(abs((rbinom(1E8, 2470, 5/(2470+2392))/2470-rbinom(1E8, 2392, 5/(2470+2392))/2392))>=(5/2470-0/2392))
# 2-tailed p = 0.03479425
aunque no estoy seguro de si ésta sería una forma aceptada de llevar a cabo una prueba binomial de 2 muestras de este tipo (parecería una especie de versión Monte Carlo de Prueba de la tabla de contingencia 2x2 de Liddell ).
El propio Taleb no fue de mucha ayuda, señalando que sólo estábamos calculando una "distribución conjunta de tabla de doble columna a la Fisher" y luego comentando en su típico estilo brusco "Pareces ser muy muy ignorante, repitiendo fórmulas como un loro, sin entender de qué va la probabilidad. He dejado de entablar conversación con usted".
Sí le dije que, dado que las máscaras a priori también podrían haber empeorado las cosas (por ejemplo, cuando se utilizan mal), era más seguro utilizar pruebas de 2 colas. Y que debido a la separación completa no se puede hacer una regresión logística normal (GLM binomial) (que es lo que los autores utilizaron en su artículo), por ejemplo, en R :
summary(glm(cbind(pcrpos, pcrneg) ~ treatment, family=binomial, data=data.frame(treatment=factor(c("masks","control")),pcrpos=c(0,5), pcrneg=c(2392,2470-5))))
# 2-tailed p = 1, obviously not correct
Para solucionarlo, podríamos añadir 1/2 a nuestras observaciones como corrección de continuidad (equivalente a utilizar un Jeffrey's prior en un GLM binomial bayesiano, creo):
summary(glm(cbind(pcrpos+1/2, pcrneg+1/2) ~ treatment, family=binomial, data=data.frame(treatment=factor(c("masks","control")),pcrpos=c(0,5), pcrneg=c(2392,2470-5))))
# 2-tailed p = 0.11
Entonces señalé que sería mejor hacer un regresión logística exacta por ejemplo, en R:
library(elrm)
fit = elrm(pcrpos/n ~ treatment, ~ treatment, r=2, iter=400000, burnIn=1000, dataset=data.frame(treatment=factor(c("masks", "control")), pcrpos=c(0, 5), n=c(2392, 2470)) )
fit$p.values # 2-tailed p value = 0.06
fit$p.values.se # standard error on p value = 0.0003
Y que esto también estaría muy cerca del resultado de una prueba de 2 colas Prueba exacta de Fisher basado en la distribución hipergeométrica, que también da un valor p de 2 colas de 0,06:
fisher.test(rbind(c(0,2392), c(5,2470-5))) # 2-tailed p value = 0.06
o un valor p de 1 cola de 0,03 :
fisher.test(rbind(c(0,2392), c(5,2470-5)), alternative="less") # 1-tailed p value = 0.03
Aunque una prueba exacta de Fisher supondría que tanto los márgenes de las filas como los de las columnas son fijos, lo que en realidad no es del todo correcto en este caso, ya que sólo los márgenes de las filas son fijos, y esto haría que una regresión logística / binomial de 2 muestras fuera más apropiada.
Otra alternativa que señalé fue una Regresión logística de Firth lo que daría un valor p de 2 colas de 0,11 :
library(brglm)
summary(brglm(cbind(pcrpos, pcrneg) ~ treatment, family=binomial, data=data.frame(treatment=factor(c("masks","control")), pcrpos=c(0,5), pcrneg=c(2392,2470-5))))
# 2-tailed p = 0.11
A lo que respondió: "Por favor, no me dé bibliotecas. Por favor, dame derivaciones". (sin tener en cuenta que no existe una solución de forma cerrada ni siquiera para la solución de máxima verosimilitud de un MLG binomial).
De todos modos, ¿podría alguien aquí dar alguna opinión sobre toda esta discusión, preferiblemente desde un ángulo estadístico formal, de modo que potencialmente pudiera complacer a Taleb? Y específicamente también sobre la cuestión de la separación completa y la mejor manera de tratarla en pruebas binomiales de 2 muestras o regresiones logísticas, y cuáles serían las mejores opciones para obtener valores p exactos.
EDIT: Pensando un poco más en las posibles opciones, una prueba exacta incondicional para comparar dos proporciones binomiales independientes sería probablemente lo más correcto. Por ejemplo, utilizando la prueba de Boschloo ( https://en.wikipedia.org/wiki/Boschloo%27s_test ):
library(Exact)
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Boschloo", alternative="two.sided", model="Binomial")
# Boschloo's test, 2-tailed p = 0.06223
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Boschloo", alternative="less", model="Binomial")
# Boschloo's test, 1-tailed p = 0.03196
Aunque eso exact.test
parece tener bastantes métodos diferentes y yo mismo no estoy seguro de cuál sería el mejor (en particular para el caso de recuentos bajos y un grupo con una expectativa binomial de p=0), ya que no he profundizado en los detalles de todos esos métodos. Ej. method="Z-pooled"
da valores p más optimistas, más cercanos al valor p que obtengo mediante el método MC de Liddell para probar las proporciones frente a un común p=5/(2392+2470)
arriba:
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Z-pooled", alternative="two.sided", model="Binomial")
# 2-tailed p-value = 0.02809
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Z-pooled", alternative="less", model="Binomial")
# 1-tailed p-value = 0.01425
Del mismo modo, el uso de library(exact2x2)
y utilizando method="FisherAdj"
Estoy obteniendo valores p más optimistas :
uncondExact2x2(0, 2392, 5, 2470, alternative="two.sided", method="FisherAdj")
# 2-tailed p = 0.03417
uncondExact2x2(0, 2392, 5, 2470, alternative="greater", method="FisherAdj")
# 1-tailed p = 0.01709
Se agradecerán las opiniones sobre cuál de estas pruebas sería la más adecuada en este caso.
Por otra parte, si se tuvieran en cuenta los falsos negativos de las pruebas PCR (del mismo modo que a Taleb le gusta tener en cuenta los falsos positivos de las pruebas de anticuerpos), las conclusiones podrían cambiar bastante... También estoy bastante seguro de que habría que saber qué individuos fueron sometidos a cada tipo de prueba, y cuáles fueron los recuentos de todos los demás virus respiratorios a los que se les hicieron pruebas.