βα dan terkait. Saya akan mencoba mengilustrasikan poin dengan tes diagnostik. Katakanlah Anda memiliki tes diagnostik yang mengukur tingkat penanda darah. Diketahui bahwa orang yang memiliki penyakit tertentu memiliki kadar penanda ini lebih rendah dibandingkan dengan orang sehat. Segera jelas bahwa Anda harus memutuskan nilai cutoff, di mana seseorang diklasifikasikan sebagai "sakit" sedangkan orang-orang dengan nilai di atas cutoff ini dianggap sehat. Namun, sangat mungkin bahwa distribusi penanda darah sangat bervariasi bahkan di antara orang yang sakit dan sehat. Beberapa orang sehat mungkin memiliki kadar penanda darah yang sangat rendah, meskipun mereka sangat sehat.β
Ada empat kemungkinan yang dapat terjadi:
- orang sakit diidentifikasi dengan benar sebagai orang sakit (true positive = TP)
- orang sakit secara palsu diklasifikasikan sebagai sehat (false negative = FN)
- orang sehat diidentifikasi dengan benar sebagai sehat (true negative = TN)
- orang yang sehat secara palsu diklasifikasikan sebagai sakit (false positive = FP)
Kemungkinan ini dapat diilustrasikan dengan tabel 2x2 :
Sick Healthy
Test positive TP FP
Test negative FN TN
α = F P / ( F P + T N ) β β = F N / ( T P + F N )α menunjukkan tingkat positif palsu, yaitu . adalah tingkat negatif palsu, yaitu . Saya menulis sebuah skrip sederhana untuk menggambarkan situasi secara grafis.α = 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)
}
Mari kita lihat sebuah contoh. Kami berasumsi bahwa tingkat rata-rata penanda darah di antara orang yang sakit adalah 100 dengan deviasi standar 10. Di antara orang sehat, tingkat darah rata-rata adalah 140 dengan deviasi standar 15. Dokter menetapkan cutoff pada 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
Anda melihat bahwa daerah yang diarsir dalam hubungan satu sama lain. Dalam hal ini, dan . Tetapi apa yang terjadi jika dokter menetapkan cutoff berbeda? Mari kita atur sedikit lebih rendah, ke 105 dan lihat apa yang terjadi.β = 236 / ( 236 + 9764 ) ≈ 0,024α = 901 / ( 901 + 9099 ) ≈ 0,09β= 236 / ( 236 + 9764 ) ≈ 0,024
Sick Healthy
Test positive 6909 90
Test negative 3091 9910
kami sangat rendah sekarang karena hampir tidak ada orang sehat yang didiagnosis sakit. Tetapi telah meningkat, karena orang sakit dengan tingkat penanda darah tinggi sekarang secara palsu diklasifikasikan sebagai sehat.βαβ
Akhirnya, mari kita lihat bagaimana dan berubah untuk cutoff yang berbeda:βαβ
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)
Anda dapat segera melihat bahwa rasio dan tidak konstan. Yang juga sangat penting adalah ukuran efek. Dalam hal ini, ini akan menjadi perbedaan rata-rata kadar penanda darah di antara orang yang sakit dan sehat. Semakin besar perbedaannya, semakin mudah kedua kelompok dapat dipisahkan oleh cutoff:βαβ
Di sini kita memiliki tes "sempurna" dalam arti bahwa batas 150 membedakan orang sakit dari yang sehat.
Penyesuaian Bonferroni
Penyesuaian Bonferroni mengurangi kesalahan tetapi mengembang kesalahan tipe II ( ) . Ini berarti bahwa kesalahan dalam membuat keputusan negatif palsu meningkat sementara positif palsu diminimalkan. Itu sebabnya penyesuaian Bonferroni sering disebut konservatif. Pada grafik di atas, perhatikan bagaimana meningkat ketika kami menurunkan cutoff dari 120 menjadi 105: meningkat dari menjadi . Pada saat yang sama, menurun dari menjadi .β β 0,02 0,31αββ0.020.310,09 0,01α0.090.01