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).