クラスター対策の基本的性質
Science のサイトに Japan ends its COVID-19 state of emergency という記事が掲載されていました。
Then, whereas much of the rest of the world built its response to the pandemic on widespread contact tracing, isolation, and testing, Japan adopted a “quite different” strategy, Oshitani says. “We try to identify the clusters and [determine] their common characteristics.”
http://doi.org/10.1126/science.abd0092
......
They also concluded that most of the primary cases that touched off large clusters were either asymptomatic or had very mild symptoms. “It is impossible to stop the emergence of clusters just by testing many people,” Oshitani says.
-----
Dennis Normile (2020-05-26) Japan ends its COVID-19 state of emergency. Science.
(......は引用時省略。[ ] 内は元記事による。)
これを読むまで私ははっきりとは認識していなかったのですが、Oshitani (=押谷仁) 氏のこの説明によれば、日本のいわゆる「クラスター対策」というのは、社会に偏在する重症化リスクのある者を、いわば検知器としてつかう技法なのですね。クラスターを引き起こす感染者は症状がなかったり軽かったりするので、それを検査して摘発するのはむずかしい。しかしクラスターが連鎖して感染が拡大すればどこかで重症化する患者が出てきてみつかるので、そこからさかのぼって感染連鎖を追えば、事後的にクラスターを見つけることができる、と。
このような対策をとるということは、クラスターを発見するには重症者の発生をまたなければならないことを意味します。これまで、高熱が数日以上つづき、病院に運び込まれて特徴的な症状が確認され、医師が何度も要請してやっと検査が受けられる、といった現状が報じられてきました。そうやって対象を絞り込めば、いわゆる「事前確率」が高いので効率よく感染者がみつけられるのですが、みつかった重症者はかなり高い確率でそのまま死亡してしまうわけです。
重症化リスクの高い人は社会のなかにランダムにちらばっているわけではない、という点にも注意が必要です。人的ネットワークのあちこちに、高齢者や病人の密度の高いところがあるのです。介護施設や病院は典型的な例といえるでしょう。3月以降、介護・医療施設での大量感染が相次ぎ、そこでの死亡者が連日報道されるようになりましたが、感染者の検査と隔離をおこなわず、重症者の発生をまって感染経路を事後的に捜査する方法をとる以上、このような結果になるのは必然でした。
Though acknowledging that the numbers are down, Shibuya still questions the focus on clusters, which did not work well in the big cities and did not prevent outbreaks in hospitals and nursing homes. “The health care system managed to cope with COVID this time,” he says, but it stretched facilities to the point of collapse.
http://doi.org/10.1126/science.abd0092
-----
Dennis Normile (2020-05-26) Japan ends its COVID-19 state of emergency. Science.
Shibuya (=渋谷健司) 氏のこの発言は、クラスター対策と病院・介護施設での大量感染との内在的な関係を意識してのものなのかどうかはわかりません。しかし、以上のような考えに基づくなら、クラスター対策の「成功」(=乏しい検査資源を効率よく使って感染連鎖を特定する) は、重症化リスクの高い人たちの生命を代償に得られたものなのではないかということを考えざるをえません。
2020年6月7日10時54分のNHK記事 https://www3.nhk.or.jp/news/html/20200606/k10012460811000.html によると、これまで日本国内でみつかった感染者17,167人に対して、死亡者は916人なのだそうです。この数字に基づいて計算すると、致命率は5.3%にのぼります。もちろんこれは、検査件数がすくないために分母 (感染者数) が過少であることが大きな要因なのでしょうが、一方で、軽症者/無症状者の検査を積極的におこなって早期隔離する――特に重症者リスクの高い人々が集団でいる場所は重点的に守る――という方針をとっていればなかったような大量の感染が病院や高齢者施設で起こり、それによる死亡が分子 (死亡者数) を押し上げている可能性を考えておくべきでしょう。
実は、「クラスター対策」が喧伝されている割には、クラスターがどこでいくつみつかったのかという精確な数値は公表されていません。しかし、厚生労働大臣が国会で答弁したところによれば、5月10日までに約250件のクラスターを確認しており、そのうち半数以上の142件が医療機関・福祉施設だということです (朝日新聞 2020年5月11日18時08分 https://www.asahi.com/articles/ASN5C5TGQN5CULBJ00G.html)。900人を超える死者数のうち医療機関・福祉施設での感染がどの程度の割合を占めるかは今のところよくわからないのですが、今後あきらかになっていくのでしょうか。
検査数はじゅうぶんだったのか
もうひとつ、気になることとしては、検査を重症者に限ることの、「クラスター対策」の立場からみた合理性です。とにかく感染者がみつからないと感染連鎖をたどれないのですから、本来なら、検査数は多ければ多いほどいいはずです。検査数を絞ることそれ自体には、クラスター対策を阻害する効果があるということになります。もし検査数を絞ることに合理性があったとすれば、それは現状で十分な確率でクラスターを発見できている (したがって増やすことのメリットはあまりないのでその資源は別のことに使ったほうがいい) 場合に限られます。
ということで、重症者だけの検査体制でじゅうぶんなクラスター発見性能が発揮できるものかどうか、Perl で簡単な計算をしてみました。パラメータを適当に割り振って適当に計算しているだけなので、設定をかえれば結果がおおきくかわる可能性がある ことに注意してください。
クラスター第1世代の感染者発見確率
あるところで10人の感染者からなるクラスターが発生した (しかしそれは発見できていない) というところから話をはじめましょう。
$\ = "\n"; $, = $" = "\t"; # 区切記号類 # Global variable $Cluster_size = 10; # 10人からなるクラスターが発生 (未発見)
この10人のなかから、重症化して検査を受け、感染が確認できる人が出てくる確率はどれくらいでしょうか。ここではまず、各感染者について、感染がわかる確率を10%としてみます。逆にいうと、感染がわからないまま経過する確率が90%ということです。
# Global variable $Prob_miss_a_case = 0.9; # 感染者見逃しの確率
ひとりあたりの感染見逃し確率は高いのですが、合計10人いますから、その全員を見逃してしまう確率は、ひとり当たり確率を10乗すればよいことになり、それほど高くはなりません。この値を1から引いて、10人からすくなくともひとりの感染が判明する確率を求めておきましょう。
sub prob_find_case_from { my $size = shift; return 1 - $Prob_miss_a_case ** $size; }
print 'すくなくともひとりの感染が判明する確率'; print '感染者数 1人の場合' , prob_find_case_from (1); print '感染者数 2人の場合' , prob_find_case_from (2); print '感染者数 3人の場合' , prob_find_case_from (3); print '感染者数 5人の場合' , prob_find_case_from (5); print '感染者数 7人の場合' , prob_find_case_from (7); print '感染者数10人の場合' , prob_find_case_from ($Cluster_size);
結果はつぎのようになります。10人の感染者からすくなくともひとりがみつかる確率は65%であることがわかります。
すくなくともひとりの感染が判明する確率 感染者数 1人の場合 0.1 感染者数 2人の場合 0.19 感染者数 3人の場合 0.271 感染者数 5人の場合 0.40951 感染者数 7人の場合 0.5217031 感染者数10人の場合 0.6513215599
このように、クラスターを構成する10人からすくなくともひとりがみつかる確率は0.65ですが、このことと、「クラスター」全体が発見されるかは、また別の問題です。みつかった感染者から1世代前の感染源が特定されてそこからのこりの9人がみつかるか、複数の感染者がたまたま独立にみつかって、行動履歴に共通の場所や行事が「あやしい」となるのか、それとも周辺的な情報から感染が発生しそうな場所を見抜くのか。これらがどれもうまくいかなければ、クラスターは発見されずに終わります。
ここでは、クラスター対策班ががんばって90%の確率で発見するのだと仮定しましょう。そうすると、このクラスターがこの段階でみつかる確率は、0.65 × 0.9 = 0.59 です。
第2世代以降
もっとも、この段階でクラスターを見逃したとしても、まだチャンスはあります。これらの10人から広がった2次感染者のなかから、重症化して発見される人が出てくるからです。
2次感染がどれくらい出るかが問題ですが、感染者ひとりあたり2人の2次感染者が出るものとしておきましょう。このとき、各「世代」の感染者数は、2倍、4倍、8倍……のように増えていきます。
# Global variable $R = 2; # 再生産数 sub size_of_generation { my $g = shift; my $step = $g - 1; return $Cluster_size * ( $R**$step ) ; }
print '世代別感染者数 (クラスター = 世代1)' ; print '世代1', size_of_generation (1); print '世代2', size_of_generation (2); print '世代3', size_of_generation (3); print '世代4', size_of_generation (4);
第1世代が10人なので、その後、20人、40人、80人……と各世代の感染者が増えていきます。
世代別感染者数 (クラスター = 世代1) 世代1 10 世代2 20 世代3 40 世代4 80
各世代において、すくなくとも一人の感染者を発見できる確率は、つぎのようになります。世代があとになるほど感染者が増えていくので、だれかひとりくらいは発見されるようになっていくわけです。
print '各世代においてすくなくともひとりの感染者を発見できる確率' ; print '世代1', prob_find_case_from( size_of_generation(1) ) ; print '世代2', prob_find_case_from( size_of_generation(2) ) ; print '世代3', prob_find_case_from( size_of_generation(3) ) ; print '世代4', prob_find_case_from( size_of_generation(4) ) ; print '世代5', prob_find_case_from( size_of_generation(5) ) ;
各世代においてすくなくともひとりの感染者を発見できる確率 世代1 0.6513215599 世代2 0.878423345409431 世代3 0.985219117058565 世代4 0.999781525499472 世代5 0.999999952268893
ただし、このように感染者がみつかったとしても、そこからさかのぼって接触者を追跡して、第1世代のクラスターを発見できるとは限りません。情報が不足していたり、協力がえられなかったり、検査しても陽性にならなかったりで、うまくいかないことも多いでしょう。そして、そのような問題は、後の世代になるほど大きくなるはずです。
とりあえず、第2世代からは0.5、第3世代からは0.2の確率で、元のクラスターにたどりつけるものとしておきましょう。第4世代よりあとになると、もはやクラスターにはたどりつけない (確率ゼロ) という設定です。
sub prob_reach_cluster_from_generation{ my $g = shift; return 0.9 if $g==1; return 0.5 if $g==2; return 0.2 if $g==3; 0; }
print '各世代のひとりの感染者からクラスターにたどりつける確率'; print '世代1', prob_reach_cluster_from_generation (1); print '世代2', prob_reach_cluster_from_generation (2); print '世代3', prob_reach_cluster_from_generation (3); print '世代4', prob_reach_cluster_from_generation (4);
各世代のひとりの感染者からクラスターにたどりつける確率 世代1 0.9 世代2 0.5 世代3 0.2 世代4 0
上で定義した、第1世代の感染者からクラスターを発見できる確率 (0.9) についても、ここで統一的に
prob_reach_cluster_from_generation(1)
であたえておきます。
さて、第g世代での感染者から第1世代のクラスターが発見されるには、
- 第g世代から感染者が発見され、
- そこから第1世代までさかのぼって感染の連鎖がたどられ、クラスターがみつかる
ことが必要です。
ここで厄介なのは、クラスター対策の前提として、ほとんどの感染者は他人にはうつさず、ごく一部の感染者だけが大量の2次感染を起こすことになっている ことです。たとえば第3世代には40人の感染者がいますが、その人たちからクラスターまでたどる経路は途中でほとんど合流してしまうことになるので、互いに独立でない。かといって完全に同一の経路というわけでもないのですが、そこをちゃんと再現しようとすると大変なので、ここでは、prob_reach_cluster_from_generation() であたえられる確率は、同世代からみつかった感染者全員を総合してクラスターまでさかのぼれる確率である、と考えておくことにします (どのみち、この確率は適当に割り振っているものなので……)。
そうすると、たとえば第3世代からすくなくともひとりの感染者がみつかって、そこからクラスターまでたどれる確率は
print prob_find_case_from(size_of_generation(3)) * prob_reach_cluster_from_generation(3) ;
で求められます。答えは 0.197... になります。
全世代をすべて総合して考えるには、各世代からクラスターにたどりつけない確率をそれぞれ求めて、それらの積をとります。これでクラスターを見逃す確率が出てきます:
sub prob_miss_cluster { my @g = @_; my $ret=1; foreach(@g){ $ret *= 1 - prob_find_case_from(size_of_generation($_)) * prob_reach_cluster_from_generation($_) ; } return $ret; }
各世代および全世代の情報を総合して追跡した場合に元の (第1世代) クラスターを見逃す可能性は、つぎのようになります。
print 'クラスター見逃し確率'; print '第1世代の情報のみ', prob_miss_cluster(1); print '第2世代の情報のみ', prob_miss_cluster(2); print '第3世代の情報のみ', prob_miss_cluster(3); print '全世代の情報を総合', prob_miss_cluster(1..3);
結果はつぎのとおりで、第1-3世代の情報を総合しても、第1世代のクラスターを発見できる確率は81%であり、19%の確率で見逃しが生じることになります。
クラスター見逃し確率 第1世代の情報のみ 0.41381059609 第2世代の情報のみ 0.560788327295285 第3世代の情報のみ 0.802956176588287 全世代の情報を総合 0.186334132387113
というわけで、けっこう見逃しているのではないか、と思えてきますね。まあ判断基準はよくわかりません。専門家がみれば、8割もみつけられれば上等ではないか、ということになるのかもしれません。また、繰り返しになりますが、計算の前提が超適当である ことにはご注意ください。
検査数を増やすとどうなるか
では、検査数を増やして、感染者発見の確率を上げるとどうなるでしょうか。変数 $Prob_miss_a_case を変更して、見逃し確率を0.7まで下げてみましょう。
# Change global variable $Prob_miss_a_case = 0.7; # 感染者見逃しの確率を0.7に変更
print 'クラスター見逃し確率 (検査を拡充した場合)'; print '第1世代の情報のみ', prob_miss_cluster(1); print '第2世代の情報のみ', prob_miss_cluster(2); print '第3世代の情報のみ', prob_miss_cluster(3); print '全世代の情報を総合', prob_miss_cluster(1..3);
結果はつぎのとおり。全世代を総合した時の見逃し確率が5%まで下がります。
クラスター見逃し確率 (検査を拡充した場合) 第1世代の情報のみ 0.12542277241 第2世代の情報のみ 0.500398961331488 第3世代の情報のみ 0.800000127336115 全世代の情報を総合 0.0502091480248197
特筆すべきは第1世代の情報だけでも見逃し確率を13%に抑えられている (つまり87%の確率で発見できる) ということですね。変数を値を変更する前は41%の確率で見逃していましたので、大きく改善できています。つまり、クラスター対策を重視する方針でやっていくにしても、検査を拡充して早めにクラスターを発見できるようにしておいたほうが、見逃した感染者が2次感染、3次感染を広げる (そしてそのなかから一定の割合で死者が出る) ことを抑制できたんじゃないでしょうか、ということになります。
Script
使用した Perl スクリプトを
http://tsigeto.info/covid19/evalcluster.pl.txt
に置きました (日本語文字コードはShift_JISです)。