α y están relacionados. Trataré de ilustrar el punto con una prueba de diagnóstico. Digamos que tiene una prueba de diagnóstico que mide el nivel de un marcador sanguíneo. Se sabe que las personas que tienen una determinada enfermedad tienen niveles más bajos de este marcador en comparación con las personas sanas. Está claro de inmediato que debe decidir un valor límite, por debajo del cual una persona se clasifica como "enferma", mientras que las personas con valores superiores a este límite se consideran saludables. Sin embargo, es muy probable que la distribución del marcador de sangre varíe considerablemente incluso entre personas enfermas y sanas. Algunas personas sanas pueden tener niveles muy bajos de marcadores sanguíneos, a pesar de que son perfectamente saludables.β
Hay cuatro posibilidades que pueden ocurrir:
- una persona enferma se identifica correctamente como enferma (verdadero positivo = TP)
- una persona enferma se clasifica falsamente como saludable (falso negativo = FN)
- una persona sana se identifica correctamente como sana (verdadero negativo = TN)
- una persona sana se clasifica falsamente como enferma (falso positivo = FP)
Estas posibilidades se pueden ilustrar con una tabla de 2x2 :
Sick Healthy
Test positive TP FP
Test negative FN TN
α denota la tasa de falsos positivos, que es . es la tasa de falsos negativos, que es . Escribí un guión simple para ilustrar la situación gráficamente.α=FP/(FP+TN)ββ=FN/(TP+FN)R
alphabeta <- function(mean.sick=100, sd.sick=10, mean.healthy=130, sd.healthy=10, cutoff=120, n=10000, side="below", do.plot=TRUE) {
popsick <- rnorm(n, mean=mean.sick, sd=sd.sick)
pophealthy <- rnorm(n, mean=mean.healthy, sd=sd.healthy)
if ( side == "below" ) {
truepos <- length(popsick[popsick <= cutoff])
falsepos <- length(pophealthy[pophealthy <= cutoff])
trueneg <- length(pophealthy[pophealthy > cutoff])
falseneg <- length(popsick[popsick > cutoff])
} else if ( side == "above" ) {
truepos <- length(popsick[popsick >= cutoff])
falsepos <- length(pophealthy[pophealthy >= cutoff])
trueneg <- length(pophealthy[pophealthy < cutoff])
falseneg <- length(popsick[popsick < cutoff])
}
twotable <- matrix(c(truepos, falsepos, falseneg, trueneg), 2, 2, byrow=T)
rownames(twotable) <- c("Test positive", "Test negative")
colnames(twotable) <- c("Sick", "Healthy")
spec <- twotable[2,2]/(twotable[2,2] + twotable[1,2])
alpha <- 1 - spec
sens <- pow <- twotable[1,1]/(twotable[1,1] + twotable[2,1])
beta <- 1 - sens
pos.pred <- twotable[1,1]/(twotable[1,1] + twotable[1,2])
neg.pred <- twotable[2,2]/(twotable[2,2] + twotable[2,1])
if ( do.plot == TRUE ) {
dsick <- density(popsick)
dhealthy <- density(pophealthy)
par(mar=c(5.5, 4, 0.5, 0.5))
plot(range(c(dsick$x, dhealthy$x)), range(c(c(dsick$y, dhealthy$y))), type = "n", xlab="", ylab="", axes=FALSE)
box()
axis(1, at=mean(pophealthy), lab=substitute(mu[H[0]]~paste("=",m, sep=""), list(m=mean.healthy)), cex.axis=1.5,tck=0.02)
axis(1, at=mean(popsick), lab=substitute(mu[H[1]]~paste("=",m, sep=""), list(m=mean.sick)), cex.axis=1.5, tck=0.02)
axis(1, at=cutoff, lab=substitute(italic(paste("Cutoff=",coff, sep="")), list(coff=cutoff)), pos=-0.004, tick=FALSE, cex.axis=1.25)
lines(dhealthy, col = "steelblue", lwd=2)
if ( side == "below" ) {
polygon(c(cutoff, dhealthy$x[dhealthy$x<=cutoff], cutoff), c(0, dhealthy$y[dhealthy$x<=cutoff],0), col = "grey65")
} else if ( side == "above" ) {
polygon(c(cutoff, dhealthy$x[dhealthy$x>=cutoff], cutoff), c(0, dhealthy$y[dhealthy$x>=cutoff],0), col = "grey65")
}
lines(dsick, col = "red", lwd=2)
if ( side == "below" ) {
polygon(c(cutoff,dsick$x[dsick$x>cutoff],cutoff),c(0,dsick$y[dsick$x>cutoff],0) , col="grey90")
} else if ( side == "above" ) {
polygon(c(cutoff,dsick$x[dsick$x<=cutoff],cutoff),c(0,dsick$y[dsick$x<=cutoff],0) , col="grey90")
}
legend("topleft",
legend=(c(as.expression(substitute(alpha~paste("=", a), list(a=round(alpha,3)))),
as.expression(substitute(beta~paste("=", b), list(b=round(beta,3)))))), fill=c("grey65", "grey90"), cex=1.2, bty="n")
abline(v=mean(popsick), lty=3)
abline(v=mean(pophealthy), lty=3)
abline(v=cutoff, lty=1, lwd=1.5)
abline(h=0)
}
#list(specificity=spec, sensitivity=sens, alpha=alpha, beta=beta, power=pow, positiv.predictive=pos.pred, negative.predictive=neg.pred)
c(alpha, beta)
}
Veamos un ejemplo. Suponemos que el nivel medio del marcador sanguíneo entre las personas enfermas es de 100 con una desviación estándar de 10. Entre las personas sanas, el nivel sanguíneo medio es de 140 con una desviación estándar de 15. El médico establece el límite en 120.
alphabeta(mean.sick=100, sd.sick=10, mean.healthy=140, sd.healthy=15, cutoff=120, n=100000, do.plot=TRUE, side="below")
Sick Healthy
Test positive 9764 901
Test negative 236 9099
Usted ve que las áreas sombreadas están en relación entre sí. En este caso, y . Pero, ¿qué sucede si el clínico hubiera establecido el límite de manera diferente? Pongámoslo un poco más bajo, a 105 y veamos qué sucede.α=901/(901+9099)≈0.09β=236/(236+9764)≈0.024
Sick Healthy
Test positive 6909 90
Test negative 3091 9910
Nuestro es muy bajo ahora porque casi ninguna persona sana es diagnosticada como enferma. Pero nuestro ha aumentado, porque las personas enfermas con un alto nivel de marcadores sanguíneos ahora se clasifican falsamente como saludables.αβ
Finalmente, veamos cómo y cambian para diferentes puntos de corte:αβ
cutoffs <- seq(0, 200, by=0.1)
cutoff.grid <- expand.grid(cutoffs)
plot.frame <- apply(cutoff.grid, MARGIN=1, FUN=alphabeta, mean.sick=100, sd.sick=10, mean.healthy=140, sd.healthy=15, n=100000, do.plot=FALSE, side="below")
plot(plot.frame[1,]~cutoffs, type="l", las=1, xlab="Cutoff value", ylab="Alpha/Beta", lwd=2, cex.axis=1.5, cex.lab=1.2)
lines(plot.frame[2,]~cutoffs, col="steelblue", lty=2, lwd=2)
legend("topleft", legend=c(expression(alpha), expression(beta)), lwd=c(2,2),lty=c(1,2), col=c("black", "steelblue"), bty="n", cex=1.2)
Puede ver inmediatamente que la proporción de y no es constante. Lo que también es muy importante es el tamaño del efecto. En este caso, esta sería la diferencia de las medias de los niveles de marcadores sanguíneos entre las personas enfermas y sanas. Cuanto mayor sea la diferencia, más fácil se pueden separar los dos grupos mediante un límite:αβ
Aquí tenemos una prueba "perfecta" en el sentido de que el límite de 150 discrimina a los enfermos de los sanos.
Ajustes de Bonferroni
Los ajustes de Bonferroni reducen el error pero inflan el error tipo II ( ) . Esto significa que el error de tomar una decisión negativa falsa aumenta mientras que los falsos positivos se minimizan. Es por eso que el ajuste de Bonferroni a menudo se llama conservador. En los gráficos anteriores, observe cómo aumentó cuando bajamos el límite de 120 a 105: aumentó de a . Al mismo tiempo, disminuyó de a .αββ0.020.31α0.090.01