From 3c0667a191a2ac4177d0913e30ab913ea3e43767 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 9 Oct 2020 20:53:29 +0100 Subject: [PATCH 01/31] add start date check in inputs func --- comoOdeCpp/tests/testthat/v16.2.core.R | 1 + 1 file changed, 1 insertion(+) diff --git a/comoOdeCpp/tests/testthat/v16.2.core.R b/comoOdeCpp/tests/testthat/v16.2.core.R index c66c931..01c6736 100644 --- a/comoOdeCpp/tests/testthat/v16.2.core.R +++ b/comoOdeCpp/tests/testthat/v16.2.core.R @@ -487,6 +487,7 @@ initS<-popstruc[,2]-initE-initI-initCL-initR-initX-initZ-initV-initH-initHC-init inp <- read_excel(file_path, sheet = "Interventions") inputs<-function(inp, run){ # cap intervention end dates with simulation end date + inp$`Date Start` = pmin(stopdate, as.Date(inp$`Date Start`)) inp$`Date End` = pmin(stopdate, as.Date(inp$`Date End`)) tv<-which(inp$`Apply to`==run) From 26abcdff121855535667528254eaadfaee6e6996 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 9 Oct 2020 20:58:31 +0100 Subject: [PATCH 02/31] fix use of global parameters in process_ode_outcome_mortality --- comoOdeCpp/tests/testthat/v16.2.core.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/comoOdeCpp/tests/testthat/v16.2.core.R b/comoOdeCpp/tests/testthat/v16.2.core.R index 01c6736..4231f42 100644 --- a/comoOdeCpp/tests/testthat/v16.2.core.R +++ b/comoOdeCpp/tests/testthat/v16.2.core.R @@ -1659,9 +1659,9 @@ process_ode_outcome_mortality <- function(out_mean, intv_vector, param_used, pri cinc_mort_10 <- cumsum(rowSums(param_used["nu_ventc"]*param_used["pdeath_ventc"]*dexvc_hist*(out_mean[,(VentCindex+1)]%*%ifr[,2]))) cinc_mort_11 <- cumsum(rowSums(param_used["nu_ventc"]*param_used["pdeath_ventc"]*dexvc_hist*(out_mean[,(ICUCVindex+1)]%*%ifr[,2]))) - cinc_mort_14 <- cumsum(rowSums(param_used["nu_ventc"]*parameters["report_death_HC"]*param_used["pdeath_vent_hc"]*(out_mean[,(HCVindex+1)]%*%ifr[,2]))) - cinc_mort_12 <- cumsum(rowSums(param_used["nu_icuc"] *parameters["report_death_HC"]*param_used["propo2"]*param_used["pdeath_icu_hco"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) - cinc_mort_13 <- cumsum(rowSums(param_used["nu_icuc"] *parameters["report_death_HC"]*(1-param_used["propo2"])*param_used["pdeath_icu_hc"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) + cinc_mort_14 <- cumsum(rowSums(param_used["nu_ventc"]*param_used["report_death_HC"]*param_used["pdeath_vent_hc"]*(out_mean[,(HCVindex+1)]%*%ifr[,2]))) + cinc_mort_12 <- cumsum(rowSums(param_used["nu_icuc"] *param_used["report_death_HC"]*param_used["propo2"]*param_used["pdeath_icu_hco"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) + cinc_mort_13 <- cumsum(rowSums(param_used["nu_icuc"] *param_used["report_death_HC"]*(1-param_used["propo2"])*param_used["pdeath_icu_hc"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) cinc_mort_H1 <- cinc_mort_1 + cinc_mort_2 cinc_mort_HC1 <- cinc_mort_3 + cinc_mort_4 + cinc_mort_12 + cinc_mort_13 + cinc_mort_14 From f0bbda2012411c18000d540835c399f6ad5d560b Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 9 Oct 2020 20:59:21 +0100 Subject: [PATCH 03/31] add test for intervention date split --- ...e_CoMoCOVID-19App_new_16.1_intv_split.xlsx | Bin 0 -> 34429 bytes comoOdeCpp/tests/testthat/test-scenario01.R | 83 +++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx diff --git a/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx b/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b25e7da11670e417eead8acd34c7fd32720b8745 GIT binary patch literal 34429 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 Date: Thu, 15 Oct 2020 16:41:47 +0100 Subject: [PATCH 04/31] misc. --- comoOdeCpp/tests/testthat/test-scenario01.R | 34 ++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/comoOdeCpp/tests/testthat/test-scenario01.R b/comoOdeCpp/tests/testthat/test-scenario01.R index 07ae157..ebe124b 100644 --- a/comoOdeCpp/tests/testthat/test-scenario01.R +++ b/comoOdeCpp/tests/testthat/test-scenario01.R @@ -14,6 +14,19 @@ check_libraries <- function() { } } +load_libraries <- function() { + check_libraries() + library("deSolve") + library("dplyr") + library("readxl") + library("comoOdeCpp") +} + +init <- function(e) { + load_libraries() + load("data/data_CoMo.RData", envir = e) +} + check_parameters_list_for_na <- function(parameters_list) { for (pp_name in names(parameters_list)) { if (is.na(parameters_list[[pp_name]])) { @@ -25,16 +38,10 @@ check_parameters_list_for_na <- function(parameters_list) { } test_that("Splitting intervention", { - check_libraries() + # skip("temp skip") rm(list = ls()) + init(e=environment()) - library("deSolve") - library("dplyr") - library("readxl") - library("comoOdeCpp") - - load("data/data_CoMo.RData") - file_path <- paste0(getwd(), "/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx") # if (!exists("inputs", mode = "function")) { @@ -92,17 +99,10 @@ test_that("Splitting intervention", { }) test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { - # skip() + # skip("temp skip") - check_libraries() rm(list = ls()) - - library("deSolve") - library("dplyr") - library("readxl") - library("comoOdeCpp") - - load("data/data_CoMo.RData") + init(e=environment()) file_path <- paste0(getwd(), "/data/Template_CoMoCOVID-19App_new_16.1.xlsx") From 7ae449ded08de42bd64aa8138b9b12280d23daed Mon Sep 17 00:00:00 2001 From: bogaotory Date: Thu, 15 Oct 2020 16:46:07 +0100 Subject: [PATCH 05/31] vectors0 is base, vectors is hype --- comoOdeCpp/tests/testthat/test-scenario01.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/comoOdeCpp/tests/testthat/test-scenario01.R b/comoOdeCpp/tests/testthat/test-scenario01.R index ebe124b..26c9c2b 100644 --- a/comoOdeCpp/tests/testthat/test-scenario01.R +++ b/comoOdeCpp/tests/testthat/test-scenario01.R @@ -54,7 +54,7 @@ test_that("Splitting intervention", { out_base <- ode( y = Y, times = times, method = "euler", hini = 0.05, func = covidOdeCpp, parms = parameters, - input = vectors, A = A, + input = vectors0, A = A, contact_home = contact_home, contact_school = contact_school, contact_work = contact_work, @@ -75,7 +75,7 @@ test_that("Splitting intervention", { out_hype <- ode( y = Y, times = times, method = "euler", hini = 0.05, func = covidOdeCpp, parms = parameters, - input = vectors0 , A = A, + input = vectors , A = A, contact_home = contact_home, contact_school = contact_school, contact_work = contact_work, From 4183e427ca597994f933f1044cbd06f8c7a3efc8 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Thu, 15 Oct 2020 21:23:52 +0100 Subject: [PATCH 06/31] move shared functions to common.R and misc. --- comoOdeCpp/tests/testthat/common.R | 38 +++++++++++++++ comoOdeCpp/tests/testthat/test-scenario01.R | 54 +++------------------ 2 files changed, 44 insertions(+), 48 deletions(-) create mode 100644 comoOdeCpp/tests/testthat/common.R diff --git a/comoOdeCpp/tests/testthat/common.R b/comoOdeCpp/tests/testthat/common.R new file mode 100644 index 0000000..7d58544 --- /dev/null +++ b/comoOdeCpp/tests/testthat/common.R @@ -0,0 +1,38 @@ + +CORE_FILE <- "/v16.2.core.R" + +check_libraries <- function() { + library_list <- list( + "deSolve", + "dplyr", + "readxl" + ) + for (ll in library_list) { + if (!requireNamespace(ll, quietly = TRUE)) { + testthat::skip(paste(ll, "needed but not available")) + } + } +} + +load_libraries <- function() { + check_libraries() + library("deSolve") + library("dplyr") + library("readxl") + library("comoOdeCpp") +} + +init <- function(e) { + load_libraries() + load("data/data_CoMo.RData", envir = e) +} + +check_parameters_list_for_na <- function(parameters_list) { + for (pp_name in names(parameters_list)) { + if (is.na(parameters_list[[pp_name]])) { + print(paste0("parameters_list[\"",pp_name, "\"] = ", parameters_list[[pp_name]]), quote = FALSE) + expect_equal(is.na(parameters_list[[pp_name]]), FALSE) + stop() + } + } +} diff --git a/comoOdeCpp/tests/testthat/test-scenario01.R b/comoOdeCpp/tests/testthat/test-scenario01.R index 26c9c2b..e645c57 100644 --- a/comoOdeCpp/tests/testthat/test-scenario01.R +++ b/comoOdeCpp/tests/testthat/test-scenario01.R @@ -1,45 +1,8 @@ -CORE_FILE <- "/v16.2.core.R" - -check_libraries <- function() { - library_list <- list( - "deSolve", - "dplyr", - "readxl" - ) - for (ll in library_list) { - if (!requireNamespace(ll, quietly = TRUE)) { - testthat::skip(paste(ll, "needed but not available")) - } - } -} - -load_libraries <- function() { - check_libraries() - library("deSolve") - library("dplyr") - library("readxl") - library("comoOdeCpp") -} - -init <- function(e) { - load_libraries() - load("data/data_CoMo.RData", envir = e) -} - -check_parameters_list_for_na <- function(parameters_list) { - for (pp_name in names(parameters_list)) { - if (is.na(parameters_list[[pp_name]])) { - print(paste0("parameters_list[\"",pp_name, "\"] = ", parameters_list[[pp_name]]), quote = FALSE) - expect_equal(is.na(parameters_list[[pp_name]]), FALSE) - stop() - } - } -} - test_that("Splitting intervention", { # skip("temp skip") rm(list = ls()) + source(paste0(getwd(), "/common.R"), local = environment()) init(e=environment()) file_path <- paste0(getwd(), "/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx") @@ -67,7 +30,7 @@ test_that("Splitting intervention", { mort_col = mort ) ) - processed_base_results <- process_ode_outcome_mortality(out_base, vectors, parameters) + processed_base_results <- process_ode_outcome_mortality(out_base, vectors0, parameters) covidOdeCpp_reset() @@ -88,7 +51,7 @@ test_that("Splitting intervention", { mort_col = mort ) ) - processed_hype_results <- process_ode_outcome_mortality(out_hype, vectors0, parameters) + processed_hype_results <- process_ode_outcome_mortality(out_hype, vectors, parameters) expect_equal( processed_base_results$total_cm_deaths_end, @@ -99,9 +62,10 @@ test_that("Splitting intervention", { }) test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { - # skip("temp skip") + skip("temp skip") rm(list = ls()) + source(paste0(getwd(), "/common.R"), local = environment()) init(e=environment()) file_path <- paste0(getwd(), "/data/Template_CoMoCOVID-19App_new_16.1.xlsx") @@ -110,13 +74,7 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { source(paste0(getwd(), CORE_FILE), local = environment()) } - for (pp_name in names(parameters)) { - if (is.na(parameters[[pp_name]])) { - print(paste0("parameters[\"",pp_name, "\"] = ", parameters[[pp_name]]), quote = FALSE) - expect_equal(is.na(parameters[[pp_name]]), FALSE) - stop() - } - } + check_parameters_list_for_na(parameters) # environment(check_mortality_count) <- environment() From 15186a6dc48e52244e94a0432f23b344f1e9ba4c Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 01:07:23 +0100 Subject: [PATCH 07/31] fix split date template --- ...e_CoMoCOVID-19App_new_16.1_intv_split.xlsx | Bin 34429 -> 34455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx b/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx index b25e7da11670e417eead8acd34c7fd32720b8745..e2e714d8136a670b74bb4933a1f1228d623cddbe 100644 GIT binary patch delta 5860 zcmVR=DXO09AfM+60+xE4}XIeIDA;Q|HL zF(p{773Amy7A=e0n~b-VYXeV4w_uzE8+ekkl(#wBIoDE*E#E=IY~&rvi(73P=70Rv zRJdjQlU0BdLgu&u#{_c>cfhb6iRg?Jd_=ZirtSfPW2m74Go9m3*@6$^=ssFG8V`p|J71J61EqG)ytNU_|ii9L2 zBr|_XvY_dl67t^ly{hjr4iC+_`+vlkgh^5+DJ3yYW)tECQ1rR4|3&c)vtR?uN(FLe z(p8g_Fis|a>u=jO5Wv3=*#E!@8L$DV^|1VqVY{#`t1Z??u&mu@My6vSlBiL1)by|4 zkrZX?;Z??l8AxQ`9q;kuk)kwz{WXcvGhul|(}iIVECZ1=q`N46To|AK2wqJMlyjW! za7m3Ko0(>R9v(=7^8w9B3YtA-3Fh#VJ(_vO z2;Rv-No+cnH8v9*rH1k_V|{$k{XPnbPs3wEQm&jZ5@Qbe=Z7fEwYRUkUjB9r7f`Ft z=PX5EX)1rV+sZGALPm4C=Yx3MWpvdw;n3h?b0kS71;hSU5Y2ss!jpbap39~MRc9}7N) zxtyDo%`O7aqB{^H`-QQxXMt@C6KU}!B1L}o9f8Yx5|faV9ki2yzEPUohd74TvF*{> z?~kG};!-M_>4DNG;qDy_v_zKDjR=fG9zBzP4T-^gZ9|9Vf5}|L_bOL0ROfx3RUjMi zj-egd<73RB;6I}sKR{$_Fdd$K3~ll|E#8vo@xZ}mG?+lv^vL5VCGW{IiNV3b7>U3k zjiGkBe<51rgc6Lp_e1zB{{&gax{|LNDmU@axh%W!Hzqy`i=(PY6`}~>8XzPL|1i) z_EFO)+gU7-<($z1!R8@mAj4v7vu9&y$WRDZLMnC89XUv!m+r`(o6o{gX|wLKaq2dk zE}LQ9##c7b6jiLzxNfrTFqza%f_5Z-$2(8)!A#Kobn>3V7NyD{muU^omp>NU9F$9h2 zX|5#dtx{f~;a*2W2kJosHn$EMLfW9wZ05DH(Y?`LDRsSPHG0R_F*;X@QeL1jx{ihp zbWY=xOl_sWZrwpcNWVuz*=QPnt!g(leaF6`V|3C`$_q5c*U`{{de9Je{r0{gqzxLa zeM8w)G+O&cP48NE>GxG}?OjyI z=%k^P7idhcqoD)!py74W5Yh&X)-I}SG>!Hy+R%?0cW7V75Hwo5s8U{kpy6FdLkH?X zLmuYa%^}6#<53z_K$-<_ng*@=N)@IPNvXZS#I~-3QpM^+1!8tA8Tm*csE9`oaTZ;d z61S3US`xoCN<6-)ZWD)JdHPdNd+PAJgCp=497k{!kJKon#}tlT0&`u3_)7*)b#at) z1K~KP#X836lR7saXz?z8&5ry7$#eWD9{wOE2)B$;Ruig6xxhie5Ctv@CMcMqz(av; z!JmzS(JTPkV2~Y46PqoChk^+^nZ~A>|zjBY5_N$GVI#%qgIJAiN+1 zUPb)dLVO4LL*%>2pCEsVd=L3h2+RWVM>D@x2rST3=H)kMX^wm znxYl-M+a_sxZd7~Th=M-|1~=Yt%hjjqLl|ZT4*(zt!g}VW9Urbtnv?;Hd2QN`3xHM z17?pAbbU-?sH7N36S48&7>5LMh}$38x{TQ057%(^pQ1y6ZM`_u7AK96MpXr zKV~Sy&~W$BH?Yt3HCifv59-ClaxPY^-T`SEATC;cEmSoP(>o>ErPo2MgTzSSfC)~J!KW+8Sx-G-;7s1l?@29Q5U(efcRHKJgR`;V*YVxUwU7 z8{T&|>(H^68zfqJoqo4F>a1+nZ(W@G+tqv(ZHz^*^`mKPC_XayUw&GGaN|+S;LXi~ zCCGB~-JgtCe}46Xn zx4UOu%d*CkkvZ-TOmj4v)F4H8e>-i>;a?a2mCY{--LDQB=v0>W%X8r^)nkN~suVF> z%8tR2vy1(O-kQ(#{KedQ07eP7I2<&Ap~*dHrG4qhOCYxYWx2T8vw%V<_jZ=iB_Jx>e(%?Z}>@X5vb z+KwV8^yl!#h+khnt)Y_lVL;k~5b5ye3ZA|X?WbO!b#HnEo4|9ID8>DZjvtsQZsX5f zf9X6rFg6{r(L#sFsw>wXHZTrP#|{I_npkFUGVJ$86J9^mD?tw=uqK1?pgSIa4EroG zRVY9bLTu=Q9O?6Y%Y?6|pKZl=sx=~oyJ56~MM=9ZdqA0B;=UJ(lPZW&8%_rec^gl_p zHXB{d>#9tNuFr%to1uU?k=r0#!rHtMFN^nZR)l|caqc;H5kNR}?;r4gcNDA<&_NUh zD|oSV?fbyDJ$TtkD3aeu35)u$em`xkoTa;6L9={r&fZ2ryhhr=$E5Z(Xh4bsgaF}) z_@y_m(cq4bRohUsuOS?FX0b12Ggiq#Lulqu21kvDkAsUw!>JU)9PpwjC=x>+$3TPX zP>&`}Mh|S4%x;Vxr)ScC>@wKidX5PGxC%*^0%!`*rb$K8CLu7;ra9D<;9Hs^6F!;z zCkBM@IOI)Crp2&H+LF8!8}qV{KUmVKj9EajYsvxwg&_+lbahNZgPT#Qv1B`iBpI|x zj~^!n2*U{zc`_`LvU(0np=?E{6qlw;fx0dw6nZWt1PVi{TuLZ^bZwa!P1Rg}4k)0| z(~+>y)R9o=>L|l@2QT}gU)0RRQTSmTOc@>-3*0kQWH;kLz?$b{FF%COgK@9E=qb?bz4wh5E*V4q&Hx-xzL z&U5emm4kcLKn(VO$fq!foJGX8g?2$~*eAyy!QG;fyTI*r3!rd9mfRli_6ym=O^1n; zW>cl4rUZeTX-XnwA4bs46jJgx%&oovDFOA(l#)2SvHm79!rE{{4M{=SZ!9Q@DNWcu z+)PZuG=#|KQsBVSYF@81hdvVfl{X-kUA##TZ!pZ8uwuhVNREUCkr+v`B*l8hpHFCnADrmlttcn|s-Vamq#J5q!< zwqnCHp4d_fa5Qqx5WLP}s82gb36+>RbA+s*M&lj+?C@$ai3NmG#^z!Y6OB@2%txm* zD?j-DlDi$Vu{AFaY?MxK7)}QW&Um$@D754*QI7h5noAFoPo+%NFzX@+V&h^}`4Rv@ zMD8~=arMSHz$jcJ(U3&1E#5MTpq{iS z|8r=6udkg)7%uaTE_v(mL=Sj*gdRhT|KgM+8$}*KCFLORS#?d7ovV^LXtYHpLJHaf z_0X2bI8>Uef+o~b@|KhIqiX@FZ9tA*+tq;QI9YPK6#`7jJMczN&m-F28@yTn6xi?~ z2;E-*G`KH@ZGdX+Zj>=9jnV@Ij5qG=N(csj>}aMA$wOsX@!-8h1Tx3L@c^rp?bgZ# zF2l{02>Bd0OSs$349dKnjpb7Egche0!V5wpuWv6~{4&5M`4*5@S=NU!wO-pz@n01J zm+rB$ge)yR6m&~_tLfT0^Bs$&_22=>E5nfm*&-g%WD{wlgw%3p8Mczr)Ug400Pf>Q{1QL2Yp7lMt zd3pfqkXamHsLA`#^Z?nW`j+zx4RueEBl&8+wD^zj+dK%~Li=e%VD1&OB?D+{dzvosUtsG$ylyT?w%pxm)2l-I5 zCHYw|i=tg|X%iMR$?;+N@UU3=H1J~RY3m~%?Da^sd%JZ#xYtRnWo8LR-9H#@hiRoCkjF8ZGP!e_}SC$tQ zQt-m!neZCpdF3o&pJ*otu_h#cgzPfHEFsknB;>vuEQM&De>wk5Y#tfQD)M9&zQ##mxs<0##61>a}!nRDO zl%~>o)RX|Mm{LXxY$#Rm1}EY5eMuTa7qc=0~MUE16a}(ykvav>%_Cx z``b2JZzDk>0|V@$U^3f(h9P|I){`KTk)aGUs*->{yA&W*39eCBaQg^1I|xoP9w0R+ z2!8U3LI4@+9{`7f;z#(NFZc>EL)aQ1N~!pT*ICQKmoY82o{g7IB=WIS(5XVOO;5q? zFF_#S08vC4@yp7yj1uvL-5_2m6`XTbu$f&wu07kgqab`TaI=kn5K@N4P#MSxPXTnc zIX+blHchH{2CJ2A{HyzK!ApjQl88b>bn<`&s^U=Tw`(_o3!&mH18JI4z@a;pfH8Eb zi~|`W%82}j9r}n6YDe6pO+p{~8wJC8;CaE%&^7%C-vSVN&`l-s;{IMju1r&j7eo>s z$asP6{|cTn^nzf2BV$GB?Ae2}_$qat0~sTbwG@14LKN5>$QcBTtDyYkgjmuE8D*3x zJ-2H=86hkN(#>{IltwmO7sf8N5mhO8dgT+zoznb^klkVkUq&+a5VcQyBzHbi)v&;AI z=T^7ho&5%ig2b z5WTOo|G{e^^;DAZ4I)(C(h3e+p{2_nD-%1!s$)mC!^gkxIN5>;mp#Q}`^|eZ^Wy2l zF&AjhwBbs|IBJI&F_|dJB|=FS;}bLZVfOvo^q};|R;dpJ38aZ} zW^FME0+VDcC#J0mCgCJiIwux?LcI%2p&6kjW6b6v=!D@Q$O)IY&M?vclS8E`PuN@~ zWzM9nlV~Q01^Fi9g~79F$_3lh6(Ld-uOtWEM}d(b#y(SS8I5rlLUmx5jXp-YEPj?; z!0EUfc5pB|7rD|9xN0|?9n59lh3LQ~RfoTv+APMMZZCu$)_V)acbSEMwnDM6Y037t zQySyZFv2M1+Ss*gM*Bp_(Qwm@?rkKfYKSP!hx$O zOSxp!{VCVcKc~GPh0NRUFI+$!a{@jF8@V4SA!7aIJD63*DP`_28Nsu=D;;&scRyN> zt!UDEX>|wFz#|1IUIY>#Z?e+JeJV@$di_o{|KRJ{nSBD2QG6P+AA79?0s528e?S2r zlMaA00Yj5QfRh9nEO|nc*?`9ZYm=dYHUW~8*nvj@C6ge6CnuBcC>Yrc003)o000dD z0000000031AOHXWAzAjiRV(p8hQ1%z?}2E2a&0002yj3b8t delta 5831 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 Rsg$!HgmMA~qJIDY008Z{@LT`@ From 8d0ce9fee4126e83087183ca3f93a3c50f584d7c Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 01:08:29 +0100 Subject: [PATCH 08/31] move matrix comparison function to common.R --- comoOdeCpp/tests/testthat/common.R | 46 +++++++++++++++++++ comoOdeCpp/tests/testthat/test-scenario01.R | 50 +++++++-------------- 2 files changed, 62 insertions(+), 34 deletions(-) diff --git a/comoOdeCpp/tests/testthat/common.R b/comoOdeCpp/tests/testthat/common.R index 7d58544..b706864 100644 --- a/comoOdeCpp/tests/testthat/common.R +++ b/comoOdeCpp/tests/testthat/common.R @@ -36,3 +36,49 @@ check_parameters_list_for_na <- function(parameters_list) { } } } + +match_outputs <-function( + outputA, # output matrix #1 + outputB, # output matrix #2 + tlr = 0.0001, # tolerance + smp = 1000 # num samples to take + ) { + + for (ii in 1:smp) { + rr = sample(1:nrow(outputA),1) + cc = sample(1:ncol(outputA),1) + # print(paste("outputA[rr,cc] =", outputA[rr,cc])) + # print(paste("outputB[rr,cc] =", outputB[rr,cc])) + + outA = outputA[rr,cc] + outB = outputB[rr,cc] + + expect_true(is.numeric(outA)) + expect_true(is.numeric(outB)) + + expect_gte(outA, 0) # >=0 + expect_gte(outB, 0) # >=0 + + if (outA > 0) { + + res = expect_equal( + outB, + outA, + tolerance = 0.0001, + scale = outA + ) + + if(abs(outB-outA)>outA*0.0001){ + print(paste( + "not equal: rr=", rr, + ", cc=", cc, + ", pp=", pp, + ", outputA[rr,cc]", outA, + ", outputB[rr,cc]", outB + )) + } + + } + } + +} diff --git a/comoOdeCpp/tests/testthat/test-scenario01.R b/comoOdeCpp/tests/testthat/test-scenario01.R index e645c57..54e4f60 100644 --- a/comoOdeCpp/tests/testthat/test-scenario01.R +++ b/comoOdeCpp/tests/testthat/test-scenario01.R @@ -58,11 +58,17 @@ test_that("Splitting intervention", { processed_hype_results$total_cm_deaths_end ) + match_outputs( + outputA = out_base, + outputB = out_hype, + tlr = 0.0001, + smp = 100 + ) }) test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { - skip("temp skip") + # skip("temp skip") rm(list = ls()) source(paste0(getwd(), "/common.R"), local = environment()) @@ -78,7 +84,7 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { # environment(check_mortality_count) <- environment() - p_value_list = seq(0.0, 0.1, by = 0.02) + p_value_list = seq(0.0, 0.1, by = 0.025) # p_value_list = seq(0.1, 0.1) scenario_list <- list( @@ -125,7 +131,7 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { expect_equal( processed_cpp_results$total_reportable_deaths_end, processed_cpp_results$total_cm_deaths_end, - tolerance = 0.01, + tolerance = 0.1, scale = processed_cpp_results$total_cm_deaths_end ) @@ -143,7 +149,7 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { expect_equal( processed_r_results$total_reportable_deaths_end, processed_r_results$total_cm_deaths_end, - tolerance = 0.01, + tolerance = 0.1, scale = processed_r_results$total_cm_deaths_end ) @@ -177,36 +183,12 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { # write.csv(out_cpp, paste0("out_cpp_",sss,"_",parameters["p"],".csv"),row.names = FALSE) # write.csv(out_r, paste0("out_r_",sss,"_",parameters["p"],".csv"),row.names = FALSE) - for (ii in 1:1000) { - rr = sample(1:nrow(out_r),1) - cc = sample(1:ncol(out_r),1) - # print(paste("out_r[rr,cc] =", out_r[rr,cc])) - # print(paste("out_cpp[rr,cc] =", out_cpp[rr,cc])) - - expect_gte(out_r[rr,cc], 0) # >=0 - expect_gte(out_cpp[rr,cc], 0) # >=0 - - if (out_r[rr,cc] > 0) { - - res = expect_equal( - out_cpp[rr,cc], - out_r[rr,cc], - tolerance = 0.0001, - scale = out_r[rr,cc] - ) - - if(abs(out_cpp[rr,cc]-out_r[rr,cc])>out_r[rr,cc]*0.0001){ - print(paste( - "not equal: rr=", rr, - ", cc=", cc, - ", pp=", pp, - ", out_r[rr,cc]", out_r[rr,cc], - ", out_cpp[rr,cc]", out_cpp[rr,cc] - )) - } - - } - } + match_outputs( + outputA = out_r, + outputB = out_cpp, + tlr = 0.0001, + smp = 1000 + ) } } From d5e81b50fdcd4320aa5585425dbb63de21509ee1 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 01:27:29 +0100 Subject: [PATCH 09/31] put comparisons between processed outputs in match_processed_outputs in commom.R --- comoOdeCpp/tests/testthat/common.R | 28 +++++++++++++++++++-- comoOdeCpp/tests/testthat/test-scenario01.R | 28 +++++++++++++-------- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/comoOdeCpp/tests/testthat/common.R b/comoOdeCpp/tests/testthat/common.R index b706864..c003c25 100644 --- a/comoOdeCpp/tests/testthat/common.R +++ b/comoOdeCpp/tests/testthat/common.R @@ -64,11 +64,11 @@ match_outputs <-function( res = expect_equal( outB, outA, - tolerance = 0.0001, + tolerance = tlr, scale = outA ) - if(abs(outB-outA)>outA*0.0001){ + if(abs(outB-outA)>outA*tlr){ print(paste( "not equal: rr=", rr, ", cc=", cc, @@ -82,3 +82,27 @@ match_outputs <-function( } } + +match_processed_outputs <- function( + outputA, # processed output matrix + outputB, # processed output matrix + tlr = 0.0001 # tolerance + ) { + + expect_true(is.numeric(outputA$total_cm_deaths_end)) + expect_true(is.numeric(outputA$total_reportable_deaths_end)) + + expect_equal( + outputA$total_cm_deaths_end, + outputB$total_cm_deaths_end, + tolerance = tlr, + scale = outputB$total_cm_deaths_end + ) + + expect_equal( + outputA$total_reportable_deaths_end, + outputB$total_reportable_deaths_end, + tolerance = tlr, + scale = outputB$total_reportable_deaths_end + ) +} diff --git a/comoOdeCpp/tests/testthat/test-scenario01.R b/comoOdeCpp/tests/testthat/test-scenario01.R index 54e4f60..2bef007 100644 --- a/comoOdeCpp/tests/testthat/test-scenario01.R +++ b/comoOdeCpp/tests/testthat/test-scenario01.R @@ -153,19 +153,25 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { scale = processed_r_results$total_cm_deaths_end ) - expect_equal( - processed_cpp_results$total_cm_deaths_end, - processed_r_results$total_cm_deaths_end, - tolerance = 0.0001, - scale = processed_r_results$total_cm_deaths_end - ) - expect_equal( - processed_cpp_results$total_reportable_deaths_end, - processed_r_results$total_reportable_deaths_end, - tolerance = 0.0001, - scale = processed_r_results$total_reportable_deaths_end + match_processed_outputs( + outputA = processed_cpp_results, + outputB = processed_r_results, + tlr = 0.0001 ) + # expect_equal( + # processed_cpp_results$total_cm_deaths_end, + # processed_r_results$total_cm_deaths_end, + # tolerance = 0.0001, + # scale = processed_r_results$total_cm_deaths_end + # ) + # expect_equal( + # processed_cpp_results$total_reportable_deaths_end, + # processed_r_results$total_reportable_deaths_end, + # tolerance = 0.0001, + # scale = processed_r_results$total_reportable_deaths_end + # ) + # print(paste("processed_r$total_reported_deaths_end=", processed_r$total_reported_deaths_end)) # print(paste("processed_r$total_deaths_end=", processed_r$total_deaths_end)) From e6bd6705b65553420319f71ebda8d4c17b5f2d69 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 01:44:03 +0100 Subject: [PATCH 10/31] add test for the sensitivity of *_eff parameters on Interventions Param tab --- .../Template_CoMoCOVID-19App_new_16.1_sa.xlsx | Bin 0 -> 35570 bytes comoOdeCpp/tests/testthat/test-sensitivity.R | 116 ++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_sa.xlsx create mode 100644 comoOdeCpp/tests/testthat/test-sensitivity.R diff --git a/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_sa.xlsx b/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_sa.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3b9df617798ddffdb7cdf34bd9b1ac066841419a GIT binary patch literal 35570 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 Date: Fri, 23 Oct 2020 01:45:04 +0100 Subject: [PATCH 11/31] add read_intervention_schedule function with test --- comoOdeCpp/R/io.R | 103 ++++++++++++++++++ comoOdeCpp/tests/testthat/test_io_functions.R | 102 +++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 comoOdeCpp/R/io.R create mode 100644 comoOdeCpp/tests/testthat/test_io_functions.R diff --git a/comoOdeCpp/R/io.R b/comoOdeCpp/R/io.R new file mode 100644 index 0000000..a3d97fe --- /dev/null +++ b/comoOdeCpp/R/io.R @@ -0,0 +1,103 @@ +#' Read the "Interventions" tab of the template into a list of time-series vectors +#' +#' This function is to provide the same functionality of the inputs function that's part of the como App +#' which is to translate the information from the Excel spreadsheet to a list of time-series vectors controlling +#' the actions of different interventions during the course of the simulation +#' @return A list of vectors including those listed as `val_vec` and `bol_vec` in `intv_profile_list` +#' @export +read_intervention_schedule <- function( + inp, # read_excel(file_path, sheet = "Interventions") + run, # 'Baseline (Calibration)' or 'Hypothetical Scenario' + time_max, # tail(times,1) + steps_per_time, # 20 <- 1/hini; hini = 0.05 + startdate, # Date, Simulation Start, "Parameters" tab + stopdate, # Date, Simulation End, "Parameters" tab + age_testing_min, # "Interventions Param" tab + age_testing_max, # "Interventions Param" tab + age_vaccine_min, # "Interventions Param" tab + age_vaccine_max # "Interventions Param" tab + ) { + + inp[["Date Start"]] = pmax(startdate, as.Date(inp[["Date Start"]])) + inp[["Date End"]] = pmax(startdate, as.Date(inp[["Date End"]])) + + # cap intervention end dates with simulation end date + inp[["Date Start"]] = pmin(stopdate, as.Date(inp[["Date Start"]])) + inp[["Date End"]] = pmin(stopdate, as.Date(inp[["Date End"]])) + + v<-(format(as.POSIXct(inp[["Date Start"]],format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) + v2<-as.Date(v,format="%d/%m/%y") + inp[["Date Start"]]<-v2 + + v<-(format(as.POSIXct(inp[["Date End"]],format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) + v2<-as.Date(v,format="%d/%m/%y") + inp[["Date End"]]<-v2 + + inp <- arrange(inp, `Date Start`) + + tv<-which(inp[["Apply to"]]==run) + + intv_profile_list <- list( + list(text="Self-isolation if Symptomatic" , val_vec="si_vector" , val_default=0, bol_vec="isolation" ), + list(text="Screening (when S.I.)" , val_vec="scr_vector" , val_default=0, bol_vec="screen" ), + list(text="Social Distancing" , val_vec="sd_vector" , val_default=0, bol_vec="distancing" ), + list(text="Handwashing" , val_vec="hw_vector" , val_default=0, bol_vec="handwash" ), + list(text="Masking" , val_vec="msk_vector" , val_default=0, bol_vec="masking" ), + list(text="Working at Home" , val_vec="wah_vector" , val_default=0, bol_vec="workhome" ), + list(text="School Closures" , val_vec="sc_vector" , val_default=0, bol_vec="schoolclose" ), + list(text="Shielding the Elderly" , val_vec="cte_vector" , val_default=0, bol_vec="cocoon" ), + list(text="Household Isolation (when S.I.)" , val_vec="q_vector" , val_default=0, bol_vec="quarantine" ), + list(text="International Travel Ban" , val_vec="tb_vector" , val_default=0, bol_vec="travelban" ), + list(text="Vaccination" , val_vec="vc_vector" , val_default=0, bol_vec="vaccine" ), + list(text="Mass Testing" , val_vec="mt_vector" , val_default=0, bol_vec="masstesting" ), + list(text="Age Testing Minimum" , val_vec="minas_vector" , val_default=age_testing_min ), + list(text="Age Testing Maximum" , val_vec="maxas_vector" , val_default=age_testing_max ), + list(text="Age Vaccine Minimum" , val_vec="minav_vector" , val_default=age_vaccine_min ), + list(text="Age Vaccine Maximum" , val_vec="maxav_vector" , val_default=age_vaccine_max ), + list(text="Dexamethasone" , bol_vec="dex" ) + ) + + intv_vectors <- list() + + for (intv in intv_profile_list) { + # print(intv[["text"]]) + + # default vectors + ii_val_vec <- rep(0, time_max * steps_per_time) + if(!is.null( intv[["val_default"]] )){ + ii_val_vec <- rep(intv[["val_default"]], time_max * steps_per_time) + } + ii_bol_vec <- rep(0, time_max * steps_per_time) + + ii_rows <- intersect(which(inp[["Intervention"]]==intv[["text"]]),tv) + + if (length(ii_rows) >= 1) { + for(rr in ii_rows) { + + t1 <- inp[["Date Start"]][rr]-startdate + t2 <- inp[["Date End"]][rr]-startdate + + stopifnot(t1 >= 0) + stopifnot(t2 >= 0) + + if (t1 < t2) { + idx1 = t1*steps_per_time+1 + idx2 = t2*steps_per_time + ii_val_vec[idx1:idx2] = inp[["Value"]][rr] + ii_bol_vec[idx1:idx2] = 1 + } + + } + } + + if (!is.null( intv[["val_vec"]] )) { + intv_vectors[[ intv[["val_vec"]] ]] <- ii_val_vec + } + if (!is.null( intv[["bol_vec"]] )) { + intv_vectors[[ intv[["bol_vec"]] ]] <- ii_bol_vec + } + + } + + return(intv_vectors) +} \ No newline at end of file diff --git a/comoOdeCpp/tests/testthat/test_io_functions.R b/comoOdeCpp/tests/testthat/test_io_functions.R new file mode 100644 index 0000000..cb17f1c --- /dev/null +++ b/comoOdeCpp/tests/testthat/test_io_functions.R @@ -0,0 +1,102 @@ +test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como App", { + # skip("temp skip") + rm(list = ls()) + source(paste0(getwd(), "/common.R"), local = environment()) + init(e=environment()) + + file_path <- paste0(getwd(), "/data/Template_CoMoCOVID-19App_new_16.1_sa.xlsx") + + if (!exists("inputs", mode = "function")) { + source(paste0(getwd(), CORE_FILE), local = environment()) + } + + intv_schd_base <- read_intervention_schedule( + inp = read_excel(file_path, sheet = "Interventions"), + run = "Baseline (Calibration)", + time_max = tail(times,1), + steps_per_time = 20, + startdate = startdate, + stopdate = stopdate, + age_testing_min = parameters["age_testing_min"], + age_testing_max = parameters["age_testing_max"], + age_vaccine_min = parameters["age_vaccine_min"], + age_vaccine_max = parameters["age_vaccine_max"] + ) + + intv_schd_hype <- read_intervention_schedule( + inp = read_excel(file_path, sheet = "Interventions"), + run = "Hypothetical Scenario", + time_max = tail(times,1), + steps_per_time = 20, + startdate = startdate, + stopdate = stopdate, + age_testing_min = parameters["age_testing_min"], + age_testing_max = parameters["age_testing_max"], + age_vaccine_min = parameters["age_vaccine_min"], + age_vaccine_max = parameters["age_vaccine_max"] + ) + + + check_parameters_list_for_na(parameters) + + parameters["p"] <- 0.05 + + input_list <- list( + vectors0, + intv_schd_base, + vectors, + intv_schd_hype + ) + + output_list <- list() + output_processed_list <- list() + + cc <- 0 + for (ii in input_list) { + + + covidOdeCpp_reset() + output_message <- capture_output( + output <- ode( + y = Y, times = times, method = "euler", hini = 0.05, + func = covidOdeCpp, parms = parameters, + input = ii, A = A, + contact_home = contact_home, + contact_school = contact_school, + contact_work = contact_work, + contact_other = contact_other, + popbirth_col2 = popbirth[, 2], + popstruc_col2 = popstruc[, 2], + ageing = ageing, + ifr_col2 = ifr[, 2], + ihr_col2 = ihr[, 2], + mort_col = mort + ) + ) + output_processed <- process_ode_outcome_mortality(output, ii, parameters) + + cc <- cc+1 + output_list[[cc]] <- output + output_processed_list[[cc]] <- output_processed + + } + + for (ii in c(1,3) ) { + + match_processed_outputs( + outputA = output_processed_list[[ii]], + outputB = output_processed_list[[ii+1]], + tlr = 0.0001 + ) + + match_outputs( + outputA = output_list[[ii]], + outputB = output_list[[ii+1]], + tlr = 0.0001, + smp = 100 + ) + + } + + + }) \ No newline at end of file From 8c7bb27ed60c5cd7895a5810354d32e1f11c95c8 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 02:03:56 +0100 Subject: [PATCH 12/31] ignore warning with travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index e736472..b740e0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: r r: 3.6.3 cache: packages +warnings_are_errors: false r_packages: - covr From 3f3ad6cfc4872b0246ff2ff69b89d7db972dfc9d Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 17:00:24 +0100 Subject: [PATCH 13/31] add option to patch 1 day gap between intervention lines, (matching App v16.2.2 behaviour) --- comoOdeCpp/R/io.R | 61 +- comoOdeCpp/tests/testthat/common.R | 3 +- .../tests/testthat/v16.2.core.input_mod.R | 2193 +++++++++++++++++ 3 files changed, 2231 insertions(+), 26 deletions(-) create mode 100644 comoOdeCpp/tests/testthat/v16.2.core.input_mod.R diff --git a/comoOdeCpp/R/io.R b/comoOdeCpp/R/io.R index a3d97fe..fc2d10f 100644 --- a/comoOdeCpp/R/io.R +++ b/comoOdeCpp/R/io.R @@ -15,16 +15,10 @@ read_intervention_schedule <- function( age_testing_min, # "Interventions Param" tab age_testing_max, # "Interventions Param" tab age_vaccine_min, # "Interventions Param" tab - age_vaccine_max # "Interventions Param" tab + age_vaccine_max, # "Interventions Param" tab + FILL_1DAY_GAP = TRUE ) { - inp[["Date Start"]] = pmax(startdate, as.Date(inp[["Date Start"]])) - inp[["Date End"]] = pmax(startdate, as.Date(inp[["Date End"]])) - - # cap intervention end dates with simulation end date - inp[["Date Start"]] = pmin(stopdate, as.Date(inp[["Date Start"]])) - inp[["Date End"]] = pmin(stopdate, as.Date(inp[["Date End"]])) - v<-(format(as.POSIXct(inp[["Date Start"]],format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) v2<-as.Date(v,format="%d/%m/%y") inp[["Date Start"]]<-v2 @@ -33,28 +27,37 @@ read_intervention_schedule <- function( v2<-as.Date(v,format="%d/%m/%y") inp[["Date End"]]<-v2 + + inp[["Date Start"]] = pmax(startdate, as.Date(inp[["Date Start"]])) + inp[["Date End"]] = pmax(startdate, as.Date(inp[["Date End"]])) + + # cap intervention end dates with simulation end date + inp[["Date Start"]] = pmin(stopdate, as.Date(inp[["Date Start"]])) + inp[["Date End"]] = pmin(stopdate, as.Date(inp[["Date End"]])) + + inp <- arrange(inp, `Date Start`) tv<-which(inp[["Apply to"]]==run) intv_profile_list <- list( - list(text="Self-isolation if Symptomatic" , val_vec="si_vector" , val_default=0, bol_vec="isolation" ), - list(text="Screening (when S.I.)" , val_vec="scr_vector" , val_default=0, bol_vec="screen" ), - list(text="Social Distancing" , val_vec="sd_vector" , val_default=0, bol_vec="distancing" ), - list(text="Handwashing" , val_vec="hw_vector" , val_default=0, bol_vec="handwash" ), - list(text="Masking" , val_vec="msk_vector" , val_default=0, bol_vec="masking" ), - list(text="Working at Home" , val_vec="wah_vector" , val_default=0, bol_vec="workhome" ), - list(text="School Closures" , val_vec="sc_vector" , val_default=0, bol_vec="schoolclose" ), - list(text="Shielding the Elderly" , val_vec="cte_vector" , val_default=0, bol_vec="cocoon" ), - list(text="Household Isolation (when S.I.)" , val_vec="q_vector" , val_default=0, bol_vec="quarantine" ), - list(text="International Travel Ban" , val_vec="tb_vector" , val_default=0, bol_vec="travelban" ), - list(text="Vaccination" , val_vec="vc_vector" , val_default=0, bol_vec="vaccine" ), - list(text="Mass Testing" , val_vec="mt_vector" , val_default=0, bol_vec="masstesting" ), - list(text="Age Testing Minimum" , val_vec="minas_vector" , val_default=age_testing_min ), - list(text="Age Testing Maximum" , val_vec="maxas_vector" , val_default=age_testing_max ), - list(text="Age Vaccine Minimum" , val_vec="minav_vector" , val_default=age_vaccine_min ), - list(text="Age Vaccine Maximum" , val_vec="maxav_vector" , val_default=age_vaccine_max ), - list(text="Dexamethasone" , bol_vec="dex" ) + list(text="Self-isolation if Symptomatic" , val_vec="si_vector" , val_default=0, bol_vec="isolation" ), + list(text="(*Self-isolation) Screening" , val_vec="scr_vector" , val_default=0, bol_vec="screen" ), + list(text="(*Self-isolation) Household Isolation" , val_vec="q_vector" , val_default=0, bol_vec="quarantine" ), + list(text="Social Distancing" , val_vec="sd_vector" , val_default=0, bol_vec="distancing" ), + list(text="Handwashing" , val_vec="hw_vector" , val_default=0, bol_vec="handwash" ), + list(text="Mask Wearing" , val_vec="msk_vector" , val_default=0, bol_vec="masking" ), + list(text="Working at Home" , val_vec="wah_vector" , val_default=0, bol_vec="workhome" ), + list(text="School Closures" , val_vec="sc_vector" , val_default=0, bol_vec="schoolclose" ), + list(text="Shielding the Elderly" , val_vec="cte_vector" , val_default=0, bol_vec="cocoon" ), + list(text="International Travel Ban" , val_vec="tb_vector" , val_default=0, bol_vec="travelban" ), + list(text="Vaccination" , val_vec="vc_vector" , val_default=0, bol_vec="vaccine" ), + list(text="(*Vaccination) Age Vaccine Minimum" , val_vec="minav_vector" , val_default=age_vaccine_min ), + list(text="(*Vaccination) Age Vaccine Maximum" , val_vec="maxav_vector" , val_default=age_vaccine_max ), + list(text="Mass Testing" , val_vec="mt_vector" , val_default=0, bol_vec="masstesting" ), + list(text="(*Mass Testing) Age Testing Minimum" , val_vec="minas_vector" , val_default=age_testing_min ), + list(text="(*Mass Testing) Age Testing Maximum" , val_vec="maxas_vector" , val_default=age_testing_max ), + list(text="Dexamethasone" , bol_vec="dex" ) ) intv_vectors <- list() @@ -72,11 +75,17 @@ read_intervention_schedule <- function( ii_rows <- intersect(which(inp[["Intervention"]]==intv[["text"]]),tv) if (length(ii_rows) >= 1) { + prev_t2 <- -10 for(rr in ii_rows) { t1 <- inp[["Date Start"]][rr]-startdate t2 <- inp[["Date End"]][rr]-startdate + if (FILL_1DAY_GAP && (t1 == (prev_t2+1))) { + t1 <- t1-1 + } + prev_t2 = t2 + stopifnot(t1 >= 0) stopifnot(t2 >= 0) @@ -98,6 +107,8 @@ read_intervention_schedule <- function( } } + + intv_vectors[["mt_vector"]] <- intv_vectors[["mt_vector"]]*1000 return(intv_vectors) } \ No newline at end of file diff --git a/comoOdeCpp/tests/testthat/common.R b/comoOdeCpp/tests/testthat/common.R index c003c25..fd587d7 100644 --- a/comoOdeCpp/tests/testthat/common.R +++ b/comoOdeCpp/tests/testthat/common.R @@ -1,5 +1,6 @@ -CORE_FILE <- "/v16.2.core.R" +# CORE_FILE <- "/v16.2.core.R" +CORE_FILE <- "/v16.2.core.input_mod.R" check_libraries <- function() { library_list <- list( diff --git a/comoOdeCpp/tests/testthat/v16.2.core.input_mod.R b/comoOdeCpp/tests/testthat/v16.2.core.input_mod.R new file mode 100644 index 0000000..080dd61 --- /dev/null +++ b/comoOdeCpp/tests/testthat/v16.2.core.input_mod.R @@ -0,0 +1,2193 @@ +# require("deSolve") +# library("ggplot2") +# library("dplyr") +# library("reshape2") +# require(gridExtra) +# library(ggpubr) +# library(bsplus) +# library(deSolve) +# library(DT) +# library(highcharter) +# library(lubridate) +# library(pushbar) +# library(readxl) +# library(reshape2) +# library(scales) +# library(shiny) +# library(shinyBS) +# library(shinycssloaders) +# library(shinyhelper) +# library(shinythemes) +# library(shinyWidgets) +# library(tidyverse) +# library(XLConnect) +# # library("comoOdeCpp") + +# #read data from excel file +# setwd("C:/covid19/covid_age") +# load("data_CoMo.RData") +# file_path <- paste0(getwd(),"/Template_CoMoCOVID-19App_new.xlsx") +country_name<-"United Kingdom of Great Britain" +# fit_mat <- read.table("fit_mat.txt",header = T) + + +# Cases +dta <- read_excel(file_path, sheet = "Cases") +names(dta) <- c("date", "cases", "deaths") + +cases_rv <- dta %>% + mutate(date = as.Date(date), cumulative_death = cumsum(deaths)) %>% + as.data.frame() + +# Severity/Mortality +dta <- read_excel(file_path, sheet = "Severity-Mortality") +names(dta) <- c("age_category", "ifr", "ihr") + +mort_sever_rv <- dta %>% + mutate(ihr = ihr/100) %>% # starting unit should be % - scaling to a value between 0 and 1 + mutate(ifr = ifr/max(ifr)) # scaling to a value between 0 and 1 + +# Population +dta <- read_excel(file_path, sheet = "Population") +names(dta) <- c("age_category", "pop", "birth", "death") + +population_rv <- dta %>% + transmute(country = NA, age_category, pop, birth, death) + +# Parameters +param <- bind_rows(read_excel(file_path, sheet = "Parameters"), + read_excel(file_path, sheet = "Country Area Param"), + read_excel(file_path, sheet = "Virus Param"), + read_excel(file_path, sheet = "Hospitalisation Param"), + read_excel(file_path, sheet = "Interventions Param"), + read_excel(file_path, sheet = "Interventions")) %>% + mutate(Value_Date = as.Date(Value_Date)) + +# START Bridge ---- +popstruc <- population_rv %>% + select(age_category, pop) %>% + rename(agefloor = age_category) %>% + as.data.frame() + +popbirth <- population_rv %>% + select(age_category, birth) %>% + as.data.frame() # unit should be per person per day + +mort <- population_rv %>% + pull(death) # unit should be per person per day + +ihr <- mort_sever_rv %>% + select(age_category, ihr) %>% + as.data.frame() + +ifr <- mort_sever_rv %>% + select(age_category, ifr) %>% + as.data.frame() + + +######### POP AGEING +# per year ageing matrix +A<-length(popstruc[,2]) +dd<-seq(1:A)/seq(1:A) +ageing <- t(diff(diag(dd),lag=1)/(5*365.25)) +ageing<-cbind(ageing,0*seq(1:A)) # no ageing from last compartment + +# +# pop<-population$country==country_name +# pp<-population$pop[pop] +### CONTACT MATRICES +c_home <- contact_home[[country_name]] %>% as.matrix() +c_school <- contact_school[[country_name]] %>% as.matrix() +c_work <- contact_work[[country_name]] %>% as.matrix() +c_other <- contact_other[[country_name]] %>% as.matrix() +nce <-A-length(c_home[1,]) + +contact_home<-matrix(0,nrow=A,ncol=A) +contact_school<-matrix(0,nrow=A,ncol=A) +contact_work<-matrix(0,nrow=A,ncol=A) +contact_other<-matrix(0,nrow=A,ncol=A) + +for (i in 1:(A-nce)){ + for (j in 1:(A-nce)){ + contact_home[i,j]<-c_home[i,j] + contact_school[i,j]<-c_school[i,j] + contact_work[i,j]<-c_work[i,j] + contact_other[i,j]<-c_other[i,j] + } +} + +for (i in (A+1-nce):A){ + for (j in 1:(A-nce)){ + contact_home[i,j]<-c_home[(A-nce),j] + contact_school[i,j]<-c_school[(A-nce),j] + contact_work[i,j]<-c_work[(A-nce),j] + contact_other[i,j]<-c_other[(A-nce),j] + } +} +for (i in 1:(A-nce)){ + for (j in (A+1-nce):A){ + contact_home[i,j]<-c_home[i,(A-nce)] + contact_school[i,j]<-c_school[i,(A-nce)] + contact_work[i,j]<-c_work[i,(A-nce)] + contact_other[i,j]<-c_other[i,(A-nce)] + } +} +for (i in (A+1-nce):A){ + for (j in (A+1-nce):A){ + contact_home[i,j]<-c_home[(A-nce),(A-nce)] + contact_school[i,j]<-c_school[(A-nce),(A-nce)] + contact_work[i,j]<-c_work[(A-nce),(A-nce)] + contact_other[i,j]<-c_other[(A-nce),(A-nce)] + } +} + + + +######### INITIALISE SIMULATION/INTERVENTION START TIMES +startdate <- param$Value_Date[param$Parameter == "date_range_simul_start"] +stopdate <- param$Value_Date[param$Parameter == "date_range_simul_end"] +startdate <- startdate[1] +stopdate <- stopdate[1] + + +day_start <- as.numeric(startdate-startdate) +day_stop <- as.numeric(stopdate-startdate) +times <- seq(day_start, day_stop) + +tin<-as.numeric(startdate-as.Date("2020-01-01"))/365.25 +initP<-sum(popstruc[,2]) # population size +ageindcase<-20 # age of index case (years) +aci <- floor((ageindcase/5)+1) # age class of index case + + +############# DEFINE PARAMETERS +parameters <- c( + + ### Transmission instrinsic + p = param$Value[param$Parameter=="p"][1], + rho = param$Value[param$Parameter=="rho"][1], + omega = param$Value[param$Parameter=="omega"][1], + gamma = param$Value[param$Parameter=="gamma"][1], + nui = param$Value[param$Parameter=="nui"][1], + report = param$Value[param$Parameter=="report"][1], + reportc = param$Value[param$Parameter=="reportc"][1], + reporth = param$Value[param$Parameter=="reporth"][1], + beds_available = param$Value[param$Parameter=="beds_available"][1], + icu_beds_available = param$Value[param$Parameter=="icu_beds_available"][1], + ventilators_available = param$Value[param$Parameter=="ventilators_available"][1], + give = 95, + pdeath_h = mean( param$Value[param$Parameter=="pdeath_h"],na.rm=T), + pdeath_ho = mean( param$Value[param$Parameter=="pdeath_ho"],na.rm=T), + pdeath_hc = mean( param$Value[param$Parameter=="pdeath_hc"],na.rm=T), + pdeath_hco = mean( param$Value[param$Parameter=="pdeath_hco"],na.rm=T), + pdeath_icu = mean( param$Value[param$Parameter=="pdeath_icu"],na.rm=T), + pdeath_icuo = mean( param$Value[param$Parameter=="pdeath_icuo"],na.rm=T), + pdeath_icuc = mean( param$Value[param$Parameter=="pdeath_icuc"],na.rm=T), + pdeath_icuco = mean( param$Value[param$Parameter=="pdeath_icuco"],na.rm=T), + pdeath_vent = mean( param$Value[param$Parameter=="pdeath_vent"],na.rm=T), + pdeath_ventc = mean( param$Value[param$Parameter=="pdeath_ventc"],na.rm=T), + ihr_scaling = param$Value[param$Parameter=="ihr_scaling"][1], + nus = param$Value[param$Parameter=="nus"][1], + nusc = param$Value[param$Parameter=="nus"][1], # nusc = nus + nu_icu = param$Value[param$Parameter=="nu_icu"][1], + nu_icuc = param$Value[param$Parameter=="nu_icu"][1], # nu_icuc = nu_icu + nu_vent = param$Value[param$Parameter=="nu_vent"][1], + nu_ventc = param$Value[param$Parameter=="nu_vent"][1], # nu_ventc = nu_vent + rhos = param$Value[param$Parameter=="rhos"][1], + amp = param$Value[param$Parameter=="amp"][1], + phi = param$Value[param$Parameter=="phi"][1], + pclin = param$Value[param$Parameter=="pclin"][1], + prob_icu = param$Value[param$Parameter=="prob_icu"][1], + prob_vent = param$Value[param$Parameter=="prob_vent"][1], + propo2 = param$Value[param$Parameter=="propo2"][1], + dexo2 = mean( param$Value[param$Parameter=="dexo2"],na.rm=T), + dexo2c = mean( param$Value[param$Parameter=="dexo2c"],na.rm=T), + dexv = mean( param$Value[param$Parameter=="dexvc"],na.rm=T), + dexvc = mean( param$Value[param$Parameter=="dexvc"],na.rm=T), + vent_dex = mean(param$Value[param$Parameter=="vent_dex"],na.rm=T), + prob_icu_v = mean(param$Value[param$Parameter=="prob_icu_v"],na.rm=T), + prob_icu_vr = mean(param$Value[param$Parameter=="prob_icu_vr"],na.rm=T), + prob_icu_r = mean(param$Value[param$Parameter=="prob_icu_r"],na.rm=T), + prob_v_v = mean(param$Value[param$Parameter=="prob_v_v"],na.rm=T), + prob_v_vr = mean(param$Value[param$Parameter=="prob_v_vr"],na.rm=T), + prob_v_r = mean(param$Value[param$Parameter=="prob_v_r"],na.rm=T), + pclin_v = mean(param$Value[param$Parameter=="pclin_v"],na.rm=T), + pclin_vr = mean(param$Value[param$Parameter=="pclin_vr"],na.rm=T), + pclin_r = mean(param$Value[param$Parameter=="pclin_r"],na.rm=T), + sigmaEV = mean(param$Value[param$Parameter=="sigmaEV"],na.rm=T), + sigmaEVR = mean(param$Value[param$Parameter=="sigmaEVR"],na.rm=T), + sigmaER = mean(param$Value[param$Parameter=="sigmaER"],na.rm=T), + sigmaR = mean(param$Value[param$Parameter=="sigmaR"],na.rm=T), + vac_dur = mean(param$Value[param$Parameter=="vac_dur"],na.rm=T), + vac_dur_r = mean(param$Value[param$Parameter=="vac_dur_r"],na.rm=T), + report_natdeathI = mean(param$Value[param$Parameter=="report_natdeathI"],na.rm=T), + report_natdeathCL = mean(param$Value[param$Parameter=="report_natdeathCL"],na.rm=T), + pre = mean(param$Value[param$Parameter=="pre"],na.rm=T), + report_v = param$Value[param$Parameter=="report_v"][1], + report_cv = param$Value[param$Parameter=="report_cv"][1], + report_vr = param$Value[param$Parameter=="report_vr"][1], + report_cvr = param$Value[param$Parameter=="report_cvr"][1], + report_r = param$Value[param$Parameter=="report_r"][1], + report_cr = param$Value[param$Parameter=="report_cr"][1], + reporth_ICU = param$Value[param$Parameter=="reporth_ICU"][1], + report_death_HC = param$Value[param$Parameter=="report_death_HC"][1], + pdeath_vent_hc = mean( param$Value[param$Parameter=="pdeath_vent_hc"],na.rm=T), + pdeath_icu_hc = mean( param$Value[param$Parameter=="pdeath_icu_hc"],na.rm=T), + pdeath_icu_hco = mean( param$Value[param$Parameter=="pdeath_icu_hco"],na.rm=T), + reporth_g = param$Value[param$Parameter=="reporth_g"][1], + seroneg = param$Value[param$Parameter=="seroneg"][1], + + ### INTERVENTIONS + # self isolation + selfis_eff = mean(param$Value[param$Parameter=="selfis_eff"],na.rm=T), + # social distancing + dist_eff = mean(param$Value[param$Parameter=="dist_eff"],na.rm=T), + # hand washing + hand_eff = mean(param$Value[param$Parameter=="hand_eff"],na.rm=T), + # mask wearing + mask_eff = mean(param$Value[param$Parameter=="mask_eff"],na.rm=T), + # working at home + work_eff = mean(param$Value[param$Parameter=="work_eff"],na.rm=T), + w2h = mean(param$Value[param$Parameter=="w2h"],na.rm=T), + # school closures + school_eff = mean(param$Value[param$Parameter=="school_eff"],na.rm=T), + s2h = mean(param$Value[param$Parameter=="s2h"],na.rm=T), + # cocooning the elderly + cocoon_eff = mean(param$Value[param$Parameter=="cocoon_eff"],na.rm=T), + age_cocoon = mean(param$Value[param$Parameter=="age_cocoon"],na.rm=T), + # vaccination campaign + # vaccine_on = as.numeric(param$Value_Date[param$Parameter=="date_vaccine_on"] - startdate), + vaccine_eff = mean(param$Value[param$Parameter=="vaccine_eff"],na.rm=T), + vaccine_eff_r = mean(param$Value[param$Parameter=="vaccine_eff_r"],na.rm=T), + age_vaccine_min = mean(param$Value[param$Parameter=="age_vaccine_min"],na.rm=T), + age_vaccine_max = mean(param$Value[param$Parameter=="age_vaccine_max"],na.rm=T), + # vaccine_cov = param$Value[param$Parameter=="vaccine_cov"], + vac_campaign = mean(param$Value[param$Parameter=="vac_campaign"],na.rm=T), + # travel ban + mean_imports = mean(param$Value[param$Parameter=="mean_imports"],na.rm=T), + # screening + screen_test_sens = mean(param$Value[param$Parameter=="screen_test_sens"],na.rm=T), + # screen_contacts = mean(param$Value[param$Parameter=="screen_contacts"],na.rm=T), + screen_overdispersion = mean(param$Value[param$Parameter=="screen_overdispersion"],na.rm=T), + # voluntary home quarantine + quarantine_days = mean(param$Value[param$Parameter=="quarantine_days"],na.rm=T), + quarantine_effort = mean(param$Value[param$Parameter=="quarantine_effort"],na.rm=T), + quarantine_eff_home = mean(param$Value[param$Parameter=="quarantine_eff_home"],na.rm=T), + quarantine_eff_other = mean(param$Value[param$Parameter=="quarantine_eff_other"],na.rm=T), + # mass testing + age_testing_min = mean(param$Value[param$Parameter=="age_testing_min"],na.rm=T), + age_testing_max = mean(param$Value[param$Parameter=="age_testing_max"],na.rm=T), + mass_test_sens = mean(param$Value[param$Parameter=="mass_test_sens"],na.rm=T), + isolation_days = mean(param$Value[param$Parameter=="isolation_days"],na.rm=T), + + ### Initialisation + init = param$Value[param$Parameter=="init"][1], + + ### Others + household_size = param$Value[param$Parameter=="household_size"][1], + noise = param$Value[param$Parameter=="noise"][1], + iterations = param$Value[param$Parameter=="iterations"][1], + confidence = param$Value[param$Parameter=="confidence"][1] +) +ihr[,2]<- parameters["ihr_scaling"]*ihr[,2] +parameters["ifr_correction_young"]<-1 +parameters["ifr_correction_old"]<-1 +# ifr[1:12,2]<-ifr[1:12,2]/ifr_correction_young +# ihr$ihr[15:21]<-ihr$ihr[15:21]*ifr_correction_old + +ifr[1:12,2]<-ifr[1:12,2]/parameters["ifr_correction_young"] +ihr$ihr[15:21]<-ihr$ihr[15:21]*parameters["ifr_correction_old"] + +# Scale parameters to percentages/ rates +parameters["rho"]<-parameters["rho"]/100 +parameters["omega"]<-(1/(parameters["omega"]*365)) +parameters["gamma"]<-1/parameters["gamma"] +parameters["nui"]<-1/parameters["nui"] +parameters["report"]<-parameters["report"]/100 +parameters["reportc"]<-parameters["reportc"]/100 +parameters["report_v"]<-parameters["report_v"]/100 +parameters["report_cv"]<-parameters["report_cv"]/100 +parameters["report_vr"]<-parameters["report_vr"]/100 +parameters["report_cvr"]<-parameters["report_cvr"]/100 +parameters["report_r"]<-parameters["report_r"]/100 +parameters["report_cr"]<-parameters["report_cr"]/100 +parameters["reporth"]<-parameters["reporth"]/100 +parameters["nus"]<-1/parameters["nus"] +parameters["rhos"]<-parameters["rhos"]/100 +parameters["amp"]<-parameters["amp"]/100 +parameters["selfis_eff"]<-parameters["selfis_eff"]/100 +parameters["dist_eff"]<-parameters["dist_eff"]/100 +parameters["hand_eff"]<-parameters["hand_eff"]/100 +parameters["mask_eff"]<-parameters["mask_eff"]/100 +parameters["work_eff"]<-parameters["work_eff"]/100 +parameters["w2h"]<-parameters["w2h"]/100 +parameters["school_eff"]<-parameters["school_eff"]/100 +parameters["s2h"]<-parameters["s2h"]/100 +parameters["cocoon_eff"]<-parameters["cocoon_eff"]/100 +parameters["age_cocoon"]<-floor((parameters["age_cocoon"]/5)+1) +parameters["vaccine_eff"]<-parameters["vaccine_eff"]/100 +parameters["vaccine_eff_r"]<-parameters["vaccine_eff_r"]/100 +age_vaccine_min<-(parameters["age_vaccine_min"]) +age_vaccine_max<-(parameters["age_vaccine_max"]) +# parameters["vaccine_cov"]<-parameters["vaccine_cov"]/100 +# parameters["vac_campaign"]<-parameters["vac_campaign"]*7 +parameters["screen_test_sens"]<-parameters["screen_test_sens"]/100 +parameters["quarantine_days"]<-parameters["quarantine_days"] +parameters["quarantine_effort"]<-1/parameters["quarantine_effort"] +parameters["quarantine_eff_home"]<-parameters["quarantine_eff_home"]/-100 +parameters["quarantine_eff_other"]<-parameters["quarantine_eff_other"]/100 +parameters["give"]<-parameters["give"]/100 +parameters["pdeath_h"]<-parameters["pdeath_h"]/100 +parameters["pdeath_ho"]<-parameters["pdeath_ho"]/100 +parameters["pdeath_hc"]<-parameters["pdeath_hc"]/100 +parameters["pdeath_hco"]<-parameters["pdeath_hco"]/100 +parameters["pdeath_icu"]<-parameters["pdeath_icu"]/100 +parameters["pdeath_icuo"]<-parameters["pdeath_icuo"]/100 +parameters["pdeath_icuc"]<-parameters["pdeath_icuc"]/100 +parameters["pdeath_icuco"]<-parameters["pdeath_icuco"]/100 +parameters["pdeath_vent"]<-parameters["pdeath_vent"]/100 +parameters["pdeath_ventc"]<-parameters["pdeath_ventc"]/100 +parameters["nusc"]<-1/parameters["nusc"] +parameters["nu_icu"]<-1/parameters["nu_icu"] +parameters["nu_icuc"]<-1/parameters["nu_icuc"] +parameters["nu_vent"]<-1/parameters["nu_vent"] +parameters["nu_ventc"]<-1/parameters["nu_ventc"] +parameters["pclin"]<-parameters["pclin"]/100 +parameters["prob_icu"]<-parameters["prob_icu"]/100 +parameters["prob_vent"]<-parameters["prob_vent"]/100 +iterations<-parameters["iterations"] +noise<-parameters["noise"] +confidence<-parameters["confidence"]/100 +parameters["mass_test_sens"]<-parameters["mass_test_sens"]/100 +age_testing_min<-(parameters["age_testing_min"]) +age_testing_max<-(parameters["age_testing_max"]) +parameters["isolation_days"]<-parameters["isolation_days"] +parameters["propo2"]<-parameters["propo2"]/100 +parameters["dexo2"]<-parameters["dexo2"]/100 +parameters["dexo2c"]<-parameters["dexo2c"]/100 +parameters["dexv"]<-parameters["dexv"]/100 +parameters["dexvc"]<-parameters["dexvc"]/100 +parameters["vent_dex"]<-parameters["vent_dex"]/100 +parameters["prob_icu_v"]<-parameters["prob_icu_v"]/100 +parameters["prob_icu_vr"]<-parameters["prob_icu_vr"]/100 +parameters["prob_icu_r"]<-parameters["prob_icu_r"]/100 +parameters["prob_v_v"]<-parameters["prob_v_v"]/100 +parameters["prob_v_r"]<-parameters["prob_v_r"]/100 +parameters["prob_v_vr"]<-parameters["prob_v_vr"]/100 +parameters["pclin_v"]<-parameters["pclin_v"]/100 +parameters["pclin_vr"]<-parameters["pclin_vr"]/100 +parameters["pclin_r"]<-parameters["pclin_r"]/100 +parameters["sigmaEV"]<-parameters["sigmaEV"]/100 +parameters["sigmaER"]<-parameters["sigmaER"]/100 +parameters["sigmaEVR"]<-parameters["sigmaEVR"]/100 +parameters["sigmaR"]<-parameters["sigmaR"]/100 +parameters["vac_dur"]<-1/parameters["vac_dur"]/100 +parameters["vac_dur_r"]<-1/parameters["vac_dur_r"]/100 +parameters["report_natdeathI"]<-parameters["report_natdeathI"]/100 +parameters["report_natdeathCL"]<-parameters["report_natdeathCL"]/100 +parameters["report_death_HC"]<-parameters["report_death_HC"]/100 +parameters["reporth_ICU"]<-parameters["reporth_ICU"]/100 +parameters["pre"]<-parameters["pre"]/100 +parameters["pdeath_vent_hc"]<-parameters["pdeath_vent_hc"]/100 +parameters["pdeath_icu_hc"]<-parameters["pdeath_icu_hc"]/100 +parameters["pdeath_icu_hco"]<-parameters["pdeath_icu_hco"]/100 +parameters["reporth_g"]<-parameters["reporth_g"]/100 +parameters["seroneg"]<-(1/parameters["seroneg"]) + + +parameters_noise <- c("p", "rho", "omega", "gamma", "nui", "ihr_scaling","nus", "nu_icu","nu_vent", + "rhos", "selfis_eff", "dist_eff", "hand_eff", "mask_eff", "work_eff", + "w2h", "school_eff", "s2h", "cocoon_eff", "mean_imports", "screen_overdispersion", + "quarantine_effort", "quarantine_eff_home", "quarantine_eff_other") + +# parameters_fit <- c("p", "ihr_scaling","ifr_correction_young","ifr_correction_old","init") +# parameters_fit <- rownames(fit_mat) +########################################################################### +# Define the indices for each variable +Sindex<-1:A +Eindex<-(A+1):(2*A) +Iindex<-(2*A+1):(3*A) +Rindex<-(3*A+1):(4*A) +Xindex<-(4*A+1):(5*A) +Hindex<-(5*A+1):(6*A) +HCindex<-(6*A+1):(7*A) +Cindex<-(7*A+1):(8*A) +CMindex<-(8*A+1):(9*A) +Vindex<-(9*A+1):(10*A) +QSindex<-(10*A+1):(11*A) +QEindex<-(11*A+1):(12*A) +QIindex<-(12*A+1):(13*A) +QRindex<-(13*A+1):(14*A) +CLindex<-(14*A+1):(15*A) +QCindex<-(15*A+1):(16*A) +ICUindex<-(16*A+1):(17*A) +ICUCindex<-(17*A+1):(18*A) +ICUCVindex<-(18*A+1):(19*A) +Ventindex<-(19*A+1):(20*A) +VentCindex<-(20*A+1):(21*A) +CMCindex<-(21*A+1):(22*A) +Zindex<-(22*A+1):(23*A) +EVindex<-(23*A+1):(24*A) +ERindex<-(24*A+1):(25*A) +EVRindex<-(25*A+1):(26*A) +VRindex<-(26*A+1):(27*A) +QVindex<-(27*A+1):(28*A) +QEVindex<-(28*A+1):(29*A) +QEVRindex<-(29*A+1):(30*A) +QERindex<-(30*A+1):(31*A) +QVRindex<-(31*A+1):(32*A) +HCICUindex<-(32*A+1):(33*A) +HCVindex<-(33*A+1):(34*A) +Abindex<-(34*A+1):(35*A) + +########################################################################### +# MODEL INITIAL CONDITIONS +initI<-0*popstruc[,2] # Infected and symptomatic +initE<-0*popstruc[,2] # Incubating +# initE[aci]<-1 # place random index case in E compartment +initE[aci]<-round(sum(popstruc[,2])/parameters["init"]) # place random index case in E compartment +initR<-parameters["pre"]*popstruc[,2] # Immune +initX<-0*popstruc[,2] # Isolated +initV<-0*popstruc[,2] # Vaccinated +initQS<-0*popstruc[,2] # quarantined S +initQE<-0*popstruc[,2] # quarantined E +initQI<-0*popstruc[,2] # quarantined I +initQR<-0*popstruc[,2] # quarantined R +initH<-0*popstruc[,2] # hospitalised +initHC<-0*popstruc[,2] # hospital critical +initC<-0*popstruc[,2] # Cumulative cases (true) +initCM<-0*popstruc[,2] # Cumulative deaths (true) +initCL<-0*popstruc[,2] # symptomatic cases +initQC<-0*popstruc[,2] # quarantined C +initICU<-0*popstruc[,2] # icu +initICUC<-0*popstruc[,2] # icu critical +initICUCV<-0*popstruc[,2] # icu critical +initVent<-0*popstruc[,2] # icu vent +initVentC<-0*popstruc[,2] # icu vent crit +initCMC<-0*popstruc[,2] # Cumulative deaths - overload (true) +initZ<-0*popstruc[,2] # testing - quarantined (true) +initEV<-0*popstruc[,2] # vaccinated exposed +initER<-0*popstruc[,2] # recovered exposed +initEVR<-0*popstruc[,2] # recovered and vaccinated exposed +initVR<-0*popstruc[,2] # recovered and vaccinated +initQV<-0*popstruc[,2] # quarantined and vaccinated +initQEV<-0*popstruc[,2] # quarantined, exposed and vaccinated +initQEVR<-0*popstruc[,2] # quarantined, exposed, recovered and vaccinated +initQER<-0*popstruc[,2] # quarantined, exposed and recovered +initQVR<-0*popstruc[,2] # quarantined, recovered and vaccinated +initHCICU<-0*popstruc[,2] # icu not seeking +initHCV<-0*popstruc[,2] # ventilator not seeking +initAb<-0*popstruc[,2] # ventilator not seeking + +initS<-popstruc[,2]-initE-initI-initCL-initR-initX-initZ-initV-initH-initHC-initICU-initICUC-initICUCV-initVent-initVentC- + initQS-initQE-initQI-initQR-initQC-initEV-initER-initEVR-initVR-initQV-initQEV-initQEVR-initQER-initQVR- + initHCICU-initHCV # Susceptible (non-immune) + + +inp <- read_excel(file_path, sheet = "Interventions") +inputs<-function(inp, run){ + + # cap intervention start and end dates with simulation end date + # inp$`Date Start` = pmin(stopdate, inp$`Date Start`) + # inp$`Date End` = pmin(stopdate, inp$`Date End`) + + inp[["Date Start"]] = pmin(stopdate, as.Date(inp[["Date Start"]])) + inp[["Date End"]] = pmin(stopdate, as.Date(inp[["Date End"]])) + + inp <- inp %>% arrange(`Date Start`) + + tv<-which(inp$`Apply to`==run) + + si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tv) + scr<-intersect(which(inp$Intervention=="(*Self-isolation) Screening"),tv) + sd<-intersect(which(inp$Intervention=="Social Distancing"),tv) + hw<-intersect(which(inp$Intervention=="Handwashing"),tv) + msk<-intersect(which(inp$Intervention=="Mask Wearing"),tv) + wah<-intersect(which(inp$Intervention=="Working at Home"),tv) + sc<-intersect(which(inp$Intervention=="School Closures"),tv) + cte<-intersect(which(inp$Intervention=="Shielding the Elderly"),tv) + q<-intersect(which(inp$Intervention=="(*Self-isolation) Household Isolation"),tv) + tb<-intersect(which(inp$Intervention=="International Travel Ban"),tv) + mt<-intersect(which(inp$Intervention=="Mass Testing"),tv) + minas<-intersect(which(inp$Intervention=="(*Mass Testing) Age Testing Minimum"),tv) + maxas<-intersect(which(inp$Intervention=="(*Mass Testing) Age Testing Maximum"),tv) + vc<-intersect(which(inp$Intervention=="Vaccination"),tv) + minav<-intersect(which(inp$Intervention=="(*Vaccination) Age Vaccine Minimum"),tv) + maxav<-intersect(which(inp$Intervention=="(*Vaccination) Age Vaccine Maximum"),tv) + dx<-intersect(which(inp$Intervention=="Dexamethasone"),tv) + + v<-(format(as.POSIXct(inp$`Date Start`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) + v2<-as.Date(v,format="%d/%m/%y") + inp$`Date Start`<-v2 + + v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) + v2<-as.Date(v,format="%d/%m/%y") + inp$`Date End`<-v2 + + ## self isolation + f<-c() + si_vector<-c() + isolation<-c() + if (length(si)>=1){ + for (i in 1:length(si)){ + f<-c(f,as.numeric(inp$`Date Start`[si[i]]-startdate),as.numeric(inp$`Date End`[si[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[si[i]]>startdate){ + si_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[si[i]],(f[i+1]-f[i])*20)) + isolation<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + si_vector<-c(rep(inp$`Value`[si[i]],(f[i+1])*20)) + isolation<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + si_vector<-c(si_vector,rep(inp$`Value`[si[i]],20)) + isolation<-c(isolation,rep(1,20)) + }else{ + si_vector<-c(si_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + isolation<-c(isolation,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + si_vector<-c(si_vector,rep(inp$`Value`[si[i]],(f[i*2]-f[i*2-1])*20)) + isolation<-c(isolation,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(si) && f[i*2]=1){ + for (i in 1:length(sd)){ + + f<-c(f,as.numeric(inp$`Date Start`[sd[i]]-startdate),as.numeric(inp$`Date End`[sd[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[sd[i]]>startdate){ + sd_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sd[i]],(f[i+1]-f[i])*20)) + distancing<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + sd_vector<-c(rep(inp$`Value`[sd[i]],(f[i+1])*20)) + distancing<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],20)) + distancing<-c(distancing,rep(1,20)) + }else{ + sd_vector<-c(sd_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + distancing<-c(distancing,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],(f[i*2]-f[i*2-1])*20)) + distancing<-c(distancing,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(sd)&& f[i*2]=1){ + for (i in 1:length(scr)){ + + f<-c(f,as.numeric(inp$`Date Start`[scr[i]]-startdate),as.numeric(inp$`Date End`[scr[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[scr[i]]>startdate){ + scr_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[scr[i]],(f[i+1]-f[i])*20)) + screen<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + scr_vector<-c(rep(inp$`Value`[scr[i]],(f[i+1])*20)) + screen<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],20)) + screen<-c(screen,rep(1,20)) + }else{ + scr_vector<-c(scr_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + screen<-c(screen,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],(f[i*2]-f[i*2-1])*20)) + screen<-c(screen,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(scr)&& f[i*2]=1){ + for (i in 1:length(hw)){ + + f<-c(f,as.numeric(inp$`Date Start`[hw[i]]-startdate),as.numeric(inp$`Date End`[hw[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[hw[i]]>startdate){ + hw_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[hw[i]],(f[i+1]-f[i])*20)) + handwash<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + hw_vector<-c(rep(inp$`Value`[hw[i]],(f[i+1])*20)) + handwash<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],20)) + handwash<-c(handwash,rep(1,20)) + }else{ + hw_vector<-c(hw_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + handwash<-c(handwash,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],(f[i*2]-f[i*2-1])*20)) + handwash<-c(handwash,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(hw)&& f[i*2]=1){ + for (i in 1:length(msk)){ + + f<-c(f,as.numeric(inp$`Date Start`[msk[i]]-startdate),as.numeric(inp$`Date End`[msk[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[msk[i]]>startdate){ + msk_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[msk[i]],(f[i+1]-f[i])*20)) + masking<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + msk_vector<-c(rep(inp$`Value`[msk[i]],(f[i+1])*20)) + masking<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + msk_vector<-c(msk_vector,rep(inp$`Value`[msk[i]],20)) + masking<-c(masking,rep(1,20)) + }else{ + msk_vector<-c(msk_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + masking<-c(masking,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + msk_vector<-c(msk_vector,rep(inp$`Value`[msk[i]],(f[i*2]-f[i*2-1])*20)) + masking<-c(masking,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(msk)&& f[i*2]=1){ + for (i in 1:length(dx)){ + f<-c(f,as.numeric(inp$`Date Start`[dx[i]]-startdate),as.numeric(inp$`Date End`[dx[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[dx[i]]>startdate){ + dex<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + dex<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + dex<-c(dex,rep(1,20)) + }else{ + dex<-c(dex,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + dex<-c(dex,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(dx)&& f[i*2]=1){ + for (i in 1:length(wah)){ + + f<-c(f,as.numeric(inp$`Date Start`[wah[i]]-startdate),as.numeric(inp$`Date End`[wah[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[wah[i]]>startdate){ + wah_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[wah[i]],(f[i+1]-f[i])*20)) + workhome<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + wah_vector<-c(rep(inp$`Value`[wah[i]],(f[i+1])*20)) + workhome<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],20)) + workhome<-c(workhome,rep(1,20)) + }else{ + wah_vector<-c(wah_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + workhome<-c(workhome,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],(f[i*2]-f[i*2-1])*20)) + workhome<-c(workhome,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(wah)&& f[i*2]=1){ + for (i in 1:length(sc)){ + + f<-c(f,as.numeric(inp$`Date Start`[sc[i]]-startdate),as.numeric(inp$`Date End`[sc[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[sc[i]]>startdate){ + sc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sc[i]],(f[i+1]-f[i])*20)) + schoolclose<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + sc_vector<-c(rep(inp$`Value`[sc[i]],(f[i+1])*20)) + schoolclose<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],20)) + schoolclose<-c(schoolclose,rep(1,20)) + }else{ + sc_vector<-c(sc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + schoolclose<-c(schoolclose,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],(f[i*2]-f[i*2-1])*20)) + schoolclose<-c(schoolclose,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(sc)&& f[i*2]=1){ + for (i in 1:length(cte)){ + + f<-c(f,as.numeric(inp$`Date Start`[cte[i]]-startdate),as.numeric(inp$`Date End`[cte[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[cte[i]]>startdate){ + cte_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[cte[i]],(f[i+1]-f[i])*20)) + cocoon<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + cte_vector<-c(rep(inp$`Value`[cte[i]],(f[i+1])*20)) + cocoon<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],20)) + cocoon<-c(cocoon,rep(1,20)) + }else{ + cte_vector<-c(cte_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + cocoon<-c(cocoon,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],(f[i*2]-f[i*2-1])*20)) + cocoon<-c(cocoon,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(cte)&& f[i*2]=1){ + for (i in 1:length(q)){ + + f<-c(f,as.numeric(inp$`Date Start`[q[i]]-startdate),as.numeric(inp$`Date End`[q[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[q[i]]>startdate){ + q_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[q[i]],(f[i+1]-f[i])*20)) + quarantine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + q_vector<-c(rep(inp$`Value`[q[i]],(f[i+1])*20)) + quarantine<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + q_vector<-c(q_vector,rep(inp$`Value`[q[i]],20)) + quarantine<-c(quarantine,rep(1,20)) + }else{ + q_vector<-c(q_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + quarantine<-c(quarantine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + q_vector<-c(q_vector,rep(inp$`Value`[q[i]],(f[i*2]-f[i*2-1])*20)) + quarantine<-c(quarantine,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(q)&& f[i*2]=1){ + for (i in 1:length(tb)){ + + f<-c(f,as.numeric(inp$`Date Start`[tb[i]]-startdate),as.numeric(inp$`Date End`[tb[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[tb[i]]>startdate){ + tb_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[tb[i]],(f[i+1]-f[i])*20)) + travelban<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + tb_vector<-c(rep(inp$`Value`[tb[i]],(f[i+1])*20)) + travelban<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],20)) + travelban<-c(travelban,rep(1,20)) + }else{ + tb_vector<-c(tb_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + travelban<-c(travelban,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],(f[i*2]-f[i*2-1])*20)) + travelban<-c(travelban,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(tb)&& f[i*2]=1){ + for (i in 1:length(mt)){ + + f<-c(f,as.numeric(inp$`Date Start`[mt[i]]-startdate),as.numeric(inp$`Date End`[mt[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[mt[i]]>startdate){ + mt_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[mt[i]],(f[i+1]-f[i])*20)) + masstesting<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + mt_vector<-c(rep(inp$`Value`[mt[i]],(f[i+1])*20)) + masstesting<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + mt_vector<-c(mt_vector,rep(inp$`Value`[mt[i]],20)) + masstesting<-c(masstesting,rep(1,20)) + }else{ + mt_vector<-c(mt_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + masstesting<-c(masstesting,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + mt_vector<-c(mt_vector,rep(inp$`Value`[mt[i]],(f[i*2]-f[i*2-1])*20)) + masstesting<-c(masstesting,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(mt)&& f[i*2]=1){ + for (i in 1:length(minas)){ + f<-c(f,as.numeric(inp$`Date Start`[minas[i]]-startdate),as.numeric(inp$`Date End`[minas[i]]-startdate)) + if(i==1){ + if (inp$`Date Start`[minas[i]]>startdate){ + minas_vector<-c(rep(age_testing_min,f[i]*20),rep(inp$`Value`[minas[i]],(f[i+1]-f[i])*20)) + } + else{ + minas_vector<-c(rep(inp$`Value`[minas[i]],(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + minas_vector<-c(minas_vector,rep(inp$`Value`[minas[i]],20)) + }else{ + minas_vector<-c(minas_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + minas_vector<-c(minas_vector,rep(inp$`Value`[minas[i]],(f[i*2]-f[i*2-1])*20)) + } + if(i==length(minas)&& f[i*2]=1){ + for (i in 1:length(maxas)){ + f<-c(f,as.numeric(inp$`Date Start`[maxas[i]]-startdate),as.numeric(inp$`Date End`[maxas[i]]-startdate)) + if(i==1){ + if (inp$`Date Start`[maxas[i]]>startdate){ + maxas_vector<-c(rep(age_testing_max,f[i]*20),rep(inp$`Value`[maxas[i]],(f[i+1]-f[i])*20)) + } + else{ + maxas_vector<-c(rep(inp$`Value`[maxas[i]],(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + maxas_vector<-c(maxas_vector,rep(inp$`Value`[maxas[i]],20)) + }else{ + maxas_vector<-c(maxas_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + maxas_vector<-c(maxas_vector,rep(inp$`Value`[maxas[i]],(f[i*2]-f[i*2-1])*20)) + } + if(i==length(maxas)&& f[i*2]=1){ + for (i in 1:length(vc)){ + f<-c(f,as.numeric(inp$`Date Start`[vc[i]]-startdate),as.numeric(inp$`Date End`[vc[i]]-startdate)) + + if(i==1){ + if (inp$`Date Start`[vc[i]]>startdate){ + vc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[vc[i]],(f[i+1]-f[i])*20)) + vaccine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) + } + else{ + vc_vector<-c(rep(inp$`Value`[vc[i]],(f[i+1])*20)) + vaccine<-c(rep(1,(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],20)) + vaccine<-c(vaccine,rep(1,20)) + }else{ + vc_vector<-c(vc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + vaccine<-c(vaccine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],(f[i*2]-f[i*2-1])*20)) + vaccine<-c(vaccine,rep(1,(f[i*2]-f[i*2-1])*20)) + } + if(i==length(vc)&& f[i*2]=1){ + for (i in 1:length(minav)){ + f<-c(f,as.numeric(inp$`Date Start`[minav[i]]-startdate),as.numeric(inp$`Date End`[minav[i]]-startdate)) + if(i==1){ + if (inp$`Date Start`[minav[i]]>startdate){ + minav_vector<-c(rep(age_vaccine_min,f[i]*20),rep(inp$`Value`[minav[i]],(f[i+1]-f[i])*20)) + } + else{ + minav_vector<-c(rep(inp$`Value`[minav[i]],(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + minav_vector<-c(minav_vector,rep(inp$`Value`[minav[i]],20)) + }else{ + minav_vector<-c(minav_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + minav_vector<-c(minav_vector,rep(inp$`Value`[minav[i]],(f[i*2]-f[i*2-1])*20)) + } + if(i==length(minav)&& f[i*2]=1){ + for (i in 1:length(maxav)){ + f<-c(f,as.numeric(inp$`Date Start`[maxav[i]]-startdate),as.numeric(inp$`Date End`[maxav[i]]-startdate)) + if(i==1){ + if (inp$`Date Start`[maxav[i]]>startdate){ + maxav_vector<-c(rep(age_vaccine_max,f[i]*20),rep(inp$`Value`[maxav[i]],(f[i+1]-f[i])*20)) + } + else{ + maxav_vector<-c(rep(inp$`Value`[maxav[i]],(f[i+1])*20)) + } + } + else{ + if (f[(i-1)*2+1]-f[(i-1)*2]==1){ + maxav_vector<-c(maxav_vector,rep(inp$`Value`[maxav[i]],20)) + }else{ + maxav_vector<-c(maxav_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) + } + maxav_vector<-c(maxav_vector,rep(inp$`Value`[maxav[i]],(f[i*2]-f[i*2-1])*20)) + } + if(i==length(maxav)&& f[i*2]1){ + ratetestI<-mass_test_sens*testI/sum(I) + # print(paste('rateI: ',ratetestI)) + }else{ratetestI<-0} + if(sum(CL)>1){ + ratetestC<-mass_test_sens*testC/sum(CL) + # print(paste('rateC: ',ratetestC)) + }else{ratetestC<-0} + # print(sum(E)) + if(sum(E)>1){ + ratetestE<-mass_test_sens*testE/sum(E) + }else{ratetestE<-0} + if(sum(EV)>1){ + ratetestEV<-mass_test_sens*testEV/sum(EV) + # print(paste('rateEV: ',ratetestEV)) + }else{ratetestEV<-0} + if(sum(ER)>1){ + ratetestER<-mass_test_sens*testER/sum(ER) + # print(paste('rateER: ',ratetestER)) + }else{ratetestER<-0} + if(sum(EVR)>1){ + ratetestEVR<-mass_test_sens*testEVR/sum(EVR) + }else{ratetestEVR<-0} + if(sum(HC)>1){ + ratetestHC<-mass_test_sens*testHC/sum(HC) + }else{ratetestHC<-0} + if(sum(HCICU)>1){ + ratetestHCICU<-mass_test_sens*testHCICU/sum(HCICU) + }else{ratetestHCICU<-0} + if(sum(HCV)>1){ + ratetestHCV<-mass_test_sens*testHCV/sum(HCV) + }else{ratetestHCV<-0} + + # print(mass_test_sens) + # print(ratetestI*sum(I) + ratetestC*sum(CL) - (1/isolation_days)*sum(Z) ) + # print(propC) + # print(testI) + # print(testC) + # + # cocooning the elderly + cocoon_mat<-matrix((1-cocoon_eff),nrow = length(popstruc$pop),ncol = length(popstruc$pop)) + cocoon_mat[1:(age_cocoon-1),1:(age_cocoon-1)]<-1 + + # contact matrices + cts<-(contact_home+distancing*(1-dist)*contact_other+(1-distancing)*contact_other + +(1-schoolclose)*contact_school # school on + +schoolclose*(1-school)*contact_school # school close + +schoolclose*contact_home*school*s2h # inflating contacts at home when school closes + +(1-workhome)*contact_work # normal work + +workhome*(1-work)*contact_work # people not working from home when homework is active + +contact_home*workhome*work*w2h # inflating contacts at home when working from home + ) + + # Final transmission related parameters + contacts <- (1-cocoon)*cts+cocoon*cts*cocoon_mat+cocoon*(1+schoolclose*(1-school_eff)+workhome*(1-work_eff))*contact_home*(1-cocoon_mat) + seas <- 1+amp*cos(2*3.14*(t-(phi*365.25/12))/365.25) + importation <- mean_imports*(1-trvban_eff) + HH<-H+ICU+Vent+ICUC+ICUCV+VentC + HHC<-HC+HCICU+HCV + lam <- (1-max(hand,mask))*p*seas*(contacts%*%((rho*E+(I+CL+importation)+(1-selfis_eff)*(X+HHC)+rhos*(HH))/P))+ + (1-max(hand,mask))*p*seas*(1-quarantine*quarantine_eff_other)*(contact_other%*%((rho*QE+QI+QC+QEV+QEVR+QER)/P)) + # contacts under home quarantine + lamq<-(1-max(hand,mask))*p*seas*((1-quarantine_eff_home)*contact_home%*%(((1-selfis_eff)*(X+HHC+rho*QE+QI+QC++QEV+QEVR+QER))/P))+ + (1-max(hand,mask))*p*seas*(1-quarantine_eff_other)*(contact_other%*%((rho*E+(I+CL+importation)+(1-selfis_eff)*(X+HHC+rho*QE+QI+QC++QEV+QEVR+QER)+rhos*(HH))/P)) + # lamq<-0 + # print(paste("lamq",lamq)) + # print(paste("lamq",(1-vaccine_eff_r)*lamq*sum(QVR) )) + # print(paste("quarantine evr",quarantine_rate*sum(EVR) )) + + # birth/death + b1<-sum(popbirth[,2]*popstruc[,2]) + birth<-0*popbirth[,2] + birth[1]<-b1 + + # ODE system + dSdt <- -S*lam-vaccinate*age_vaccine_vector*S+omega*R+vac_dur*V- + quarantine_rate*S +(1/quarantine_days)*QS+ageing%*%S-mort*S+birth + dEdt <- S*lam-gamma*E+ageing%*%E- vaccinate*age_vaccine_vector*E - mort*E - + quarantine_rate*E+(1/quarantine_days)*QE + dIdt <- gamma*(1-pclin)*(1-age_testing_vector*ratetestE)*(1-screen_eff)*(1-ihr[,2])*E+ + gamma*(1-pclin_v)*(1-age_testing_vector*ratetestEV)*(1-screen_eff)*(1-sigmaEV*ihr[,2])*EV+ + gamma*(1-pclin_vr)*(1-age_testing_vector*ratetestEVR)*(1-screen_eff)*(1-sigmaEVR*ihr[,2])*EVR+ + gamma*(1-pclin_r)*(1-age_testing_vector*ratetestER)*(1-screen_eff)*(1-sigmaER*ihr[,2])*ER- + vaccinate*age_vaccine_vector*I - nui*I+ageing%*%I-mort*I + + (1/quarantine_days)*QI - quarantine_rate*I - ratetestI*age_testing_vector*I + dCLdt<- gamma*pclin*(1-age_testing_vector*ratetestE)*(1-selfis)*(1-ihr[,2])*(1-quarantine_rate)*E+ + gamma*pclin_v*(1-age_testing_vector*ratetestEV)*(1-selfis)*(1-sigmaEV*ihr[,2])*(1-quarantine_rate)*EV+ + gamma*pclin_vr*(1-age_testing_vector*ratetestEVR)*(1-selfis)*(1-sigmaEVR*ihr[,2])*(1-quarantine_rate)*EVR+ + gamma*pclin_r*(1-age_testing_vector*ratetestER)*(1-selfis)*(1-sigmaER*ihr[,2])*(1-quarantine_rate)*ER- + nui*CL+ageing%*%CL-mort*CL + (1/quarantine_days)*QC - ratetestC*age_testing_vector*CL + dRdt <- vac_dur_r*VR-omega*R-vaccinate*age_vaccine_vector*R-lam*sigmaR*R - quarantine_rate*R+ + nui*I+nui*X+nui*CL+ageing%*%R-mort*R + (1/isolation_days)*Z+(1/quarantine_days)*QR+ + nus*propo2*(1-dexo2*pdeath_ho)*ifr[,2]*H+nus*(1-propo2)*(1-pdeath_h)*ifr[,2]*H+ + nusc*propo2*(1-pdeath_hco)*ifr[,2]*HC+nusc*(1-propo2)*(1-pdeath_hc)*ifr[,2]*HC+ + nusc*propo2*(1-pdeath_icu_hco)*ifr[,2]*HCICU+nusc*(1-propo2)*(1-pdeath_icu_hc)*ifr[,2]*HCICU+ + nu_icu*propo2*(1-dexo2*pdeath_icuo)*ifr[,2]*ICU+nu_icu*(1-propo2)*(1-pdeath_icu)*ifr[,2]*ICU+ + nu_icuc*propo2*(1-dexo2c*pdeath_icuco)*ifr[,2]*ICUC+nu_icuc*(1-propo2)*(1-pdeath_icuc)*ifr[,2]*ICUC+ + nu_vent*(1-dexv*pdeath_vent)*ifr[,2]*Vent+ + nu_ventc*(1-pdeath_vent_hc)*ifr[,2]*HCV+ + nu_ventc*(1-dexvc*pdeath_ventc)*ifr[,2]*VentC+nu_ventc*(1-dexvc*pdeath_ventc)*ifr[,2]*ICUCV + dXdt <- gamma*selfis*(1-age_testing_vector*ratetestE)*pclin*(1-ihr[,2])*E+ + gamma*(1-pclin)*(1-age_testing_vector*ratetestE)*screen_eff*(1-ihr[,2])*E+ + gamma*selfis*(1-age_testing_vector*ratetestEV)*pclin_v*(1-sigmaEV*ihr[,2])*EV+ + gamma*(1-pclin_v)*(1-age_testing_vector*ratetestEV)*screen_eff*(1-sigmaEV*ihr[,2])*EV+ + gamma*selfis*(1-age_testing_vector*ratetestEVR)*pclin_v*(1-sigmaEVR*ihr[,2])*EVR+ + gamma*(1-pclin_vr)*(1-age_testing_vector*ratetestEVR)*screen_eff*(1-sigmaEVR*ihr[,2])*EVR+ + gamma*selfis*(1-age_testing_vector*ratetestER)*pclin_r*(1-sigmaER*ihr[,2])*ER+ + gamma*(1-pclin_r)*(1-age_testing_vector*ratetestER)*screen_eff*(1-sigmaER*ihr[,2])*ER+ + -nui*X+ageing%*%X-mort*X + dVdt <- vaccinate*age_vaccine_vector*S + omega*VR - (1-vaccine_eff)*lam*V - vac_dur*V + ageing%*%V-mort*V - quarantine_rate*V + dEVdt<- (1-vaccine_eff)*lam*V - gamma*EV + ageing%*%EV - mort*EV - quarantine_rate*EV +(1/quarantine_days)*QEV + dERdt<- lam*sigmaR*R - gamma*ER + ageing%*%ER - mort*ER - quarantine_rate*ER +(1/quarantine_days)*QER + dVRdt <- vaccinate*age_vaccine_vector*E + vaccinate*age_vaccine_vector*I + vaccinate*age_vaccine_vector*R - + (1-vaccine_eff_r)*lam*VR - vac_dur_r*VR + ageing%*%VR - mort*VR - omega*VR - quarantine_rate*VR + (1/quarantine_days)*QVR + dEVRdt<- (1-vaccine_eff_r)*lam*VR - gamma*EVR + ageing%*%EVR-mort*EVR - quarantine_rate*EVR + + (1/quarantine_days)*QEVR + + + dQSdt <- quarantine_rate*S + ageing%*%QS-mort*QS - (1/quarantine_days)*QS - lamq*QS + dQEdt <- quarantine_rate*E - gamma*QE + ageing%*%QE-mort*QE - (1/quarantine_days)*QE + lamq*QS + dQIdt <- quarantine_rate*I + gamma*(1-ihr[,2])*(1-pclin)*QE+ + gamma*(1-sigmaEV*ihr[,2])*(1-pclin_v)*QEV+ + gamma*(1-sigmaER*ihr[,2])*(1-pclin_r)*QER+ + gamma*(1-sigmaEVR*ihr[,2])*(1-pclin_vr)*QEVR- + nui*QI+ageing%*%QI-mort*QI - (1/quarantine_days)*QI + dQCdt <- gamma*pclin*(1-selfis)*(1-age_testing_vector*ratetestE)*(1-ihr[,2])*quarantine_rate*E+ + gamma*pclin_v*(1-age_testing_vector*ratetestEV)*(1-selfis)*(1-sigmaEV*ihr[,2])*quarantine_rate*EV+ + gamma*pclin_vr*(1-age_testing_vector*ratetestEVR)*(1-selfis)*(1-sigmaEVR*ihr[,2])*quarantine_rate*EVR+ + gamma*pclin_r*(1-age_testing_vector*ratetestER)*(1-selfis)*(1-sigmaER*ihr[,2])*quarantine_rate*ER+ + gamma*(1-ihr[,2])*pclin*QE + + gamma*(1-sigmaEV*ihr[,2])*pclin_v*QEV + + gamma*(1-sigmaER*ihr[,2])*pclin_r*QER + + gamma*(1-sigmaEVR*ihr[,2])*pclin_vr*QEVR - + nui*QC+ageing%*%QC-mort*QC - (1/quarantine_days)*QC + dQRdt <- quarantine_rate*R + nui*QI + nui*QC + ageing%*%QR-mort*QR - (1/quarantine_days)*QR + vac_dur_r*QVR + dQVdt <- quarantine_rate*V + ageing%*%QV-mort*QV - (1/quarantine_days)*QV - (1-vaccine_eff)*lamq*QV + omega*QVR + dQEVdt <- quarantine_rate*EV - gamma*QEV + ageing%*%QEV-mort*QEV - (1/quarantine_days)*QEV + (1-vaccine_eff)*lamq*QV + dQERdt <- quarantine_rate*ER - gamma*QER + ageing%*%QER-mort*QER - (1/quarantine_days)*QER + sigmaR*lamq*QR + dQVRdt <- quarantine_rate*VR - (1-vaccine_eff_r)*lam*QVR - vac_dur_r*QVR - omega*QVR + ageing%*%QVR - mort*QVR + dQEVRdt <- quarantine_rate*EVR - gamma*QEVR +ageing%*%QEVR-mort*QEVR - + (1/quarantine_days)*QEVR +(1-vaccine_eff_r)*lamq*QVR + + + dHdt <- gamma*ihr[,2]*(1-prob_icu)*(1-critH)*reporth*E+ + gamma*sigmaEV*ihr[,2]*(1-prob_icu_v)*(1-critH)*reporth*EV + + gamma*sigmaEVR*ihr[,2]*(1-prob_icu_vr)*(1-critH)*reporth*EVR + + gamma*sigmaER*ihr[,2]*(1-prob_icu_r)*(1-critH)*reporth*ER + + gamma*ihr[,2]*(1-prob_icu)*(1-critH)*reporth*QE + + gamma*sigmaEV*ihr[,2]*(1-prob_icu_v)*(1-critH)*reporth*QEV + + gamma*sigmaEVR*ihr[,2]*(1-prob_icu_vr)*(1-critH)*reporth*QEVR + + gamma*sigmaER*ihr[,2]*(1-prob_icu_r)*(1-critH)*reporth*QER - + nus*H + ageing%*%H-mort*H + dHCdt <- gamma*ihr[,2]*(1-prob_icu)*(1-reporth)*E+gamma*ihr[,2]*(1-prob_icu)*critH*reporth*E + + gamma*sigmaEV*ihr[,2]*(1-prob_icu_v)*(1-reporth)*EV+gamma*sigmaEV*ihr[,2]*(1-prob_icu_v)*critH*reporth*EV+ + gamma*sigmaEVR*ihr[,2]*(1-prob_icu_vr)*(1-reporth)*EVR+gamma*sigmaEVR*ihr[,2]*(1-prob_icu_vr)*critH*reporth*EVR+ + gamma*sigmaER*ihr[,2]*(1-prob_icu_r)*(1-reporth)*ER+gamma*sigmaER*ihr[,2]*(1-prob_icu_r)*critH*reporth*ER + + gamma*ihr[,2]*(1-prob_icu)*(1-reporth)*QE+gamma*ihr[,2]*(1-prob_icu)*critH*reporth*QE+ + gamma*sigmaEV*ihr[,2]*(1-prob_icu_v)*(1-reporth)*QEV+gamma*sigmaEV*ihr[,2]*(1-prob_icu_v)*critH*reporth*QEV+ + gamma*sigmaEVR*ihr[,2]*(1-prob_icu_vr)*(1-reporth)*QEVR+gamma*sigmaEVR*ihr[,2]*(1-prob_icu_vr)*critH*reporth*QEVR+ + gamma*sigmaER*ihr[,2]*(1-prob_icu_r)*(1-reporth)*QER+gamma*sigmaER*ihr[,2]*(1-prob_icu_r)*critH*reporth*QER - + nusc*HC + ageing%*%HC-mort*HC - ratetestHC*age_testing_vector*HC + dHCICUdt <- gamma*(1-reporth_ICU)*ihr[,2]*prob_icu*(1-prob_v)*E+ + gamma*(1-reporth_ICU)*sigmaEV*ihr[,2]*prob_icu_v*(1-prob_v_v)*EV+ + gamma*(1-reporth_ICU)*sigmaEVR*ihr[,2]*prob_icu_vr*(1-prob_v_vr)*EVR+ + gamma*(1-reporth_ICU)*sigmaER*ihr[,2]*prob_icu_r*(1-prob_v_r)*ER+ + gamma*(1-reporth_ICU)*ihr[,2]*prob_icu*(1-prob_v)*QE+ + gamma*(1-reporth_ICU)*sigmaEV*ihr[,2]*prob_icu_v*(1-prob_v_v)*QEV+ + gamma*(1-reporth_ICU)*sigmaEVR*ihr[,2]*prob_icu_vr*(1-prob_v_vr)*QEVR+ + gamma*(1-reporth_ICU)*sigmaER*ihr[,2]*prob_icu_r*(1-prob_v_r)*QER- + nusc*HCICU + ageing%*%HCICU-mort*HCICU - ratetestHCICU*age_testing_vector*HCICU + dHCVdt <- gamma*(1-reporth_ICU)*ihr[,2]*prob_icu*prob_v*E+ + gamma*(1-reporth_ICU)*sigmaEV*ihr[,2]*prob_icu_v*prob_v_v*EV+ + gamma*(1-reporth_ICU)*sigmaEVR*ihr[,2]*prob_icu_vr*prob_v_vr*EVR+ + gamma*(1-reporth_ICU)*sigmaER*ihr[,2]*prob_icu_r*prob_v_r*ER+ + gamma*(1-reporth_ICU)*ihr[,2]*prob_icu*prob_v*QE+ + gamma*(1-reporth_ICU)*sigmaEV*ihr[,2]*prob_icu_v*prob_v_v*QEV+ + gamma*(1-reporth_ICU)*sigmaEVR*ihr[,2]*prob_icu_vr*prob_v_vr*QEVR+ + gamma*(1-reporth_ICU)*sigmaER*ihr[,2]*prob_icu_r*prob_v_r*QER- + nu_ventc*HCV + ageing%*%HCV-mort*HCV - ratetestHCV*age_testing_vector*HCV + dICUdt <- gamma*reporth_ICU*ihr[,2]*prob_icu*(1-crit)*(1-prob_v)*E+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*(1-crit)*(1-prob_v_v)*EV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*(1-crit)*(1-prob_v_vr)*EVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*(1-crit)*(1-prob_v_r)*ER+ + gamma*reporth_ICU*ihr[,2]*prob_icu*(1-crit)*(1-prob_v)*QE+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*(1-crit)*(1-prob_v_v)*QEV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*(1-crit)*(1-prob_v_vr)*QEVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*(1-crit)*(1-prob_v_r)*QER - + nu_icu*ICU +ageing%*%ICU - mort*ICU + (1-crit)*ICUC*1/2 + dICUCdt <- gamma*reporth_ICU*ihr[,2]*prob_icu*crit*(1-prob_v)*E+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*crit*(1-prob_v_v)*EV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*crit*(1-prob_v_vr)*EVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*crit*(1-prob_v_r)*ER+ + gamma*reporth_ICU*ihr[,2]*prob_icu*crit*(1-prob_v)*QE+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*crit*(1-prob_v_v)*QEV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*crit*(1-prob_v_vr)*QEVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*crit*(1-prob_v_r)*QER - + nu_icuc*ICUC -(1-crit)*ICUC*1/2 +ageing%*%ICUC - mort*ICUC + dICUCVdt <- gamma*reporth_ICU*ihr[,2]*prob_icu*prob_v*crit*E+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*prob_v_v*crit*EV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*prob_v_vr*crit*EVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*prob_v_r*crit*ER+ + gamma*reporth_ICU*ihr[,2]*prob_icu*prob_v*crit*QE+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*prob_v_v*crit*QEV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*prob_v_vr*crit*QEVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*prob_v_r*crit*QER - + nu_ventc*ICUCV +ageing%*%ICUCV - mort*ICUCV - (1-critV)*ICUCV*1/2 + dVentdt <- gamma*reporth_ICU*ihr[,2]*prob_icu*(1-crit)*(1-critV)*prob_v*E+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*(1-crit)*(1-critV)*prob_v_v*EV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*(1-crit)*(1-critV)*prob_v_vr*EVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*(1-crit)*(1-critV)*prob_v_r*ER+ + gamma*reporth_ICU*ihr[,2]*prob_icu*(1-crit)*(1-critV)*prob_v*QE+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*(1-crit)*(1-critV)*prob_v_v*QEV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*(1-crit)*(1-critV)*prob_v_vr*QEVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*(1-crit)*(1-critV)*prob_v_r*QER + + (1-critV)*VentC*1/2 +(1-critV)*ICUCV*1/2 - nu_vent*Vent +ageing%*%Vent - mort*Vent + dVentCdt <- gamma*reporth_ICU*ihr[,2]*prob_icu*prob_v*(1-crit)*critV*E+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*prob_v_v*(1-crit)*critV*EV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*prob_v_vr*(1-crit)*critV*EVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*prob_v_r*(1-crit)*critV*ER+ + gamma*reporth_ICU*ihr[,2]*prob_icu*prob_v*(1-crit)*critV*QE+ + gamma*reporth_ICU*sigmaEV*ihr[,2]*prob_icu_v*prob_v_v*(1-crit)*critV*QEV+ + gamma*reporth_ICU*sigmaEVR*ihr[,2]*prob_icu_vr*prob_v_vr*(1-crit)*critV*QEVR+ + gamma*reporth_ICU*sigmaER*ihr[,2]*prob_icu_r*prob_v_r*(1-crit)*critV*QER - + (1-critV)*VentC*1/2 -nu_ventc*VentC +ageing%*%VentC - mort*VentC + + # print(dexo2) + dCdt <- report*gamma*(1-age_testing_vector*ratetestE)*(1-pclin)*(1-ihr[,2])*(E+QE)+reportc*gamma*pclin*(1-age_testing_vector*ratetestE)*(1-ihr[,2])*(E+QE)+ + gamma*ihr[,2]*(1-critH)*(1-prob_icu)*(E+QE)+gamma*ihr[,2]*critH*reporth*(1-prob_icu)*(E+QE)+ + gamma*ihr[,2]*prob_icu*(E+QE)+ratetestI*age_testing_vector*I+ratetestC*age_testing_vector*CL+gamma*age_testing_vector*ratetestE*(1-ihr[,2])*E + dCMdt<- nus*propo2*dexo2*pdeath_ho*ifr[,2]*H+nus*(1-propo2)*pdeath_h*ifr[,2]*H+ + nusc*report_death_HC*propo2*pdeath_hco*ifr[,2]*HC+nusc*report_death_HC*(1-propo2)*pdeath_hc*ifr[,2]*HC+ + nu_icu*propo2*dexo2*pdeath_icuo*ifr[,2]*ICU+nu_icu*(1-propo2)*pdeath_icu*ifr[,2]*ICU+ + nu_icuc*propo2*dexo2c*pdeath_icuco*ifr[,2]*ICUC+nu_icuc*(1-propo2)*pdeath_icuc*ifr[,2]*ICUC+ + nu_vent*dexv*pdeath_vent*ifr[,2]*Vent+nu_ventc*dexvc*pdeath_ventc*ifr[,2]*VentC + + nu_ventc*dexvc*pdeath_ventc*ifr[,2]*ICUCV+ nu_ventc*report_death_HC*pdeath_vent_hc*ifr[,2]*HCV+ + nu_icuc*report_death_HC*propo2*pdeath_icu_hco*ifr[,2]*HCICU+nu_icuc*report_death_HC*(1-propo2)*pdeath_icu_hc*ifr[,2]*HCICU + + mort*H + mort*ICU + mort*ICUC + mort*ICUCV + mort*Vent + mort*VentC + mort*Z + + mort*report_death_HC*HC +mort*report_death_HC*HCICU + mort*report_death_HC*HCV + + report_natdeathI*mort*I + report_natdeathI*mort*QI+ report_natdeathI*mort*E+ + report_natdeathI*mort*QE + report_natdeathI*mort*EV+ report_natdeathI*mort*EVR+ + report_natdeathI*mort*ER + report_natdeathI*mort*QEV+ + report_natdeathI*mort*QEVR + report_natdeathI*mort*QER+ + report_natdeathCL*mort*CL + report_natdeathCL*mort*QC + report_natdeathCL*mort*X + dCMCdt <- nusc*propo2*pdeath_hco*ifr[,2]*HC+nusc*(1-propo2)*pdeath_hc*ifr[,2]*HC+ + nu_icuc*propo2*dexo2c*pdeath_icuco*ifr[,2]*ICUC+nu_icuc*(1-propo2)*pdeath_icuc*ifr[,2]*ICUC+ + nu_ventc*dexvc*pdeath_ventc*ifr[,2]*VentC+nu_ventc*dexvc*pdeath_ventc*ifr[,2]*ICUCV+ + mort*HC + mort*ICUC + mort*VentC + mort*ICUCV + + dZdt <- gamma*ratetestE*age_testing_vector*(1-ihr[,2])*E+ + ratetestI*age_testing_vector*I+ + ratetestC*age_testing_vector*CL+ + gamma*(1-ihr[,2])*ratetestEV*age_testing_vector*EV+ + gamma*(1-ihr[,2])*ratetestEVR*age_testing_vector*EVR+ + gamma*(1-ihr[,2])*ratetestER*age_testing_vector*ER+ + ratetestHC*age_testing_vector*HC+ + ratetestHCICU*age_testing_vector*HCICU+ + ratetestHCV*age_testing_vector*HCV- + (1/isolation_days)*Z-mort*Z + + dAbdt <- nui*I+nui*X+nui*CL+ + nus*propo2*(1-dexo2*pdeath_ho)*ifr[,2]*H+nus*(1-propo2)*(1-pdeath_h)*ifr[,2]*H+ + nusc*propo2*(1-pdeath_hco)*ifr[,2]*HC+nusc*(1-propo2)*(1-pdeath_hc)*ifr[,2]*HC+ + nusc*propo2*(1-pdeath_icu_hco)*ifr[,2]*HCICU+nusc*(1-propo2)*(1-pdeath_icu_hc)*ifr[,2]*HCICU+ + nu_ventc*(1-pdeath_vent_hc)*ifr[,2]*HCV+ + nu_icu*propo2*(1-dexo2*pdeath_icuo)*ifr[,2]*ICU+nu_icu*(1-propo2)*(1-pdeath_icu)*ifr[,2]*ICU+ + nu_icuc*propo2*(1-dexo2c*pdeath_icuco)*ifr[,2]*ICUC+nu_icuc*(1-propo2)*(1-pdeath_icuc)*ifr[,2]*ICUC+ + nu_vent*(1-dexv*pdeath_vent)*ifr[,2]*Vent+ + nu_ventc*(1-dexvc*pdeath_ventc)*ifr[,2]*VentC+ + nu_ventc*(1-dexvc*pdeath_ventc)*ifr[,2]*ICUCV - + seroneg*Ab - mort*Ab + ageing%*%Ab + + # print(paste("QEVR",sum(QEVR))) + + # return the rate of change + list(c(S=dSdt,dEdt,dIdt,dRdt,dXdt,dHdt,dHCdt,dCdt,dCMdt,dVdt,dQSdt,dQEdt,dQIdt,dQRdt,dCLdt,dQCdt,dICUdt,dICUCdt,dICUCVdt, + dVentdt,dVentCdt,dCMCdt,dZdt,dEVdt,dERdt,dEVRdt,dVRdt,dQVdt,dQEVdt,dQEVRdt,dQERdt,dQVRdt,dHCICUdt,dHCVdt,dAbdt)) + } + ) +} + +########### RUN BASELINE MODEL - start time for interventions is set to day 1e5, i.e. interventions are always off + +Y<-c(initS,initE,initI,initR,initX,initH,initHC,initC,initCM,initV, initQS, initQE, initQI, initQR, initCL, initQC, initICU, + initICUC, initICUCV, initVent, initVentC, initCMC,initZ, initEV, initER, initEVR, initVR, + initQV,initQEV,initQEVR,initQER,initQVR,initHCICU,initHCV,initAb) # initial conditions for the main solution vector +# times<-seq(0,120, by =1) +# out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) +# tail(rowSums(out0[,(CMindex+1)]),1) # cumulative mortality +# tail(rowSums(out0[,(Sindex+1)]),1)/sum(popstruc[,2]) # cumulative mortality +# tail(rowSums(out0[,(Vindex+1)]),1)/sum(popstruc[,2]) # cumulative mortality +# tail(rowSums(out0[,(Rindex+1)]),1)/sum(popstruc[,2]) # cumulative mortality +# sum(rowSums(out0[,(Iindex+1)])) # cumulative mortality +# sum(rowSums(out0[,(Ventindex+1)])) # cumulative mortality +# sum(rowSums(out0[,(HCVindex+1)])) # cumulative mortality +# sum(rowSums(out0[,(HCICUindex+1)])) # cumulative mortality +# sum(rowSums(out0[,(HCindex+1)])) # cumulative mortality + +# parameters["vaccine_eff"]<-0 +# out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) +# tail(rowSums(out0[,(CMindex+1)]),1) # cumulative mortality + + + +# +# dexo2_hist <- rep(0,length(times)) +# dexo2c_hist <- rep(0,length(times)) +# dexv_hist <- rep(0,length(times)) +# dexvc_hist <- rep(0,length(times)) +# for (tt in times) { +# if(tt < max(times)){ +# if(vectors$dex[tt*20+1]) { +# dexo2_hist[tt+1] <- parameters["dexo2"] +# dexo2c_hist[tt+1] <- parameters["dexo2c"] +# dexv_hist[tt+1] <- parameters["dexv"] +# dexvc_hist[tt+1] <- parameters["dexvc"] +# } else { +# dexo2_hist[tt+1] <- 1 +# dexo2c_hist[tt+1] <- 1 +# dexv_hist[tt+1] <- 1 +# dexvc_hist[tt+1] <- 1 +# } +# } else { +# dexo2_hist[tt+1] <- dexo2_hist[tt] +# dexo2c_hist[tt+1] <- dexo2c_hist[tt] +# dexv_hist[tt+1] <- dexv_hist[tt] +# dexvc_hist[tt+1] <- dexvc_hist[tt] +# } +# } + + +process_ode_outcome_mortality <- function(out_mean, intv_vector, param_used, print_death_summary = FALSE){ + + cmortality1<-rowSums(out_mean[,(CMindex+1)]) # cumulative mortality, CM compartment + + results <- list() + results$time <- startdate + times # dates + results$cum_mortality <- cmortality1 # cumulative mortality + + ########################## Time-varying parameters + + # critH_hist<-c() + # crit_hist<-c() + # critV_hist<-c() + + # for (i in 1:length(times)){ + # critH_hist[i]<-min(1-fH((sum(out_mean[i,(Hindex+1)]))+sum(out_mean[i,(ICUCindex+1)])+sum(out_mean[i,(ICUCVindex+1)])),1) + # crit_hist[i]<-min(1-fICU((sum(out_mean[i,(ICUindex+1)]))+(sum(out_mean[i,(Ventindex+1)]))+(sum(out_mean[i,(VentCindex+1)])))) + # critV_hist[i]<-min(1-fVent((sum(out_mean[i,(Ventindex+1)]))),1) + + # to_keep = 10000000 + # critH_hist[i] = round(critH_hist[i] * to_keep) / to_keep + # crit_hist[i] = round(crit_hist[i] * to_keep) / to_keep + # critV_hist[i] = round(critV_hist[i] * to_keep) / to_keep + + # } + + prob_v_hist <- rep(param_used["prob_vent"],length(times)) + dexo2_hist <- rep(0,length(times)) + dexo2c_hist <- rep(0,length(times)) + dexv_hist <- rep(0,length(times)) + dexvc_hist <- rep(0,length(times)) + for (tt in times) { + if(tt < max(times)){ + if(intv_vector$dex[tt*20+1]) { + prob_v_hist[tt+1] <- param_used["prob_vent"]*param_used["vent_dex"] + dexo2_hist[tt+1] <- param_used["dexo2"] + dexo2c_hist[tt+1] <- param_used["dexo2c"] + dexv_hist[tt+1] <- param_used["dexv"] + dexvc_hist[tt+1] <- param_used["dexvc"] + } else { + prob_v_hist[tt+1] <- param_used["prob_vent"] + dexo2_hist[tt+1] <- 1 + dexo2c_hist[tt+1] <- 1 + dexv_hist[tt+1] <- 1 + dexvc_hist[tt+1] <- 1 + } + } else { + prob_v_hist[tt+1] <- prob_v_hist[tt] + dexo2_hist[tt+1] <- dexo2_hist[tt] + dexo2c_hist[tt+1] <- dexo2c_hist[tt] + dexv_hist[tt+1] <- dexv_hist[tt] + dexvc_hist[tt+1] <- dexvc_hist[tt] + } + } + + ########################## Death compartments + + # Attributables + + cinc_mort_1 <- cumsum(rowSums(param_used["nus"]*param_used["propo2"]*param_used["pdeath_ho"]*dexo2_hist*(out_mean[,(Hindex+1)]%*%ifr[,2]))) + cinc_mort_2 <- cumsum(rowSums(param_used["nus"]*(1-param_used["propo2"])*param_used["pdeath_h"]*(out_mean[,(Hindex+1)]%*%ifr[,2]))) + + cinc_mort_3 <- cumsum(rowSums(param_used["nusc"]*param_used["report_death_HC"]*param_used["propo2"]*param_used["pdeath_hco"]*(out_mean[,(HCindex+1)]%*%ifr[,2]))) + cinc_mort_4 <- cumsum(rowSums(param_used["nusc"]*param_used["report_death_HC"]*(1-param_used["propo2"])*param_used["pdeath_hc"]*(out_mean[,(HCindex+1)]%*%ifr[,2]))) + + cinc_mort_5 <- cumsum(rowSums(param_used["nu_icu"]*param_used["propo2"]*param_used["pdeath_icuo"]*dexo2_hist*(out_mean[,(ICUindex+1)]%*%ifr[,2]))) + cinc_mort_6 <- cumsum(rowSums(param_used["nu_icu"]*(1-param_used["propo2"])*param_used["pdeath_icu"]*(out_mean[,(ICUindex+1)]%*%ifr[,2]))) + + cinc_mort_7 <- cumsum(rowSums(param_used["nu_icuc"]*param_used["propo2"]*param_used["pdeath_icuco"]*dexo2c_hist*(out_mean[,(ICUCindex+1)]%*%ifr[,2]))) + cinc_mort_8 <- cumsum(rowSums(param_used["nu_icuc"]*(1-param_used["propo2"])*param_used["pdeath_icuc"]*(out_mean[,(ICUCindex+1)]%*%ifr[,2]))) + + + cinc_mort_9 <- cumsum(rowSums(param_used["nu_vent"]*param_used["pdeath_vent"]*dexv_hist*(out_mean[,(Ventindex+1)]%*%ifr[,2]))) + cinc_mort_10 <- cumsum(rowSums(param_used["nu_ventc"]*param_used["pdeath_ventc"]*dexvc_hist*(out_mean[,(VentCindex+1)]%*%ifr[,2]))) + cinc_mort_11 <- cumsum(rowSums(param_used["nu_ventc"]*param_used["pdeath_ventc"]*dexvc_hist*(out_mean[,(ICUCVindex+1)]%*%ifr[,2]))) + + cinc_mort_14 <- cumsum(rowSums(param_used["nu_ventc"]*param_used["report_death_HC"]*param_used["pdeath_vent_hc"]*(out_mean[,(HCVindex+1)]%*%ifr[,2]))) + cinc_mort_12 <- cumsum(rowSums(param_used["nu_icuc"] *param_used["report_death_HC"]*param_used["propo2"]*param_used["pdeath_icu_hco"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) + cinc_mort_13 <- cumsum(rowSums(param_used["nu_icuc"] *param_used["report_death_HC"]*(1-param_used["propo2"])*param_used["pdeath_icu_hc"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) + + cinc_mort_H1 <- cinc_mort_1 + cinc_mort_2 + cinc_mort_HC1 <- cinc_mort_3 + cinc_mort_4 + cinc_mort_12 + cinc_mort_13 + cinc_mort_14 + cinc_mort_ICU1 <- cinc_mort_5 + cinc_mort_6 + cinc_mort_ICUC1 <- cinc_mort_7 + cinc_mort_8 + cinc_mort_Vent1 <- cinc_mort_9 + cinc_mort_VentC1 <- cinc_mort_10 + cinc_mort_ICUCV1 <- cinc_mort_11 + + results$death_treated_hospital <- round(cinc_mort_H1) + results$death_untreated_hospital <- round(cinc_mort_HC1) + results$death_treated_icu <- round(cinc_mort_ICU1) + results$death_untreated_icu <- round(cinc_mort_ICUC1) + results$death_treated_ventilator <- round(cinc_mort_Vent1) + results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) + + results$attributable_deaths <- + results$death_treated_hospital + + results$death_untreated_hospital + + results$death_treated_icu + + results$death_untreated_icu + + results$death_treated_ventilator + + results$death_untreated_ventilator + + results$attributable_deaths_end <- last(results$attributable_deaths) + + + # Natural deaths / exposed + + base_mort_H1 <- cumsum(rowSums(out_mean[,(Hindex+1)]%*%mort)) + base_mort_ICU1 <- cumsum(rowSums(out_mean[,(ICUindex+1)]%*%mort)) + base_mort_ICUC1 <- cumsum(rowSums(out_mean[,(ICUCindex+1)]%*%mort)) + base_mort_ICUCV1 <- cumsum(rowSums(out_mean[,(ICUCVindex+1)]%*%mort)) + base_mort_Vent1 <- cumsum(rowSums(out_mean[,(Ventindex+1)]%*%mort)) + base_mort_VentC1 <- cumsum(rowSums(out_mean[,(VentCindex+1)]%*%mort)) + base_mort_Z1 <- cumsum(rowSums(out_mean[,(Zindex+1)]%*%mort)) + + base_mort_HC1 <- cumsum(rowSums(param_used["report_death_HC"]*out_mean[,(HCindex+1)]%*%mort)) + base_mort_HCICU1<- cumsum(rowSums(param_used["report_death_HC"]*out_mean[,(HCICUindex+1)]%*%mort)) + base_mort_HCV1 <- cumsum(rowSums(param_used["report_death_HC"]*out_mean[,(HCVindex+1)]%*%mort)) + + base_mort_I1 <- cumsum(rowSums(param_used["report_natdeathI"]*out_mean[,(Iindex+1)]%*%mort)) + base_mort_QI1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(QIindex+1)] %*%mort)) + base_mort_E1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(Eindex+1)] %*%mort)) + base_mort_QE1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(QEindex+1)] %*%mort)) + base_mort_EV1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(EVindex+1)] %*%mort)) + base_mort_EVR1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(EVRindex+1)] %*%mort)) + base_mort_ER1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(ERindex+1)] %*%mort)) + base_mort_QEV1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(QEVindex+1)] %*%mort)) + base_mort_QEVR1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(QEVRindex+1)]%*%mort)) + base_mort_QER1 <- cumsum(rowSums(param_used["report_natdeathI"] *out_mean[,(QERindex+1)] %*%mort)) + base_mort_CL1 <- cumsum(rowSums(param_used["report_natdeathCL"]*out_mean[,(CLindex+1)] %*%mort)) + base_mort_QC1 <- cumsum(rowSums(param_used["report_natdeathCL"]*out_mean[,(QCindex+1)] %*%mort)) + base_mort_X1 <- cumsum(rowSums(param_used["report_natdeathCL"]*out_mean[,(Xindex+1)] %*%mort)) + + + + results$death_natural_exposed <- round( + base_mort_H1+ + base_mort_HC1+ + base_mort_ICU1+ + base_mort_ICUC1+ + base_mort_ICUCV1+ + base_mort_Vent1+ + base_mort_VentC1+ + base_mort_Z1+ + base_mort_HCICU1+ + base_mort_HCV1+ + + base_mort_I1 + + base_mort_QI1 + + base_mort_E1 + + base_mort_QE1 + + base_mort_EV1+ + base_mort_EVR1+ + base_mort_ER1 + + base_mort_QEV1 + + base_mort_QEVR1 + + base_mort_QER1 + + base_mort_CL1 + + base_mort_QC1 + + base_mort_X1 + + ) + + # Natural deaths / non-exposed + + base_mort_S1 <- cumsum(rowSums(out_mean[,(Sindex+1)]%*%mort)) + base_mort_V1 <- cumsum(rowSums(out_mean[,(Vindex+1)]%*%mort)) + base_mort_QS1 <- cumsum(rowSums(out_mean[,(QSindex+1)]%*%mort)) + + base_mort_VR1 <- cumsum(rowSums(out_mean[,(VRindex+1)]%*%mort)) + base_mort_QV1 <- cumsum(rowSums(out_mean[,(QVindex+1)]%*%mort)) + + base_mort_R1 <- cumsum(rowSums(out_mean[,(Rindex+1)]%*%mort)) + base_mort_QR1 <- cumsum(rowSums(out_mean[,(QRindex+1)]%*%mort)) + base_mort_QVR1 <- cumsum(rowSums(out_mean[,(QVRindex+1)]%*%mort)) + + results$death_natural_non_exposed <- round( + base_mort_S1+ + base_mort_V1+ + base_mort_QS1+ + base_mort_VR1+ + base_mort_QV1+ + + base_mort_R1+ + base_mort_QR1 + + base_mort_QVR1 + ) + + ########################## Summary + + results$total_reportable_deaths <- + results$attributable_deaths + + results$death_natural_exposed + + results$total_reportable_deaths_end <- + last(results$total_reportable_deaths) + + results$total_deaths <- + results$total_reportable_deaths + + results$death_natural_non_exposed + + results$total_deaths_end <- last(results$total_deaths) + + results$total_cm_deaths_end <- round(last(results$cum_mortality)) + + if (print_death_summary) { + cat(paste("\nDeath count\n\tTotal:", results$total_deaths_end, "\n")) + cat(paste("\t- Attributable:", results$attributable_deaths_end, "(reportable)\n")) + cat(paste("\t- Natural Exposed:", last(results$death_natural_exposed), "(reportable)\n")) + cat(paste("\t- Natural Non-Exposed:", last(results$death_natural_non_exposed), "(non-reportable)\n")) + cat(paste("\tTotal Reportable:", results$total_reportable_deaths_end, "\n")) + cat("Death count (via CM for sum of all reportables):\n") + cat(paste("\tCM:", results$total_cm_deaths_end, "\n")) + } + + return(results) +} + + +# process_ode_outcome <- function(out, iterations,intv_vector){ + +# out_min<-out$min +# out_max<-out$max +# out_mean<-out$mean + +# critH<-c() +# crit<-c() +# critV<-c() + +# for (i in 1:length(times)){ +# critH[i]<-min(1-fH((sum(out_mean[i,(Hindex+1)]))+sum(out_mean[i,(ICUCindex+1)])+sum(out_mean[i,(ICUCVindex+1)])),1) +# crit[i]<-min(1-fICU((sum(out_mean[i,(ICUindex+1)]))+(sum(out_mean[i,(Ventindex+1)]))+(sum(out_mean[i,(VentCindex+1)])))) +# critV[i]<-min(1-fVent((sum(out_mean[i,(Ventindex+1)]))),1) +# } + +# # total population +# pop1<-out_mean[,(Sindex+1)]+out_mean[,(Eindex+1)]+out_mean[,(Iindex+1)]+out_mean[,(CLindex+1)]+out_mean[,(Rindex+1)]+ +# out_mean[,(Xindex+1)]+out_mean[,(Vindex+1)]+out_mean[,(Zindex+1)]+out_mean[,(EVindex+1)]+out_mean[,(ERindex+1)]+out_mean[,(EVRindex+1)]+ +# out_mean[,(QSindex+1)]+out_mean[,(QEindex+1)]+out_mean[,(QIindex+1)]+out_mean[,(QCindex+1)]+out_mean[,(QRindex+1)]+ +# out_mean[,(QVindex+1)]+out_mean[,(QEVindex+1)]+out_mean[,(QERindex+1)]+out_mean[,(QVRindex+1)]+out_mean[,(QEVRindex+1)]+ +# out_mean[,(Hindex+1)]+out_mean[,(HCindex+1)]+out_mean[,(ICUindex+1)]+out_mean[,(ICUCindex+1)]+out_mean[,(ICUCVindex+1)]+ +# out_mean[,(Ventindex+1)]+out_mean[,(VentCindex+1)]+out_mean[,(HCICUindex+1)]++out_mean[,(HCVindex+1)] +# tpop1<-rowSums(pop1) +# time<-as.Date(out_mean[,1]+startdate) + +# dailyinc1<-out$mean_cases # daily incidence +# cuminc1<-out$mean_cum_cases # cumulative incidence +# previcureq1<-rowSums(out_mean[,(Hindex+1)])+ rowSums(out_mean[,(ICUCindex+1)])+rowSums(out_mean[,(ICUCVindex+1)]) # surge beds occupancy +# previcureq21<-rowSums(out_mean[,(ICUindex+1)])+rowSums(out_mean[,(VentCindex+1)]) # icu beds occupancy +# previcureq31<-rowSums(out_mean[,(Ventindex+1)]) # ventilator occupancy +# cmortality1<-rowSums(out_mean[,(CMindex+1)]) # cumulative mortality +# overloadH1<-rowSums(out_mean[,(HCindex+1)]) # requirement for beds +# overloadICU1<-rowSums(out_mean[,(ICUCindex+1)])+rowSums(out_mean[,(HCICUindex+1)]) # requirement for icu beds +# overloadICUV1<-rowSums(out_mean[,(ICUCVindex+1)]) # requirement for ventilators +# overloadVent1<-rowSums(out_mean[,(VentCindex+1)])+rowSums(out_mean[,(HCVindex+1)]) # requirement for ventilators +# ccases1<-rowSums(out_mean[,(Cindex+1)]) # cumulative cases +# reqsurge1<-rowSums(out_mean[,(Hindex+1)])+overloadH1 +# reqicu1<-rowSums(out_mean[,(ICUindex+1)])+overloadICU1 +# reqvent1<-rowSums(out_mean[,(Ventindex+1)])+overloadICUV1+overloadVent1 + + +# ########################## CALCULATE MORTALITY +# dexo2_hist <- rep(0,length(times)) +# dexo2c_hist <- rep(0,length(times)) +# dexv_hist <- rep(0,length(times)) +# dexvc_hist <- rep(0,length(times)) +# for (tt in times) { +# if(tt < max(times)){ +# if(intv_vector$dex[tt*20+1]) { +# dexo2_hist[tt+1] <- parameters["dexo2"] +# dexo2c_hist[tt+1] <- parameters["dexo2c"] +# dexv_hist[tt+1] <- parameters["dexv"] +# dexvc_hist[tt+1] <- parameters["dexvc"] +# } else { +# dexo2_hist[tt+1] <- 1 +# dexo2c_hist[tt+1] <- 1 +# dexv_hist[tt+1] <- 1 +# dexvc_hist[tt+1] <- 1 +# } +# } else { +# dexo2_hist[tt+1] <- dexo2_hist[tt] +# dexo2c_hist[tt+1] <- dexo2c_hist[tt] +# dexv_hist[tt+1] <- dexv_hist[tt] +# dexvc_hist[tt+1] <- dexvc_hist[tt] +# } +# } + +# cinc_mort_1 <- cumsum(rowSums(parameters["nus"]*parameters["propo2"]*parameters["pdeath_ho"]*dexo2_hist*(out_mean[,(Hindex+1)]%*%ifr[,2]))) +# cinc_mort_2 <- cumsum(rowSums(parameters["nus"]*(1-parameters["propo2"])*parameters["pdeath_h"]*(out_mean[,(Hindex+1)]%*%ifr[,2]))) + +# cinc_mort_3 <- cumsum(rowSums(parameters["nusc"]*parameters["report_death_HC"]*parameters["propo2"]*parameters["pdeath_hco"]*(out_mean[,(HCindex+1)]%*%ifr[,2]))) +# cinc_mort_4 <- cumsum(rowSums(parameters["nusc"]*parameters["report_death_HC"]*(1-parameters["propo2"])*parameters["pdeath_hc"]*(out_mean[,(HCindex+1)]%*%ifr[,2]))) + +# cinc_mort_5 <- cumsum(rowSums(parameters["nu_icu"]*parameters["propo2"]*parameters["pdeath_icuo"]*dexo2_hist*(out_mean[,(ICUindex+1)]%*%ifr[,2]))) +# cinc_mort_6 <- cumsum(rowSums(parameters["nu_icu"]*(1-parameters["propo2"])*parameters["pdeath_icu"]*(out_mean[,(ICUindex+1)]%*%ifr[,2]))) +# cinc_mort_7 <- cumsum(rowSums(parameters["nu_icuc"]*parameters["propo2"]*parameters["pdeath_icuco"]*dexo2c_hist*(out_mean[,(ICUCindex+1)]%*%ifr[,2]))) +# cinc_mort_8 <- cumsum(rowSums(parameters["nu_icuc"]*(1-parameters["propo2"])*parameters["pdeath_icuc"]*(out_mean[,(ICUCindex+1)]%*%ifr[,2]))) + +# cinc_mort_9 <- cumsum(rowSums(parameters["nu_vent"]*parameters["pdeath_vent"]*dexv_hist*(out_mean[,(Ventindex+1)]%*%ifr[,2]))) +# cinc_mort_10 <- cumsum(rowSums(parameters["nu_ventc"]*parameters["pdeath_ventc"]*dexvc_hist*(out_mean[,(VentCindex+1)]%*%ifr[,2]))) +# cinc_mort_11 <- cumsum(rowSums(parameters["nu_ventc"]*parameters["pdeath_ventc"]*dexvc_hist*(out_mean[,(ICUCVindex+1)]%*%ifr[,2]))) + +# cinc_mort_12 <- cumsum(rowSums(parameters["nusc"]*parameters["report_death_HC"]*parameters["propo2"]*parameters["pdeath_icu_hco"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) +# cinc_mort_13 <- cumsum(rowSums(parameters["nusc"]*parameters["report_death_HC"]*(1-parameters["propo2"])*parameters["pdeath_icu_hc"]*(out_mean[,(HCICUindex+1)]%*%ifr[,2]))) +# cinc_mort_14 <- cumsum(rowSums(parameters["nu_ventc"]*parameters["report_death_HC"]*parameters["pdeath_vent_hc"]*(out_mean[,(HCVindex+1)]%*%ifr[,2]))) + +# cinc_mort_H1 <- cinc_mort_1 + cinc_mort_2 +# cinc_mort_HC1 <- cinc_mort_3 + cinc_mort_4 + cinc_mort_12 + cinc_mort_13 + cinc_mort_14 +# cinc_mort_ICU1 <- cinc_mort_5 + cinc_mort_6 +# cinc_mort_ICUC1 <- cinc_mort_7 + cinc_mort_8 +# cinc_mort_Vent1 <- cinc_mort_9 +# cinc_mort_VentC1 <- cinc_mort_10 +# cinc_mort_ICUCV1 <- cinc_mort_11 + +# base_mort_H1 <- cumsum(rowSums(out_mean[,(Hindex+1)]%*%mort)) +# base_mort_HC1 <- cumsum(rowSums(parameters["report_death_HC"]*out_mean[,(HCindex+1)]%*%mort)) +# base_mort_ICU1 <- cumsum(rowSums(out_mean[,(ICUindex+1)]%*%mort)) +# base_mort_ICUC1 <- cumsum(rowSums(out_mean[,(ICUCindex+1)]%*%mort)) +# base_mort_ICUCV1 <- cumsum(rowSums(out_mean[,(ICUCVindex+1)]%*%mort)) +# base_mort_Vent1 <- cumsum(rowSums(out_mean[,(Ventindex+1)]%*%mort)) +# base_mort_VentC1 <- cumsum(rowSums(out_mean[,(VentCindex+1)]%*%mort)) +# base_mort_Z1 <- cumsum(rowSums(out_mean[,(Zindex+1)]%*%mort)) +# base_mort_HCICU1 <- cumsum(rowSums(parameters["report_death_HC"]*out_mean[,(HCICUindex+1)]%*%mort)) +# base_mort_HCV1 <- cumsum(rowSums(parameters["report_death_HC"]*out_mean[,(HCVindex+1)]%*%mort)) + +# base_mort_V1 <- cumsum(rowSums(out_mean[,(Vindex+1)]%*%mort)) +# base_mort_S1 <- cumsum(rowSums(out_mean[,(Sindex+1)]%*%mort)) +# base_mort_QS1 <- cumsum(rowSums(out_mean[,(QSindex+1)]%*%mort)) +# base_mort_QR1 <- cumsum(rowSums(out_mean[,(QRindex+1)]%*%mort)) +# base_mort_R1 <- cumsum(rowSums(out_mean[,(Rindex+1)]%*%mort)) +# base_mort_QVR1 <- cumsum(rowSums(out_mean[,(QVRindex+1)]%*%mort)) +# base_mort_VR1 <- cumsum(rowSums(out_mean[,(VRindex+1)]%*%mort)) +# base_mort_QV1 <- cumsum(rowSums(out_mean[,(QVindex+1)]%*%mort)) + +# base_mort_E1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(Eindex+1)]%*%mort)) +# base_mort_I1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(Iindex+1)]%*%mort)) +# base_mort_CL1 <- cumsum(rowSums(parameters["report_natdeathCL"]*out_mean[,(CLindex+1)]%*%mort)) +# base_mort_X1 <- cumsum(rowSums(parameters["report_natdeathCL"]*out_mean[,(Xindex+1)]%*%mort)) +# base_mort_QE1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(QEindex+1)]%*%mort)) +# base_mort_QI1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(QIindex+1)]%*%mort)) +# base_mort_QC1 <- cumsum(rowSums(parameters["report_natdeathCL"]*out_mean[,(QCindex+1)]%*%mort)) +# base_mort_ER1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(ERindex+1)]%*%mort)) +# base_mort_EV1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(EVindex+1)]%*%mort)) +# base_mort_EVR1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(EVRindex+1)]%*%mort)) +# base_mort_QEV1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(QEVindex+1)]%*%mort)) +# base_mort_QER1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(QERindex+1)]%*%mort)) +# base_mort_QEVR1 <- cumsum(rowSums(parameters["report_natdeathI"]*out_mean[,(QEVRindex+1)]%*%mort)) + + +# # Export in a cohesive format ---- +# results <- list() +# results$time <- startdate + times # dates +# results$Rt <- out$mean_Rt +# results$cum_mortality <- round(cmortality1) # cumulative mortality +# results$pct_total_pop_infected <- out$mean_infections +# results$doubling_time <- round(log(2)*7 / (log(dailyinc1[2+7] / dailyinc1[2])), 2) # (Baseline only) to double the number of infections at inception +# results$required_beds <- round(previcureq1) # required beds +# results$saturation <- parameters["beds_available"] # saturation +# results$daily_incidence <- round(dailyinc1) # daily incidence (Reported) +# results$daily_total_cases <- round(out$mean_daily_infection) # daily incidence (Reported + Unreported) # daily incidence (Reported + Unreported) +# results$hospital_surge_beds <- round(previcureq1) +# results$icu_beds <- round(previcureq21) +# results$ventilators <- round(previcureq31) +# results$normal_bed_requirement <- round(reqsurge1) #real required beds. previcureq1 above is the occupancy +# results$icu_bed_requirement <- round(reqicu1) +# results$icu_ventilator_requirement <- round(reqvent1) + +# results$death_natural_non_exposed <- round(base_mort_S1+base_mort_V1+base_mort_QS1) +# results$death_natural_exposed <- round(base_mort_E1 + base_mort_I1 + base_mort_CL1 + base_mort_X1 + +# base_mort_R1+ base_mort_ER1 + base_mort_EV1+ base_mort_EVR1+ +# base_mort_QE1 + base_mort_QI1 + base_mort_QC1 + base_mort_QR1 + +# base_mort_QEV1 + base_mort_QER1 + base_mort_QEVR1 + base_mort_QVR1 + +# base_mort_H1+base_mort_HC1+base_mort_ICU1+base_mort_ICUC1+base_mort_ICUCV1+ +# base_mort_Vent1+base_mort_VentC1+base_mort_HCICU1+base_mort_HCV1) +# results$death_treated_hospital <- round(cinc_mort_H1) +# results$death_treated_icu <- round(cinc_mort_ICU1) +# results$death_treated_ventilator <- round(cinc_mort_Vent1) +# results$death_untreated_hospital <- round(cinc_mort_HC1) +# results$death_untreated_icu <- round(cinc_mort_ICUC1) +# results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) +# results$attributable_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + +# results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator +# results$attributable_deaths_end <- last(results$attributable_deaths) +# results$total_deaths <- results$attributable_deaths + results$death_natural_non_exposed + results$death_natural_exposed +# results$total_deaths_end <- last(results$total_deaths) +# results$total_reported_deaths_end <- last(results$cum_mortality) +# results$base_mort_H <- base_mort_H1 +# results$base_mort_HC <- base_mort_HC1 +# results$base_mort_ICU <- base_mort_ICU1 +# results$base_mort_ICUC <- base_mort_ICUC1 +# results$base_mort_ICUCV <- base_mort_ICUCV1 +# results$base_mort_Vent <- base_mort_Vent1 +# results$base_mort_VentC <- base_mort_VentC1 +# results$base_mort_S <- base_mort_S1 +# results$base_mort_E <- base_mort_E1 +# results$base_mort_I <- base_mort_I1 +# results$base_mort_CL <- base_mort_CL1 +# results$base_mort_X <- base_mort_X1 +# results$base_mort_QS <- base_mort_QS1 +# results$base_mort_QE <- base_mort_QE1 +# results$base_mort_QI <- base_mort_QI1 +# results$base_mort_QC <- base_mort_QC1 +# results$base_mort_QR <- base_mort_QR1 +# results$base_mort_R <- base_mort_R1 +# results$base_mort_V <- base_mort_V1 +# results$base_mort_EV <- base_mort_EV1 +# results$base_mort_ER <- base_mort_ER1 +# results$base_mort_EVR <- base_mort_EVR1 +# results$base_mort_QV <- base_mort_QV1 +# results$base_mort_QEV <- base_mort_QEV1 +# results$base_mort_QER <- base_mort_QER1 +# results$base_mort_QEVR <- base_mort_QEVR1 +# results$base_mort_QVR <- base_mort_QVR1 +# results$base_mort_QVR <- base_mort_QVR1 +# results$base_mort_HCICU <- base_mort_HCICU1 +# results$base_mort_HCV <- base_mort_HCV1 + +# ## AGE DEPENDENT MORTALITY +# cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out_mean[,(Hindex+1)]) +# cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out_mean[,(HCindex+1)]) +# cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out_mean[,(ICUindex+1)] +# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out_mean[,(ICUCindex+1)] +# cinc_mort_ICUCV1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(ICUCVindex+1)] +# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out_mean[,(Ventindex+1)] +# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(VentCindex+1)] +# totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_ICUCV1+cinc_mort_Vent1+cinc_mort_VentC1) +# basemort_H1<-(out_mean[,(Hindex+1)]) +# basemort_HC1<-(out_mean[,(HCindex+1)]) +# basemort_ICU1<-(out_mean[,(ICUindex+1)]) +# basemort_ICUC1<-(out_mean[,(ICUCindex+1)]) +# basemort_ICUCV1<-(out_mean[,(ICUCVindex+1)]) +# basemort_Vent1<-(out_mean[,(Ventindex+1)]) +# basemort_VentC1<-(out_mean[,(VentCindex+1)]) +# totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_ICUCV1+basemort_Vent1+basemort_VentC1) +# tc<-c() + +# for (i in 1:dim(cinc_mort_H1)[1]) { +# for (j in 1:dim(cinc_mort_H1)[2]) { +# tc<-rbind(tc,c(i, j, totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) +# } +# } +# tc<-as.data.frame(tc) +# colnames(tc)<-c("Day","Age","value") + +# results$tc <- tc %>% +# mutate(Date = startdate + Day, +# age_cat = case_when( +# Age >= 1 & Age <= 6 ~ "≤ 30 y.o.", +# Age > 6 & Age <= 8 ~ "30-40 y.o.", +# Age > 8 & Age <= 10 ~ "40-50 y.o.", +# Age > 10 & Age <= 12 ~ "50-60 y.o.", +# Age > 12 & Age <= 14 ~ "60-70 y.o.", +# Age >= 15 ~ "≥ 70 y.o.")) %>% +# mutate(age_cat = factor(age_cat, levels = rev(c("≤ 30 y.o.", "30-40 y.o.", +# "40-50 y.o.", "50-60 y.o.", "60-70 y.o.", "≥ 70 y.o.")))) + +# mortality_lag <- data.frame(Age = popstruc$agefloor) +# if(nrow(out_mean) >= 30) mortality_lag <- bind_cols(mortality_lag, +# data.frame(day30 = out_mean[30,CMindex+1]/out_mean[30,Cindex+1]) %>% +# mutate(day30 = ifelse(is.infinite(day30), 0, day30)) %>% +# rename(`Day 30` = day30)) +# if(nrow(out_mean) >= 60) mortality_lag <- bind_cols(mortality_lag, +# data.frame(day60 = out_mean[60,CMindex+1]/out_mean[60,Cindex+1]) %>% +# mutate(day60 = ifelse(is.infinite(day60), 0, day60)) %>% +# rename(`Day 60` = day60)) +# if(nrow(out_mean) >= 90) mortality_lag <- bind_cols(mortality_lag, +# data.frame(day90 = out_mean[90,CMindex+1]/out_mean[90,Cindex+1]) %>% +# mutate(day90 = ifelse(is.infinite(day90), 0, day90)) %>% +# rename(`Day 90` = day90)) +# if(nrow(out_mean) >= 120) mortality_lag <- bind_cols(mortality_lag, +# data.frame(day120 = out_mean[120,CMindex+1]/out_mean[120,Cindex+1]) %>% +# mutate(day120 = ifelse(is.infinite(day120), 0, day120)) %>% +# rename(`Day 120` = day120)) + +# results$mortality_lag <- mortality_lag + + +# if(iterations>1){ + +# previcureq1_max<-rowSums(out_max[,(Hindex+1)])+ rowSums(out_max[,(ICUCindex+1)])+rowSums(out_max[,(ICUCVindex+1)]) # surge beds occupancy +# previcureq21_max<-rowSums(out_max[,(ICUindex+1)])+rowSums(out_max[,(VentCindex+1)]) # icu beds occupancy +# previcureq31_max<-rowSums(out_max[,(Ventindex+1)]) # ventilator occupancy +# cmortality1_max<-rowSums(out_max[,(CMindex+1)]) # cumulative mortality +# overloadH1_max<-rowSums(out_max[,(HCindex+1)]) # requirement for beds +# overloadICU1_max<-rowSums(out_max[,(ICUCindex+1)])+ rowSums(out_max[,(HCICUindex+1)]) # requirement for icu beds +# overloadICUV1_max<-rowSums(out_max[,(ICUCVindex+1)])+ rowSums(out_max[,(HCVindex+1)]) # requirement for ventilators +# overloadVent1_max<-rowSums(out_max[,(VentCindex+1)]) # requirement for ventilators +# ccases1_max<-rowSums(out_max[,(Cindex+1)]) # cumulative cases +# reqsurge1_max<-rowSums(out_max[,(Hindex+1)])+overloadH1 # surge beds total requirements +# reqicu1_max<-rowSums(out_max[,(ICUindex+1)])+overloadICU1 # ICU beds total requirements +# reqvent1_max<-rowSums(out_max[,(Ventindex+1)])+overloadICUV1+overloadVent1 # ventilator beds total requirements + +# previcureq1_min<-rowSums(out_min[,(Hindex+1)])+rowSums(out_min[,(ICUCindex+1)])+rowSums(out_min[,(ICUCVindex+1)]) # surge beds occupancy +# previcureq21_min<-rowSums(out_min[,(ICUindex+1)])+rowSums(out_min[,(VentCindex+1)]) # icu beds occupancy +# previcureq31_min<-rowSums(out_min[,(Ventindex+1)]) # ventilator occupancy +# cmortality1_min<-rowSums(out_min[,(CMindex+1)]) # cumulative mortality +# overloadH1_min<-rowSums(out_min[,(HCindex+1)]) # requirement for beds +# overloadICU1_min<-rowSums(out_min[,(ICUCindex+1)]) # requirement for icu beds +# overloadICUV1_min<-rowSums(out_min[,(ICUCVindex+1)]) # requirement for ventilators +# overloadVent1_min<-rowSums(out_min[,(VentCindex+1)]) # requirement for ventilators +# ccases1_min<-rowSums(out_min[,(Cindex+1)]) # cumulative cases +# reqsurge1_min<-rowSums(out_min[,(Hindex+1)])+overloadH1 # surge beds total requirements +# reqicu1_min<-rowSums(out_min[,(ICUindex+1)])+overloadICU1 # ICU beds total requirements +# reqvent1_min<-rowSums(out_min[,(Ventindex+1)])+overloadICUV1+overloadVent1 # ventilator beds total requirements + +# results$Rt_max <- out$max_Rt +# results$Rt_min <- out$min_Rt + +# results$daily_incidence_max <- out$max_cases +# results$daily_incidence_min <- out$min_cases + +# results$daily_total_cases_max <- out$max_daily_infection +# results$daily_total_cases_min <- out$min_daily_infection + +# results$total_reported_deaths_end_min <- last(cmortality1_min) +# results$total_reported_deaths_end_max <- last(cmortality1_max) + +# results$pct_total_pop_infected_min <- out$min_infections # proportion of the population that has been infected at the end of the simulation +# results$pct_total_pop_infected_max <- out$max_infections # proportion of the population that has been infected at the end of the simulation +# } +# return(results) +# } + From 133125656aa963cf6e2612358fb9e8bbc957f4d8 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 17:04:02 +0100 Subject: [PATCH 14/31] update test to io function to use 16.2 template --- ...emplate_CoMoCOVID-19App_io_intv_sched.xlsx | Bin 0 -> 37309 bytes comoOdeCpp/tests/testthat/test_io_functions.R | 25 +++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_io_intv_sched.xlsx diff --git a/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_io_intv_sched.xlsx b/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_io_intv_sched.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f2a7bfa87951f2635773a6311b30666d8f6fe646 GIT binary patch literal 37309 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 literal 0 HcmV?d00001 diff --git a/comoOdeCpp/tests/testthat/test_io_functions.R b/comoOdeCpp/tests/testthat/test_io_functions.R index cb17f1c..fcdeb31 100644 --- a/comoOdeCpp/tests/testthat/test_io_functions.R +++ b/comoOdeCpp/tests/testthat/test_io_functions.R @@ -4,7 +4,7 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A source(paste0(getwd(), "/common.R"), local = environment()) init(e=environment()) - file_path <- paste0(getwd(), "/data/Template_CoMoCOVID-19App_new_16.1_sa.xlsx") + file_path <- paste0(getwd(), "/data/templates_v16.2/Template_CoMoCOVID-19App_io_intv_sched.xlsx") if (!exists("inputs", mode = "function")) { source(paste0(getwd(), CORE_FILE), local = environment()) @@ -36,6 +36,29 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A age_vaccine_max = parameters["age_vaccine_max"] ) + for (vv in names(vectors0)) { + if(!all(vectors0[[vv]] == intv_schd_base[[vv]])){ + print(vv) + print("vectors0[[vv]]") + print(vectors0[[vv]]) + print("intv_schd_base[[vv]]") + print(intv_schd_base[[vv]]) + } + expect_true(is.numeric((intv_schd_base[[vv]]))) + expect_true(all(vectors0[[vv]] == intv_schd_base[[vv]])) + } + for (vv in names(vectors)) { + if(!all(vectors[[vv]] == intv_schd_hype[[vv]])){ + print(vv) + print("vectors[[vv]]") + print(vectors[[vv]]) + print("intv_schd_hype[[vv]]") + print(intv_schd_hype[[vv]]) + } + expect_true(is.numeric((intv_schd_hype[[vv]]))) + expect_true(all(vectors[[vv]] == intv_schd_hype[[vv]])) + } + check_parameters_list_for_na(parameters) From 48a15e99add71388e42b30426cd821d288c593ab Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 17:05:13 +0100 Subject: [PATCH 15/31] update sensitivity test (draft) to use 16.2 template --- .../Template_CoMoCOVID-19App_sa.xlsx | Bin 0 -> 43722 bytes comoOdeCpp/tests/testthat/test-sensitivity.R | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_sa.xlsx diff --git a/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_sa.xlsx b/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_sa.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..775b2ea53299797078507a00398deb7441507103 GIT binary patch literal 43722 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�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 Qh7$VY37vBs8P~u4ACAee761SM literal 0 HcmV?d00001 diff --git a/comoOdeCpp/tests/testthat/test-sensitivity.R b/comoOdeCpp/tests/testthat/test-sensitivity.R index e4ce9f9..fd208af 100644 --- a/comoOdeCpp/tests/testthat/test-sensitivity.R +++ b/comoOdeCpp/tests/testthat/test-sensitivity.R @@ -4,8 +4,9 @@ test_that("Sensitivity", { source(paste0(getwd(), "/common.R"), local = environment()) init(e=environment()) + VERBOSE = FALSE - file_path <- paste0(getwd(), "/data/Template_CoMoCOVID-19App_new_16.1_sa.xlsx") + file_path <- paste0(getwd(), "/data/templates_v16.2/Template_CoMoCOVID-19App_sa.xlsx") if (!exists("inputs", mode = "function")) { source(paste0(getwd(), CORE_FILE), local = environment()) @@ -77,6 +78,12 @@ test_that("Sensitivity", { parameters_mod <- parameters parameters_mod[pp_name] = parameters_mod[pp_name] * sa_multipliers[match(pp_name, sa_parameters)] + if (VERBOSE) { + print(pp_name) + print(parameters[pp_name]) + print(parameters_mod[pp_name]) + } + covidOdeCpp_reset() output_message <- capture_output( out_hype_mod <- ode( @@ -98,6 +105,13 @@ test_that("Sensitivity", { processed_hype_mod_results <- process_ode_outcome_mortality(out_hype_mod, vectors, parameters_mod) + if (VERBOSE) { + print("processed_hype_results$total_cm_deaths_end:") + print(processed_hype_results$total_cm_deaths_end) + print("processed_hype_mod_results$total_cm_deaths_end:") + print(processed_hype_mod_results$total_cm_deaths_end) + } + if (sa_expect_mort_inc[match(pp_name, sa_parameters)]) { expect_gt( processed_hype_mod_results$total_cm_deaths_end, From 6fcabd9003cc2f4a0552b283f4b89931799c7139 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 17:23:52 +0100 Subject: [PATCH 16/31] update to template v16.2 in scenari01 tests --- .../Template_CoMoCOVID-19App_intv_split.xlsx | Bin 0 -> 37065 bytes .../Template_CoMoCOVID-19App_r_v_cpp.xlsx | Bin 0 -> 38559 bytes comoOdeCpp/tests/testthat/test-scenario01.R | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_intv_split.xlsx create mode 100644 comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_r_v_cpp.xlsx diff --git a/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_intv_split.xlsx b/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_intv_split.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e670380873c9f9ba24d098862c0ac6c0d147b526 GIT binary patch literal 37065 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 Date: Fri, 23 Oct 2020 17:26:04 +0100 Subject: [PATCH 17/31] archive v16.1 test templates --- .../data/Template_CoMoCOVID-19App_new_16.1.xlsx | Bin 35375 -> 0 bytes ...ate_CoMoCOVID-19App_new_16.1_intv_split.xlsx | Bin 34455 -> 0 bytes .../Template_CoMoCOVID-19App_new_16.1_sa.xlsx | Bin 35570 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1.xlsx delete mode 100644 comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx delete mode 100644 comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_sa.xlsx diff --git a/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1.xlsx b/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1.xlsx deleted file mode 100644 index 00975fa4a44e5b35572f7d298d63b6dee83cfc48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35375 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 diff --git a/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx b/comoOdeCpp/tests/testthat/data/Template_CoMoCOVID-19App_new_16.1_intv_split.xlsx deleted file mode 100644 index e2e714d8136a670b74bb4933a1f1228d623cddbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34455 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 Date: Fri, 23 Oct 2020 18:54:34 +0100 Subject: [PATCH 18/31] give non-zero value to amp and sigmaR for testing coverage --- .../Template_CoMoCOVID-19App_r_v_cpp.xlsx | Bin 38559 -> 37385 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_r_v_cpp.xlsx b/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_r_v_cpp.xlsx index 13ac57de1a34a2edf71620e4a89055b0d712e6df..cd7765c7a23641a6938f13bce265bf49a4e83ace 100644 GIT binary patch delta 10875 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 delta 11851 zcmZ{K1yo$yvTfrM+}+*XA!xAR65QP(1c%058X9+ZclThy65QQ_y9R!8&U^Q~d*AzO zjNM(Mt7`7KR(03dqk2XZLgrLK*1kZ%MEOKq%Yh*v8Gsp$glZBC0bpT%tV+7>ue%QK znq_6SZQi=9J0?(I$XQ4E?>i0*5?H%`GAsvuQLW&Y!wjTQ)_Ygh{P{+&dfOI@e=5-^ zNs~>QnXi$Kh1JD@ZUKj+ipQu68W$$PB{744+0&73DE2(pf&~EudoZS%`+Cc!Ws&W* zui2kd+ydANI|Y4>Rrytw>Jdzz8blG)d` z|6^FIY4c`~hYOJ3lY>VA%mo(tFp{&qaQjQ`y$zE_3nNPD2u#T;006+l zj@8`5)!fCw*zTjXgY9QlWqBxQtltiJK$zmTD5Rm`pb-QBPz?nDQ2bxv|1+7L#lzk% z2JC3t&xSU%fqF+QzHY12!cVKYs=3mJtFVh$taOlM^mn>1Wr+B@6oX2UU(;Y;eG1ocxc;gK79Qo3LWr$(kSvv+<;%ln`zeYj!iINy9a>P~>QdOSNI1bdmUpykV8ditWUvQu*B zZeG~E(97h&x$sNhz%$9~;T9As@am#g`(g9@60Y;pr`z{VDB1l_88JWzaC|61!w={$ z)Cjc-)1sts000bFnSlZrSHOeiS2O$O@3DbK3&Ek1Fqbf1p42{9o^r}5k%>UiOAi`V z1p3DD@0$>MH{do2qLM%O5apb&o}_B`yrx=CaxzyWViTr(EUuP_3MT%s?Y#5)IK1*n zexdAVE8ieKFIqL8Q%2_Rpuzt4;eVca-s&kNh-?5T>0t^pSi6`Zu++AFI*19 znpe8ogyTcIZ+WdWEkvNwKcv!zs{Pm*@|DoM=gg5H7z|4^sOWP)ARW5e0P{gfnZbI_ zuDy+YCc`WcawNg?-i~|oS!`8vK%21Yr#u{V@+=lihj{S=!j|2;bKd@{%p$1TL2XG! zIrUgETY3J$KW*wWYGZW&$*WX}jn{dlZ)5S6HeDp!2Jef7`?-qQo<=_DF)8FI zkWLxdkepN)S`RB7Jp=Te6{WFtC^tvsK><#Pow!t|?N?0!NV7f8Kyp9B4i56}=%2n7 zON&;)Pwlp<^foHrEIf(KI4si9SaYN9JPQvO-+{6~-Se0|tj1|*Oszf{0<@Ux(9)$5 zKn=peERDfWk^B^pUo3M&O}tCdOf8E|Wu{Bo#*vaW1v%?N<;NkL1knOG*d^++@J&v} zU6BxwkOM_S7t^-HnH=XKo3x#{JBw0N^A;zO*xf7yLZOTOAnIy4cVx?PbaER*!{HMn z@FP#h{{}X)A*y9tNsB-R9G)CA0hPzzQ$U)VgqjF)4lbr0;bEi-z>iy4!UBXXbl}kG zFgdXXEDwn7@oB>AIA_?YxW1rGoBj62XqSHZ7p2Vx%Z;!CZIQExSn{Bp3>U{>?$ybU zC)kB{NKGgd$}|>q&72a^S!uE4d3iw>YUCssRstR(fd||ZtUy=Bojb9#x@B!>hD~X? zDP4O6$E4m9-`qrk^%eo6q%$!au3=FsF0K@OmIp&o0#YO+?bDCsc_vO&v+sWR)@?SM zvw4`wqVa|I)U#;5Ojt4R3IY}_&Ewjep?GN*M- zogo7Q$={!bi30^^&?J+8`P5?$?hhuO@(PL_#%I>56D}dCSkT_gYh{upB0U}{;z7h0 z84Gd^AcwMJM(eKpX56&A3q3a8p0nOhAeICF3qG7lAqJ(Ahr7Lw3)d;FVtyUXe1BPK z*?BImYZE#r;|`&olB`~xkSP1>j><6vir)J{ZNyKnG{7O*#UcRX!!~79=F=XM^zH)Y zH@eKu9Bcdqq}V_bE8ik41K6+HL)9ucxJn)_-X;qpv8S1D}9K^=w_1MW~g#xr4PQJUO)0gv88qV5`8vU#)<(;*Ax0`pT zBGXhMDL}RYl7saZA>64?@w=PO62@guv8(SQ-aA#XQ+xGI@L$^denTZ|FTI}!Iox!N z_$${Zkm|Vew9E%(`JmpNs%~Cit0O*oBw%Q@zA9lt(YEVe&XllpZ!{V%xm+I$o-Pnp zx$1jtd43NsvS6 zfu|&hA#Hzv&m{1HnUyUK9oN~RyM#KO8KffT%~?v1myPsyE&6kWu7Zz#8kM}y2Piza9g*W9`_l|ZkT8I;(kg65=+d}WoPqL2+?cSbodx< zQw;lLB!S+J%s=zZRrngfRkes%SZ?YZm=>jO$~0t0cD=Y|%+>K>E15fLoIItbPq{4T z2ne||I+BZ3>bt!>cs-EdhydD#C*0Kh$`0od_V&!Pt{+zgNfo>1vg>Q1Rd@UhSPYcR z>*VV>j@Q?K>N&m7J8KGQ!Yq;Y&L>1Uq>df(5BR-GEkO4fN0WI%v}JYagVgtHZs&7$ z{IfKLkq`FZ9HselVy!EQ?uk$4-Jvc&-Cp&vI#4U@-W3(hPJ6vI&_^@p6{nI!Z5L>t zLC~OlOrGPg*s;@a5ZR0JdAD^R9~$^V{5fDFLvLahL%>n6!d%1uJTB|YYhss!JlP94 zMv4*0{IarSKfd+j^rU`j?iha|TAj5XINo<%M6q#NSw5A!o|!xl;;+_(*7-x6rY*M& zT_I$_>t`;nb-cvKcYTb^Tt_h{InG8Oat)+l4UVJpv+Fex^{piTxC(bP-}Qw)@WiFC@GfhNNC4d%_9yUCI0{ZwD>$!7yiPH$vO77o{yk_3a zaPm{z&FF596koJD>F_Q>?|V7hJf-2>l596D10PcCVSii3okP`#dc_43G{I&Jd-1pS4!gb!ZmBjg@>VD=eFGO%l*W#jc#ClLr7 z0B#64`gz}fV+Fq53PX4Ox+ItVk@I#%<6B_qnCv*aTjkf$3A`u&b=Hyb3Vwv|apu+A z4&~XAky41J#D_*mz`u#38c5ZtKk}E~j~=!e8^R=#9!<@pk9~}kB9D|}#u`B0+9>`| z%>WBmoSQ0^X7asAu7V=n^kdZ`l?AX8_v}HvfkMHF2%E4DisP%8VLhK@eQStWt1-yT zDHNNElP)D%mSZ^e1IKx*>#*;r(@Ufo-=RDYQoJ1=*;4spiV>pXMBb;lK8$;0RTLKb zKo?l^v9FaR`*@%A`Q3d4jK8LD@)2j-U1Guc?tLI1i-AnsvE*81li~P0cgG5Zgf&l4 zc=&>9N-$b{@}SGNb7?dd$=&Ci_z^$sr{5WU>~ndHggPNysb)7;4eeoofVtmQIf^@K z!t{-5cQEW1>S(Nv>?!u*WT!D|Exw(=V7^!kmq(}Z6h{n-4Jy%Y)~@^mKQsANPMO9s zx^%HNt4fD`JhdpE%b%0@xRL`vXDs`193|)JPxb`)%Z*t!t(G7gL;}yed4|;EA)>*| z!0LAgu<&Cl0J#HwRqNRWMP%_owIH{j-N zhMOw}<_fR16Y_pNYSbI!v&=j5kvP3Cn_G=?^IO=1g}29r$#pYW(m$q9S0>C`zClk^ zPIVm;c=zKmR>ylSrL6)8*R(`bZ}9vT^2H($Qd!{5CgAv;Iqs}dDJZmGaP4uB@=Mi8 zbQn(Kbyd@T$yHl_?gzm)&=)A^Q?|`?H$Da{+*y@UQ1Z4M=ZD$;u_+HLG4Tx@+Zs|e zyc=wUH9!w#0rug@?W7ld~ZjV{+7w2Y1kzL@o`qUD6& zYK85Qj6d(GF`y0T(`jCiTQd??q3lmZ3Y+Ug>0o5#8@_eF9OQ*U{Npox3xed?r|JP6 z2SJ9#q$$TGx9qYaO2EThRCp+4lH649N5LBN zihZ5esgCeg2=Q+pAPTcSd8G#D>MO70tuzuRsw^5awh-$8tptlPTUhq7)ECxVM;x(R zArjnLk!^4dQIN|!Y<f5$K5hT>o5q*Z=oZ{YiEoZ6)gPNx?8F2&+>hBiptu+CX03RQwpmvFJ#xF+2e6ep&as=`eZF+LZU%5aMv9KHXGi*C++O5@?s9lTPz?dSo zjpFiB3=@@G&|pRq#P$8wev zAA~Sa@My$Rtyd@XsdCed_bf^tPMmPE{m+2mC~+Z@zXFne>8U@r zeJhC!|3eS>H$St{d^Gu?GM%yx^_Vp@k-6m%z0yDQ{>2UsJA{w!Z+0C;BcJ7i7uDN< za-DxuZ^3GEl6S*EnbUHU$3D@sgRd*~lG&b+L%1v(5_6z;*h)U3(klmrDEHR=`@yvp z3Gj_De`Q`x$O@L%aFeey=bwhcG*P=O?Ys6H`a8D|4Z` zv?vM&_b3p;xU>g`tiwz+g%>POLr^bW85&s9}^oYe?@4 z3)$P0szyFgrMAD2Bd7EpXk7AlaSK)5>o%|TR(R62HZU06_fD?5x`hesr9cU#v`>B_ z^uWT-eiYgru4LMLJvKGSz9!24I0m$nTO>93mUA^j@6ChSB<=zz z9yWD$74?zi{@!3VD@)TL86y~xK8YcG)SI=E_QwUz=@lsbt{7DxPSZZ>KKj=%-ixeU`6Q3IUVw-4BY^rz&CO@MSEY6$ zXOj%?W^>zTkT$DgA%ew8|suqP!UxmEe=Xh005zI@S_0{dX1uL zc#V=PgLyJZ`7S4FH`Y%yzV(wQE~DBmo@z3Yu>o2M{DK?fKAhfLE?-_>t!-^LJ~}$K zP3Cj*9lLYQXm=2P^VD*E^=kMzDY(4On;B!=5!-esl<_?I9JTSf?{ofsWj{rF=7!s< zAGpLS5ZB$~y>fiI5Vt?SnA0XW6VS8Tu|9vXRdqkTaxOHpc%ouudmsAiwXubpspPZs z8BudZRnNlwS>GjYmh40P(A(7vZ0|%daSU&ZE3g0F-7RV3C!o)5Iq-R(xcl`fz3X{w z*MRE(+p!M^U%YVCfkneeJJJtE~tH3Q`;-XHShA2&R@avjG>7aY0%9+oM7$!?t9 zC_&D=cWODT)bzcp(d=QRd&(96)0xAo0sB>b40lvCpZ&1C;;tl;=}R0&f@Yl(gM1qoZm4W+ATS1+d74jW zONo-;+t+HN*a{hpRM_hjv7Wl8BGx>;dcP))db7o1))Mf(ovv@HzD6Z;$vLnO-Qa5k zXiMQEL~57jQp-NI*DVS1DP=)bZDsEJq&w>x*0qW2j1}6>Z5&o@#(nJ{iE@aXZ zMK^3;yi=KVnu%EiqM!MI!AdNX?xE)y*$sibIu}p-o^TD)a5!Sqp(H&l2S4GaJV=nV zmGnOvoiESBst7S1WhOmtvOECCU3m7v2*>1VJQAnql~T?{r2$PjRv7&Aw{0Q>san4lxW^v=C z4q4;eu$C6uZuDtRjMJPcN177slatVNnd9*cYDH+tcO{ArJswlW%Ud84C+1kcPj#F$ zlxC<+^cSP!Fof4xyNU~2iucDmXq8)tDBQ;jxq{S0A`!3cN0_Oyt3C;;VmC@;zBk|X za!|;lo{&|%_`3`)xrYeUxG!#Z2NP+2&#s&3NGtX#`3=D;lE@kiTt`o;j-@35y0Q5b zJcQj;z8MO0qCg2#{U5-*oWXJJ3181m1!0q!h;gJPABGLR1J%$=>fOd-NMX!pXoV5dFwYCWsDlZ+A_a1M15ZAyw792tqhZX zIqeWU(bC^=Z@Dlr#Ye3+UA(BLr5bch3|8Q%CAIjzlumeD8)5-`%p%*_?C8r5A~B$8 zG8BbXP6R+~!oQ4VuudEG54HQ^H5&qmP%ZqJ%z5X_@&Hyi${&UyaY?09Ad#i%#NB(N zIt$Tag%rgg%DgBDkcb|xY$h1`>jFBLN9SSlrj2e#?;9=>-$r<5E`MOU;-yHu^yT3& zi^5Rn*WzN4K{EmAROW|byjvS4YI|WdKe*#-Xzq_uosMIxXr(i%&1-51H84-a%Pgl+ z=GJmZ=a2Opja-Ga#Bbf|ggUIo8s}xpV1A}sVHo~AP>rf(|T$O-s%l*PMtGp4@UY?PA35CwpC4z8y)C^Mn@>~ejdKj@;|*_KgY1R*bTL~#LZY~h zT29?gG)?h{?^KB{;*YWR{rcYBG=yAa3t|)2RLD7-Q9+5Yr(AqmQB0goaSA$x$qjx6 zF-y@)bv6OJ6P5dKs(*D7iPAKY?!jwju0*It^36`Vq&XS5JxAMB)+XwYA|b zT%UkHwquT&@tG2#3^-|LidW3Zcy#I5!=x^X7A59$epI|XMBuKS_a33xPf&B@CI+r^ zWXC#_VXb=S`4(X`tkRBIZ#XH&2bKqylXz!hxh&VVnnwfp$jObuXNShPQ;k_c-ov0z z3v#j<&X^duwZRQe80fc`d;*hnH{9;2X2rmnYIAa;o9@oBAlq(=apnpkVXu~~4R6|( zwc9O~mbIpm=hf$PEsj84vdf5E5QeU{GAxpo?Vbe2Bq(4gnlVzR6i*->8c*P`yEjU8&3gMd}Jc>mX-PJX8*c8dn*u& zw-EAOdem1qa@Z|$bM_KuG|?-f0V7XydSq%xZKT{ti?CT9t%5tzPJ5Vu!{TJhhCMze z{Bdf%gnTH+$R$t7l`MUSl(EUtsYb4rt2l7@J3AcOtv71l| zV;N=$R~E>CU!%b0K?9@^$;?*MT#kCo^>x`n{^ch?&vURGQoCIU;F#D2h~6+UW*K~n zz5*4~^J6g=!A0lC(GP6&tC0%KlxEfey1QeQU8HZnSFGX}k>SJ| z9^Js;$%#{M$$s+>fzVK(>&5=!C=1e9NM-0ZfOW}}Q-vudh}5?}i#KsY$}}lR3GiFp_SR%8qo3oj_;@P6h-XB|jC5jq$mZk1NJ|hlC7F%joy- zp#6OW=4+kFX&W%flF}3cHM#ktAY`0Bx_K31olzE)xFU&ElOw`kB1OM(6z3yvs=`$k z)dK87TL$TBY$$>_C4u@uql!5G(b*#Dafu-*hDb61y}}Mp!0b!0EAiu?EWm2&Jk=`n3HV*VV9^ z5H4d>$R7B+HYoii+F!aBMRRpzl1gB%RUwJ2y9m;0XGYmt3 zj?bvwQQ8SKO#+goA}>3Om7@;{W)5lvQuMLEaVR@em>B6IQ5CXc8;5xfe^CMD zv3Q8VEb%`%_mS7JU=4mph8XR(Bx8}Of(l+0Ao9l$bK`K(1L@-a?0=!6IMG$yrkHJ4 z#uaIkgkDPV8-i)8Rt_e{kTy#+ezxL&pFwDkAck&Hrv`+i;P-GP{Hdjf3xlAtk78Ux zCYeBKeo@L8pcPO!o*2&ozuGO6@e!MkmkiFbP+=c2Q>_G4s24$HUVq`}AN3r%6K!Ue z-AmblXg`|+Dhc>x*4~?zhA11!nUMGhSprE%#XqSWDx5+pg*s`bJmSNF+Krn;;bw&$ zuVTR$;{hy0ev!ZvR@E$!H>LDpPsE3`^rD|uF%0(fw?su#xah4BzZwb|#unG-c>myz zJyh_L64WF3kQe?D=^{#e^lHo%onQwhst3hgeo*T!Y#iU^#~9gXTv-$@fc< z{GN7UEf|trfbLzWKkidZR-)V{{jcUuzvZP+(}(K&$}RBcJjFB|Omm8NS>)gIl2v9l z*`PzL<=s2D8-X`(_&*cM^04w}0o0uqwL3scOxm&5H7$`$92P2*Rb@>HG5tvNZh}Oe z;&I?e4}NwKQl8)7XIvR^abUs4$XJv8J?>$;UvLfHt=(ZUw1JOFPB=Rge1${WSe|@6oiXY>6nc6+v#)6}e4nms3T$qg&+c$P|JA_l!yn-dbgY_K_d8%0 zi&=i3Ufk2X|}e$-Xf*NqM!@a$;WVqj(C0lZN^*?lK>V>BOGEDxZn&~H z!a-E#402V31OPB#z_NB2NuY32l~JP%~IDTQ}YCbx}S^jrx%y! z?wNLd$igS|mxGQL>z%y#8>F0Kce%))T*L<~qA)=5k!`CAhvy5AryvZ|wCFTt44ND0 z&~>FAAR%d@-v-02B3l3#X1Y#BTwt#xz1cXI1`0+Gm7L}Hw#qpq5NvByCktUm6X;ek zhsrTTUBwZ7^R}xj+fSKVRyrcO%n$+F$JFeonoTG`Osm&hY$BlkbW??R6XQ@NKkCJ@55}+SxN(^)HCwiti-c$eIV`Aca4nvwHF|CfHO@W~lL+aY zO#@pOuu(J*<1Il1tTbQ2T{sH9>)@LYwl!UFAi~QHmP$U~O0uu(tRVKd9m_LbyOK2< zwW5!ig9!xj+w5L3)!m|bM)P$aniI7PiR{PY&z`%qo$9k7Jf|%9cW>UgKFeEwgYNbm zsSZ1t{Z^@Npq}mlpZU;McZMBkO=Ygajf(yRG9bPxMYO&JMhN9rjErpwANDfN*HH56 z;qD^_MrJ+}&XT_~cR33+lB>`UI2XF8MKO@0YL@O1D67uRtI;a!WbLP|lxDkuf!DoF zh}yHeyE)mAE_04!t`;BL!E-vDw5x+UXsKsPM~YpnHrs~5n10~&uQ4HM=Tf}DW(WzqIMwecP2RA-lKHNZ&$N~FP^l#q9rGAfqJTwXcyeVXLkX%Z)bqOFavEMb z#r6W}L8!%Q?>FQ~R1h2bbo>rC`P@OhbIA1q2ZH|I%O?x|rMjr*Mn? zDflbQZ{b$v?~D2WpY*@vTP%ODLO?3=1ENU78!$Z*ZTH+&s1oL~ zAZg^VH-wa_Yo)51XA~$++P^h;_MCG~X!mHlT!q0*lVK6v#bpUrsw@u5S-y?^Z*gU9OtMulQ*^NBiU@cF0j5f@mQ~gG{_6+muo=;$w<-Iv z`q8b?T~c8y_k!RTj^?ify(+5aj80__y5jt2b{14PS3IExp`XUn2P%b3HHm00qhZXddGj80*VI9Zv_k_zT6gpFV=@>=r|R&a}Zb0h*R3^cfFsc>bIe4(gmVqhX$@&w{++U5cUmeR&s0gxFbWc^RRcM{WwNV z0KjUy-8$FaF{ECsThUX*Uqxta=;`F3@M{!vYT3lW1@}FuhIt)W22HiYMbcQoEET|C z8mI^NC4uAmJa?fJ->U1OXOLlaAg!YrBgw+r&0)&-WHH2NFTTE1w75d>@a9;me*!w5 z@C_Z7PYCyLGl9p`_tgfD{R6T06<5$%Dp6W2#7ITym>^8df6(nKUVAs#!9s@=!RKb1 z8oe+^lR6E7q6hSFXogRS9H1WFI*u1_tG+sAaKX_6%>JPkM!zw&d zo4C_wUGHx1q3WcU_8yLS!7rqbaQ#StF`^>D7faah`~xl4L4r^5w>6Izd;PY*d6d)i zhN3JF0f`0pM??CbmHk~@00e;S_iJA?SSRW|q+B>SBZ>pkAsjpvmGEC0UyEpU2upBB zv?xR}_$8VRk}wL)5<^JzuU{fO06_2u==b^?OFRlp7ET2I9!*5?N7wrILi_#J0{y>L zu3(55;=g+7KViuc|2vHJzdP%{Z|FaJ>mQK6NqqbNgZ!^ftNd51{m;YtPr>a!*!%y- zKK@O+3wDmh2E#j`A^npR;s~yap&|NbxDEgy|MC7_e-myn0-wk5Lwf3f8DhC1b9KPR zvD8HWJjDP2sDDTQSNK#2I6qbpG87iP5i0;$4+}Pq!vVX*ViEmIJ|hYM;Qw2Sfzx;Io4mM+;3A4|1T5t+jJlU_kkoKk7@tJc~z0Aq9{EZhlK-lVbnm{Xa Date: Fri, 23 Oct 2020 19:34:34 +0100 Subject: [PATCH 19/31] not sure what changed in this .xlsx --- .../Template_CoMoCOVID-19App_r_v_cpp.xlsx | Bin 37385 -> 37378 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_r_v_cpp.xlsx b/comoOdeCpp/tests/testthat/data/templates_v16.2/Template_CoMoCOVID-19App_r_v_cpp.xlsx index cd7765c7a23641a6938f13bce265bf49a4e83ace..0eb0a02467405786dcd02e0c7b865059a1a49232 100644 GIT binary patch delta 2451 zcmY+`c|6mN9{})e7M5u4Gd9OEs+lWS<%pQO#)HQZnh>Ef6Pi10v+<2`mK;fvlyi@x zT*Vv@IYO@FY;xoZ_4M<5UccAt_xbDn`W&y%pPx@+0VKKrQoaX1q~8rmH3Ps9C34p5 z0W5Ab3OJ)JRI1p}I#b3|Wo9;A_cN@Y`0UtWL)X-s%OO4W@-D}gI&>p74c{M$0~<)2 z7S%8a@vcd<#`C!^@i&~%F!9BvM|O82(kf8yxMskf*IT)Xlq_%gHuDJkxxWCFchtzz za#E@TqZukEdZuPhRpB%A z>K6^y2~o*=7vyEn)&@O6xC>we499mHL^mSZR`bpV|DuZtoJ*nvW{l~0>&fMUcNn{C zZZi|Fyg4RNFs4}jO9U4P#1GggA;~U4mZng|H;Z2!&0&6>nv)yD-Ow<#E{p#6>i$1i z9-&<)5TYxo>=)mJ>k#r$#C5FC`ena`z~JtE0p*I&eQooc3r_c7ozTB`=9TgH{aS=o_naNp)B2@R+z>ivUX!B_t|1at`)g++u~Jm zb~#U%`)o_niIT~yLFZ0l4$+dkEFE=ndc1zBQ&Pu-MFv~V{mT2%i3?G!L)6(cm5aUV zC6VM%t5bw)?DbXS&17SI%wW1TecFI^Yx7;-vsM;%cHqB z@>NAKsm9ecYKkX;Y2H_G+m}3373;0Q{t$fTDdvlOcZzY3f&7C$U-C)i^ka{eZiHl^ zATmjxijtN$PY~iR8L$vF<{@>X7R&`t$l2M%DWUJLgC`gp?6J=b&Q)|?@WIcvXR4qdYlR$_UxSlg$SndL z|RZff#d>CZUS*4$x}db7z| zKBm1-YQNipoaL0rEgb7&@8O45=_@)xIVXOMIbU<{-#SkDdCpbC+F6H@EIC(AxjCDY zr!5h!EU|`q){xW6!wV*txkHD#;l-i+i3;O9q`&Tm6*DV)hAt>N^Gg)hxpjz+^{vER zW6oOGoqY@XkrG(n=m1{b^rEfcp`~W{+zqDX8(%IRNV|*d_=|TVF?h<(q~zJU;5X_s z2C#fO^KwJRSwp8*ZWtHBT)09elB6`F0$R0u#|FvIBQ7!i_8~_Vi1)s|P+i9L=4%Th zuF5n4(fBvcD`&s$SXg%4@GX>ms!@zKx5WhES(@+cU@Rj}J>PW7$1^^TE^+a-ogoy4 zrXEtXMe zK{7rPAnSEyn_P_a%1bnWqcU`A+us+ZP^bcO5#v{$rVX>g6KrML|haxENe=e2n6m-W8Ch~WcQBw>*S z)#(Bv`CMvJBAS9~h7Cb4J@F zNsDAx;`qg$2?-kNIojax+F_ zMm&?O$s(2}JQ2QW3J+G3wX_&DQcxihQ1RQUU3P@>%8|4w=`zLjjb(kfMv;ZZXc~;_ zl97n~X&QrIAc+JIIeVGG@OsBUwZ96fXu*CW0pj_Gmq)_6K@38KNYFFeFkG)3gbSRf z{a;b*vS*cYGZ&~Fy+mdWb)1t=khp{@Vs}8>%2+LMa%oJHFOdLJ@$|X{KbTzk7}`D@ zpV%~gqx$r7tOhC}+Hu-uZqze04(wVTm(J$V9X zO^d2FPP{TslI7;+4CyW;9A=W)>Fl@dhIAU6Z>}1#MMjxuonKdUGXEA4u-YAOoB15Z z^t#f|m7;&!#B8dTBqTP#%8Ggyxh&78+8o~C!!8aQVhTQX5@lU!hxc56E*v&_h|u_g z+_PmvzB~Kq z=Mqjj0B^Ts$=5}Hmfra%o~KtWPX?4S;E>NT=vi{NPim^fKEEFJp~k+}`^kXbW^{kJ z6btd@76$8Wh+8dO5WO}k#QKu)EI%PJWKW!1eD~HPXWH<4U9~jVY z2HeS@h+fmG3{O||v->5tWjMVh*4YbOe;xEZn-pXf?l!T;k#K4;m1eTu>9QN)$a&cO zj`yda>mOruchrWr%%di}`)ku`mt9a<#)EOj^v+CN zXpMj{O>x%ci7eDgjYGoes;;dh6_-rg;lgEyLzvo8x2xNYoI;wwM`*6C71fS?l=Kii zJFXeCXMAJpp*Zmu#KxQh3izi;0DmY6zG}q+j$i`dNYMu;0htsva2e1|0seheyr_7v z7r>GI;4?s8 zvL3h!7*E!POhW;8x(IM1SqLzuOMvOXWx5F@$NC`IK*vB-xqnj_fHE+UG=T%+ev>MC zKn4Q?&IOtn#t=!=K|(4;Sn7YL9|;19f&Lp{5aKsZD;+d>q+lR4>;a2^bN%!Ims5l} Jk5m5B{tvw#f;j*H delta 2470 zcmY+GdpOe#8^^bq91}7*ljgLrn1-RqL&iu#Vku1yg>uNsX_*bf#{6=a!$a|qav{Fdj-(bN>^y^a&02qQG z<@hR33I_{0t<5{vJ=l;1+Vyyv8nnsH7033PNNwRe*papwi}lQi(CVRp1LHa+sNYUQ zZHlQ(`x~h5F4c3UDFq)qS6>DUItxhXtxo2X|M$lFwA@%LZzeEUsO!rHc_%oDovGIJ@;C z@0D^9{h{j(9Y}X=RltDu6kb4f&c?|fUJ0J5+C;xyypJL7rrTl7okTJIfP4uX{1r0T zKJ{u>eRrR;g8&prPg7u11bQ?@0yotLG=xB)gMbs_Fv;u2Bw8j;wQg5!p|d&AE0e&} zN0{}AR$JGH@Y(8P^^(}{aLl!}CE{(ScBVAoJz8@hd-&VpmzWQ>iJ#v8_@KV766)q( zI<*;K_{{=eHlLfd?zPJ~Io;*?)7ueP&7CiO;8vgvBVjDws#j>ulN~Y&?A+ioaqjD5n=Z5SgO?Dii!o@ia+}PouF<+$?*|D5P8U)R zz&mAIOHW~`-zenmAExcxnr6g~4JCU}Y1! zH_D6^IOPC^mK#3W@hh6&X%( zJ6BW!wvxjOTw*A=)lQPI&WSRtM9K@L)yl1H#b-1;qrv=NN9N-zqJ@wnx$*e@`6eW6 z;9By!iO_BHB5VDf;b5N`Gp~uN8h&im^y<`>^PST%_O+&hwWO=3qY_y?=B68FfpI+( z+pOMzV>HOjk@I=}8auF)b4uRK5G+^&4z_t!mV#l22Xe8 zgsry#sApz2-L#|Ra#tCgd#pw3Ap{AcbRNoalB&DIlydl~|K?r$b8CK8Y_zoqwVYy$ zS;=`V7Baim%PtHrL#ft-Fqt=FTRq}um!Bo}oRd2Cd!_CQF+asf5NK_8>#E`ks8*@J`vnkIvb)d{?t{GDJi5vSy47GqMGIc@MFEvd@NNz=7c~)1uKgiAFA>0@25}?c=?KR2K4OfXyRYHU}lSU82|^gPp~rb z)~O)*rY+eSo(IL1|J60ci<^Q>@5ITnH2WMD9w5@im4!sY4mP}sl6fdSF4A*tsJTMS zh~(pV^KKr#$?Ek5Dx@Tr06%MdgiGNmBjQ6*Yy)lAz*9Y8p$joh6c%&!St+dOW)8(aNfa9~aXz z^0ZEaU;Dq|+q=|>VG=F`WLaLx9@XBJ!*bH0DM8UIQZk3p;?1*iVyR1AU5wsRenxTiuKm!3w% zPq-DQDV%7;T+VV=L*-ek$T23ECv~)Vm_Fii@2qj?;^E_H4J= z_qsKU3C^YFC4U?{*%A)TJ1)Qk^RY_4iJgxEe=LL=w*$X5>E~834zGpO$dZU}`aWxX z`o`XI4)Fh&Fls+sZe|tY)Zeh(=adm;q*a|}HxM4LKqNQxGeummMMcXLu%stFDCvFo z&XT=%*F!cszrgk6h^OPqWj#v{B@RS!C(tFTRR|XM-b>epH@(icq=&l!k@#f-(uCt* zW?>!qOX8PsaDCt0!ym#Vq1vKM^8~H-oUblndOf1e8w={`CoaB8?l1+E9zWd@JTIbg zQzjxQFu?%7U*nEbp2?XZq0q2s&EfXdus>EpFKVrSx&{{ReiQ7*v{wv5ijHCuJ9xo7 zNAB@6qY|QxThojYV)AiO(-TRAOZ*Yl8^(DF{GjEJK~#m6u9lKZq`-Bla(R4@cvQii zZ_n@@9*-;Du@ie;ew++L!s9qsU{PFp*egU&YWUpNX120r#M$%Xa(;1b*B||v#q`rK zYy2D(QX@ocu;8sb#3MQ9^yZKJ1r>Wm3cRw=XM8W~m3cO;NLFS>r{d8FXk**KPw%)^==}2%XP@HZHF%kyqrD4E!Iuep2{R+AlCg?1{XXNXR{dJ-p9E Qf;WK|%%l7CQ~#s Date: Fri, 23 Oct 2020 19:35:23 +0100 Subject: [PATCH 20/31] lintr related updates --- .lintr | 2 +- .travis.yml | 8 +++++++- README.md | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.lintr b/.lintr index 582e57a..d2263a8 100644 --- a/.lintr +++ b/.lintr @@ -1 +1 @@ -exclusions: list("r_versions", "comoOdeCpp/tests/testthat/v13.13.core.R", "comoOdeCpp/R/RcppExports.R") +exclusions: list("r_versions", "comoOdeCpp/tests/testthat/v16.2.core.R", "comoOdeCpp/tests/testthat/v16.2.core.input_mod.R", "comoOdeCpp/R/RcppExports.R") diff --git a/.travis.yml b/.travis.yml index b740e0c..eadbd02 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ warnings_are_errors: false r_packages: - covr + - lintr before_install: - cd comoOdeCpp @@ -17,5 +18,10 @@ global: r_build_args: --no-build-vignettes --no-manual r_check_args: --no-build-vignettes --no-manual +after_script: + - R CMD INSTALL $PKG_TARBALL + - Rscript -e 'lintr::lint_package()' + after_success: - - Rscript -e 'library(covr);codecov()' \ No newline at end of file + - Rscript -e 'library(covr);codecov()' + - Rscript -e 'covr::coveralls()' \ No newline at end of file diff --git a/README.md b/README.md index 26045a9..01bfb46 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # comoOdeCpp [![GitHub release](https://img.shields.io/github/v/release/bogaotory/comoOdeCpp.svg)](https://GitHub.com/bogaotory/comoOdeCpp/releases/) -[![Build Status](https://travis-ci.org/ocelhay/comoOdeCpp.svg?branch=master)](https://travis-ci.org/ocelhay/comoOdeCpp) +[![Build Status](https://travis-ci.org/bogaotory/comoOdeCpp.svg?branch=master)](https://travis-ci.org/bogaotory/comoOdeCpp) ![Maintenance](https://img.shields.io/maintenance/yes/2020) -[![CodeFactor](https://www.codefactor.io/repository/github/ocelhay/comoodecpp/badge)](https://www.codefactor.io/repository/github/ocelhay/comoodecpp) +[![CodeFactor](https://www.codefactor.io/repository/github/bogaotory/comoodecpp/badge)](https://www.codefactor.io/repository/github/bogaotory/comoodecpp) [![Codecov](https://img.shields.io/codecov/c/github/bogaotory/comoOdeCpp)](https://codecov.io/gh/bogaotory/comoOdeCpp) From b7d17a64d3527a18892caeb0fcac73179db864da Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 20:18:47 +0100 Subject: [PATCH 21/31] remove hanging codecov() --- .lintr | 1 + .travis.yml | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.lintr b/.lintr index d2263a8..21c68e8 100644 --- a/.lintr +++ b/.lintr @@ -1 +1,2 @@ +linters: with_defaults(line_length_linter(120)) exclusions: list("r_versions", "comoOdeCpp/tests/testthat/v16.2.core.R", "comoOdeCpp/tests/testthat/v16.2.core.input_mod.R", "comoOdeCpp/R/RcppExports.R") diff --git a/.travis.yml b/.travis.yml index eadbd02..bc4b5f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,5 @@ r_check_args: --no-build-vignettes --no-manual after_script: - R CMD INSTALL $PKG_TARBALL - Rscript -e 'lintr::lint_package()' - + after_success: - - Rscript -e 'library(covr);codecov()' - - Rscript -e 'covr::coveralls()' \ No newline at end of file From 1adef151ef5637b2dd14602dd771f6f5e5335da3 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 20:45:22 +0100 Subject: [PATCH 22/31] move lintr to after_success --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index bc4b5f2..33bfff1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,12 +14,11 @@ before_install: global: - R_BUILD_ARGS="--no-build-vignettes --no-manual" - R_CHECK_ARGS="--no-build-vignettes --no-manual" + - LINTR_COMMENT_BOT=false r_build_args: --no-build-vignettes --no-manual r_check_args: --no-build-vignettes --no-manual -after_script: +after_success: - R CMD INSTALL $PKG_TARBALL - Rscript -e 'lintr::lint_package()' - -after_success: From 372526957b77f970e76dd09a51aacad33bf5f990 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 20:46:15 +0100 Subject: [PATCH 23/31] update code format --- comoOdeCpp/R/io.R | 92 +++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/comoOdeCpp/R/io.R b/comoOdeCpp/R/io.R index fc2d10f..b4fbf16 100644 --- a/comoOdeCpp/R/io.R +++ b/comoOdeCpp/R/io.R @@ -1,5 +1,5 @@ #' Read the "Interventions" tab of the template into a list of time-series vectors -#' +#' #' This function is to provide the same functionality of the inputs function that's part of the como App #' which is to translate the information from the Excel spreadsheet to a list of time-series vectors controlling #' the actions of different interventions during the course of the simulation @@ -16,48 +16,48 @@ read_intervention_schedule <- function( age_testing_max, # "Interventions Param" tab age_vaccine_min, # "Interventions Param" tab age_vaccine_max, # "Interventions Param" tab - FILL_1DAY_GAP = TRUE + fill_day_gap = TRUE ) { - v<-(format(as.POSIXct(inp[["Date Start"]],format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp[["Date Start"]]<-v2 + v <- (format(as.POSIXct(inp[["Date Start"]], format = "%Y/%m/%d %H:%M:%S"), format = "%d/%m/%y")) + v2 <- as.Date(v, format = "%d/%m/%y") + inp[["Date Start"]] <- v2 - v<-(format(as.POSIXct(inp[["Date End"]],format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp[["Date End"]]<-v2 + v <- (format(as.POSIXct(inp[["Date End"]], format = "%Y/%m/%d %H:%M:%S"), format = "%d/%m/%y")) + v2 <- as.Date(v, format = "%d/%m/%y") + inp[["Date End"]] <- v2 - - inp[["Date Start"]] = pmax(startdate, as.Date(inp[["Date Start"]])) - inp[["Date End"]] = pmax(startdate, as.Date(inp[["Date End"]])) + + inp[["Date Start"]] <- pmax(startdate, as.Date(inp[["Date Start"]])) + inp[["Date End"]] <- pmax(startdate, as.Date(inp[["Date End"]])) # cap intervention end dates with simulation end date - inp[["Date Start"]] = pmin(stopdate, as.Date(inp[["Date Start"]])) - inp[["Date End"]] = pmin(stopdate, as.Date(inp[["Date End"]])) + inp[["Date Start"]] <- pmin(stopdate, as.Date(inp[["Date Start"]])) + inp[["Date End"]] <- pmin(stopdate, as.Date(inp[["Date End"]])) - inp <- arrange(inp, `Date Start`) + inp <- dplyr::arrange(inp, "Date Start") - tv<-which(inp[["Apply to"]]==run) + tv <- which(inp[["Apply to"]] == run) intv_profile_list <- list( - list(text="Self-isolation if Symptomatic" , val_vec="si_vector" , val_default=0, bol_vec="isolation" ), - list(text="(*Self-isolation) Screening" , val_vec="scr_vector" , val_default=0, bol_vec="screen" ), - list(text="(*Self-isolation) Household Isolation" , val_vec="q_vector" , val_default=0, bol_vec="quarantine" ), - list(text="Social Distancing" , val_vec="sd_vector" , val_default=0, bol_vec="distancing" ), - list(text="Handwashing" , val_vec="hw_vector" , val_default=0, bol_vec="handwash" ), - list(text="Mask Wearing" , val_vec="msk_vector" , val_default=0, bol_vec="masking" ), - list(text="Working at Home" , val_vec="wah_vector" , val_default=0, bol_vec="workhome" ), - list(text="School Closures" , val_vec="sc_vector" , val_default=0, bol_vec="schoolclose" ), - list(text="Shielding the Elderly" , val_vec="cte_vector" , val_default=0, bol_vec="cocoon" ), - list(text="International Travel Ban" , val_vec="tb_vector" , val_default=0, bol_vec="travelban" ), - list(text="Vaccination" , val_vec="vc_vector" , val_default=0, bol_vec="vaccine" ), - list(text="(*Vaccination) Age Vaccine Minimum" , val_vec="minav_vector" , val_default=age_vaccine_min ), - list(text="(*Vaccination) Age Vaccine Maximum" , val_vec="maxav_vector" , val_default=age_vaccine_max ), - list(text="Mass Testing" , val_vec="mt_vector" , val_default=0, bol_vec="masstesting" ), - list(text="(*Mass Testing) Age Testing Minimum" , val_vec="minas_vector" , val_default=age_testing_min ), - list(text="(*Mass Testing) Age Testing Maximum" , val_vec="maxas_vector" , val_default=age_testing_max ), - list(text="Dexamethasone" , bol_vec="dex" ) + list(text = "Self-isolation if Symptomatic", val_vec = "si_vector", val_default = 0, bol_vec = "isolation"), + list(text = "(*Self-isolation) Screening", val_vec = "scr_vector", val_default = 0, bol_vec = "screen"), + list(text = "(*Self-isolation) Household Isolation", val_vec = "q_vector", val_default = 0, bol_vec = "quarantine"), + list(text = "Social Distancing", val_vec = "sd_vector", val_default = 0, bol_vec = "distancing"), + list(text = "Handwashing", val_vec = "hw_vector", val_default = 0, bol_vec = "handwash"), + list(text = "Mask Wearing", val_vec = "msk_vector", val_default = 0, bol_vec = "masking"), + list(text = "Working at Home", val_vec = "wah_vector", val_default = 0, bol_vec = "workhome"), + list(text = "School Closures", val_vec = "sc_vector", val_default = 0, bol_vec = "schoolclose"), + list(text = "Shielding the Elderly", val_vec = "cte_vector", val_default = 0, bol_vec = "cocoon"), + list(text = "International Travel Ban", val_vec = "tb_vector", val_default = 0, bol_vec = "travelban"), + list(text = "Vaccination", val_vec = "vc_vector", val_default = 0, bol_vec = "vaccine"), + list(text = "(*Vaccination) Age Vaccine Minimum", val_vec = "minav_vector", val_default = age_vaccine_min), + list(text = "(*Vaccination) Age Vaccine Maximum", val_vec = "maxav_vector", val_default = age_vaccine_max), + list(text = "Mass Testing", val_vec = "mt_vector", val_default = 0, bol_vec = "masstesting"), + list(text = "(*Mass Testing) Age Testing Minimum", val_vec = "minas_vector", val_default = age_testing_min), + list(text = "(*Mass Testing) Age Testing Maximum", val_vec = "maxas_vector", val_default = age_testing_max), + list(text = "Dexamethasone", bol_vec = "dex") ) intv_vectors <- list() @@ -67,33 +67,33 @@ read_intervention_schedule <- function( # default vectors ii_val_vec <- rep(0, time_max * steps_per_time) - if(!is.null( intv[["val_default"]] )){ + if (!is.null( intv[["val_default"]] )) { ii_val_vec <- rep(intv[["val_default"]], time_max * steps_per_time) } ii_bol_vec <- rep(0, time_max * steps_per_time) - ii_rows <- intersect(which(inp[["Intervention"]]==intv[["text"]]),tv) + ii_rows <- intersect(which(inp[["Intervention"]] == intv[["text"]]), tv) if (length(ii_rows) >= 1) { prev_t2 <- -10 - for(rr in ii_rows) { + for (rr in ii_rows) { - t1 <- inp[["Date Start"]][rr]-startdate - t2 <- inp[["Date End"]][rr]-startdate + t1 <- inp[["Date Start"]][rr] - startdate + t2 <- inp[["Date End"]][rr] - startdate - if (FILL_1DAY_GAP && (t1 == (prev_t2+1))) { - t1 <- t1-1 + if (fill_day_gap && (t1 == (prev_t2 + 1))) { + t1 <- t1 - 1 } - prev_t2 = t2 + prev_t2 <- t2 stopifnot(t1 >= 0) stopifnot(t2 >= 0) if (t1 < t2) { - idx1 = t1*steps_per_time+1 - idx2 = t2*steps_per_time - ii_val_vec[idx1:idx2] = inp[["Value"]][rr] - ii_bol_vec[idx1:idx2] = 1 + idx1 <- t1 * steps_per_time + 1 + idx2 <- t2 * steps_per_time + ii_val_vec[idx1:idx2] <- inp[["Value"]][rr] + ii_bol_vec[idx1:idx2] <- 1 } } @@ -107,8 +107,8 @@ read_intervention_schedule <- function( } } - - intv_vectors[["mt_vector"]] <- intv_vectors[["mt_vector"]]*1000 + + intv_vectors[["mt_vector"]] <- intv_vectors[["mt_vector"]] * 1000 return(intv_vectors) } \ No newline at end of file From f51d707766b3f979fed20957fdab59e20bb49298 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 21:19:42 +0100 Subject: [PATCH 24/31] remove lintr for now, takes too long to run --- .lintr | 3 ++- .travis.yml | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.lintr b/.lintr index 21c68e8..51004e1 100644 --- a/.lintr +++ b/.lintr @@ -1,2 +1,3 @@ linters: with_defaults(line_length_linter(120)) -exclusions: list("r_versions", "comoOdeCpp/tests/testthat/v16.2.core.R", "comoOdeCpp/tests/testthat/v16.2.core.input_mod.R", "comoOdeCpp/R/RcppExports.R") +comment_bot: FALSE +exclusions: list("r_versions", "comoOdeCpp/tests/testthat/v16.2.core.R", "tests/testthat/v16.2.core.R", "comoOdeCpp/tests/testthat/v16.2.core.input_mod.R", "tests/testthat/v16.2.core.input_mod.R", "comoOdeCpp/R/RcppExports.R", "R/RcppExports.R") diff --git a/.travis.yml b/.travis.yml index 33bfff1..e1ad52f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,11 +14,9 @@ before_install: global: - R_BUILD_ARGS="--no-build-vignettes --no-manual" - R_CHECK_ARGS="--no-build-vignettes --no-manual" - - LINTR_COMMENT_BOT=false + - LINTR_COMMENT_BOT=FALSE r_build_args: --no-build-vignettes --no-manual r_check_args: --no-build-vignettes --no-manual after_success: - - R CMD INSTALL $PKG_TARBALL - - Rscript -e 'lintr::lint_package()' From 87e161dc35d1e2f290cf43ef947225a11eb861b3 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 21:33:53 +0100 Subject: [PATCH 25/31] linting --- comoOdeCpp/tests/testthat/common.R | 77 ++++++++++--------- comoOdeCpp/tests/testthat/test-scenario01.R | 52 ++++--------- comoOdeCpp/tests/testthat/test-sensitivity.R | 8 +- comoOdeCpp/tests/testthat/test_io_functions.R | 21 +++-- 4 files changed, 66 insertions(+), 92 deletions(-) diff --git a/comoOdeCpp/tests/testthat/common.R b/comoOdeCpp/tests/testthat/common.R index fd587d7..287de75 100644 --- a/comoOdeCpp/tests/testthat/common.R +++ b/comoOdeCpp/tests/testthat/common.R @@ -1,5 +1,3 @@ - -# CORE_FILE <- "/v16.2.core.R" CORE_FILE <- "/v16.2.core.input_mod.R" check_libraries <- function() { @@ -31,51 +29,54 @@ init <- function(e) { check_parameters_list_for_na <- function(parameters_list) { for (pp_name in names(parameters_list)) { if (is.na(parameters_list[[pp_name]])) { - print(paste0("parameters_list[\"",pp_name, "\"] = ", parameters_list[[pp_name]]), quote = FALSE) - expect_equal(is.na(parameters_list[[pp_name]]), FALSE) + print(paste0("parameters_list[\"", pp_name, "\"] = ", parameters_list[[pp_name]]), quote = FALSE) + testthat::expect_equal(is.na(parameters_list[[pp_name]]), FALSE) stop() } } } -match_outputs <-function( - outputA, # output matrix #1 - outputB, # output matrix #2 +match_outputs <- function( + output_a, # output matrix #1 + output_b, # output matrix #2 tlr = 0.0001, # tolerance smp = 1000 # num samples to take ) { - for (ii in 1:smp) { - rr = sample(1:nrow(outputA),1) - cc = sample(1:ncol(outputA),1) - # print(paste("outputA[rr,cc] =", outputA[rr,cc])) - # print(paste("outputB[rr,cc] =", outputB[rr,cc])) + # for (ii in 1:smp) { + for (ii in seq_len(smp)) { + # rr <- sample(1:nrow(output_a), 1) + # cc <- sample(1:ncol(output_a), 1) + rr <- sample(seq_len(nrow(output_a)), 1) + cc <- sample(seq_len(ncol(output_a)), 1) + # print(paste("output_a[rr,cc] =", output_a[rr,cc])) + # print(paste("output_b[rr,cc] =", output_b[rr,cc])) - outA = outputA[rr,cc] - outB = outputB[rr,cc] + out_a <- output_a[rr, cc] + out_b <- output_b[rr, cc] - expect_true(is.numeric(outA)) - expect_true(is.numeric(outB)) + testthat::expect_true(is.numeric(out_a)) + testthat::expect_true(is.numeric(out_b)) - expect_gte(outA, 0) # >=0 - expect_gte(outB, 0) # >=0 + testthat::expect_gte(out_a, 0) # >=0 + testthat::expect_gte(out_b, 0) # >=0 - if (outA > 0) { + if (out_a > 0) { - res = expect_equal( - outB, - outA, + res <- expect_equal( + out_b, + out_a, tolerance = tlr, - scale = outA + scale = out_a ) - if(abs(outB-outA)>outA*tlr){ + if (abs(out_b - out_a) > out_a * tlr) { print(paste( "not equal: rr=", rr, ", cc=", cc, ", pp=", pp, - ", outputA[rr,cc]", outA, - ", outputB[rr,cc]", outB + ", output_a[rr,cc]", out_a, + ", output_b[rr,cc]", out_b )) } @@ -85,25 +86,25 @@ match_outputs <-function( } match_processed_outputs <- function( - outputA, # processed output matrix - outputB, # processed output matrix + output_a, # processed output matrix + output_b, # processed output matrix tlr = 0.0001 # tolerance ) { - expect_true(is.numeric(outputA$total_cm_deaths_end)) - expect_true(is.numeric(outputA$total_reportable_deaths_end)) + testthat::expect_true(is.numeric(output_a$total_cm_deaths_end)) + testthat::expect_true(is.numeric(output_a$total_reportable_deaths_end)) - expect_equal( - outputA$total_cm_deaths_end, - outputB$total_cm_deaths_end, + testthat::expect_equal( + output_a$total_cm_deaths_end, + output_b$total_cm_deaths_end, tolerance = tlr, - scale = outputB$total_cm_deaths_end + scale = output_b$total_cm_deaths_end ) - expect_equal( - outputA$total_reportable_deaths_end, - outputB$total_reportable_deaths_end, + testthat::expect_equal( + output_a$total_reportable_deaths_end, + output_b$total_reportable_deaths_end, tolerance = tlr, - scale = outputB$total_reportable_deaths_end + scale = output_b$total_reportable_deaths_end ) } diff --git a/comoOdeCpp/tests/testthat/test-scenario01.R b/comoOdeCpp/tests/testthat/test-scenario01.R index f465aa1..48e1577 100644 --- a/comoOdeCpp/tests/testthat/test-scenario01.R +++ b/comoOdeCpp/tests/testthat/test-scenario01.R @@ -3,7 +3,7 @@ test_that("Splitting intervention", { # skip("temp skip") rm(list = ls()) source(paste0(getwd(), "/common.R"), local = environment()) - init(e=environment()) + init(e = environment()) file_path <- paste0(getwd(), "/data/templates_v16.2/Template_CoMoCOVID-19App_intv_split.xlsx") @@ -38,7 +38,7 @@ test_that("Splitting intervention", { out_hype <- ode( y = Y, times = times, method = "euler", hini = 0.05, func = covidOdeCpp, parms = parameters, - input = vectors , A = A, + input = vectors, A = A, contact_home = contact_home, contact_school = contact_school, contact_work = contact_work, @@ -59,8 +59,8 @@ test_that("Splitting intervention", { ) match_outputs( - outputA = out_base, - outputB = out_hype, + output_a = out_base, + output_b = out_hype, tlr = 0.0001, smp = 100 ) @@ -72,8 +72,8 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { rm(list = ls()) source(paste0(getwd(), "/common.R"), local = environment()) - init(e=environment()) - + init(e = environment()) + file_path <- paste0(getwd(), "/data/templates_v16.2/Template_CoMoCOVID-19App_r_v_cpp.xlsx") if (!exists("inputs", mode = "function")) { @@ -84,8 +84,8 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { # environment(check_mortality_count) <- environment() - p_value_list = seq(0.0, 0.1, by = 0.025) - # p_value_list = seq(0.1, 0.1) + p_value_list <- seq(0.0, 0.1, by = 0.025) + # p_value_list <- seq(0.1, 0.1) scenario_list <- list( vectors0, # Baseline @@ -103,7 +103,7 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { + rnorm( length(parameters_noise), mean = 0, - sd = noise*abs(parameters[parameters_noise]) + sd = noise * abs(parameters[parameters_noise]) ) covidOdeCpp_reset() @@ -154,44 +154,18 @@ test_that("Matching Rcpp and R version at p={0.00,0.01, ... 0.1}", { ) match_processed_outputs( - outputA = processed_cpp_results, - outputB = processed_r_results, + output_a = processed_cpp_results, + output_b = processed_r_results, tlr = 0.0001 ) - # expect_equal( - # processed_cpp_results$total_cm_deaths_end, - # processed_r_results$total_cm_deaths_end, - # tolerance = 0.0001, - # scale = processed_r_results$total_cm_deaths_end - # ) - # expect_equal( - # processed_cpp_results$total_reportable_deaths_end, - # processed_r_results$total_reportable_deaths_end, - # tolerance = 0.0001, - # scale = processed_r_results$total_reportable_deaths_end - # ) - - # print(paste("processed_r$total_reported_deaths_end=", processed_r$total_reported_deaths_end)) - # print(paste("processed_r$total_deaths_end=", processed_r$total_deaths_end)) - - # print(paste( - # "results$attributable_deaths_end:", processed_cpp$attributable_deaths_end, ",", processed_r$attributable_deaths_end, - # "results$reportable_death:", processed_cpp$reportable_death, ",", processed_r$reportable_death, - # "results$total_deaths_end:", processed_cpp$total_deaths_end, ",", processed_r$total_deaths_end - # )) - - # expect_equal(processed_cpp$attributable_deaths_end, processed_r$attributable_deaths_end) - # expect_equal(processed_cpp$reportable_death, processed_r$reportable_death) - # expect_equal(processed_cpp$total_deaths_end, processed_r$total_deaths_end) - # sss = 1 # write.csv(out_cpp, paste0("out_cpp_",sss,"_",parameters["p"],".csv"),row.names = FALSE) # write.csv(out_r, paste0("out_r_",sss,"_",parameters["p"],".csv"),row.names = FALSE) match_outputs( - outputA = out_r, - outputB = out_cpp, + output_a = out_r, + output_b = out_cpp, tlr = 0.0001, smp = 1000 ) diff --git a/comoOdeCpp/tests/testthat/test-sensitivity.R b/comoOdeCpp/tests/testthat/test-sensitivity.R index fd208af..58e18a7 100644 --- a/comoOdeCpp/tests/testthat/test-sensitivity.R +++ b/comoOdeCpp/tests/testthat/test-sensitivity.R @@ -2,9 +2,9 @@ test_that("Sensitivity", { # skip("temp skip") rm(list = ls()) source(paste0(getwd(), "/common.R"), local = environment()) - init(e=environment()) + init(e = environment()) - VERBOSE = FALSE + VERBOSE <- FALSE file_path <- paste0(getwd(), "/data/templates_v16.2/Template_CoMoCOVID-19App_sa.xlsx") @@ -45,7 +45,7 @@ test_that("Sensitivity", { # "school_eff", "cocoon_eff", - # "travelban_eff", + # "travelban_eff", "vaccine_eff" ) sa_multipliers <- c( @@ -76,7 +76,7 @@ test_that("Sensitivity", { for (pp_name in sa_parameters) { parameters_mod <- parameters - parameters_mod[pp_name] = parameters_mod[pp_name] * sa_multipliers[match(pp_name, sa_parameters)] + parameters_mod[pp_name] <- parameters_mod[pp_name] * sa_multipliers[match(pp_name, sa_parameters)] if (VERBOSE) { print(pp_name) diff --git a/comoOdeCpp/tests/testthat/test_io_functions.R b/comoOdeCpp/tests/testthat/test_io_functions.R index fcdeb31..57ecf6c 100644 --- a/comoOdeCpp/tests/testthat/test_io_functions.R +++ b/comoOdeCpp/tests/testthat/test_io_functions.R @@ -2,7 +2,7 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A # skip("temp skip") rm(list = ls()) source(paste0(getwd(), "/common.R"), local = environment()) - init(e=environment()) + init(e = environment()) file_path <- paste0(getwd(), "/data/templates_v16.2/Template_CoMoCOVID-19App_io_intv_sched.xlsx") @@ -13,7 +13,7 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A intv_schd_base <- read_intervention_schedule( inp = read_excel(file_path, sheet = "Interventions"), run = "Baseline (Calibration)", - time_max = tail(times,1), + time_max = tail(times, 1), steps_per_time = 20, startdate = startdate, stopdate = stopdate, @@ -26,7 +26,7 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A intv_schd_hype <- read_intervention_schedule( inp = read_excel(file_path, sheet = "Interventions"), run = "Hypothetical Scenario", - time_max = tail(times,1), + time_max = tail(times, 1), steps_per_time = 20, startdate = startdate, stopdate = stopdate, @@ -37,7 +37,7 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A ) for (vv in names(vectors0)) { - if(!all(vectors0[[vv]] == intv_schd_base[[vv]])){ + if (!all(vectors0[[vv]] == intv_schd_base[[vv]])) { print(vv) print("vectors0[[vv]]") print(vectors0[[vv]]) @@ -48,7 +48,7 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A expect_true(all(vectors0[[vv]] == intv_schd_base[[vv]])) } for (vv in names(vectors)) { - if(!all(vectors[[vv]] == intv_schd_hype[[vv]])){ + if (!all(vectors[[vv]] == intv_schd_hype[[vv]])) { print(vv) print("vectors[[vv]]") print(vectors[[vv]]) @@ -98,28 +98,27 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A ) output_processed <- process_ode_outcome_mortality(output, ii, parameters) - cc <- cc+1 + cc <- cc + 1 output_list[[cc]] <- output output_processed_list[[cc]] <- output_processed } - for (ii in c(1,3) ) { + for (ii in c(1, 3)) { match_processed_outputs( outputA = output_processed_list[[ii]], - outputB = output_processed_list[[ii+1]], + outputB = output_processed_list[[ii + 1]], tlr = 0.0001 ) match_outputs( outputA = output_list[[ii]], - outputB = output_list[[ii+1]], + outputB = output_list[[ii + 1]], tlr = 0.0001, smp = 100 ) } - - }) \ No newline at end of file +}) \ No newline at end of file From 2f026139b517b1c124744286015de6d90d3ed251 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 21:50:24 +0100 Subject: [PATCH 26/31] fix wrong parameter name --- comoOdeCpp/tests/testthat/test_io_functions.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/comoOdeCpp/tests/testthat/test_io_functions.R b/comoOdeCpp/tests/testthat/test_io_functions.R index 57ecf6c..ea74e65 100644 --- a/comoOdeCpp/tests/testthat/test_io_functions.R +++ b/comoOdeCpp/tests/testthat/test_io_functions.R @@ -107,14 +107,14 @@ test_that("compare read_intervention_schedule of comoOdeCpp and inputs of como A for (ii in c(1, 3)) { match_processed_outputs( - outputA = output_processed_list[[ii]], - outputB = output_processed_list[[ii + 1]], + output_a = output_processed_list[[ii]], + output_b = output_processed_list[[ii + 1]], tlr = 0.0001 ) match_outputs( - outputA = output_list[[ii]], - outputB = output_list[[ii + 1]], + output_a = output_list[[ii]], + output_b = output_list[[ii + 1]], tlr = 0.0001, smp = 100 ) From 84d9020fbb27533cffff8177693f86f1bcf48630 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 21:56:04 +0100 Subject: [PATCH 27/31] linting --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e1ad52f..8ae6690 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ global: - R_BUILD_ARGS="--no-build-vignettes --no-manual" - R_CHECK_ARGS="--no-build-vignettes --no-manual" - LINTR_COMMENT_BOT=FALSE - + r_build_args: --no-build-vignettes --no-manual r_check_args: --no-build-vignettes --no-manual From a7f3e60b5abfd5d0ff051b2e74a1202587699a65 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 22:16:28 +0100 Subject: [PATCH 28/31] add dplyr to DESCRIPTION and NAMESPACE --- comoOdeCpp/DESCRIPTION | 4 ++-- comoOdeCpp/NAMESPACE | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/comoOdeCpp/DESCRIPTION b/comoOdeCpp/DESCRIPTION index 75188f0..dfb6024 100644 --- a/comoOdeCpp/DESCRIPTION +++ b/comoOdeCpp/DESCRIPTION @@ -10,10 +10,10 @@ License: Attribution-NonCommercial 4.0 International Depends: stats (>= 3.1.3) Imports: - Rcpp (>= 1.0.4.6) + Rcpp (>= 1.0.4.6), + dplyr Suggests: testthat, deSolve, - dplyr, readxl LinkingTo: Rcpp, RcppArmadillo diff --git a/comoOdeCpp/NAMESPACE b/comoOdeCpp/NAMESPACE index ce3e009..714df17 100644 --- a/comoOdeCpp/NAMESPACE +++ b/comoOdeCpp/NAMESPACE @@ -1,5 +1,5 @@ importFrom(stats, splinefun) importFrom(Rcpp, evalCpp) +importFrom(dplyr, arrange) useDynLib(comoOdeCpp, .registration=TRUE) exportPattern("^[[:alpha:]]+") - From c984990eba0e1d933d79075321feb024914d71d0 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 22:27:22 +0100 Subject: [PATCH 29/31] remove r_versions directory from repository --- r_versions/covidage_v13.13.R | 1386 ------------------ r_versions/covidage_v13.13_original.R | 1401 ------------------ r_versions/covidage_v13.8.R | 1448 ------------------ r_versions/covidage_v13.8_->_v13.13.diff | 330 ----- r_versions/covidage_v13.8_original.R | 1391 ------------------ r_versions/covidage_v14.3.R | 1704 --------------------- r_versions/covidage_v14.4.R | 1706 ---------------------- 7 files changed, 9366 deletions(-) delete mode 100644 r_versions/covidage_v13.13.R delete mode 100644 r_versions/covidage_v13.13_original.R delete mode 100644 r_versions/covidage_v13.8.R delete mode 100644 r_versions/covidage_v13.8_->_v13.13.diff delete mode 100644 r_versions/covidage_v13.8_original.R delete mode 100644 r_versions/covidage_v14.3.R delete mode 100644 r_versions/covidage_v14.4.R diff --git a/r_versions/covidage_v13.13.R b/r_versions/covidage_v13.13.R deleted file mode 100644 index a8c3a99..0000000 --- a/r_versions/covidage_v13.13.R +++ /dev/null @@ -1,1386 +0,0 @@ -rm(list = ls()) - -library("deSolve") -library("ggplot2") -library("dplyr") -library("reshape2") -require("gridExtra") -# library(ggpubr) -# library(bsplus) -# library(deSolve) -# library(DT) -# library(highcharter) -# library(lubridate) -# library(pushbar) -library(readxl) -# library(reshape2) -# library(scales) -# library(shiny) -# library(shinyBS) -# library(shinycssloaders) -# library(shinyhelper) -# library(shinythemes) -# library(shinyWidgets) -# library(tidyverse) -# library(XLConnect) -library("comoOdeCpp") - -#read data from excel file -setwd("/home/bogao/Projects/como/comoOdeCpp") -load("./data/data_CoMo.RData") -file_path <- paste0(getwd(),"/data/Template_CoMoCOVID-19App_new.xlsx") -# file_path <- paste0(getwd(),"/data/Template_CoMoCOVID-19App_new_1.xlsx") -country_name<-"Cambodia" - -# Cases -dta <- read_excel(file_path, sheet = "Cases") -names(dta) <- c("date", "cases", "deaths") - -cases_rv <- dta %>% - mutate(date = as.Date(date), cumulative_death = cumsum(deaths)) %>% - as.data.frame() - -# Severity/Mortality -dta <- read_excel(file_path, sheet = "Severity-Mortality") -names(dta) <- c("age_category", "ifr", "ihr") - -mort_sever_rv <- dta %>% - mutate(ihr = ihr/100) %>% # starting unit should be % - scaling to a value between 0 and 1 - mutate(ifr = ifr/max(ifr)) # starting unit should be % - scaling to a value between 0 and 1 - -# Population -dta <- read_excel(file_path, sheet = "Population") -names(dta) <- c("age_category", "pop", "birth", "death") - -population_rv <- dta %>% - transmute(country = NA, age_category, pop, birth, death) - -# Parameters -param <- bind_rows(read_excel(file_path, sheet = "Parameters"), - read_excel(file_path, sheet = "Country Area Param"), - read_excel(file_path, sheet = "Virus Param"), - read_excel(file_path, sheet = "Hospitalisation Param"), - read_excel(file_path, sheet = "Interventions Param"), - read_excel(file_path, sheet = "Interventions")) %>% - mutate(Value_Date = as.Date(Value_Date)) - -# START Bridge ---- -popstruc <- population_rv %>% - select(age_category, pop) %>% - rename(agefloor = age_category) %>% - as.data.frame() - -popbirth <- population_rv %>% - select(age_category, birth) %>% - as.data.frame() # unit should be per person per day - -mort <- population_rv %>% - pull(death) # unit should be per person per day - -ihr <- mort_sever_rv %>% - select(age_category, ihr) %>% - as.data.frame() - -ifr <- mort_sever_rv %>% - select(age_category, ifr) %>% - as.data.frame() - - -######### POP AGEING -# per year ageing matrix -A<-length(popstruc[,2]) -dd<-seq(1:A)/seq(1:A) -ageing <- t(diff(diag(dd),lag=1)/(5*365.25)) -ageing<-cbind(ageing,0*seq(1:A)) # no ageing from last compartment - -# -pop<-population$country==country_name -pp<-population$pop[pop] -### CONTACT MATRICES -c_home <- contact_home[[country_name]] %>% as.matrix() -c_school <- contact_school[[country_name]] %>% as.matrix() -c_work <- contact_work[[country_name]] %>% as.matrix() -c_other <- contact_other[[country_name]] %>% as.matrix() -nce <-A-length(c_home[1,]) - -contact_home<-matrix(0,nrow=A,ncol=A) -contact_school<-matrix(0,nrow=A,ncol=A) -contact_work<-matrix(0,nrow=A,ncol=A) -contact_other<-matrix(0,nrow=A,ncol=A) - -for (i in 1:(A-nce)){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[i,j] - contact_school[i,j]<-c_school[i,j] - contact_work[i,j]<-c_work[i,j] - contact_other[i,j]<-c_other[i,j] - } -} - -for (i in (A+1-nce):A){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[(A-nce),j] - contact_school[i,j]<-c_school[(A-nce),j] - contact_work[i,j]<-c_work[(A-nce),j] - contact_other[i,j]<-c_other[(A-nce),j] - } -} -for (i in 1:(A-nce)){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[i,(A-nce)] - contact_school[i,j]<-c_school[i,(A-nce)] - contact_work[i,j]<-c_work[i,(A-nce)] - contact_other[i,j]<-c_other[i,(A-nce)] - } -} -for (i in (A+1-nce):A){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[(A-nce),(A-nce)] - contact_school[i,j]<-c_school[(A-nce),(A-nce)] - contact_work[i,j]<-c_work[(A-nce),(A-nce)] - contact_other[i,j]<-c_other[(A-nce),(A-nce)] - } -} - - - -######### INITIALISE SIMULATION/INTERVENTION START TIMES -startdate <- param$Value_Date[param$Parameter == "date_range_simul_start"] -stopdate <- param$Value_Date[param$Parameter == "date_range_simul_end"] -startdate <- startdate[1] -stopdate <- stopdate[1] - - -day_start <- as.numeric(startdate-startdate) -day_stop <- as.numeric(stopdate-startdate) -times <- seq(day_start, day_stop) - -tin<-as.numeric(startdate-as.Date("2020-01-01"))/365.25 -initP<-sum(popstruc[,2]) # population size -ageindcase<-20 # age of index case (years) -aci <- floor((ageindcase/5)+1) # age class of index case - - -############# DEFINE PARAMETERS -parameters <- c( - ### Transmission instrinsic - p = param$Value[param$Parameter=="p"][1], - rho = param$Value[param$Parameter=="rho"][1], - omega = param$Value[param$Parameter=="omega"][1], - gamma = param$Value[param$Parameter=="gamma"][1], - nui = param$Value[param$Parameter=="nui"][1], - report = param$Value[param$Parameter=="report"][1], - reportc = param$Value[param$Parameter=="reportc"][1], - reporth = param$Value[param$Parameter=="reporth"][1], - beds_available = param$Value[param$Parameter=="beds_available"][1], - icu_beds_available = param$Value[param$Parameter=="icu_beds_available"][1], - ventilators_available = param$Value[param$Parameter=="ventilators_available"][1], - give = 95, - pdeath_h = param$Value[param$Parameter=="pdeath_h"][1], - pdeath_hc = param$Value[param$Parameter=="pdeath_hc"][1], - pdeath_icu = param$Value[param$Parameter=="pdeath_icu"][1], - pdeath_icuc = param$Value[param$Parameter=="pdeath_icuc"][1], - pdeath_vent = param$Value[param$Parameter=="pdeath_vent"][1], - pdeath_ventc = param$Value[param$Parameter=="pdeath_ventc"][1], - ihr_scaling = param$Value[param$Parameter=="ihr_scaling"][1], - nus = param$Value[param$Parameter=="nus"][1], - nusc = param$Value[param$Parameter=="nus"][1], # nusc = nus - nu_icu = param$Value[param$Parameter=="nu_icu"][1], - nu_icuc = param$Value[param$Parameter=="nu_icu"][1], # nu_icuc = nu_icu - nu_vent = param$Value[param$Parameter=="nu_vent"][1], - nu_ventc = param$Value[param$Parameter=="nu_vent"][1], # nu_ventc = nu_vent - rhos = param$Value[param$Parameter=="rhos"][1], - amp = param$Value[param$Parameter=="amp"][1], - phi = param$Value[param$Parameter=="phi"][1], - pclin = param$Value[param$Parameter=="pclin"][1], - prob_icu = param$Value[param$Parameter=="prob_icu"][1], - prob_vent = param$Value[param$Parameter=="prob_vent"][1], - - ### INTERVENTIONS - # self isolation - selfis_eff = mean(param$Value[param$Parameter=="selfis_eff"],na.rm=T), - # social distancing - dist_eff = mean(param$Value[param$Parameter=="dist_eff"],na.rm=T), - # hand washing - hand_eff = mean(param$Value[param$Parameter=="hand_eff"],na.rm=T), - # working at home - work_eff = mean(param$Value[param$Parameter=="work_eff"],na.rm=T), - w2h = mean(param$Value[param$Parameter=="w2h"],na.rm=T), - # school closures - school_eff = mean(param$Value[param$Parameter=="school_eff"],na.rm=T), - s2h = mean(param$Value[param$Parameter=="s2h"],na.rm=T), - # cocooning the elderly - cocoon_eff = mean(param$Value[param$Parameter=="cocoon_eff"],na.rm=T), - age_cocoon = mean(param$Value[param$Parameter=="age_cocoon"],na.rm=T), - # vaccination campaign - # vaccine_on = as.numeric(param$Value_Date[param$Parameter=="date_vaccine_on"] - startdate), - vaccine_eff = mean(param$Value[param$Parameter=="vaccine_eff"],na.rm=T), - # vaccine_cov = param$Value[param$Parameter=="vaccine_cov"], - vac_campaign = mean(param$Value[param$Parameter=="vac_campaign"],na.rm=T), - # travel ban - mean_imports = mean(param$Value[param$Parameter=="mean_imports"],na.rm=T), - # screening - screen_test_sens = mean(param$Value[param$Parameter=="screen_test_sens"],na.rm=T), - # screen_contacts = mean(param$Value[param$Parameter=="screen_contacts"],na.rm=T), - screen_overdispersion = mean(param$Value[param$Parameter=="screen_overdispersion"],na.rm=T), - # voluntary home quarantine - quarantine_days = mean(param$Value[param$Parameter=="quarantine_days"],na.rm=T), - quarantine_effort = mean(param$Value[param$Parameter=="quarantine_effort"],na.rm=T), - quarantine_eff_home = mean(param$Value[param$Parameter=="quarantine_eff_home"],na.rm=T), - quarantine_eff_other = mean(param$Value[param$Parameter=="quarantine_eff_other"],na.rm=T), - - household_size = param$Value[param$Parameter=="household_size"][1] -) -ihr[,2]<- parameters["ihr_scaling"]*ihr[,2] - -# Scale parameters to percentages/ rates -parameters["rho"]<-parameters["rho"]/100 -parameters["omega"]<-(1/(parameters["omega"]*365)) -parameters["gamma"]<-1/parameters["gamma"] -parameters["nui"]<-1/parameters["nui"] -parameters["report"]<-parameters["report"]/100 -parameters["reportc"]<-parameters["reportc"]/100 -parameters["reporth"]<-parameters["reporth"]/100 -parameters["nus"]<-1/parameters["nus"] -parameters["rhos"]<-parameters["rhos"]/100 -parameters["amp"]<-parameters["amp"]/100 -parameters["selfis_eff"]<-parameters["selfis_eff"]/100 -parameters["dist_eff"]<-parameters["dist_eff"]/100 -parameters["hand_eff"]<-parameters["hand_eff"]/100 -parameters["work_eff"]<-parameters["work_eff"]/100 -parameters["w2h"]<-parameters["w2h"]/100 -parameters["school_eff"]<-parameters["school_eff"]/100 -parameters["s2h"]<-parameters["s2h"]/100 -parameters["cocoon_eff"]<-parameters["cocoon_eff"]/100 -parameters["age_cocoon"]<-floor((parameters["age_cocoon"]/5)+1) -parameters["vaccine_eff"]<-parameters["vaccine_eff"]/100 -# parameters["vaccine_cov"]<-parameters["vaccine_cov"]/100 -# parameters["vac_campaign"]<-parameters["vac_campaign"]*7 -parameters["screen_test_sens"]<-parameters["screen_test_sens"]/100 -parameters["quarantine_days"]<-parameters["quarantine_days"] -parameters["quarantine_effort"]<-1/parameters["quarantine_effort"] -parameters["quarantine_eff_home"]<-parameters["quarantine_eff_home"]/-100 -parameters["quarantine_eff_other"]<-parameters["quarantine_eff_other"]/100 -parameters["give"]<-parameters["give"]/100 -parameters["pdeath_h"]<-parameters["pdeath_h"]/100 -parameters["pdeath_hc"]<-parameters["pdeath_hc"]/100 -parameters["pdeath_icu"]<-parameters["pdeath_icu"]/100 -parameters["pdeath_icuc"]<-parameters["pdeath_icuc"]/100 -parameters["pdeath_vent"]<-parameters["pdeath_vent"]/100 -parameters["pdeath_ventc"]<-parameters["pdeath_ventc"]/100 -parameters["nusc"]<-1/parameters["nusc"] -parameters["nu_icu"]<-1/parameters["nu_icu"] -parameters["nu_icuc"]<-1/parameters["nu_icuc"] -parameters["nu_vent"]<-1/parameters["nu_vent"] -parameters["nu_ventc"]<-1/parameters["nu_ventc"] -parameters["pclin"]<-parameters["pclin"]/100 -parameters["prob_icu"]<-parameters["prob_icu"]/100 -parameters["prob_vent"]<-parameters["prob_vent"]/100 -parameters2<-parameters - -########################################################################### -# Define the indices for each variable -Sindex<-1:A -Eindex<-(A+1):(2*A) -Iindex<-(2*A+1):(3*A) -Rindex<-(3*A+1):(4*A) -Xindex<-(4*A+1):(5*A) -Hindex<-(5*A+1):(6*A) -HCindex<-(6*A+1):(7*A) -Cindex<-(7*A+1):(8*A) -CMindex<-(8*A+1):(9*A) -Vindex<-(9*A+1):(10*A) -QSindex<-(10*A+1):(11*A) -QEindex<-(11*A+1):(12*A) -QIindex<-(12*A+1):(13*A) -QRindex<-(13*A+1):(14*A) -CLindex<-(14*A+1):(15*A) -QCindex<-(15*A+1):(16*A) -ICUindex<-(16*A+1):(17*A) -ICUCindex<-(17*A+1):(18*A) -ICUCVindex<-(18*A+1):(19*A) -Ventindex<-(19*A+1):(20*A) -VentCindex<-(20*A+1):(21*A) -CMCindex<-(21*A+1):(22*A) - -########################################################################### -# MODEL INITIAL CONDITIONS -initI<-0*popstruc[,2] # Infected and symptomatic -initE<-0*popstruc[,2] # Incubating -initE[aci]<-1 # place random index case in E compartment -initR<-0*popstruc[,2] # Immune -initX<-0*popstruc[,2] # Isolated -initV<-0*popstruc[,2] # Vaccinated -initQS<-0*popstruc[,2] # quarantined S -initQE<-0*popstruc[,2] # quarantined E -initQI<-0*popstruc[,2] # quarantined I -initQR<-0*popstruc[,2] # quarantined R -initH<-0*popstruc[,2] # hospitalised -initHC<-0*popstruc[,2] # hospital critical -initC<-0*popstruc[,2] # Cumulative cases (true) -initCM<-0*popstruc[,2] # Cumulative deaths (true) -initCL<-0*popstruc[,2] # symptomatic cases -initQC<-0*popstruc[,2] # quarantined C -initICU<-0*popstruc[,2] # icu -initICUC<-0*popstruc[,2] # icu critical -initICUCV<-0*popstruc[,2] # icu critical -initVent<-0*popstruc[,2] # icu vent -initVentC<-0*popstruc[,2] # icu vent crit -initCMC<-0*popstruc[,2] # Cumulative deaths (true) -initS<-popstruc[,2]-initE-initI-initR-initX-initV-initH-initHC-initQS-initQE-initQI-initQR-initCL-initQC-initICU-initICUC-initICUCV-initVent-initVentC # Susceptible (non-immune) - - -inp <- read_excel(file_path, sheet = "Interventions") -inputs<-function(inp, run){ - # cap intervention end dates with simulation end date - # inp$`Date End` = pmin(stopdate, inp$`Date End`) - inp$`Date End` = pmin(stopdate, as.Date(inp$`Date End`)) - - tb<-which(inp$`Apply to`==run) - - si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tb) - scr<-intersect(which(inp$Intervention=="Screening (when S.I.)"),tb) - sd<-intersect(which(inp$Intervention=="Social Distancing"),tb) - hw<-intersect(which(inp$Intervention=="Handwashing"),tb) - wah<-intersect(which(inp$Intervention=="Working at Home"),tb) - sc<-intersect(which(inp$Intervention=="School Closures"),tb) - cte<-intersect(which(inp$Intervention=="Shielding the Elderly"),tb) - q<-intersect(which(inp$Intervention=="Household Isolation (when S.I.)"),tb) - tb<-intersect(which(inp$Intervention=="International Travel Ban"),tb) - vc<-intersect(which(inp$Intervention=="Vaccination"),tb) - - v<-(format(as.POSIXct(inp$`Date Start`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date Start`<-v2 - - v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date End`<-v2 - - ## self isolation - f<-c() - si_vector<-c() - isolation<-c() - if (length(si)>=1){ - for (i in 1:length(si)){ - f<-c(f,as.numeric(inp$`Date Start`[si[i]]-startdate),as.numeric(inp$`Date End`[si[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[si[i]]>startdate){ - si_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[si[i]],(f[i+1]-f[i])*20)) - isolation<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - si_vector<-c(rep(inp$`Value`[si[i]],(f[i+1])*20)) - isolation<-c(rep(1,(f[i+1])*20)) - } - } - else{ - si_vector<-c(si_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - si_vector<-c(si_vector,rep(inp$`Value`[si[i]],(f[i*2]-f[i*2-1])*20)) - isolation<-c(isolation,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - isolation<-c(isolation,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(si) && f[i*2]=1){ - for (i in 1:length(sd)){ - - f<-c(f,as.numeric(inp$`Date Start`[sd[i]]-startdate),as.numeric(inp$`Date End`[sd[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sd[i]]>startdate){ - sd_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sd[i]],(f[i+1]-f[i])*20)) - distancing<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sd_vector<-c(rep(inp$`Value`[sd[i]],(f[i+1])*20)) - distancing<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sd_vector<-c(sd_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],(f[i*2]-f[i*2-1])*20)) - distancing<-c(distancing,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - distancing<-c(distancing,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sd)&& f[i*2]=1){ - for (i in 1:length(scr)){ - - f<-c(f,as.numeric(inp$`Date Start`[scr[i]]-startdate),as.numeric(inp$`Date End`[scr[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[scr[i]]>startdate){ - scr_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[scr[i]],(f[i+1]-f[i])*20)) - screen<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - scr_vector<-c(rep(inp$`Value`[scr[i]],(f[i+1])*20)) - screen<-c(rep(1,(f[i+1])*20)) - } - } - else{ - scr_vector<-c(scr_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],(f[i*2]-f[i*2-1])*20)) - screen<-c(screen,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - screen<-c(screen,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(scr)&& f[i*2]=1){ - for (i in 1:length(hw)){ - - f<-c(f,as.numeric(inp$`Date Start`[hw[i]]-startdate),as.numeric(inp$`Date End`[hw[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[hw[i]]>startdate){ - hw_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[hw[i]],(f[i+1]-f[i])*20)) - handwash<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - hw_vector<-c(rep(inp$`Value`[hw[i]],(f[i+1])*20)) - handwash<-c(rep(1,(f[i+1])*20)) - } - } - else{ - hw_vector<-c(hw_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],(f[i*2]-f[i*2-1])*20)) - handwash<-c(handwash,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - handwash<-c(handwash,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(hw)&& f[i*2]=1){ - for (i in 1:length(wah)){ - - f<-c(f,as.numeric(inp$`Date Start`[wah[i]]-startdate),as.numeric(inp$`Date End`[wah[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[wah[i]]>startdate){ - wah_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[wah[i]],(f[i+1]-f[i])*20)) - workhome<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - wah_vector<-c(rep(inp$`Value`[wah[i]],(f[i+1])*20)) - workhome<-c(rep(1,(f[i+1])*20)) - } - } - else{ - wah_vector<-c(wah_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],(f[i*2]-f[i*2-1])*20)) - workhome<-c(workhome,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - workhome<-c(workhome,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(wah)&& f[i*2]=1){ - for (i in 1:length(sc)){ - - f<-c(f,as.numeric(inp$`Date Start`[sc[i]]-startdate),as.numeric(inp$`Date End`[sc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sc[i]]>startdate){ - sc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sc[i]],(f[i+1]-f[i])*20)) - schoolclose<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sc_vector<-c(rep(inp$`Value`[sc[i]],(f[i+1])*20)) - schoolclose<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sc_vector<-c(sc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],(f[i*2]-f[i*2-1])*20)) - schoolclose<-c(schoolclose,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - schoolclose<-c(schoolclose,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sc)&& f[i*2]=1){ - for (i in 1:length(cte)){ - - f<-c(f,as.numeric(inp$`Date Start`[cte[i]]-startdate),as.numeric(inp$`Date End`[cte[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[cte[i]]>startdate){ - cte_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[cte[i]],(f[i+1]-f[i])*20)) - cocoon<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - cte_vector<-c(rep(inp$`Value`[cte[i]],(f[i+1])*20)) - cocoon<-c(rep(1,(f[i+1])*20)) - } - } - else{ - cte_vector<-c(cte_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],(f[i*2]-f[i*2-1])*20)) - cocoon<-c(cocoon,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cocoon<-c(cocoon,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(cte)&& f[i*2]=1){ - for (i in 1:length(q)){ - - f<-c(f,as.numeric(inp$`Date Start`[q[i]]-startdate),as.numeric(inp$`Date End`[q[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[q[i]]>startdate){ - q_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[q[i]],(f[i+1]-f[i])*20)) - quarantine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - q_vector<-c(rep(inp$`Value`[q[i]],(f[i+1])*20)) - quarantine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - q_vector<-c(q_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - q_vector<-c(q_vector,rep(inp$`Value`[q[i]],(f[i*2]-f[i*2-1])*20)) - quarantine<-c(quarantine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - quarantine<-c(quarantine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(q)&& f[i*2]=1){ - for (i in 1:length(tb)){ - - f<-c(f,as.numeric(inp$`Date Start`[tb[i]]-startdate),as.numeric(inp$`Date End`[tb[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[tb[i]]>startdate){ - tb_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[tb[i]],(f[i+1]-f[i])*20)) - travelban<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - tb_vector<-c(rep(inp$`Value`[tb[i]],(f[i+1])*20)) - travelban<-c(rep(1,(f[i+1])*20)) - } - } - else{ - tb_vector<-c(tb_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],(f[i*2]-f[i*2-1])*20)) - travelban<-c(travelban,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - travelban<-c(travelban,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(tb)&& f[i*2]=1){ - for (i in 1:length(vc)){ - - f<-c(f,as.numeric(inp$`Date Start`[vc[i]]-startdate),as.numeric(inp$`Date End`[vc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[vc[i]]>startdate){ - vc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[vc[i]],(f[i+1]-f[i])*20)) - vaccine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - vc_vector<-c(rep(inp$`Value`[vc[i]],(f[i+1])*20)) - vaccine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - vc_vector<-c(vc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],(f[i*2]-f[i*2-1])*20)) - vaccine<-c(vaccine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vaccine<-c(vaccine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(vc)&& f[i*2]% - mutate(date = as.Date(date), cumulative_death = cumsum(deaths)) %>% - as.data.frame() - -# Severity/Mortality -dta <- read_excel(file_path, sheet = "Severity-Mortality") -names(dta) <- c("age_category", "ifr", "ihr") - -mort_sever_rv <- dta %>% - mutate(ihr = ihr/100) %>% # starting unit should be % - scaling to a value between 0 and 1 - mutate(ifr = ifr/max(ifr)) # starting unit should be % - scaling to a value between 0 and 1 - -# Population -dta <- read_excel(file_path, sheet = "Population") -names(dta) <- c("age_category", "pop", "birth", "death") - -population_rv <- dta %>% - transmute(country = NA, age_category, pop, birth, death) - -# Parameters -param <- bind_rows(read_excel(file_path, sheet = "Parameters"), - read_excel(file_path, sheet = "Country Area Param"), - read_excel(file_path, sheet = "Virus Param"), - read_excel(file_path, sheet = "Hospitalisation Param"), - read_excel(file_path, sheet = "Interventions Param"), - read_excel(file_path, sheet = "Interventions")) %>% - mutate(Value_Date = as.Date(Value_Date)) - -# START Bridge ---- -popstruc <- population_rv %>% - select(age_category, pop) %>% - rename(agefloor = age_category) %>% - as.data.frame() - -popbirth <- population_rv %>% - select(age_category, birth) %>% - as.data.frame() # unit should be per person per day - -mort <- population_rv %>% - pull(death) # unit should be per person per day - -ihr <- mort_sever_rv %>% - select(age_category, ihr) %>% - as.data.frame() - -ifr <- mort_sever_rv %>% - select(age_category, ifr) %>% - as.data.frame() - - -######### POP AGEING -# per year ageing matrix -A<-length(popstruc[,2]) -dd<-seq(1:A)/seq(1:A) -ageing <- t(diff(diag(dd),lag=1)/(5*365.25)) -ageing<-cbind(ageing,0*seq(1:A)) # no ageing from last compartment - -# -pop<-population$country==country_name -pp<-population$pop[pop] -### CONTACT MATRICES -c_home <- contact_home[[country_name]] %>% as.matrix() -c_school <- contact_school[[country_name]] %>% as.matrix() -c_work <- contact_work[[country_name]] %>% as.matrix() -c_other <- contact_other[[country_name]] %>% as.matrix() -nce <-A-length(c_home[1,]) - -contact_home<-matrix(0,nrow=A,ncol=A) -contact_school<-matrix(0,nrow=A,ncol=A) -contact_work<-matrix(0,nrow=A,ncol=A) -contact_other<-matrix(0,nrow=A,ncol=A) - -for (i in 1:(A-nce)){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[i,j] - contact_school[i,j]<-c_school[i,j] - contact_work[i,j]<-c_work[i,j] - contact_other[i,j]<-c_other[i,j] - } -} - -for (i in (A+1-nce):A){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[(A-nce),j] - contact_school[i,j]<-c_school[(A-nce),j] - contact_work[i,j]<-c_work[(A-nce),j] - contact_other[i,j]<-c_other[(A-nce),j] - } -} -for (i in 1:(A-nce)){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[i,(A-nce)] - contact_school[i,j]<-c_school[i,(A-nce)] - contact_work[i,j]<-c_work[i,(A-nce)] - contact_other[i,j]<-c_other[i,(A-nce)] - } -} -for (i in (A+1-nce):A){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[(A-nce),(A-nce)] - contact_school[i,j]<-c_school[(A-nce),(A-nce)] - contact_work[i,j]<-c_work[(A-nce),(A-nce)] - contact_other[i,j]<-c_other[(A-nce),(A-nce)] - } -} - - - -######### INITIALISE SIMULATION/INTERVENTION START TIMES -startdate <- param$Value_Date[param$Parameter == "date_range_simul_start"] -stopdate <- param$Value_Date[param$Parameter == "date_range_simul_end"] -startdate <- startdate[1] -stopdate <- stopdate[1] - - -day_start <- as.numeric(startdate-startdate) -day_stop <- as.numeric(stopdate-startdate) -times <- seq(day_start, day_stop) - -tin<-as.numeric(startdate-as.Date("2020-01-01"))/365.25 -initP<-sum(popstruc[,2]) # population size -ageindcase<-20 # age of index case (years) -aci <- floor((ageindcase/5)+1) # age class of index case - - -############# DEFINE PARAMETERS -parameters <- c( - ### Transmission instrinsic - p = param$Value[param$Parameter=="p"][1], - rho = param$Value[param$Parameter=="rho"][1], - omega = param$Value[param$Parameter=="omega"][1], - gamma = param$Value[param$Parameter=="gamma"][1], - nui = param$Value[param$Parameter=="nui"][1], - report = param$Value[param$Parameter=="report"][1], - reportc = param$Value[param$Parameter=="reportc"][1], - reporth = param$Value[param$Parameter=="reporth"][1], - beds_available = param$Value[param$Parameter=="beds_available"][1], - icu_beds_available = param$Value[param$Parameter=="icu_beds_available"][1], - ventilators_available = param$Value[param$Parameter=="ventilators_available"][1], - give = 95, - pdeath_h = param$Value[param$Parameter=="pdeath_h"][1], - pdeath_hc = param$Value[param$Parameter=="pdeath_hc"][1], - pdeath_icu = param$Value[param$Parameter=="pdeath_icu"][1], - pdeath_icuc = param$Value[param$Parameter=="pdeath_icuc"][1], - pdeath_vent = param$Value[param$Parameter=="pdeath_vent"][1], - pdeath_ventc = param$Value[param$Parameter=="pdeath_ventc"][1], - ihr_scaling = param$Value[param$Parameter=="ihr_scaling"][1], - nus = param$Value[param$Parameter=="nus"][1], - nusc = param$Value[param$Parameter=="nus"][1], # nusc = nus - nu_icu = param$Value[param$Parameter=="nu_icu"][1], - nu_icuc = param$Value[param$Parameter=="nu_icu"][1], # nu_icuc = nu_icu - nu_vent = param$Value[param$Parameter=="nu_vent"][1], - nu_ventc = param$Value[param$Parameter=="nu_vent"][1], # nu_ventc = nu_vent - rhos = param$Value[param$Parameter=="rhos"][1], - amp = param$Value[param$Parameter=="amp"][1], - phi = param$Value[param$Parameter=="phi"][1], - pclin = param$Value[param$Parameter=="pclin"][1], - prob_icu = param$Value[param$Parameter=="prob_icu"][1], - prob_vent = param$Value[param$Parameter=="prob_vent"][1], - - ### INTERVENTIONS - # self isolation - selfis_eff = mean(param$Value[param$Parameter=="selfis_eff"],na.rm=T), - # social distancing - dist_eff = mean(param$Value[param$Parameter=="dist_eff"],na.rm=T), - # hand washing - hand_eff = mean(param$Value[param$Parameter=="hand_eff"],na.rm=T), - # working at home - work_eff = mean(param$Value[param$Parameter=="work_eff"],na.rm=T), - w2h = mean(param$Value[param$Parameter=="w2h"],na.rm=T), - # school closures - school_eff = mean(param$Value[param$Parameter=="school_eff"],na.rm=T), - s2h = mean(param$Value[param$Parameter=="s2h"],na.rm=T), - # cocooning the elderly - cocoon_eff = mean(param$Value[param$Parameter=="cocoon_eff"],na.rm=T), - age_cocoon = mean(param$Value[param$Parameter=="age_cocoon"],na.rm=T), - # vaccination campaign - # vaccine_on = as.numeric(param$Value_Date[param$Parameter=="date_vaccine_on"] - startdate), - vaccine_eff = mean(param$Value[param$Parameter=="vaccine_eff"],na.rm=T), - # vaccine_cov = param$Value[param$Parameter=="vaccine_cov"], - vac_campaign = mean(param$Value[param$Parameter=="vac_campaign"],na.rm=T), - # travel ban - mean_imports = mean(param$Value[param$Parameter=="mean_imports"],na.rm=T), - # screening - screen_test_sens = mean(param$Value[param$Parameter=="screen_test_sens"],na.rm=T), - # screen_contacts = mean(param$Value[param$Parameter=="screen_contacts"],na.rm=T), - screen_overdispersion = mean(param$Value[param$Parameter=="screen_overdispersion"],na.rm=T), - # voluntary home quarantine - quarantine_days = mean(param$Value[param$Parameter=="quarantine_days"],na.rm=T), - quarantine_effort = mean(param$Value[param$Parameter=="quarantine_effort"],na.rm=T), - quarantine_eff_home = mean(param$Value[param$Parameter=="quarantine_eff_home"],na.rm=T), - quarantine_eff_other = mean(param$Value[param$Parameter=="quarantine_eff_other"],na.rm=T), - - household_size = param$Value[param$Parameter=="household_size"][1] -) -ihr[,2]<- parameters["ihr_scaling"]*ihr[,2] - -# Scale parameters to percentages/ rates -parameters["rho"]<-parameters["rho"]/100 -parameters["omega"]<-(1/(parameters["omega"]*365)) -parameters["gamma"]<-1/parameters["gamma"] -parameters["nui"]<-1/parameters["nui"] -parameters["report"]<-parameters["report"]/100 -parameters["reportc"]<-parameters["reportc"]/100 -parameters["reporth"]<-parameters["reporth"]/100 -parameters["nus"]<-1/parameters["nus"] -parameters["rhos"]<-parameters["rhos"]/100 -parameters["amp"]<-parameters["amp"]/100 -parameters["selfis_eff"]<-parameters["selfis_eff"]/100 -parameters["dist_eff"]<-parameters["dist_eff"]/100 -parameters["hand_eff"]<-parameters["hand_eff"]/100 -parameters["work_eff"]<-parameters["work_eff"]/100 -parameters["w2h"]<-parameters["w2h"]/100 -parameters["school_eff"]<-parameters["school_eff"]/100 -parameters["s2h"]<-parameters["s2h"]/100 -parameters["cocoon_eff"]<-parameters["cocoon_eff"]/100 -parameters["age_cocoon"]<-floor((parameters["age_cocoon"]/5)+1) -parameters["vaccine_eff"]<-parameters["vaccine_eff"]/100 -# parameters["vaccine_cov"]<-parameters["vaccine_cov"]/100 -# parameters["vac_campaign"]<-parameters["vac_campaign"]*7 -parameters["screen_test_sens"]<-parameters["screen_test_sens"]/100 -parameters["quarantine_days"]<-parameters["quarantine_days"] -parameters["quarantine_effort"]<-1/parameters["quarantine_effort"] -parameters["quarantine_eff_home"]<-parameters["quarantine_eff_home"]/-100 -parameters["quarantine_eff_other"]<-parameters["quarantine_eff_other"]/100 -parameters["give"]<-parameters["give"]/100 -parameters["pdeath_h"]<-parameters["pdeath_h"]/100 -parameters["pdeath_hc"]<-parameters["pdeath_hc"]/100 -parameters["pdeath_icu"]<-parameters["pdeath_icu"]/100 -parameters["pdeath_icuc"]<-parameters["pdeath_icuc"]/100 -parameters["pdeath_vent"]<-parameters["pdeath_vent"]/100 -parameters["pdeath_ventc"]<-parameters["pdeath_ventc"]/100 -parameters["nusc"]<-1/parameters["nusc"] -parameters["nu_icu"]<-1/parameters["nu_icu"] -parameters["nu_icuc"]<-1/parameters["nu_icuc"] -parameters["nu_vent"]<-1/parameters["nu_vent"] -parameters["nu_ventc"]<-1/parameters["nu_ventc"] -parameters["pclin"]<-parameters["pclin"]/100 -parameters["prob_icu"]<-parameters["prob_icu"]/100 -parameters["prob_vent"]<-parameters["prob_vent"]/100 -parameters2<-parameters - -########################################################################### -# Define the indices for each variable -Sindex<-1:A -Eindex<-(A+1):(2*A) -Iindex<-(2*A+1):(3*A) -Rindex<-(3*A+1):(4*A) -Xindex<-(4*A+1):(5*A) -Hindex<-(5*A+1):(6*A) -HCindex<-(6*A+1):(7*A) -Cindex<-(7*A+1):(8*A) -CMindex<-(8*A+1):(9*A) -Vindex<-(9*A+1):(10*A) -QSindex<-(10*A+1):(11*A) -QEindex<-(11*A+1):(12*A) -QIindex<-(12*A+1):(13*A) -QRindex<-(13*A+1):(14*A) -CLindex<-(14*A+1):(15*A) -QCindex<-(15*A+1):(16*A) -ICUindex<-(16*A+1):(17*A) -ICUCindex<-(17*A+1):(18*A) -ICUCVindex<-(18*A+1):(19*A) -Ventindex<-(19*A+1):(20*A) -VentCindex<-(20*A+1):(21*A) -CMCindex<-(21*A+1):(22*A) - -########################################################################### -# MODEL INITIAL CONDITIONS -initI<-0*popstruc[,2] # Infected and symptomatic -initE<-0*popstruc[,2] # Incubating -initE[aci]<-1 # place random index case in E compartment -initR<-0*popstruc[,2] # Immune -initX<-0*popstruc[,2] # Isolated -initV<-0*popstruc[,2] # Vaccinated -initQS<-0*popstruc[,2] # quarantined S -initQE<-0*popstruc[,2] # quarantined E -initQI<-0*popstruc[,2] # quarantined I -initQR<-0*popstruc[,2] # quarantined R -initH<-0*popstruc[,2] # hospitalised -initHC<-0*popstruc[,2] # hospital critical -initC<-0*popstruc[,2] # Cumulative cases (true) -initCM<-0*popstruc[,2] # Cumulative deaths (true) -initCL<-0*popstruc[,2] # symptomatic cases -initQC<-0*popstruc[,2] # quarantined C -initICU<-0*popstruc[,2] # icu -initICUC<-0*popstruc[,2] # icu critical -initICUCV<-0*popstruc[,2] # icu critical -initVent<-0*popstruc[,2] # icu vent -initVentC<-0*popstruc[,2] # icu vent crit -initCMC<-0*popstruc[,2] # Cumulative deaths (true) -initS<-popstruc[,2]-initE-initI-initR-initX-initV-initH-initHC-initQS-initQE-initQI-initQR-initCL-initQC-initICU-initICUC-initICUCV-initVent-initVentC # Susceptible (non-immune) - - -inp <- read_excel(file_path, sheet = "Interventions") -inputs<-function(inp, run){ - # cap intervention end dates with simulation end date - inp$`Date End` = pmin(stopdate, inp$`Date End`) - - tb<-which(inp$`Apply to`==run) - - si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tb) - scr<-intersect(which(inp$Intervention=="Screening (when S.I.)"),tb) - sd<-intersect(which(inp$Intervention=="Social Distancing"),tb) - hw<-intersect(which(inp$Intervention=="Handwashing"),tb) - wah<-intersect(which(inp$Intervention=="Working at Home"),tb) - sc<-intersect(which(inp$Intervention=="School Closures"),tb) - cte<-intersect(which(inp$Intervention=="Shielding the Elderly"),tb) - q<-intersect(which(inp$Intervention=="Household Isolation (when S.I.)"),tb) - tb<-intersect(which(inp$Intervention=="International Travel Ban"),tb) - vc<-intersect(which(inp$Intervention=="Vaccination"),tb) - - v<-(format(as.POSIXct(inp$`Date Start`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date Start`<-v2 - - v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date End`<-v2 - - ## self isolation - f<-c() - si_vector<-c() - isolation<-c() - if (length(si)>=1){ - for (i in 1:length(si)){ - f<-c(f,as.numeric(inp$`Date Start`[si[i]]-startdate),as.numeric(inp$`Date End`[si[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[si[i]]>startdate){ - si_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[si[i]],(f[i+1]-f[i])*20)) - isolation<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - si_vector<-c(rep(inp$`Value`[si[i]],(f[i+1])*20)) - isolation<-c(rep(1,(f[i+1])*20)) - } - } - else{ - si_vector<-c(si_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - si_vector<-c(si_vector,rep(inp$`Value`[si[i]],(f[i*2]-f[i*2-1])*20)) - isolation<-c(isolation,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - isolation<-c(isolation,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(si) && f[i*2]=1){ - for (i in 1:length(sd)){ - - f<-c(f,as.numeric(inp$`Date Start`[sd[i]]-startdate),as.numeric(inp$`Date End`[sd[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sd[i]]>startdate){ - sd_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sd[i]],(f[i+1]-f[i])*20)) - distancing<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sd_vector<-c(rep(inp$`Value`[sd[i]],(f[i+1])*20)) - distancing<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sd_vector<-c(sd_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],(f[i*2]-f[i*2-1])*20)) - distancing<-c(distancing,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - distancing<-c(distancing,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sd)&& f[i*2]=1){ - for (i in 1:length(scr)){ - - f<-c(f,as.numeric(inp$`Date Start`[scr[i]]-startdate),as.numeric(inp$`Date End`[scr[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[scr[i]]>startdate){ - scr_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[scr[i]],(f[i+1]-f[i])*20)) - screen<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - scr_vector<-c(rep(inp$`Value`[scr[i]],(f[i+1])*20)) - screen<-c(rep(1,(f[i+1])*20)) - } - } - else{ - scr_vector<-c(scr_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],(f[i*2]-f[i*2-1])*20)) - screen<-c(screen,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - screen<-c(screen,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(scr)&& f[i*2]=1){ - for (i in 1:length(hw)){ - - f<-c(f,as.numeric(inp$`Date Start`[hw[i]]-startdate),as.numeric(inp$`Date End`[hw[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[hw[i]]>startdate){ - hw_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[hw[i]],(f[i+1]-f[i])*20)) - handwash<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - hw_vector<-c(rep(inp$`Value`[hw[i]],(f[i+1])*20)) - handwash<-c(rep(1,(f[i+1])*20)) - } - } - else{ - hw_vector<-c(hw_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],(f[i*2]-f[i*2-1])*20)) - handwash<-c(handwash,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - handwash<-c(handwash,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(hw)&& f[i*2]=1){ - for (i in 1:length(wah)){ - - f<-c(f,as.numeric(inp$`Date Start`[wah[i]]-startdate),as.numeric(inp$`Date End`[wah[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[wah[i]]>startdate){ - wah_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[wah[i]],(f[i+1]-f[i])*20)) - workhome<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - wah_vector<-c(rep(inp$`Value`[wah[i]],(f[i+1])*20)) - workhome<-c(rep(1,(f[i+1])*20)) - } - } - else{ - wah_vector<-c(wah_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],(f[i*2]-f[i*2-1])*20)) - workhome<-c(workhome,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - workhome<-c(workhome,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(wah)&& f[i*2]=1){ - for (i in 1:length(sc)){ - - f<-c(f,as.numeric(inp$`Date Start`[sc[i]]-startdate),as.numeric(inp$`Date End`[sc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sc[i]]>startdate){ - sc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sc[i]],(f[i+1]-f[i])*20)) - schoolclose<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sc_vector<-c(rep(inp$`Value`[sc[i]],(f[i+1])*20)) - schoolclose<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sc_vector<-c(sc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],(f[i*2]-f[i*2-1])*20)) - schoolclose<-c(schoolclose,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - schoolclose<-c(schoolclose,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sc)&& f[i*2]=1){ - for (i in 1:length(cte)){ - - f<-c(f,as.numeric(inp$`Date Start`[cte[i]]-startdate),as.numeric(inp$`Date End`[cte[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[cte[i]]>startdate){ - cte_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[cte[i]],(f[i+1]-f[i])*20)) - cocoon<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - cte_vector<-c(rep(inp$`Value`[cte[i]],(f[i+1])*20)) - cocoon<-c(rep(1,(f[i+1])*20)) - } - } - else{ - cte_vector<-c(cte_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],(f[i*2]-f[i*2-1])*20)) - cocoon<-c(cocoon,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cocoon<-c(cocoon,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(cte)&& f[i*2]=1){ - for (i in 1:length(q)){ - - f<-c(f,as.numeric(inp$`Date Start`[q[i]]-startdate),as.numeric(inp$`Date End`[q[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[q[i]]>startdate){ - q_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[q[i]],(f[i+1]-f[i])*20)) - quarantine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - q_vector<-c(rep(inp$`Value`[q[i]],(f[i+1])*20)) - quarantine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - q_vector<-c(q_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - q_vector<-c(q_vector,rep(inp$`Value`[q[i]],(f[i*2]-f[i*2-1])*20)) - quarantine<-c(quarantine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - quarantine<-c(quarantine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(q)&& f[i*2]=1){ - for (i in 1:length(tb)){ - - f<-c(f,as.numeric(inp$`Date Start`[tb[i]]-startdate),as.numeric(inp$`Date End`[tb[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[tb[i]]>startdate){ - tb_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[tb[i]],(f[i+1]-f[i])*20)) - travelban<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - tb_vector<-c(rep(inp$`Value`[tb[i]],(f[i+1])*20)) - travelban<-c(rep(1,(f[i+1])*20)) - } - } - else{ - tb_vector<-c(tb_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],(f[i*2]-f[i*2-1])*20)) - travelban<-c(travelban,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - travelban<-c(travelban,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(tb)&& f[i*2]=1){ - for (i in 1:length(vc)){ - - f<-c(f,as.numeric(inp$`Date Start`[vc[i]]-startdate),as.numeric(inp$`Date End`[vc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[vc[i]]>startdate){ - vc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[vc[i]],(f[i+1]-f[i])*20)) - vaccine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - vc_vector<-c(rep(inp$`Value`[vc[i]],(f[i+1])*20)) - vaccine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - vc_vector<-c(vc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],(f[i*2]-f[i*2-1])*20)) - vaccine<-c(vaccine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vaccine<-c(vaccine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(vc)&& f[i*2]= 7) {Rt[i] <- NA} - } - - # Export in a cohesive format ---- - results <- list() - results$time <- startdate + times # dates - results$Rt <- Rt - results$cum_mortality <- round(cmortality1) # cumulative mortality - results$pct_total_pop_infected <- round(100 * tail(cumsum(rowSums(parameters["gamma"]*out[,(Eindex+1)])),1)/sum(popstruc[,2]), 1) # proportion of the population that has been infected at the end of the simulation - results$doubling_time <- round(log(2)*7 / (log(dailyinc1[2+7] / dailyinc1[2])), 2) # (Baseline only) to double the number of infections at inception - results$required_beds <- round(previcureq1) # required beds - results$saturation <- parameters["beds_available"] # saturation - results$daily_incidence <- round(dailyinc1) # daily incidence (Reported) - results$daily_total_cases <- round(rowSums(parameters["gamma"]*out[,(Eindex+1)]+parameters["gamma"]*out[,(QEindex+1)])) # daily incidence (Reported + Unreported) # daily incidence (Reported + Unreported) - results$hospital_surge_beds <- round(previcureq1) - results$icu_beds <- round(previcureq21) - results$ventilators <- round(previcureq31) - results$normal_bed_requirement <- round(reqsurge1) #real required beds. previcureq1 above is the occupancy - results$icu_bed_requirement <- round(reqicu1) - results$icu_ventilator_requirement <- round(reqvent1) - - results$death_natural_non_exposed <- round(base_mort_S1) - results$death_natural_exposed <- round(base_mort_E1 + base_mort_I1 + base_mort_CL1 + base_mort_X1 + base_mort_QS1 + - base_mort_QE1 + base_mort_QI1 + base_mort_QC1 + base_mort_QR1 + base_mort_R1+ - base_mort_H1+base_mort_HC1+base_mort_ICU1+base_mort_ICUC1+base_mort_ICUCV1+ - base_mort_Vent1+base_mort_VentC1) - results$death_treated_hospital <- round(cinc_mort_H1) - results$death_treated_icu <- round(cinc_mort_ICU1) - results$death_treated_ventilator <- round(cinc_mort_Vent1) - results$death_untreated_hospital <- round(cinc_mort_HC1) - results$death_untreated_icu <- round(cinc_mort_ICUC1) - results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) - results$attributable_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + - results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator - results$attributable_deaths_end <- last(results$attributable_deaths) - results$total_deaths <- results$attributable_deaths + results$death_natural_non_exposed + results$death_natural_exposed - results$total_deaths_end <- last(results$total_deaths) - results$total_reported_deaths_end <- last(results$cum_mortality) - results$base_mort_H <- base_mort_H1 - results$base_mort_HC <- base_mort_HC1 - results$base_mort_ICU <- base_mort_ICU1 - results$base_mort_ICUC <- base_mort_ICUC1 - results$base_mort_ICUCV <- base_mort_ICUCV1 - results$base_mort_Vent <- base_mort_Vent1 - results$base_mort_VentC <- base_mort_VentC1 - results$base_mort_S <- base_mort_S1 - results$base_mort_E <- base_mort_E1 - results$base_mort_I <- base_mort_I1 - results$base_mort_CL <- base_mort_CL1 - results$base_mort_X <- base_mort_X1 - results$base_mort_QS <- base_mort_QS1 - results$base_mort_QE <- base_mort_QE1 - results$base_mort_QI <- base_mort_QI1 - results$base_mort_QC <- base_mort_QC1 - results$base_mort_QR <- base_mort_QR1 - results$base_mort_R <- base_mort_R1 - - ## AGE DEPENDENT MORTALITY - cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out[,(Hindex+1)]) - cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out[,(HCindex+1)]) - cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out[,(ICUindex+1)] - cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] - cinc_mort_ICUCV1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(ICUCVindex+1)] - cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] - cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] - totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_ICUCV1+cinc_mort_Vent1+cinc_mort_VentC1) - basemort_H1<-(out[,(Hindex+1)]) - basemort_HC1<-(out[,(HCindex+1)]) - basemort_ICU1<-(out[,(ICUindex+1)]) - basemort_ICUC1<-(out[,(ICUCindex+1)]) - basemort_ICUCV1<-(out[,(ICUCVindex+1)]) - basemort_Vent1<-(out[,(Ventindex+1)]) - basemort_VentC1<-(out[,(VentCindex+1)]) - totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_ICUCV1+basemort_Vent1+basemort_VentC1) - tc<-c() - - for (i in 1:dim(cinc_mort_H1)[1]) { - for (j in 1:dim(cinc_mort_H1)[2]) { - tc<-rbind(tc,c(i, j, totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) - } - } - tc<-as.data.frame(tc) - colnames(tc)<-c("Day","Age","value") - - results$tc <- tc %>% - mutate(Date = startdate + Day, - age_cat = case_when( - Age >= 1 & Age <= 6 ~ "≤ 30 y.o.", - Age > 6 & Age <= 8 ~ "30-40 y.o.", - Age > 8 & Age <= 10 ~ "40-50 y.o.", - Age > 10 & Age <= 12 ~ "50-60 y.o.", - Age > 12 & Age <= 14 ~ "60-70 y.o.", - Age >= 15 ~ "≥ 70 y.o.")) %>% - mutate(age_cat = factor(age_cat, levels = rev(c("≤ 30 y.o.", "30-40 y.o.", - "40-50 y.o.", "50-60 y.o.", "60-70 y.o.", "≥ 70 y.o.")))) - - mortality_lag <- data.frame(Age = popstruc$agefloor) - if(nrow(out) >= 30) mortality_lag <- bind_cols(mortality_lag, - data.frame(day30 = out[30,CMindex+1]/out[30,Cindex+1]) %>% - mutate(day30 = ifelse(is.infinite(day30), 0, day30)) %>% - rename(`Day 30` = day30)) - if(nrow(out) >= 60) mortality_lag <- bind_cols(mortality_lag, - data.frame(day60 = out[60,CMindex+1]/out[60,Cindex+1]) %>% - mutate(day60 = ifelse(is.infinite(day60), 0, day60)) %>% - rename(`Day 60` = day60)) - if(nrow(out) >= 90) mortality_lag <- bind_cols(mortality_lag, - data.frame(day90 = out[90,CMindex+1]/out[90,Cindex+1]) %>% - mutate(day90 = ifelse(is.infinite(day90), 0, day90)) %>% - rename(`Day 90` = day90)) - if(nrow(out) >= 120) mortality_lag <- bind_cols(mortality_lag, - data.frame(day120 = out[120,CMindex+1]/out[120,Cindex+1]) %>% - mutate(day120 = ifelse(is.infinite(day120), 0, day120)) %>% - rename(`Day 120` = day120)) - - results$mortality_lag <- mortality_lag - - return(results) -} - -# covidOdeCpp_reset() -# out <- ode(y = Y, times = times, func = covidOdeCpp, parms = parameters2, -# input=vectors, A=A, -# contact_home=contact_home, contact_school=contact_school, -# contact_work=contact_work, contact_other=contact_other, -# popbirth_col2=popbirth[,2], popstruc_col2=popstruc[,2], -# ageing=ageing, -# ifr_col2=ifr[,2], ihr_col2=ihr[,2], mort_col=mort) - -out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) -simul_baseline <- process_ode_outcome(out0) -# # write.csv(simul_baseline, paste0(hilo,"_baseline_",gsub(":|-","",Sys.time()),".csv")) - -#future interventions -#extend travel ban, quarantine, hand washing, cocooning the elderly until 1st July -parameters2 <- parameters -out <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters2,input=vectors) -simul_interventions <- process_ode_outcome(out) -# write.csv(simul_interventions, paste0(hilo,"_futureIntv_",gsub(":|-","",Sys.time()),".csv")) - -pop1<-out[,(Sindex+1)]+out[,(Eindex+1)]+out[,(Iindex+1)]+out[,(CLindex+1)]+out[,(Rindex+1)]+out[,(Xindex+1)]+out[,(Vindex+1)]+ - out[,(QSindex+1)]+out[,(QEindex+1)]+out[,(QIindex+1)]+out[,(QCindex+1)]+out[,(QRindex+1)]+ - out[,(Hindex+1)]+out[,(HCindex+1)]+out[,(ICUindex+1)]+out[,(ICUCindex+1)]+out[,(ICUCVindex+1)]+out[,(Ventindex+1)]+out[,(VentCindex+1)] -tpop1<-rowSums(pop1) - -############# PLOTTING -# Fitting tab -# fitting the intervention lines to the data to account for any historical interventions -time<-as.Date(out0[,1]+startdate) -par(mfrow=c(1,2)) -# set up the axis limits -xmin<-min(as.Date(cases_rv[,1])) -xmax<-max(as.Date(cases_rv[,1])) -ymax<-max(cases_rv[,2],na.rm = T) -xtick<-seq(xmin, xmax, by=7) -plot(time,simul_interventions$daily_incidence,type='l',lwd=3, - main="New Reported Cases", xlab="Date", ylab="Cases per day", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -axis(side=1, labels = FALSE) -text(x=xtick, y=-250, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - -# reset the maximum to the cumulative mortality -ymax<-max(cases_rv[,3],na.rm = T) -plot(time,simul_interventions$cum_mortality,type='l',lwd=3, - main="Cumulative Mortality", xlab="Date", ylab="Total deaths", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -text(x=xtick, y=-100, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,3],pch=19,col='red') - - -### Predictions tab -par(mfrow=c(1,2)) -### Cases at baseline and intervention -ymax<-max(c(cases_rv[,2],simul_baseline$daily_incidence,simul_interventions$daily_incidence),na.rm=T) -plot(time,simul_baseline$daily_incidence,type='l',lwd=3,col='blue', - main="Baseline", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') -plot(time,simul_interventions$daily_incidence,type='l',lwd=3,col='blue', - main="Intervention", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - - - -# # Hospital prevalences stratified by H,ICU and Vent -ymax<-max(c((simul_baseline$hospital_surge_beds+simul_baseline$icu_beds+simul_baseline$ventilators),(simul_interventions$hospital_surge_beds+simul_interventions$icu_beds+simul_interventions$ventilators))) -time<-as.Date(out[,"time"]+startdate) -coul=c("#047883", "#24A9E2","#051A46") -DM<-as.data.frame(cbind(time,simul_baseline$hospital_surge_beds,simul_baseline$icu_beds,simul_baseline$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time,origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d0<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -DM<-as.data.frame(cbind(time,simul_interventions$hospital_surge_beds,simul_interventions$icu_beds,simul_interventions$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -grid.arrange(d0+ylab("Number of Patients")+ - ggtitle("Baseline")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - d1+ylab("Number of Patients")+ - ggtitle("Intervention")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - nrow = 1) - - -# # Cumulative mortality at baseline and intervention stratified by hospital status -ymax<-max(c((simul_baseline$total_deaths),(simul_interventions$total_deaths))) -time<-as.Date(out[,"time"]+startdate) -coul=c("#047883", "#24A9E2","#051A46","#E68029", "#D63304","#D1D604") -DM0<-as.data.frame(cbind(time,simul_baseline$base_mort_I+simul_baseline$base_mort_QI, - simul_baseline$base_mort_CL+simul_baseline$base_mort_QC, - simul_baseline$base_mort_X, - simul_baseline$base_mort_S+simul_baseline$base_mort_QS, - simul_baseline$base_mort_E+simul_baseline$base_mort_QE, - simul_baseline$base_mort_QR+simul_baseline$base_mort_R, - simul_baseline$death_treated_hospital, - simul_baseline$death_treated_icu, - simul_baseline$death_treated_ventilator, - simul_baseline$death_untreated_hospital, - simul_baseline$death_untreated_icu, - simul_baseline$death_untreated_ventilator)) -colnames(DM0)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM0$Time<-as.Date(DM0$Time, origin = "1970-01-01") -DMF0<-melt(DM0, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m0<-ggplot(DMF0, aes(x = Time, y = value,fill=variable)) + - geom_area() - -DM<-as.data.frame(cbind(time,simul_interventions$base_mort_I+simul_interventions$base_mort_QI,simul_interventions$base_mort_CL+simul_interventions$base_mort_QC,simul_interventions$base_mort_X,simul_interventions$base_mort_S+ - simul_interventions$base_mort_QS,simul_interventions$base_mort_E+simul_interventions$base_mort_QE,simul_interventions$base_mort_QR+simul_interventions$base_mort_R, - simul_interventions$death_treated_hospital,simul_interventions$death_treated_icu,simul_interventions$death_treated_ventilator,simul_interventions$death_untreated_hospital,simul_interventions$death_untreated_icu,simul_interventions$death_untreated_ventilator)) -colnames(DM)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area() -grid.arrange(m0+ylab("Cumulatice mortality")+ - ggtitle("Baseline")+ - ylim(0, ymax), - m1+ylab("Cumulatice mortality")+ - ggtitle("Intervention")+ - ylim(0, ymax), - nrow = 1) - - - -# # Estimated basic reproduction number, R_t -# par(mfrow=c(1,2)) -# ymax<-max(c(simul_baseline$Rt[!is.na(simul_baseline$Rt)],simul_interventions$Rt[!is.na(simul_interventions$Rt)])) -# plot(time,simul_baseline$Rt,type='l',lwd=3,col='black', -# main="Baseline", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -# lines(time,simul_baseline$Rt/simul_baseline$Rt,lwd=2,col='grey') -# plot(time,simul_interventions$Rt,type='l',lwd=3,col='black', -# main="Intervention", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -# lines(time,simul_interventions$Rt/simul_interventions$Rt,lwd=2,col='grey') -# - -## Predicted ifr -# ymax=max(c(simul_baseline$MORT1$value,simul_interventions$MORT1$value)) -# gm<-ggplot(data=simul_interventions$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_interventions$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") -# gm0<-ggplot(data=simul_baseline$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_baseline$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") - -# grid.arrange(gm+theme_classic(), -# gm0+theme_classic(), -# nrow=1) - - -# ## AGE DEPENDENT MORTALITY -# cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out[,(Hindex+1)]) -# cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out[,(HCindex+1)]) -# cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out[,(ICUindex+1)] -# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] -# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] -# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] -# totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_Vent1+cinc_mort_VentC1) -# basemort_H1<-(out[,(Hindex+1)]) -# basemort_HC1<-(out[,(HCindex+1)]) -# basemort_ICU1<-(out[,(ICUindex+1)]) -# basemort_ICUC1<-(out[,(ICUCindex+1)]) -# basemort_Vent1<-(out[,(Ventindex+1)]) -# basemort_VentC1<-(out[,(VentCindex+1)]) -# totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_Vent1+basemort_VentC1) -# tc<-c() -# ages<-seq(0,100,by=5) -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc<-rbind(tc,c(i,ages[j],totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) -# } -# } -# tc<-as.data.frame(tc) -# colnames(tc)<-c("Day","Age","value") -# tc$Age<-as.factor(tc$Age) -# p6<-ggplot(data=tc, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ -# ylab("Proportion of deaths") -# -# inc_mort_H0 <- parameters["nus"]*parameters["pdeath_h"]*(out0[,(Hindex+1)]) -# inc_mort_HC0 <- parameters["nusc"]*parameters["pdeath_hc"]*(out0[,(HCindex+1)]) -# inc_mort_ICU0 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out0[,(ICUindex+1)] -# inc_mort_ICUC0 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out0[,(ICUCindex+1)] -# inc_mort_Vent0 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out0[,(Ventindex+1)] -# inc_mort_VentC0 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out0[,(VentCindex+1)] -# totage0<-as.data.frame(inc_mort_H0+inc_mort_HC0+inc_mort_ICU0+inc_mort_ICUC0+inc_mort_Vent0+inc_mort_VentC0) -# basemort_H0<-(out0[,(Hindex+1)]) -# basemort_HC0<-(out0[,(HCindex+1)]) -# basemort_ICU0<-(out0[,(ICUindex+1)]) -# basemort_ICUC0<-(out0[,(ICUCindex+1)]) -# basemort_Vent0<-(out0[,(Ventindex+1)]) -# basemort_VentC0<-(out0[,(VentCindex+1)]) -# totbase0<-as.data.frame(basemort_H0+basemort_HC0+basemort_ICU0+basemort_ICUC0+basemort_Vent0+basemort_VentC0) -# tc0<-c() -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc0<-rbind(tc0,c(i,ages[j],totage0[i,j]*ifr[j,2]+totbase0[i,j]*mort[j])) -# } -# } -# tc0<-as.data.frame(tc0) -# colnames(tc0)<-c("Day","Age","value") -# tc0$Age<-as.factor(tc0$Age) -# p16<-ggplot(data=tc0, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ylab("Proportion of deaths") - -# grid.arrange(p16+theme_minimal(), -# p6+theme_minimal(), -# nrow=1) -# - - -# -# -# -# ######################################################################################################################### -# ##### SUMMARY METRICS ################################################################################################ -# ####################################################################################################################### -# -# infected0<-tail((rowSums(out0[,(Rindex+1)])),1)/sum(popstruc[,2]) -# infected0 -# infected1<-tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) -# infected1 -# -# # #Population size checks -# # tpop1 -# # tpop0 -# -# # PCR -# time_of_measurement<-40:49 -# # general population -# (rowSums(out[time_of_measurement,Iindex+1])+rowSums(out[time_of_measurement,CLindex+1])+rowSums(out[time_of_measurement,QIindex+1])+ -# rowSums(out[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# # every infection including hospital infections -# (rowSums(out[time_of_measurement,Iindex+1])+rowSums(out[time_of_measurement,CLindex+1])+rowSums(out[time_of_measurement,Hindex+1])+ -# rowSums(out[time_of_measurement,ICUindex+1])+rowSums(out[time_of_measurement,Ventindex+1])+rowSums(out[time_of_measurement,HCindex+1])+ -# rowSums(out[time_of_measurement,ICUCindex+1])+rowSums(out[time_of_measurement,VentCindex+1])+rowSums(out[time_of_measurement,QIindex+1])+ -# rowSums(out[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# -# # SEROLOGY -# tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) -# -# # IHR -# sum(ihr$severe*popstruc[,2]/sum(popstruc[,2])) -# -# -# # PORPORTIONAL MORTALITY IN THE ELDEST -# m30<-out0[30,CMindex+1]/(out0[30,Cindex+1]) -# m30[is.infinite(m30)]<-0 -# m60<-out0[60,CMindex+1]/out0[60,Cindex+1] -# m60[is.infinite(m60)]<-0 -# m90<-out0[90,CMindex+1]/out0[90,Cindex+1] -# m90[is.infinite(m90)]<-0 -# m120<-out0[120,CMindex+1]/out0[120,Cindex+1] -# m120[is.infinite(m120)]<-0 -# -# ifr30<-sum(m30*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr60<-sum(m60*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr90<-sum(m90*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr120<-sum(m120*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# cbind(ifr30,ifr60,ifr90,ifr120)*100 -# -# PMORTDF0<-as.data.frame(cbind(out0[30,CMindex+1]/sum(out0[30,CMindex+1]),out0[60,CMindex+1]/sum(out0[60,CMindex+1]), -# out0[90,CMindex+1]/sum(out0[90,CMindex+1]),out0[120,CMindex+1]/sum(out0[120,CMindex+1]))) -# PMORTDF<-as.data.frame(cbind(out[30,CMindex+1]/sum(out[30,CMindex+1]),out[60,CMindex+1]/sum(out[60,CMindex+1]), -# out[90,CMindex+1]/sum(out[90,CMindex+1]),out[120,CMindex+1]/sum(out[120,CMindex+1]))) -# sum(PMORTDF0$V2[15:21]) -# sum(PMORTDF$V2[15:21]) -# -# -# # output doubling time over time first 7 days -# dd<-7 -# doub0<-log(2)*dd/(log(dailyinc0[2+dd]/dailyinc0[2])) -# doub0 - -# -# - - diff --git a/r_versions/covidage_v13.8.R b/r_versions/covidage_v13.8.R deleted file mode 100644 index 7397e7a..0000000 --- a/r_versions/covidage_v13.8.R +++ /dev/null @@ -1,1448 +0,0 @@ -rm(list = ls()) - -require("deSolve") -library("ggplot2") -library("dplyr") -library("reshape2") -require("gridExtra") -# library(ggpubr) -# library(bsplus) -# library(deSolve) -# library(DT) -# library(highcharter) -# library(lubridate) -# library(pushbar) -library("readxl") -# library(reshape2) -# library(scales) -# library(shiny) -# library(shinyBS) -# library(shinycssloaders) -# library(shinyhelper) -# library(shinythemes) -# library(shinyWidgets) -# library(tidyverse) -# library(XLConnect) - -# library("Rcpp") -# Rcpp.package.skeleton("foobar") - -#read data from excel file -setwd("/home/bogao/Projects/ATOME-MORU/comoOdeCpp") -load("./data/data_CoMo.RData") -file_path <- paste0(getwd(),"/data/Template_CoMoCOVID-19App_new.xlsx") -country_name<-"Cambodia" - -# Cases -dta <- read_excel(file_path, sheet = "Cases") -names(dta) <- c("date", "cases", "deaths") - -cases_rv <- dta %>% - mutate(date = as.Date(date), cumulative_death = cumsum(deaths)) %>% - as.data.frame() - -# Severity/Mortality -dta <- read_excel(file_path, sheet = "Severity-Mortality") -names(dta) <- c("age_category", "ifr", "ihr") - -mort_sever_rv <- dta %>% - mutate(ihr = ihr/100) %>% # starting unit should be % - scaling to a value between 0 and 1 - mutate(ifr = ifr/max(ifr)) # starting unit should be % - scaling to a value between 0 and 1 - -# Population -dta <- read_excel(file_path, sheet = "Population") -names(dta) <- c("age_category", "pop", "birth", "death") - -population_rv <- dta %>% - transmute(country = NA, age_category, pop, birth, death) - -# Parameters -param <- bind_rows(read_excel(file_path, sheet = "Parameters"), - read_excel(file_path, sheet = "Country Area Param"), - read_excel(file_path, sheet = "Virus Param"), - read_excel(file_path, sheet = "Hospitalisation Param"), - read_excel(file_path, sheet = "Interventions Param"), - read_excel(file_path, sheet = "Interventions")) %>% - mutate(Value_Date = as.Date(Value_Date)) - -# START Bridge ---- -popstruc <- population_rv %>% - select(age_category, pop) %>% - rename(agefloor = age_category) %>% - as.data.frame() - -popbirth <- population_rv %>% - select(age_category, birth) %>% - as.data.frame() # unit should be per person per day - -mort <- population_rv %>% - pull(death) # unit should be per person per day - -ihr <- mort_sever_rv %>% - select(age_category, ihr) %>% - as.data.frame() - -ifr <- mort_sever_rv %>% - select(age_category, ifr) %>% - as.data.frame() - - -######### POP AGEING -# per year ageing matrix -A<-length(popstruc[,2]) -dd<-seq(1:A)/seq(1:A) -ageing <- t(diff(diag(dd),lag=1)/(5*365.25)) -ageing<-cbind(ageing,0*seq(1:A)) # no ageing from last compartment - -# -pop<-population$country==country_name -pp<-population$pop[pop] -### CONTACT MATRICES -c_home <- contact_home[[country_name]] %>% as.matrix() -c_school <- contact_school[[country_name]] %>% as.matrix() -c_work <- contact_work[[country_name]] %>% as.matrix() -c_other <- contact_other[[country_name]] %>% as.matrix() -nce <-A-length(c_home[1,]) - -contact_home<-matrix(0,nrow=A,ncol=A) -contact_school<-matrix(0,nrow=A,ncol=A) -contact_work<-matrix(0,nrow=A,ncol=A) -contact_other<-matrix(0,nrow=A,ncol=A) - -for (i in 1:(A-nce)){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[i,j] - contact_school[i,j]<-c_school[i,j] - contact_work[i,j]<-c_work[i,j] - contact_other[i,j]<-c_other[i,j] - } -} - -for (i in (A+1-nce):A){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[(A-nce),j] - contact_school[i,j]<-c_school[(A-nce),j] - contact_work[i,j]<-c_work[(A-nce),j] - contact_other[i,j]<-c_other[(A-nce),j] - } -} -for (i in 1:(A-nce)){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[i,(A-nce)] - contact_school[i,j]<-c_school[i,(A-nce)] - contact_work[i,j]<-c_work[i,(A-nce)] - contact_other[i,j]<-c_other[i,(A-nce)] - } -} -for (i in (A+1-nce):A){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[(A-nce),(A-nce)] - contact_school[i,j]<-c_school[(A-nce),(A-nce)] - contact_work[i,j]<-c_work[(A-nce),(A-nce)] - contact_other[i,j]<-c_other[(A-nce),(A-nce)] - } -} - - - -######### INITIALISE SIMULATION/INTERVENTION START TIMES -startdate <- param$Value_Date[param$Parameter == "date_range_simul_start"] -stopdate <- param$Value_Date[param$Parameter == "date_range_simul_end"] -startdate <- startdate[1] -stopdate <- stopdate[1] - - -day_start <- as.numeric(startdate-startdate) -day_stop <- as.numeric(stopdate-startdate) -times <- seq(day_start, day_stop) - -tin<-as.numeric(startdate-as.Date("2020-01-01"))/365.25 -initP<-sum(popstruc[,2]) # population size -ageindcase<-20 # age of index case (years) -aci <- floor((ageindcase/5)+1) # age class of index case - - -############# DEFINE PARAMETERS -parameters <- c( - ### Transmission instrinsic - p = param$Value[param$Parameter=="p"][1], - rho = param$Value[param$Parameter=="rho"][1], - omega = param$Value[param$Parameter=="omega"][1], - gamma = param$Value[param$Parameter=="gamma"][1], - nui = param$Value[param$Parameter=="nui"][1], - report = param$Value[param$Parameter=="report"][1], - reportc = param$Value[param$Parameter=="reportc"][1], - reporth = param$Value[param$Parameter=="reporth"][1], - beds_available = param$Value[param$Parameter=="beds_available"][1], - icu_beds_available = param$Value[param$Parameter=="icu_beds_available"][1], - ventilators_available = param$Value[param$Parameter=="ventilators_available"][1], - give = 95, - pdeath_h = param$Value[param$Parameter=="pdeath_h"][1], - pdeath_hc = param$Value[param$Parameter=="pdeath_hc"][1], - pdeath_icu = param$Value[param$Parameter=="pdeath_icu"][1], - pdeath_icuc = param$Value[param$Parameter=="pdeath_icuc"][1], - pdeath_vent = param$Value[param$Parameter=="pdeath_vent"][1], - pdeath_ventc = param$Value[param$Parameter=="pdeath_ventc"][1], - ihr_scaling = param$Value[param$Parameter=="ihr_scaling"][1], - nus = param$Value[param$Parameter=="nus"][1], - nusc = param$Value[param$Parameter=="nus"][1], # nusc = nus - nu_icu = param$Value[param$Parameter=="nu_icu"][1], - nu_icuc = param$Value[param$Parameter=="nu_icu"][1], # nu_icuc = nu_icu - nu_vent = param$Value[param$Parameter=="nu_vent"][1], - nu_ventc = param$Value[param$Parameter=="nu_vent"][1], # nu_ventc = nu_vent - rhos = param$Value[param$Parameter=="rhos"][1], - amp = param$Value[param$Parameter=="amp"][1], - phi = param$Value[param$Parameter=="phi"][1], - pclin = param$Value[param$Parameter=="pclin"][1], - prob_icu = param$Value[param$Parameter=="prob_icu"][1], - prob_vent = param$Value[param$Parameter=="prob_vent"][1], - - ### INTERVENTIONS - # self isolation - selfis_eff = mean(param$Value[param$Parameter=="selfis_eff"],na.rm=T), - # social distancing - dist_eff = mean(param$Value[param$Parameter=="dist_eff"],na.rm=T), - # hand washing - hand_eff = mean(param$Value[param$Parameter=="hand_eff"],na.rm=T), - # working at home - work_eff = mean(param$Value[param$Parameter=="work_eff"],na.rm=T), - w2h = mean(param$Value[param$Parameter=="w2h"],na.rm=T), - # school closures - school_eff = mean(param$Value[param$Parameter=="school_eff"],na.rm=T), - s2h = mean(param$Value[param$Parameter=="s2h"],na.rm=T), - # cocooning the elderly - cocoon_eff = mean(param$Value[param$Parameter=="cocoon_eff"],na.rm=T), - age_cocoon = mean(param$Value[param$Parameter=="age_cocoon"],na.rm=T), - # vaccination campaign - # vaccine_on = as.numeric(param$Value_Date[param$Parameter=="date_vaccine_on"] - startdate), - vaccine_eff = mean(param$Value[param$Parameter=="vaccine_eff"],na.rm=T), - # vaccine_cov = param$Value[param$Parameter=="vaccine_cov"], - vac_campaign = mean(param$Value[param$Parameter=="vac_campaign"],na.rm=T), - # travel ban - mean_imports = mean(param$Value[param$Parameter=="mean_imports"],na.rm=T), - # screening - screen_test_sens = mean(param$Value[param$Parameter=="screen_test_sens"],na.rm=T), - # screen_contacts = mean(param$Value[param$Parameter=="screen_contacts"],na.rm=T), - screen_overdispersion = mean(param$Value[param$Parameter=="screen_overdispersion"],na.rm=T), - # voluntary home quarantine - quarantine_days = mean(param$Value[param$Parameter=="quarantine_days"],na.rm=T), - quarantine_effort = mean(param$Value[param$Parameter=="quarantine_effort"],na.rm=T), - quarantine_eff_home = mean(param$Value[param$Parameter=="quarantine_eff_home"],na.rm=T), - quarantine_eff_other = mean(param$Value[param$Parameter=="quarantine_eff_other"],na.rm=T), - - household_size = param$Value[param$Parameter=="household_size"][1] -) -ihr[,2]<- parameters["ihr_scaling"]*ihr[,2] - -# Scale parameters to percentages/ rates -parameters["rho"]<-parameters["rho"]/100 -parameters["omega"]<-(1/(parameters["omega"]*365)) -parameters["gamma"]<-1/parameters["gamma"] -parameters["nui"]<-1/parameters["nui"] -parameters["report"]<-parameters["report"]/100 -parameters["reportc"]<-parameters["reportc"]/100 -parameters["reporth"]<-parameters["reporth"]/100 -parameters["nus"]<-1/parameters["nus"] -parameters["rhos"]<-parameters["rhos"]/100 -parameters["amp"]<-parameters["amp"]/100 -parameters["selfis_eff"]<-parameters["selfis_eff"]/100 -parameters["dist_eff"]<-parameters["dist_eff"]/100 -parameters["hand_eff"]<-parameters["hand_eff"]/100 -parameters["work_eff"]<-parameters["work_eff"]/100 -parameters["w2h"]<-parameters["w2h"]/100 -parameters["school_eff"]<-parameters["school_eff"]/100 -parameters["s2h"]<-parameters["s2h"]/100 -parameters["cocoon_eff"]<-parameters["cocoon_eff"]/100 -parameters["age_cocoon"]<-floor((parameters["age_cocoon"]/5)+1) -parameters["vaccine_eff"]<-parameters["vaccine_eff"]/100 -# parameters["vaccine_cov"]<-parameters["vaccine_cov"]/100 -# parameters["vac_campaign"]<-parameters["vac_campaign"]*7 -parameters["screen_test_sens"]<-parameters["screen_test_sens"]/100 -parameters["quarantine_days"]<-parameters["quarantine_days"] -parameters["quarantine_effort"]<-1/parameters["quarantine_effort"] -parameters["quarantine_eff_home"]<-parameters["quarantine_eff_home"]/-100 -parameters["quarantine_eff_other"]<-parameters["quarantine_eff_other"]/100 -parameters["give"]<-parameters["give"]/100 -parameters["pdeath_h"]<-parameters["pdeath_h"]/100 -parameters["pdeath_hc"]<-parameters["pdeath_hc"]/100 -parameters["pdeath_icu"]<-parameters["pdeath_icu"]/100 -parameters["pdeath_icuc"]<-parameters["pdeath_icuc"]/100 -parameters["pdeath_vent"]<-parameters["pdeath_vent"]/100 -parameters["pdeath_ventc"]<-parameters["pdeath_ventc"]/100 -parameters["nusc"]<-1/parameters["nusc"] -parameters["nu_icu"]<-1/parameters["nu_icu"] -parameters["nu_icuc"]<-1/parameters["nu_icuc"] -parameters["nu_vent"]<-1/parameters["nu_vent"] -parameters["nu_ventc"]<-1/parameters["nu_ventc"] -parameters["pclin"]<-parameters["pclin"]/100 -parameters["prob_icu"]<-parameters["prob_icu"]/100 -parameters["prob_vent"]<-parameters["prob_vent"]/100 -parameters2<-parameters - -########################################################################### -# Define the indices for each variable -Sindex<-1:A -Eindex<-(A+1):(2*A) -Iindex<-(2*A+1):(3*A) -Rindex<-(3*A+1):(4*A) -Xindex<-(4*A+1):(5*A) -Hindex<-(5*A+1):(6*A) -HCindex<-(6*A+1):(7*A) -Cindex<-(7*A+1):(8*A) -CMindex<-(8*A+1):(9*A) -Vindex<-(9*A+1):(10*A) -QSindex<-(10*A+1):(11*A) -QEindex<-(11*A+1):(12*A) -QIindex<-(12*A+1):(13*A) -QRindex<-(13*A+1):(14*A) -CLindex<-(14*A+1):(15*A) -QCindex<-(15*A+1):(16*A) -ICUindex<-(16*A+1):(17*A) -ICUCindex<-(17*A+1):(18*A) -ICUCVindex<-(18*A+1):(19*A) -Ventindex<-(19*A+1):(20*A) -VentCindex<-(20*A+1):(21*A) -CMCindex<-(21*A+1):(22*A) - -########################################################################### -# MODEL INITIAL CONDITIONS -initI<-0*popstruc[,2] # Infected and symptomatic -initE<-0*popstruc[,2] # Incubating -initE[aci]<-1 # place random index case in E compartment -initR<-0*popstruc[,2] # Immune -initX<-0*popstruc[,2] # Isolated -initV<-0*popstruc[,2] # Vaccinated -initQS<-0*popstruc[,2] # quarantined S -initQE<-0*popstruc[,2] # quarantined E -initQI<-0*popstruc[,2] # quarantined I -initQR<-0*popstruc[,2] # quarantined R -initH<-0*popstruc[,2] # hospitalised -initHC<-0*popstruc[,2] # hospital critical -initC<-0*popstruc[,2] # Cumulative cases (true) -initCM<-0*popstruc[,2] # Cumulative deaths (true) -initCL<-0*popstruc[,2] # symptomatic cases -initQC<-0*popstruc[,2] # quarantined C -initICU<-0*popstruc[,2] # icu -initICUC<-0*popstruc[,2] # icu critical -initICUCV<-0*popstruc[,2] # icu critical -initVent<-0*popstruc[,2] # icu vent -initVentC<-0*popstruc[,2] # icu vent crit -initCMC<-0*popstruc[,2] # Cumulative deaths (true) -initS<-popstruc[,2]-initE-initI-initR-initX-initV-initH-initHC-initQS-initQE-initQI-initQR-initCL-initQC-initICU-initICUC-initICUCV-initVent-initVentC # Susceptible (non-immune) - - -inp <- read_excel(file_path, sheet = "Interventions") -inputs<-function(inp, run){ - tb<-which(inp$`Apply to`==run) - - si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tb) - scr<-intersect(which(inp$Intervention=="Screening (when S.I.)"),tb) - sd<-intersect(which(inp$Intervention=="Social Distancing"),tb) - hw<-intersect(which(inp$Intervention=="Handwashing"),tb) - wah<-intersect(which(inp$Intervention=="Working at Home"),tb) - sc<-intersect(which(inp$Intervention=="School Closures"),tb) - cte<-intersect(which(inp$Intervention=="Shielding the Elderly"),tb) - q<-intersect(which(inp$Intervention=="Household Isolation (when S.I.)"),tb) - tb<-intersect(which(inp$Intervention=="International Travel Ban"),tb) - vc<-intersect(which(inp$Intervention=="Vaccination"),tb) - - v<-(format(as.POSIXct(inp$`Date Start`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date Start`<-v2 - - v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - ll<-length(v[!is.na(v)]) - for (gg in 1:ll) { - v2[gg]<-min(v2[gg],stopdate) - } - inp$`Date End`<-v2 - - - ## self isolation - f<-c() - si_vector<-c() - isolation<-c() - if (length(si)>=1){ - for (i in 1:length(si)){ - f<-c(f,as.numeric(inp$`Date Start`[si[i]]-startdate),as.numeric(inp$`Date End`[si[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[si[i]]>startdate){ - si_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[si[i]],(f[i+1]-f[i])*20)) - isolation<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - si_vector<-c(rep(inp$`Value`[si[i]],(f[i+1])*20)) - isolation<-c(rep(1,(f[i+1])*20)) - } - } - else{ - si_vector<-c(si_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - si_vector<-c(si_vector,rep(inp$`Value`[si[i]],(f[i*2]-f[i*2-1])*20)) - isolation<-c(isolation,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - isolation<-c(isolation,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(si) && f[i*2]=1){ - for (i in 1:length(sd)){ - - f<-c(f,as.numeric(inp$`Date Start`[sd[i]]-startdate),as.numeric(inp$`Date End`[sd[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sd[i]]>startdate){ - sd_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sd[i]],(f[i+1]-f[i])*20)) - distancing<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sd_vector<-c(rep(inp$`Value`[sd[i]],(f[i+1])*20)) - distancing<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sd_vector<-c(sd_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],(f[i*2]-f[i*2-1])*20)) - distancing<-c(distancing,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - distancing<-c(distancing,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sd)&& f[i*2]=1){ - for (i in 1:length(scr)){ - - f<-c(f,as.numeric(inp$`Date Start`[scr[i]]-startdate),as.numeric(inp$`Date End`[scr[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[scr[i]]>startdate){ - scr_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[scr[i]],(f[i+1]-f[i])*20)) - screen<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - scr_vector<-c(rep(inp$`Value`[scr[i]],(f[i+1])*20)) - screen<-c(rep(1,(f[i+1])*20)) - } - } - else{ - scr_vector<-c(scr_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],(f[i*2]-f[i*2-1])*20)) - screen<-c(screen,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - screen<-c(screen,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(scr)&& f[i*2]=1){ - for (i in 1:length(hw)){ - - f<-c(f,as.numeric(inp$`Date Start`[hw[i]]-startdate),as.numeric(inp$`Date End`[hw[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[hw[i]]>startdate){ - hw_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[hw[i]],(f[i+1]-f[i])*20)) - handwash<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - hw_vector<-c(rep(inp$`Value`[hw[i]],(f[i+1])*20)) - handwash<-c(rep(1,(f[i+1])*20)) - } - } - else{ - hw_vector<-c(hw_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],(f[i*2]-f[i*2-1])*20)) - handwash<-c(handwash,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - handwash<-c(handwash,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(hw)&& f[i*2]=1){ - for (i in 1:length(wah)){ - - f<-c(f,as.numeric(inp$`Date Start`[wah[i]]-startdate),as.numeric(inp$`Date End`[wah[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[wah[i]]>startdate){ - wah_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[wah[i]],(f[i+1]-f[i])*20)) - workhome<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - wah_vector<-c(rep(inp$`Value`[wah[i]],(f[i+1])*20)) - workhome<-c(rep(1,(f[i+1])*20)) - } - } - else{ - wah_vector<-c(wah_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],(f[i*2]-f[i*2-1])*20)) - workhome<-c(workhome,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - workhome<-c(workhome,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(wah)&& f[i*2]=1){ - for (i in 1:length(sc)){ - - f<-c(f,as.numeric(inp$`Date Start`[sc[i]]-startdate),as.numeric(inp$`Date End`[sc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sc[i]]>startdate){ - sc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sc[i]],(f[i+1]-f[i])*20)) - schoolclose<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sc_vector<-c(rep(inp$`Value`[sc[i]],(f[i+1])*20)) - schoolclose<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sc_vector<-c(sc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],(f[i*2]-f[i*2-1])*20)) - schoolclose<-c(schoolclose,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - schoolclose<-c(schoolclose,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sc)&& f[i*2]=1){ - for (i in 1:length(cte)){ - - f<-c(f,as.numeric(inp$`Date Start`[cte[i]]-startdate),as.numeric(inp$`Date End`[cte[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[cte[i]]>startdate){ - cte_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[cte[i]],(f[i+1]-f[i])*20)) - cocoon<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - cte_vector<-c(rep(inp$`Value`[cte[i]],(f[i+1])*20)) - cocoon<-c(rep(1,(f[i+1])*20)) - } - } - else{ - cte_vector<-c(cte_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],(f[i*2]-f[i*2-1])*20)) - cocoon<-c(cocoon,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cocoon<-c(cocoon,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(cte)&& f[i*2]=1){ - for (i in 1:length(q)){ - - f<-c(f,as.numeric(inp$`Date Start`[q[i]]-startdate),as.numeric(inp$`Date End`[q[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[q[i]]>startdate){ - q_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[q[i]],(f[i+1]-f[i])*20)) - quarantine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - q_vector<-c(rep(inp$`Value`[q[i]],(f[i+1])*20)) - quarantine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - q_vector<-c(q_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - q_vector<-c(q_vector,rep(inp$`Value`[q[i]],(f[i*2]-f[i*2-1])*20)) - quarantine<-c(quarantine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - quarantine<-c(quarantine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(q)&& f[i*2]=1){ - for (i in 1:length(tb)){ - - f<-c(f,as.numeric(inp$`Date Start`[tb[i]]-startdate),as.numeric(inp$`Date End`[tb[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[tb[i]]>startdate){ - tb_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[tb[i]],(f[i+1]-f[i])*20)) - travelban<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - tb_vector<-c(rep(inp$`Value`[tb[i]],(f[i+1])*20)) - travelban<-c(rep(1,(f[i+1])*20)) - } - } - else{ - tb_vector<-c(tb_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],(f[i*2]-f[i*2-1])*20)) - travelban<-c(travelban,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - travelban<-c(travelban,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(tb)&& f[i*2]=1){ - for (i in 1:length(vc)){ - - f<-c(f,as.numeric(inp$`Date Start`[vc[i]]-startdate),as.numeric(inp$`Date End`[vc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[vc[i]]>startdate){ - vc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[vc[i]],(f[i+1]-f[i])*20)) - vaccine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - vc_vector<-c(rep(inp$`Value`[vc[i]],(f[i+1])*20)) - vaccine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - vc_vector<-c(vc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],(f[i*2]-f[i*2-1])*20)) - vaccine<-c(vaccine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vaccine<-c(vaccine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(vc)&& f[i*2]= 7) {Rt[i] <- NA} - } - - # Export in a cohesive format ---- - results <- list() - results$time <- startdate + times # dates - results$Rt <- Rt - results$cum_mortality <- round(cmortality1) # cumulative mortality - results$pct_total_pop_infected <- round(100 * tail(cumsum(rowSums(parameters["gamma"]*out[,(Eindex+1)])),1)/sum(popstruc[,2]), 1) # proportion of the population that has been infected at the end of the simulation - results$doubling_time <- round(log(2)*7 / (log(dailyinc1[2+7] / dailyinc1[2])), 2) # (Baseline only) to double the number of infections at inception - results$required_beds <- round(previcureq1) # required beds - results$saturation <- parameters["beds_available"] # saturation - results$daily_incidence <- round(dailyinc1) # daily incidence (Reported) - results$daily_total_cases <- round(rowSums(parameters["gamma"]*out[,(Eindex+1)]+parameters["gamma"]*out[,(QEindex+1)])) # daily incidence (Reported + Unreported) # daily incidence (Reported + Unreported) - results$hospital_surge_beds <- round(previcureq1) - results$icu_beds <- round(previcureq21) - results$ventilators <- round(previcureq31) - - results$death_natural_non_exposed <- round(base_mort_S1) - results$death_natural_exposed <- round(base_mort_E1 + base_mort_I1 + base_mort_CL1 + base_mort_X1 + base_mort_QS1 + - base_mort_QE1 + base_mort_QI1 + base_mort_QC1 + base_mort_QR1 + base_mort_R1+ - base_mort_H1+base_mort_HC1+base_mort_ICU1+base_mort_ICUC1+base_mort_ICUCV1+ - base_mort_Vent1+base_mort_VentC1) - results$death_treated_hospital <- round(cinc_mort_H1) - results$death_treated_icu <- round(cinc_mort_ICU1) - results$death_treated_ventilator <- round(cinc_mort_Vent1) - results$death_untreated_hospital <- round(cinc_mort_HC1) - results$death_untreated_icu <- round(cinc_mort_ICUC1) - results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) - results$total_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + - results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator+results$death_natural_non_exposed+results$death_natural_exposed - results$total_deaths_end <- last(results$total_deaths) - results$total_reported_deaths_end <- last(results$cum_mortality) - results$base_mort_H <- base_mort_H1 - results$base_mort_HC <- base_mort_HC1 - results$base_mort_ICU <- base_mort_ICU1 - results$base_mort_ICUC <- base_mort_ICUC1 - results$base_mort_ICUCV <- base_mort_ICUCV1 - results$base_mort_Vent <- base_mort_Vent1 - results$base_mort_VentC <- base_mort_VentC1 - results$base_mort_S <- base_mort_S1 - results$base_mort_E <- base_mort_E1 - results$base_mort_I <- base_mort_I1 - results$base_mort_CL <- base_mort_CL1 - results$base_mort_X <- base_mort_X1 - results$base_mort_QS <- base_mort_QS1 - results$base_mort_QE <- base_mort_QE1 - results$base_mort_QI <- base_mort_QI1 - results$base_mort_QC <- base_mort_QC1 - results$base_mort_QR <- base_mort_QR1 - results$base_mort_R <- base_mort_R1 - - ## AGE DEPENDENT MORTALITY - cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out[,(Hindex+1)]) - cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out[,(HCindex+1)]) - cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out[,(ICUindex+1)] - cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] - cinc_mort_ICUCV1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(ICUCVindex+1)] - cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] - cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] - totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_ICUCV1+cinc_mort_Vent1+cinc_mort_VentC1) - basemort_H1<-(out[,(Hindex+1)]) - basemort_HC1<-(out[,(HCindex+1)]) - basemort_ICU1<-(out[,(ICUindex+1)]) - basemort_ICUC1<-(out[,(ICUCindex+1)]) - basemort_ICUCV1<-(out[,(ICUCVindex+1)]) - basemort_Vent1<-(out[,(Ventindex+1)]) - basemort_VentC1<-(out[,(VentCindex+1)]) - totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_ICUCV1+basemort_Vent1+basemort_VentC1) - tc<-c() - - for (i in 1:dim(cinc_mort_H1)[1]) { - for (j in 1:dim(cinc_mort_H1)[2]) { - tc<-rbind(tc,c(i, j, totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) - } - } - tc<-as.data.frame(tc) - colnames(tc)<-c("Day","Age","value") - - results$tc <- tc %>% - mutate(Date = startdate + Day, - age_cat = case_when( - Age >= 1 & Age <= 6 ~ "≤ 30 y.o.", - Age > 6 & Age <= 8 ~ "30-40 y.o.", - Age > 8 & Age <= 10 ~ "40-50 y.o.", - Age > 10 & Age <= 12 ~ "50-60 y.o.", - Age > 12 & Age <= 14 ~ "60-70 y.o.", - Age >= 15 ~ "≥ 70 y.o.")) %>% - mutate(age_cat = factor(age_cat, levels = rev(c("≤ 30 y.o.", "30-40 y.o.", - "40-50 y.o.", "50-60 y.o.", "60-70 y.o.", "≥ 70 y.o.")))) - - mortality_lag <- data.frame(Age = popstruc$agefloor) - if(nrow(out) >= 30) mortality_lag <- bind_cols(mortality_lag, - data.frame(day30 = out[30,CMindex+1]/out[30,Cindex+1]) %>% - mutate(day30 = ifelse(is.infinite(day30), 0, day30)) %>% - rename(`Day 30` = day30)) - if(nrow(out) >= 60) mortality_lag <- bind_cols(mortality_lag, - data.frame(day60 = out[60,CMindex+1]/out[60,Cindex+1]) %>% - mutate(day60 = ifelse(is.infinite(day60), 0, day60)) %>% - rename(`Day 60` = day60)) - if(nrow(out) >= 90) mortality_lag <- bind_cols(mortality_lag, - data.frame(day90 = out[90,CMindex+1]/out[90,Cindex+1]) %>% - mutate(day90 = ifelse(is.infinite(day90), 0, day90)) %>% - rename(`Day 90` = day90)) - if(nrow(out) >= 120) mortality_lag <- bind_cols(mortality_lag, - data.frame(day120 = out[120,CMindex+1]/out[120,Cindex+1]) %>% - mutate(day120 = ifelse(is.infinite(day120), 0, day120)) %>% - rename(`Day 120` = day120)) - - results$mortality_lag <- mortality_lag - - return(results) -} - - -# out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) - -# Rcpp::sourceCpp( './comoOdeCpp/src/comoOde.cpp') - -covidOdeCpp_reset() -system.time( -out0 <- ode(y = Y, times = times, func = covidOdeCpp, parms = parameters, - input=vectors0, A=A, - contact_home=contact_home, contact_school=contact_school, - contact_work=contact_work, contact_other=contact_other, - popbirth_col2=popbirth[,2], popstruc_col2=popstruc[,2], - ageing=ageing, - ifr_col2=ifr[,2], ihr_col2=ihr[,2], mort_col=mort) -) - -simul_baseline <- process_ode_outcome(out0) -# write.csv(simul_baseline, paste0(hilo,"_baseline_",gsub(":|-","",Sys.time()),".csv")) - -#future interventions -#extend travel ban, quarantine, hand washing, cocooning the elderly until 1st July -parameters2 <- parameters - -# system.time( -# out <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters2,input=vectors) -# ) - -# Rcpp::sourceCpp( './comoOdeCpp/src/comoOde.cpp') - -covidOdeCpp_reset() -system.time( -out <- ode(y = Y, times = times, func = covidOdeCpp, parms = parameters2, - input=vectors, A=A, - contact_home=contact_home, contact_school=contact_school, - contact_work=contact_work, contact_other=contact_other, - popbirth_col2=popbirth[,2], popstruc_col2=popstruc[,2], - ageing=ageing, - ifr_col2=ifr[,2], ihr_col2=ihr[,2], mort_col=mort) -) - - -simul_interventions <- process_ode_outcome(out) -# write.csv(simul_interventions, paste0(hilo,"_futureIntv_",gsub(":|-","",Sys.time()),".csv")) - -pop1<-out[,(Sindex+1)]+out[,(Eindex+1)]+out[,(Iindex+1)]+out[,(CLindex+1)]+out[,(Rindex+1)]+out[,(Xindex+1)]+out[,(Vindex+1)]+ - out[,(QSindex+1)]+out[,(QEindex+1)]+out[,(QIindex+1)]+out[,(QCindex+1)]+out[,(QRindex+1)]+ - out[,(Hindex+1)]+out[,(HCindex+1)]+out[,(ICUindex+1)]+out[,(ICUCindex+1)]+out[,(ICUCVindex+1)]+out[,(Ventindex+1)]+out[,(VentCindex+1)] -tpop1<-rowSums(pop1) - -############# PLOTTING -# Fitting tab -# fitting the intervention lines to the data to account for any historical interventions -time<-as.Date(out0[,1]+startdate) -par(mfrow=c(1,2)) -# set up the axis limits -xmin<-min(as.Date(cases_rv[,1])) -xmax<-max(as.Date(cases_rv[,1])) -ymax<-max(cases_rv[,2],na.rm = T) -xtick<-seq(xmin, xmax, by=7) -plot(time,simul_interventions$daily_incidence,type='l',lwd=3, - main="New Reported Cases", xlab="Date", ylab="Cases per day", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -axis(side=1, labels = FALSE) -text(x=xtick, y=-250, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - -# reset the maximum to the cumulative mortality -ymax<-max(cases_rv[,3],na.rm = T) -plot(time,simul_interventions$cum_mortality,type='l',lwd=3, - main="Cumulative Mortality", xlab="Date", ylab="Total deaths", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -text(x=xtick, y=-100, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,3],pch=19,col='red') - - -### Predictions tab -par(mfrow=c(1,2)) -### Cases at baseline and intervention -ymax<-max(c(cases_rv[,2],simul_baseline$daily_incidence,simul_interventions$daily_incidence),na.rm=T) -plot(time,simul_baseline$daily_incidence,type='l',lwd=3,col='blue', - main="Baseline", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') -plot(time,simul_interventions$daily_incidence,type='l',lwd=3,col='blue', - main="Intervention", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - - - -# # Hospital prevalences stratified by H,ICU and Vent -ymax<-max(c((simul_baseline$hospital_surge_beds+simul_baseline$icu_beds+simul_baseline$ventilators),(simul_interventions$hospital_surge_beds+simul_interventions$icu_beds+simul_interventions$ventilators))) -time<-as.Date(out[,"time"]+startdate) -coul=c("#047883", "#24A9E2","#051A46") -DM<-as.data.frame(cbind(time,simul_baseline$hospital_surge_beds,simul_baseline$icu_beds,simul_baseline$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time,origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d0<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -DM<-as.data.frame(cbind(time,simul_interventions$hospital_surge_beds,simul_interventions$icu_beds,simul_interventions$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -grid.arrange(d0+ylab("Number of Patients")+ - ggtitle("Baseline")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - d1+ylab("Number of Patients")+ - ggtitle("Intervention")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - nrow = 1) - - -# # Cumulative mortality at baseline and intervention stratified by hospital status -ymax<-max(c((simul_baseline$total_deaths),(simul_interventions$total_deaths))) -time<-as.Date(out[,"time"]+startdate) -coul=c("#047883", "#24A9E2","#051A46","#E68029", "#D63304","#D1D604") -DM0<-as.data.frame(cbind(time,simul_baseline$base_mort_I+simul_baseline$base_mort_QI, - simul_baseline$base_mort_CL+simul_baseline$base_mort_QC, - simul_baseline$base_mort_X, - simul_baseline$base_mort_S+simul_baseline$base_mort_QS, - simul_baseline$base_mort_E+simul_baseline$base_mort_QE, - simul_baseline$base_mort_QR+simul_baseline$base_mort_R, - simul_baseline$death_treated_hospital, - simul_baseline$death_treated_icu, - simul_baseline$death_treated_ventilator, - simul_baseline$death_untreated_hospital, - simul_baseline$death_untreated_icu, - simul_baseline$death_untreated_ventilator)) -colnames(DM0)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM0$Time<-as.Date(DM0$Time, origin = "1970-01-01") -DMF0<-melt(DM0, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m0<-ggplot(DMF0, aes(x = Time, y = value,fill=variable)) + - geom_area() - -DM<-as.data.frame(cbind(time,simul_interventions$base_mort_I+simul_interventions$base_mort_QI,simul_interventions$base_mort_CL+simul_interventions$base_mort_QC,simul_interventions$base_mort_X,simul_interventions$base_mort_S+ - simul_interventions$base_mort_QS,simul_interventions$base_mort_E+simul_interventions$base_mort_QE,simul_interventions$base_mort_QR+simul_interventions$base_mort_R, - simul_interventions$death_treated_hospital,simul_interventions$death_treated_icu,simul_interventions$death_treated_ventilator,simul_interventions$death_untreated_hospital,simul_interventions$death_untreated_icu,simul_interventions$death_untreated_ventilator)) -colnames(DM)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area() -grid.arrange(m0+ylab("Cumulatice mortality")+ - ggtitle("Baseline")+ - ylim(0, ymax), - m1+ylab("Cumulatice mortality")+ - ggtitle("Intervention")+ - ylim(0, ymax), - nrow = 1) - - - -# # Estimated basic reproduction number, R_t -# par(mfrow=c(1,2)) -# ymax<-max(c(simul_baseline$Rt[!is.na(simul_baseline$Rt)],simul_interventions$Rt[!is.na(simul_interventions$Rt)])) -# plot(time,simul_baseline$Rt,type='l',lwd=3,col='black', -# main="Baseline", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -# lines(time,simul_baseline$Rt/simul_baseline$Rt,lwd=2,col='grey') -# plot(time,simul_interventions$Rt,type='l',lwd=3,col='black', -# main="Intervention", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -# lines(time,simul_interventions$Rt/simul_interventions$Rt,lwd=2,col='grey') -# - -## Predicted ifr -# ymax=max(c(simul_baseline$MORT1$value,simul_interventions$MORT1$value)) -# gm<-ggplot(data=simul_interventions$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_interventions$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") -# gm0<-ggplot(data=simul_baseline$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_baseline$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") - -# grid.arrange(gm+theme_classic(), -# gm0+theme_classic(), -# nrow=1) - - -# ## AGE DEPENDENT MORTALITY -# cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out[,(Hindex+1)]) -# cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out[,(HCindex+1)]) -# cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out[,(ICUindex+1)] -# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] -# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] -# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] -# totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_Vent1+cinc_mort_VentC1) -# basemort_H1<-(out[,(Hindex+1)]) -# basemort_HC1<-(out[,(HCindex+1)]) -# basemort_ICU1<-(out[,(ICUindex+1)]) -# basemort_ICUC1<-(out[,(ICUCindex+1)]) -# basemort_Vent1<-(out[,(Ventindex+1)]) -# basemort_VentC1<-(out[,(VentCindex+1)]) -# totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_Vent1+basemort_VentC1) -# tc<-c() -# ages<-seq(0,100,by=5) -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc<-rbind(tc,c(i,ages[j],totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) -# } -# } -# tc<-as.data.frame(tc) -# colnames(tc)<-c("Day","Age","value") -# tc$Age<-as.factor(tc$Age) -# p6<-ggplot(data=tc, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ -# ylab("Proportion of deaths") -# -# inc_mort_H0 <- parameters["nus"]*parameters["pdeath_h"]*(out0[,(Hindex+1)]) -# inc_mort_HC0 <- parameters["nusc"]*parameters["pdeath_hc"]*(out0[,(HCindex+1)]) -# inc_mort_ICU0 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out0[,(ICUindex+1)] -# inc_mort_ICUC0 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out0[,(ICUCindex+1)] -# inc_mort_Vent0 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out0[,(Ventindex+1)] -# inc_mort_VentC0 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out0[,(VentCindex+1)] -# totage0<-as.data.frame(inc_mort_H0+inc_mort_HC0+inc_mort_ICU0+inc_mort_ICUC0+inc_mort_Vent0+inc_mort_VentC0) -# basemort_H0<-(out0[,(Hindex+1)]) -# basemort_HC0<-(out0[,(HCindex+1)]) -# basemort_ICU0<-(out0[,(ICUindex+1)]) -# basemort_ICUC0<-(out0[,(ICUCindex+1)]) -# basemort_Vent0<-(out0[,(Ventindex+1)]) -# basemort_VentC0<-(out0[,(VentCindex+1)]) -# totbase0<-as.data.frame(basemort_H0+basemort_HC0+basemort_ICU0+basemort_ICUC0+basemort_Vent0+basemort_VentC0) -# tc0<-c() -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc0<-rbind(tc0,c(i,ages[j],totage0[i,j]*ifr[j,2]+totbase0[i,j]*mort[j])) -# } -# } -# tc0<-as.data.frame(tc0) -# colnames(tc0)<-c("Day","Age","value") -# tc0$Age<-as.factor(tc0$Age) -# p16<-ggplot(data=tc0, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ylab("Proportion of deaths") - -# grid.arrange(p16+theme_minimal(), -# p6+theme_minimal(), -# nrow=1) -# - - -# -# -# -# ######################################################################################################################### -# ##### SUMMARY METRICS ################################################################################################ -# ####################################################################################################################### -# -# infected0<-tail((rowSums(out0[,(Rindex+1)])),1)/sum(popstruc[,2]) -# infected0 -# infected1<-tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) -# infected1 -# -# # #Population size checks -# # tpop1 -# # tpop0 -# -# # PCR -# time_of_measurement<-40:49 -# # general population -# (rowSums(out[time_of_measurement,Iindex+1])+rowSums(out[time_of_measurement,CLindex+1])+rowSums(out[time_of_measurement,QIindex+1])+ -# rowSums(out[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# # every infection including hospital infections -# (rowSums(out[time_of_measurement,Iindex+1])+rowSums(out[time_of_measurement,CLindex+1])+rowSums(out[time_of_measurement,Hindex+1])+ -# rowSums(out[time_of_measurement,ICUindex+1])+rowSums(out[time_of_measurement,Ventindex+1])+rowSums(out[time_of_measurement,HCindex+1])+ -# rowSums(out[time_of_measurement,ICUCindex+1])+rowSums(out[time_of_measurement,VentCindex+1])+rowSums(out[time_of_measurement,QIindex+1])+ -# rowSums(out[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# -# # SEROLOGY -# tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) -# -# # IHR -# sum(ihr$severe*popstruc[,2]/sum(popstruc[,2])) -# -# -# # PORPORTIONAL MORTALITY IN THE ELDEST -# m30<-out0[30,CMindex+1]/(out0[30,Cindex+1]) -# m30[is.infinite(m30)]<-0 -# m60<-out0[60,CMindex+1]/out0[60,Cindex+1] -# m60[is.infinite(m60)]<-0 -# m90<-out0[90,CMindex+1]/out0[90,Cindex+1] -# m90[is.infinite(m90)]<-0 -# m120<-out0[120,CMindex+1]/out0[120,Cindex+1] -# m120[is.infinite(m120)]<-0 -# -# ifr30<-sum(m30*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr60<-sum(m60*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr90<-sum(m90*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr120<-sum(m120*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# cbind(ifr30,ifr60,ifr90,ifr120)*100 -# -# PMORTDF0<-as.data.frame(cbind(out0[30,CMindex+1]/sum(out0[30,CMindex+1]),out0[60,CMindex+1]/sum(out0[60,CMindex+1]), -# out0[90,CMindex+1]/sum(out0[90,CMindex+1]),out0[120,CMindex+1]/sum(out0[120,CMindex+1]))) -# PMORTDF<-as.data.frame(cbind(out[30,CMindex+1]/sum(out[30,CMindex+1]),out[60,CMindex+1]/sum(out[60,CMindex+1]), -# out[90,CMindex+1]/sum(out[90,CMindex+1]),out[120,CMindex+1]/sum(out[120,CMindex+1]))) -# sum(PMORTDF0$V2[15:21]) -# sum(PMORTDF$V2[15:21]) -# -# -# # output doubling time over time first 7 days -# dd<-7 -# doub0<-log(2)*dd/(log(dailyinc0[2+dd]/dailyinc0[2])) -# doub0 - -# -# diff --git a/r_versions/covidage_v13.8_->_v13.13.diff b/r_versions/covidage_v13.8_->_v13.13.diff deleted file mode 100644 index 1b50a0d..0000000 --- a/r_versions/covidage_v13.8_->_v13.13.diff +++ /dev/null @@ -1,330 +0,0 @@ ---- /home/bogao/Projects/como/comoOdeCpp/r_versions/covidage_v13.8_original.R Mon Jun 8 19:51:36 2020 -+++ /home/bogao/Projects/como/comoOdeCpp/r_versions/covidage_v13.13_original.R Mon Jun 8 19:34:10 2020 -@@ -21,6 +21,7 @@ - library(shinyWidgets) - library(tidyverse) - library(XLConnect) -+# library("comoOdeCpp") - - #read data from excel file - setwd("C:/covid19/covid_age") -@@ -328,6 +329,9 @@ - - inp <- read_excel(file_path, sheet = "Interventions") - inputs<-function(inp, run){ -+ # cap intervention end dates with simulation end date -+ inp$`Date End` = pmin(stopdate, inp$`Date End`) -+ - tb<-which(inp$`Apply to`==run) - - si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tb) -@@ -347,12 +351,7 @@ - - v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") -- ll<-length(v[!is.na(v)]) -- for (gg in 1:ll) { -- v2[gg]<-min(v2[gg],stopdate) -- } - inp$`Date End`<-v2 -- - - ## self isolation - f<-c() -@@ -702,6 +701,16 @@ - vectors<-inputs(inp,'Hypothetical Scenario') - vectors0<-inputs(inp,'Baseline (Calibration)') - -+f <- c(1,(1+parameters["give"])/2,(1-parameters["give"])/2,0) -+KH<-parameters["beds_available"] -+KICU<- parameters["icu_beds_available"]+parameters["ventilators_available"] -+Kvent<- parameters["ventilators_available"] -+x.H <- c(0,(1+parameters["give"])*KH/2,(3-parameters["give"])*KH/2,2*KH) -+x.ICU <- c(0,(1+parameters["give"])*KICU/2,(3-parameters["give"])*KICU/2,2*KICU) -+x.Vent <- c(0,(1+parameters["give"])*Kvent/2,(3-parameters["give"])*Kvent/2,2*Kvent) -+fH <- splinefun(x.H, f, method = "hyman") -+fICU <- splinefun(x.ICU, f, method = "hyman") -+fVent<- splinefun(x.Vent, f, method = "hyman") - - # set up a function to solve the equations - covid<-function(t, Y, parameters,input) -@@ -731,18 +740,10 @@ - VentC <- Y[VentCindex] - CMC <- Y[CMCindex] - P <- (S+E+I+R+X+V+H+HC+QS+QE+QI+QR+CL+QC+ICU+ICUC+ICUCV+Vent+VentC) -+ Q <- (sum(QS)+sum(QE)+sum(QI)+sum(QC)+sum(QR))/sum(P) -+ print(Q) - - # health system performance -- f <- c(1,(1+give)/2,(1-give)/2,0) -- KH<-beds_available -- KICU<- icu_beds_available+ventilators_available -- Kvent<- ventilators_available -- x.H <- c(0,(1+give)*KH/2,(3-give)*KH/2,2*KH) -- x.ICU <- c(0,(1+give)*KICU/2,(3-give)*KICU/2,2*KICU) -- x.Vent <- c(0,(1+give)*Kvent/2,(3-give)*Kvent/2,2*Kvent) -- fH <- splinefun(x.H, f, method = "hyman") -- fICU <- splinefun(x.ICU, f, method = "hyman") -- fVent<- splinefun(x.Vent, f, method = "hyman") - critH<-min(1-fH(sum(H)+sum(ICUC)+sum(ICUCV)),1) - crit<-min(1-fICU(sum(ICU)+sum(Vent)+sum(VentC)),1) - critV<-min(1-fVent(sum(Vent)),1) -@@ -808,7 +809,11 @@ - trvban_eff<-travelban_eff - } - if(quarantine){ -- quarantine_rate<-min(sum((I+CL+H+ICU+Vent+HC+ICUC+ICUCV+VentC)*(household_size-1)/P),1)*quarantine_cov*quarantine_effort -+ rate_q<-min((min(sum((I+CL+H+ICU+Vent+HC+ICUC+ICUCV+VentC))*(household_size-1)/sum(P),1)*quarantine_effort),quarantine_cov/2) -+ quarantine_rate<-rate_q/(1+exp(-10*(quarantine_cov/2-Q))) -+ # print(paste('Q',Q)) -+ # print(paste('rate',quarantine_rate)) -+ # print(paste('rate_q',rate_q)) - } - - -@@ -847,7 +852,7 @@ - dSdt <- -S*lam-S*vaccinate+omega*R+ageing%*%S-mort*S+birth-quarantine_rate*S +(1/quarantine_days)*QS - dEdt <- S*lam-gamma*E+ageing%*%E-mort*E + (1-vaccine_eff)*lam*V-quarantine_rate*E+(1/quarantine_days)*QE - dIdt <- gamma*(1-pclin)*(1-screen_eff)*(1-ihr[,2])*E-nui*I+ageing%*%I-mort*I + (1/quarantine_days)*QI - quarantine_rate*I -- dCLdt<- gamma*pclin*(1-selfis)*(1-ihr[,2])*E-nui*CL+ageing%*%CL-mort*CL + (1/quarantine_days)*QC -+ dCLdt<- gamma*pclin*(1-selfis)*(1-ihr[,2])*(1-quarantine_rate)*E-nui*CL+ageing%*%CL-mort*CL + (1/quarantine_days)*QC - dRdt <- nui*I-omega*R+nui*X+nui*CL+ageing%*%R-mort*R + (1/quarantine_days)*QR + nus*(1-pdeath_h*ifr[,2])*H + (1-pdeath_icu*ifr[,2])*nu_icu*ICU + (1-pdeath_icuc*ifr[,2])*nu_icuc*ICUC + (1-pdeath_ventc*ifr[,2])*nu_ventc*ICUCV + (1-pdeath_hc*ifr[,2])*nusc*HC + (1-pdeath_vent*ifr[,2])*nu_vent*Vent+ (1-pdeath_ventc*ifr[,2])*nu_ventc*VentC - dXdt <- gamma*selfis*pclin*(1-ihr[,2])*E+gamma*(1-pclin)*screen_eff*(1-ihr[,2])*E-nui*X+ageing%*%X-mort*X - dVdt <- vaccinate*S -(1-vaccine_eff)*lam*V +ageing%*%V - mort*V -@@ -855,7 +860,7 @@ - dQSdt <- quarantine_rate*S+ ageing%*%QS-mort*QS - (1/quarantine_days)*QS - lamq*QS - dQEdt <- quarantine_rate*E - gamma*QE + ageing%*%QE-mort*QE - (1/quarantine_days)*QE + lamq*QS - dQIdt <- quarantine_rate*I + gamma*(1-ihr[,2])*(1-pclin)*QE-nui*QI+ageing%*%QI-mort*QI - (1/quarantine_days)*QI -- dQCdt <- gamma*(1-ihr[,2])*pclin*QE-nui*QC+ageing%*%QC-mort*QC - (1/quarantine_days)*QC -+ dQCdt <- gamma*pclin*(1-selfis)*(1-ihr[,2])*quarantine_rate*E+gamma*(1-ihr[,2])*pclin*QE-nui*QC+ageing%*%QC-mort*QC - (1/quarantine_days)*QC - dQRdt <- nui*QI+nui*QC+ageing%*%QR-mort*QR - (1/quarantine_days)*QR - - dHdt <- gamma*ihr[,2]*(1-prob_icu)*(1-critH)*reporth*E + gamma*ihr[,2]*(1-prob_icu)*(1-critH)*QE - nus*H + ageing%*%H-mort*H -@@ -873,8 +878,8 @@ - gamma*ihr[,2]*prob_icu*(E+QE) - dCMdt<- nus*pdeath_h*ifr[,2]*H + nusc*pdeath_hc*ifr[,2]*HC + nu_icu*pdeath_icu*ifr[,2]*ICU +nu_icuc*pdeath_icuc*ifr[,2]*ICUC +nu_vent*pdeath_vent*ifr[,2]*Vent +nu_ventc*pdeath_ventc*ifr[,2]*VentC +nu_ventc*pdeath_ventc*ifr[,2]*ICUCV+ - mort*H + mort*HC + mort*ICU + mort*ICUC + mort*ICUCV + mort*Vent + mort*VentC -- dCMCdt <- nusc*pdeath_hc*ifr[,2]*HC+nu_icuc*pdeath_icuc*ifr[,2]*ICUC + nu_ventc*pdeath_ventc*ifr[,2]*VentC + nu_ventc*pdeath_ventc*ifr[,2]*ICUCV -- mort*HC + mort*ICUC + mort*VentC + mort*ICUCV -+ dCMCdt <- nusc*pdeath_hc*ifr[,2]*HC+nu_icuc*pdeath_icuc*ifr[,2]*ICUC + nu_ventc*pdeath_ventc*ifr[,2]*VentC + nu_ventc*pdeath_ventc*ifr[,2]*ICUCV+ -+ mort*HC + mort*ICUC + mort*VentC + mort*ICUCV - - # return the rate of change - list(c(dSdt,dEdt,dIdt,dRdt,dXdt,dHdt,dHCdt,dCdt,dCMdt,dVdt,dQSdt,dQEdt,dQIdt,dQRdt,dCLdt,dQCdt,dICUdt,dICUCdt,dICUCVdt,dVentdt,dVentCdt,dCMCdt)) -@@ -892,16 +897,6 @@ - crit<-c() - critV<-c() - -- f <- c(1,(1+parameters["give"])/2,(1-parameters["give"])/2,0) -- KH<-parameters["beds_available"] -- KICU<- parameters["icu_beds_available"]+parameters["ventilators_available"] -- Kvent<- parameters["ventilators_available"] -- x.H <- c(0,(1+parameters["give"])*KH/2,(3-parameters["give"])*KH/2,2*KH) -- x.ICU <- c(0,(1+parameters["give"])*KICU/2,(3-parameters["give"])*KICU/2,2*KICU) -- x.Vent <- c(0,(1+parameters["give"])*Kvent/2,(3-parameters["give"])*Kvent/2,2*Kvent) -- fH <- splinefun(x.H, f, method = "hyman") -- fICU <- splinefun(x.ICU, f, method = "hyman") -- fVent<- splinefun(x.Vent, f, method = "hyman") - for (i in 1:length(times)){ - critH[i]<-min(1-fH((sum(out[i,(Hindex+1)]))+sum(out[i,(ICUCindex+1)])+sum(out[i,(ICUCVindex+1)])),1) - crit[i]<-min(1-fICU((sum(out[i,(ICUindex+1)]))+(sum(out[i,(Ventindex+1)]))+(sum(out[i,(VentCindex+1)])))) -@@ -1006,6 +1001,9 @@ - results$hospital_surge_beds <- round(previcureq1) - results$icu_beds <- round(previcureq21) - results$ventilators <- round(previcureq31) -+ results$normal_bed_requirement <- round(reqsurge1) #real required beds. previcureq1 above is the occupancy -+ results$icu_bed_requirement <- round(reqicu1) -+ results$icu_ventilator_requirement <- round(reqvent1) - - results$death_natural_non_exposed <- round(base_mort_S1) - results$death_natural_exposed <- round(base_mort_E1 + base_mort_I1 + base_mort_CL1 + base_mort_X1 + base_mort_QS1 + -@@ -1018,8 +1016,10 @@ - results$death_untreated_hospital <- round(cinc_mort_HC1) - results$death_untreated_icu <- round(cinc_mort_ICUC1) - results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) -- results$total_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + -- results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator+results$death_natural_non_exposed+results$death_natural_exposed -+ results$attributable_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + -+ results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator -+ results$attributable_deaths_end <- last(results$attributable_deaths) -+ results$total_deaths <- results$attributable_deaths + results$death_natural_non_exposed + results$death_natural_exposed - results$total_deaths_end <- last(results$total_deaths) - results$total_reported_deaths_end <- last(results$cum_mortality) - results$base_mort_H <- base_mort_H1 -@@ -1103,10 +1103,18 @@ - return(results) - } - -+# covidOdeCpp_reset() -+# out <- ode(y = Y, times = times, func = covidOdeCpp, parms = parameters2, -+# input=vectors, A=A, -+# contact_home=contact_home, contact_school=contact_school, -+# contact_work=contact_work, contact_other=contact_other, -+# popbirth_col2=popbirth[,2], popstruc_col2=popstruc[,2], -+# ageing=ageing, -+# ifr_col2=ifr[,2], ihr_col2=ihr[,2], mort_col=mort) - - out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) - simul_baseline <- process_ode_outcome(out0) --# write.csv(simul_baseline, paste0(hilo,"_baseline_",gsub(":|-","",Sys.time()),".csv")) -+# # write.csv(simul_baseline, paste0(hilo,"_baseline_",gsub(":|-","",Sys.time()),".csv")) - - #future interventions - #extend travel ban, quarantine, hand washing, cocooning the elderly until 1st July -@@ -1117,7 +1125,7 @@ - - pop1<-out[,(Sindex+1)]+out[,(Eindex+1)]+out[,(Iindex+1)]+out[,(CLindex+1)]+out[,(Rindex+1)]+out[,(Xindex+1)]+out[,(Vindex+1)]+ - out[,(QSindex+1)]+out[,(QEindex+1)]+out[,(QIindex+1)]+out[,(QCindex+1)]+out[,(QRindex+1)]+ -- out[,(Hindex+1)]+out[,(HCindex+1)]+out[,(ICUindex+1)]+out[,(ICUCindex+1)]+out[,(ICUCVindex+1)]+out[,(Ventindex+1)]+out[,(VentCindex+1)] -+ out[,(Hindex+1)]+out[,(HCindex+1)]+out[,(ICUindex+1)]+out[,(ICUCindex+1)]+out[,(ICUCVindex+1)]+out[,(Ventindex+1)]+out[,(VentCindex+1)] - tpop1<-rowSums(pop1) - - ############# PLOTTING -@@ -1137,7 +1145,7 @@ - text(x=xtick, y=-250, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) - points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - --# reset the maximum to the cumulative mortality -+# reset the maximum to the cumulative mortality - ymax<-max(cases_rv[,3],na.rm = T) - plot(time,simul_interventions$cum_mortality,type='l',lwd=3, - main="Cumulative Mortality", xlab="Date", ylab="Total deaths", -@@ -1201,7 +1209,7 @@ - time<-as.Date(out[,"time"]+startdate) - coul=c("#047883", "#24A9E2","#051A46","#E68029", "#D63304","#D1D604") - DM0<-as.data.frame(cbind(time,simul_baseline$base_mort_I+simul_baseline$base_mort_QI, -- simul_baseline$base_mort_CL+simul_baseline$base_mort_QC, -+ simul_baseline$base_mort_CL+simul_baseline$base_mort_QC, - simul_baseline$base_mort_X, - simul_baseline$base_mort_S+simul_baseline$base_mort_QS, - simul_baseline$base_mort_E+simul_baseline$base_mort_QE, -@@ -1249,7 +1257,7 @@ - # plot(time,simul_interventions$Rt,type='l',lwd=3,col='black', - # main="Intervention", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) - # lines(time,simul_interventions$Rt/simul_interventions$Rt,lwd=2,col='grey') --# -+# - - ## Predicted ifr - # ymax=max(c(simul_baseline$MORT1$value,simul_interventions$MORT1$value)) -@@ -1267,9 +1275,9 @@ - # cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out[,(Hindex+1)]) - # cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out[,(HCindex+1)]) - # cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out[,(ICUindex+1)] --# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] --# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] --# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] -+# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] -+# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] -+# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] - # totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_Vent1+cinc_mort_VentC1) - # basemort_H1<-(out[,(Hindex+1)]) - # basemort_HC1<-(out[,(HCindex+1)]) -@@ -1282,16 +1290,16 @@ - # ages<-seq(0,100,by=5) - # for (i in 1:dim(cinc_mort_H1)[1]) { - # for (j in 1:dim(cinc_mort_H1)[2]) { --# tc<-rbind(tc,c(i,ages[j],totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) -+# tc<-rbind(tc,c(i,ages[j],totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) - # } - # } - # tc<-as.data.frame(tc) - # colnames(tc)<-c("Day","Age","value") - # tc$Age<-as.factor(tc$Age) --# p6<-ggplot(data=tc, aes(x=Day,y=value,fill=Age))+ -+# p6<-ggplot(data=tc, aes(x=Day,y=value,fill=Age))+ - # geom_bar(stat = "identity",position="fill", width=1)+ - # ylab("Proportion of deaths") --# -+# - # inc_mort_H0 <- parameters["nus"]*parameters["pdeath_h"]*(out0[,(Hindex+1)]) - # inc_mort_HC0 <- parameters["nusc"]*parameters["pdeath_hc"]*(out0[,(HCindex+1)]) - # inc_mort_ICU0 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out0[,(ICUindex+1)] -@@ -1321,25 +1329,25 @@ - # grid.arrange(p16+theme_minimal(), - # p6+theme_minimal(), - # nrow=1) --# -- -- --# --# --# -+# -+ -+ -+# -+# -+# - # ######################################################################################################################### - # ##### SUMMARY METRICS ################################################################################################ - # ####################################################################################################################### --# -+# - # infected0<-tail((rowSums(out0[,(Rindex+1)])),1)/sum(popstruc[,2]) - # infected0 - # infected1<-tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) - # infected1 --# -+# - # # #Population size checks - # # tpop1 - # # tpop0 --# -+# - # # PCR - # time_of_measurement<-40:49 - # # general population -@@ -1350,14 +1358,14 @@ - # rowSums(out[time_of_measurement,ICUindex+1])+rowSums(out[time_of_measurement,Ventindex+1])+rowSums(out[time_of_measurement,HCindex+1])+ - # rowSums(out[time_of_measurement,ICUCindex+1])+rowSums(out[time_of_measurement,VentCindex+1])+rowSums(out[time_of_measurement,QIindex+1])+ - # rowSums(out[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) --# -+# - # # SEROLOGY - # tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) --# -+# - # # IHR - # sum(ihr$severe*popstruc[,2]/sum(popstruc[,2])) --# --# -+# -+# - # # PORPORTIONAL MORTALITY IN THE ELDEST - # m30<-out0[30,CMindex+1]/(out0[30,Cindex+1]) - # m30[is.infinite(m30)]<-0 -@@ -1367,25 +1375,27 @@ - # m90[is.infinite(m90)]<-0 - # m120<-out0[120,CMindex+1]/out0[120,Cindex+1] - # m120[is.infinite(m120)]<-0 --# -+# - # ifr30<-sum(m30*popstruc[,2]/sum(popstruc[,2]),na.rm = T) - # ifr60<-sum(m60*popstruc[,2]/sum(popstruc[,2]),na.rm = T) - # ifr90<-sum(m90*popstruc[,2]/sum(popstruc[,2]),na.rm = T) - # ifr120<-sum(m120*popstruc[,2]/sum(popstruc[,2]),na.rm = T) - # cbind(ifr30,ifr60,ifr90,ifr120)*100 --# -+# - # PMORTDF0<-as.data.frame(cbind(out0[30,CMindex+1]/sum(out0[30,CMindex+1]),out0[60,CMindex+1]/sum(out0[60,CMindex+1]), - # out0[90,CMindex+1]/sum(out0[90,CMindex+1]),out0[120,CMindex+1]/sum(out0[120,CMindex+1]))) - # PMORTDF<-as.data.frame(cbind(out[30,CMindex+1]/sum(out[30,CMindex+1]),out[60,CMindex+1]/sum(out[60,CMindex+1]), - # out[90,CMindex+1]/sum(out[90,CMindex+1]),out[120,CMindex+1]/sum(out[120,CMindex+1]))) - # sum(PMORTDF0$V2[15:21]) - # sum(PMORTDF$V2[15:21]) --# --# -+# -+# - # # output doubling time over time first 7 days - # dd<-7 - # doub0<-log(2)*dd/(log(dailyinc0[2+dd]/dailyinc0[2])) - # doub0 - --# --# -+# -+# -+ -+ diff --git a/r_versions/covidage_v13.8_original.R b/r_versions/covidage_v13.8_original.R deleted file mode 100644 index 04a72a0..0000000 --- a/r_versions/covidage_v13.8_original.R +++ /dev/null @@ -1,1391 +0,0 @@ -require("deSolve") -library("ggplot2") -library("dplyr") -library("reshape2") -require(gridExtra) -library(ggpubr) -library(bsplus) -library(deSolve) -library(DT) -library(highcharter) -library(lubridate) -library(pushbar) -library(readxl) -library(reshape2) -library(scales) -library(shiny) -library(shinyBS) -library(shinycssloaders) -library(shinyhelper) -library(shinythemes) -library(shinyWidgets) -library(tidyverse) -library(XLConnect) - -#read data from excel file -setwd("C:/covid19/covid_age") -load("data_CoMo.RData") -file_path <- paste0(getwd(),"/Template_CoMoCOVID-19App_new.xlsx") -country_name<-"Cambodia" - -# Cases -dta <- read_excel(file_path, sheet = "Cases") -names(dta) <- c("date", "cases", "deaths") - -cases_rv <- dta %>% - mutate(date = as.Date(date), cumulative_death = cumsum(deaths)) %>% - as.data.frame() - -# Severity/Mortality -dta <- read_excel(file_path, sheet = "Severity-Mortality") -names(dta) <- c("age_category", "ifr", "ihr") - -mort_sever_rv <- dta %>% - mutate(ihr = ihr/100) %>% # starting unit should be % - scaling to a value between 0 and 1 - mutate(ifr = ifr/max(ifr)) # starting unit should be % - scaling to a value between 0 and 1 - -# Population -dta <- read_excel(file_path, sheet = "Population") -names(dta) <- c("age_category", "pop", "birth", "death") - -population_rv <- dta %>% - transmute(country = NA, age_category, pop, birth, death) - -# Parameters -param <- bind_rows(read_excel(file_path, sheet = "Parameters"), - read_excel(file_path, sheet = "Country Area Param"), - read_excel(file_path, sheet = "Virus Param"), - read_excel(file_path, sheet = "Hospitalisation Param"), - read_excel(file_path, sheet = "Interventions Param"), - read_excel(file_path, sheet = "Interventions")) %>% - mutate(Value_Date = as.Date(Value_Date)) - -# START Bridge ---- -popstruc <- population_rv %>% - select(age_category, pop) %>% - rename(agefloor = age_category) %>% - as.data.frame() - -popbirth <- population_rv %>% - select(age_category, birth) %>% - as.data.frame() # unit should be per person per day - -mort <- population_rv %>% - pull(death) # unit should be per person per day - -ihr <- mort_sever_rv %>% - select(age_category, ihr) %>% - as.data.frame() - -ifr <- mort_sever_rv %>% - select(age_category, ifr) %>% - as.data.frame() - - -######### POP AGEING -# per year ageing matrix -A<-length(popstruc[,2]) -dd<-seq(1:A)/seq(1:A) -ageing <- t(diff(diag(dd),lag=1)/(5*365.25)) -ageing<-cbind(ageing,0*seq(1:A)) # no ageing from last compartment - -# -pop<-population$country==country_name -pp<-population$pop[pop] -### CONTACT MATRICES -c_home <- contact_home[[country_name]] %>% as.matrix() -c_school <- contact_school[[country_name]] %>% as.matrix() -c_work <- contact_work[[country_name]] %>% as.matrix() -c_other <- contact_other[[country_name]] %>% as.matrix() -nce <-A-length(c_home[1,]) - -contact_home<-matrix(0,nrow=A,ncol=A) -contact_school<-matrix(0,nrow=A,ncol=A) -contact_work<-matrix(0,nrow=A,ncol=A) -contact_other<-matrix(0,nrow=A,ncol=A) - -for (i in 1:(A-nce)){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[i,j] - contact_school[i,j]<-c_school[i,j] - contact_work[i,j]<-c_work[i,j] - contact_other[i,j]<-c_other[i,j] - } -} - -for (i in (A+1-nce):A){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[(A-nce),j] - contact_school[i,j]<-c_school[(A-nce),j] - contact_work[i,j]<-c_work[(A-nce),j] - contact_other[i,j]<-c_other[(A-nce),j] - } -} -for (i in 1:(A-nce)){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[i,(A-nce)] - contact_school[i,j]<-c_school[i,(A-nce)] - contact_work[i,j]<-c_work[i,(A-nce)] - contact_other[i,j]<-c_other[i,(A-nce)] - } -} -for (i in (A+1-nce):A){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[(A-nce),(A-nce)] - contact_school[i,j]<-c_school[(A-nce),(A-nce)] - contact_work[i,j]<-c_work[(A-nce),(A-nce)] - contact_other[i,j]<-c_other[(A-nce),(A-nce)] - } -} - - - -######### INITIALISE SIMULATION/INTERVENTION START TIMES -startdate <- param$Value_Date[param$Parameter == "date_range_simul_start"] -stopdate <- param$Value_Date[param$Parameter == "date_range_simul_end"] -startdate <- startdate[1] -stopdate <- stopdate[1] - - -day_start <- as.numeric(startdate-startdate) -day_stop <- as.numeric(stopdate-startdate) -times <- seq(day_start, day_stop) - -tin<-as.numeric(startdate-as.Date("2020-01-01"))/365.25 -initP<-sum(popstruc[,2]) # population size -ageindcase<-20 # age of index case (years) -aci <- floor((ageindcase/5)+1) # age class of index case - - -############# DEFINE PARAMETERS -parameters <- c( - ### Transmission instrinsic - p = param$Value[param$Parameter=="p"][1], - rho = param$Value[param$Parameter=="rho"][1], - omega = param$Value[param$Parameter=="omega"][1], - gamma = param$Value[param$Parameter=="gamma"][1], - nui = param$Value[param$Parameter=="nui"][1], - report = param$Value[param$Parameter=="report"][1], - reportc = param$Value[param$Parameter=="reportc"][1], - reporth = param$Value[param$Parameter=="reporth"][1], - beds_available = param$Value[param$Parameter=="beds_available"][1], - icu_beds_available = param$Value[param$Parameter=="icu_beds_available"][1], - ventilators_available = param$Value[param$Parameter=="ventilators_available"][1], - give = 95, - pdeath_h = param$Value[param$Parameter=="pdeath_h"][1], - pdeath_hc = param$Value[param$Parameter=="pdeath_hc"][1], - pdeath_icu = param$Value[param$Parameter=="pdeath_icu"][1], - pdeath_icuc = param$Value[param$Parameter=="pdeath_icuc"][1], - pdeath_vent = param$Value[param$Parameter=="pdeath_vent"][1], - pdeath_ventc = param$Value[param$Parameter=="pdeath_ventc"][1], - ihr_scaling = param$Value[param$Parameter=="ihr_scaling"][1], - nus = param$Value[param$Parameter=="nus"][1], - nusc = param$Value[param$Parameter=="nus"][1], # nusc = nus - nu_icu = param$Value[param$Parameter=="nu_icu"][1], - nu_icuc = param$Value[param$Parameter=="nu_icu"][1], # nu_icuc = nu_icu - nu_vent = param$Value[param$Parameter=="nu_vent"][1], - nu_ventc = param$Value[param$Parameter=="nu_vent"][1], # nu_ventc = nu_vent - rhos = param$Value[param$Parameter=="rhos"][1], - amp = param$Value[param$Parameter=="amp"][1], - phi = param$Value[param$Parameter=="phi"][1], - pclin = param$Value[param$Parameter=="pclin"][1], - prob_icu = param$Value[param$Parameter=="prob_icu"][1], - prob_vent = param$Value[param$Parameter=="prob_vent"][1], - - ### INTERVENTIONS - # self isolation - selfis_eff = mean(param$Value[param$Parameter=="selfis_eff"],na.rm=T), - # social distancing - dist_eff = mean(param$Value[param$Parameter=="dist_eff"],na.rm=T), - # hand washing - hand_eff = mean(param$Value[param$Parameter=="hand_eff"],na.rm=T), - # working at home - work_eff = mean(param$Value[param$Parameter=="work_eff"],na.rm=T), - w2h = mean(param$Value[param$Parameter=="w2h"],na.rm=T), - # school closures - school_eff = mean(param$Value[param$Parameter=="school_eff"],na.rm=T), - s2h = mean(param$Value[param$Parameter=="s2h"],na.rm=T), - # cocooning the elderly - cocoon_eff = mean(param$Value[param$Parameter=="cocoon_eff"],na.rm=T), - age_cocoon = mean(param$Value[param$Parameter=="age_cocoon"],na.rm=T), - # vaccination campaign - # vaccine_on = as.numeric(param$Value_Date[param$Parameter=="date_vaccine_on"] - startdate), - vaccine_eff = mean(param$Value[param$Parameter=="vaccine_eff"],na.rm=T), - # vaccine_cov = param$Value[param$Parameter=="vaccine_cov"], - vac_campaign = mean(param$Value[param$Parameter=="vac_campaign"],na.rm=T), - # travel ban - mean_imports = mean(param$Value[param$Parameter=="mean_imports"],na.rm=T), - # screening - screen_test_sens = mean(param$Value[param$Parameter=="screen_test_sens"],na.rm=T), - # screen_contacts = mean(param$Value[param$Parameter=="screen_contacts"],na.rm=T), - screen_overdispersion = mean(param$Value[param$Parameter=="screen_overdispersion"],na.rm=T), - # voluntary home quarantine - quarantine_days = mean(param$Value[param$Parameter=="quarantine_days"],na.rm=T), - quarantine_effort = mean(param$Value[param$Parameter=="quarantine_effort"],na.rm=T), - quarantine_eff_home = mean(param$Value[param$Parameter=="quarantine_eff_home"],na.rm=T), - quarantine_eff_other = mean(param$Value[param$Parameter=="quarantine_eff_other"],na.rm=T), - - household_size = param$Value[param$Parameter=="household_size"][1] -) -ihr[,2]<- parameters["ihr_scaling"]*ihr[,2] - -# Scale parameters to percentages/ rates -parameters["rho"]<-parameters["rho"]/100 -parameters["omega"]<-(1/(parameters["omega"]*365)) -parameters["gamma"]<-1/parameters["gamma"] -parameters["nui"]<-1/parameters["nui"] -parameters["report"]<-parameters["report"]/100 -parameters["reportc"]<-parameters["reportc"]/100 -parameters["reporth"]<-parameters["reporth"]/100 -parameters["nus"]<-1/parameters["nus"] -parameters["rhos"]<-parameters["rhos"]/100 -parameters["amp"]<-parameters["amp"]/100 -parameters["selfis_eff"]<-parameters["selfis_eff"]/100 -parameters["dist_eff"]<-parameters["dist_eff"]/100 -parameters["hand_eff"]<-parameters["hand_eff"]/100 -parameters["work_eff"]<-parameters["work_eff"]/100 -parameters["w2h"]<-parameters["w2h"]/100 -parameters["school_eff"]<-parameters["school_eff"]/100 -parameters["s2h"]<-parameters["s2h"]/100 -parameters["cocoon_eff"]<-parameters["cocoon_eff"]/100 -parameters["age_cocoon"]<-floor((parameters["age_cocoon"]/5)+1) -parameters["vaccine_eff"]<-parameters["vaccine_eff"]/100 -# parameters["vaccine_cov"]<-parameters["vaccine_cov"]/100 -# parameters["vac_campaign"]<-parameters["vac_campaign"]*7 -parameters["screen_test_sens"]<-parameters["screen_test_sens"]/100 -parameters["quarantine_days"]<-parameters["quarantine_days"] -parameters["quarantine_effort"]<-1/parameters["quarantine_effort"] -parameters["quarantine_eff_home"]<-parameters["quarantine_eff_home"]/-100 -parameters["quarantine_eff_other"]<-parameters["quarantine_eff_other"]/100 -parameters["give"]<-parameters["give"]/100 -parameters["pdeath_h"]<-parameters["pdeath_h"]/100 -parameters["pdeath_hc"]<-parameters["pdeath_hc"]/100 -parameters["pdeath_icu"]<-parameters["pdeath_icu"]/100 -parameters["pdeath_icuc"]<-parameters["pdeath_icuc"]/100 -parameters["pdeath_vent"]<-parameters["pdeath_vent"]/100 -parameters["pdeath_ventc"]<-parameters["pdeath_ventc"]/100 -parameters["nusc"]<-1/parameters["nusc"] -parameters["nu_icu"]<-1/parameters["nu_icu"] -parameters["nu_icuc"]<-1/parameters["nu_icuc"] -parameters["nu_vent"]<-1/parameters["nu_vent"] -parameters["nu_ventc"]<-1/parameters["nu_ventc"] -parameters["pclin"]<-parameters["pclin"]/100 -parameters["prob_icu"]<-parameters["prob_icu"]/100 -parameters["prob_vent"]<-parameters["prob_vent"]/100 -parameters2<-parameters - -########################################################################### -# Define the indices for each variable -Sindex<-1:A -Eindex<-(A+1):(2*A) -Iindex<-(2*A+1):(3*A) -Rindex<-(3*A+1):(4*A) -Xindex<-(4*A+1):(5*A) -Hindex<-(5*A+1):(6*A) -HCindex<-(6*A+1):(7*A) -Cindex<-(7*A+1):(8*A) -CMindex<-(8*A+1):(9*A) -Vindex<-(9*A+1):(10*A) -QSindex<-(10*A+1):(11*A) -QEindex<-(11*A+1):(12*A) -QIindex<-(12*A+1):(13*A) -QRindex<-(13*A+1):(14*A) -CLindex<-(14*A+1):(15*A) -QCindex<-(15*A+1):(16*A) -ICUindex<-(16*A+1):(17*A) -ICUCindex<-(17*A+1):(18*A) -ICUCVindex<-(18*A+1):(19*A) -Ventindex<-(19*A+1):(20*A) -VentCindex<-(20*A+1):(21*A) -CMCindex<-(21*A+1):(22*A) - -########################################################################### -# MODEL INITIAL CONDITIONS -initI<-0*popstruc[,2] # Infected and symptomatic -initE<-0*popstruc[,2] # Incubating -initE[aci]<-1 # place random index case in E compartment -initR<-0*popstruc[,2] # Immune -initX<-0*popstruc[,2] # Isolated -initV<-0*popstruc[,2] # Vaccinated -initQS<-0*popstruc[,2] # quarantined S -initQE<-0*popstruc[,2] # quarantined E -initQI<-0*popstruc[,2] # quarantined I -initQR<-0*popstruc[,2] # quarantined R -initH<-0*popstruc[,2] # hospitalised -initHC<-0*popstruc[,2] # hospital critical -initC<-0*popstruc[,2] # Cumulative cases (true) -initCM<-0*popstruc[,2] # Cumulative deaths (true) -initCL<-0*popstruc[,2] # symptomatic cases -initQC<-0*popstruc[,2] # quarantined C -initICU<-0*popstruc[,2] # icu -initICUC<-0*popstruc[,2] # icu critical -initICUCV<-0*popstruc[,2] # icu critical -initVent<-0*popstruc[,2] # icu vent -initVentC<-0*popstruc[,2] # icu vent crit -initCMC<-0*popstruc[,2] # Cumulative deaths (true) -initS<-popstruc[,2]-initE-initI-initR-initX-initV-initH-initHC-initQS-initQE-initQI-initQR-initCL-initQC-initICU-initICUC-initICUCV-initVent-initVentC # Susceptible (non-immune) - - -inp <- read_excel(file_path, sheet = "Interventions") -inputs<-function(inp, run){ - tb<-which(inp$`Apply to`==run) - - si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tb) - scr<-intersect(which(inp$Intervention=="Screening (when S.I.)"),tb) - sd<-intersect(which(inp$Intervention=="Social Distancing"),tb) - hw<-intersect(which(inp$Intervention=="Handwashing"),tb) - wah<-intersect(which(inp$Intervention=="Working at Home"),tb) - sc<-intersect(which(inp$Intervention=="School Closures"),tb) - cte<-intersect(which(inp$Intervention=="Shielding the Elderly"),tb) - q<-intersect(which(inp$Intervention=="Household Isolation (when S.I.)"),tb) - tb<-intersect(which(inp$Intervention=="International Travel Ban"),tb) - vc<-intersect(which(inp$Intervention=="Vaccination"),tb) - - v<-(format(as.POSIXct(inp$`Date Start`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date Start`<-v2 - - v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - ll<-length(v[!is.na(v)]) - for (gg in 1:ll) { - v2[gg]<-min(v2[gg],stopdate) - } - inp$`Date End`<-v2 - - - ## self isolation - f<-c() - si_vector<-c() - isolation<-c() - if (length(si)>=1){ - for (i in 1:length(si)){ - f<-c(f,as.numeric(inp$`Date Start`[si[i]]-startdate),as.numeric(inp$`Date End`[si[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[si[i]]>startdate){ - si_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[si[i]],(f[i+1]-f[i])*20)) - isolation<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - si_vector<-c(rep(inp$`Value`[si[i]],(f[i+1])*20)) - isolation<-c(rep(1,(f[i+1])*20)) - } - } - else{ - si_vector<-c(si_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - si_vector<-c(si_vector,rep(inp$`Value`[si[i]],(f[i*2]-f[i*2-1])*20)) - isolation<-c(isolation,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - isolation<-c(isolation,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(si) && f[i*2]=1){ - for (i in 1:length(sd)){ - - f<-c(f,as.numeric(inp$`Date Start`[sd[i]]-startdate),as.numeric(inp$`Date End`[sd[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sd[i]]>startdate){ - sd_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sd[i]],(f[i+1]-f[i])*20)) - distancing<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sd_vector<-c(rep(inp$`Value`[sd[i]],(f[i+1])*20)) - distancing<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sd_vector<-c(sd_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],(f[i*2]-f[i*2-1])*20)) - distancing<-c(distancing,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - distancing<-c(distancing,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sd)&& f[i*2]=1){ - for (i in 1:length(scr)){ - - f<-c(f,as.numeric(inp$`Date Start`[scr[i]]-startdate),as.numeric(inp$`Date End`[scr[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[scr[i]]>startdate){ - scr_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[scr[i]],(f[i+1]-f[i])*20)) - screen<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - scr_vector<-c(rep(inp$`Value`[scr[i]],(f[i+1])*20)) - screen<-c(rep(1,(f[i+1])*20)) - } - } - else{ - scr_vector<-c(scr_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],(f[i*2]-f[i*2-1])*20)) - screen<-c(screen,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - screen<-c(screen,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(scr)&& f[i*2]=1){ - for (i in 1:length(hw)){ - - f<-c(f,as.numeric(inp$`Date Start`[hw[i]]-startdate),as.numeric(inp$`Date End`[hw[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[hw[i]]>startdate){ - hw_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[hw[i]],(f[i+1]-f[i])*20)) - handwash<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - hw_vector<-c(rep(inp$`Value`[hw[i]],(f[i+1])*20)) - handwash<-c(rep(1,(f[i+1])*20)) - } - } - else{ - hw_vector<-c(hw_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],(f[i*2]-f[i*2-1])*20)) - handwash<-c(handwash,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - handwash<-c(handwash,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(hw)&& f[i*2]=1){ - for (i in 1:length(wah)){ - - f<-c(f,as.numeric(inp$`Date Start`[wah[i]]-startdate),as.numeric(inp$`Date End`[wah[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[wah[i]]>startdate){ - wah_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[wah[i]],(f[i+1]-f[i])*20)) - workhome<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - wah_vector<-c(rep(inp$`Value`[wah[i]],(f[i+1])*20)) - workhome<-c(rep(1,(f[i+1])*20)) - } - } - else{ - wah_vector<-c(wah_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],(f[i*2]-f[i*2-1])*20)) - workhome<-c(workhome,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - workhome<-c(workhome,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(wah)&& f[i*2]=1){ - for (i in 1:length(sc)){ - - f<-c(f,as.numeric(inp$`Date Start`[sc[i]]-startdate),as.numeric(inp$`Date End`[sc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sc[i]]>startdate){ - sc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sc[i]],(f[i+1]-f[i])*20)) - schoolclose<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sc_vector<-c(rep(inp$`Value`[sc[i]],(f[i+1])*20)) - schoolclose<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sc_vector<-c(sc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],(f[i*2]-f[i*2-1])*20)) - schoolclose<-c(schoolclose,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - schoolclose<-c(schoolclose,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sc)&& f[i*2]=1){ - for (i in 1:length(cte)){ - - f<-c(f,as.numeric(inp$`Date Start`[cte[i]]-startdate),as.numeric(inp$`Date End`[cte[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[cte[i]]>startdate){ - cte_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[cte[i]],(f[i+1]-f[i])*20)) - cocoon<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - cte_vector<-c(rep(inp$`Value`[cte[i]],(f[i+1])*20)) - cocoon<-c(rep(1,(f[i+1])*20)) - } - } - else{ - cte_vector<-c(cte_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],(f[i*2]-f[i*2-1])*20)) - cocoon<-c(cocoon,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cocoon<-c(cocoon,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(cte)&& f[i*2]=1){ - for (i in 1:length(q)){ - - f<-c(f,as.numeric(inp$`Date Start`[q[i]]-startdate),as.numeric(inp$`Date End`[q[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[q[i]]>startdate){ - q_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[q[i]],(f[i+1]-f[i])*20)) - quarantine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - q_vector<-c(rep(inp$`Value`[q[i]],(f[i+1])*20)) - quarantine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - q_vector<-c(q_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - q_vector<-c(q_vector,rep(inp$`Value`[q[i]],(f[i*2]-f[i*2-1])*20)) - quarantine<-c(quarantine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - quarantine<-c(quarantine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(q)&& f[i*2]=1){ - for (i in 1:length(tb)){ - - f<-c(f,as.numeric(inp$`Date Start`[tb[i]]-startdate),as.numeric(inp$`Date End`[tb[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[tb[i]]>startdate){ - tb_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[tb[i]],(f[i+1]-f[i])*20)) - travelban<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - tb_vector<-c(rep(inp$`Value`[tb[i]],(f[i+1])*20)) - travelban<-c(rep(1,(f[i+1])*20)) - } - } - else{ - tb_vector<-c(tb_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],(f[i*2]-f[i*2-1])*20)) - travelban<-c(travelban,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - travelban<-c(travelban,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(tb)&& f[i*2]=1){ - for (i in 1:length(vc)){ - - f<-c(f,as.numeric(inp$`Date Start`[vc[i]]-startdate),as.numeric(inp$`Date End`[vc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[vc[i]]>startdate){ - vc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[vc[i]],(f[i+1]-f[i])*20)) - vaccine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - vc_vector<-c(rep(inp$`Value`[vc[i]],(f[i+1])*20)) - vaccine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - vc_vector<-c(vc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],(f[i*2]-f[i*2-1])*20)) - vaccine<-c(vaccine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vaccine<-c(vaccine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(vc)&& f[i*2]= 7) {Rt[i] <- NA} - } - - # Export in a cohesive format ---- - results <- list() - results$time <- startdate + times # dates - results$Rt <- Rt - results$cum_mortality <- round(cmortality1) # cumulative mortality - results$pct_total_pop_infected <- round(100 * tail(cumsum(rowSums(parameters["gamma"]*out[,(Eindex+1)])),1)/sum(popstruc[,2]), 1) # proportion of the population that has been infected at the end of the simulation - results$doubling_time <- round(log(2)*7 / (log(dailyinc1[2+7] / dailyinc1[2])), 2) # (Baseline only) to double the number of infections at inception - results$required_beds <- round(previcureq1) # required beds - results$saturation <- parameters["beds_available"] # saturation - results$daily_incidence <- round(dailyinc1) # daily incidence (Reported) - results$daily_total_cases <- round(rowSums(parameters["gamma"]*out[,(Eindex+1)]+parameters["gamma"]*out[,(QEindex+1)])) # daily incidence (Reported + Unreported) # daily incidence (Reported + Unreported) - results$hospital_surge_beds <- round(previcureq1) - results$icu_beds <- round(previcureq21) - results$ventilators <- round(previcureq31) - - results$death_natural_non_exposed <- round(base_mort_S1) - results$death_natural_exposed <- round(base_mort_E1 + base_mort_I1 + base_mort_CL1 + base_mort_X1 + base_mort_QS1 + - base_mort_QE1 + base_mort_QI1 + base_mort_QC1 + base_mort_QR1 + base_mort_R1+ - base_mort_H1+base_mort_HC1+base_mort_ICU1+base_mort_ICUC1+base_mort_ICUCV1+ - base_mort_Vent1+base_mort_VentC1) - results$death_treated_hospital <- round(cinc_mort_H1) - results$death_treated_icu <- round(cinc_mort_ICU1) - results$death_treated_ventilator <- round(cinc_mort_Vent1) - results$death_untreated_hospital <- round(cinc_mort_HC1) - results$death_untreated_icu <- round(cinc_mort_ICUC1) - results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) - results$total_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + - results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator+results$death_natural_non_exposed+results$death_natural_exposed - results$total_deaths_end <- last(results$total_deaths) - results$total_reported_deaths_end <- last(results$cum_mortality) - results$base_mort_H <- base_mort_H1 - results$base_mort_HC <- base_mort_HC1 - results$base_mort_ICU <- base_mort_ICU1 - results$base_mort_ICUC <- base_mort_ICUC1 - results$base_mort_ICUCV <- base_mort_ICUCV1 - results$base_mort_Vent <- base_mort_Vent1 - results$base_mort_VentC <- base_mort_VentC1 - results$base_mort_S <- base_mort_S1 - results$base_mort_E <- base_mort_E1 - results$base_mort_I <- base_mort_I1 - results$base_mort_CL <- base_mort_CL1 - results$base_mort_X <- base_mort_X1 - results$base_mort_QS <- base_mort_QS1 - results$base_mort_QE <- base_mort_QE1 - results$base_mort_QI <- base_mort_QI1 - results$base_mort_QC <- base_mort_QC1 - results$base_mort_QR <- base_mort_QR1 - results$base_mort_R <- base_mort_R1 - - ## AGE DEPENDENT MORTALITY - cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out[,(Hindex+1)]) - cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out[,(HCindex+1)]) - cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out[,(ICUindex+1)] - cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] - cinc_mort_ICUCV1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(ICUCVindex+1)] - cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] - cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] - totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_ICUCV1+cinc_mort_Vent1+cinc_mort_VentC1) - basemort_H1<-(out[,(Hindex+1)]) - basemort_HC1<-(out[,(HCindex+1)]) - basemort_ICU1<-(out[,(ICUindex+1)]) - basemort_ICUC1<-(out[,(ICUCindex+1)]) - basemort_ICUCV1<-(out[,(ICUCVindex+1)]) - basemort_Vent1<-(out[,(Ventindex+1)]) - basemort_VentC1<-(out[,(VentCindex+1)]) - totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_ICUCV1+basemort_Vent1+basemort_VentC1) - tc<-c() - - for (i in 1:dim(cinc_mort_H1)[1]) { - for (j in 1:dim(cinc_mort_H1)[2]) { - tc<-rbind(tc,c(i, j, totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) - } - } - tc<-as.data.frame(tc) - colnames(tc)<-c("Day","Age","value") - - results$tc <- tc %>% - mutate(Date = startdate + Day, - age_cat = case_when( - Age >= 1 & Age <= 6 ~ "≤ 30 y.o.", - Age > 6 & Age <= 8 ~ "30-40 y.o.", - Age > 8 & Age <= 10 ~ "40-50 y.o.", - Age > 10 & Age <= 12 ~ "50-60 y.o.", - Age > 12 & Age <= 14 ~ "60-70 y.o.", - Age >= 15 ~ "≥ 70 y.o.")) %>% - mutate(age_cat = factor(age_cat, levels = rev(c("≤ 30 y.o.", "30-40 y.o.", - "40-50 y.o.", "50-60 y.o.", "60-70 y.o.", "≥ 70 y.o.")))) - - mortality_lag <- data.frame(Age = popstruc$agefloor) - if(nrow(out) >= 30) mortality_lag <- bind_cols(mortality_lag, - data.frame(day30 = out[30,CMindex+1]/out[30,Cindex+1]) %>% - mutate(day30 = ifelse(is.infinite(day30), 0, day30)) %>% - rename(`Day 30` = day30)) - if(nrow(out) >= 60) mortality_lag <- bind_cols(mortality_lag, - data.frame(day60 = out[60,CMindex+1]/out[60,Cindex+1]) %>% - mutate(day60 = ifelse(is.infinite(day60), 0, day60)) %>% - rename(`Day 60` = day60)) - if(nrow(out) >= 90) mortality_lag <- bind_cols(mortality_lag, - data.frame(day90 = out[90,CMindex+1]/out[90,Cindex+1]) %>% - mutate(day90 = ifelse(is.infinite(day90), 0, day90)) %>% - rename(`Day 90` = day90)) - if(nrow(out) >= 120) mortality_lag <- bind_cols(mortality_lag, - data.frame(day120 = out[120,CMindex+1]/out[120,Cindex+1]) %>% - mutate(day120 = ifelse(is.infinite(day120), 0, day120)) %>% - rename(`Day 120` = day120)) - - results$mortality_lag <- mortality_lag - - return(results) -} - - -out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) -simul_baseline <- process_ode_outcome(out0) -# write.csv(simul_baseline, paste0(hilo,"_baseline_",gsub(":|-","",Sys.time()),".csv")) - -#future interventions -#extend travel ban, quarantine, hand washing, cocooning the elderly until 1st July -parameters2 <- parameters -out <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters2,input=vectors) -simul_interventions <- process_ode_outcome(out) -# write.csv(simul_interventions, paste0(hilo,"_futureIntv_",gsub(":|-","",Sys.time()),".csv")) - -pop1<-out[,(Sindex+1)]+out[,(Eindex+1)]+out[,(Iindex+1)]+out[,(CLindex+1)]+out[,(Rindex+1)]+out[,(Xindex+1)]+out[,(Vindex+1)]+ - out[,(QSindex+1)]+out[,(QEindex+1)]+out[,(QIindex+1)]+out[,(QCindex+1)]+out[,(QRindex+1)]+ - out[,(Hindex+1)]+out[,(HCindex+1)]+out[,(ICUindex+1)]+out[,(ICUCindex+1)]+out[,(ICUCVindex+1)]+out[,(Ventindex+1)]+out[,(VentCindex+1)] -tpop1<-rowSums(pop1) - -############# PLOTTING -# Fitting tab -# fitting the intervention lines to the data to account for any historical interventions -time<-as.Date(out0[,1]+startdate) -par(mfrow=c(1,2)) -# set up the axis limits -xmin<-min(as.Date(cases_rv[,1])) -xmax<-max(as.Date(cases_rv[,1])) -ymax<-max(cases_rv[,2],na.rm = T) -xtick<-seq(xmin, xmax, by=7) -plot(time,simul_interventions$daily_incidence,type='l',lwd=3, - main="New Reported Cases", xlab="Date", ylab="Cases per day", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -axis(side=1, labels = FALSE) -text(x=xtick, y=-250, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - -# reset the maximum to the cumulative mortality -ymax<-max(cases_rv[,3],na.rm = T) -plot(time,simul_interventions$cum_mortality,type='l',lwd=3, - main="Cumulative Mortality", xlab="Date", ylab="Total deaths", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -text(x=xtick, y=-100, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,3],pch=19,col='red') - - -### Predictions tab -par(mfrow=c(1,2)) -### Cases at baseline and intervention -ymax<-max(c(cases_rv[,2],simul_baseline$daily_incidence,simul_interventions$daily_incidence),na.rm=T) -plot(time,simul_baseline$daily_incidence,type='l',lwd=3,col='blue', - main="Baseline", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') -plot(time,simul_interventions$daily_incidence,type='l',lwd=3,col='blue', - main="Intervention", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - - - -# # Hospital prevalences stratified by H,ICU and Vent -ymax<-max(c((simul_baseline$hospital_surge_beds+simul_baseline$icu_beds+simul_baseline$ventilators),(simul_interventions$hospital_surge_beds+simul_interventions$icu_beds+simul_interventions$ventilators))) -time<-as.Date(out[,"time"]+startdate) -coul=c("#047883", "#24A9E2","#051A46") -DM<-as.data.frame(cbind(time,simul_baseline$hospital_surge_beds,simul_baseline$icu_beds,simul_baseline$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time,origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d0<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -DM<-as.data.frame(cbind(time,simul_interventions$hospital_surge_beds,simul_interventions$icu_beds,simul_interventions$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -grid.arrange(d0+ylab("Number of Patients")+ - ggtitle("Baseline")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - d1+ylab("Number of Patients")+ - ggtitle("Intervention")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - nrow = 1) - - -# # Cumulative mortality at baseline and intervention stratified by hospital status -ymax<-max(c((simul_baseline$total_deaths),(simul_interventions$total_deaths))) -time<-as.Date(out[,"time"]+startdate) -coul=c("#047883", "#24A9E2","#051A46","#E68029", "#D63304","#D1D604") -DM0<-as.data.frame(cbind(time,simul_baseline$base_mort_I+simul_baseline$base_mort_QI, - simul_baseline$base_mort_CL+simul_baseline$base_mort_QC, - simul_baseline$base_mort_X, - simul_baseline$base_mort_S+simul_baseline$base_mort_QS, - simul_baseline$base_mort_E+simul_baseline$base_mort_QE, - simul_baseline$base_mort_QR+simul_baseline$base_mort_R, - simul_baseline$death_treated_hospital, - simul_baseline$death_treated_icu, - simul_baseline$death_treated_ventilator, - simul_baseline$death_untreated_hospital, - simul_baseline$death_untreated_icu, - simul_baseline$death_untreated_ventilator)) -colnames(DM0)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM0$Time<-as.Date(DM0$Time, origin = "1970-01-01") -DMF0<-melt(DM0, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m0<-ggplot(DMF0, aes(x = Time, y = value,fill=variable)) + - geom_area() - -DM<-as.data.frame(cbind(time,simul_interventions$base_mort_I+simul_interventions$base_mort_QI,simul_interventions$base_mort_CL+simul_interventions$base_mort_QC,simul_interventions$base_mort_X,simul_interventions$base_mort_S+ - simul_interventions$base_mort_QS,simul_interventions$base_mort_E+simul_interventions$base_mort_QE,simul_interventions$base_mort_QR+simul_interventions$base_mort_R, - simul_interventions$death_treated_hospital,simul_interventions$death_treated_icu,simul_interventions$death_treated_ventilator,simul_interventions$death_untreated_hospital,simul_interventions$death_untreated_icu,simul_interventions$death_untreated_ventilator)) -colnames(DM)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area() -grid.arrange(m0+ylab("Cumulatice mortality")+ - ggtitle("Baseline")+ - ylim(0, ymax), - m1+ylab("Cumulatice mortality")+ - ggtitle("Intervention")+ - ylim(0, ymax), - nrow = 1) - - - -# # Estimated basic reproduction number, R_t -# par(mfrow=c(1,2)) -# ymax<-max(c(simul_baseline$Rt[!is.na(simul_baseline$Rt)],simul_interventions$Rt[!is.na(simul_interventions$Rt)])) -# plot(time,simul_baseline$Rt,type='l',lwd=3,col='black', -# main="Baseline", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -# lines(time,simul_baseline$Rt/simul_baseline$Rt,lwd=2,col='grey') -# plot(time,simul_interventions$Rt,type='l',lwd=3,col='black', -# main="Intervention", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -# lines(time,simul_interventions$Rt/simul_interventions$Rt,lwd=2,col='grey') -# - -## Predicted ifr -# ymax=max(c(simul_baseline$MORT1$value,simul_interventions$MORT1$value)) -# gm<-ggplot(data=simul_interventions$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_interventions$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") -# gm0<-ggplot(data=simul_baseline$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_baseline$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") - -# grid.arrange(gm+theme_classic(), -# gm0+theme_classic(), -# nrow=1) - - -# ## AGE DEPENDENT MORTALITY -# cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out[,(Hindex+1)]) -# cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out[,(HCindex+1)]) -# cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out[,(ICUindex+1)] -# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out[,(ICUCindex+1)] -# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out[,(Ventindex+1)] -# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out[,(VentCindex+1)] -# totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_Vent1+cinc_mort_VentC1) -# basemort_H1<-(out[,(Hindex+1)]) -# basemort_HC1<-(out[,(HCindex+1)]) -# basemort_ICU1<-(out[,(ICUindex+1)]) -# basemort_ICUC1<-(out[,(ICUCindex+1)]) -# basemort_Vent1<-(out[,(Ventindex+1)]) -# basemort_VentC1<-(out[,(VentCindex+1)]) -# totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_Vent1+basemort_VentC1) -# tc<-c() -# ages<-seq(0,100,by=5) -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc<-rbind(tc,c(i,ages[j],totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) -# } -# } -# tc<-as.data.frame(tc) -# colnames(tc)<-c("Day","Age","value") -# tc$Age<-as.factor(tc$Age) -# p6<-ggplot(data=tc, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ -# ylab("Proportion of deaths") -# -# inc_mort_H0 <- parameters["nus"]*parameters["pdeath_h"]*(out0[,(Hindex+1)]) -# inc_mort_HC0 <- parameters["nusc"]*parameters["pdeath_hc"]*(out0[,(HCindex+1)]) -# inc_mort_ICU0 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out0[,(ICUindex+1)] -# inc_mort_ICUC0 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out0[,(ICUCindex+1)] -# inc_mort_Vent0 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out0[,(Ventindex+1)] -# inc_mort_VentC0 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out0[,(VentCindex+1)] -# totage0<-as.data.frame(inc_mort_H0+inc_mort_HC0+inc_mort_ICU0+inc_mort_ICUC0+inc_mort_Vent0+inc_mort_VentC0) -# basemort_H0<-(out0[,(Hindex+1)]) -# basemort_HC0<-(out0[,(HCindex+1)]) -# basemort_ICU0<-(out0[,(ICUindex+1)]) -# basemort_ICUC0<-(out0[,(ICUCindex+1)]) -# basemort_Vent0<-(out0[,(Ventindex+1)]) -# basemort_VentC0<-(out0[,(VentCindex+1)]) -# totbase0<-as.data.frame(basemort_H0+basemort_HC0+basemort_ICU0+basemort_ICUC0+basemort_Vent0+basemort_VentC0) -# tc0<-c() -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc0<-rbind(tc0,c(i,ages[j],totage0[i,j]*ifr[j,2]+totbase0[i,j]*mort[j])) -# } -# } -# tc0<-as.data.frame(tc0) -# colnames(tc0)<-c("Day","Age","value") -# tc0$Age<-as.factor(tc0$Age) -# p16<-ggplot(data=tc0, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ylab("Proportion of deaths") - -# grid.arrange(p16+theme_minimal(), -# p6+theme_minimal(), -# nrow=1) -# - - -# -# -# -# ######################################################################################################################### -# ##### SUMMARY METRICS ################################################################################################ -# ####################################################################################################################### -# -# infected0<-tail((rowSums(out0[,(Rindex+1)])),1)/sum(popstruc[,2]) -# infected0 -# infected1<-tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) -# infected1 -# -# # #Population size checks -# # tpop1 -# # tpop0 -# -# # PCR -# time_of_measurement<-40:49 -# # general population -# (rowSums(out[time_of_measurement,Iindex+1])+rowSums(out[time_of_measurement,CLindex+1])+rowSums(out[time_of_measurement,QIindex+1])+ -# rowSums(out[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# # every infection including hospital infections -# (rowSums(out[time_of_measurement,Iindex+1])+rowSums(out[time_of_measurement,CLindex+1])+rowSums(out[time_of_measurement,Hindex+1])+ -# rowSums(out[time_of_measurement,ICUindex+1])+rowSums(out[time_of_measurement,Ventindex+1])+rowSums(out[time_of_measurement,HCindex+1])+ -# rowSums(out[time_of_measurement,ICUCindex+1])+rowSums(out[time_of_measurement,VentCindex+1])+rowSums(out[time_of_measurement,QIindex+1])+ -# rowSums(out[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# -# # SEROLOGY -# tail((rowSums(out[,(Rindex+1)])),1)/sum(popstruc[,2]) -# -# # IHR -# sum(ihr$severe*popstruc[,2]/sum(popstruc[,2])) -# -# -# # PORPORTIONAL MORTALITY IN THE ELDEST -# m30<-out0[30,CMindex+1]/(out0[30,Cindex+1]) -# m30[is.infinite(m30)]<-0 -# m60<-out0[60,CMindex+1]/out0[60,Cindex+1] -# m60[is.infinite(m60)]<-0 -# m90<-out0[90,CMindex+1]/out0[90,Cindex+1] -# m90[is.infinite(m90)]<-0 -# m120<-out0[120,CMindex+1]/out0[120,Cindex+1] -# m120[is.infinite(m120)]<-0 -# -# ifr30<-sum(m30*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr60<-sum(m60*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr90<-sum(m90*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr120<-sum(m120*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# cbind(ifr30,ifr60,ifr90,ifr120)*100 -# -# PMORTDF0<-as.data.frame(cbind(out0[30,CMindex+1]/sum(out0[30,CMindex+1]),out0[60,CMindex+1]/sum(out0[60,CMindex+1]), -# out0[90,CMindex+1]/sum(out0[90,CMindex+1]),out0[120,CMindex+1]/sum(out0[120,CMindex+1]))) -# PMORTDF<-as.data.frame(cbind(out[30,CMindex+1]/sum(out[30,CMindex+1]),out[60,CMindex+1]/sum(out[60,CMindex+1]), -# out[90,CMindex+1]/sum(out[90,CMindex+1]),out[120,CMindex+1]/sum(out[120,CMindex+1]))) -# sum(PMORTDF0$V2[15:21]) -# sum(PMORTDF$V2[15:21]) -# -# -# # output doubling time over time first 7 days -# dd<-7 -# doub0<-log(2)*dd/(log(dailyinc0[2+dd]/dailyinc0[2])) -# doub0 - -# -# diff --git a/r_versions/covidage_v14.3.R b/r_versions/covidage_v14.3.R deleted file mode 100644 index dd2c797..0000000 --- a/r_versions/covidage_v14.3.R +++ /dev/null @@ -1,1704 +0,0 @@ -require("deSolve") -library("ggplot2") -library("dplyr") -library("reshape2") -require(gridExtra) -library(ggpubr) -library(bsplus) -library(deSolve) -library(DT) -library(highcharter) -library(lubridate) -library(pushbar) -library(readxl) -library(reshape2) -library(scales) -library(shiny) -library(shinyBS) -library(shinycssloaders) -library(shinyhelper) -library(shinythemes) -library(shinyWidgets) -library(tidyverse) -library(XLConnect) -# library("comoOdeCpp") - -#read data from excel file -setwd("C:/covid19/covid_age") -load("data_CoMo.RData") -file_path <- paste0(getwd(),"/Template_CoMoCOVID-19App_new.xlsx") -country_name<-"Cambodia" - -# Cases -dta <- read_excel(file_path, sheet = "Cases") -names(dta) <- c("date", "cases", "deaths") - -cases_rv <- dta %>% - mutate(date = as.Date(date), cumulative_death = cumsum(deaths)) %>% - as.data.frame() - -# Severity/Mortality -dta <- read_excel(file_path, sheet = "Severity-Mortality") -names(dta) <- c("age_category", "ifr", "ihr") - -mort_sever_rv <- dta %>% - mutate(ihr = ihr/100) %>% # starting unit should be % - scaling to a value between 0 and 1 - mutate(ifr = ifr/max(ifr)) # starting unit should be % - scaling to a value between 0 and 1 - -# Population -dta <- read_excel(file_path, sheet = "Population") -names(dta) <- c("age_category", "pop", "birth", "death") - -population_rv <- dta %>% - transmute(country = NA, age_category, pop, birth, death) - -# Parameters -param <- bind_rows(read_excel(file_path, sheet = "Parameters"), - read_excel(file_path, sheet = "Country Area Param"), - read_excel(file_path, sheet = "Virus Param"), - read_excel(file_path, sheet = "Hospitalisation Param"), - read_excel(file_path, sheet = "Interventions Param"), - read_excel(file_path, sheet = "Interventions")) %>% - mutate(Value_Date = as.Date(Value_Date)) - -# START Bridge ---- -popstruc <- population_rv %>% - select(age_category, pop) %>% - rename(agefloor = age_category) %>% - as.data.frame() - -popbirth <- population_rv %>% - select(age_category, birth) %>% - as.data.frame() # unit should be per person per day - -mort <- population_rv %>% - pull(death) # unit should be per person per day - -ihr <- mort_sever_rv %>% - select(age_category, ihr) %>% - as.data.frame() - -ifr <- mort_sever_rv %>% - select(age_category, ifr) %>% - as.data.frame() - - -######### POP AGEING -# per year ageing matrix -A<-length(popstruc[,2]) -dd<-seq(1:A)/seq(1:A) -ageing <- t(diff(diag(dd),lag=1)/(5*365.25)) -ageing<-cbind(ageing,0*seq(1:A)) # no ageing from last compartment - -# -pop<-population$country==country_name -pp<-population$pop[pop] -### CONTACT MATRICES -c_home <- contact_home[[country_name]] %>% as.matrix() -c_school <- contact_school[[country_name]] %>% as.matrix() -c_work <- contact_work[[country_name]] %>% as.matrix() -c_other <- contact_other[[country_name]] %>% as.matrix() -nce <-A-length(c_home[1,]) - -contact_home<-matrix(0,nrow=A,ncol=A) -contact_school<-matrix(0,nrow=A,ncol=A) -contact_work<-matrix(0,nrow=A,ncol=A) -contact_other<-matrix(0,nrow=A,ncol=A) - -for (i in 1:(A-nce)){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[i,j] - contact_school[i,j]<-c_school[i,j] - contact_work[i,j]<-c_work[i,j] - contact_other[i,j]<-c_other[i,j] - } -} - -for (i in (A+1-nce):A){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[(A-nce),j] - contact_school[i,j]<-c_school[(A-nce),j] - contact_work[i,j]<-c_work[(A-nce),j] - contact_other[i,j]<-c_other[(A-nce),j] - } -} -for (i in 1:(A-nce)){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[i,(A-nce)] - contact_school[i,j]<-c_school[i,(A-nce)] - contact_work[i,j]<-c_work[i,(A-nce)] - contact_other[i,j]<-c_other[i,(A-nce)] - } -} -for (i in (A+1-nce):A){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[(A-nce),(A-nce)] - contact_school[i,j]<-c_school[(A-nce),(A-nce)] - contact_work[i,j]<-c_work[(A-nce),(A-nce)] - contact_other[i,j]<-c_other[(A-nce),(A-nce)] - } -} - - - -######### INITIALISE SIMULATION/INTERVENTION START TIMES -startdate <- param$Value_Date[param$Parameter == "date_range_simul_start"] -stopdate <- param$Value_Date[param$Parameter == "date_range_simul_end"] -startdate <- startdate[1] -stopdate <- stopdate[1] - - -day_start <- as.numeric(startdate-startdate) -day_stop <- as.numeric(stopdate-startdate) -times <- seq(day_start, day_stop) - -tin<-as.numeric(startdate-as.Date("2020-01-01"))/365.25 -initP<-sum(popstruc[,2]) # population size -ageindcase<-20 # age of index case (years) -aci <- floor((ageindcase/5)+1) # age class of index case - - -############# DEFINE PARAMETERS -parameters <- c( - ### Transmission instrinsic - p = param$Value[param$Parameter=="p"][1], - rho = param$Value[param$Parameter=="rho"][1], - omega = param$Value[param$Parameter=="omega"][1], - gamma = param$Value[param$Parameter=="gamma"][1], - nui = param$Value[param$Parameter=="nui"][1], - report = param$Value[param$Parameter=="report"][1], - reportc = param$Value[param$Parameter=="reportc"][1], - reporth = param$Value[param$Parameter=="reporth"][1], - beds_available = param$Value[param$Parameter=="beds_available"][1], - icu_beds_available = param$Value[param$Parameter=="icu_beds_available"][1], - ventilators_available = param$Value[param$Parameter=="ventilators_available"][1], - give = 95, - pdeath_h = param$Value[param$Parameter=="pdeath_h"][1], - pdeath_hc = param$Value[param$Parameter=="pdeath_hc"][1], - pdeath_icu = param$Value[param$Parameter=="pdeath_icu"][1], - pdeath_icuc = param$Value[param$Parameter=="pdeath_icuc"][1], - pdeath_vent = param$Value[param$Parameter=="pdeath_vent"][1], - pdeath_ventc = param$Value[param$Parameter=="pdeath_ventc"][1], - ihr_scaling = param$Value[param$Parameter=="ihr_scaling"][1], - nus = param$Value[param$Parameter=="nus"][1], - nusc = param$Value[param$Parameter=="nus"][1], # nusc = nus - nu_icu = param$Value[param$Parameter=="nu_icu"][1], - nu_icuc = param$Value[param$Parameter=="nu_icu"][1], # nu_icuc = nu_icu - nu_vent = param$Value[param$Parameter=="nu_vent"][1], - nu_ventc = param$Value[param$Parameter=="nu_vent"][1], # nu_ventc = nu_vent - rhos = param$Value[param$Parameter=="rhos"][1], - amp = param$Value[param$Parameter=="amp"][1], - phi = param$Value[param$Parameter=="phi"][1], - pclin = param$Value[param$Parameter=="pclin"][1], - prob_icu = param$Value[param$Parameter=="prob_icu"][1], - prob_vent = param$Value[param$Parameter=="prob_vent"][1], - - ### INTERVENTIONS - # self isolation - selfis_eff = mean(param$Value[param$Parameter=="selfis_eff"],na.rm=T), - # social distancing - dist_eff = mean(param$Value[param$Parameter=="dist_eff"],na.rm=T), - # hand washing - hand_eff = mean(param$Value[param$Parameter=="hand_eff"],na.rm=T), - # working at home - work_eff = mean(param$Value[param$Parameter=="work_eff"],na.rm=T), - w2h = mean(param$Value[param$Parameter=="w2h"],na.rm=T), - # school closures - school_eff = mean(param$Value[param$Parameter=="school_eff"],na.rm=T), - s2h = mean(param$Value[param$Parameter=="s2h"],na.rm=T), - # cocooning the elderly - cocoon_eff = mean(param$Value[param$Parameter=="cocoon_eff"],na.rm=T), - age_cocoon = mean(param$Value[param$Parameter=="age_cocoon"],na.rm=T), - # vaccination campaign - # vaccine_on = as.numeric(param$Value_Date[param$Parameter=="date_vaccine_on"] - startdate), - vaccine_eff = mean(param$Value[param$Parameter=="vaccine_eff"],na.rm=T), - age_vaccine_min = mean(param$Value[param$Parameter=="age_vaccine_min"],na.rm=T), - # vaccine_cov = param$Value[param$Parameter=="vaccine_cov"], - vac_campaign = mean(param$Value[param$Parameter=="vac_campaign"],na.rm=T), - # travel ban - mean_imports = mean(param$Value[param$Parameter=="mean_imports"],na.rm=T), - # screening - screen_test_sens = mean(param$Value[param$Parameter=="screen_test_sens"],na.rm=T), - # screen_contacts = mean(param$Value[param$Parameter=="screen_contacts"],na.rm=T), - screen_overdispersion = mean(param$Value[param$Parameter=="screen_overdispersion"],na.rm=T), - # voluntary home quarantine - quarantine_days = mean(param$Value[param$Parameter=="quarantine_days"],na.rm=T), - quarantine_effort = mean(param$Value[param$Parameter=="quarantine_effort"],na.rm=T), - quarantine_eff_home = mean(param$Value[param$Parameter=="quarantine_eff_home"],na.rm=T), - quarantine_eff_other = mean(param$Value[param$Parameter=="quarantine_eff_other"],na.rm=T), - # mass testing - age_testing_min = mean(param$Value[param$Parameter=="age_testing_min"],na.rm=T), - age_testing_max = mean(param$Value[param$Parameter=="age_testing_max"],na.rm=T), - mass_test_sens = mean(param$Value[param$Parameter=="mass_test_sens"],na.rm=T), - isolation_days = mean(param$Value[param$Parameter=="isolation_days"],na.rm=T), - - household_size = param$Value[param$Parameter=="household_size"][1], - noise = param$Value[param$Parameter=="noise"][1], - iterations = param$Value[param$Parameter=="iterations"][1], - confidence = param$Value[param$Parameter=="confidence"][1] -) -ihr[,2]<- parameters["ihr_scaling"]*ihr[,2] - -# Scale parameters to percentages/ rates -parameters["rho"]<-parameters["rho"]/100 -parameters["omega"]<-(1/(parameters["omega"]*365)) -parameters["gamma"]<-1/parameters["gamma"] -parameters["nui"]<-1/parameters["nui"] -parameters["report"]<-parameters["report"]/100 -parameters["reportc"]<-parameters["reportc"]/100 -parameters["reporth"]<-parameters["reporth"]/100 -parameters["nus"]<-1/parameters["nus"] -parameters["rhos"]<-parameters["rhos"]/100 -parameters["amp"]<-parameters["amp"]/100 -parameters["selfis_eff"]<-parameters["selfis_eff"]/100 -parameters["dist_eff"]<-parameters["dist_eff"]/100 -parameters["hand_eff"]<-parameters["hand_eff"]/100 -parameters["work_eff"]<-parameters["work_eff"]/100 -parameters["w2h"]<-parameters["w2h"]/100 -parameters["school_eff"]<-parameters["school_eff"]/100 -parameters["s2h"]<-parameters["s2h"]/100 -parameters["cocoon_eff"]<-parameters["cocoon_eff"]/100 -parameters["age_cocoon"]<-floor((parameters["age_cocoon"]/5)+1) -parameters["vaccine_eff"]<-parameters["vaccine_eff"]/100 -age_vaccine_min<-(parameters["age_vaccine_min"]) -# parameters["vaccine_cov"]<-parameters["vaccine_cov"]/100 -# parameters["vac_campaign"]<-parameters["vac_campaign"]*7 -parameters["screen_test_sens"]<-parameters["screen_test_sens"]/100 -parameters["quarantine_days"]<-parameters["quarantine_days"] -parameters["quarantine_effort"]<-1/parameters["quarantine_effort"] -parameters["quarantine_eff_home"]<-parameters["quarantine_eff_home"]/-100 -parameters["quarantine_eff_other"]<-parameters["quarantine_eff_other"]/100 -parameters["give"]<-parameters["give"]/100 -parameters["pdeath_h"]<-parameters["pdeath_h"]/100 -parameters["pdeath_hc"]<-parameters["pdeath_hc"]/100 -parameters["pdeath_icu"]<-parameters["pdeath_icu"]/100 -parameters["pdeath_icuc"]<-parameters["pdeath_icuc"]/100 -parameters["pdeath_vent"]<-parameters["pdeath_vent"]/100 -parameters["pdeath_ventc"]<-parameters["pdeath_ventc"]/100 -parameters["nusc"]<-1/parameters["nusc"] -parameters["nu_icu"]<-1/parameters["nu_icu"] -parameters["nu_icuc"]<-1/parameters["nu_icuc"] -parameters["nu_vent"]<-1/parameters["nu_vent"] -parameters["nu_ventc"]<-1/parameters["nu_ventc"] -parameters["pclin"]<-parameters["pclin"]/100 -parameters["prob_icu"]<-parameters["prob_icu"]/100 -parameters["prob_vent"]<-parameters["prob_vent"]/100 -parameters_noise<-c(1:5,19:26,32:39,43,45,47:49) -iterations<-parameters["iterations"] -noise<-parameters["noise"] -confidence<-parameters["confidence"]/100 -parameters["mass_test_sens"]<-parameters["mass_test_sens"]/100 -age_testing_min<-(parameters["age_testing_min"]) -age_testing_max<-(parameters["age_testing_max"]) -parameters["isolation_days"]<-parameters["isolation_days"] - -########################################################################### -# Define the indices for each variable -Sindex<-1:A -Eindex<-(A+1):(2*A) -Iindex<-(2*A+1):(3*A) -Rindex<-(3*A+1):(4*A) -Xindex<-(4*A+1):(5*A) -Hindex<-(5*A+1):(6*A) -HCindex<-(6*A+1):(7*A) -Cindex<-(7*A+1):(8*A) -CMindex<-(8*A+1):(9*A) -Vindex<-(9*A+1):(10*A) -QSindex<-(10*A+1):(11*A) -QEindex<-(11*A+1):(12*A) -QIindex<-(12*A+1):(13*A) -QRindex<-(13*A+1):(14*A) -CLindex<-(14*A+1):(15*A) -QCindex<-(15*A+1):(16*A) -ICUindex<-(16*A+1):(17*A) -ICUCindex<-(17*A+1):(18*A) -ICUCVindex<-(18*A+1):(19*A) -Ventindex<-(19*A+1):(20*A) -VentCindex<-(20*A+1):(21*A) -CMCindex<-(21*A+1):(22*A) -Zindex<-(22*A+1):(23*A) - -########################################################################### -# MODEL INITIAL CONDITIONS -initI<-0*popstruc[,2] # Infected and symptomatic -initE<-0*popstruc[,2] # Incubating -initE[aci]<-1 # place random index case in E compartment -initR<-0*popstruc[,2] # Immune -initX<-0*popstruc[,2] # Isolated -initV<-0*popstruc[,2] # Vaccinated -initQS<-0*popstruc[,2] # quarantined S -initQE<-0*popstruc[,2] # quarantined E -initQI<-0*popstruc[,2] # quarantined I -initQR<-0*popstruc[,2] # quarantined R -initH<-0*popstruc[,2] # hospitalised -initHC<-0*popstruc[,2] # hospital critical -initC<-0*popstruc[,2] # Cumulative cases (true) -initCM<-0*popstruc[,2] # Cumulative deaths (true) -initCL<-0*popstruc[,2] # symptomatic cases -initQC<-0*popstruc[,2] # quarantined C -initICU<-0*popstruc[,2] # icu -initICUC<-0*popstruc[,2] # icu critical -initICUCV<-0*popstruc[,2] # icu critical -initVent<-0*popstruc[,2] # icu vent -initVentC<-0*popstruc[,2] # icu vent crit -initCMC<-0*popstruc[,2] # Cumulative deaths (true) -initZ<-0*popstruc[,2] # Cumulative deaths (true) -initS<-popstruc[,2]-initE-initI-initR-initX-initZ-initV-initH-initHC-initQS-initQE-initQI-initQR-initCL-initQC-initICU-initICUC-initICUCV-initVent-initVentC # Susceptible (non-immune) - - -inp <- read_excel(file_path, sheet = "Interventions") -inputs<-function(inp, run){ - # cap intervention end dates with simulation end date - inp$`Date End` = pmin(stopdate, inp$`Date End`) - - tv<-which(inp$`Apply to`==run) - - si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tv) - scr<-intersect(which(inp$Intervention=="Screening (when S.I.)"),tv) - sd<-intersect(which(inp$Intervention=="Social Distancing"),tv) - hw<-intersect(which(inp$Intervention=="Handwashing"),tv) - wah<-intersect(which(inp$Intervention=="Working at Home"),tv) - sc<-intersect(which(inp$Intervention=="School Closures"),tv) - cte<-intersect(which(inp$Intervention=="Shielding the Elderly"),tv) - q<-intersect(which(inp$Intervention=="Household Isolation (when S.I.)"),tv) - tb<-intersect(which(inp$Intervention=="International Travel Ban"),tv) - mt<-intersect(which(inp$Intervention=="Mass Testing"),tv) - minas<-intersect(which(inp$Intervention=="Age Testing Minimum"),tv) - maxas<-intersect(which(inp$Intervention=="Age Testing Maximum"),tv) - vc<-intersect(which(inp$Intervention=="Vaccination"),tv) - minav<-intersect(which(inp$Intervention=="Age Vaccine Minimum"),tv) - - v<-(format(as.POSIXct(inp$`Date Start`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date Start`<-v2 - - v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date End`<-v2 - - ## self isolation - f<-c() - si_vector<-c() - isolation<-c() - if (length(si)>=1){ - for (i in 1:length(si)){ - f<-c(f,as.numeric(inp$`Date Start`[si[i]]-startdate),as.numeric(inp$`Date End`[si[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[si[i]]>startdate){ - si_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[si[i]],(f[i+1]-f[i])*20)) - isolation<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - si_vector<-c(rep(inp$`Value`[si[i]],(f[i+1])*20)) - isolation<-c(rep(1,(f[i+1])*20)) - } - } - else{ - si_vector<-c(si_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - si_vector<-c(si_vector,rep(inp$`Value`[si[i]],(f[i*2]-f[i*2-1])*20)) - isolation<-c(isolation,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - isolation<-c(isolation,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(si) && f[i*2]=1){ - for (i in 1:length(sd)){ - - f<-c(f,as.numeric(inp$`Date Start`[sd[i]]-startdate),as.numeric(inp$`Date End`[sd[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sd[i]]>startdate){ - sd_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sd[i]],(f[i+1]-f[i])*20)) - distancing<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sd_vector<-c(rep(inp$`Value`[sd[i]],(f[i+1])*20)) - distancing<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sd_vector<-c(sd_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],(f[i*2]-f[i*2-1])*20)) - distancing<-c(distancing,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - distancing<-c(distancing,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sd)&& f[i*2]=1){ - for (i in 1:length(scr)){ - - f<-c(f,as.numeric(inp$`Date Start`[scr[i]]-startdate),as.numeric(inp$`Date End`[scr[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[scr[i]]>startdate){ - scr_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[scr[i]],(f[i+1]-f[i])*20)) - screen<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - scr_vector<-c(rep(inp$`Value`[scr[i]],(f[i+1])*20)) - screen<-c(rep(1,(f[i+1])*20)) - } - } - else{ - scr_vector<-c(scr_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],(f[i*2]-f[i*2-1])*20)) - screen<-c(screen,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - screen<-c(screen,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(scr)&& f[i*2]=1){ - for (i in 1:length(hw)){ - - f<-c(f,as.numeric(inp$`Date Start`[hw[i]]-startdate),as.numeric(inp$`Date End`[hw[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[hw[i]]>startdate){ - hw_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[hw[i]],(f[i+1]-f[i])*20)) - handwash<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - hw_vector<-c(rep(inp$`Value`[hw[i]],(f[i+1])*20)) - handwash<-c(rep(1,(f[i+1])*20)) - } - } - else{ - hw_vector<-c(hw_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],(f[i*2]-f[i*2-1])*20)) - handwash<-c(handwash,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - handwash<-c(handwash,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(hw)&& f[i*2]=1){ - for (i in 1:length(wah)){ - - f<-c(f,as.numeric(inp$`Date Start`[wah[i]]-startdate),as.numeric(inp$`Date End`[wah[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[wah[i]]>startdate){ - wah_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[wah[i]],(f[i+1]-f[i])*20)) - workhome<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - wah_vector<-c(rep(inp$`Value`[wah[i]],(f[i+1])*20)) - workhome<-c(rep(1,(f[i+1])*20)) - } - } - else{ - wah_vector<-c(wah_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],(f[i*2]-f[i*2-1])*20)) - workhome<-c(workhome,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - workhome<-c(workhome,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(wah)&& f[i*2]=1){ - for (i in 1:length(sc)){ - - f<-c(f,as.numeric(inp$`Date Start`[sc[i]]-startdate),as.numeric(inp$`Date End`[sc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sc[i]]>startdate){ - sc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sc[i]],(f[i+1]-f[i])*20)) - schoolclose<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sc_vector<-c(rep(inp$`Value`[sc[i]],(f[i+1])*20)) - schoolclose<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sc_vector<-c(sc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],(f[i*2]-f[i*2-1])*20)) - schoolclose<-c(schoolclose,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - schoolclose<-c(schoolclose,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sc)&& f[i*2]=1){ - for (i in 1:length(cte)){ - - f<-c(f,as.numeric(inp$`Date Start`[cte[i]]-startdate),as.numeric(inp$`Date End`[cte[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[cte[i]]>startdate){ - cte_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[cte[i]],(f[i+1]-f[i])*20)) - cocoon<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - cte_vector<-c(rep(inp$`Value`[cte[i]],(f[i+1])*20)) - cocoon<-c(rep(1,(f[i+1])*20)) - } - } - else{ - cte_vector<-c(cte_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],(f[i*2]-f[i*2-1])*20)) - cocoon<-c(cocoon,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cocoon<-c(cocoon,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(cte)&& f[i*2]=1){ - for (i in 1:length(q)){ - - f<-c(f,as.numeric(inp$`Date Start`[q[i]]-startdate),as.numeric(inp$`Date End`[q[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[q[i]]>startdate){ - q_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[q[i]],(f[i+1]-f[i])*20)) - quarantine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - q_vector<-c(rep(inp$`Value`[q[i]],(f[i+1])*20)) - quarantine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - q_vector<-c(q_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - q_vector<-c(q_vector,rep(inp$`Value`[q[i]],(f[i*2]-f[i*2-1])*20)) - quarantine<-c(quarantine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - quarantine<-c(quarantine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(q)&& f[i*2]=1){ - for (i in 1:length(tb)){ - - f<-c(f,as.numeric(inp$`Date Start`[tb[i]]-startdate),as.numeric(inp$`Date End`[tb[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[tb[i]]>startdate){ - tb_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[tb[i]],(f[i+1]-f[i])*20)) - travelban<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - tb_vector<-c(rep(inp$`Value`[tb[i]],(f[i+1])*20)) - travelban<-c(rep(1,(f[i+1])*20)) - } - } - else{ - tb_vector<-c(tb_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],(f[i*2]-f[i*2-1])*20)) - travelban<-c(travelban,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - travelban<-c(travelban,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(tb)&& f[i*2]=1){ - for (i in 1:length(mt)){ - - f<-c(f,as.numeric(inp$`Date Start`[mt[i]]-startdate),as.numeric(inp$`Date End`[mt[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[mt[i]]>startdate){ - mt_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[mt[i]],(f[i+1]-f[i])*20)) - masstesting<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - mt_vector<-c(rep(inp$`Value`[mt[i]],(f[i+1])*20)) - masstesting<-c(rep(1,(f[i+1])*20)) - } - } - else{ - mt_vector<-c(mt_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - mt_vector<-c(mt_vector,rep(inp$`Value`[mt[i]],(f[i*2]-f[i*2-1])*20)) - masstesting<-c(masstesting,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - masstesting<-c(masstesting,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(mt)&& f[i*2]=1){ - for (i in 1:length(minas)){ - f<-c(f,as.numeric(inp$`Date Start`[minas[i]]-startdate),as.numeric(inp$`Date End`[minas[i]]-startdate)) - if(i==1){ - if (inp$`Date Start`[minas[i]]>startdate){ - minas_vector<-c(rep(age_testing_min,f[i]*20),rep(inp$`Value`[minas[i]],(f[i+1]-f[i])*20)) - } - else{ - minas_vector<-c(rep(inp$`Value`[minas[i]],(f[i+1])*20)) - } - } - else{ - minas_vector<-c(minas_vector,rep(age_testing_min,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - minas_vector<-c(minas_vector,rep(inp$`Value`[minas[i]],(f[i*2]-f[i*2-1])*20)) - } - if(i==length(minas)&& f[i*2]=1){ - for (i in 1:length(maxas)){ - f<-c(f,as.numeric(inp$`Date Start`[maxas[i]]-startdate),as.numeric(inp$`Date End`[maxas[i]]-startdate)) - if(i==1){ - if (inp$`Date Start`[maxas[i]]>startdate){ - maxas_vector<-c(rep(age_testing_max,f[i]*20),rep(inp$`Value`[maxas[i]],(f[i+1]-f[i])*20)) - } - else{ - maxas_vector<-c(rep(inp$`Value`[maxas[i]],(f[i+1])*20)) - } - } - else{ - maxas_vector<-c(maxas_vector,rep(age_testing_max,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - maxas_vector<-c(maxas_vector,rep(inp$`Value`[maxas[i]],(f[i*2]-f[i*2-1])*20)) - } - if(i==length(maxas)&& f[i*2]=1){ - for (i in 1:length(vc)){ - - f<-c(f,as.numeric(inp$`Date Start`[vc[i]]-startdate),as.numeric(inp$`Date End`[vc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[vc[i]]>startdate){ - vc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[vc[i]],(f[i+1]-f[i])*20)) - vaccine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - vc_vector<-c(rep(inp$`Value`[vc[i]],(f[i+1])*20)) - vaccine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - vc_vector<-c(vc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],(f[i*2]-f[i*2-1])*20)) - vaccine<-c(vaccine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vaccine<-c(vaccine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(vc)&& f[i*2]=1){ - for (i in 1:length(minav)){ - f<-c(f,as.numeric(inp$`Date Start`[minav[i]]-startdate),as.numeric(inp$`Date End`[minav[i]]-startdate)) - if(i==1){ - if (inp$`Date Start`[minav[i]]>startdate){ - minav_vector<-c(rep(age_vaccine_min,f[i]*20),rep(inp$`Value`[minav[i]],(f[i+1]-f[i])*20)) - } - else{ - minav_vector<-c(rep(inp$`Value`[minav[i]],(f[i+1])*20)) - } - } - else{ - minav_vector<-c(minav_vector,rep(age_vaccine_min,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - minav_vector<-c(minav_vector,rep(inp$`Value`[minav[i]],(f[i*2]-f[i*2-1])*20)) - } - if(i==length(minav)&& f[i*2]1){ - ratetestI<-mass_test_sens*testI/sum(I) - # print(paste('rateI: ',ratetestI)) - }else{ratetestI<-0} - if(sum(CL)>1){ - ratetestC<-mass_test_sens*testC/sum(CL) - # print(paste('rateC: ',ratetestC)) - }else{ratetestC<-0} - if(sum(E)>1){ - ratetestE<-mass_test_sens*testE/sum(E) - # print(paste('rateC: ',ratetestC)) - }else{ratetestE<-0} - - # print(mass_test_sens) - # print(ratetestI*sum(I) + ratetestC*sum(CL) - (1/isolation_days)*sum(Z) ) - # print(propC) - # print(testI) - # print(testC) - # - # cocooning the elderly - cocoon_mat<-matrix((1-cocoon_eff),nrow = length(popstruc$pop),ncol = length(popstruc$pop)) - cocoon_mat[1:(age_cocoon-1),1:(age_cocoon-1)]<-1 - - # contact matrices - cts<-(contact_home+distancing*(1-dist)*contact_other+(1-distancing)*contact_other - +(1-schoolclose)*contact_school # school on - +schoolclose*(1-school)*contact_school # school close - +schoolclose*contact_home*school*s2h # inflating contacts at home when school closes - +(1-workhome)*contact_work # normal work - +workhome*(1-work)*contact_work # people not working from home when homework is active - +contact_home*workhome*work*w2h # inflating contacts at home when working from home - ) - - # Final transmission related parameters - contacts <- (1-cocoon)*cts+cocoon*cts*cocoon_mat+cocoon*(1+schoolclose*(1-school_eff)+workhome*(1-work_eff))*contact_home*(1-cocoon_mat) - seas <- 1+amp*cos(2*3.14*(t-(phi*365.25/12))/365.25) - importation <- mean_imports*(1-trvban_eff) - HH<-H+ICU+Vent+ICUC+ICUCV+VentC - HHC<-HC - lam <- (1-hand)*p*seas*(contacts%*%((rho*E+(I+CL+importation)+(1-selfis_eff)*(X+HHC)+rhos*(HH))/P))+ - (1-hand)*p*seas*(1-quarantine*quarantine_eff_other)*(contact_other%*%((rho*QE+QI+QC)/P)) - # contacts under home quarantine - lamq<-(1-hand)*p*seas*((1-quarantine_eff_home)*contact_home%*%(((1-selfis_eff)*(X+HHC+rho*QE+QI+QC))/P))+ - (1-hand)*p*seas*(1-quarantine_eff_other)*(contact_other%*%((rho*E+(I+CL+importation)+(1-selfis_eff)*(X+HHC+rho*QE+QI+QC)+rhos*(HH))/P)) - - # birth/death - b1<-sum(popbirth[,2]*popstruc[,2]) - birth<-0*popbirth[,2] - birth[1]<-b1 - - # ODE system - dSdt <- -S*lam-vaccinate*age_vaccine_vector*S+omega*R+ageing%*%S-mort*S+birth-quarantine_rate*S +(1/quarantine_days)*QS - dEdt <- S*lam-gamma*E+ageing%*%E-mort*E + (1-vaccine_eff)*lam*V-quarantine_rate*E+(1/quarantine_days)*QE - dIdt <- gamma*(1-pclin)*(1-age_testing_vector*ratetestE)*(1-screen_eff)*(1-ihr[,2])*E-nui*I+ageing%*%I-mort*I + (1/quarantine_days)*QI - quarantine_rate*I - ratetestI*age_testing_vector*I - dCLdt<- gamma*pclin*(1-age_testing_vector*ratetestE)*(1-selfis)*(1-ihr[,2])*(1-quarantine_rate)*E-nui*CL+ageing%*%CL-mort*CL + (1/quarantine_days)*QC - ratetestC*age_testing_vector*CL - dRdt <- nui*I-omega*R+nui*X+nui*CL+ageing%*%R-mort*R + (1/isolation_days)*Z+(1/quarantine_days)*QR + nus*(1-pdeath_h*ifr[,2])*H + (1-pdeath_icu*ifr[,2])*nu_icu*ICU + (1-pdeath_icuc*ifr[,2])*nu_icuc*ICUC + (1-pdeath_ventc*ifr[,2])*nu_ventc*ICUCV + (1-pdeath_hc*ifr[,2])*nusc*HC + (1-pdeath_vent*ifr[,2])*nu_vent*Vent+ (1-pdeath_ventc*ifr[,2])*nu_ventc*VentC - dXdt <- gamma*selfis*(1-age_testing_vector*ratetestE)*pclin*(1-ihr[,2])*E+gamma*(1-pclin)*(1-age_testing_vector*ratetestE)*screen_eff*(1-ihr[,2])*E-nui*X+ageing%*%X-mort*X - dVdt <- vaccinate*age_vaccine_vector*S -(1-vaccine_eff)*lam*V +ageing%*%V - mort*V - - dQSdt <- quarantine_rate*S+ ageing%*%QS-mort*QS - (1/quarantine_days)*QS - lamq*QS - dQEdt <- quarantine_rate*E - gamma*QE + ageing%*%QE-mort*QE - (1/quarantine_days)*QE + lamq*QS - dQIdt <- quarantine_rate*I + gamma*(1-ihr[,2])*(1-pclin)*QE-nui*QI+ageing%*%QI-mort*QI - (1/quarantine_days)*QI - dQCdt <- gamma*pclin*(1-selfis)*(1-age_testing_vector*ratetestE)*(1-ihr[,2])*quarantine_rate*E+gamma*(1-ihr[,2])*pclin*QE-nui*QC+ageing%*%QC-mort*QC - (1/quarantine_days)*QC - dQRdt <- nui*QI+nui*QC+ageing%*%QR-mort*QR - (1/quarantine_days)*QR - - dHdt <- gamma*ihr[,2]*(1-prob_icu)*(1-critH)*reporth*E + gamma*ihr[,2]*(1-prob_icu)*(1-critH)*QE - nus*H + ageing%*%H-mort*H - dHCdt <- gamma*ihr[,2]*(1-prob_icu)*(1-critH)*(1-reporth)*E+gamma*ihr[,2]*(1-prob_icu)*critH*E + gamma*ihr[,2]*(1-prob_icu)*critH*QE - nusc*HC + ageing%*%HC-mort*HC - dICUdt <- gamma*ihr[,2]*prob_icu*(1-crit)*(1-prob_vent)*E + gamma*ihr[,2]*prob_icu*(1-crit)*(1-prob_vent)*QE - nu_icu*ICU +ageing%*%ICU - mort*ICU +(1-crit)*ICUC*1/2 - dICUCdt <- gamma*ihr[,2]*prob_icu*crit*(1-prob_vent)*E + gamma*ihr[,2]*prob_icu*crit*(1-prob_vent)*QE - - nu_icuc*ICUC -(1-crit)*ICUC*1/2 +ageing%*%ICUC - mort*ICUC - dICUCVdt <- gamma*ihr[,2]*prob_icu*prob_vent*crit*E +gamma*ihr[,2]*prob_icu*prob_vent*crit*QE -nu_ventc*ICUCV +ageing%*%ICUCV - mort*ICUCV - (1-critV)*ICUCV*1/2 - dVentdt <- gamma*ihr[,2]*prob_icu*(1-crit)*(1-critV)*prob_vent*E + gamma*ihr[,2]*prob_icu*(1-crit)*(1-critV)*prob_vent*QE +(1-critV)*VentC*1/2 +(1-critV)*ICUCV*1/2 -nu_vent*Vent +ageing%*%Vent - mort*Vent - dVentCdt <- gamma*ihr[,2]*prob_icu*prob_vent*(1-crit)*critV*E +gamma*ihr[,2]*prob_icu*prob_vent*(1-crit)*critV*QE - - (1-critV)*VentC*1/2 -nu_ventc*VentC +ageing%*%VentC - mort*VentC - - dCdt <- report*gamma*(1-age_testing_vector*ratetestE)*(1-pclin)*(1-ihr[,2])*(E+QE)+reportc*gamma*pclin*(1-age_testing_vector*ratetestE)*(1-ihr[,2])*(E+QE)+ - gamma*ihr[,2]*(1-critH)*(1-prob_icu)*(E+QE)+gamma*ihr[,2]*critH*reporth*(1-prob_icu)*(E+QE)+ - gamma*ihr[,2]*prob_icu*(E+QE)+ratetestI*age_testing_vector*I+ratetestC*age_testing_vector*CL+gamma*age_testing_vector*ratetestE*(1-ihr[,2])*E - dCMdt<- nus*pdeath_h*ifr[,2]*H + nusc*pdeath_hc*ifr[,2]*HC + nu_icu*pdeath_icu*ifr[,2]*ICU +nu_icuc*pdeath_icuc*ifr[,2]*ICUC +nu_vent*pdeath_vent*ifr[,2]*Vent +nu_ventc*pdeath_ventc*ifr[,2]*VentC +nu_ventc*pdeath_ventc*ifr[,2]*ICUCV+ - mort*H + mort*HC + mort*ICU + mort*ICUC + mort*ICUCV + mort*Vent + mort*VentC + mort*Z - dCMCdt <- nusc*pdeath_hc*ifr[,2]*HC+nu_icuc*pdeath_icuc*ifr[,2]*ICUC + nu_ventc*pdeath_ventc*ifr[,2]*VentC + nu_ventc*pdeath_ventc*ifr[,2]*ICUCV+ - mort*HC + mort*ICUC + mort*VentC + mort*ICUCV - - dZdt <- gamma*ratetestE*age_testing_vector*(1-ihr[,2])*E+ratetestI*age_testing_vector*I+ratetestC*age_testing_vector*CL-(1/isolation_days)*Z-mort*Z - - # return the rate of change - list(c(dSdt,dEdt,dIdt,dRdt,dXdt,dHdt,dHCdt,dCdt,dCMdt,dVdt,dQSdt,dQEdt,dQIdt,dQRdt,dCLdt,dQCdt,dICUdt,dICUCdt,dICUCVdt,dVentdt,dVentCdt,dCMCdt,dZdt)) - } - ) -} - -########### RUN BASELINE MODEL - start time for interventions is set to day 1e5, i.e. interventions are always off - -Y<-c(initS,initE,initI,initR,initX,initH,initHC,initC,initCM,initV, initQS, initQE, initQI, initQR, initCL, initQC, initICU, initICUC, initICUCV, initVent, initVentC, initCMC, initZ) # initial conditions for the main solution vector - - -process_ode_outcome <- function(out, iterations){ - out_min<-out$min - out_max<-out$max - out_mean<-out$mean - - critH<-c() - crit<-c() - critV<-c() - - for (i in 1:length(times)){ - critH[i]<-min(1-fH((sum(out_mean[i,(Hindex+1)]))+sum(out_mean[i,(ICUCindex+1)])+sum(out_mean[i,(ICUCVindex+1)])),1) - crit[i]<-min(1-fICU((sum(out_mean[i,(ICUindex+1)]))+(sum(out_mean[i,(Ventindex+1)]))+(sum(out_mean[i,(VentCindex+1)])))) - critV[i]<-min(1-fVent((sum(out_mean[i,(Ventindex+1)]))),1) - } - - # total population - pop1<-out_mean[,(Sindex+1)]+out_mean[,(Eindex+1)]+out_mean[,(Iindex+1)]+out_mean[,(CLindex+1)]+out_mean[,(Rindex+1)]+out_mean[,(Xindex+1)]+out_mean[,(Vindex+1)]+ - out_mean[,(Zindex+1)]+out_mean[,(QSindex+1)]+out_mean[,(QEindex+1)]+out_mean[,(QIindex+1)]+out_mean[,(QCindex+1)]+out_mean[,(QRindex+1)]+ - out_mean[,(Hindex+1)]+out_mean[,(HCindex+1)]+out_mean[,(ICUindex+1)]+out_mean[,(ICUCindex+1)]+out_mean[,(ICUCVindex+1)]+out_mean[,(Ventindex+1)]+out_mean[,(VentCindex+1)] - tpop1<-rowSums(pop1) - time<-as.Date(out_mean[,1]+startdate) - - dailyinc1<-out$mean_cases # daily incidence - cuminc1<-out$mean_cum_cases # cumulative incidence - previcureq1<-rowSums(out_mean[,(Hindex+1)])+ rowSums(out_mean[,(ICUCindex+1)])+rowSums(out_mean[,(ICUCVindex+1)]) # surge beds occupancy - previcureq21<-rowSums(out_mean[,(ICUindex+1)])+rowSums(out_mean[,(VentCindex+1)]) # icu beds occupancy - previcureq31<-rowSums(out_mean[,(Ventindex+1)]) # ventilator occupancy - cmortality1<-rowSums(out_mean[,(CMindex+1)]) # cumulative mortality - overloadH1<-rowSums(out_mean[,(HCindex+1)]) # requirement for beds - overloadICU1<-rowSums(out_mean[,(ICUCindex+1)]) # requirement for icu beds - overloadICUV1<-rowSums(out_mean[,(ICUCVindex+1)]) # requirement for ventilators - overloadVent1<-rowSums(out_mean[,(VentCindex+1)]) # requirement for ventilators - ccases1<-rowSums(out_mean[,(Cindex+1)]) # cumulative cases - reqsurge1<-rowSums(out_mean[,(Hindex+1)])+overloadH1 - reqicu1<-rowSums(out_mean[,(ICUindex+1)])+overloadICU1 - reqvent1<-rowSums(out_mean[,(Ventindex+1)])+overloadICUV1+overloadVent1 - - - ########################## CALCULATE MORTALITY - pdeath_hc<-parameters["pdeath_hc"] - prob_icu<-parameters["prob_icu"] - prob_vent<-parameters["prob_vent"] - pdeath_icuc<-parameters["pdeath_icuc"] - pdeath_ventc<-parameters["pdeath_ventc"] - - cinc_mort_H1 <- cumsum(rowSums(parameters["nus"]*parameters["pdeath_h"]*(out_mean[,(Hindex+1)]%*%ifr[,2]))) - cinc_mort_HC1 <- cumsum(rowSums(parameters["nusc"]*parameters["pdeath_hc"]*(out_mean[,(HCindex+1)]%*%ifr[,2]))) - cinc_mort_ICU1 <- cumsum(rowSums(parameters["nu_icu"]*parameters["pdeath_icu"]*out_mean[,(ICUindex+1)]%*%ifr[,2])) - cinc_mort_ICUC1 <- cumsum(rowSums(parameters["nu_icuc"]*parameters["pdeath_icuc"]*out_mean[,(ICUCindex+1)]%*%ifr[,2])) - cinc_mort_ICUCV1 <- cumsum(rowSums(parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(ICUCVindex+1)]%*%ifr[,2])) - cinc_mort_Vent1 <- cumsum(rowSums(parameters["nu_vent"]*parameters["pdeath_vent"]*out_mean[,(Ventindex+1)]%*%ifr[,2])) - cinc_mort_VentC1 <- cumsum(rowSums(parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(VentCindex+1)]%*%ifr[,2])) - base_mort_H1 <- cumsum(rowSums(out_mean[,(Hindex+1)]%*%mort)) - base_mort_HC1 <- cumsum(rowSums(out_mean[,(HCindex+1)]%*%mort)) - base_mort_ICU1 <- cumsum(rowSums(out_mean[,(ICUindex+1)]%*%mort)) - base_mort_ICUC1 <- cumsum(rowSums(out_mean[,(ICUCindex+1)]%*%mort)) - base_mort_ICUCV1 <- cumsum(rowSums(out_mean[,(ICUCVindex+1)]%*%mort)) - base_mort_Vent1 <- cumsum(rowSums(out_mean[,(Ventindex+1)]%*%mort)) - base_mort_VentC1 <- cumsum(rowSums(out_mean[,(VentCindex+1)]%*%mort)) - base_mort_S1 <- cumsum(rowSums(out_mean[,(Sindex+1)]%*%mort)) - base_mort_E1 <- cumsum(rowSums(out_mean[,(Eindex+1)]%*%mort)) - base_mort_I1 <- cumsum(rowSums(out_mean[,(Iindex+1)]%*%mort)) - base_mort_CL1 <- cumsum(rowSums(out_mean[,(CLindex+1)]%*%mort)) - base_mort_X1 <- cumsum(rowSums(out_mean[,(Xindex+1)]%*%mort)) - base_mort_QS1 <- cumsum(rowSums(out_mean[,(QSindex+1)]%*%mort)) - base_mort_QE1 <- cumsum(rowSums(out_mean[,(QEindex+1)]%*%mort)) - base_mort_QI1 <- cumsum(rowSums(out_mean[,(QIindex+1)]%*%mort)) - base_mort_QC1 <- cumsum(rowSums(out_mean[,(QCindex+1)]%*%mort)) - base_mort_QR1 <- cumsum(rowSums(out_mean[,(QRindex+1)]%*%mort)) - base_mort_R1 <- cumsum(rowSums(out_mean[,(Rindex+1)]%*%mort)) - - - # Export in a cohesive format ---- - results <- list() - results$time <- startdate + times # dates - results$Rt <- out$mean_Rt - results$cum_mortality <- round(cmortality1) # cumulative mortality - results$pct_total_pop_infected <- out$mean_infections - results$doubling_time <- round(log(2)*7 / (log(dailyinc1[2+7] / dailyinc1[2])), 2) # (Baseline only) to double the number of infections at inception - results$required_beds <- round(previcureq1) # required beds - results$saturation <- parameters["beds_available"] # saturation - results$daily_incidence <- round(dailyinc1) # daily incidence (Reported) - results$daily_total_cases <- round(out$mean_daily_infection) # daily incidence (Reported + Unreported) # daily incidence (Reported + Unreported) - results$hospital_surge_beds <- round(previcureq1) - results$icu_beds <- round(previcureq21) - results$ventilators <- round(previcureq31) - results$normal_bed_requirement <- round(reqsurge1) #real required beds. previcureq1 above is the occupancy - results$icu_bed_requirement <- round(reqicu1) - results$icu_ventilator_requirement <- round(reqvent1) - - results$death_natural_non_exposed <- round(base_mort_S1) - results$death_natural_exposed <- round(base_mort_E1 + base_mort_I1 + base_mort_CL1 + base_mort_X1 + base_mort_QS1 + - base_mort_QE1 + base_mort_QI1 + base_mort_QC1 + base_mort_QR1 + base_mort_R1+ - base_mort_H1+base_mort_HC1+base_mort_ICU1+base_mort_ICUC1+base_mort_ICUCV1+ - base_mort_Vent1+base_mort_VentC1) - results$death_treated_hospital <- round(cinc_mort_H1) - results$death_treated_icu <- round(cinc_mort_ICU1) - results$death_treated_ventilator <- round(cinc_mort_Vent1) - results$death_untreated_hospital <- round(cinc_mort_HC1) - results$death_untreated_icu <- round(cinc_mort_ICUC1) - results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) - results$attributable_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + - results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator - results$attributable_deaths_end <- last(results$attributable_deaths) - results$total_deaths <- results$attributable_deaths + results$death_natural_non_exposed + results$death_natural_exposed - results$total_deaths_end <- last(results$total_deaths) - results$total_reported_deaths_end <- last(results$cum_mortality) - results$base_mort_H <- base_mort_H1 - results$base_mort_HC <- base_mort_HC1 - results$base_mort_ICU <- base_mort_ICU1 - results$base_mort_ICUC <- base_mort_ICUC1 - results$base_mort_ICUCV <- base_mort_ICUCV1 - results$base_mort_Vent <- base_mort_Vent1 - results$base_mort_VentC <- base_mort_VentC1 - results$base_mort_S <- base_mort_S1 - results$base_mort_E <- base_mort_E1 - results$base_mort_I <- base_mort_I1 - results$base_mort_CL <- base_mort_CL1 - results$base_mort_X <- base_mort_X1 - results$base_mort_QS <- base_mort_QS1 - results$base_mort_QE <- base_mort_QE1 - results$base_mort_QI <- base_mort_QI1 - results$base_mort_QC <- base_mort_QC1 - results$base_mort_QR <- base_mort_QR1 - results$base_mort_R <- base_mort_R1 - - ## AGE DEPENDENT MORTALITY - cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out_mean[,(Hindex+1)]) - cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out_mean[,(HCindex+1)]) - cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out_mean[,(ICUindex+1)] - cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out_mean[,(ICUCindex+1)] - cinc_mort_ICUCV1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(ICUCVindex+1)] - cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out_mean[,(Ventindex+1)] - cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(VentCindex+1)] - totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_ICUCV1+cinc_mort_Vent1+cinc_mort_VentC1) - basemort_H1<-(out_mean[,(Hindex+1)]) - basemort_HC1<-(out_mean[,(HCindex+1)]) - basemort_ICU1<-(out_mean[,(ICUindex+1)]) - basemort_ICUC1<-(out_mean[,(ICUCindex+1)]) - basemort_ICUCV1<-(out_mean[,(ICUCVindex+1)]) - basemort_Vent1<-(out_mean[,(Ventindex+1)]) - basemort_VentC1<-(out_mean[,(VentCindex+1)]) - totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_ICUCV1+basemort_Vent1+basemort_VentC1) - tc<-c() - - for (i in 1:dim(cinc_mort_H1)[1]) { - for (j in 1:dim(cinc_mort_H1)[2]) { - tc<-rbind(tc,c(i, j, totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) - } - } - tc<-as.data.frame(tc) - colnames(tc)<-c("Day","Age","value") - - results$tc <- tc %>% - mutate(Date = startdate + Day, - age_cat = case_when( - Age >= 1 & Age <= 6 ~ "≤ 30 y.o.", - Age > 6 & Age <= 8 ~ "30-40 y.o.", - Age > 8 & Age <= 10 ~ "40-50 y.o.", - Age > 10 & Age <= 12 ~ "50-60 y.o.", - Age > 12 & Age <= 14 ~ "60-70 y.o.", - Age >= 15 ~ "≥ 70 y.o.")) %>% - mutate(age_cat = factor(age_cat, levels = rev(c("≤ 30 y.o.", "30-40 y.o.", - "40-50 y.o.", "50-60 y.o.", "60-70 y.o.", "≥ 70 y.o.")))) - - mortality_lag <- data.frame(Age = popstruc$agefloor) - if(nrow(out_mean) >= 30) mortality_lag <- bind_cols(mortality_lag, - data.frame(day30 = out_mean[30,CMindex+1]/out_mean[30,Cindex+1]) %>% - mutate(day30 = ifelse(is.infinite(day30), 0, day30)) %>% - rename(`Day 30` = day30)) - if(nrow(out_mean) >= 60) mortality_lag <- bind_cols(mortality_lag, - data.frame(day60 = out_mean[60,CMindex+1]/out_mean[60,Cindex+1]) %>% - mutate(day60 = ifelse(is.infinite(day60), 0, day60)) %>% - rename(`Day 60` = day60)) - if(nrow(out_mean) >= 90) mortality_lag <- bind_cols(mortality_lag, - data.frame(day90 = out_mean[90,CMindex+1]/out_mean[90,Cindex+1]) %>% - mutate(day90 = ifelse(is.infinite(day90), 0, day90)) %>% - rename(`Day 90` = day90)) - if(nrow(out_mean) >= 120) mortality_lag <- bind_cols(mortality_lag, - data.frame(day120 = out_mean[120,CMindex+1]/out_mean[120,Cindex+1]) %>% - mutate(day120 = ifelse(is.infinite(day120), 0, day120)) %>% - rename(`Day 120` = day120)) - - results$mortality_lag <- mortality_lag - - - if(iterations>1){ - - previcureq1_max<-rowSums(out_max[,(Hindex+1)])+ rowSums(out_max[,(ICUCindex+1)])+rowSums(out_max[,(ICUCVindex+1)]) # surge beds occupancy - previcureq21_max<-rowSums(out_max[,(ICUindex+1)])+rowSums(out_max[,(VentCindex+1)]) # icu beds occupancy - previcureq31_max<-rowSums(out_max[,(Ventindex+1)]) # ventilator occupancy - cmortality1_max<-rowSums(out_max[,(CMindex+1)]) # cumulative mortality - overloadH1_max<-rowSums(out_max[,(HCindex+1)]) # requirement for beds - overloadICU1_max<-rowSums(out_max[,(ICUCindex+1)]) # requirement for icu beds - overloadICUV1_max<-rowSums(out_max[,(ICUCVindex+1)]) # requirement for ventilators - overloadVent1_max<-rowSums(out_max[,(VentCindex+1)]) # requirement for ventilators - ccases1_max<-rowSums(out_max[,(Cindex+1)]) # cumulative cases - reqsurge1_max<-rowSums(out_max[,(Hindex+1)])+overloadH1 # surge beds total requirements - reqicu1_max<-rowSums(out_max[,(ICUindex+1)])+overloadICU1 # ICU beds total requirements - reqvent1_max<-rowSums(out_max[,(Ventindex+1)])+overloadICUV1+overloadVent1 # ventilator beds total requirements - - previcureq1_min<-rowSums(out_min[,(Hindex+1)])+ rowSums(out_min[,(ICUCindex+1)])+rowSums(out_min[,(ICUCVindex+1)]) # surge beds occupancy - previcureq21_min<-rowSums(out_min[,(ICUindex+1)])+rowSums(out_min[,(VentCindex+1)]) # icu beds occupancy - previcureq31_min<-rowSums(out_min[,(Ventindex+1)]) # ventilator occupancy - cmortality1_min<-rowSums(out_min[,(CMindex+1)]) # cumulative mortality - overloadH1_min<-rowSums(out_min[,(HCindex+1)]) # requirement for beds - overloadICU1_min<-rowSums(out_min[,(ICUCindex+1)]) # requirement for icu beds - overloadICUV1_min<-rowSums(out_min[,(ICUCVindex+1)]) # requirement for ventilators - overloadVent1_min<-rowSums(out_min[,(VentCindex+1)]) # requirement for ventilators - ccases1_min<-rowSums(out_min[,(Cindex+1)]) # cumulative cases - reqsurge1_min<-rowSums(out_min[,(Hindex+1)])+overloadH1 # surge beds total requirements - reqicu1_min<-rowSums(out_min[,(ICUindex+1)])+overloadICU1 # ICU beds total requirements - reqvent1_min<-rowSums(out_min[,(Ventindex+1)])+overloadICUV1+overloadVent1 # ventilator beds total requirements - - results$Rt_max <- out$max_Rt - results$Rt_min <- out$min_Rt - - results$daily_incidence_max <- out$max_cases - results$daily_incidence_min <- out$min_cases - - results$daily_total_cases_max <- out$max_daily_infection - results$daily_total_cases_min <- out$min_daily_infection - - results$total_reported_deaths_end_min <- last(cmortality1_min) - results$total_reported_deaths_end_max <- last(cmortality1_max) - - results$pct_total_pop_infected_min <- out$min_infections # proportion of the population that has been infected at the end of the simulation - results$pct_total_pop_infected_max <- out$max_infections # proportion of the population that has been infected at the end of the simulation - } - return(results) -} - -# covidOdeCpp_reset() -# out <- ode(y = Y, times = times, func = covidOdeCpp, parms = parameters, -# input=vectors, A=A, -# contact_home=contact_home, contact_school=contact_school, -# contact_work=contact_work, contact_other=contact_other, -# popbirth_col2=popbirth[,2], popstruc_col2=popstruc[,2], -# ageing=ageing, -# ifr_col2=ifr[,2], ihr_col2=ihr[,2], mort_col=mort) - -multi_runs<-function(Y,times,parameters,input,iterations,noise,confidence){ - - results <- list() - aux<-array(0, dim=c(length(times),23*A+1,iterations)) - results$mean<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$min<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$max<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$mean_cases<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$min_cases<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$max_cases<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$mean_cum_cases<-matrix(0,nrow = length(times),ncol = 1) - results$min_cum_cases<-matrix(0,nrow = length(times),ncol = 1) - results$max_cum_cases<-matrix(0,nrow = length(times),ncol = 1) - results$mean_daily_infection<-matrix(0,nrow = length(times),ncol = 1) - results$min_daily_infection<-matrix(0,nrow = length(times),ncol = 1) - results$max_daily_infection<-matrix(0,nrow = length(times),ncol = 1) - cases<-matrix(0, nrow=length(times),ncol=iterations) - cum_cases<-matrix(0, nrow=length(times),ncol=iterations) - day_infections<-matrix(0, nrow=length(times),ncol=iterations) - Rt_aux<-matrix(0, nrow=length(times),ncol=iterations) - infections<-matrix(0, nrow=iterations,ncol=1) - Rt <- NULL - - param_vector<-parameters - if(iterations>1){ - for (i in 1:iterations){ - param_vector[parameters_noise]<-parameters[parameters_noise]+rnorm(length(parameters_noise),mean=0,sd=noise*abs(parameters[parameters_noise])) - out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = param_vector, input=vectors0) - aux[,,i]<-out0 - - critH<-c() - crit<-c() - critV<-c() - for (ii in 1:length(times)){ - critH[ii]<-min(1-fH((sum(out0[ii,(Hindex+1)]))+sum(out0[ii,(ICUCindex+1)])+sum(out0[ii,(ICUCVindex+1)])),1) - crit[ii]<-min(1-fICU((sum(out0[ii,(ICUindex+1)]))+(sum(out0[ii,(Ventindex+1)]))+(sum(out0[ii,(VentCindex+1)])))) - critV[ii]<-min(1-fVent((sum(out0[ii,(Ventindex+1)]))),1) - } - - # daily incidence - incidence<-param_vector["report"]*param_vector["gamma"]*(1-param_vector["pclin"])*out0[,(Eindex+1)]%*%(1-ihr[,2])+ - param_vector["reportc"]*param_vector["gamma"]*param_vector["pclin"]*out0[,(Eindex+1)]%*%(1-ihr[,2])+ - param_vector["report"]*param_vector["gamma"]*(1-param_vector["pclin"])*out0[,(QEindex+1)]%*%(1-ihr[,2])+ - param_vector["reportc"]*param_vector["gamma"]*param_vector["pclin"]*out0[,(QEindex+1)]%*%(1-ihr[,2]) - - incidenceh<- param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*(1-critH)*(1-param_vector["prob_icu"])*param_vector["reporth"]+ - param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*(1-critH)*(1-param_vector["prob_icu"])*(1-param_vector["reporth"])+ - param_vector["gamma"]*out0[,(QEindex+1)]%*%ihr[,2]*(1-critH)*(1-param_vector["prob_icu"])+ - param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*critH*param_vector["reporth"]*(1-param_vector["prob_icu"])+ - param_vector["gamma"]*out0[,(QEindex+1)]%*%ihr[,2]*critH*param_vector["reporth"]*(1-param_vector["prob_icu"])+ - param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*param_vector["prob_icu"]+ - param_vector["gamma"]*out0[,(QEindex+1)]%*%ihr[,2]*param_vector["prob_icu"] - - cases[,i]<-(rowSums(incidence)+rowSums(incidenceh)) # daily incidence cases - cum_cases[,i]<-colSums(incidence)+colSums(incidenceh) # cumulative incidence cases - day_infections[,i]<- round(rowSums(param_vector["gamma"]*out0[,(Eindex+1)]+param_vector["gamma"]*out0[,(QEindex+1)])) - - # daily infections - infections[i] <- round(100*tail(cumsum(rowSums(param_vector["gamma"]*out0[,(Eindex+1)])),1)/sum(popstruc[,2]), 1) # proportion of the population that has been infected at the end of the simulation - for (w in (ceiling(1/param_vector["nui"])+1):length(times)){ - Rt_aux[w,i]<-cumsum(sum(param_vector["gamma"]*out0[w,(Eindex+1)]))/cumsum(sum(param_vector["gamma"]*out0[(w-1/param_vector["nui"]),(Eindex+1)])) - if(Rt_aux[w,i] >= 7) {Rt_aux[w,i] <- NA} - } - } - qq <- quantile(infections, c(confidence, 0.5, (1-confidence))) - results$mean_infections<-qq[2] - results$min_infections<-qq[1] - results$max_infections<-qq[3] - - for(i in 1:length(out0[,1])){ - qq <- quantile(cases[i,], c(confidence, 0.5, (1-confidence))) - results$mean_cases[i]<-qq[2] - results$min_cases[i]<-qq[1] - results$max_cases[i]<-qq[3] - - qq <- quantile(cum_cases[i,], c(confidence, 0.5, (1-confidence))) - results$mean_cum_cases[i]<-qq[2] - results$min_cum_cases[i]<-qq[1] - results$max_cum_cases[i]<-qq[3] - - qq <- quantile(day_infections[i,], c(confidence, 0.5, (1-confidence))) - results$mean_daily_infection[i]<-qq[2] - results$min_daily_infection[i]<-qq[1] - results$max_daily_infection[i]<-qq[3] - - qq <- quantile(Rt_aux[i,], c(confidence, 0.5, (1-confidence)),na.rm = T) - results$mean_Rt[i]<-qq[2] - results$min_Rt[i]<-qq[1] - results$max_Rt[i]<-qq[3] - - for (j in 1:length(out0[1,])){ - qq <- quantile(aux[i,j,], c(confidence, 0.5, (1-confidence))) - results$mean[i,j]<-qq[2] - results$min[i,j]<-qq[1] - results$max[i,j]<-qq[3] - } - } - }else{ - results$mean <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) - } - return(results) -} -out0 <-multi_runs(Y, times, parameters, vectors0, iterations, noise, confidence) -out0$min_infections -out0$max_infections - -plot(times,rowSums(out0$mean[,Iindex+1]),type = 'l') -polygon(c(times, rev(times)), c(rowSums(out0$max[,Iindex+1]), rev(rowSums(out0$min[,Iindex+1]))), - col=rgb(0, 0, 0,0.25), border = NA) - -plot(times,out0$mean_Rt,type = 'l') -polygon(c(times, rev(times)), c(out0$max_Rt, rev(out0$min_Rt)), - col=rgb(0, 0, 0,0.25), border = NA) - - -# out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) -# out <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors) - -simul_baseline <- process_ode_outcome(out0,iterations) -# # write.csv(simul_baseline, paste0(hilo,"_baseline_",gsub(":|-","",Sys.time()),".csv")) -# -#future interventions -#extend travel ban, quarantine, hand washing, cocooning the elderly until 1st July -out <-multi_runs(Y, times, parameters, vectors, iterations, noise, confidence) -simul_interventions <- process_ode_outcome(out,iterations) -# write.csv(simul_interventions, paste0(hilo,"_futureIntv_",gsub(":|-","",Sys.time()),".csv")) - -pop1<-out$mean[,(Sindex+1)]+out$mean[,(Eindex+1)]+out$mean[,(Iindex+1)]+out$mean[,(CLindex+1)]+out$mean[,(Rindex+1)]+out$mean[,(Xindex+1)]+out$mean[,(Vindex+1)]+ - out$mean[,(Zindex+1)]+out$mean[,(QSindex+1)]+out$mean[,(QEindex+1)]+out$mean[,(QIindex+1)]+out$mean[,(QCindex+1)]+out$mean[,(QRindex+1)]+ - out$mean[,(Hindex+1)]+out$mean[,(HCindex+1)]+out$mean[,(ICUindex+1)]+out$mean[,(ICUCindex+1)]+out$mean[,(ICUCVindex+1)]+out$mean[,(Ventindex+1)]+out$mean[,(VentCindex+1)] -tpop1<-rowSums(pop1) - -############# PLOTTING -# Fitting tab -# fitting the intervention lines to the data to account for any historical interventions -time<-as.Date(out0$mean[,1]+startdate) -par(mfrow=c(1,2)) -# set up the axis limits -xmin<-min(as.Date(cases_rv[,1])) -xmax<-max(as.Date(cases_rv[,1])) -ymax<-max(cases_rv[,2],na.rm = T) -xtick<-seq(xmin, xmax, by=7) -plot(time,simul_interventions$daily_incidence,type='l',lwd=3, - main="New Reported Cases", xlab="Date", ylab="Cases per day", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -axis(side=1, labels = FALSE) -text(x=xtick, y=-250, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - -# reset the maximum to the cumulative mortality -ymax<-max(cases_rv[,3],na.rm = T) -plot(time,simul_interventions$cum_mortality,type='l',lwd=3, - main="Cumulative Mortality", xlab="Date", ylab="Total deaths", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -text(x=xtick, y=-100, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,3],pch=19,col='red') - - -### Predictions tab -par(mfrow=c(1,2)) -### Cases at baseline and intervention -ymax<-max(c(cases_rv[,2],simul_baseline$daily_incidence,simul_interventions$daily_incidence),na.rm=T) -plot(time,simul_baseline$daily_incidence,type='l',lwd=3,col='blue', - main="Baseline", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') -plot(time,simul_interventions$daily_incidence,type='l',lwd=3,col='blue', - main="Intervention", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - - - -# # # Hospital prevalences stratified by H,ICU and Vent -ymax<-max(c((simul_baseline$hospital_surge_beds+simul_baseline$icu_beds+simul_baseline$ventilators),(simul_interventions$hospital_surge_beds+simul_interventions$icu_beds+simul_interventions$ventilators))) -time<-as.Date(out0$mean[,1]+startdate) -coul=c("#047883", "#24A9E2","#051A46") -DM<-as.data.frame(cbind(time,simul_baseline$hospital_surge_beds,simul_baseline$icu_beds,simul_baseline$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time,origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d0<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -DM<-as.data.frame(cbind(time,simul_interventions$hospital_surge_beds,simul_interventions$icu_beds,simul_interventions$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -grid.arrange(d0+ylab("Number of Patients")+ - ggtitle("Baseline")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - d1+ylab("Number of Patients")+ - ggtitle("Intervention")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - nrow = 1) - - -# # # Cumulative mortality at baseline and intervention stratified by hospital status -ymax<-max(c((simul_baseline$total_deaths),(simul_interventions$total_deaths))) -time<-as.Date(out$mean[,1]+startdate) -coul=c("#047883", "#24A9E2","#051A46","#E68029", "#D63304","#D1D604") -DM0<-as.data.frame(cbind(time,simul_baseline$base_mort_I+simul_baseline$base_mort_QI, - simul_baseline$base_mort_CL+simul_baseline$base_mort_QC, - simul_baseline$base_mort_X, - simul_baseline$base_mort_S+simul_baseline$base_mort_QS, - simul_baseline$base_mort_E+simul_baseline$base_mort_QE, - simul_baseline$base_mort_QR+simul_baseline$base_mort_R, - simul_baseline$death_treated_hospital, - simul_baseline$death_treated_icu, - simul_baseline$death_treated_ventilator, - simul_baseline$death_untreated_hospital, - simul_baseline$death_untreated_icu, - simul_baseline$death_untreated_ventilator)) -colnames(DM0)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM0$Time<-as.Date(DM0$Time, origin = "1970-01-01") -DMF0<-melt(DM0, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m0<-ggplot(DMF0, aes(x = Time, y = value,fill=variable)) + - geom_area() - -DM<-as.data.frame(cbind(time,simul_interventions$base_mort_I+simul_interventions$base_mort_QI,simul_interventions$base_mort_CL+simul_interventions$base_mort_QC,simul_interventions$base_mort_X,simul_interventions$base_mort_S+ - simul_interventions$base_mort_QS,simul_interventions$base_mort_E+simul_interventions$base_mort_QE,simul_interventions$base_mort_QR+simul_interventions$base_mort_R, - simul_interventions$death_treated_hospital,simul_interventions$death_treated_icu,simul_interventions$death_treated_ventilator,simul_interventions$death_untreated_hospital,simul_interventions$death_untreated_icu,simul_interventions$death_untreated_ventilator)) -colnames(DM)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area() -grid.arrange(m0+ylab("Cumulatice mortality")+ - ggtitle("Baseline")+ - ylim(0, ymax), - m1+ylab("Cumulatice mortality")+ - ggtitle("Intervention")+ - ylim(0, ymax), - nrow = 1) - - - -# Estimated basic reproduction number, R_t -par(mfrow=c(1,2)) -ymax<-max(c(simul_baseline$Rt[!is.na(simul_baseline$Rt)],simul_interventions$Rt[!is.na(simul_interventions$Rt)])) -plot(time,simul_baseline$Rt,type='l',lwd=3,col='black', - main="Baseline", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -lines(time,simul_baseline$Rt/simul_baseline$Rt,lwd=2,col='grey') -plot(time,simul_interventions$Rt,type='l',lwd=3,col='black', - main="Intervention", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -lines(time,simul_interventions$Rt/simul_interventions$Rt,lwd=2,col='grey') - - -# ## Predicted ifr -# ymax=max(c(simul_baseline$MORT1$value,simul_interventions$MORT1$value)) -# gm<-ggplot(data=simul_interventions$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_interventions$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") -# gm0<-ggplot(data=simul_baseline$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_baseline$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") -# -# grid.arrange(gm+theme_classic(), -# gm0+theme_classic(), -# nrow=1) - - -# ## AGE DEPENDENT MORTALITY -# cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out$mean[,(Hindex+1)]) -# cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out$mean[,(HCindex+1)]) -# cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out$mean[,(ICUindex+1)] -# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out$mean[,(ICUCindex+1)] -# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out$mean[,(Ventindex+1)] -# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out$mean[,(VentCindex+1)] -# totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_Vent1+cinc_mort_VentC1) -# basemort_H1<-(out$mean[,(Hindex+1)]) -# basemort_HC1<-(out$mean[,(HCindex+1)]) -# basemort_ICU1<-(out$mean[,(ICUindex+1)]) -# basemort_ICUC1<-(out$mean[,(ICUCindex+1)]) -# basemort_Vent1<-(out$mean[,(Ventindex+1)]) -# basemort_VentC1<-(out$mean[,(VentCindex+1)]) -# totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_Vent1+basemort_VentC1) -# tc<-c() -# ages<-seq(0,100,by=5) -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc<-rbind(tc,c(i,ages[j],totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) -# } -# } -# tc<-as.data.frame(tc) -# colnames(tc)<-c("Day","Age","value") -# tc$Age<-as.factor(tc$Age) -# p6<-ggplot(data=tc, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ -# ylab("Proportion of deaths") -# -# inc_mort_H0 <- parameters["nus"]*parameters["pdeath_h"]*(out0$mean[,(Hindex+1)]) -# inc_mort_HC0 <- parameters["nusc"]*parameters["pdeath_hc"]*(out0$mean[,(HCindex+1)]) -# inc_mort_ICU0 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out0$mean[,(ICUindex+1)] -# inc_mort_ICUC0 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out0$mean[,(ICUCindex+1)] -# inc_mort_Vent0 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out0$mean[,(Ventindex+1)] -# inc_mort_VentC0 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out0$mean[,(VentCindex+1)] -# totage0<-as.data.frame(inc_mort_H0+inc_mort_HC0+inc_mort_ICU0+inc_mort_ICUC0+inc_mort_Vent0+inc_mort_VentC0) -# basemort_H0<-(out0$mean[,(Hindex+1)]) -# basemort_HC0<-(out0$mean[,(HCindex+1)]) -# basemort_ICU0<-(out0$mean[,(ICUindex+1)]) -# basemort_ICUC0<-(out0$mean[,(ICUCindex+1)]) -# basemort_Vent0<-(out0$mean[,(Ventindex+1)]) -# basemort_VentC0<-(out0$mean[,(VentCindex+1)]) -# totbase0<-as.data.frame(basemort_H0+basemort_HC0+basemort_ICU0+basemort_ICUC0+basemort_Vent0+basemort_VentC0) -# tc0<-c() -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc0<-rbind(tc0,c(i,ages[j],totage0[i,j]*ifr[j,2]+totbase0[i,j]*mort[j])) -# } -# } -# tc0<-as.data.frame(tc0) -# colnames(tc0)<-c("Day","Age","value") -# tc0$Age<-as.factor(tc0$Age) -# p16<-ggplot(data=tc0, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ylab("Proportion of deaths") - -# grid.arrange(p16+theme_minimal(), -# p6+theme_minimal(), -# nrow=1) -# - - -# -# -# -# ######################################################################################################################### -# ##### SUMMARY METRICS ################################################################################################ -# ####################################################################################################################### -# -infected0<-tail((rowSums(out0$mean[,(Rindex+1)])),1)/sum(popstruc[,2]) -infected0 -infected1<-tail((rowSums(out$mean[,(Rindex+1)])),1)/sum(popstruc[,2]) -infected1 - -# # #Population size checks -# # tpop1 -# # tpop0 -# -# # PCR -# time_of_measurement<-40:49 -# # general population -# (rowSums(out$mean[time_of_measurement,Iindex+1])+rowSums(out$mean[time_of_measurement,CLindex+1])+rowSums(out$mean[time_of_measurement,QIindex+1])+ -# rowSums(out$mean[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# # every infection including hospital infections -# (rowSums(out$mean[time_of_measurement,Iindex+1])+rowSums(out$mean[time_of_measurement,CLindex+1])+rowSums(out$mean[time_of_measurement,Hindex+1])+ -# rowSums(out$mean[time_of_measurement,ICUindex+1])+rowSums(out$mean[time_of_measurement,Ventindex+1])+rowSums(out$mean[time_of_measurement,HCindex+1])+ -# rowSums(out$mean[time_of_measurement,ICUCindex+1])+rowSums(out$mean[time_of_measurement,VentCindex+1])+rowSums(out$mean[time_of_measurement,QIindex+1])+ -# rowSums(out$mean[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# -# SEROLOGY -tail((rowSums(out$mean[,(Rindex+1)])),1)/sum(popstruc[,2]) - -# IHR -sum(ihr$severe*popstruc[,2]/sum(popstruc[,2])) - - -# # PORPORTIONAL MORTALITY IN THE ELDEST -# m30<-out0$mean[30,CMindex+1]/(out0$mean[30,Cindex+1]) -# m30[is.infinite(m30)]<-0 -# m60<-out0$mean[60,CMindex+1]/out0$mean[60,Cindex+1] -# m60[is.infinite(m60)]<-0 -# m90<-out0$mean[90,CMindex+1]/out0$mean[90,Cindex+1] -# m90[is.infinite(m90)]<-0 -# m120<-out0$mean[120,CMindex+1]/out0$mean[120,Cindex+1] -# m120[is.infinite(m120)]<-0 -# -# ifr30<-sum(m30*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr60<-sum(m60*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr90<-sum(m90*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr120<-sum(m120*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# cbind(ifr30,ifr60,ifr90,ifr120)*100 -# -# PMORTDF0<-as.data.frame(cbind(out0$mean[30,CMindex+1]/sum(out0$mean[30,CMindex+1]),out0$mean[60,CMindex+1]/sum(out0$mean[60,CMindex+1]), -# out0$mean[90,CMindex+1]/sum(out0$mean[90,CMindex+1]),out0$mean[120,CMindex+1]/sum(out0$mean[120,CMindex+1]))) -# PMORTDF<-as.data.frame(cbind(out$mean[30,CMindex+1]/sum(out$mean[30,CMindex+1]),out$mean[60,CMindex+1]/sum(out$mean[60,CMindex+1]), -# out$mean[90,CMindex+1]/sum(out$mean[90,CMindex+1]),out$mean[120,CMindex+1]/sum(out$mean[120,CMindex+1]))) -# sum(PMORTDF0$V2[15:21]) -# sum(PMORTDF$V2[15:21]) - - -# output doubling time over time first 7 days -# dd<-7 -# doub0<-log(2)*dd/(log(dailyinc0[2+dd]/dailyinc0[2])) -# doub0 -# -# -# - - diff --git a/r_versions/covidage_v14.4.R b/r_versions/covidage_v14.4.R deleted file mode 100644 index 159634d..0000000 --- a/r_versions/covidage_v14.4.R +++ /dev/null @@ -1,1706 +0,0 @@ -require("deSolve") -library("ggplot2") -library("dplyr") -library("reshape2") -require(gridExtra) -library(ggpubr) -library(bsplus) -library(deSolve) -library(DT) -library(highcharter) -library(lubridate) -library(pushbar) -library(readxl) -library(reshape2) -library(scales) -library(shiny) -library(shinyBS) -library(shinycssloaders) -library(shinyhelper) -library(shinythemes) -library(shinyWidgets) -library(tidyverse) -library(XLConnect) -# library("comoOdeCpp") - -#read data from excel file -setwd("C:/covid19/covid_age") -load("data_CoMo.RData") -file_path <- paste0(getwd(),"/Template_CoMoCOVID-19App_new.xlsx") -country_name<-"Cambodia" - -# Cases -dta <- read_excel(file_path, sheet = "Cases") -names(dta) <- c("date", "cases", "deaths") - -cases_rv <- dta %>% - mutate(date = as.Date(date), cumulative_death = cumsum(deaths)) %>% - as.data.frame() - -# Severity/Mortality -dta <- read_excel(file_path, sheet = "Severity-Mortality") -names(dta) <- c("age_category", "ifr", "ihr") - -mort_sever_rv <- dta %>% - mutate(ihr = ihr/100) %>% # starting unit should be % - scaling to a value between 0 and 1 - mutate(ifr = ifr/max(ifr)) # starting unit should be % - scaling to a value between 0 and 1 - -# Population -dta <- read_excel(file_path, sheet = "Population") -names(dta) <- c("age_category", "pop", "birth", "death") - -population_rv <- dta %>% - transmute(country = NA, age_category, pop, birth, death) - -# Parameters -param <- bind_rows(read_excel(file_path, sheet = "Parameters"), - read_excel(file_path, sheet = "Country Area Param"), - read_excel(file_path, sheet = "Virus Param"), - read_excel(file_path, sheet = "Hospitalisation Param"), - read_excel(file_path, sheet = "Interventions Param"), - read_excel(file_path, sheet = "Interventions")) %>% - mutate(Value_Date = as.Date(Value_Date)) - -# START Bridge ---- -popstruc <- population_rv %>% - select(age_category, pop) %>% - rename(agefloor = age_category) %>% - as.data.frame() - -popbirth <- population_rv %>% - select(age_category, birth) %>% - as.data.frame() # unit should be per person per day - -mort <- population_rv %>% - pull(death) # unit should be per person per day - -ihr <- mort_sever_rv %>% - select(age_category, ihr) %>% - as.data.frame() - -ifr <- mort_sever_rv %>% - select(age_category, ifr) %>% - as.data.frame() - - -######### POP AGEING -# per year ageing matrix -A<-length(popstruc[,2]) -dd<-seq(1:A)/seq(1:A) -ageing <- t(diff(diag(dd),lag=1)/(5*365.25)) -ageing<-cbind(ageing,0*seq(1:A)) # no ageing from last compartment - -# -pop<-population$country==country_name -pp<-population$pop[pop] -### CONTACT MATRICES -c_home <- contact_home[[country_name]] %>% as.matrix() -c_school <- contact_school[[country_name]] %>% as.matrix() -c_work <- contact_work[[country_name]] %>% as.matrix() -c_other <- contact_other[[country_name]] %>% as.matrix() -nce <-A-length(c_home[1,]) - -contact_home<-matrix(0,nrow=A,ncol=A) -contact_school<-matrix(0,nrow=A,ncol=A) -contact_work<-matrix(0,nrow=A,ncol=A) -contact_other<-matrix(0,nrow=A,ncol=A) - -for (i in 1:(A-nce)){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[i,j] - contact_school[i,j]<-c_school[i,j] - contact_work[i,j]<-c_work[i,j] - contact_other[i,j]<-c_other[i,j] - } -} - -for (i in (A+1-nce):A){ - for (j in 1:(A-nce)){ - contact_home[i,j]<-c_home[(A-nce),j] - contact_school[i,j]<-c_school[(A-nce),j] - contact_work[i,j]<-c_work[(A-nce),j] - contact_other[i,j]<-c_other[(A-nce),j] - } -} -for (i in 1:(A-nce)){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[i,(A-nce)] - contact_school[i,j]<-c_school[i,(A-nce)] - contact_work[i,j]<-c_work[i,(A-nce)] - contact_other[i,j]<-c_other[i,(A-nce)] - } -} -for (i in (A+1-nce):A){ - for (j in (A+1-nce):A){ - contact_home[i,j]<-c_home[(A-nce),(A-nce)] - contact_school[i,j]<-c_school[(A-nce),(A-nce)] - contact_work[i,j]<-c_work[(A-nce),(A-nce)] - contact_other[i,j]<-c_other[(A-nce),(A-nce)] - } -} - - - -######### INITIALISE SIMULATION/INTERVENTION START TIMES -startdate <- param$Value_Date[param$Parameter == "date_range_simul_start"] -stopdate <- param$Value_Date[param$Parameter == "date_range_simul_end"] -startdate <- startdate[1] -stopdate <- stopdate[1] - - -day_start <- as.numeric(startdate-startdate) -day_stop <- as.numeric(stopdate-startdate) -times <- seq(day_start, day_stop) - -tin<-as.numeric(startdate-as.Date("2020-01-01"))/365.25 -initP<-sum(popstruc[,2]) # population size -ageindcase<-20 # age of index case (years) -aci <- floor((ageindcase/5)+1) # age class of index case - - -############# DEFINE PARAMETERS -parameters <- c( - ### Transmission instrinsic - p = param$Value[param$Parameter=="p"][1], - rho = param$Value[param$Parameter=="rho"][1], - omega = param$Value[param$Parameter=="omega"][1], - gamma = param$Value[param$Parameter=="gamma"][1], - nui = param$Value[param$Parameter=="nui"][1], - report = param$Value[param$Parameter=="report"][1], - reportc = param$Value[param$Parameter=="reportc"][1], - reporth = param$Value[param$Parameter=="reporth"][1], - beds_available = param$Value[param$Parameter=="beds_available"][1], - icu_beds_available = param$Value[param$Parameter=="icu_beds_available"][1], - ventilators_available = param$Value[param$Parameter=="ventilators_available"][1], - give = 95, - pdeath_h = param$Value[param$Parameter=="pdeath_h"][1], - pdeath_hc = param$Value[param$Parameter=="pdeath_hc"][1], - pdeath_icu = param$Value[param$Parameter=="pdeath_icu"][1], - pdeath_icuc = param$Value[param$Parameter=="pdeath_icuc"][1], - pdeath_vent = param$Value[param$Parameter=="pdeath_vent"][1], - pdeath_ventc = param$Value[param$Parameter=="pdeath_ventc"][1], - ihr_scaling = param$Value[param$Parameter=="ihr_scaling"][1], - nus = param$Value[param$Parameter=="nus"][1], - nusc = param$Value[param$Parameter=="nus"][1], # nusc = nus - nu_icu = param$Value[param$Parameter=="nu_icu"][1], - nu_icuc = param$Value[param$Parameter=="nu_icu"][1], # nu_icuc = nu_icu - nu_vent = param$Value[param$Parameter=="nu_vent"][1], - nu_ventc = param$Value[param$Parameter=="nu_vent"][1], # nu_ventc = nu_vent - rhos = param$Value[param$Parameter=="rhos"][1], - amp = param$Value[param$Parameter=="amp"][1], - phi = param$Value[param$Parameter=="phi"][1], - pclin = param$Value[param$Parameter=="pclin"][1], - prob_icu = param$Value[param$Parameter=="prob_icu"][1], - prob_vent = param$Value[param$Parameter=="prob_vent"][1], - - ### INTERVENTIONS - # self isolation - selfis_eff = mean(param$Value[param$Parameter=="selfis_eff"],na.rm=T), - # social distancing - dist_eff = mean(param$Value[param$Parameter=="dist_eff"],na.rm=T), - # hand washing - hand_eff = mean(param$Value[param$Parameter=="hand_eff"],na.rm=T), - # working at home - work_eff = mean(param$Value[param$Parameter=="work_eff"],na.rm=T), - w2h = mean(param$Value[param$Parameter=="w2h"],na.rm=T), - # school closures - school_eff = mean(param$Value[param$Parameter=="school_eff"],na.rm=T), - s2h = mean(param$Value[param$Parameter=="s2h"],na.rm=T), - # cocooning the elderly - cocoon_eff = mean(param$Value[param$Parameter=="cocoon_eff"],na.rm=T), - age_cocoon = mean(param$Value[param$Parameter=="age_cocoon"],na.rm=T), - # vaccination campaign - # vaccine_on = as.numeric(param$Value_Date[param$Parameter=="date_vaccine_on"] - startdate), - vaccine_eff = mean(param$Value[param$Parameter=="vaccine_eff"],na.rm=T), - age_vaccine_min = mean(param$Value[param$Parameter=="age_vaccine_min"],na.rm=T), - # vaccine_cov = param$Value[param$Parameter=="vaccine_cov"], - vac_campaign = mean(param$Value[param$Parameter=="vac_campaign"],na.rm=T), - # travel ban - mean_imports = mean(param$Value[param$Parameter=="mean_imports"],na.rm=T), - # screening - screen_test_sens = mean(param$Value[param$Parameter=="screen_test_sens"],na.rm=T), - # screen_contacts = mean(param$Value[param$Parameter=="screen_contacts"],na.rm=T), - screen_overdispersion = mean(param$Value[param$Parameter=="screen_overdispersion"],na.rm=T), - # voluntary home quarantine - quarantine_days = mean(param$Value[param$Parameter=="quarantine_days"],na.rm=T), - quarantine_effort = mean(param$Value[param$Parameter=="quarantine_effort"],na.rm=T), - quarantine_eff_home = mean(param$Value[param$Parameter=="quarantine_eff_home"],na.rm=T), - quarantine_eff_other = mean(param$Value[param$Parameter=="quarantine_eff_other"],na.rm=T), - # mass testing - age_testing_min = mean(param$Value[param$Parameter=="age_testing_min"],na.rm=T), - age_testing_max = mean(param$Value[param$Parameter=="age_testing_max"],na.rm=T), - mass_test_sens = mean(param$Value[param$Parameter=="mass_test_sens"],na.rm=T), - isolation_days = mean(param$Value[param$Parameter=="isolation_days"],na.rm=T), - - household_size = param$Value[param$Parameter=="household_size"][1], - noise = param$Value[param$Parameter=="noise"][1], - iterations = param$Value[param$Parameter=="iterations"][1], - confidence = param$Value[param$Parameter=="confidence"][1] -) -ihr[,2]<- parameters["ihr_scaling"]*ihr[,2] - -# Scale parameters to percentages/ rates -parameters["rho"]<-parameters["rho"]/100 -parameters["omega"]<-(1/(parameters["omega"]*365)) -parameters["gamma"]<-1/parameters["gamma"] -parameters["nui"]<-1/parameters["nui"] -parameters["report"]<-parameters["report"]/100 -parameters["reportc"]<-parameters["reportc"]/100 -parameters["reporth"]<-parameters["reporth"]/100 -parameters["nus"]<-1/parameters["nus"] -parameters["rhos"]<-parameters["rhos"]/100 -parameters["amp"]<-parameters["amp"]/100 -parameters["selfis_eff"]<-parameters["selfis_eff"]/100 -parameters["dist_eff"]<-parameters["dist_eff"]/100 -parameters["hand_eff"]<-parameters["hand_eff"]/100 -parameters["work_eff"]<-parameters["work_eff"]/100 -parameters["w2h"]<-parameters["w2h"]/100 -parameters["school_eff"]<-parameters["school_eff"]/100 -parameters["s2h"]<-parameters["s2h"]/100 -parameters["cocoon_eff"]<-parameters["cocoon_eff"]/100 -parameters["age_cocoon"]<-floor((parameters["age_cocoon"]/5)+1) -parameters["vaccine_eff"]<-parameters["vaccine_eff"]/100 -age_vaccine_min<-(parameters["age_vaccine_min"]) -# parameters["vaccine_cov"]<-parameters["vaccine_cov"]/100 -# parameters["vac_campaign"]<-parameters["vac_campaign"]*7 -parameters["screen_test_sens"]<-parameters["screen_test_sens"]/100 -parameters["quarantine_days"]<-parameters["quarantine_days"] -parameters["quarantine_effort"]<-1/parameters["quarantine_effort"] -parameters["quarantine_eff_home"]<-parameters["quarantine_eff_home"]/-100 -parameters["quarantine_eff_other"]<-parameters["quarantine_eff_other"]/100 -parameters["give"]<-parameters["give"]/100 -parameters["pdeath_h"]<-parameters["pdeath_h"]/100 -parameters["pdeath_hc"]<-parameters["pdeath_hc"]/100 -parameters["pdeath_icu"]<-parameters["pdeath_icu"]/100 -parameters["pdeath_icuc"]<-parameters["pdeath_icuc"]/100 -parameters["pdeath_vent"]<-parameters["pdeath_vent"]/100 -parameters["pdeath_ventc"]<-parameters["pdeath_ventc"]/100 -parameters["nusc"]<-1/parameters["nusc"] -parameters["nu_icu"]<-1/parameters["nu_icu"] -parameters["nu_icuc"]<-1/parameters["nu_icuc"] -parameters["nu_vent"]<-1/parameters["nu_vent"] -parameters["nu_ventc"]<-1/parameters["nu_ventc"] -parameters["pclin"]<-parameters["pclin"]/100 -parameters["prob_icu"]<-parameters["prob_icu"]/100 -parameters["prob_vent"]<-parameters["prob_vent"]/100 -parameters_noise<-c(1:5,19:20,22,24,26,32:39,43,45,47:49) -iterations<-parameters["iterations"] -noise<-parameters["noise"] -confidence<-parameters["confidence"]/100 -parameters["mass_test_sens"]<-parameters["mass_test_sens"]/100 -age_testing_min<-(parameters["age_testing_min"]) -age_testing_max<-(parameters["age_testing_max"]) -parameters["isolation_days"]<-parameters["isolation_days"] - -########################################################################### -# Define the indices for each variable -Sindex<-1:A -Eindex<-(A+1):(2*A) -Iindex<-(2*A+1):(3*A) -Rindex<-(3*A+1):(4*A) -Xindex<-(4*A+1):(5*A) -Hindex<-(5*A+1):(6*A) -HCindex<-(6*A+1):(7*A) -Cindex<-(7*A+1):(8*A) -CMindex<-(8*A+1):(9*A) -Vindex<-(9*A+1):(10*A) -QSindex<-(10*A+1):(11*A) -QEindex<-(11*A+1):(12*A) -QIindex<-(12*A+1):(13*A) -QRindex<-(13*A+1):(14*A) -CLindex<-(14*A+1):(15*A) -QCindex<-(15*A+1):(16*A) -ICUindex<-(16*A+1):(17*A) -ICUCindex<-(17*A+1):(18*A) -ICUCVindex<-(18*A+1):(19*A) -Ventindex<-(19*A+1):(20*A) -VentCindex<-(20*A+1):(21*A) -CMCindex<-(21*A+1):(22*A) -Zindex<-(22*A+1):(23*A) - -########################################################################### -# MODEL INITIAL CONDITIONS -initI<-0*popstruc[,2] # Infected and symptomatic -initE<-0*popstruc[,2] # Incubating -initE[aci]<-1 # place random index case in E compartment -initR<-0*popstruc[,2] # Immune -initX<-0*popstruc[,2] # Isolated -initV<-0*popstruc[,2] # Vaccinated -initQS<-0*popstruc[,2] # quarantined S -initQE<-0*popstruc[,2] # quarantined E -initQI<-0*popstruc[,2] # quarantined I -initQR<-0*popstruc[,2] # quarantined R -initH<-0*popstruc[,2] # hospitalised -initHC<-0*popstruc[,2] # hospital critical -initC<-0*popstruc[,2] # Cumulative cases (true) -initCM<-0*popstruc[,2] # Cumulative deaths (true) -initCL<-0*popstruc[,2] # symptomatic cases -initQC<-0*popstruc[,2] # quarantined C -initICU<-0*popstruc[,2] # icu -initICUC<-0*popstruc[,2] # icu critical -initICUCV<-0*popstruc[,2] # icu critical -initVent<-0*popstruc[,2] # icu vent -initVentC<-0*popstruc[,2] # icu vent crit -initCMC<-0*popstruc[,2] # Cumulative deaths (true) -initZ<-0*popstruc[,2] # Cumulative deaths (true) -initS<-popstruc[,2]-initE-initI-initR-initX-initZ-initV-initH-initHC-initQS-initQE-initQI-initQR-initCL-initQC-initICU-initICUC-initICUCV-initVent-initVentC # Susceptible (non-immune) - - -inp <- read_excel(file_path, sheet = "Interventions") -inputs<-function(inp, run){ - # cap intervention end dates with simulation end date - inp$`Date End` = pmin(stopdate, inp$`Date End`) - - tv<-which(inp$`Apply to`==run) - - si<-intersect(which(inp$Intervention=="Self-isolation if Symptomatic"),tv) - scr<-intersect(which(inp$Intervention=="Screening (when S.I.)"),tv) - sd<-intersect(which(inp$Intervention=="Social Distancing"),tv) - hw<-intersect(which(inp$Intervention=="Handwashing"),tv) - wah<-intersect(which(inp$Intervention=="Working at Home"),tv) - sc<-intersect(which(inp$Intervention=="School Closures"),tv) - cte<-intersect(which(inp$Intervention=="Shielding the Elderly"),tv) - q<-intersect(which(inp$Intervention=="Household Isolation (when S.I.)"),tv) - tb<-intersect(which(inp$Intervention=="International Travel Ban"),tv) - vc<-intersect(which(inp$Intervention=="Vaccination"),tv) - mt<-intersect(which(inp$Intervention=="Mass Testing"),tv) - minas<-intersect(which(inp$Intervention=="Age Testing Minimum"),tv) - maxas<-intersect(which(inp$Intervention=="Age Testing Maximum"),tv) - vc<-intersect(which(inp$Intervention=="Vaccination"),tv) - minav<-intersect(which(inp$Intervention=="Age Vaccine Minimum"),tv) - - v<-(format(as.POSIXct(inp$`Date Start`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date Start`<-v2 - - v<-(format(as.POSIXct(inp$`Date End`,format='%Y/%m/%d %H:%M:%S'),format="%d/%m/%y")) - v2<-as.Date(v,format="%d/%m/%y") - inp$`Date End`<-v2 - - ## self isolation - f<-c() - si_vector<-c() - isolation<-c() - if (length(si)>=1){ - for (i in 1:length(si)){ - f<-c(f,as.numeric(inp$`Date Start`[si[i]]-startdate),as.numeric(inp$`Date End`[si[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[si[i]]>startdate){ - si_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[si[i]],(f[i+1]-f[i])*20)) - isolation<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - si_vector<-c(rep(inp$`Value`[si[i]],(f[i+1])*20)) - isolation<-c(rep(1,(f[i+1])*20)) - } - } - else{ - si_vector<-c(si_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - si_vector<-c(si_vector,rep(inp$`Value`[si[i]],(f[i*2]-f[i*2-1])*20)) - isolation<-c(isolation,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - isolation<-c(isolation,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(si) && f[i*2]=1){ - for (i in 1:length(sd)){ - - f<-c(f,as.numeric(inp$`Date Start`[sd[i]]-startdate),as.numeric(inp$`Date End`[sd[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sd[i]]>startdate){ - sd_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sd[i]],(f[i+1]-f[i])*20)) - distancing<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sd_vector<-c(rep(inp$`Value`[sd[i]],(f[i+1])*20)) - distancing<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sd_vector<-c(sd_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sd_vector<-c(sd_vector,rep(inp$`Value`[sd[i]],(f[i*2]-f[i*2-1])*20)) - distancing<-c(distancing,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - distancing<-c(distancing,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sd)&& f[i*2]=1){ - for (i in 1:length(scr)){ - - f<-c(f,as.numeric(inp$`Date Start`[scr[i]]-startdate),as.numeric(inp$`Date End`[scr[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[scr[i]]>startdate){ - scr_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[scr[i]],(f[i+1]-f[i])*20)) - screen<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - scr_vector<-c(rep(inp$`Value`[scr[i]],(f[i+1])*20)) - screen<-c(rep(1,(f[i+1])*20)) - } - } - else{ - scr_vector<-c(scr_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - scr_vector<-c(scr_vector,rep(inp$`Value`[scr[i]],(f[i*2]-f[i*2-1])*20)) - screen<-c(screen,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - screen<-c(screen,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(scr)&& f[i*2]=1){ - for (i in 1:length(hw)){ - - f<-c(f,as.numeric(inp$`Date Start`[hw[i]]-startdate),as.numeric(inp$`Date End`[hw[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[hw[i]]>startdate){ - hw_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[hw[i]],(f[i+1]-f[i])*20)) - handwash<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - hw_vector<-c(rep(inp$`Value`[hw[i]],(f[i+1])*20)) - handwash<-c(rep(1,(f[i+1])*20)) - } - } - else{ - hw_vector<-c(hw_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - hw_vector<-c(hw_vector,rep(inp$`Value`[hw[i]],(f[i*2]-f[i*2-1])*20)) - handwash<-c(handwash,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - handwash<-c(handwash,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(hw)&& f[i*2]=1){ - for (i in 1:length(wah)){ - - f<-c(f,as.numeric(inp$`Date Start`[wah[i]]-startdate),as.numeric(inp$`Date End`[wah[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[wah[i]]>startdate){ - wah_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[wah[i]],(f[i+1]-f[i])*20)) - workhome<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - wah_vector<-c(rep(inp$`Value`[wah[i]],(f[i+1])*20)) - workhome<-c(rep(1,(f[i+1])*20)) - } - } - else{ - wah_vector<-c(wah_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - wah_vector<-c(wah_vector,rep(inp$`Value`[wah[i]],(f[i*2]-f[i*2-1])*20)) - workhome<-c(workhome,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - workhome<-c(workhome,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(wah)&& f[i*2]=1){ - for (i in 1:length(sc)){ - - f<-c(f,as.numeric(inp$`Date Start`[sc[i]]-startdate),as.numeric(inp$`Date End`[sc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[sc[i]]>startdate){ - sc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[sc[i]],(f[i+1]-f[i])*20)) - schoolclose<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - sc_vector<-c(rep(inp$`Value`[sc[i]],(f[i+1])*20)) - schoolclose<-c(rep(1,(f[i+1])*20)) - } - } - else{ - sc_vector<-c(sc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - sc_vector<-c(sc_vector,rep(inp$`Value`[sc[i]],(f[i*2]-f[i*2-1])*20)) - schoolclose<-c(schoolclose,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - schoolclose<-c(schoolclose,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(sc)&& f[i*2]=1){ - for (i in 1:length(cte)){ - - f<-c(f,as.numeric(inp$`Date Start`[cte[i]]-startdate),as.numeric(inp$`Date End`[cte[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[cte[i]]>startdate){ - cte_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[cte[i]],(f[i+1]-f[i])*20)) - cocoon<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - cte_vector<-c(rep(inp$`Value`[cte[i]],(f[i+1])*20)) - cocoon<-c(rep(1,(f[i+1])*20)) - } - } - else{ - cte_vector<-c(cte_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cte_vector<-c(cte_vector,rep(inp$`Value`[cte[i]],(f[i*2]-f[i*2-1])*20)) - cocoon<-c(cocoon,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - cocoon<-c(cocoon,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(cte)&& f[i*2]=1){ - for (i in 1:length(q)){ - - f<-c(f,as.numeric(inp$`Date Start`[q[i]]-startdate),as.numeric(inp$`Date End`[q[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[q[i]]>startdate){ - q_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[q[i]],(f[i+1]-f[i])*20)) - quarantine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - q_vector<-c(rep(inp$`Value`[q[i]],(f[i+1])*20)) - quarantine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - q_vector<-c(q_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - q_vector<-c(q_vector,rep(inp$`Value`[q[i]],(f[i*2]-f[i*2-1])*20)) - quarantine<-c(quarantine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - quarantine<-c(quarantine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(q)&& f[i*2]=1){ - for (i in 1:length(tb)){ - - f<-c(f,as.numeric(inp$`Date Start`[tb[i]]-startdate),as.numeric(inp$`Date End`[tb[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[tb[i]]>startdate){ - tb_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[tb[i]],(f[i+1]-f[i])*20)) - travelban<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - tb_vector<-c(rep(inp$`Value`[tb[i]],(f[i+1])*20)) - travelban<-c(rep(1,(f[i+1])*20)) - } - } - else{ - tb_vector<-c(tb_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - tb_vector<-c(tb_vector,rep(inp$`Value`[tb[i]],(f[i*2]-f[i*2-1])*20)) - travelban<-c(travelban,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - travelban<-c(travelban,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(tb)&& f[i*2]=1){ - for (i in 1:length(mt)){ - - f<-c(f,as.numeric(inp$`Date Start`[mt[i]]-startdate),as.numeric(inp$`Date End`[mt[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[mt[i]]>startdate){ - mt_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[mt[i]],(f[i+1]-f[i])*20)) - masstesting<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - mt_vector<-c(rep(inp$`Value`[mt[i]],(f[i+1])*20)) - masstesting<-c(rep(1,(f[i+1])*20)) - } - } - else{ - mt_vector<-c(mt_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - mt_vector<-c(mt_vector,rep(inp$`Value`[mt[i]],(f[i*2]-f[i*2-1])*20)) - masstesting<-c(masstesting,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - masstesting<-c(masstesting,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(mt)&& f[i*2]=1){ - for (i in 1:length(minas)){ - f<-c(f,as.numeric(inp$`Date Start`[minas[i]]-startdate),as.numeric(inp$`Date End`[minas[i]]-startdate)) - if(i==1){ - if (inp$`Date Start`[minas[i]]>startdate){ - minas_vector<-c(rep(age_testing_min,f[i]*20),rep(inp$`Value`[minas[i]],(f[i+1]-f[i])*20)) - } - else{ - minas_vector<-c(rep(inp$`Value`[minas[i]],(f[i+1])*20)) - } - } - else{ - minas_vector<-c(minas_vector,rep(age_testing_min,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - minas_vector<-c(minas_vector,rep(inp$`Value`[minas[i]],(f[i*2]-f[i*2-1])*20)) - } - if(i==length(minas)&& f[i*2]=1){ - for (i in 1:length(maxas)){ - f<-c(f,as.numeric(inp$`Date Start`[maxas[i]]-startdate),as.numeric(inp$`Date End`[maxas[i]]-startdate)) - if(i==1){ - if (inp$`Date Start`[maxas[i]]>startdate){ - maxas_vector<-c(rep(age_testing_max,f[i]*20),rep(inp$`Value`[maxas[i]],(f[i+1]-f[i])*20)) - } - else{ - maxas_vector<-c(rep(inp$`Value`[maxas[i]],(f[i+1])*20)) - } - } - else{ - maxas_vector<-c(maxas_vector,rep(age_testing_max,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - maxas_vector<-c(maxas_vector,rep(inp$`Value`[maxas[i]],(f[i*2]-f[i*2-1])*20)) - } - if(i==length(maxas)&& f[i*2]=1){ - for (i in 1:length(vc)){ - - f<-c(f,as.numeric(inp$`Date Start`[vc[i]]-startdate),as.numeric(inp$`Date End`[vc[i]]-startdate)) - - if(i==1){ - if (inp$`Date Start`[vc[i]]>startdate){ - vc_vector<-c(rep(0,f[i]*20),rep(inp$`Value`[vc[i]],(f[i+1]-f[i])*20)) - vaccine<-c(rep(0,f[i]*20),rep(1,(f[i+1]-f[i])*20)) - } - else{ - vc_vector<-c(rep(inp$`Value`[vc[i]],(f[i+1])*20)) - vaccine<-c(rep(1,(f[i+1])*20)) - } - } - else{ - vc_vector<-c(vc_vector,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vc_vector<-c(vc_vector,rep(inp$`Value`[vc[i]],(f[i*2]-f[i*2-1])*20)) - vaccine<-c(vaccine,rep(0,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - vaccine<-c(vaccine,rep(1,(f[i*2]-f[i*2-1])*20)) - } - if(i==length(vc)&& f[i*2]=1){ - for (i in 1:length(minav)){ - f<-c(f,as.numeric(inp$`Date Start`[minav[i]]-startdate),as.numeric(inp$`Date End`[minav[i]]-startdate)) - if(i==1){ - if (inp$`Date Start`[minav[i]]>startdate){ - minav_vector<-c(rep(age_vaccine_min,f[i]*20),rep(inp$`Value`[minav[i]],(f[i+1]-f[i])*20)) - } - else{ - minav_vector<-c(rep(inp$`Value`[minav[i]],(f[i+1])*20)) - } - } - else{ - minav_vector<-c(minav_vector,rep(age_vaccine_min,(f[(i-1)*2+1]-f[(i-1)*2])*20)) - minav_vector<-c(minav_vector,rep(inp$`Value`[minav[i]],(f[i*2]-f[i*2-1])*20)) - } - if(i==length(minav)&& f[i*2]1){ - ratetestI<-mass_test_sens*testI/sum(I) - # print(paste('rateI: ',ratetestI)) - }else{ratetestI<-0} - if(sum(CL)>1){ - ratetestC<-mass_test_sens*testC/sum(CL) - # print(paste('rateC: ',ratetestC)) - }else{ratetestC<-0} - if(sum(E)>1){ - ratetestE<-mass_test_sens*testE/sum(E) - # print(paste('rateC: ',ratetestC)) - }else{ratetestE<-0} - - # print(mass_test_sens) - # print(ratetestI*sum(I) + ratetestC*sum(CL) - (1/isolation_days)*sum(Z) ) - # print(propC) - # print(testI) - # print(testC) - # - # cocooning the elderly - cocoon_mat<-matrix((1-cocoon_eff),nrow = length(popstruc$pop),ncol = length(popstruc$pop)) - cocoon_mat[1:(age_cocoon-1),1:(age_cocoon-1)]<-1 - - # contact matrices - cts<-(contact_home+distancing*(1-dist)*contact_other+(1-distancing)*contact_other - +(1-schoolclose)*contact_school # school on - +schoolclose*(1-school)*contact_school # school close - +schoolclose*contact_home*school*s2h # inflating contacts at home when school closes - +(1-workhome)*contact_work # normal work - +workhome*(1-work)*contact_work # people not working from home when homework is active - +contact_home*workhome*work*w2h # inflating contacts at home when working from home - ) - - # Final transmission related parameters - contacts <- (1-cocoon)*cts+cocoon*cts*cocoon_mat+cocoon*(1+schoolclose*(1-school_eff)+workhome*(1-work_eff))*contact_home*(1-cocoon_mat) - seas <- 1+amp*cos(2*3.14*(t-(phi*365.25/12))/365.25) - importation <- mean_imports*(1-trvban_eff) - HH<-H+ICU+Vent+ICUC+ICUCV+VentC - HHC<-HC - lam <- (1-hand)*p*seas*(contacts%*%((rho*E+(I+CL+importation)+(1-selfis_eff)*(X+HHC)+rhos*(HH))/P))+ - (1-hand)*p*seas*(1-quarantine*quarantine_eff_other)*(contact_other%*%((rho*QE+QI+QC)/P)) - # contacts under home quarantine - lamq<-(1-hand)*p*seas*((1-quarantine_eff_home)*contact_home%*%(((1-selfis_eff)*(X+HHC+rho*QE+QI+QC))/P))+ - (1-hand)*p*seas*(1-quarantine_eff_other)*(contact_other%*%((rho*E+(I+CL+importation)+(1-selfis_eff)*(X+HHC+rho*QE+QI+QC)+rhos*(HH))/P)) - - # birth/death - b1<-sum(popbirth[,2]*popstruc[,2]) - birth<-0*popbirth[,2] - birth[1]<-b1 - - # ODE system - dSdt <- -S*lam-vaccinate*age_vaccine_vector*S+omega*R+ageing%*%S-mort*S+birth-quarantine_rate*S +(1/quarantine_days)*QS - dEdt <- S*lam-gamma*E+ageing%*%E-mort*E + (1-vaccine_eff)*lam*V-quarantine_rate*E+(1/quarantine_days)*QE - dIdt <- gamma*(1-pclin)*(1-age_testing_vector*ratetestE)*(1-screen_eff)*(1-ihr[,2])*E-nui*I+ageing%*%I-mort*I + (1/quarantine_days)*QI - quarantine_rate*I - ratetestI*age_testing_vector*I - dCLdt<- gamma*pclin*(1-age_testing_vector*ratetestE)*(1-selfis)*(1-ihr[,2])*(1-quarantine_rate)*E-nui*CL+ageing%*%CL-mort*CL + (1/quarantine_days)*QC - ratetestC*age_testing_vector*CL - dRdt <- nui*I-omega*R+nui*X+nui*CL+ageing%*%R-mort*R + (1/isolation_days)*Z+(1/quarantine_days)*QR + nus*(1-pdeath_h*ifr[,2])*H + (1-pdeath_icu*ifr[,2])*nu_icu*ICU + (1-pdeath_icuc*ifr[,2])*nu_icuc*ICUC + (1-pdeath_ventc*ifr[,2])*nu_ventc*ICUCV + (1-pdeath_hc*ifr[,2])*nusc*HC + (1-pdeath_vent*ifr[,2])*nu_vent*Vent+ (1-pdeath_ventc*ifr[,2])*nu_ventc*VentC - dXdt <- gamma*selfis*(1-age_testing_vector*ratetestE)*pclin*(1-ihr[,2])*E+gamma*(1-pclin)*(1-age_testing_vector*ratetestE)*screen_eff*(1-ihr[,2])*E-nui*X+ageing%*%X-mort*X - dVdt <- vaccinate*age_vaccine_vector*S -(1-vaccine_eff)*lam*V +ageing%*%V - mort*V - - dQSdt <- quarantine_rate*S+ ageing%*%QS-mort*QS - (1/quarantine_days)*QS - lamq*QS - dQEdt <- quarantine_rate*E - gamma*QE + ageing%*%QE-mort*QE - (1/quarantine_days)*QE + lamq*QS - dQIdt <- quarantine_rate*I + gamma*(1-ihr[,2])*(1-pclin)*QE-nui*QI+ageing%*%QI-mort*QI - (1/quarantine_days)*QI - dQCdt <- gamma*pclin*(1-selfis)*(1-age_testing_vector*ratetestE)*(1-ihr[,2])*quarantine_rate*E+gamma*(1-ihr[,2])*pclin*QE-nui*QC+ageing%*%QC-mort*QC - (1/quarantine_days)*QC - dQRdt <- nui*QI+nui*QC+ageing%*%QR-mort*QR - (1/quarantine_days)*QR - - dHdt <- gamma*ihr[,2]*(1-prob_icu)*(1-critH)*reporth*E + gamma*ihr[,2]*(1-prob_icu)*(1-critH)*QE - nus*H + ageing%*%H-mort*H - dHCdt <- gamma*ihr[,2]*(1-prob_icu)*(1-critH)*(1-reporth)*E+gamma*ihr[,2]*(1-prob_icu)*critH*E + gamma*ihr[,2]*(1-prob_icu)*critH*QE - nusc*HC + ageing%*%HC-mort*HC - dICUdt <- gamma*ihr[,2]*prob_icu*(1-crit)*(1-prob_vent)*E + gamma*ihr[,2]*prob_icu*(1-crit)*(1-prob_vent)*QE - nu_icu*ICU +ageing%*%ICU - mort*ICU +(1-crit)*ICUC*1/2 - dICUCdt <- gamma*ihr[,2]*prob_icu*crit*(1-prob_vent)*E + gamma*ihr[,2]*prob_icu*crit*(1-prob_vent)*QE - - nu_icuc*ICUC -(1-crit)*ICUC*1/2 +ageing%*%ICUC - mort*ICUC - dICUCVdt <- gamma*ihr[,2]*prob_icu*prob_vent*crit*E +gamma*ihr[,2]*prob_icu*prob_vent*crit*QE -nu_ventc*ICUCV +ageing%*%ICUCV - mort*ICUCV - (1-critV)*ICUCV*1/2 - dVentdt <- gamma*ihr[,2]*prob_icu*(1-crit)*(1-critV)*prob_vent*E + gamma*ihr[,2]*prob_icu*(1-crit)*(1-critV)*prob_vent*QE +(1-critV)*VentC*1/2 +(1-critV)*ICUCV*1/2 -nu_vent*Vent +ageing%*%Vent - mort*Vent - dVentCdt <- gamma*ihr[,2]*prob_icu*prob_vent*(1-crit)*critV*E +gamma*ihr[,2]*prob_icu*prob_vent*(1-crit)*critV*QE - - (1-critV)*VentC*1/2 -nu_ventc*VentC +ageing%*%VentC - mort*VentC - - dCdt <- report*gamma*(1-age_testing_vector*ratetestE)*(1-pclin)*(1-ihr[,2])*(E+QE)+reportc*gamma*pclin*(1-age_testing_vector*ratetestE)*(1-ihr[,2])*(E+QE)+ - gamma*ihr[,2]*(1-critH)*(1-prob_icu)*(E+QE)+gamma*ihr[,2]*critH*reporth*(1-prob_icu)*(E+QE)+ - gamma*ihr[,2]*prob_icu*(E+QE)+ratetestI*age_testing_vector*I+ratetestC*age_testing_vector*CL+gamma*age_testing_vector*ratetestE*(1-ihr[,2])*E - dCMdt<- nus*pdeath_h*ifr[,2]*H + nusc*pdeath_hc*ifr[,2]*HC + nu_icu*pdeath_icu*ifr[,2]*ICU +nu_icuc*pdeath_icuc*ifr[,2]*ICUC +nu_vent*pdeath_vent*ifr[,2]*Vent +nu_ventc*pdeath_ventc*ifr[,2]*VentC +nu_ventc*pdeath_ventc*ifr[,2]*ICUCV+ - mort*H + mort*HC + mort*ICU + mort*ICUC + mort*ICUCV + mort*Vent + mort*VentC + mort*Z - dCMCdt <- nusc*pdeath_hc*ifr[,2]*HC+nu_icuc*pdeath_icuc*ifr[,2]*ICUC + nu_ventc*pdeath_ventc*ifr[,2]*VentC + nu_ventc*pdeath_ventc*ifr[,2]*ICUCV+ - mort*HC + mort*ICUC + mort*VentC + mort*ICUCV - - dZdt <- gamma*ratetestE*age_testing_vector*(1-ihr[,2])*E+ratetestI*age_testing_vector*I+ratetestC*age_testing_vector*CL-(1/isolation_days)*Z-mort*Z - - # return the rate of change - list(c(dSdt,dEdt,dIdt,dRdt,dXdt,dHdt,dHCdt,dCdt,dCMdt,dVdt,dQSdt,dQEdt,dQIdt,dQRdt,dCLdt,dQCdt,dICUdt,dICUCdt,dICUCVdt,dVentdt,dVentCdt,dCMCdt,dZdt)) - } - ) -} - -########### RUN BASELINE MODEL - start time for interventions is set to day 1e5, i.e. interventions are always off - -Y<-c(initS,initE,initI,initR,initX,initH,initHC,initC,initCM,initV, initQS, initQE, initQI, initQR, initCL, initQC, initICU, initICUC, initICUCV, initVent, initVentC, initCMC, initZ) # initial conditions for the main solution vector - - -process_ode_outcome <- function(out, iterations){ - out_min<-out$min - out_max<-out$max - out_mean<-out$mean - - critH<-c() - crit<-c() - critV<-c() - - for (i in 1:length(times)){ - critH[i]<-min(1-fH((sum(out_mean[i,(Hindex+1)]))+sum(out_mean[i,(ICUCindex+1)])+sum(out_mean[i,(ICUCVindex+1)])),1) - crit[i]<-min(1-fICU((sum(out_mean[i,(ICUindex+1)]))+(sum(out_mean[i,(Ventindex+1)]))+(sum(out_mean[i,(VentCindex+1)])))) - critV[i]<-min(1-fVent((sum(out_mean[i,(Ventindex+1)]))),1) - } - - # total population - pop1<-out_mean[,(Sindex+1)]+out_mean[,(Eindex+1)]+out_mean[,(Iindex+1)]+out_mean[,(CLindex+1)]+out_mean[,(Rindex+1)]+out_mean[,(Xindex+1)]+out_mean[,(Vindex+1)]+ - out_mean[,(Zindex+1)]+out_mean[,(QSindex+1)]+out_mean[,(QEindex+1)]+out_mean[,(QIindex+1)]+out_mean[,(QCindex+1)]+out_mean[,(QRindex+1)]+ - out_mean[,(Hindex+1)]+out_mean[,(HCindex+1)]+out_mean[,(ICUindex+1)]+out_mean[,(ICUCindex+1)]+out_mean[,(ICUCVindex+1)]+out_mean[,(Ventindex+1)]+out_mean[,(VentCindex+1)] - tpop1<-rowSums(pop1) - time<-as.Date(out_mean[,1]+startdate) - - dailyinc1<-out$mean_cases # daily incidence - cuminc1<-out$mean_cum_cases # cumulative incidence - previcureq1<-rowSums(out_mean[,(Hindex+1)])+ rowSums(out_mean[,(ICUCindex+1)])+rowSums(out_mean[,(ICUCVindex+1)]) # surge beds occupancy - previcureq21<-rowSums(out_mean[,(ICUindex+1)])+rowSums(out_mean[,(VentCindex+1)]) # icu beds occupancy - previcureq31<-rowSums(out_mean[,(Ventindex+1)]) # ventilator occupancy - cmortality1<-rowSums(out_mean[,(CMindex+1)]) # cumulative mortality - overloadH1<-rowSums(out_mean[,(HCindex+1)]) # requirement for beds - overloadICU1<-rowSums(out_mean[,(ICUCindex+1)]) # requirement for icu beds - overloadICUV1<-rowSums(out_mean[,(ICUCVindex+1)]) # requirement for ventilators - overloadVent1<-rowSums(out_mean[,(VentCindex+1)]) # requirement for ventilators - ccases1<-rowSums(out_mean[,(Cindex+1)]) # cumulative cases - reqsurge1<-rowSums(out_mean[,(Hindex+1)])+overloadH1 - reqicu1<-rowSums(out_mean[,(ICUindex+1)])+overloadICU1 - reqvent1<-rowSums(out_mean[,(Ventindex+1)])+overloadICUV1+overloadVent1 - - - ########################## CALCULATE MORTALITY - pdeath_hc<-parameters["pdeath_hc"] - prob_icu<-parameters["prob_icu"] - prob_vent<-parameters["prob_vent"] - pdeath_icuc<-parameters["pdeath_icuc"] - pdeath_ventc<-parameters["pdeath_ventc"] - - cinc_mort_H1 <- cumsum(rowSums(parameters["nus"]*parameters["pdeath_h"]*(out_mean[,(Hindex+1)]%*%ifr[,2]))) - cinc_mort_HC1 <- cumsum(rowSums(parameters["nusc"]*parameters["pdeath_hc"]*(out_mean[,(HCindex+1)]%*%ifr[,2]))) - cinc_mort_ICU1 <- cumsum(rowSums(parameters["nu_icu"]*parameters["pdeath_icu"]*out_mean[,(ICUindex+1)]%*%ifr[,2])) - cinc_mort_ICUC1 <- cumsum(rowSums(parameters["nu_icuc"]*parameters["pdeath_icuc"]*out_mean[,(ICUCindex+1)]%*%ifr[,2])) - cinc_mort_ICUCV1 <- cumsum(rowSums(parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(ICUCVindex+1)]%*%ifr[,2])) - cinc_mort_Vent1 <- cumsum(rowSums(parameters["nu_vent"]*parameters["pdeath_vent"]*out_mean[,(Ventindex+1)]%*%ifr[,2])) - cinc_mort_VentC1 <- cumsum(rowSums(parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(VentCindex+1)]%*%ifr[,2])) - base_mort_H1 <- cumsum(rowSums(out_mean[,(Hindex+1)]%*%mort)) - base_mort_HC1 <- cumsum(rowSums(out_mean[,(HCindex+1)]%*%mort)) - base_mort_ICU1 <- cumsum(rowSums(out_mean[,(ICUindex+1)]%*%mort)) - base_mort_ICUC1 <- cumsum(rowSums(out_mean[,(ICUCindex+1)]%*%mort)) - base_mort_ICUCV1 <- cumsum(rowSums(out_mean[,(ICUCVindex+1)]%*%mort)) - base_mort_Vent1 <- cumsum(rowSums(out_mean[,(Ventindex+1)]%*%mort)) - base_mort_VentC1 <- cumsum(rowSums(out_mean[,(VentCindex+1)]%*%mort)) - base_mort_S1 <- cumsum(rowSums(out_mean[,(Sindex+1)]%*%mort)) - base_mort_E1 <- cumsum(rowSums(out_mean[,(Eindex+1)]%*%mort)) - base_mort_I1 <- cumsum(rowSums(out_mean[,(Iindex+1)]%*%mort)) - base_mort_CL1 <- cumsum(rowSums(out_mean[,(CLindex+1)]%*%mort)) - base_mort_X1 <- cumsum(rowSums(out_mean[,(Xindex+1)]%*%mort)) - base_mort_QS1 <- cumsum(rowSums(out_mean[,(QSindex+1)]%*%mort)) - base_mort_QE1 <- cumsum(rowSums(out_mean[,(QEindex+1)]%*%mort)) - base_mort_QI1 <- cumsum(rowSums(out_mean[,(QIindex+1)]%*%mort)) - base_mort_QC1 <- cumsum(rowSums(out_mean[,(QCindex+1)]%*%mort)) - base_mort_QR1 <- cumsum(rowSums(out_mean[,(QRindex+1)]%*%mort)) - base_mort_R1 <- cumsum(rowSums(out_mean[,(Rindex+1)]%*%mort)) - - - # Export in a cohesive format ---- - results <- list() - results$time <- startdate + times # dates - results$Rt <- out$mean_Rt - results$cum_mortality <- round(cmortality1) # cumulative mortality - results$pct_total_pop_infected <- out$mean_infections - results$doubling_time <- round(log(2)*7 / (log(dailyinc1[2+7] / dailyinc1[2])), 2) # (Baseline only) to double the number of infections at inception - results$required_beds <- round(previcureq1) # required beds - results$saturation <- parameters["beds_available"] # saturation - results$daily_incidence <- round(dailyinc1) # daily incidence (Reported) - results$daily_total_cases <- round(out$mean_daily_infection) # daily incidence (Reported + Unreported) # daily incidence (Reported + Unreported) - results$hospital_surge_beds <- round(previcureq1) - results$icu_beds <- round(previcureq21) - results$ventilators <- round(previcureq31) - results$normal_bed_requirement <- round(reqsurge1) #real required beds. previcureq1 above is the occupancy - results$icu_bed_requirement <- round(reqicu1) - results$icu_ventilator_requirement <- round(reqvent1) - - results$death_natural_non_exposed <- round(base_mort_S1) - results$death_natural_exposed <- round(base_mort_E1 + base_mort_I1 + base_mort_CL1 + base_mort_X1 + base_mort_QS1 + - base_mort_QE1 + base_mort_QI1 + base_mort_QC1 + base_mort_QR1 + base_mort_R1+ - base_mort_H1+base_mort_HC1+base_mort_ICU1+base_mort_ICUC1+base_mort_ICUCV1+ - base_mort_Vent1+base_mort_VentC1) - results$death_treated_hospital <- round(cinc_mort_H1) - results$death_treated_icu <- round(cinc_mort_ICU1) - results$death_treated_ventilator <- round(cinc_mort_Vent1) - results$death_untreated_hospital <- round(cinc_mort_HC1) - results$death_untreated_icu <- round(cinc_mort_ICUC1) - results$death_untreated_ventilator <- round(cinc_mort_VentC1)+round(cinc_mort_ICUCV1) - results$attributable_deaths <- results$death_treated_hospital + results$death_treated_icu + results$death_treated_ventilator + - results$death_untreated_hospital + results$death_untreated_icu + results$death_untreated_ventilator - results$attributable_deaths_end <- last(results$attributable_deaths) - results$total_deaths <- results$attributable_deaths + results$death_natural_non_exposed + results$death_natural_exposed - results$total_deaths_end <- last(results$total_deaths) - results$total_reported_deaths_end <- last(results$cum_mortality) - results$base_mort_H <- base_mort_H1 - results$base_mort_HC <- base_mort_HC1 - results$base_mort_ICU <- base_mort_ICU1 - results$base_mort_ICUC <- base_mort_ICUC1 - results$base_mort_ICUCV <- base_mort_ICUCV1 - results$base_mort_Vent <- base_mort_Vent1 - results$base_mort_VentC <- base_mort_VentC1 - results$base_mort_S <- base_mort_S1 - results$base_mort_E <- base_mort_E1 - results$base_mort_I <- base_mort_I1 - results$base_mort_CL <- base_mort_CL1 - results$base_mort_X <- base_mort_X1 - results$base_mort_QS <- base_mort_QS1 - results$base_mort_QE <- base_mort_QE1 - results$base_mort_QI <- base_mort_QI1 - results$base_mort_QC <- base_mort_QC1 - results$base_mort_QR <- base_mort_QR1 - results$base_mort_R <- base_mort_R1 - - ## AGE DEPENDENT MORTALITY - cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out_mean[,(Hindex+1)]) - cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out_mean[,(HCindex+1)]) - cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out_mean[,(ICUindex+1)] - cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out_mean[,(ICUCindex+1)] - cinc_mort_ICUCV1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(ICUCVindex+1)] - cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out_mean[,(Ventindex+1)] - cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out_mean[,(VentCindex+1)] - totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_ICUCV1+cinc_mort_Vent1+cinc_mort_VentC1) - basemort_H1<-(out_mean[,(Hindex+1)]) - basemort_HC1<-(out_mean[,(HCindex+1)]) - basemort_ICU1<-(out_mean[,(ICUindex+1)]) - basemort_ICUC1<-(out_mean[,(ICUCindex+1)]) - basemort_ICUCV1<-(out_mean[,(ICUCVindex+1)]) - basemort_Vent1<-(out_mean[,(Ventindex+1)]) - basemort_VentC1<-(out_mean[,(VentCindex+1)]) - totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_ICUCV1+basemort_Vent1+basemort_VentC1) - tc<-c() - - for (i in 1:dim(cinc_mort_H1)[1]) { - for (j in 1:dim(cinc_mort_H1)[2]) { - tc<-rbind(tc,c(i, j, totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) - } - } - tc<-as.data.frame(tc) - colnames(tc)<-c("Day","Age","value") - - results$tc <- tc %>% - mutate(Date = startdate + Day, - age_cat = case_when( - Age >= 1 & Age <= 6 ~ "≤ 30 y.o.", - Age > 6 & Age <= 8 ~ "30-40 y.o.", - Age > 8 & Age <= 10 ~ "40-50 y.o.", - Age > 10 & Age <= 12 ~ "50-60 y.o.", - Age > 12 & Age <= 14 ~ "60-70 y.o.", - Age >= 15 ~ "≥ 70 y.o.")) %>% - mutate(age_cat = factor(age_cat, levels = rev(c("≤ 30 y.o.", "30-40 y.o.", - "40-50 y.o.", "50-60 y.o.", "60-70 y.o.", "≥ 70 y.o.")))) - - mortality_lag <- data.frame(Age = popstruc$agefloor) - if(nrow(out_mean) >= 30) mortality_lag <- bind_cols(mortality_lag, - data.frame(day30 = out_mean[30,CMindex+1]/out_mean[30,Cindex+1]) %>% - mutate(day30 = ifelse(is.infinite(day30), 0, day30)) %>% - rename(`Day 30` = day30)) - if(nrow(out_mean) >= 60) mortality_lag <- bind_cols(mortality_lag, - data.frame(day60 = out_mean[60,CMindex+1]/out_mean[60,Cindex+1]) %>% - mutate(day60 = ifelse(is.infinite(day60), 0, day60)) %>% - rename(`Day 60` = day60)) - if(nrow(out_mean) >= 90) mortality_lag <- bind_cols(mortality_lag, - data.frame(day90 = out_mean[90,CMindex+1]/out_mean[90,Cindex+1]) %>% - mutate(day90 = ifelse(is.infinite(day90), 0, day90)) %>% - rename(`Day 90` = day90)) - if(nrow(out_mean) >= 120) mortality_lag <- bind_cols(mortality_lag, - data.frame(day120 = out_mean[120,CMindex+1]/out_mean[120,Cindex+1]) %>% - mutate(day120 = ifelse(is.infinite(day120), 0, day120)) %>% - rename(`Day 120` = day120)) - - results$mortality_lag <- mortality_lag - - - if(iterations>1){ - - previcureq1_max<-rowSums(out_max[,(Hindex+1)])+ rowSums(out_max[,(ICUCindex+1)])+rowSums(out_max[,(ICUCVindex+1)]) # surge beds occupancy - previcureq21_max<-rowSums(out_max[,(ICUindex+1)])+rowSums(out_max[,(VentCindex+1)]) # icu beds occupancy - previcureq31_max<-rowSums(out_max[,(Ventindex+1)]) # ventilator occupancy - cmortality1_max<-rowSums(out_max[,(CMindex+1)]) # cumulative mortality - overloadH1_max<-rowSums(out_max[,(HCindex+1)]) # requirement for beds - overloadICU1_max<-rowSums(out_max[,(ICUCindex+1)]) # requirement for icu beds - overloadICUV1_max<-rowSums(out_max[,(ICUCVindex+1)]) # requirement for ventilators - overloadVent1_max<-rowSums(out_max[,(VentCindex+1)]) # requirement for ventilators - ccases1_max<-rowSums(out_max[,(Cindex+1)]) # cumulative cases - reqsurge1_max<-rowSums(out_max[,(Hindex+1)])+overloadH1 # surge beds total requirements - reqicu1_max<-rowSums(out_max[,(ICUindex+1)])+overloadICU1 # ICU beds total requirements - reqvent1_max<-rowSums(out_max[,(Ventindex+1)])+overloadICUV1+overloadVent1 # ventilator beds total requirements - - previcureq1_min<-rowSums(out_min[,(Hindex+1)])+ rowSums(out_min[,(ICUCindex+1)])+rowSums(out_min[,(ICUCVindex+1)]) # surge beds occupancy - previcureq21_min<-rowSums(out_min[,(ICUindex+1)])+rowSums(out_min[,(VentCindex+1)]) # icu beds occupancy - previcureq31_min<-rowSums(out_min[,(Ventindex+1)]) # ventilator occupancy - cmortality1_min<-rowSums(out_min[,(CMindex+1)]) # cumulative mortality - overloadH1_min<-rowSums(out_min[,(HCindex+1)]) # requirement for beds - overloadICU1_min<-rowSums(out_min[,(ICUCindex+1)]) # requirement for icu beds - overloadICUV1_min<-rowSums(out_min[,(ICUCVindex+1)]) # requirement for ventilators - overloadVent1_min<-rowSums(out_min[,(VentCindex+1)]) # requirement for ventilators - ccases1_min<-rowSums(out_min[,(Cindex+1)]) # cumulative cases - reqsurge1_min<-rowSums(out_min[,(Hindex+1)])+overloadH1 # surge beds total requirements - reqicu1_min<-rowSums(out_min[,(ICUindex+1)])+overloadICU1 # ICU beds total requirements - reqvent1_min<-rowSums(out_min[,(Ventindex+1)])+overloadICUV1+overloadVent1 # ventilator beds total requirements - - results$Rt_max <- out$max_Rt - results$Rt_min <- out$min_Rt - - results$daily_incidence_max <- out$max_cases - results$daily_incidence_min <- out$min_cases - - results$daily_total_cases_max <- out$max_daily_infection - results$daily_total_cases_min <- out$min_daily_infection - - results$total_reported_deaths_end_min <- last(cmortality1_min) - results$total_reported_deaths_end_max <- last(cmortality1_max) - - results$pct_total_pop_infected_min <- out$min_infections # proportion of the population that has been infected at the end of the simulation - results$pct_total_pop_infected_max <- out$max_infections # proportion of the population that has been infected at the end of the simulation - } - return(results) -} - -# covidOdeCpp_reset() -# out <- ode(y = Y, times = times, func = covidOdeCpp, parms = parameters, -# input=vectors, A=A, -# contact_home=contact_home, contact_school=contact_school, -# contact_work=contact_work, contact_other=contact_other, -# popbirth_col2=popbirth[,2], popstruc_col2=popstruc[,2], -# ageing=ageing, -# ifr_col2=ifr[,2], ihr_col2=ihr[,2], mort_col=mort) - -multi_runs<-function(Y,times,parameters,input,iterations,noise,confidence){ - - results <- list() - aux<-array(0, dim=c(length(times),23*A+1,iterations)) - results$mean<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$min<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$max<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$mean_cases<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$min_cases<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$max_cases<-matrix(0,nrow = length(times),ncol = 23*A+1) - results$mean_cum_cases<-matrix(0,nrow = length(times),ncol = 1) - results$min_cum_cases<-matrix(0,nrow = length(times),ncol = 1) - results$max_cum_cases<-matrix(0,nrow = length(times),ncol = 1) - results$mean_daily_infection<-matrix(0,nrow = length(times),ncol = 1) - results$min_daily_infection<-matrix(0,nrow = length(times),ncol = 1) - results$max_daily_infection<-matrix(0,nrow = length(times),ncol = 1) - cases<-matrix(0, nrow=length(times),ncol=iterations) - cum_cases<-matrix(0, nrow=length(times),ncol=iterations) - day_infections<-matrix(0, nrow=length(times),ncol=iterations) - Rt_aux<-matrix(0, nrow=length(times),ncol=iterations) - infections<-matrix(0, nrow=iterations,ncol=1) - Rt <- NULL - - param_vector<-parameters - if(iterations>1){ - for (i in 1:iterations){ - param_vector[parameters_noise]<-parameters[parameters_noise]+rnorm(length(parameters_noise),mean=0,sd=noise*abs(parameters[parameters_noise])) - out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = param_vector, input=input) - aux[,,i]<-out0 - - critH<-c() - crit<-c() - critV<-c() - for (ii in 1:length(times)){ - critH[ii]<-min(1-fH((sum(out0[ii,(Hindex+1)]))+sum(out0[ii,(ICUCindex+1)])+sum(out0[ii,(ICUCVindex+1)])),1) - crit[ii]<-min(1-fICU((sum(out0[ii,(ICUindex+1)]))+(sum(out0[ii,(Ventindex+1)]))+(sum(out0[ii,(VentCindex+1)])))) - critV[ii]<-min(1-fVent((sum(out0[ii,(Ventindex+1)]))),1) - } - - # daily incidence - incidence<-param_vector["report"]*param_vector["gamma"]*(1-param_vector["pclin"])*out0[,(Eindex+1)]%*%(1-ihr[,2])+ - param_vector["reportc"]*param_vector["gamma"]*param_vector["pclin"]*out0[,(Eindex+1)]%*%(1-ihr[,2])+ - param_vector["report"]*param_vector["gamma"]*(1-param_vector["pclin"])*out0[,(QEindex+1)]%*%(1-ihr[,2])+ - param_vector["reportc"]*param_vector["gamma"]*param_vector["pclin"]*out0[,(QEindex+1)]%*%(1-ihr[,2]) - - incidenceh<- param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*(1-critH)*(1-param_vector["prob_icu"])*param_vector["reporth"]+ - param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*(1-critH)*(1-param_vector["prob_icu"])*(1-param_vector["reporth"])+ - param_vector["gamma"]*out0[,(QEindex+1)]%*%ihr[,2]*(1-critH)*(1-param_vector["prob_icu"])+ - param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*critH*param_vector["reporth"]*(1-param_vector["prob_icu"])+ - param_vector["gamma"]*out0[,(QEindex+1)]%*%ihr[,2]*critH*param_vector["reporth"]*(1-param_vector["prob_icu"])+ - param_vector["gamma"]*out0[,(Eindex+1)]%*%ihr[,2]*param_vector["prob_icu"]+ - param_vector["gamma"]*out0[,(QEindex+1)]%*%ihr[,2]*param_vector["prob_icu"] - - cases[,i]<-(rowSums(incidence)+rowSums(incidenceh)) # daily incidence cases - cum_cases[,i]<-colSums(incidence)+colSums(incidenceh) # cumulative incidence cases - day_infections[,i]<- round(rowSums(param_vector["gamma"]*out0[,(Eindex+1)]+param_vector["gamma"]*out0[,(QEindex+1)])) - - # daily infections - infections[i] <- round(100*tail(cumsum(rowSums(param_vector["gamma"]*out0[,(Eindex+1)])),1)/sum(popstruc[,2]), 1) # proportion of the population that has been infected at the end of the simulation - for (w in (ceiling(1/param_vector["nui"])+1):length(times)){ - Rt_aux[w,i]<-cumsum(sum(param_vector["gamma"]*out0[w,(Eindex+1)]))/cumsum(sum(param_vector["gamma"]*out0[(w-1/param_vector["nui"]),(Eindex+1)])) - if(Rt_aux[w,i] >= 7) {Rt_aux[w,i] <- NA} - } - } - qq <- quantile(infections, c(confidence, 0.5, (1-confidence))) - results$mean_infections<-qq[2] - results$min_infections<-qq[1] - results$max_infections<-qq[3] - - for(i in 1:length(out0[,1])){ - qq <- quantile(cases[i,], c(confidence, 0.5, (1-confidence))) - results$mean_cases[i]<-qq[2] - results$min_cases[i]<-qq[1] - results$max_cases[i]<-qq[3] - - qq <- quantile(cum_cases[i,], c(confidence, 0.5, (1-confidence))) - results$mean_cum_cases[i]<-qq[2] - results$min_cum_cases[i]<-qq[1] - results$max_cum_cases[i]<-qq[3] - - qq <- quantile(day_infections[i,], c(confidence, 0.5, (1-confidence))) - results$mean_daily_infection[i]<-qq[2] - results$min_daily_infection[i]<-qq[1] - results$max_daily_infection[i]<-qq[3] - - qq <- quantile(Rt_aux[i,], c(confidence, 0.5, (1-confidence)),na.rm = T) - results$mean_Rt[i]<-qq[2] - results$min_Rt[i]<-qq[1] - results$max_Rt[i]<-qq[3] - - for (j in 1:length(out0[1,])){ - qq <- quantile(aux[i,j,], c(confidence, 0.5, (1-confidence))) - results$mean[i,j]<-qq[2] - results$min[i,j]<-qq[1] - results$max[i,j]<-qq[3] - } - } - }else{ - results$mean <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) - } - return(results) -} -out0 <-multi_runs(Y, times, parameters, vectors0, iterations, noise, confidence) -out0$min_infections -out0$max_infections - -plot(times,rowSums(out0$mean[,Iindex+1]),type = 'l') -polygon(c(times, rev(times)), c(rowSums(out0$max[,Iindex+1]), rev(rowSums(out0$min[,Iindex+1]))), - col=rgb(0, 0, 0,0.25), border = NA) - -plot(times,out0$mean_Rt,type = 'l') -polygon(c(times, rev(times)), c(out0$max_Rt, rev(out0$min_Rt)), - col=rgb(0, 0, 0,0.25), border = NA) - - -# out0 <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors0) -# out <- ode(y = Y, times = times, method = "euler", hini = 0.05, func = covid, parms = parameters, input=vectors) - -simul_baseline <- process_ode_outcome(out0,iterations) -# # write.csv(simul_baseline, paste0(hilo,"_baseline_",gsub(":|-","",Sys.time()),".csv")) -# -#future interventions -#extend travel ban, quarantine, hand washing, cocooning the elderly until 1st July -out <-multi_runs(Y, times, parameters, vectors, iterations, noise, confidence) -simul_interventions <- process_ode_outcome(out,iterations) -# write.csv(simul_interventions, paste0(hilo,"_futureIntv_",gsub(":|-","",Sys.time()),".csv")) - -pop1<-out$mean[,(Sindex+1)]+out$mean[,(Eindex+1)]+out$mean[,(Iindex+1)]+out$mean[,(CLindex+1)]+out$mean[,(Rindex+1)]+out$mean[,(Xindex+1)]+out$mean[,(Vindex+1)]+ - out$mean[,(Zindex+1)]+out$mean[,(QSindex+1)]+out$mean[,(QEindex+1)]+out$mean[,(QIindex+1)]+out$mean[,(QCindex+1)]+out$mean[,(QRindex+1)]+ - out$mean[,(Hindex+1)]+out$mean[,(HCindex+1)]+out$mean[,(ICUindex+1)]+out$mean[,(ICUCindex+1)]+out$mean[,(ICUCVindex+1)]+out$mean[,(Ventindex+1)]+out$mean[,(VentCindex+1)] -tpop1<-rowSums(pop1) - -############# PLOTTING -# Fitting tab -# fitting the intervention lines to the data to account for any historical interventions -time<-as.Date(out0$mean[,1]+startdate) -par(mfrow=c(1,2)) -# set up the axis limits -xmin<-min(as.Date(cases_rv[,1])) -xmax<-max(as.Date(cases_rv[,1])) -ymax<-max(cases_rv[,2],na.rm = T) -xtick<-seq(xmin, xmax, by=7) -plot(time,simul_interventions$daily_incidence,type='l',lwd=3, - main="New Reported Cases", xlab="Date", ylab="Cases per day", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -axis(side=1, labels = FALSE) -text(x=xtick, y=-250, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - -# reset the maximum to the cumulative mortality -ymax<-max(cases_rv[,3],na.rm = T) -plot(time,simul_interventions$cum_mortality,type='l',lwd=3, - main="Cumulative Mortality", xlab="Date", ylab="Total deaths", - xlim=c(xmin,xmax), ylim=c(0,ymax), col='blue',xaxt="n") -text(x=xtick, y=-100, labels = format(xtick,"%b-%d"), srt = 0, xpd = TRUE) -points(as.Date(cases_rv[,1]),cases_rv[,3],pch=19,col='red') - - -### Predictions tab -par(mfrow=c(1,2)) -### Cases at baseline and intervention -ymax<-max(c(cases_rv[,2],simul_baseline$daily_incidence,simul_interventions$daily_incidence),na.rm=T) -plot(time,simul_baseline$daily_incidence,type='l',lwd=3,col='blue', - main="Baseline", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') -plot(time,simul_interventions$daily_incidence,type='l',lwd=3,col='blue', - main="Intervention", xlab="Date", ylab="New cases per day",ylim=c(0,ymax)) -points(as.Date(cases_rv[,1]),cases_rv[,2],pch=19,col='red') - - - -# # # Hospital prevalences stratified by H,ICU and Vent -ymax<-max(c((simul_baseline$hospital_surge_beds+simul_baseline$icu_beds+simul_baseline$ventilators),(simul_interventions$hospital_surge_beds+simul_interventions$icu_beds+simul_interventions$ventilators))) -time<-as.Date(out0$mean[,1]+startdate) -coul=c("#047883", "#24A9E2","#051A46") -DM<-as.data.frame(cbind(time,simul_baseline$hospital_surge_beds,simul_baseline$icu_beds,simul_baseline$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time,origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d0<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -DM<-as.data.frame(cbind(time,simul_interventions$hospital_surge_beds,simul_interventions$icu_beds,simul_interventions$ventilators)) -colnames(DM)<-c("Time","Hospital surge beds","ICU beds","Ventilators") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Hospital surge beds","ICU beds","Ventilators")) -d1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area()+ - scale_fill_manual(values=coul) - -grid.arrange(d0+ylab("Number of Patients")+ - ggtitle("Baseline")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - d1+ylab("Number of Patients")+ - ggtitle("Intervention")+ - ylim(0, ymax)+ - geom_hline(yintercept=(parameters["beds_available"]+parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#047883")+ - geom_hline(yintercept=(parameters["icu_beds_available"]+parameters["ventilators_available"]), linetype="dashed", color = "#24A9E2")+ - geom_hline(yintercept=parameters["ventilators_available"], linetype="dashed", color = "#051A46")+ - theme_bw(), - nrow = 1) - - -# # # Cumulative mortality at baseline and intervention stratified by hospital status -ymax<-max(c((simul_baseline$total_deaths),(simul_interventions$total_deaths))) -time<-as.Date(out$mean[,1]+startdate) -coul=c("#047883", "#24A9E2","#051A46","#E68029", "#D63304","#D1D604") -DM0<-as.data.frame(cbind(time,simul_baseline$base_mort_I+simul_baseline$base_mort_QI, - simul_baseline$base_mort_CL+simul_baseline$base_mort_QC, - simul_baseline$base_mort_X, - simul_baseline$base_mort_S+simul_baseline$base_mort_QS, - simul_baseline$base_mort_E+simul_baseline$base_mort_QE, - simul_baseline$base_mort_QR+simul_baseline$base_mort_R, - simul_baseline$death_treated_hospital, - simul_baseline$death_treated_icu, - simul_baseline$death_treated_ventilator, - simul_baseline$death_untreated_hospital, - simul_baseline$death_untreated_icu, - simul_baseline$death_untreated_ventilator)) -colnames(DM0)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM0$Time<-as.Date(DM0$Time, origin = "1970-01-01") -DMF0<-melt(DM0, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m0<-ggplot(DMF0, aes(x = Time, y = value,fill=variable)) + - geom_area() - -DM<-as.data.frame(cbind(time,simul_interventions$base_mort_I+simul_interventions$base_mort_QI,simul_interventions$base_mort_CL+simul_interventions$base_mort_QC,simul_interventions$base_mort_X,simul_interventions$base_mort_S+ - simul_interventions$base_mort_QS,simul_interventions$base_mort_E+simul_interventions$base_mort_QE,simul_interventions$base_mort_QR+simul_interventions$base_mort_R, - simul_interventions$death_treated_hospital,simul_interventions$death_treated_icu,simul_interventions$death_treated_ventilator,simul_interventions$death_untreated_hospital,simul_interventions$death_untreated_icu,simul_interventions$death_untreated_ventilator)) -colnames(DM)<-c("Time","Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator") -DM$Time<-as.Date(DM$Time, origin = "1970-01-01") -DMF<-melt(DM, id.vars="Time",measure.vars = c("Asymptomatic","Clnical","Self-Isolating","Susceptible","Exposed","Recovered", - "Treated: Hospital","Treated: ICU","Treated: Ventilator","Untreated: Hospital","Untreated: ICU","Untreated: Ventilator")) -m1<-ggplot(DMF, aes(x = Time, y = value,fill=variable)) + - geom_area() -grid.arrange(m0+ylab("Cumulatice mortality")+ - ggtitle("Baseline")+ - ylim(0, ymax), - m1+ylab("Cumulatice mortality")+ - ggtitle("Intervention")+ - ylim(0, ymax), - nrow = 1) - - - -# Estimated basic reproduction number, R_t -par(mfrow=c(1,2)) -ymax<-max(c(simul_baseline$Rt[!is.na(simul_baseline$Rt)],simul_interventions$Rt[!is.na(simul_interventions$Rt)])) -plot(time,simul_baseline$Rt,type='l',lwd=3,col='black', - main="Baseline", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -lines(time,simul_baseline$Rt/simul_baseline$Rt,lwd=2,col='grey') -plot(time,simul_interventions$Rt,type='l',lwd=3,col='black', - main="Intervention", xlab="Date", ylab="Reproduction number",ylim=c(0,ymax)) -lines(time,simul_interventions$Rt/simul_interventions$Rt,lwd=2,col='grey') - - -# ## Predicted ifr -# ymax=max(c(simul_baseline$MORT1$value,simul_interventions$MORT1$value)) -# gm<-ggplot(data=simul_interventions$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_interventions$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") -# gm0<-ggplot(data=simul_baseline$MORT1,aes(x=Age,y=value,fill=variable))+ -# geom_line(data=simul_baseline$MORT1,aes(x=Age,y=value,colour=variable),lwd=1.5)+ylim(0,ymax)+ylab("Mortality") -# -# grid.arrange(gm+theme_classic(), -# gm0+theme_classic(), -# nrow=1) - - -# ## AGE DEPENDENT MORTALITY -# cinc_mort_H1 <- parameters["nus"]*parameters["pdeath_h"]*(out$mean[,(Hindex+1)]) -# cinc_mort_HC1 <- parameters["nusc"]*parameters["pdeath_hc"]*(out$mean[,(HCindex+1)]) -# cinc_mort_ICU1 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out$mean[,(ICUindex+1)] -# cinc_mort_ICUC1 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out$mean[,(ICUCindex+1)] -# cinc_mort_Vent1 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out$mean[,(Ventindex+1)] -# cinc_mort_VentC1 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out$mean[,(VentCindex+1)] -# totage1<-as.data.frame(cinc_mort_H1+cinc_mort_HC1+cinc_mort_ICU1+cinc_mort_ICUC1+cinc_mort_Vent1+cinc_mort_VentC1) -# basemort_H1<-(out$mean[,(Hindex+1)]) -# basemort_HC1<-(out$mean[,(HCindex+1)]) -# basemort_ICU1<-(out$mean[,(ICUindex+1)]) -# basemort_ICUC1<-(out$mean[,(ICUCindex+1)]) -# basemort_Vent1<-(out$mean[,(Ventindex+1)]) -# basemort_VentC1<-(out$mean[,(VentCindex+1)]) -# totbase1<-as.data.frame(basemort_H1+basemort_HC1+basemort_ICU1+basemort_ICUC1+basemort_Vent1+basemort_VentC1) -# tc<-c() -# ages<-seq(0,100,by=5) -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc<-rbind(tc,c(i,ages[j],totage1[i,j]*ifr[j,2]+totbase1[i,j]*mort[j])) -# } -# } -# tc<-as.data.frame(tc) -# colnames(tc)<-c("Day","Age","value") -# tc$Age<-as.factor(tc$Age) -# p6<-ggplot(data=tc, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ -# ylab("Proportion of deaths") -# -# inc_mort_H0 <- parameters["nus"]*parameters["pdeath_h"]*(out0$mean[,(Hindex+1)]) -# inc_mort_HC0 <- parameters["nusc"]*parameters["pdeath_hc"]*(out0$mean[,(HCindex+1)]) -# inc_mort_ICU0 <- parameters["nu_icu"]*parameters["pdeath_icu"]*out0$mean[,(ICUindex+1)] -# inc_mort_ICUC0 <- parameters["nu_icuc"]*parameters["pdeath_icuc"]*out0$mean[,(ICUCindex+1)] -# inc_mort_Vent0 <- parameters["nu_vent"]*parameters["pdeath_vent"]*out0$mean[,(Ventindex+1)] -# inc_mort_VentC0 <- parameters["nu_ventc"]*parameters["pdeath_ventc"]*out0$mean[,(VentCindex+1)] -# totage0<-as.data.frame(inc_mort_H0+inc_mort_HC0+inc_mort_ICU0+inc_mort_ICUC0+inc_mort_Vent0+inc_mort_VentC0) -# basemort_H0<-(out0$mean[,(Hindex+1)]) -# basemort_HC0<-(out0$mean[,(HCindex+1)]) -# basemort_ICU0<-(out0$mean[,(ICUindex+1)]) -# basemort_ICUC0<-(out0$mean[,(ICUCindex+1)]) -# basemort_Vent0<-(out0$mean[,(Ventindex+1)]) -# basemort_VentC0<-(out0$mean[,(VentCindex+1)]) -# totbase0<-as.data.frame(basemort_H0+basemort_HC0+basemort_ICU0+basemort_ICUC0+basemort_Vent0+basemort_VentC0) -# tc0<-c() -# for (i in 1:dim(cinc_mort_H1)[1]) { -# for (j in 1:dim(cinc_mort_H1)[2]) { -# tc0<-rbind(tc0,c(i,ages[j],totage0[i,j]*ifr[j,2]+totbase0[i,j]*mort[j])) -# } -# } -# tc0<-as.data.frame(tc0) -# colnames(tc0)<-c("Day","Age","value") -# tc0$Age<-as.factor(tc0$Age) -# p16<-ggplot(data=tc0, aes(x=Day,y=value,fill=Age))+ -# geom_bar(stat = "identity",position="fill", width=1)+ylab("Proportion of deaths") - -# grid.arrange(p16+theme_minimal(), -# p6+theme_minimal(), -# nrow=1) -# - - -# -# -# -# ######################################################################################################################### -# ##### SUMMARY METRICS ################################################################################################ -# ####################################################################################################################### -# -infected0<-tail((rowSums(out0$mean[,(Rindex+1)])),1)/sum(popstruc[,2]) -infected0 -infected1<-tail((rowSums(out$mean[,(Rindex+1)])),1)/sum(popstruc[,2]) -infected1 - -# # #Population size checks -# # tpop1 -# # tpop0 -# -# # PCR -# time_of_measurement<-40:49 -# # general population -# (rowSums(out$mean[time_of_measurement,Iindex+1])+rowSums(out$mean[time_of_measurement,CLindex+1])+rowSums(out$mean[time_of_measurement,QIindex+1])+ -# rowSums(out$mean[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# # every infection including hospital infections -# (rowSums(out$mean[time_of_measurement,Iindex+1])+rowSums(out$mean[time_of_measurement,CLindex+1])+rowSums(out$mean[time_of_measurement,Hindex+1])+ -# rowSums(out$mean[time_of_measurement,ICUindex+1])+rowSums(out$mean[time_of_measurement,Ventindex+1])+rowSums(out$mean[time_of_measurement,HCindex+1])+ -# rowSums(out$mean[time_of_measurement,ICUCindex+1])+rowSums(out$mean[time_of_measurement,VentCindex+1])+rowSums(out$mean[time_of_measurement,QIindex+1])+ -# rowSums(out$mean[time_of_measurement,QCindex+1]))/sum(popstruc[,2]) -# -# SEROLOGY -tail((rowSums(out$mean[,(Rindex+1)])),1)/sum(popstruc[,2]) - -# IHR -sum(ihr$severe*popstruc[,2]/sum(popstruc[,2])) - - -# # PORPORTIONAL MORTALITY IN THE ELDEST -# m30<-out0$mean[30,CMindex+1]/(out0$mean[30,Cindex+1]) -# m30[is.infinite(m30)]<-0 -# m60<-out0$mean[60,CMindex+1]/out0$mean[60,Cindex+1] -# m60[is.infinite(m60)]<-0 -# m90<-out0$mean[90,CMindex+1]/out0$mean[90,Cindex+1] -# m90[is.infinite(m90)]<-0 -# m120<-out0$mean[120,CMindex+1]/out0$mean[120,Cindex+1] -# m120[is.infinite(m120)]<-0 -# -# ifr30<-sum(m30*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr60<-sum(m60*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr90<-sum(m90*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# ifr120<-sum(m120*popstruc[,2]/sum(popstruc[,2]),na.rm = T) -# cbind(ifr30,ifr60,ifr90,ifr120)*100 -# -# PMORTDF0<-as.data.frame(cbind(out0$mean[30,CMindex+1]/sum(out0$mean[30,CMindex+1]),out0$mean[60,CMindex+1]/sum(out0$mean[60,CMindex+1]), -# out0$mean[90,CMindex+1]/sum(out0$mean[90,CMindex+1]),out0$mean[120,CMindex+1]/sum(out0$mean[120,CMindex+1]))) -# PMORTDF<-as.data.frame(cbind(out$mean[30,CMindex+1]/sum(out$mean[30,CMindex+1]),out$mean[60,CMindex+1]/sum(out$mean[60,CMindex+1]), -# out$mean[90,CMindex+1]/sum(out$mean[90,CMindex+1]),out$mean[120,CMindex+1]/sum(out$mean[120,CMindex+1]))) -# sum(PMORTDF0$V2[15:21]) -# sum(PMORTDF$V2[15:21]) - - -# output doubling time over time first 7 days -# dd<-7 -# doub0<-log(2)*dd/(log(dailyinc0[2+dd]/dailyinc0[2])) -# doub0 -# -# -# - - From 76518c5ea75c07576285191d47757c48f3f2e8b4 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 22:31:38 +0100 Subject: [PATCH 30/31] rename io test script --- .gitignore | 3 ++- .../testthat/{test_io_functions.R => test-io_functions.R} | 0 2 files changed, 2 insertions(+), 1 deletion(-) rename comoOdeCpp/tests/testthat/{test_io_functions.R => test-io_functions.R} (100%) diff --git a/.gitignore b/.gitignore index b2bb43e..1892e6d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ *.o *.so *.Rcheck -temp_out/ \ No newline at end of file +temp_out/ +r_versions/ \ No newline at end of file diff --git a/comoOdeCpp/tests/testthat/test_io_functions.R b/comoOdeCpp/tests/testthat/test-io_functions.R similarity index 100% rename from comoOdeCpp/tests/testthat/test_io_functions.R rename to comoOdeCpp/tests/testthat/test-io_functions.R From 288b53cfd854b5081c68ec02090c6961bb403825 Mon Sep 17 00:00:00 2001 From: bogaotory Date: Fri, 23 Oct 2020 22:53:02 +0100 Subject: [PATCH 31/31] v16.2.1 --- comoOdeCpp/DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/comoOdeCpp/DESCRIPTION b/comoOdeCpp/DESCRIPTION index dfb6024..c745061 100644 --- a/comoOdeCpp/DESCRIPTION +++ b/comoOdeCpp/DESCRIPTION @@ -1,8 +1,8 @@ Package: comoOdeCpp Type: Package Title: Cpp version of CoMo Consortium's COVID-19 transmission model -Version: 16.2.0 -Date: 2020-10-01 +Version: 16.2.1 +Date: 2020-10-23 Author: Ricardo Aguas, Bo Gao, Sompob Saralamba Maintainer: Bo Gao Description: Cpp version of CoMo Consortium's COVID-19 transmission model