und β sind verwandt. Ich werde versuchen, den Punkt mit einem diagnostischen Test zu veranschaulichen. Angenommen, Sie haben einen diagnostischen Test, der den Spiegel eines Blutmarkers misst. Es ist bekannt, dass Menschen mit einer bestimmten Krankheit im Vergleich zu gesunden Menschen einen geringeren Gehalt an diesem Marker aufweisen. Es ist sofort klar, dass Sie einen Grenzwert festlegen müssen, unter dem eine Person als "krank" eingestuft wird, während Personen mit Werten über diesem Grenzwert als gesund gelten. Es ist sehr wahrscheinlich, aber, dass die Verteilung der bloodmarker wesentlich auch variiertinnerhalbkranken und gesunden Menschen. Einige gesunde Personen haben möglicherweise sehr niedrige Blutmarkerwerte, obwohl sie vollkommen gesund sind. Und einige kranke Menschen haben einen hohen Blutmarker, obwohl sie an der Krankheit leiden.αβ
Es gibt vier Möglichkeiten, die auftreten können:
- Eine kranke Person wird korrekt als krank identifiziert (wahr positiv = TP).
- Eine kranke Person wird fälschlicherweise als gesund eingestuft (falsch negativ = FN).
- Eine gesunde Person wird korrekt als gesund identifiziert (wahr negativ = TN).
- Eine gesunde Person wird fälschlicherweise als krank eingestuft (falsch positiv = FP).
Diese Möglichkeiten können mit einer 2x2-Tabelle veranschaulicht werden :
Sick Healthy
Test positive TP FP
Test negative FN TN
bezeichnet die falsch positive Rate, die α = F P / ( F P + T N ) ist . β ist die falsch negative Rate, die β = F N / ( T P + F N ) ist . Ich habe ein einfachesSkript geschrieben, um die Situation grafisch darzustellen.αα = F.P./ (F.P.+ T.N.)ββ= F.N./ (T.P.+ F.N.)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)
}
Schauen wir uns ein Beispiel an. Wir gehen davon aus, dass der mittlere Blutmarkerwert bei den Kranken 100 mit einer Standardabweichung von 10 beträgt. Bei den gesunden Menschen beträgt der mittlere Blutspiegel 140 mit einer Standardabweichung von 15. Der Kliniker setzt den Grenzwert auf 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
α = 901 / ( 901 + 9099 ) ≈ 0.09β= 236 / ( 236 + 9764 ) ≈ 0,024
Sick Healthy
Test positive 6909 90
Test negative 3091 9910
αβ
αβ
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)
αβ
Hier haben wir einen "perfekten" Test in dem Sinne, dass der Cutoff von 150 die Kranken von den Gesunden unterscheidet.
Bonferroni-Einstellungen
αββ0,020,31α0,090,01