Skip to content

Commit 8695688

Browse files
authoredMar 2, 2022
Strain specific disease dynamics (#227)
Allow for all disease dynamics and severities to be strain specific. Update both Python and R interfaces and add new tests to check transmission and disease characteristics of infected agents (in both Python and R). Resolved #228 Details * Support variant specific changes to sd_infectious_period * Move transmission time distributions for disease to strain Preparation for strain specific distributions * Allow mean_time_to_symptoms to be strain dependent Add test to check the mean time to symptoms for multiple strains * Allow all disease times to be changed for strains Update the Python interface and add a test * Update the R interface to allow strain specific disease dynamics * Add disease dynamics to the meta-model R interfafe * Fix test_multi_strain_disease_transition_times Increase the size of the population to reduce random error Set np.seed at start of test to make fully reproducible * Extend strains so that all disease outcomes can be changed Update the Python interface Add a test to check disease outcomes for 2 strains * Add strain specific outcomes to R interface Repeat test_multi_strain_disease_outcome_proportions in R * Add strain specific outcomes to R MetaModel * Add strain specific infectious type factors Add test with 3 strains where only one symptom type can be transmitted in each strain * Add strain specific infectious factors to R interface Translate Python test for this to R
1 parent 8c11edf commit 8695688

13 files changed

+1632
-116
lines changed
 

‎R/MetaModel.R

+93-6
Original file line numberDiff line numberDiff line change
@@ -875,11 +875,40 @@ MetaModel <- R6Class( classname = 'MetaModel', cloneable = FALSE,
875875
return()
876876
},
877877

878-
add_new_strain = function(
879-
transmission_multiplier = 1,
880-
hospitalised_fraction = NA,
878+
add_new_strain = function(
879+
transmission_multiplier = 1,
880+
fraction_asymptomatic = NA,
881+
fraction_asymptomatic_multiplier = 1,
882+
mild_fraction = NA,
883+
mild_fraction_multiplier = 1,
884+
hospitalised_fraction = NA,
881885
hospitalised_fraction_multiplier = 1,
882-
mean_infectious_period = NA
886+
critical_fraction = NA,
887+
critical_fraction_multiplier = 1,
888+
fatality_fraction = NA,
889+
fatality_fraction_multiplier = 1,
890+
location_death_icu = NA,
891+
mean_infectious_period = NA,
892+
sd_infectious_period = NA,
893+
asymptomatic_infectious_factor = NA,
894+
mild_infectious_factor = NA,
895+
mean_time_to_symptoms = NA,
896+
sd_time_to_symptoms = NA,
897+
mean_asymptomatic_to_recovery = NA,
898+
sd_asymptomatic_to_recovery = NA,
899+
mean_time_to_recover = NA,
900+
sd_time_to_recover = NA,
901+
mean_time_hospitalised_recovery = NA,
902+
sd_time_hospitalised_recovery = NA,
903+
mean_time_critical_survive = NA,
904+
sd_time_critical_survive = NA,
905+
mean_time_to_death = NA,
906+
sd_time_to_death = NA,
907+
mean_time_to_hospital = NA,
908+
mean_time_to_critical = NA,
909+
sd_time_to_critical = NA,
910+
mean_time_to_susceptible_after_shift = NA,
911+
time_to_susceptible_shift = NA
883912
)
884913
{
885914
if( self$n_strains == self$base_params[[ 1 ]][[ "max_n_strains" ]] )
@@ -892,7 +921,36 @@ MetaModel <- R6Class( classname = 'MetaModel', cloneable = FALSE,
892921
transmission_multiplier = data$transmission_multiplier ,
893922
hospitalised_fraction = data$hospitalised_fraction,
894923
hospitalised_fraction_multiplier = data$hospitalised_fraction_multiplier,
895-
mean_infectious_period = data$mean_infectious_period
924+
fraction_asymptomatic = data$fraction_asymptomatic,
925+
fraction_asymptomatic_multiplier = data$fraction_asymptomatic_multiplier,
926+
mild_fraction = data$mild_fraction,
927+
mild_fraction_multiplier = data$mild_fraction_multiplier,
928+
critical_fraction = data$critical_fraction,
929+
critical_fraction_multiplier = data$critical_fraction_multiplier,
930+
fatality_fraction = data$fatality_fraction,
931+
fatality_fraction_multiplier = data$fatality_fraction_multiplier,
932+
location_death_icu = data$location_death_icu,
933+
mean_infectious_period = data$mean_infectious_period,
934+
sd_infectious_period = data$sd_infectious_period,
935+
asymptomatic_infectious_factor = data$asymptomatic_infectious_factor,
936+
mild_infectious_factor = data$mild_infectious_factor,
937+
mean_time_to_symptoms = data$mean_time_to_symptoms,
938+
sd_time_to_symptoms = data$sd_time_to_symptoms,
939+
mean_asymptomatic_to_recovery = data$mean_asymptomatic_to_recovery,
940+
sd_asymptomatic_to_recovery = data$sd_asymptomatic_to_recovery,
941+
mean_time_to_recover = data$mean_time_to_recover,
942+
sd_time_to_recover = data$sd_time_to_recover,
943+
mean_time_hospitalised_recovery = data$mean_time_hospitalised_recovery,
944+
sd_time_hospitalised_recovery = data$sd_time_hospitalised_recovery,
945+
mean_time_critical_survive = data$mean_time_critical_survive,
946+
sd_time_critical_survive = data$sd_time_critical_survive,
947+
mean_time_to_death = data$mean_time_to_death,
948+
sd_time_to_death = data$sd_time_to_death,
949+
mean_time_to_hospital = data$mean_time_to_hospital,
950+
mean_time_to_critical = data$mean_time_to_critical,
951+
sd_time_to_critical = data$sd_time_to_critical,
952+
mean_time_to_susceptible_after_shift = data$mean_time_to_susceptible_after_shift,
953+
time_to_susceptible_shift = data$time_to_susceptible_shift
896954
)
897955
strain_idx <- strain$idx()
898956
strains[[ nidx ]][[ strain_idx + 1 ]] <<- strain
@@ -905,7 +963,36 @@ MetaModel <- R6Class( classname = 'MetaModel', cloneable = FALSE,
905963
transmission_multiplier = transmission_multiplier ,
906964
hospitalised_fraction = hospitalised_fraction,
907965
hospitalised_fraction_multiplier = hospitalised_fraction_multiplier,
908-
mean_infectious_period = mean_infectious_period
966+
fraction_asymptomatic = fraction_asymptomatic,
967+
fraction_asymptomatic_multiplier = fraction_asymptomatic_multiplier,
968+
mild_fraction = mild_fraction,
969+
mild_fraction_multiplier = mild_fraction_multiplier,
970+
critical_fraction = critical_fraction,
971+
critical_fraction_multiplier = critical_fraction_multiplier,
972+
fatality_fraction = fatality_fraction,
973+
fatality_fraction_multiplier = fatality_fraction_multiplier,
974+
location_death_icu = location_death_icu,
975+
mean_infectious_period = mean_infectious_period,
976+
sd_infectious_period = sd_infectious_period,
977+
asymptomatic_infectious_factor = asymptomatic_infectious_factor,
978+
mild_infectious_factor = mild_infectious_factor,
979+
mean_time_to_symptoms = mean_time_to_symptoms,
980+
sd_time_to_symptoms = sd_time_to_symptoms,
981+
mean_asymptomatic_to_recovery = mean_asymptomatic_to_recovery,
982+
sd_asymptomatic_to_recovery = sd_asymptomatic_to_recovery,
983+
mean_time_to_recover = mean_time_to_recover,
984+
sd_time_to_recover = sd_time_to_recover,
985+
mean_time_hospitalised_recovery = mean_time_hospitalised_recovery,
986+
sd_time_hospitalised_recovery = sd_time_hospitalised_recovery,
987+
mean_time_critical_survive = mean_time_critical_survive,
988+
sd_time_critical_survive = sd_time_critical_survive,
989+
mean_time_to_death = mean_time_to_death,
990+
sd_time_to_death = sd_time_to_death,
991+
mean_time_to_hospital = mean_time_to_hospital,
992+
mean_time_to_critical = mean_time_to_critical,
993+
sd_time_to_critical = sd_time_to_critical,
994+
mean_time_to_susceptible_after_shift = mean_time_to_susceptible_after_shift,
995+
time_to_susceptible_shift = time_to_susceptible_shift,
909996
)
910997
node_data <- replicate( self$n_nodes, data, simplify = FALSE )
911998

‎R/Model.R

+125-8
Original file line numberDiff line numberDiff line change
@@ -720,33 +720,150 @@ Model <- R6Class( classname = 'Model', cloneable = FALSE,
720720
#' @return \code{Strain} A Strain object representing this strain
721721
add_new_strain = function(
722722
transmission_multiplier = 1,
723+
fraction_asymptomatic = NA,
724+
fraction_asymptomatic_multiplier = 1,
725+
mild_fraction = NA,
726+
mild_fraction_multiplier = 1,
723727
hospitalised_fraction = NA,
724728
hospitalised_fraction_multiplier = 1,
725-
mean_infectious_period = NA
729+
critical_fraction = NA,
730+
critical_fraction_multiplier = 1,
731+
fatality_fraction = NA,
732+
fatality_fraction_multiplier = 1,
733+
location_death_icu = NA,
734+
mean_infectious_period = NA,
735+
sd_infectious_period = NA,
736+
asymptomatic_infectious_factor = NA,
737+
mild_infectious_factor = NA,
738+
mean_time_to_symptoms = NA,
739+
sd_time_to_symptoms = NA,
740+
mean_asymptomatic_to_recovery = NA,
741+
sd_asymptomatic_to_recovery = NA,
742+
mean_time_to_recover = NA,
743+
sd_time_to_recover = NA,
744+
mean_time_hospitalised_recovery = NA,
745+
sd_time_hospitalised_recovery = NA,
746+
mean_time_critical_survive = NA,
747+
sd_time_critical_survive = NA,
748+
mean_time_to_death = NA,
749+
sd_time_to_death = NA,
750+
mean_time_to_hospital = NA,
751+
mean_time_to_critical = NA,
752+
sd_time_to_critical = NA,
753+
mean_time_to_susceptible_after_shift = NA,
754+
time_to_susceptible_shift = NA
726755
)
727756
{
728-
729-
max_n_strains = self$get_param( "max_n_strains" )
730-
n_strains = self$c_model$n_initialised_strains;
757+
max_n_strains <- self$get_param( "max_n_strains" )
758+
n_strains <- self$c_model$n_initialised_strains;
731759

732760
if( n_strains == max_n_strains )
733761
stop( "cannot add any more strains - increase the parameter max_n_strains at the initialisation of the model" )
734762

763+
if( is.na( fraction_asymptomatic[ 1 ] ) )
764+
{
765+
fraction_asymptomatic <- c()
766+
for( idx in 1:length( AgeGroupEnum ) )
767+
fraction_asymptomatic[ idx ] = self$get_param(
768+
sprintf( "fraction_asymptomatic%s", names( AgeGroupEnum[idx])) ) *
769+
fraction_asymptomatic_multiplier
770+
}
771+
772+
if( is.na( mild_fraction[ 1 ] ) )
773+
{
774+
mild_fraction <- c()
775+
for( idx in 1:length( AgeGroupEnum ) )
776+
mild_fraction[ idx ] = self$get_param(
777+
sprintf( "mild_fraction%s", names( AgeGroupEnum[idx])) ) *
778+
mild_fraction_multiplier
779+
}
780+
735781
if( is.na( hospitalised_fraction[ 1 ] ) )
736782
{
737-
hospitalised_fraction = c()
783+
hospitalised_fraction <- c()
738784
for( idx in 1:length( AgeGroupEnum ) )
739785
hospitalised_fraction[ idx ] = self$get_param(
740786
sprintf( "hospitalised_fraction%s", names( AgeGroupEnum[idx])) ) *
741787
hospitalised_fraction_multiplier
742788
}
743789

790+
if( is.na( critical_fraction[ 1 ] ) )
791+
{
792+
critical_fraction <- c()
793+
for( idx in 1:length( AgeGroupEnum ) )
794+
critical_fraction[ idx ] = self$get_param(
795+
sprintf( "critical_fraction%s", names( AgeGroupEnum[idx])) ) *
796+
critical_fraction_multiplier
797+
}
798+
799+
if( is.na( fatality_fraction[ 1 ] ) )
800+
{
801+
fatality_fraction <- c()
802+
for( idx in 1:length( AgeGroupEnum ) )
803+
fatality_fraction[ idx ] = self$get_param(
804+
sprintf( "fatality_fraction%s", names( AgeGroupEnum[idx])) ) *
805+
fatality_fraction_multiplier
806+
}
807+
808+
if( is.na( location_death_icu[ 1 ] ) )
809+
{
810+
location_death_icu <- c()
811+
for( idx in 1:length( AgeGroupEnum ) )
812+
location_death_icu[ idx ] = self$get_param(
813+
sprintf( "location_death_icu%s", names( AgeGroupEnum[idx])) )
814+
}
815+
744816
if( is.na( mean_infectious_period ) )
745-
mean_infectious_period = UNKNOWN;
817+
mean_infectious_period <- UNKNOWN;
818+
if( is.na( sd_infectious_period ) )
819+
sd_infectious_period <- UNKNOWN;
820+
if( is.na( asymptomatic_infectious_factor ) )
821+
asymptomatic_infectious_factor <- UNKNOWN
822+
if( is.na( mild_infectious_factor ) )
823+
mild_infectious_factor <- UNKNOWN
824+
if( is.na( mean_time_to_symptoms ) )
825+
mean_time_to_symptoms <- UNKNOWN;
826+
if( is.na( sd_time_to_symptoms ) )
827+
sd_time_to_symptoms <- UNKNOWN;
828+
if( is.na( mean_asymptomatic_to_recovery ) )
829+
mean_asymptomatic_to_recovery <- UNKNOWN;
830+
if( is.na( sd_asymptomatic_to_recovery ) )
831+
sd_asymptomatic_to_recovery <- UNKNOWN;
832+
if( is.na( mean_time_to_recover ) )
833+
mean_time_to_recover <- UNKNOWN;
834+
if( is.na( sd_time_to_recover ) )
835+
sd_time_to_recover <- UNKNOWN;
836+
if( is.na( mean_time_hospitalised_recovery ) )
837+
mean_time_hospitalised_recovery <- UNKNOWN;
838+
if( is.na( sd_time_hospitalised_recovery ) )
839+
sd_time_hospitalised_recovery <- UNKNOWN;
840+
if( is.na( mean_time_critical_survive ) )
841+
mean_time_critical_survive <- UNKNOWN;
842+
if( is.na( sd_time_critical_survive ) )
843+
sd_time_critical_survive <- UNKNOWN;
844+
if( is.na( mean_time_to_death ) )
845+
mean_time_to_death <- UNKNOWN;
846+
if( is.na( sd_time_to_death ) )
847+
sd_time_to_death <- UNKNOWN;
848+
if( is.na( mean_time_to_hospital ) )
849+
mean_time_to_hospital <- UNKNOWN;
850+
if( is.na( mean_time_to_critical ) )
851+
mean_time_to_critical <- UNKNOWN;
852+
if( is.na( sd_time_to_critical ) )
853+
sd_time_to_critical <- UNKNOWN;
854+
if( is.na( mean_time_to_susceptible_after_shift ) )
855+
mean_time_to_susceptible_after_shift <- UNKNOWN;
856+
if( is.na( time_to_susceptible_shift ) )
857+
time_to_susceptible_shift <- UNKNOWN;
746858

747859
c_model_ptr <- private$c_model_ptr()
748-
strain_idx<-.Call('R_add_new_strain',c_model_ptr,transmission_multiplier,
749-
hospitalised_fraction, mean_infectious_period, PACKAGE='OpenABMCovid19');
860+
strain_idx <-.Call('R_add_new_strain',c_model_ptr,transmission_multiplier,fraction_asymptomatic, mild_fraction,
861+
hospitalised_fraction, critical_fraction, fatality_fraction, location_death_icu, mean_infectious_period,sd_infectious_period,
862+
asymptomatic_infectious_factor, mild_infectious_factor, mean_time_to_symptoms, sd_time_to_symptoms, mean_asymptomatic_to_recovery,
863+
sd_asymptomatic_to_recovery, mean_time_to_recover, sd_time_to_recover, mean_time_hospitalised_recovery,
864+
sd_time_hospitalised_recovery, mean_time_critical_survive, sd_time_critical_survive, mean_time_to_death,
865+
sd_time_to_death, mean_time_to_hospital,mean_time_to_critical, sd_time_to_critical, mean_time_to_susceptible_after_shift,
866+
time_to_susceptible_shift, PACKAGE='OpenABMCovid19');
750867

751868
private$.strains[[ strain_idx + 1 ]] <- Strain$new( self, strain_idx )
752869
return( private$.strains[[ strain_idx + 1 ]] )

0 commit comments

Comments
 (0)
Please sign in to comment.