線虫でがん検査、約85%の確率で特定

という記事を観測した。
詳細はいつもの通り不明だが、記事によると、

がん患者1400人に実施した検査では的中率は約85%に上り、特にステージ0~1の患者は87%で判定できた。一般的ながん検査「腫瘍マーカー」よりかなり高確率という。
反応するのは胃、大腸、肺、乳、膵(すい)臓、肝臓、子宮、前立腺など15種のがん。現時点では検査でがんの部位までは判明しないが、今後は特定も目指す。

ということらしく、あるか、ないかはわかる。そして、がん患者という陽性例に対して検査性能をはかっているので、感度は85%のようである。

こんな話をやっていた。
mikuhatsune.hatenadiary.com
この手の話の場合、たいてい事前確率が低いと事後確率も低い、という話になる。
ここから感度と特異度と事前確率のスクリプトをパクる。

事前確率は日本のがん統計から取ってくる。
ganjoho.jp
2018年度版のがん統計の、incidence(罹患率)はここからの引用らしい。罹患率が事前確率でいいかはこの際置いておく。
www.ncbi.nlm.nih.gov

55歳以下だとせいぜい2%、80歳くらいの高齢者でも6%くらい。
f:id:MikuHatsune:20200117193233p:plain

post <- function(pre, sn, sp){
  res <- array(0, sapply(list(pre, sn, sp), length))
 for(pre1 in seq(pre)){
   for(sn1 in seq(sn)){
     for(sp1 in seq(sp)){
        res[pre1, sn1, sp1] <- (pre[pre1] * sn[sn1]) / (pre[pre1] * sn[sn1] + (1-pre[pre1])*(1-sp[sp1]))
      }
    }
  }
  return(res)
}

incidence <- c(0.2, 0.35, 0.9, 2, 5, 10, 25, 70, 100, 200, 300, 600, 800, 900, 1100, 1200, 1100, 1000)
names(incidence) <- c(sprintf("< %d", seq(5, 85, 5)), "85+")
log_incidence <- log10(incidence)

par(mfrow=c(2, 1), mar=c(4, 5, 2, 2), las=1, cex.lab=1.2)
plot(log_incidence, type="o", pch=15, xaxt="n", yaxt="n", xlab="Age group", ylab="罹患率 10万人あたり", lwd=3)
axis(1, at=seq(incidence), labels=names(incidence))
axis(2, at=0:3, labels=10^(0:3))
abline(h=0:3, lty=3)
title("各年齢層におけるがん罹患率")

txt <- "Cancer Epidemiol. 2014 Oct;38(5):490-5. \nがんの統計’18 "
text(par()$usr[2], par()$usr[3], txt, xpd=TRUE, adj=c(1, -0.5))

p <- post(pre=incidence/100000, sn=0.85, sp=0.85)[,,1]
par(mar=c(5, 5, 2, 2), las=1)
plot(p, type="o", pch=15, xaxt="n", xlab="Age group", ylab="検査結果陽性で本当に癌の確率", lwd=3)
axis(1, at=seq(p), labels=names(incidence))
title("感度 0.85,特異度 0.85 の検査による各年齢層のがん事後確率")