血液検査でのスクリーニング

MikuHatsune2011-04-22

社会医学を学んでいる。
並行して血液病学を学んでいる。
 
テーマとしては医療統計と疫学の講義だった。そのなかで、献血されたものからHIVHCV検査をするのに、ある一定数の検体を混ぜてプールを作り、その混合血を検査するらしいが、ある厚生労働省研究班が1つのプールを500検体から50検体にして感度を上げましょう、と提案した。そのとき、会議の参加者が統計学的にどうにかならんかと言ってきた、というエピソードがあるとかないとか講義中に言われていたので、それを考えてみる。
 
とある自治体で献血が行われ、N個検体が得られた。
そのうち、ウイルス検査陽性の検体がv個だけある。
N個の検体をn個の要素からなるプールに分ける。プールは\frac{N}{n}個できる。
検査は1プールに対して行っても、1検体に行っても費用や手間は変わらない。
ということで回数だけが問題。
検査の感度、特異度は100%である。
つまり、陽性な検体は必ず陽性の結果を得る。陰性な検体は必ず陰性になる。
1プールが陰性なら、そのプールにある検体はすべて陰性と判断し、検査は終了する。
陽性なら、そのプールに含まれる検体すべてを検査し直す。
 
ということでシミュレーション。
血液病学の講義で、HIV検査の重要性が言われていた。
大阪府献血者数HIV陽性割合を用いてみる。

v<- 10
N<- 400000
n<- c(1,2,4,5,
      10,20,40,50,
      100,200,400,500,
      1000,2000,4000,5000,10000)
# どの検体が陽性か適当に作る。
# 陽性は1、陰性は0。
Nn<- rep(0,N)
vp<- sample(1:N,size=v)
Nn[vp]<- 1

# 何回かやった平均にする。
trials<- 20
tests<- matrix(rep(0,length(n)),nr=trials,nc=length(n))
for(t in 1:trials){
for(i in 1:length(n)){
  Nn<- rep(0,N)
  vp<- sample(1:N,size=v)
  Nn[vp]<- 1
  Pool<- matrix(Nn,nc=N/n[i])
  a<- rowSums(Pool)
  tests[t,i]<- sum(a!=0)*(N/n[i]) + n[i]
}
}
plot(n,colMeans(tests),log="xy",type="l",
     frame=FALSE,lwd=3,axes=FALSE,
     xlab="People in One pool",ylab="Test trials [log]")
axis(1)
axis(2,10^(0:6),0:6)
title("Test frequency need to detect viral blood samples")
n[which(colMeans(tests)==min(colMeans(tests)))]

2000検体のプールを作ると回数が最小らしい。

日本全国規模でやると、20000検体くらいがいいらしい。