# https://remcat.hatenadiary.jp/entry/20200607/cluster # Encoding: Shift_JIS $\ = "\n"; $, = $" = "\t"; # 区切記号類 # Global variable $Cluster_size = 10; # 10人からなるクラスターが発生 (未発見) # Global variable $Prob_miss_a_case = 0.9; # 感染者見逃しの確率 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); # 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); 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) ) ; 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); print prob_find_case_from(size_of_generation(3)) * prob_reach_cluster_from_generation(3) ; 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; } 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); # 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);