Right. I finally got around to writing an R function to do this, because this problem has cropped up a few times in the past year:
getPV <- function(prevalence, sensitivity, specificity){
popnTrue <- prevalence;
popnFalse <- (1-prevalence);
popnTruePos <- popnTrue * sensitivity;
popnFalsePos <- popnFalse * (1 - specificity);
popnTrueNeg <- popnTrue * (1 - sensitivity);
popnFalseNeg <- popnFalse * specificity;
ppv <- popnTruePos / (popnTruePos + popnFalsePos);
npv <- popnFalseNeg / (popnTrueNeg + popnFalseNeg);
return(data.frame(prev = prevalence, sens = sensitivity,
spec = specificity, ppv = ppv, npv = npv));
}
NCI tells me that 4% of the US population are cancer survivors, so I'll use that value for the population prevalence:
> prev <- 4 * 0.01;
> sensSpec <- rbind(c(94.8,54.7),c(81,78.7),c(62.1,94)) * 0.01;
> out.df <- NULL;
> for(i in seq_len(dim(sensSpec)[1])){
out.df <- rbind(out.df,getPV(prev, sensSpec[i,1], sensSpec[i,2]));
}
> out.df;
prev sens spec ppv npv
1 0.04 0.948 0.547 0.08020305 0.9960546
2 0.04 0.810 0.787 0.13677812 0.9900409
3 0.04 0.621 0.940 0.30131004 0.9834779
So the best they can do for this test, according to the paper, is a 30% positive predictive value -- if this test comes up positive, there's a 30% chance that you actually have cancer (and that's allowing for 2% of "negative" results actually being cancer).