From 2fa5db032410a0171c4df591521e0e09bc99dd33 Mon Sep 17 00:00:00 2001 From: apulsipher <45372570+apulsipher@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:44:01 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20UofUEpiB?= =?UTF-8?q?io/epiworldR@bf4b6795c3fe7b1704b82f8b9c6926a66db6adf9=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/getting-started.html | 37 ++-- articles/likelihood-free-mcmc.html | 4 +- articles/mixing.html | 4 +- pkgdown.yml | 2 +- reference/ModelSEIRMixing.html | 2 +- reference/ModelSIRMixing.html | 4 +- reference/entities.html | 2 +- reference/epiworld-methods.html | 6 + reference/global-events-1.png | Bin 0 -> 74034 bytes reference/global-events-2.png | Bin 0 -> 73802 bytes reference/global-events.html | 294 +++++++++++++++++++++++++++++ reference/index.html | 6 +- search.json | 2 +- sitemap.xml | 2 +- 14 files changed, 333 insertions(+), 32 deletions(-) create mode 100644 reference/global-events-1.png create mode 100644 reference/global-events-2.png create mode 100644 reference/global-events.html diff --git a/articles/getting-started.html b/articles/getting-started.html index 99f286a8..6a46f0ca 100644 --- a/articles/getting-started.html +++ b/articles/getting-started.html @@ -176,8 +176,8 @@

Setup and running the model#> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 -#> Last run elapsed t : 97.00ms -#> Last run speed : 25.75 million agents x day / second +#> Last run elapsed t : 101.00ms +#> Last run speed : 24.67 million agents x day / second #> Rewiring : off #> #> Global events: @@ -232,22 +232,23 @@

Extracting information
 methods(class = "epiworld_model")
-#>  [1] add_tool                   add_virus                 
-#>  [3] agents_from_edgelist       agents_smallworld         
-#>  [5] get_agents                 get_hist_tool             
-#>  [7] get_hist_total             get_hist_transition_matrix
-#>  [9] get_hist_virus             get_n_replicates          
-#> [11] get_n_tools                get_n_viruses             
-#> [13] get_name                   get_ndays                 
-#> [15] get_param                  get_reproductive_number   
-#> [17] get_states                 get_today_total           
-#> [19] get_transition_probability get_transmissions         
-#> [21] print                      queuing_off               
-#> [23] queuing_on                 run_multiple              
-#> [25] run                        set_name                  
-#> [27] set_param                  size                      
-#> [29] summary                    today                     
-#> [31] verbose_off                verbose_on                
+#>  [1] add_param                  add_tool                  
+#>  [3] add_virus                  agents_from_edgelist      
+#>  [5] agents_smallworld          get_agents                
+#>  [7] get_hist_tool              get_hist_total            
+#>  [9] get_hist_transition_matrix get_hist_virus            
+#> [11] get_n_replicates           get_n_tools               
+#> [13] get_n_viruses              get_name                  
+#> [15] get_ndays                  get_param                 
+#> [17] get_reproductive_number    get_states                
+#> [19] get_today_total            get_transition_probability
+#> [21] get_transmissions          print                     
+#> [23] queuing_off                queuing_on                
+#> [25] run_multiple               run                       
+#> [27] set_name                   set_param                 
+#> [29] size                       summary                   
+#> [31] today                      verbose_off               
+#> [33] verbose_on                
 #> see '?methods' for accessing help and source code

To demonstrate, start with the basic plot and get_hist_total functions.

diff --git a/articles/likelihood-free-mcmc.html b/articles/likelihood-free-mcmc.html index 061a1cea..374ed92e 100644 --- a/articles/likelihood-free-mcmc.html +++ b/articles/likelihood-free-mcmc.html @@ -125,8 +125,8 @@

Setup and Running the Model#> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 -#> Last run elapsed t : 835.00µs -#> Last run speed : 59.88 million agents x day / second +#> Last run elapsed t : 876.00µs +#> Last run speed : 57.08 million agents x day / second #> Rewiring : off #> #> Global events: diff --git a/articles/mixing.html b/articles/mixing.html index 2a7eabb4..cc57fd6d 100644 --- a/articles/mixing.html +++ b/articles/mixing.html @@ -163,8 +163,8 @@

An SEIR model with mixing#> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 -#> Last run elapsed t : 129.00ms -#> Last run speed : 6.94 million agents x day / second +#> Last run elapsed t : 127.00ms +#> Last run speed : 7.08 million agents x day / second #> Rewiring : off #> #> Global events: diff --git a/pkgdown.yml b/pkgdown.yml index ac3cd94a..983fa023 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -7,4 +7,4 @@ articles: likelihood-free-mcmc: likelihood-free-mcmc.html mixing: mixing.html run-multiple: run-multiple.html -last_built: 2024-11-19T16:50Z +last_built: 2024-11-19T17:43Z diff --git a/reference/ModelSEIRMixing.html b/reference/ModelSEIRMixing.html index d115ee8d..213fdadd 100644 --- a/reference/ModelSEIRMixing.html +++ b/reference/ModelSEIRMixing.html @@ -202,7 +202,7 @@

Examples#> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 126.00ms -#> Last run speed : 7.09 million agents x day / second +#> Last run speed : 7.10 million agents x day / second #> Rewiring : off #> #> Global events: diff --git a/reference/ModelSIRMixing.html b/reference/ModelSIRMixing.html index 1ecb9ef9..acc22a71 100644 --- a/reference/ModelSIRMixing.html +++ b/reference/ModelSIRMixing.html @@ -195,8 +195,8 @@

Examples#> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 -#> Last run elapsed t : 68.00ms -#> Last run speed : 13.19 million agents x day / second +#> Last run elapsed t : 67.00ms +#> Last run speed : 13.36 million agents x day / second #> Rewiring : off #> #> Global events: diff --git a/reference/entities.html b/reference/entities.html index 2f9e4c12..7c04516b 100644 --- a/reference/entities.html +++ b/reference/entities.html @@ -193,7 +193,7 @@

Examples#> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 66.00ms -#> Last run speed : 15.13 million agents x day / second +#> Last run speed : 15.11 million agents x day / second #> Rewiring : off #> #> Global events: diff --git a/reference/epiworld-methods.html b/reference/epiworld-methods.html index 57d2a073..ede237b4 100644 --- a/reference/epiworld-methods.html +++ b/reference/epiworld-methods.html @@ -73,6 +73,11 @@

Usage get_param(x, pname) +add_param(x, pname, pval) + +# S3 method for class 'epiworld_model' +add_param(x, pname, pval) + set_param(x, pname, pval) set_name(x, mname) @@ -173,6 +178,7 @@

Value

  • The get_states function returns the unique states found in a model.

  • The get_param function returns a selected parameter from the model object of class epiworld_model.

  • +
  • add_param returns the model with the added parameter invisibly.

  • The set_param function does not return a value but instead alters a parameter value.

  • The set_name function does not return a value but instead alters an object diff --git a/reference/global-events-1.png b/reference/global-events-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b2e8b36a36658774e4e2787655d047e5e9dbe83a GIT binary patch literal 74034 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%0D}^x%`6dkxZK2>#@2SbLyE9>?*F) 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%0D}^x%`6dkxZK2>#@2SbLyE9>?*F) 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

    J& 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 literal 0 HcmV?d00001 diff --git a/reference/global-events.html b/reference/global-events.html new file mode 100644 index 00000000..6f7cb436 --- /dev/null +++ b/reference/global-events.html @@ -0,0 +1,294 @@ + +Global Events — global-events • epiworldR + Skip to contents + + +
    +
    +
    + +
    +

    Global events are functions that are executed at each time step of the +simulation. They are useful for implementing interventions, such as +vaccination, isolation, and social distancing by means of tools.

    +
    + +
    +

    Usage

    +
    globalevent_tool(tool, prob, name = get_name_tool(tool), day = -99)
    +
    +globalevent_tool_logit(
    +  tool,
    +  vars,
    +  coefs,
    +  name = get_name_tool(tool),
    +  day = -99
    +)
    +
    +globalevent_set_params(
    +  param,
    +  value,
    +  name = paste0("Set ", param, " to ", value),
    +  day = -99
    +)
    +
    +globalevent_fun(fun, name = deparse(substitute(fun)), day = -99)
    +
    +add_globalevent(model, event, action = NULL)
    +
    +rm_globalevent(model, event)
    +
    + +
    +

    Arguments

    + + +
    tool
    +

    An object of class tool.

    + + +
    prob
    +

    Numeric scalar. A probability between 0 and 1.

    + + +
    name
    +

    Character scalar. The name of the action.

    + + +
    day
    +

    Integer. The day (step) at which the action is executed (see details).

    + + +
    vars
    +

    Integer vector. The position of the variables in the model.

    + + +
    coefs
    +

    Numeric vector. The coefficients of the logistic regression.

    + + +
    param
    +

    Character scalar. The name of the parameter to be set.

    + + +
    value
    +

    Numeric scalar. The value of the parameter.

    + + +
    fun
    +

    Function. The function to be executed.

    + + +
    model
    +

    An object of class epiworld_model.

    + + +
    event
    +

    The event to be added or removed. If it is to add, then +it should be an object of class epiworld_globalevent. If it is to remove, +it should be an integer with the position of the event in the model +(starting from zero).

    + + +
    action
    +

    (Deprecated) use event instead.

    + +
    +
    +

    Value

    + +
    • The globalevent_set_params function returns an object of class +epiworld_globalevent_set_param and epiworld_globalevent.

    • +
    • globalevent_tool returns an object of class +epiworld_globalevent_tool and epiworld_globalevent.

    • +
    • globalevent_tool_logit returns an object of class +epiworld_globalevent_tool_logit and epiworld_globalevent.

    • +
    • The function add_globalevent returns the model with the added +event

    • +
    • The function rm_globalevent returns the model with the removed +event.

    • +
    +
    +

    Details

    +

    The function globalevent_tool_logit allows to specify a logistic +regression model for the probability of using a tool. The model is specified +by the vector of coefficients coefs and the vector of variables vars. +vars is an integer vector indicating the position of the variables in the +model.

    +

    The function globalevent_set_param allows to set a parameter of +the model. The parameter is specified by its name param and the value by +value.

    +

    The function globalevent_fun allows to specify a function to be +executed at a given day. The function object must receive an object of class +epiworld_model as only argument.

    +

    The function add_globalevent adds a global action to a model. +The model checks for actions to be executed at each time step. If the added +action matches the current time step, the action is executed. When day is +negative, the action is executed at each time step. When day is positive, +the action is executed at the specified time step.

    +
    +
    +

    See also

    +

    epiworld-model

    +
    + +
    +

    Examples

    +
    # Simple model
    +model_sirconn <- ModelSIRCONN(
    +  name                = "COVID-19",
    +  n                   = 10000,
    +  prevalence          = 0.01,
    +  contact_rate        = 5,
    +  transmission_rate   = 0.4,
    +  recovery_rate       = 0.95
    +)
    +
    +# Creating a tool
    +epitool <- tool(
    +  name = "Vaccine",
    +  prevalence = 0,
    +  as_proportion = FALSE,
    +  susceptibility_reduction = .9,
    +  transmission_reduction = .5,
    +  recovery_enhancer = .5,
    +  death_reduction = .9
    +)
    +
    +
    +# Adding a global event
    +vaccine_day_20 <- globalevent_tool(epitool, .2, day = 20)
    +add_globalevent(model_sirconn, vaccine_day_20)
    +
    +# Running and printing
    +run(model_sirconn, ndays = 40, seed = 1912)
    +#> _________________________________________________________________________
    +#> |Running the model...
    +#> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done.
    +#> | done.
    +model_sirconn
    +#> ________________________________________________________________________________
    +#> Susceptible-Infected-Removed (SIR) (connected)
    +#> It features 10000 agents, 1 virus(es), and 1 tool(s).
    +#> The model has 3 states.
    +#> The final distribution is: 2012 Susceptible, 0 Infected, and 7988 Recovered.
    +plot_incidence(model_sirconn)
    +
    +
    +# Example 2: Changing the contact rate -------------------------------------
    +model_sirconn2 <- ModelSIRCONN(
    +  name                = "COVID-19",
    +  n                   = 10000,
    +  prevalence          = 0.01,
    +  contact_rate        = 5,
    +  transmission_rate   = 0.4,
    +  recovery_rate       = 0.95
    +)
    +
    +closure_day_10 <- globalevent_set_params("Contact rate", 0, day = 10)
    +add_globalevent(model_sirconn2, closure_day_10)
    +
    +# Running and printing
    +run(model_sirconn2, ndays = 40, seed = 1912)
    +#> _________________________________________________________________________
    +#> |Running the model...
    +#> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done.
    +#> | done.
    +model_sirconn2
    +#> ________________________________________________________________________________
    +#> Susceptible-Infected-Removed (SIR) (connected)
    +#> It features 10000 agents, 1 virus(es), and 0 tool(s).
    +#> The model has 3 states.
    +#> The final distribution is: 2083 Susceptible, 0 Infected, and 7917 Recovered.
    +plot_incidence(model_sirconn2)
    +
    +# Example using `globalevent_fun` to record the state of the
    +# agents at each time step.
    +
    +# We start by creating an SIR connected model
    +model <- ModelSIRCONN(
    +  name              = "SIR with Global Saver",
    +  n                 = 1000,
    +  prevalence        = 0.01,
    +  contact_rate      = 5,
    +  transmission_rate = 0.4,
    +  recovery_rate     = 0.3
    +)
    +
    +# We create the object where the history of the agents will be stored
    +agents_history <- NULL
    +
    +# This function prints the total number of agents in each state
    +# and stores the history of the agents in the object `agents_history`
    +hist_saver <- function(m) {
    +
    +  message("Today's totals are: ", paste(get_today_total(m), collapse = ", "))
    +
    +  # We use the `<<-` operator to assign the value to the global variable
    +  # `agents_history` (see ?"<<-")
    +  agents_history <<- cbind(
    +    agents_history,
    +    get_agents_states(m)
    +  )
    +
    +}
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/reference/index.html b/reference/index.html index 43eb043c..6af733fd 100644 --- a/reference/index.html +++ b/reference/index.html @@ -172,7 +172,7 @@

    All functionsqueuing_on() queuing_off() verbose_off() verbose_on() run() summary(<epiworld_model>) get_states() get_param() set_param() set_name() get_name() get_n_viruses() get_n_tools() get_ndays() today() get_n_replicates() size() set_agents_data() get_agents_data_ncols() get_virus() get_tool() initial_states() clone_model() + queuing_on() queuing_off() verbose_off() verbose_on() run() summary(<epiworld_model>) get_states() get_param() add_param() set_param() set_name() get_name() get_n_viruses() get_n_tools() get_ndays() today() get_n_replicates() size() set_agents_data() get_agents_data_ncols() get_virus() get_tool() initial_states() clone_model()

    Methods for epiworldR objects
    @@ -190,10 +190,10 @@

    All functionsglobalevent_tool() globalevent_tool_logit() globalevent_set_params() globalevent_fun() add_globalevent() + globalevent_tool() globalevent_tool_logit() globalevent_set_params() globalevent_fun() add_globalevent() rm_globalevent() -
    Global Actions
    +
    Global Events
    run_multiple() run_multiple_get_results() make_saver() diff --git a/search.json b/search.json index 42aceb2f..899f9037 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"path":[]},{"path":"/CODE_OF_CONDUCT.html","id":"our-pledge","dir":"","previous_headings":"","what":"Our Pledge","title":"Contributor Covenant Code of Conduct","text":"members, contributors, leaders pledge make participation community harassment-free experience everyone, regardless age, body size, visible invisible disability, ethnicity, sex characteristics, gender identity expression, level experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, sexual identity orientation. pledge act interact ways contribute open, welcoming, diverse, inclusive, healthy community.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"our-standards","dir":"","previous_headings":"","what":"Our Standards","title":"Contributor Covenant Code of Conduct","text":"Examples behavior contributes positive environment community include: Demonstrating empathy kindness toward people respectful differing opinions, viewpoints, experiences Giving gracefully accepting constructive feedback Accepting responsibility apologizing affected mistakes, learning experience Focusing best just us individuals, overall community Examples unacceptable behavior include: use sexualized language imagery, sexual attention advances kind Trolling, insulting derogatory comments, personal political attacks Public private harassment Publishing others’ private information, physical email address, without explicit permission conduct reasonably considered inappropriate professional setting","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"enforcement-responsibilities","dir":"","previous_headings":"","what":"Enforcement Responsibilities","title":"Contributor Covenant Code of Conduct","text":"Community leaders responsible clarifying enforcing standards acceptable behavior take appropriate fair corrective action response behavior deem inappropriate, threatening, offensive, harmful. Community leaders right responsibility remove, edit, reject comments, commits, code, wiki edits, issues, contributions aligned Code Conduct, communicate reasons moderation decisions appropriate.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"scope","dir":"","previous_headings":"","what":"Scope","title":"Contributor Covenant Code of Conduct","text":"Code Conduct applies within community spaces, also applies individual officially representing community public spaces. Examples representing community include using official e-mail address, posting via official social media account, acting appointed representative online offline event.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"enforcement","dir":"","previous_headings":"","what":"Enforcement","title":"Contributor Covenant Code of Conduct","text":"Instances abusive, harassing, otherwise unacceptable behavior may reported community leaders responsible enforcement derekmeyer37@gmail.com. complaints reviewed investigated promptly fairly. community leaders obligated respect privacy security reporter incident.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"enforcement-guidelines","dir":"","previous_headings":"","what":"Enforcement Guidelines","title":"Contributor Covenant Code of Conduct","text":"Community leaders follow Community Impact Guidelines determining consequences action deem violation Code Conduct:","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_1-correction","dir":"","previous_headings":"Enforcement Guidelines","what":"1. Correction","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Use inappropriate language behavior deemed unprofessional unwelcome community. Consequence: private, written warning community leaders, providing clarity around nature violation explanation behavior inappropriate. public apology may requested.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_2-warning","dir":"","previous_headings":"Enforcement Guidelines","what":"2. Warning","title":"Contributor Covenant Code of Conduct","text":"Community Impact: violation single incident series actions. Consequence: warning consequences continued behavior. interaction people involved, including unsolicited interaction enforcing Code Conduct, specified period time. includes avoiding interactions community spaces well external channels like social media. Violating terms may lead temporary permanent ban.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_3-temporary-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"3. Temporary Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: serious violation community standards, including sustained inappropriate behavior. Consequence: temporary ban sort interaction public communication community specified period time. public private interaction people involved, including unsolicited interaction enforcing Code Conduct, allowed period. Violating terms may lead permanent ban.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_4-permanent-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"4. Permanent Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Demonstrating pattern violation community standards, including sustained inappropriate behavior, harassment individual, aggression toward disparagement classes individuals. Consequence: permanent ban sort public interaction within community.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"attribution","dir":"","previous_headings":"","what":"Attribution","title":"Contributor Covenant Code of Conduct","text":"Code Conduct adapted Contributor Covenant, version 2.1, available https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. Community Impact Guidelines inspired Mozilla’s code conduct enforcement ladder. answers common questions code conduct, see FAQ https://www.contributor-covenant.org/faq. Translations available https://www.contributor-covenant.org/translations.","code":""},{"path":"/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"MIT License","title":"MIT License","text":"Copyright (c) 2023 George G. Vega Yon Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.","code":""},{"path":[]},{"path":"/articles/getting-started.html","id":"setup-and-running-the-model","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Setup and running the model","title":"Getting started with epiworldR","text":"example implements social network parameters listed within ModelSIRCONN function. virus name specified (COVID-19), 50000 agents initialized, virus prevalence 0.001 declared, agent contact two others (contact_rate), transmission rate given agent 0.3, recovery rate set 13\\frac{1}{3}. create model epiworldR, simply use ModelSIRCONN function. , example take basic features epiworldR. Printing model shows us information. Nevertheless, can extract detailed information using summary method. First, name model, population size, number entities (think public spaces agents can make social contact one another), duration days, number viruses, amount time last replicate took run (last run elapsed t), rewiring status (). model also includes list global actions (interventions) called model run. Next, see list viruses used model. case, COVID-19 virus used. Note epiworldR can include one virus model. Tool(s) lists agents’ tools fight virus. Examples may include masking, vaccines, social distancing, etc. model, tools specified. Lastly, model parameters listed. execute model, use run function SIR model object, number simulation days, optional seed reproducibility. Next, print results simulated model using model_sir. two additional sections included summary running model. First, see distribution population time 50. section describes flow agents state (SIR) 50 days. example, ’ll see number agents susceptible state decreased 49,995 3,276, number agents infected state increased 5 1, recovered agents increased 46,723 50 days. counts states change based model parameters simulation run-time. transmission probabilities section outputs 3x3 matrix describes probability moving one state another. example, susceptible row, agent 0.95 probability remaining susceptible state 0.05 probability moving susceptible state infected state. Notice chance skipping states. words, agent can’t jump susceptible state recovered state; agent must pass infected state progress recovered state. logic applies moving backward; agent become susceptible infection.","code":"library(epiworldR) model_sir <- ModelSIRCONN( name = \"COVID-19\", n = 50000, prevalence = 0.0001, contact_rate = 2, transmission_rate = 0.5, recovery_rate = 1 / 3 ) # Printing the model model_sir #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 50000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. The model hasn't been run yet. summary(model_sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) (connected) #> Population size : 50000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 0 (of 0) #> Number of viruses : 1 #> Last run elapsed t : - #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 2.0000 #> - Recovery rate : 0.3333 #> - Transmission rate : 0.5000 run(model_sir, ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. summary(model_sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) (connected) #> Population size : 50000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 #> Last run elapsed t : 97.00ms #> Last run speed : 25.75 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 2.0000 #> - Recovery rate : 0.3333 #> - Transmission rate : 0.5000 #> #> Distribution of the population at time 50: #> - (0) Susceptible : 49995 -> 3276 #> - (1) Infected : 5 -> 1 #> - (2) Recovered : 0 -> 46723 #> #> Transition Probabilities: #> - Susceptible 0.95 0.05 0.00 #> - Infected 0.00 0.69 0.31 #> - Recovered 0.00 0.00 1.00"},{"path":[]},{"path":"/articles/getting-started.html","id":"extracting-information","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Extracting information","title":"Getting started with epiworldR","text":"running epiworldR model, list functions can called using epiworld model object. demonstrate, start basic plot get_hist_total functions. evident plot, SIR model constructed epiworldR displays changes susceptible, infected, recovered case counts time (days). Notice certain amount time, curves flatten. , table representation plot printed, complete state within SIR model, date, agent counts. essential statistic epidemiological models reproductive number: epiworldR method plot reproductive number automatically. function takes average values table date repeats data accounted . Another typical piece information daily incidence. number new cases per day. epiworldR, can get incidence looking daily transitions states. Although function get_hist_transition_matrix provides desired data, function plot_incidence nice wrapper visualizing data:","code":"methods(class = \"epiworld_model\") #> [1] add_tool add_virus #> [3] agents_from_edgelist agents_smallworld #> [5] get_agents get_hist_tool #> [7] get_hist_total get_hist_transition_matrix #> [9] get_hist_virus get_n_replicates #> [11] get_n_tools get_n_viruses #> [13] get_name get_ndays #> [15] get_param get_reproductive_number #> [17] get_states get_today_total #> [19] get_transition_probability get_transmissions #> [21] print queuing_off #> [23] queuing_on run_multiple #> [25] run set_name #> [27] set_param size #> [29] summary today #> [31] verbose_off verbose_on #> see '?methods' for accessing help and source code plot(model_sir) head(get_hist_total(model_sir)) #> date state counts #> 1 0 Susceptible 49995 #> 2 0 Infected 5 #> 3 0 Recovered 0 #> 4 1 Susceptible 49988 #> 5 1 Infected 12 #> 6 1 Recovered 0 repnum <- get_reproductive_number(model_sir) head(repnum) #> virus_id virus source source_exposure_date rt #> 1 0 COVID-19 7312 44 0 #> 2 0 COVID-19 46328 43 0 #> 3 0 COVID-19 43475 42 0 #> 4 0 COVID-19 23672 42 0 #> 5 0 COVID-19 18224 42 1 #> 6 0 COVID-19 48317 41 2 x <- plot(repnum, type = \"b\") subset(x, date == 10) # Reproductive number on day 10 #> virus_id virus date avg n sd lb ub #> 11 0 COVID-19 10 2.601587 630 2.29016 0 8 plot_incidence(model_sir)"},{"path":"/articles/getting-started.html","id":"adding-more-virusesviruses","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Adding more viruses/viruses","title":"Getting started with epiworldR","text":"epiworldR supports multi-virus models. code gives instructions implement . Using virus function, give name new virus/virus corresponding probability infecting given agent. example, prob_infecting set 1.0, making highly contagious. officially add new virus model, use add_virus function calling original epiworldR model object, new virus, new virus’ prevalence (set 0.01 example). running updated model new virus included 50 days, output describes simulation. confirm flu included, notice presence “Flu” Virus(es) section output. output interpretable specified previous sections. Plotting previous model (including flu) yields following. Notice presence two reproductive numbers plotted time. Variant 0 refers COVID-19, virus 1 refers flu.","code":"# Building the virus flu <- virus( name = \"Flu\", prob_infecting = .3, prevalence = .0001, as_proportion = TRUE ) # Adding the virus to the model add_virus(model_sir, flu) run(model_sir, ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. model_sir #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 50000 agents, 2 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 3285 Susceptible, 3 Infected, and 46712 Recovered. repnum2 <- get_reproductive_number(model_sir) op <- par(mfrow = c(2, 1)) plot(model_sir) plot(repnum2, type = \"b\") par(op)"},{"path":"/articles/getting-started.html","id":"tools","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Tools","title":"Getting started with epiworldR","text":"Now, implementation tools combat viruses viruses model demonstrated. First, sake simplicity, remove flu virus SIR model object (keep mind index flu virus model object 1). Next, provide parameters new tool using tool function. parameters include name tool, reduction probabilities SIR model parameters, increased probability recovery option. order add tool SIR model, use add_tool function SIR model object, new tool, prevalence tool. example, assume 85% population received vaccination.","code":"# Removing the flu virus from the model rm_virus(model_sir, 1) vaccine <- tool( name = \"Vaccine\", prevalence = 0.5, as_proportion = TRUE, susceptibility_reduction = .9, transmission_reduction = .5, recovery_enhancer = .5, death_reduction = .9 ) add_tool(model_sir, vaccine) run(model_sir, ndays = 50, seed = 1231) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. repnum3 <- get_reproductive_number(model_sir) op <- par(mfrow = c(2, 1)) plot_incidence(model_sir) plot(repnum3, type = \"b\") par(op)"},{"path":"/articles/implementation.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Implementation details of epiworldR","text":"following vignette provides detailed information implementation epiworldR. package wrapper C++ package epiworld, framework building agent-based models.1","code":""},{"path":"/articles/implementation.html","id":"general-flow-of-the-models","dir":"Articles","previous_headings":"","what":"General flow of the models","title":"Implementation details of epiworldR","text":"core function epiworldR run() function. function executes model saves results database part underlying C++ object. package implements discrete-time ABM, meaning model executed discrete steps (e.g., days). run() function executes following steps: model reset(), involves: () resetting agents, available, restoring population backup2, (b) resetting database, (c) distributing viruses tools, (d) setting initial state agents. steps fixing current_date = 0. model’s state recorded database, current_date incremented 1. resetting model, start iterative process repeating following steps: state agent updated. States updated according corresponding update_state function. Since model discrete-time, state changes stored promises, meaning agents’ states updated immediately. Instead, state updated end updates. done avoid updating state agent using updated state update state another agent. example, agent ii infects agent jj, agent jj able infect agent ii step. update schedule laid , changes made effective, , instance, individuals became infected update start next step infected state. Global actions executed. also change agents’ states, just like previous step, changes stored promises made effective actions evaluated. model’s state recorded database, current_date incremented 1. model checks whether simulation stop. simulation stop, model stops. Otherwise, model goes back step . steps included epiworld epiworldR network rewiring mutation viruses. implemented future versions epiworldR.","code":""},{"path":[]},{"path":"/articles/implementation.html","id":"transmission-probability","dir":"Articles","previous_headings":"Computing probabilities","what":"Transmission probability","title":"Implementation details of epiworldR","text":"Generally, epiworldR assumes step simulation, susceptible agents can acquire disease one infected agent. probability transmission ii jj given following formula: P(→j|one)=pij×∏k≠(1−pkj)∏k(1−pkj)+∑kpkj×∏l≠k(1−plj) P(\\j| \\mbox{one}) = \\frac{p_{ij} \\times \\prod_{k\\neq }\\left(1 - p_{kj}\\right)}{\\prod_k\\left(1 - p_{kj}\\right) + \\sum_k p_{kj} \\times \\prod_{l\\neq k}\\left(1 - p_{lj}\\right)} adjusted probabilities pijp_{ij} computed function ii, jj, virus. following section describes probabilities computed.","code":""},{"path":"/articles/implementation.html","id":"adjusted-probabilities","dir":"Articles","previous_headings":"Computing probabilities","what":"Adjusted probabilities","title":"Implementation details of epiworldR","text":"Viruses tools provide way adjust agents move states. Viruses epiworldR contain various baseline probabilities used across models, including transmission, recovery, death. hand, tools alter probabilities reducing/increasing . Furthermore, tools alter agents’ susceptibility, infectiousness, recovery, death probabilities. Currently, tools alter probabilities constant factor, pij=pv×(1−factorhost)×(1−factortarget) p_{ij} = p_{v} \\times \\left(1 - factor_{host}\\right) \\times \\left(1 - factor_{target}\\right) pvp_{v} raw transmission probability virus vv, factortfactor_{t} increasing/reducing factors tools process. example, p_v 0.9, host wearing mask, factormask host=0.3factor_{\\mbox{mask host}} = 0.3 target vaccinated, factorvaccinated target=0.5factor_{\\mbox{vaccinated target}} = 0.5, adjusted probability pijp_{ij} 0.9×(1−0.3)×(1−0.5)=0.270.9 \\times (1 - 0.3) \\times (1 - 0.5) = 0.27. agents one tool, factors combined follows: factoragent=1−∏t∈toolsagent(1−factort) factor_{agent} = 1 - \\prod_{t\\tools_{agent}}\\left(1 - factor_{t}\\right) Therefore, example, vaccinated agent wearing mask factor 1−(1−0.30)×(1−0.5)=0.651 - (1 - 0.30) \\times (1 - 0.5) = 0.65. adjusted probabilities principle also applies recovery rates SIR SEIR models.","code":""},{"path":"/articles/implementation.html","id":"transmission-in-connected-modelsmodels","dir":"Articles","previous_headings":"Computing probabilities","what":"Transmission in connected models3","title":"Implementation details of epiworldR","text":"“connected” models provide version agents live fully connected network. means agent can infect agent, making version similar typical compartmental models. models, transmission probability depends contact rate. susceptible agent, transmission process simulated follows: number contacts cc drawn binomial distribution parameters nn pp, nn number agents p=p =contact_rate/n/ n. , cc agents randomly selected population. Transmission can occur agents susceptible agent. probability transmission cc agents calculated described previous section.","code":""},{"path":"/articles/likelihood-free-mcmc.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"purpose “lfmcmc” function perform Likelihood-Free Markhov Chain Monte Carlo simulation.","code":""},{"path":[]},{"path":"/articles/likelihood-free-mcmc.html","id":"setup-and-running-the-model","dir":"Articles","previous_headings":"Example: Using LFMCMC to calibrate an SIR Model","what":"Setup and Running the Model","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"Create SIR Model add small world population. , run model.","code":"library(epiworldR) model_seed <- 122 model_sir <- ModelSIR( name = \"COVID-19\", prevalence = .1, transmission_rate = .9, recovery_rate = .3 ) agents_smallworld( model_sir, n = 1000, k = 5, d = FALSE, p = 0.01 ) verbose_off(model_sir) run( model_sir, ndays = 50, seed = model_seed ) summary(model_sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Recovered (SIR) #> Population size : 1000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 #> Last run elapsed t : 835.00µs #> Last run speed : 59.88 million agents x day / second #> Rewiring : off #> #> Global events: #> (none) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Recovery rate : 0.3000 #> - Transmission rate : 0.9000 #> #> Distribution of the population at time 50: #> - (0) Susceptible : 900 -> 0 #> - (1) Infected : 100 -> 0 #> - (2) Recovered : 0 -> 1000 #> #> Transition Probabilities: #> - Susceptible 0.62 0.38 0.00 #> - Infected 0.00 0.69 0.31 #> - Recovered 0.00 0.00 1.00"},{"path":"/articles/likelihood-free-mcmc.html","id":"setup-lfmcmc","dir":"Articles","previous_headings":"Example: Using LFMCMC to calibrate an SIR Model","what":"Setup LFMCMC","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"","code":"# Extract the observed data from the model obs_data <- unname(as.integer(get_today_total(model_sir))) # Define the LFMCMC simulation function simfun <- function(params) { set_param(model_sir, \"Recovery rate\", params[1]) set_param(model_sir, \"Transmission rate\", params[2]) run( model_sir, ndays = 50 ) res <- unname(as.integer(get_today_total(model_sir))) return(res) } # Define the LFMCMC summary function sumfun <- function(dat) { return(dat) } # Define the LFMCMC proposal function # - Based on proposal_fun_normal from lfmcmc-meat.hpp propfun <- function(params_prev) { res <- params_prev + rnorm(length(params_prev), ) return(res) } # Define the LFMCMC kernel function # - Based on kernel_fun_uniform from lfmcmc-meat.hpp kernelfun <- function(stats_now, stats_obs, epsilon) { ans <- sum(mapply(function(v1, v2) (v1 - v2)^2, stats_obs, stats_now)) return(ifelse(sqrt(ans) < epsilon, 1.0, 0.0)) } # Create the LFMCMC model lfmcmc_model <- LFMCMC(model_sir) |> set_simulation_fun(simfun) |> set_summary_fun(sumfun) |> set_proposal_fun(propfun) |> set_kernel_fun(kernelfun) |> set_observed_data(obs_data)"},{"path":"/articles/likelihood-free-mcmc.html","id":"run-lfmcmc-simulation","dir":"Articles","previous_headings":"Example: Using LFMCMC to calibrate an SIR Model","what":"Run LFMCMC simulation","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"","code":"# Set initial parameters par0 <- as.double(c(0.1, 0.5)) n_samp <- 2000 epsil <- as.double(1.0) # Run the LFMCMC simulation run_lfmcmc( lfmcmc = lfmcmc_model, params_init_ = par0, n_samples_ = n_samp, epsilon_ = epsil, seed = model_seed ) # Print the results set_stats_names(lfmcmc_model, get_states(model_sir)) set_par_names(lfmcmc_model, c(\"Immune recovery\", \"Infectiousness\")) print(lfmcmc_model) #> ___________________________________________ #> #> LIKELIHOOD-FREE MARKOV CHAIN MONTE CARLO #> #> N Samples : 2000 #> Elapsed t : 1.00s #> #> Parameters: #> -Immune recovery : 11.58 [ 0.63, 23.19] (initial : 0.10) #> -Infectiousness : 18.97 [ 1.22, 49.18] (initial : 0.50) #> #> Statistics: #> -Susceptible : 4.45 [ 0.00, 0.00] (Observed: 0.00) #> -Infected : 2.61 [ 0.00, 0.00] (Observed: 0.00) #> -Recovered : 992.44 [ 1000.00, 1000.00] (Observed: 1000.00) #> ___________________________________________"},{"path":"/articles/mixing.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Mixing models","text":"vignette shows create mixing model using epiworldR package. Mixing models feature multiple populations. group, called Entities, subset agents. agents can interact within group agents groups. contact matrix defines interaction agents.","code":""},{"path":"/articles/mixing.html","id":"an-seir-model-with-mixing","dir":"Articles","previous_headings":"","what":"An SEIR model with mixing","title":"Mixing models","text":"example, simulate outbreak featuring three populations. contact matrix defined follows: [0.90.050.050.10.80.10.10.20.7] \\left[% \\begin{array}{ccc} 0.9 & 0.05 & 0.05 \\\\ 0.1 & 0.8 & 0.1 \\\\ 0.1 & 0.2 & 0.7 \\\\ \\end{array}% \\right] matrix represents probability agent population ii interacting agent population jj. matrix row-stochastic, meaning sum row equal 1. build model using entity class epiworld. following code chunk instantiates three entities contact matrix. hand, can proceed create mixing model. following code chunk creates model, SEIR mixing, adds entities model: function add_entity adds corresponding entity. default behavior randomly assigns agents entities beginning simulation. Agents may assigned one entity. following code-chunk simulates model 100 days, summarizes results, plots incidence curve:","code":"library(epiworldR) e1 <- entity(\"Population 1\", 3e3, as_proportion = FALSE) e2 <- entity(\"Population 2\", 3e3, as_proportion = FALSE) e3 <- entity(\"Population 3\", 3e3, as_proportion = FALSE) # Row-stochastic matrix (rowsums 1) cmatrix <- c( c(0.9, 0.05, 0.05), c(0.1, 0.8, 0.1), c(0.1, 0.2, 0.7) ) |> matrix(byrow = TRUE, nrow = 3) N <- 9e3 flu_model <- ModelSEIRMixing( name = \"Flu\", n = N, prevalence = 1 / N, contact_rate = 20, transmission_rate = 0.1, recovery_rate = 1 / 7, incubation_days = 7, contact_matrix = cmatrix ) # Adding the entities flu_model |> add_entity(e1) |> add_entity(e2) |> add_entity(e3) set.seed(331) run(flu_model, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(flu_model) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) with Mixing #> Population size : 9000 #> Agents' data : (none) #> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 129.00ms #> Last run speed : 6.94 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - Flu #> #> Tool(s): #> (none) #> #> Model parameters: #> - Avg. Incubation days : 7.0000 #> - Contact rate : 20.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 8999 -> 137 #> - (1) Exposed : 1 -> 35 #> - (2) Infected : 0 -> 139 #> - (3) Recovered : 0 -> 8689 #> #> Transition Probabilities: #> - Susceptible 0.96 0.04 0.00 0.00 #> - Exposed 0.00 0.84 0.16 0.00 #> - Infected 0.00 0.00 0.86 0.14 #> - Recovered 0.00 0.00 0.00 1.00 plot_incidence(flu_model)"},{"path":"/articles/mixing.html","id":"investigating-the-history","dir":"Articles","previous_headings":"","what":"Investigating the history","title":"Mixing models","text":"running simulation, possible question : many agents entity infected day? following code chunk retrieves agents entity transmissions occurred simulation: can retrieve daily incidence entity merging transmissions agents’ entities. following code chunk accomplishes : information, can now visualize daily incidence entity. following code chunk plots daily incidence entity:","code":"library(data.table) agents_entities <- lapply(get_entities(flu_model), \\(e) { entity_get_agents(e) }) |> rbindlist() head(agents_entities) #> agent entity #> #> 1: 507 0 #> 2: 1710 0 #> 3: 8984 0 #> 4: 7844 0 #> 5: 760 0 #> 6: 4379 0 # Retrieving the transmissions transmissions <- get_transmissions(flu_model) |> data.table() # We only need the date and the source transmissions <- subset( transmissions, select = c(\"date\", \"source\") ) # Attaching the entity to the source transmissions <- merge( transmissions, agents_entities, by.x = \"source\", by.y = \"agent\" ) # Aggregating by date x entity (counts) transmissions <- transmissions[, .N, by = .(date, entity)] # Taking a look at the data head(transmissions) #> date entity N #> #> 1: 75 1 12 #> 2: 47 0 114 #> 3: 51 0 133 #> 4: 52 0 152 #> 5: 47 2 74 #> 6: 48 2 87 setorder(transmissions, date, entity) ran <- range(transmissions$N) transmissions[entity == 0, plot( x = date, y = N, type = \"l\", col = \"black\", ylim = ran)] #> NULL transmissions[entity == 1, lines(x = date, y = N, col = \"red\")] #> NULL transmissions[entity == 2, lines(x = date, y = N, col = \"blue\")] #> NULL legend( \"topright\", legend = c(\"Population 1\", \"Population 2\", \"Population 3\"), col = c(\"black\", \"red\", \"blue\"), lty = 1 )"},{"path":"/articles/run-multiple.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Run Multiple","text":"purpose “run_multiple” function run specified number simulations using model object. , function makes possible compare model results across several separate repeated simulations.","code":""},{"path":[]},{"path":"/articles/run-multiple.html","id":"setup-and-running-model","dir":"Articles","previous_headings":"Example: Simulating a SEIRCONN Model 50 Times","what":"Setup and Running Model","title":"Run Multiple","text":"use “run_multiple” function epiworld, create epimodel choice; case, example uses SEIRCONN model COVID-19, 100000 people, initial prevalence 0.0001 (0.01%), contact rate 2, probability transmission 0.5, total 7 incubation days, probability recovery 13\\frac{1}{3}.","code":"library(epiworldR) model_seirconn <- ModelSEIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.0001, contact_rate = 2, transmission_rate = 0.5, incubation_days = 7, recovery_rate = 1 / 3 )"},{"path":"/articles/run-multiple.html","id":"generating-a-saver","dir":"Articles","previous_headings":"Example: Simulating a SEIRCONN Model 50 Times","what":"Generating a Saver","title":"Run Multiple","text":"Next, generate saver purpose extracting “total_hist” “reproductive” information model object. Now, use “run_multiple” function model object, number desired days run simulation, number simulations run, number threads parallel computing. Using “run_multiple_get_results” function, extract results model object simulated 50 times comparison across simulations.","code":"# Generating a saver saver <- make_saver(\"total_hist\", \"reproductive\") # Running and printing run_multiple(model_seirconn, ndays = 50, nsims = 50, saver = saver, nthreads = 2) #> Starting multiple runs (50) using 2 thread(s) #> _________________________________________________________________________ #> _________________________________________________________________________ #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Retrieving the results ans <- run_multiple_get_results(model_seirconn) head(ans$total_hist) #> sim_num date nviruses state counts #> 1 1 0 1 Susceptible 9999 #> 2 1 0 1 Exposed 1 #> 3 1 0 1 Infected 0 #> 4 1 0 1 Recovered 0 #> 5 1 1 1 Susceptible 9999 #> 6 1 1 1 Exposed 1 head(ans$reproductive) #> sim_num virus_id virus source source_exposure_date rt #> 1 2 0 COVID-19 9964 50 0 #> 2 2 0 COVID-19 9828 50 0 #> 3 2 0 COVID-19 9689 50 0 #> 4 2 0 COVID-19 9687 50 0 #> 5 2 0 COVID-19 9651 50 0 #> 6 2 0 COVID-19 9277 50 0"},{"path":"/articles/run-multiple.html","id":"plotting","dir":"Articles","previous_headings":"Example: Simulating a SEIRCONN Model 50 Times","what":"Plotting","title":"Run Multiple","text":"plot epicurves reproductive numbers time using boxplots, extract results model object using “run_multiple_get_results”. example, dates filtered less equal 20 observe epicurves first 20 days. Notice boxplot table represents observed values 50 simulations date. view plot reproductive number 50 days 50 simulations, store reproductive results new object using “run_multiple_get_results”, plot using “boxplot” function. Notice source exposure date displays boxplot representing distribution reproductive numbers across 50 simulations. expected, reproductive number average, decreases time.","code":"seirconn_50 <- run_multiple_get_results(model_seirconn)$total_hist seirconn_50 <- seirconn_50[seirconn_50$date <= 20, ] plot(seirconn_50) seirconn_50_r <- run_multiple_get_results(model_seirconn)$reproductive plot(seirconn_50_r) # boxplot(rt ~ source_exposure_date, data = seirconn_50_r, # main = \"Reproductive Number\", # xlab = \"Source Exposure Date\", # ylab = \"rt\", # border = \"black\", # las = 2)"},{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"George Vega Yon. Author, maintainer. Derek Meyer. Author. Susan Holmes. Reviewer. JOSS reviewer Abinash Satapathy. Reviewer. JOSS reviewer Carinogurjao. Reviewer. Centers Disease Control Prevention. Funder. Award number 1U01CK000585; 75D30121F00003","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Meyer, Derek Vega Yon, George (2023). epiworldR: Fast Agent-Based Epi Models. Journal Open Source Software, 8(90), 5781, https://doi.org/10.21105/joss.05781 Meyer D, Vega Yon G (????). epiworldR: Fast Agent-Based Epi Models. R package version 0.4-3, https://github.com/UofUEpiBio/epiworldR.","code":"@Article{, entry = {Article}, title = {epiworldR: Fast Agent-Based Epi Models}, author = {Derek Meyer and George {Vega Yon}}, journal = {The Journal of Open Source Software}, year = {2023}, month = {oct}, volume = {8}, number = {90}, doi = {10.21105/joss.05781}, url = {https://joss.theoj.org/papers/10.21105/joss.05781}, } @Manual{, title = {{{epiworldR: Fast Agent-Based Epi Models}}}, author = {Derek Meyer and George {Vega Yon}}, note = {R package version 0.4-3}, url = {https://github.com/UofUEpiBio/epiworldR}, }"},{"path":"/index.html","id":"epiworldr","dir":"","previous_headings":"","what":"Fast Agent-Based Epi Models","title":"Fast Agent-Based Epi Models","text":"R package wrapper C++ library epiworld. provides general framework modeling disease transmission using agent-based models. main features include: Fast simulation average 30 million agents/day per second. One model can include multiple diseases. Policies (tools) can multiple user-defined. Transmission can function agents’ features. ---box parallelization multiple simulations. package’s description: flexible framework Agent-Based Models (ABM), epiworldR package provides methods prototyping disease outbreaks transmission models using C++ backend, making fast. supports multiple epidemiological models, including Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), others, involving arbitrary mitigation policies multiple-disease models. Users can specify infectiousness/susceptibility rates function agents’ features, providing great complexity model dynamics. Furthermore, epiworldR ideal simulation studies featuring large populations. Current available models: ModelDiffNet ModelSEIR ModelSEIRCONN ModelSEIRD ModelSEIRDCONN ModelSEIRMixing ModelSIR ModelSIRCONN ModelSIRD ModelSIRDCONN ModelSIRLogit ModelSIRMixing ModelSIS ModelSISD ModelSURV","code":""},{"path":"/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Fast Agent-Based Epi Models","text":"can install development version epiworldR GitHub : CRAN","code":"devtools::install_github(\"UofUEpiBio/epiworldR\") install.packages(\"epiworldR\")"},{"path":"/index.html","id":"examples","dir":"","previous_headings":"","what":"Examples","title":"Fast Agent-Based Epi Models","text":"R package includes several popular epidemiological models, including SIS, SIR, SEIR using either fully connected graph (similar compartmental model) user-defined network.","code":""},{"path":"/index.html","id":"sir-model-using-a-random-graph","dir":"","previous_headings":"","what":"SIR model using a random graph","title":"Fast Agent-Based Epi Models","text":"Susceptible-Infected-Recovered model features population 100,000 agents simulated small-world network. agent connected ten agents. One percent population virus, 70% chance transmission. Infected individuals recover 0.3 rate: Visualizing outputs","code":"library(epiworldR) # Creating a SIR model sir <- ModelSIR( name = \"COVID-19\", prevalence = .01, transmission_rate = .7, recovery = .3 ) |> # Adding a Small world population agents_smallworld(n = 100000, k = 10, d = FALSE, p = .01) |> # Running the model for 50 days run(ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. sir #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered (SIR) #> It features 100000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 822 Susceptible, 415 Infected, and 98763 Recovered. summary(sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Recovered (SIR) #> Population size : 100000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 #> Last run elapsed t : 62.00ms #> Last run speed : 79.47 million agents x day / second #> Rewiring : off #> #> Global events: #> (none) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Recovery rate : 0.3000 #> - Transmission rate : 0.7000 #> #> Distribution of the population at time 50: #> - (0) Susceptible : 99000 -> 822 #> - (1) Infected : 1000 -> 415 #> - (2) Recovered : 0 -> 98763 #> #> Transition Probabilities: #> - Susceptible 0.91 0.09 0.00 #> - Infected 0.00 0.70 0.30 #> - Recovered 0.00 0.00 1.00 plot(sir) plot_incidence(sir)"},{"path":"/index.html","id":"seir-model-with-a-fully-connected-graph","dir":"","previous_headings":"","what":"SEIR model with a fully connected graph","title":"Fast Agent-Based Epi Models","text":"SEIR model similar SIR model includes exposed state. , simulate population 10,000 agents 0.01 prevalence, 0.6 transmission rate, 0.5 recovery rate, 7 days-incubation period. population fully connected, meaning agents can transmit disease agent: Computing key statistics","code":"model_seirconn <- ModelSEIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 10, incubation_days = 7, transmission_rate = 0.1, recovery_rate = 1 / 7 ) |> add_virus( virus( name = \"COVID-19\", prevalence = 0.01, as_proportion = TRUE, prob_infecting = 0.01, recovery_rate = 0.6, prob_death = 0.5, incubation = 7 )) set.seed(132) run(model_seirconn, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(model_seirconn) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> Population size : 10000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 100 (of 100) #> Number of viruses : 2 #> Last run elapsed t : 15.00ms #> Last run speed : 64.01 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - COVID-19 #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Avg. Incubation days : 7.0000 #> - Contact rate : 10.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 9800 -> 11 #> - (1) Exposed : 200 -> 0 #> - (2) Infected : 0 -> 3 #> - (3) Recovered : 0 -> 9986 #> #> Transition Probabilities: #> - Susceptible 0.94 0.06 0.00 0.00 #> - Exposed 0.00 0.85 0.15 0.00 #> - Infected 0.00 0.00 0.86 0.14 #> - Recovered 0.00 0.00 0.00 1.00 plot(model_seirconn) repnum <- get_reproductive_number(model_seirconn) head(plot(repnum)) #> virus_id virus date avg n sd lb ub #> 1 0 COVID-19 0 5.769231 91 5.455022 1.000 20.750 #> 2 0 COVID-19 2 6.400000 10 4.880801 0.450 14.875 #> 3 0 COVID-19 3 5.166667 18 4.422536 0.425 13.000 #> 4 0 COVID-19 4 4.659091 44 3.784566 0.000 12.850 #> 5 0 COVID-19 5 5.205882 34 3.273210 0.000 12.175 #> 6 0 COVID-19 6 3.137255 51 2.713077 0.000 8.750 head(plot_generation_time(model_seirconn)) #> date avg n sd ci_lower ci_upper virus virus_id #> 1 2 4.444444 9 2.185813 2.2 8.000 COVID-19 0 #> 2 3 7.411765 17 3.922034 2.4 15.000 COVID-19 0 #> 3 4 8.538462 39 7.100208 2.0 22.000 COVID-19 0 #> 4 5 6.312500 32 3.905641 2.0 13.225 COVID-19 0 #> 5 6 7.200000 40 4.052223 2.0 15.100 COVID-19 0 #> 6 7 7.660000 50 4.461216 2.0 17.000 COVID-19 0"},{"path":"/index.html","id":"sir-logit","dir":"","previous_headings":"","what":"SIR Logit","title":"Fast Agent-Based Epi Models","text":"model provides complex transmission recovery pattern based agents’ features. , can reflect co-morbidities change probability infection recovery. , simulate population including dataset two features: intercept binary variable Female. probability infection recovery functions intercept Female variables. following code simulates population 100,000 agents small-world network. agent connected eight agents. One percent population virus, 80% chance transmission. Infected individuals recover 0.3 rate:","code":"# Simulating a population of 100,000 agents set.seed(2223) n <- 100000 # Agents' features X <- cbind( Intercept = 1, Female = sample.int(2, n, replace = TRUE) - 1 ) coef_infect <- c(.1, -2, 2) coef_recover <- rnorm(2) # Creating the model model_logit <- ModelSIRLogit( \"covid2\", data = X, coefs_infect = coef_infect, coefs_recover = coef_recover, coef_infect_cols = 1L:ncol(X), coef_recover_cols = 1L:ncol(X), prob_infection = .8, recovery_rate = .3, prevalence = .01 ) # Adding a small-world population agents_smallworld(model_logit, n, 8, FALSE, .01) # Running the model run(model_logit, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(model_logit) # Females are supposed to be more likely to become infected rn <- get_reproductive_number(model_logit) (table( X[, \"Female\"], (1:n %in% rn$source) ) |> prop.table())[, 2] #> 0 1 #> 0.12984 0.14201 # Looking into the agents get_agents(model_logit) #> Agents from the model \"Susceptible-Infected-Removed (SIR) (logit)\": #> Agent: 0, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 1, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 2, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 3, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 4, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 5, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 6, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 7, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 8, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 9, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> ... 99990 more agents ..."},{"path":"/index.html","id":"transmission-network","dir":"","previous_headings":"","what":"Transmission network","title":"Fast Agent-Based Epi Models","text":"example shows can draw transmission network simulation. following code simulates population 500 agents small-world network. agent connected ten agents. One percent population virus, 50% chance transmission. Infected individuals recover 0.5 rate:","code":"# Creating a SIR model sir <- ModelSIR( name = \"COVID-19\", prevalence = .01, transmission_rate = .5, recovery = .5 ) |> # Adding a Small world population agents_smallworld(n = 500, k = 10, d = FALSE, p = .01) |> # Running the model for 50 days run(ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. # Transmission network net <- get_transmissions(sir) # Plotting library(epiworldR) library(netplot) #> Loading required package: grid x <- igraph::graph_from_edgelist( as.matrix(net[, 2:3]) + 1 ) nplot(x, edge.curvature = 0, edge.color = \"gray\", skip.vertex = TRUE)"},{"path":"/index.html","id":"multiple-simulations","dir":"","previous_headings":"","what":"Multiple simulations","title":"Fast Agent-Based Epi Models","text":"epiworldR supports running multiple simulations using run_multiple function. following code simulates 50 SIR models 1000 agents . agent connected ten agents. One percent population virus, 90% chance transmission. Infected individuals recover 0.1 rate. results saved data.frame:","code":"model_sir <- ModelSIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 1000, contact_rate = 2, transmission_rate = 0.9, recovery_rate = 0.1 ) # Generating a saver saver <- make_saver(\"total_hist\", \"reproductive\") # Running and printing # Notice the use of nthread = 2 to run the simulations in parallel run_multiple(model_sir, ndays = 100, nsims = 50, saver = saver, nthread = 2) #> Starting multiple runs (50) #> _________________________________________________________________________ #> _________________________________________________________________________ #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Retrieving the results ans <- run_multiple_get_results(model_sir) head(ans$total_hist) #> sim_num date nviruses state counts #> 1 1 0 1 Susceptible 990 #> 2 1 0 1 Infected 10 #> 3 1 0 1 Recovered 0 #> 4 1 1 1 Susceptible 971 #> 5 1 1 1 Infected 29 #> 6 1 1 1 Recovered 0 head(ans$reproductive) #> sim_num virus_id virus source source_exposure_date rt #> 1 1 0 COVID-19 943 9 0 #> 2 1 0 COVID-19 40 9 0 #> 3 1 0 COVID-19 6 9 0 #> 4 1 0 COVID-19 973 8 0 #> 5 1 0 COVID-19 495 9 0 #> 6 1 0 COVID-19 480 8 0 plot(ans$reproductive)"},{"path":"/index.html","id":"tutorials","dir":"","previous_headings":"","what":"Tutorials","title":"Fast Agent-Based Epi Models","text":"virtual INSNA Sunbelt 2023 session can found : https://github.com/UofUEpiBio/epiworldR-workshop/tree/sunbelt2023-virtual -person INSNA Sunbelt 2023 session can found : https://github.com/UofUEpiBio/epiworldR-workshop/tree/sunbetl2023-inperson","code":""},{"path":"/index.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Fast Agent-Based Epi Models","text":"use epiworldR research, please cite follows:","code":"citation(\"epiworldR\") #> To cite epiworldR in publications use: #> #> Meyer, Derek and Vega Yon, George (2023). epiworldR: Fast Agent-Based #> Epi Models. Journal of Open Source Software, 8(90), 5781, #> https://doi.org/10.21105/joss.05781 #> #> And the actual R package: #> #> Meyer D, Vega Yon G (????). _epiworldR: Fast Agent-Based Epi Models_. #> R package version 0.3-2, . #> #> To see these entries in BibTeX format, use 'print(, #> bibtex=TRUE)', 'toBibtex(.)', or set #> 'options(citation.bibtex.max=999)'."},{"path":"/index.html","id":"existing-alternatives","dir":"","previous_headings":"","what":"Existing Alternatives","title":"Fast Agent-Based Epi Models","text":"Several alternatives epiworldR exist provide researchers range options, unique features strengths, enabling exploration analysis infectious disease dynamics agent-based modeling. manually curated table existing alternatives, including ABM [@ABM], abmR [@abmR], cystiSim [@cystiSim], villager [@villager], RNetLogo [@RNetLogo].","code":""},{"path":"/index.html","id":"other-abm-r-packages","dir":"","previous_headings":"","what":"Other ABM R packages","title":"Fast Agent-Based Epi Models","text":"may want check R packages agent-based modeling: ABM, abmR, cystiSim, villager, RNetLogo.","code":""},{"path":"/index.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Fast Agent-Based Epi Models","text":"epiworldR project released Contributor Code Conduct. contributing project, agree abide terms.","code":""},{"path":"/paper.html","id":null,"dir":"","previous_headings":"","what":"Introduction","title":"Introduction","text":"Agent-based modeling (ABM) emerged powerful computational approach studying complex systems across various fields, including social sciences epidemiology. simulating interactions behaviors individual entities, known agents, ABM provides unique lens researchers can analyze understand emergent properties dynamics systems. epiworldR package provides flexible framework ABM implementation methods prototyping disease outbreaks transmission models using C++ backend. supports multiple epidemiological models, including Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), others, involving arbitrary mitigation policies multiple-disease models. Users can specify transmission/susceptibility rates function agents’ features, providing great complexity model dynamics.","code":""},{"path":"/paper.html","id":"key-features","dir":"","previous_headings":"","what":"Key Features","title":"Introduction","text":"Built robust foundation C++, package combines efficient computation flexibility R, providing seamless user experience several standout features: Multiple Viruses - feature allows researchers simulate analyze dynamics various infectious diseases simultaneously. Multiple Tools - capability enables users design model objects may reflect real-world interventions. Examples include vaccines, mask wearing protocols, social distancing, much . Multiple Runs - epiworldR ability run simulations multiple times, providing complete picture simulation results behaviors. Global Actions - Similar adding multiple tools, global actions allow users implement interventions policies global scale point simulation, mimicking real-world scenarios aiding assessment impact. Built-Epidemiological Models - feature ensures researchers access well-established widely recognized frameworks, making easier compare benchmark results. Included popular epidemiological models : SIR, SIS, SEIR, SIR connected, SIS connected, SEIR connected, . extensive range features, epiworldR empowers researchers practitioners field epidemiology conduct thorough analyses, make informed decisions, contribute advancement public health.","code":""},{"path":"/paper.html","id":"existing-alternatives","dir":"","previous_headings":"","what":"Existing Alternatives","title":"Introduction","text":"Several alternatives epiworldR exist provide researchers range options, unique features strengths, enabling exploration analysis infectious disease dynamics agent-based modeling. manually curated table existing alternatives including ABM [@ABM], abmR [@abmR], cystiSim [@cystiSim], villager [@villager], RNetLogo [@RNetLogo].","code":""},{"path":"/paper.html","id":"statement-of-need","dir":"","previous_headings":"","what":"Statement of Need","title":"Introduction","text":"epiworldR package addresses need sophisticated epidemiological research offering user-friendly agent-based modeling (ABM) tool simulating analyzing infectious disease dynamics. caters diverse audience researchers, epidemiologists, public health practitioners, social scientists, policymakers, enabling study complex disease spread patterns, evaluate intervention strategies, prepare emerging pathogens. Unlike traditional epidemiological models, epiworldR’s ABM approach captures individual-level behaviors interactions, providing realistic representation disease dynamics. distinction sets apart compartmental models ABM frameworks, making epiworldR valuable accessible tool advancing infectious disease modeling enhancing outbreak preparedness.","code":""},{"path":"/paper.html","id":"conclusion","dir":"","previous_headings":"","what":"Conclusion","title":"Introduction","text":"development epiworldR package ushered new era agent-based modeling field social science epidemiology. harnessing power C++ flexibility R, comprehensive package offers multitude features enhance modeling analysis complex infectious disease dynamics. package’s ability handle multiple viruses tools, diverse set epidemiological models, capability run simulations multiple times, inclusion global actions capability empower researchers explore wide range scenarios make informed decisions regarding public health interventions. epiworldR serves valuable resource social science epidemiological communities, enabling study real-world phenomena, prediction outcomes, policy analysis. field epidemiology continues evolve, epiworldR stands forefront, providing researchers practitioners powerful tool navigate complexities infectious diseases contribute improvement global health outcomes.","code":""},{"path":[]},{"path":"/reference/LFMCMC.html","id":null,"dir":"Reference","previous_headings":"","what":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC)","code":""},{"path":"/reference/LFMCMC.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"","code":"LFMCMC(model) run_lfmcmc(lfmcmc, params_init_, n_samples_, epsilon_, seed = NULL) set_observed_data(lfmcmc, observed_data_) set_proposal_fun(lfmcmc, fun) use_proposal_norm_reflective(lfmcmc) set_simulation_fun(lfmcmc, fun) set_summary_fun(lfmcmc, fun) set_kernel_fun(lfmcmc, fun) use_kernel_fun_gaussian(lfmcmc) set_par_names(lfmcmc, names) set_stats_names(lfmcmc, names) # S3 method for class 'epiworld_lfmcmc' print(x, ...)"},{"path":"/reference/LFMCMC.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"model model class epiworld_model lfmcmc LFMCMC model params_init_ Initial model parameters n_samples_ Number samples epsilon_ Epsilon parameter seed Random engine seed observed_data_ Observed data fun LFMCMC kernel function names model stats names x LFMCMC model print ... Ignored","code":""},{"path":"/reference/LFMCMC.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"LFMCMC function returns model class epiworld_lfmcmc. simulated model class epiworld_lfmcmc. lfmcmc model observed data added lfmcmc model proposal function added LFMCMC model proposal function set norm reflective lfmcmc model simulation function added lfmcmc model summary function added lfmcmc model kernel function added LFMCMC model kernel function set gaussian lfmcmc model parameter names added lfmcmc model stats names added lfmcmc model","code":""},{"path":"/reference/LFMCMC.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"Performs Likelihood-Free Markhov Chain Monte Carlo simulation","code":""},{"path":"/reference/LFMCMC.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"","code":"## Setup an SIR model to use in the simulation model_seed <- 122 model_sir <- ModelSIR(name = \"COVID-19\", prevalence = .1, transmission_rate = .9, recovery_rate = .3) agents_smallworld( model_sir, n = 1000, k = 5, d = FALSE, p = 0.01 ) verbose_off(model_sir) run(model_sir, ndays = 50, seed = model_seed) ## Setup LFMCMC # Extract the observed data from the model obs_data <- unname(as.integer(get_today_total(model_sir))) # Define the simulation function simfun <- function(params) { set_param(model_sir, \"Recovery rate\", params[1]) set_param(model_sir, \"Transmission rate\", params[2]) run(model_sir, ndays = 50) res <- unname(as.integer(get_today_total(model_sir))) return(res) } # Define the summary function sumfun <- function(dat) { return(dat) } # Create the LFMCMC model lfmcmc_model <- LFMCMC(model_sir) |> set_simulation_fun(simfun) |> set_summary_fun(sumfun) |> use_proposal_norm_reflective() |> use_kernel_fun_gaussian() |> set_observed_data(obs_data) ## Run LFMCMC simulation # Set initial parameters par0 <- as.double(c(0.1, 0.5)) n_samp <- 2000 epsil <- as.double(1.0) # Run the LFMCMC simulation run_lfmcmc( lfmcmc = lfmcmc_model, params_init_ = par0, n_samples_ = n_samp, epsilon_ = epsil, seed = model_seed ) # Print the results set_stats_names(lfmcmc_model, get_states(model_sir)) set_par_names(lfmcmc_model, c(\"Immune recovery\", \"Infectiousness\")) print(lfmcmc_model) #> ___________________________________________ #> #> LIKELIHOOD-FREE MARKOV CHAIN MONTE CARLO #> #> N Samples : 2000 #> Elapsed t : 1.00s #> #> Parameters: #> -Immune recovery : 0.45 [ 0.14, 0.95] (initial : 0.10) #> -Infectiousness : 0.85 [ 0.54, 1.00] (initial : 0.50) #> #> Statistics: #> -Susceptible : 0.22 [ 0.00, 2.00] (Observed: 0.00) #> -Infected : 0.07 [ 0.00, 1.00] (Observed: 0.00) #> -Recovered : 995.71 [ 998.00, 1000.00] (Observed: 1000.00) #> ___________________________________________ #>"},{"path":"/reference/ModelDiffNet.html","id":null,"dir":"Reference","previous_headings":"","what":"Network Diffusion Model — ModelDiffNet","title":"Network Diffusion Model — ModelDiffNet","text":"network diffusion model simple model assumes probability adoption behavior proportional number adopters network.","code":""},{"path":"/reference/ModelDiffNet.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Network Diffusion Model — ModelDiffNet","text":"","code":"ModelDiffNet( name, prevalence, prob_adopt, normalize_exposure = TRUE, data = matrix(nrow = 0, ncol = 0), data_cols = 1L:ncol(data), params = vector(\"double\") ) # S3 method for class 'epiworld_diffnet' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelDiffNet.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Network Diffusion Model — ModelDiffNet","text":"name Name model. prevalence Prevalence disease. prob_adopt Probability adoption. normalize_exposure Normalize exposure. data Data. data_cols Data columns. params Parameters. x Object class epiworld_diffnet. main Title plot ... Passed graphics::plot.","code":""},{"path":"/reference/ModelDiffNet.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Network Diffusion Model — ModelDiffNet","text":"object class epiworld_diffnet epiworld_model.","code":""},{"path":"/reference/ModelDiffNet.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Network Diffusion Model — ModelDiffNet","text":"Different common epidemiological models, network diffusion model assumes probability adoption behavior proportional number adopters network. model defined following equations: $$ P(adopt) = \\mbox{Logit}^{-1}(prob\\_adopt + params * data + exposure) $$ exposure number adopters agent's network. Another important difference transmission network necesary useful since adoption model particular neighbor.","code":""},{"path":[]},{"path":"/reference/ModelDiffNet.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Network Diffusion Model — ModelDiffNet","text":"","code":"set.seed(2223) n <- 10000 # Generating synthetic data on a matrix with 2 columns. X <- cbind( age = sample(1:100, n, replace = TRUE), female = sample.int(2, n, replace = TRUE) - 1 ) adopt_chatgpt <- ModelDiffNet( \"ChatGPT\", prevalence = .01, prob_adopt = .1, data = X, params = c(1, 4) ) # Simulating a population from smallworld agents_smallworld(adopt_chatgpt, n, 8, FALSE, .01) # Running the model for 50 steps run(adopt_chatgpt, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. # Plotting the model plot(adopt_chatgpt)"},{"path":"/reference/ModelSEIR.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"Susceptible Exposed Infected Recovered model (SEIR)","code":""},{"path":"/reference/ModelSEIR.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"","code":"ModelSEIR(name, prevalence, transmission_rate, incubation_days, recovery_rate) # S3 method for class 'epiworld_seir' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIR.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. x Object class SEIR. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSEIR.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"ModelSEIRfunction returns model class epiworld_model. plot function returns plot SEIR model class epiworld_model.","code":""},{"path":"/reference/ModelSEIR.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) Proportion non-infected agents removed, (2) Proportion exposed agents set infected.","code":""},{"path":[]},{"path":"/reference/ModelSEIR.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"","code":"model_seir <- ModelSEIR(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, incubation_days = 4) # Adding a small world population agents_smallworld( model_seir, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_seir, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seir #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 0 Susceptible, 0 Exposed, 0 Infected, and 1000 Removed. plot(model_seir, main = \"SEIR Model\")"},{"path":"/reference/ModelSEIRCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"SEIR connected model implements model agents connected. equivalent compartmental model (wiki).","code":""},{"path":"/reference/ModelSEIRCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"","code":"ModelSEIRCONN( name, n, prevalence, contact_rate, transmission_rate, incubation_days, recovery_rate ) # S3 method for class 'epiworld_seirconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"name String. Name virus. n Number individuals population. prevalence Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Probability recovery_rate. x Object class SEIRCONN. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"ModelSEIRCONNfunction returns model class epiworld_model. plot function returns plot SEIRCONN model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSEIRCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"","code":"# An example with COVID-19 model_seirconn <- ModelSEIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 2, incubation_days = 7, transmission_rate = 0.5, recovery_rate = 0.3 ) # Running and printing run(model_seirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 446 Susceptible, 4 Exposed, 3 Infected, and 9547 Recovered. plot(model_seirconn) # Adding the flu flu <- virus(\"Flu\", .9, 1 / 7, prevalence = 0.001, as_proportion = TRUE) add_virus(model_seirconn, flu) #' # Running and printing run(model_seirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> It features 10000 agents, 2 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 0 Susceptible, 0 Exposed, 0 Infected, and 10000 Recovered. plot(model_seirconn)"},{"path":"/reference/ModelSEIRD.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD)","code":""},{"path":"/reference/ModelSEIRD.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"","code":"ModelSEIRD( name, prevalence, transmission_rate, incubation_days, recovery_rate, death_rate ) # S3 method for class 'epiworld_seird' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRD.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. death_rate Numeric scalar 0 1. Rate death virus. x Object class SEIRD. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRD.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"ModelSEIRDfunction returns model class epiworld_model. plot function returns plot SEIRD model class epiworld_model.","code":""},{"path":"/reference/ModelSEIRD.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) Proportion exposed agents infected, (2) proportion non-infected agents already removed, (3) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSEIRD.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"","code":"model_seird <- ModelSEIRD(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, incubation_days = 4, death_rate = 0.01) # Adding a small world population agents_smallworld( model_seird, n = 100000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_seird, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seird #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed-Deceased (SEIRD) #> It features 100000 agents, 1 virus(es), and 0 tool(s). #> The model has 5 states. #> The final distribution is: 2654 Susceptible, 383 Exposed, 1389 Infected, 87607 Removed, and 7967 Deceased. plot(model_seird, main = \"SEIRD Model\")"},{"path":"/reference/ModelSEIRDCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"SEIRD connected model implements model agents connected. equivalent compartmental model (wiki).","code":""},{"path":"/reference/ModelSEIRDCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"","code":"ModelSEIRDCONN( name, n, prevalence, contact_rate, transmission_rate, incubation_days, recovery_rate, death_rate ) # S3 method for class 'epiworld_seirdconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRDCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"name String. Name virus. n Number individuals population. prevalence Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Probability recovery_rate. death_rate Numeric scalar 0 1. Probability death. x Object class SEIRCONN. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRDCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"ModelSEIRDCONNfunction returns model class epiworld_model. plot function returns plot SEIRDCONN model class epiworld_model.","code":""},{"path":"/reference/ModelSEIRDCONN.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) Proportion exposed agents infected, (2) proportion non-infected agents already removed, (3) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSEIRDCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"","code":"# An example with COVID-19 model_seirdconn <- ModelSEIRDCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 2, incubation_days = 7, transmission_rate = 0.5, recovery_rate = 0.3, death_rate = 0.01 ) # Running and printing run(model_seirdconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirdconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed-Deceased (SEIRD) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 5 states. #> The final distribution is: 490 Susceptible, 2 Exposed, 1 Infected, 9280 Removed, and 227 Deceased. plot(model_seirdconn) # Adding the flu flu <- virus( \"Flu\", prob_infecting = .3, recovery_rate = 1 / 7, prob_death = 0.001, prevalence = 0.001, as_proportion = TRUE ) add_virus(model = model_seirdconn, virus = flu) #' # Running and printing run(model_seirdconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirdconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed-Deceased (SEIRD) (connected) #> It features 10000 agents, 2 virus(es), and 0 tool(s). #> The model has 5 states. #> The final distribution is: 449 Susceptible, 8 Exposed, 8 Infected, 9331 Removed, and 204 Deceased. plot(model_seirdconn)"},{"path":"/reference/ModelSEIRMixing.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"Susceptible Exposed Infected Removed model (SEIR) mixing","code":""},{"path":"/reference/ModelSEIRMixing.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"","code":"ModelSEIRMixing( name, n, prevalence, contact_rate, transmission_rate, incubation_days, recovery_rate, contact_matrix ) # S3 method for class 'epiworld_seirmixing' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRMixing.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. incubation_days Numeric scalar. Average number days incubation period. recovery_rate Numeric scalar 0 1. Probability recovery. contact_matrix Matrix contact rates individuals. x Object class SIRCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRMixing.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"ModelSEIRMixingfunction returns model class epiworld_model. plot function returns plot SEIRMixing model class epiworld_model.","code":""},{"path":"/reference/ModelSEIRMixing.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"contact_matrix matrix contact rates entities. matrix size n x n, n number entities. row-stochastic matrix, .e., sum row 1. initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSEIRMixing.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"","code":"# Start off creating three entities. # Individuals will be distribured randomly between the three. e1 <- entity(\"Population 1\", 3e3, as_proportion = FALSE) e2 <- entity(\"Population 2\", 3e3, as_proportion = FALSE) e3 <- entity(\"Population 3\", 3e3, as_proportion = FALSE) # Row-stochastic matrix (rowsums 1) cmatrix <- c( c(0.9, 0.05, 0.05), c(0.1, 0.8, 0.1), c(0.1, 0.2, 0.7) ) |> matrix(byrow = TRUE, nrow = 3) N <- 9e3 flu_model <- ModelSEIRMixing( name = \"Flu\", n = N, prevalence = 1 / N, contact_rate = 20, transmission_rate = 0.1, recovery_rate = 1 / 7, incubation_days = 7, contact_matrix = cmatrix ) # Adding the entities to the model flu_model |> add_entity(e1) |> add_entity(e2) |> add_entity(e3) set.seed(331) run(flu_model, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(flu_model) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) with Mixing #> Population size : 9000 #> Agents' data : (none) #> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 126.00ms #> Last run speed : 7.09 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - Flu #> #> Tool(s): #> (none) #> #> Model parameters: #> - Avg. Incubation days : 7.0000 #> - Contact rate : 20.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 8999 -> 137 #> - (1) Exposed : 1 -> 35 #> - (2) Infected : 0 -> 139 #> - (3) Recovered : 0 -> 8689 #> #> Transition Probabilities: #> - Susceptible 0.96 0.04 0.00 0.00 #> - Exposed 0.00 0.84 0.16 0.00 #> - Infected 0.00 0.00 0.86 0.14 #> - Recovered 0.00 0.00 0.00 1.00 #> plot_incidence(flu_model)"},{"path":"/reference/ModelSIR.html","id":null,"dir":"Reference","previous_headings":"","what":"SIR model — ModelSIR","title":"SIR model — ModelSIR","text":"SIR model","code":""},{"path":"/reference/ModelSIR.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIR model — ModelSIR","text":"","code":"ModelSIR(name, prevalence, transmission_rate, recovery_rate) # S3 method for class 'epiworld_sir' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIR.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIR model — ModelSIR","text":"name String. Name virus prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. x Object class SIR. main Title plot ... Additional arguments passed graphics::plot.","code":""},{"path":"/reference/ModelSIR.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIR model — ModelSIR","text":"ModelSIR function returns model class epiworld_model. plot function returns plot SIR model class epiworld_model.","code":""},{"path":"/reference/ModelSIR.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"SIR model — ModelSIR","text":"initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSIR.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIR model — ModelSIR","text":"","code":"model_sir <- ModelSIR(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1) # Adding a small world population agents_smallworld( model_sir, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sir, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sir #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered (SIR) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 0 Susceptible, 3 Infected, and 997 Recovered. # Plotting plot(model_sir)"},{"path":"/reference/ModelSIRCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"Susceptible Infected Removed model (SIR connected)","code":""},{"path":"/reference/ModelSIRCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"","code":"ModelSIRCONN( name, n, prevalence, contact_rate, transmission_rate, recovery_rate ) # S3 method for class 'epiworld_sirconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. recovery_rate Numeric scalar 0 1. Probability recovery. x Object class SIRCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSIRCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"ModelSIRCONNfunction returns model class epiworld_model. plot function returns plot SIRCONN model class epiworld_model.","code":""},{"path":"/reference/ModelSIRCONN.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSIRCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"","code":"model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Running and printing run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sirconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 2012 Susceptible, 0 Infected, and 7988 Recovered. plot(model_sirconn, main = \"SIRCONN Model\")"},{"path":"/reference/ModelSIRD.html","id":null,"dir":"Reference","previous_headings":"","what":"SIRD model — ModelSIRD","title":"SIRD model — ModelSIRD","text":"SIRD model","code":""},{"path":"/reference/ModelSIRD.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIRD model — ModelSIRD","text":"","code":"ModelSIRD(name, prevalence, transmission_rate, recovery_rate, death_rate) # S3 method for class 'epiworld_sird' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRD.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIRD model — ModelSIRD","text":"name String. Name virus prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. death_rate Numeric scalar 0 1. Rate death virus. x Object class SIR. main Title plot ... Additional arguments passed graphics::plot.","code":""},{"path":"/reference/ModelSIRD.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIRD model — ModelSIRD","text":"ModelSIRD function returns model class epiworld_model. plot function returns plot SIRD model class epiworld_model.","code":""},{"path":"/reference/ModelSIRD.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"SIRD model — ModelSIRD","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) proportion non-infected agents already removed, (2) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSIRD.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIRD model — ModelSIRD","text":"","code":"model_sird <- ModelSIRD( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, death_rate = 0.01 ) # Adding a small world population agents_smallworld( model_sird, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sird, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sird #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered-Deceased (SIRD) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 0 Susceptible, 0 Infected, 913 Recovered, and 87 Deceased. # Plotting plot(model_sird)"},{"path":"/reference/ModelSIRDCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"Susceptible Infected Removed Deceased model (SIRD connected)","code":""},{"path":"/reference/ModelSIRDCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"","code":"ModelSIRDCONN( name, n, prevalence, contact_rate, transmission_rate, recovery_rate, death_rate ) # S3 method for class 'epiworld_sirdconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRDCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. recovery_rate Numeric scalar 0 1. Probability recovery. death_rate Numeric scalar 0 1. Probability death. x Object class SIRDCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSIRDCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"ModelSIRDCONNfunction returns model class epiworld_model. plot function returns plot SIRDCONN model class epiworld_model.","code":""},{"path":"/reference/ModelSIRDCONN.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) proportion non-infected agents already removed, (2) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSIRDCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"","code":"model_sirdconn <- ModelSIRDCONN( name = \"COVID-19\", n = 100000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.5, death_rate = 0.1 ) # Running and printing run(model_sirdconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sirdconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed-Deceased (SIRD) (connected) #> It features 100000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 3678 Susceptible, 0 Infected, 86905 Recovered, and 9417 Deceased. plot(model_sirdconn, main = \"SIRDCONN Model\")"},{"path":"/reference/ModelSIRLogit.html","id":null,"dir":"Reference","previous_headings":"","what":"SIR Logistic model — ModelSIRLogit","title":"SIR Logistic model — ModelSIRLogit","text":"SIR Logistic model","code":""},{"path":"/reference/ModelSIRLogit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIR Logistic model — ModelSIRLogit","text":"","code":"ModelSIRLogit( vname, data, coefs_infect, coefs_recover, coef_infect_cols, coef_recover_cols, prob_infection, recovery_rate, prevalence )"},{"path":"/reference/ModelSIRLogit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIR Logistic model — ModelSIRLogit","text":"vname Name virus. data numeric matrix n rows. coefs_infect Numeric vector. Coefficients associated infect. coefs_recover Numeric vector. Coefficients associated recover. coef_infect_cols Integer vector. Columns coeficient. coef_recover_cols Integer vector. Columns coeficient. prob_infection Numeric scalar. Baseline probability infection. recovery_rate Numeric scalar. Baseline probability recovery. prevalence Numeric scalar. Prevalence (initial state) proportion.","code":""},{"path":"/reference/ModelSIRLogit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIR Logistic model — ModelSIRLogit","text":"ModelSIRLogit function returns model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSIRLogit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIR Logistic model — ModelSIRLogit","text":"","code":"set.seed(2223) n <- 100000 # Creating the data to use for the \"ModelSIRLogit\" function. It contains # information on the sex of each agent and will be used to determine # differences in disease progression between males and females. Note that # the number of rows in these data are identical to n (100000). X <- cbind( Intercept = 1, Female = sample.int(2, n, replace = TRUE) - 1 ) # Declare coefficients for each sex regarding transmission_rate and recovery. coef_infect <- c(.1, -2, 2) coef_recover <- rnorm(2) # Feed all above information into the \"ModelSIRLogit\" function. model_logit <- ModelSIRLogit( \"covid2\", data = X, coefs_infect = coef_infect, coefs_recover = coef_recover, coef_infect_cols = 1L:ncol(X), coef_recover_cols = 1L:ncol(X), prob_infection = .8, recovery_rate = .3, prevalence = .01 ) agents_smallworld(model_logit, n, 8, FALSE, .01) run(model_logit, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(model_logit) # Females are supposed to be more likely to become infected. rn <- get_reproductive_number(model_logit) # Probability of infection for males and females. (table( X[, \"Female\"], (1:n %in% rn$source) ) |> prop.table())[, 2] #> 0 1 #> 0.13466 0.14878 # Looking into the individual agents. get_agents(model_logit) #> Agents from the model \"Susceptible-Infected-Removed (SIR) (logit)\": #> Agent: 0, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 1, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 2, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 3, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 4, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 5, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 6, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 7, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 8, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 9, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> ... 99990 more agents ..."},{"path":"/reference/ModelSIRMixing.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"Susceptible Infected Removed model (SIR) mixing","code":""},{"path":"/reference/ModelSIRMixing.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"","code":"ModelSIRMixing( name, n, prevalence, contact_rate, transmission_rate, recovery_rate, contact_matrix ) # S3 method for class 'epiworld_sirmixing' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRMixing.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. recovery_rate Numeric scalar 0 1. Probability recovery. contact_matrix Matrix contact rates individuals. x Object class SIRCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSIRMixing.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"ModelSIRMixingfunction returns model class epiworld_model. plot function returns plot SIRMixing model class epiworld_model.","code":""},{"path":"/reference/ModelSIRMixing.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"contact_matrix matrix contact rates entities. matrix size n x n, n number entities. row-stochastic matrix, .e., sum row 1. initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSIRMixing.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"","code":"# From the vignette # Start off creating three entities. # Individuals will be distribured randomly between the three. e1 <- entity(\"Population 1\", 3e3, as_proportion = FALSE) e2 <- entity(\"Population 2\", 3e3, as_proportion = FALSE) e3 <- entity(\"Population 3\", 3e3, as_proportion = FALSE) # Row-stochastic matrix (rowsums 1) cmatrix <- c( c(0.9, 0.05, 0.05), c(0.1, 0.8, 0.1), c(0.1, 0.2, 0.7) ) |> matrix(byrow = TRUE, nrow = 3) N <- 9e3 flu_model <- ModelSIRMixing( name = \"Flu\", n = N, prevalence = 1 / N, contact_rate = 20, transmission_rate = 0.1, recovery_rate = 1 / 7, contact_matrix = cmatrix ) # Adding the entities to the model flu_model |> add_entity(e1) |> add_entity(e2) |> add_entity(e3) set.seed(331) run(flu_model, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(flu_model) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) with Mixing #> Population size : 9000 #> Agents' data : (none) #> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 68.00ms #> Last run speed : 13.19 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - Flu #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 20.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 8999 -> 134 #> - (1) Infected : 1 -> 0 #> - (2) Recovered : 0 -> 8866 #> #> Transition Probabilities: #> - Susceptible 0.96 0.04 0.00 #> - Infected 0.00 0.87 0.13 #> - Recovered 0.00 0.00 1.00 #> plot_incidence(flu_model)"},{"path":"/reference/ModelSIS.html","id":null,"dir":"Reference","previous_headings":"","what":"SIS model — ModelSIS","title":"SIS model — ModelSIS","text":"Susceptible-Infected-Susceptible model (SIS) (wiki)","code":""},{"path":"/reference/ModelSIS.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIS model — ModelSIS","text":"","code":"ModelSIS(name, prevalence, transmission_rate, recovery_rate) # S3 method for class 'epiworld_sis' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIS.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIS model — ModelSIS","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery virus. x Object class SIS. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSIS.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIS model — ModelSIS","text":"ModelSIS function returns model class epiworld_model. plot function returns plot SIS model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSIS.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIS model — ModelSIS","text":"","code":"model_sis <- ModelSIS(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1) # Adding a small world population agents_smallworld( model_sis, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sis, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sis #> ________________________________________________________________________________ #> Susceptible-Infected-Susceptible (SIS) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 2 states. #> The final distribution is: 99 Susceptible, and 901 Infected. # Plotting plot(model_sis, main = \"SIS Model\")"},{"path":"/reference/ModelSISD.html","id":null,"dir":"Reference","previous_headings":"","what":"SISD model — ModelSISD","title":"SISD model — ModelSISD","text":"Susceptible-Infected-Susceptible-Deceased model (SISD) (wiki)","code":""},{"path":"/reference/ModelSISD.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SISD model — ModelSISD","text":"","code":"ModelSISD(name, prevalence, transmission_rate, recovery_rate, death_rate) # S3 method for class 'epiworld_sisd' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSISD.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SISD model — ModelSISD","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery virus. death_rate Numeric scalar 0 1. Rate death virus. x Object class SISD. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSISD.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SISD model — ModelSISD","text":"ModelSISD function returns model class epiworld_model. plot function returns plot SISD model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSISD.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SISD model — ModelSISD","text":"","code":"model_sisd <- ModelSISD( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, death_rate = 0.01 ) # Adding a small world population agents_smallworld( model_sisd, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sisd, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sisd #> ________________________________________________________________________________ #> Susceptible-Infected-Susceptible-Deceased (SISD) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 94 Susceptible, 441 Infected, and 465 Deceased. # Plotting plot(model_sisd, main = \"SISD Model\")"},{"path":"/reference/ModelSURV.html","id":null,"dir":"Reference","previous_headings":"","what":"SURV model — ModelSURV","title":"SURV model — ModelSURV","text":"SURV model","code":""},{"path":"/reference/ModelSURV.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SURV model — ModelSURV","text":"","code":"ModelSURV( name, prevalence, efficacy_vax, latent_period, infect_period, prob_symptoms, prop_vaccinated, prop_vax_redux_transm, prop_vax_redux_infect, surveillance_prob, transmission_rate, prob_death, prob_noreinfect ) # S3 method for class 'epiworld_surv' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSURV.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SURV model — ModelSURV","text":"name String. Name virus. prevalence Initial number individuals virus. efficacy_vax Double. Efficacy vaccine. (1 - P(acquire disease)). latent_period Double. Shape parameter 'Gamma(latent_period, 1)' distribution. coincides expected number latent days. infect_period Double. Shape parameter 'Gamma(infected_period, 1)' distribution. coincides expected number infectious days. prob_symptoms Double. Probability generating symptoms. prop_vaccinated Double. Probability vaccination. Coincides initial prevalence vaccinated individuals. prop_vax_redux_transm Double. Factor vaccine reduces transmissibility. prop_vax_redux_infect Double. Factor vaccine reduces chances becoming infected. surveillance_prob Double. Probability testing agent. transmission_rate Double. Raw transmission probability. prob_death Double. Raw probability death symptomatic individuals. prob_noreinfect Double. Probability re-infection. x Object class SURV. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSURV.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SURV model — ModelSURV","text":"ModelSURVfunction returns model class epiworld_model. plot function returns plot SURV model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSURV.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SURV model — ModelSURV","text":"","code":"model_surv <- ModelSURV( name = \"COVID-19\", prevalence = 20, efficacy_vax = 0.6, latent_period = 4, infect_period = 5, prob_symptoms = 0.5, prop_vaccinated = 0.7, prop_vax_redux_transm = 0.8, prop_vax_redux_infect = 0.95, surveillance_prob = 0.1, transmission_rate = 0.2, prob_death = 0.001, prob_noreinfect = 0.5 ) # Adding a small world population agents_smallworld( model_surv, n = 10000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_surv, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_surv #> ________________________________________________________________________________ #> Surveillance #> It features 10000 agents, 1 virus(es), and 1 tool(s). #> The model has 8 states. #> The final distribution is: 9974 Susceptible, 0 Latent, 0 Symptomatic, 0 Symptomatic isolated, 0 Asymptomatic, 0 Asymptomatic isolated, 26 Recovered, and 0 Removed. # Plotting plot(model_surv, main = \"SURV Model\")"},{"path":"/reference/agents.html","id":null,"dir":"Reference","previous_headings":"","what":"Agents in epiworldR — agents","title":"Agents in epiworldR — agents","text":"functions provide read-access agents model. get_agents function returns object class epiworld_agents contains information agents model. get_agent function returns information single agent. get_state function returns state single agent.","code":""},{"path":"/reference/agents.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Agents in epiworldR — agents","text":"","code":"get_agents(model, ...) # S3 method for class 'epiworld_model' get_agents(model, ...) # S3 method for class 'epiworld_agents' x[i] # S3 method for class 'epiworld_agent' print(x, compressed = FALSE, ...) # S3 method for class 'epiworld_agents' print(x, compressed = TRUE, max_print = 10, ...) get_state(x)"},{"path":"/reference/agents.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Agents in epiworldR — agents","text":"model object class epiworld_model. ... Ignored x object class epiworld_agents Index (id) agent (0 n-1) compressed Logical scalar. FALSE, prints detailed information agent. max_print Integer scalar. Maximum number agents print.","code":""},{"path":"/reference/agents.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Agents in epiworldR — agents","text":"get_agents function returns object class epiworld_agents. [ method returns object class epiworld_agent. print function returns information individual agent class epiworld_agent. get_state function returns state epiworld_agents object.","code":""},{"path":[]},{"path":"/reference/agents.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Agents in epiworldR — agents","text":"","code":"model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. x <- get_agents(model_sirconn) # Storing all agent information into object of # class epiworld_agents print(x, compressed = FALSE, max_print = 5) # Displaying detailed information of #> Agents from the model \"Susceptible-Infected-Removed (SIR) (connected)\": #> Information about agent id 0 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 1 #> State : Recovered (2) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 2 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 3 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 4 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> ... 9995 more agents ... # the first 5 agents using # compressed=F. Using compressed=T # results in less-detailed # information about each agent. x[0] # Print information about the first agent. Substitute the agent of #> Information about agent id 0 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 # interest's position where '0' is."},{"path":"/reference/agents_smallworld.html","id":null,"dir":"Reference","previous_headings":"","what":"Load agents to a model — agents_smallworld","title":"Load agents to a model — agents_smallworld","text":"functions provide access network model. network represented edgelist. agents_smallworld function generates small world network Watts-Strogatz algorithm. agents_from_edgelist function loads network edgelist. get_network function returns edgelist network.","code":""},{"path":"/reference/agents_smallworld.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Load agents to a model — agents_smallworld","text":"","code":"agents_smallworld(model, n, k, d, p) agents_from_edgelist(model, source, target, size, directed) get_network(model) get_agents_states(model) add_virus_agent(agent, model, virus, state_new = -99, queue = -99) add_tool_agent(agent, model, tool, state_new = -99, queue = -99) has_virus(agent, virus) has_tool(agent, tool) change_state(agent, model, state_new, queue = -99) get_agents_tools(model)"},{"path":"/reference/agents_smallworld.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Load agents to a model — agents_smallworld","text":"model Model object class epiworld_model. n, size Number individuals population. k Number ties small world network. d, directed Logical scalar. Whether graph directed . p Probability rewiring. source, target Integer vectors describing source target edgelist. agent Agent object class epiworld_agent. virus Virus object class epiworld_virus. state_new Integer scalar. New state agent action executed. queue Integer scalar. Change queuing system action executed. tool Tool object class epiworld_tool.","code":""},{"path":"/reference/agents_smallworld.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Load agents to a model — agents_smallworld","text":"'agents_smallworld' function returns model agents loaded. agents_from_edgelist function returns empty model class epiworld_model. get_network function returns data frame two columns (source target) describing edgelist network. get_agents_states returns character vector states agents end simulation. function add_virus_agent adds virus agent returns agent invisibly. function add_tool_agent adds tool agent returns agent invisibly. functions has_virus has_tool return logical scalar indicating whether agent virus/tool . get_agents_tools returns list class epiworld_agents_tools epiworld_tools (list lists).","code":""},{"path":"/reference/agents_smallworld.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Load agents to a model — agents_smallworld","text":"new_state queue parameters optional. provided, agent updated default values virus/tool.","code":""},{"path":"/reference/agents_smallworld.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Load agents to a model — agents_smallworld","text":"","code":"# Initializing SIR model with agents_smallworld sir <- ModelSIR(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1) agents_smallworld( sir, n = 1000, k = 5, d = FALSE, p = .01 ) run(sir, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. sir #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered (SIR) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 0 Susceptible, 3 Infected, and 997 Recovered. # We can also retrieve the network net <- get_network(sir) head(net) #> from to #> 1 0 1 #> 2 0 2 #> 3 0 998 #> 4 0 999 #> 5 1 2 #> 6 1 3 # Simulating a bernoulli graph set.seed(333) n <- 1000 g <- matrix(runif(n^2) < .01, nrow = n) diag(g) <- FALSE el <- which(g, arr.ind = TRUE) - 1L # Generating an empty model sir <- ModelSIR(\"COVID-19\", .01, .8, .3) agents_from_edgelist( sir, source = el[, 1], target = el[, 2], size = n, directed = TRUE ) # Running the simulation run(sir, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(sir)"},{"path":"/reference/entities.html","id":null,"dir":"Reference","previous_headings":"","what":"Get entities — entities","title":"Get entities — entities","text":"Entities epiworld objects can contain agents.","code":""},{"path":"/reference/entities.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get entities — entities","text":"","code":"get_entities(model) # S3 method for class 'epiworld_entities' x[i] entity(name, prevalence, as_proportion, to_unassigned = TRUE) get_entity_size(entity) get_entity_name(entity) entity_add_agent(entity, agent, model = attr(entity, \"model\")) rm_entity(model, id) add_entity(model, entity) load_agents_entities_ties(model, agents_id, entities_id) entity_get_agents(entity) distribute_entity_randomly(prevalence, as_proportion, to_unassigned = TRUE) distribute_entity_to_set(agents_ids) set_distribution_entity(entity, distfun)"},{"path":"/reference/entities.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get entities — entities","text":"model Model object class epiworld_model. x Object class epiworld_entities. Integer index. name Character scalar. Name entity. prevalence Numeric scalar. Prevalence entity. as_proportion Logical scalar. TRUE, prevalence interpreted proportion. to_unassigned Logical scalar. TRUE, entity added unassigned pool. entity Entity object class epiworld_entity. agent Agent object class epiworld_agent. id Integer scalar. Entity id remove (starting zero). agents_id Integer vector. entities_id Integer vector. agents_ids Integer vector. Ids agents distribute. distfun Distribution function object class epiworld_distribution_entity.","code":""},{"path":"/reference/entities.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get entities — entities","text":"function entity creates entity object. function get_entity_size returns number agents entity. function get_entity_name returns name entity. function entity_add_agent adds agent entity. function rm_entity removes entity model. function load_agents_entities_ties loads agents entities. function entity_get_agents returns integer vector agents entity (ids).","code":""},{"path":"/reference/entities.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get entities — entities","text":"Epiworld entities especially useful mixing models, particularly ModelSIRMixing ModelSEIRMixing.","code":""},{"path":"/reference/entities.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get entities — entities","text":"","code":"# Creating a mixing model mymodel <- ModelSIRMixing( name = \"My model\", n = 10000, prevalence = .001, contact_rate = 10, transmission_rate = .1, recovery_rate = 1 / 7, contact_matrix = matrix(c(.9, .1, .1, .9), 2, 2) ) ent1 <- entity(\"First\", 5000, FALSE) ent2 <- entity(\"Second\", 5000, FALSE) mymodel |> add_entity(ent1) |> add_entity(ent2) run(mymodel, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(mymodel) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) with Mixing #> Population size : 10000 #> Agents' data : (none) #> Number of entities : 2 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 66.00ms #> Last run speed : 15.13 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - My model #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 10.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 9990 -> 376 #> - (1) Infected : 10 -> 1 #> - (2) Recovered : 0 -> 9623 #> #> Transition Probabilities: #> - Susceptible 0.97 0.03 0.00 #> - Infected 0.00 0.86 0.14 #> - Recovered 0.00 0.00 1.00 #>"},{"path":"/reference/epiworld-data.html","id":null,"dir":"Reference","previous_headings":"","what":"Accessing the database of epiworld — epiworld-data","title":"Accessing the database of epiworld — epiworld-data","text":"Models epiworld stored database. database can accessed using functions described manual page. elements database : transition matrix, incidence matrix, reproductive number, generation time, daily incidence virus tool level.","code":""},{"path":"/reference/epiworld-data.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Accessing the database of epiworld — epiworld-data","text":"","code":"get_hist_total(x) get_today_total(x) get_hist_virus(x) get_hist_tool(x) get_transition_probability(x) get_reproductive_number(x) # S3 method for class 'epiworld_repnum' plot( x, y = NULL, ylab = \"Average Rep. Number\", xlab = \"Day (step)\", main = \"Reproductive Number\", type = \"b\", plot = TRUE, ... ) plot_reproductive_number(x, ...) get_hist_transition_matrix(x, skip_zeros = FALSE) # S3 method for class 'epiworld_hist_transition' as.array(x, ...) plot_incidence(x, ...) # S3 method for class 'epiworld_hist_transition' plot( x, type = \"b\", xlab = \"Day (step)\", ylab = \"Counts\", main = \"Daily incidence\", plot = TRUE, ... ) get_transmissions(x) get_generation_time(x) # S3 method for class 'epiworld_generation_time' plot( x, type = \"b\", xlab = \"Day (step)\", ylab = \"Avg. Generation Time\", main = \"Generation Time\", plot = TRUE, ... ) plot_generation_time(x, ...)"},{"path":"/reference/epiworld-data.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Accessing the database of epiworld — epiworld-data","text":"x object class epiworld_sir, epiworld_seir, etc. model. y Ignored. ylab, xlab, main, type parameters passed graphics::plot() plot Logical scalar. TRUE (default), function desired statistic. ... case plot methods, arguments passed graphics::plot. skip_zeros Logical scalar. FALSE return entries transition matrix.","code":""},{"path":"/reference/epiworld-data.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Accessing the database of epiworld — epiworld-data","text":"get_hist_total function returns object class epiworld_hist_total. get_today_total function returns named vector total number individuals state end simulation. get_hist_virus function returns object class epiworld_hist_virus. get_hist_tool function returns object epiworld_hist_virus. get_transition_probability function returns object class matrix. get_reproductive_number function returns object class epiworld_repnum. plot function returns plot reproductive number time. get_hist_transition_matrix returns data.frame four columns: \"state_from\", \"state_to\", \"date\", \"counts.\" .array method epiworld_hist_transition objects turns data.frame returned get_hist_transition_matrix array nstates x nstates x (ndays + 1) entries, first entry initial state. plot_incidence function returns plot originating object get_hist_transition_matrix. plot function returns plot originates epiworld_hist_transition object. function get_transmissions returns data.frame following columns: date, source, target, virus_id, virus, source_exposure_date. function get_generation_time returns data.frame following columns: \"agent\", \"virus_id\", \"virus\", \"date\", \"gentime\". function plot_generation_time wrapper plot get_generation_time.","code":""},{"path":"/reference/epiworld-data.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Accessing the database of epiworld — epiworld-data","text":"plot_reproductive_number function wrapper around get_reproductive_number plots result. plot_incidence function wrapper get_hist_transition_matrix plot method. plot method epiworld_hist_transition class plots daily incidence state. function returns data frame used plotting.","code":""},{"path":[]},{"path":"/reference/epiworld-data.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Accessing the database of epiworld — epiworld-data","text":"","code":"# SEIR Connected seirconn <- ModelSEIRCONN( name = \"Disease\", n = 10000, prevalence = 0.1, contact_rate = 2.0, transmission_rate = 0.8, incubation_days = 7.0, recovery_rate = 0.3 ) # Running the simulation for 50 steps (days) set.seed(937) run(seirconn, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. # Retrieving the transition probability get_transition_probability(seirconn) #> Susceptible Exposed Infected Recovered #> Susceptible 0.9028099 0.09719012 0.0000000 0.0000000 #> Exposed 0.0000000 0.85844742 0.1415526 0.0000000 #> Infected 0.0000000 0.00000000 0.7000978 0.2999022 #> Recovered 0.0000000 0.00000000 0.0000000 1.0000000 # Retrieving date, state, and counts dataframe including any added tools get_hist_tool(seirconn) #> [1] date tool_id tool state counts #> <0 rows> (or 0-length row.names) # Retrieving overall date, state, and counts dataframe head(get_hist_total(seirconn)) #> date state counts #> 1 0 Susceptible 9000 #> 2 0 Exposed 1000 #> 3 0 Infected 0 #> 4 0 Recovered 0 #> 5 1 Susceptible 9000 #> 6 1 Exposed 861 # Retrieving date, state, and counts dataframe by variant head(get_hist_virus(seirconn)) #> date virus_id virus state counts #> 1 0 0 Disease Susceptible 0 #> 2 0 0 Disease Exposed 1000 #> 3 0 0 Disease Infected 0 #> 4 0 0 Disease Recovered 0 #> 5 1 0 Disease Susceptible 0 #> 6 1 0 Disease Exposed 861 # Retrieving (and plotting) the reproductive number rp <- get_reproductive_number(seirconn) plot(rp) # Also equivalent to plot_reproductive_number(seirconn) # We can go further and get all the history t_hist <- get_hist_transition_matrix(seirconn) head(t_hist) #> state_from state_to date counts #> 1 Susceptible Susceptible 0 9000 #> 2 Exposed Susceptible 0 0 #> 3 Infected Susceptible 0 0 #> 4 Recovered Susceptible 0 0 #> 5 Susceptible Exposed 0 1000 #> 6 Exposed Exposed 0 0 # And turn it into an array as.array(t_hist)[, , 1:3] #> , , 0 #> #> Susceptible Exposed Infected Recovered #> Susceptible 9000 1000 0 0 #> Exposed 0 0 0 0 #> Infected 0 0 0 0 #> Recovered 0 0 0 0 #> #> , , 1 #> #> Susceptible Exposed Infected Recovered #> Susceptible 9000 0 0 0 #> Exposed 0 861 139 0 #> Infected 0 0 0 0 #> Recovered 0 0 0 0 #> #> , , 2 #> #> Susceptible Exposed Infected Recovered #> Susceptible 8822 178 0 0 #> Exposed 0 737 124 0 #> Infected 0 0 92 47 #> Recovered 0 0 0 0 #> # We cam also get (and plot) the incidence, as well as # the generation time inci <- plot_incidence(seirconn) gent <- plot_generation_time(seirconn)"},{"path":"/reference/epiworld-methods.html","id":null,"dir":"Reference","previous_headings":"","what":"Methods for epiworldR objects — epiworld-methods","title":"Methods for epiworldR objects — epiworld-methods","text":"functions described section methods objects class epiworld_model. Besides printing plotting, methods provide access manipulate model parameters, getting information model running simulation.","code":""},{"path":"/reference/epiworld-methods.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Methods for epiworldR objects — epiworld-methods","text":"","code":"queuing_on(x) queuing_off(x) verbose_off(x) verbose_on(x) run(model, ndays, seed = NULL) # S3 method for class 'epiworld_model' summary(object, ...) get_states(x) get_param(x, pname) set_param(x, pname, pval) set_name(x, mname) get_name(x) get_n_viruses(x) get_n_tools(x) get_ndays(x) today(x) get_n_replicates(x) size(x) set_agents_data(model, data) get_agents_data_ncols(model) get_virus(model, virus_pos) get_tool(model, tool_pos) initial_states(model, proportions) clone_model(model)"},{"path":"/reference/epiworld-methods.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Methods for epiworldR objects — epiworld-methods","text":"x object class epiworld_model. model Model object. ndays Number days (steps) simulation. seed Seed set initializing random number generator (passed set.seed()). object Object class epiworld_model. ... Additional arguments. pname String. Name parameter. pval Numeric. Value parameter. mname String. Name model. data numeric matrix. virus_pos Integer. Relative location (starting 0) virus model tool_pos Integer. Relative location (starting 0) tool model proportions Numeric vector. Proportions agents distributed (see details).","code":""},{"path":"/reference/epiworld-methods.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Methods for epiworldR objects — epiworld-methods","text":"verbose_on verbose_off functions return model, however verbose_off returns model progress bar. run function returns simulated model class epiworld_model. summary function prints detailed view model, returns model invisibly. get_states function returns unique states found model. get_param function returns selected parameter model object class epiworld_model. set_param function return value instead alters parameter value. set_name function return value instead alters object epiworld_model. get_name returns name model. get_n_viruses returns number viruses model. get_n_tools returns number tools model. get_ndays returns number days model. today returns current model day get_n_replicates returns number replicates model. size.epiworld_model returns number agents model. 'set_agents_data' function returns object class DataFrame. 'get_agents_data_ncols' returns number columns model dataframe. 'get_virus' returns virus. get_tool returns tool. inital_states returns model updated initial state. clone_model returns copy model.","code":""},{"path":"/reference/epiworld-methods.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Methods for epiworldR objects — epiworld-methods","text":"verbose_on verbose_off functions activate deactivate printing progress screen, respectively. functions return model (x) invisibly. epiworld_model objects pointers underlying C++ class epiworld. generate copy model, use clone_model, otherwise, assignment operator copy pointer.","code":""},{"path":"/reference/epiworld-methods.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Methods for epiworldR objects — epiworld-methods","text":"","code":"model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Queuing - If you wish to implement the queuing function, declare whether # you would like it \"on\" or \"off\", if any. queuing_on(model_sirconn) #> Warning: SIR Connected models do not have queue. queuing_off(model_sirconn) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Verbose - \"on\" prints the progress bar on the screen while \"off\" # deactivates the progress bar. Declare which function you want to implement, # if any. verbose_on(model_sirconn) verbose_off(model_sirconn) run(model_sirconn, ndays = 100, seed = 1912) get_states(model_sirconn) # Returns all unique states found within the model. #> [1] \"Susceptible\" \"Infected\" \"Recovered\" get_param(model_sirconn, \"Contact rate\") # Returns the value of the selected #> [1] 5 # parameter within the model object. # In order to view the parameters, # run the model object and find the # \"Model parameters\" section. set_param(model_sirconn, \"Contact rate\", 2) # Allows for adjustment of model # parameters within the model # object. In this example, the # Contact rate parameter is # changed to 2. You can now rerun # the model to observe any # differences. set_name(model_sirconn, \"My Epi-Model\") # This function allows for setting # a name for the model. Running the # model object, the name of the model # is now reflected next to \"Name of # the model\". get_name(model_sirconn) # Returns the set name of the model. #> [1] \"My Epi-Model\" get_n_viruses(model_sirconn) # Returns the number of viruses in the model. #> [1] 1 # In this case, there is only one virus: # \"COVID-19\". get_n_tools(model_sirconn) # Returns the number of tools in the model. In #> [1] 0 # this case, there are zero tools. get_ndays(model_sirconn) # Returns the length of the simulation in days. This #> [1] 100 # will match \"ndays\" within the \"run\" function. today(model_sirconn) # Returns the current day of the simulation. This will #> [1] 100 # match \"get_ndays()\" if run at the end of a simulation, but will differ if run # during a simulation get_n_replicates(model_sirconn) # Returns the number of replicates of the #> [1] 2 # model. size(model_sirconn) # Returns the population size in the model. In this case, #> [1] 10000 # there are 10,000 agents in the model. # Set Agents Data # First, your data matrix must have the same number of rows as agents in the # model. Below is a generated matrix which will be passed into the # \"set_agents_data\" function. data <- matrix(data = runif(20000, min = 0, max = 100), nrow = 10000, ncol = 2) set_agents_data(model_sirconn, data) get_agents_data_ncols(model_sirconn) # Returns number of columns #> [1] 2 get_virus(model_sirconn, 0) # Returns information about the first virus in #> Virus : COVID-19 #> Id : 0 #> state_init : 1 #> state_post : 2 #> state_removed : 2 #> queue_init : 2 #> queue_post : -2 #> queue_removed : -99 # the model (index begins at 0). add_tool(model_sirconn, tool(\"Vaccine\", .9, .9, .5, 1, prevalence = 0.5, as_prop = TRUE)) get_tool(model_sirconn, 0) # Returns information about the first tool in the #> Tool : Vaccine #> Id : 0 #> state_init : -99 #> state_post : -99 #> queue_init : 0 #> queue_post : 0 # model. In this case, there are no tools so an # error message will occur."},{"path":"/reference/epiworldR-deprecated.html","id":null,"dir":"Reference","previous_headings":"","what":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","title":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","text":"Starting version 0.0-4, epiworld changed refered \"actions.\" Following traditional ABMs, actions now called \"events.\"","code":""},{"path":"/reference/epiworldR-deprecated.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","text":"","code":"add_tool_n(model, tool, n) add_virus_n(model, virus, n) globalaction_tool(...) globalaction_tool_logit(...) globalaction_set_params(...) globalaction_fun(...)"},{"path":"/reference/epiworldR-deprecated.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","text":"model Model object class epiworld_model. tool Tool object class epiworld_tool. n Deprecated. virus Virus object class epiworld_virus. ... Arguments passed new function.","code":""},{"path":"/reference/epiworldR-package.html","id":null,"dir":"Reference","previous_headings":"","what":"epiworldR — epiworldR-package","title":"epiworldR — epiworldR-package","text":"flexible framework Agent-Based Models (ABM), 'epiworldR' package provides methods prototyping disease outbreaks transmission models using 'C++' backend, making fast. supports multiple epidemiological models, including Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), others, involving arbitrary mitigation policies multiple-disease models. Users can specify infectiousness/susceptibility rates function agents' features, providing great complexity model dynamics. Furthermore, 'epiworldR' ideal simulation studies featuring large populations.","code":""},{"path":[]},{"path":"/reference/epiworldR-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"epiworldR — epiworldR-package","text":"Maintainer: George Vega Yon g.vegayon@gmail.com (ORCID) Authors: Derek Meyer derekmeyer37@gmail.com (ORCID) contributors: Susan Holmes (ORCID) (JOSS reviewer) [reviewer] Abinash Satapathy (ORCID) (JOSS reviewer) [reviewer] Carinogurjao [reviewer] Centers Disease Control Prevention (Award number 1U01CK000585; 75D30121F00003) [funder]","code":""},{"path":"/reference/global-actions.html","id":null,"dir":"Reference","previous_headings":"","what":"Global Actions — global-actions","title":"Global Actions — global-actions","text":"Global actions functions executed time step simulation. useful implementing interventions, vaccination, isolation, social distancing means tools.","code":""},{"path":"/reference/global-actions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Global Actions — global-actions","text":"","code":"globalevent_tool(tool, prob, name = get_name_tool(tool), day = -99) globalevent_tool_logit( tool, vars, coefs, name = get_name_tool(tool), day = -99 ) globalevent_set_params( param, value, name = paste0(\"Set \", param, \" to \", value), day = -99 ) globalevent_fun(fun, name = deparse(substitute(fun)), day = -99) add_globalevent(model, action)"},{"path":"/reference/global-actions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Global Actions — global-actions","text":"tool object class tool. prob Numeric scalar. probability 0 1. name Character scalar. name action. day Integer. day (step) action executed (see details). vars Integer vector. position variables model. coefs Numeric vector. coefficients logistic regression. param Character scalar. name parameter set. value Numeric scalar. value parameter. fun Function. function executed. model object class epiworld_model. action global action.","code":""},{"path":"/reference/global-actions.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Global Actions — global-actions","text":"globalevent_set_params function returns object class epiworld_globalevent_set_param epiworld_globalevent. globalevent_tool returns object class epiworld_globalevent_tool epiworld_globalevent. globalevent_tool_logit returns object class epiworld_globalevent_tool_logit epiworld_globalevent. function add_globalevent returns model added action.","code":""},{"path":"/reference/global-actions.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Global Actions — global-actions","text":"function globalevent_tool_logit allows specify logistic regression model probability using tool. model specified vector coefficients coefs vector variables vars. vars integer vector indicating position variables model. function globalevent_set_param allows set parameter model. parameter specified name param value value. function globalevent_fun allows specify function executed given day. function object must receive object class epiworld_model argument. function add_globalevent adds global action model. model checks actions executed time step. added action matches current time step, action executed. day negative, action executed time step. day positive, action executed specified time step.","code":""},{"path":[]},{"path":"/reference/global-actions.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Global Actions — global-actions","text":"","code":"# Simple model model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Creating a tool epitool <- tool( name = \"Vaccine\", prevalence = 0, as_proportion = FALSE, susceptibility_reduction = .9, transmission_reduction = .5, recovery_enhancer = .5, death_reduction = .9 ) # Adding a global action vaccine_day_20 <- globalevent_tool(epitool, .2, day = 20) add_globalevent(model_sirconn, vaccine_day_20) # Running and printing run(model_sirconn, ndays = 40, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. model_sirconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 1 tool(s). #> The model has 3 states. #> The final distribution is: 2012 Susceptible, 0 Infected, and 7988 Recovered. plot_incidence(model_sirconn) # Example 2: Changing the contact rate ------------------------------------- model_sirconn2 <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) closure_day_10 <- globalevent_set_params(\"Contact rate\", 0, day = 10) add_globalevent(model_sirconn2, closure_day_10) # Running and printing run(model_sirconn2, ndays = 40, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. model_sirconn2 #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 2083 Susceptible, 0 Infected, and 7917 Recovered. plot_incidence(model_sirconn2) # Example using `globalevent_fun` to record the state of the # agents at each time step. # We start by creating an SIR connected model model <- ModelSIRCONN( name = \"SIR with Global Saver\", n = 1000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.3 ) # We create the object where the history of the agents will be stored agents_history <- NULL # This function prints the total number of agents in each state # and stores the history of the agents in the object `agents_history` hist_saver <- function(m) { message(\"Today's totals are: \", paste(get_today_total(m), collapse = \", \")) # We use the `<<-` operator to assign the value to the global variable # `agents_history` (see ?\"<<-\") agents_history <<- cbind( agents_history, get_agents_states(m) ) }"},{"path":"/reference/run_multiple.html","id":null,"dir":"Reference","previous_headings":"","what":"Run multiple simulations at once — run_multiple","title":"Run multiple simulations at once — run_multiple","text":"run_multiple function allows running multiple simulations . available, users can take advantage parallel computing speed process.","code":""},{"path":"/reference/run_multiple.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Run multiple simulations at once — run_multiple","text":"","code":"run_multiple( m, ndays, nsims, seed = sample.int(10000, 1), saver = make_saver(), reset = TRUE, verbose = TRUE, nthreads = 1L ) run_multiple_get_results(m) make_saver(..., fn = \"\")"},{"path":"/reference/run_multiple.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Run multiple simulations at once — run_multiple","text":"m, ndays, seed See run. nsims Integer. Number replicats saver object class epiworld_saver. reset TRUE (default,) resets simulation. verbose TRUE (default,) prints progress bar. nthreads Integer. Number threads (parallel computing.) ... List strings (characters) specifying save (see details). fn file name pattern.","code":""},{"path":"/reference/run_multiple.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Run multiple simulations at once — run_multiple","text":"case make_saver, list class epiworld_saver. run_multiple function runs specified number simulations returns model object class epiworld_model. run_multiple_get_results function returns named list data specified make_saver.","code":""},{"path":"/reference/run_multiple.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Run multiple simulations at once — run_multiple","text":"Currently, following elements can saved: total_hist History model (total numbers per time). virus_info Information viruses. virus_hist Changes viruses. tool_info Information tools. tool_hist Changes tools. transmission Transmission events. transition Transition matrices. reproductive Reproductive number. generation Estimation generation time.","code":""},{"path":"/reference/run_multiple.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Run multiple simulations at once — run_multiple","text":"","code":"model_sir <- ModelSIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 1000, contact_rate = 2, transmission_rate = 0.9, recovery_rate = 0.1 ) # Generating a saver saver <- make_saver(\"total_hist\", \"reproductive\") # Running and printing run_multiple(model_sir, ndays = 100, nsims = 50, saver = saver, nthreads = 2) #> Starting multiple runs (50) using 2 thread(s) #> _________________________________________________________________________ #> _________________________________________________________________________ #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Retrieving the results ans <- run_multiple_get_results(model_sir) head(ans$total_hist) #> sim_num date nviruses state counts #> 1 1 0 1 Susceptible 990 #> 2 1 0 1 Infected 10 #> 3 1 0 1 Recovered 0 #> 4 1 1 1 Susceptible 981 #> 5 1 1 1 Infected 18 #> 6 1 1 1 Recovered 1 head(ans$reproductive) #> sim_num virus_id virus source source_exposure_date rt #> 1 1 0 COVID-19 519 10 0 #> 2 1 0 COVID-19 152 9 0 #> 3 1 0 COVID-19 949 8 0 #> 4 1 0 COVID-19 921 8 0 #> 5 1 0 COVID-19 855 8 0 #> 6 1 0 COVID-19 816 8 0 # Plotting multi_sir <- run_multiple_get_results(model_sir)$total_hist multi_sir <- multi_sir[multi_sir$date <= 20, ] plot(multi_sir)"},{"path":"/reference/tool.html","id":null,"dir":"Reference","previous_headings":"","what":"Tools in epiworld — tool","title":"Tools in epiworld — tool","text":"Tools functions affect agents react virus. can used simulate effects vaccination, isolation, social distancing.","code":""},{"path":"/reference/tool.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tools in epiworld — tool","text":"","code":"tool( name, prevalence, as_proportion, susceptibility_reduction, transmission_reduction, recovery_enhancer, death_reduction ) set_name_tool(tool, name) get_name_tool(tool) add_tool(model, tool, proportion) rm_tool(model, tool_pos) tool_fun_logit(vars, coefs, model) set_susceptibility_reduction(tool, prob) set_susceptibility_reduction_ptr(tool, model, param) set_susceptibility_reduction_fun(tool, model, tfun) set_transmission_reduction(tool, prob) set_transmission_reduction_ptr(tool, model, param) set_transmission_reduction_fun(tool, model, tfun) set_recovery_enhancer(tool, prob) set_recovery_enhancer_ptr(tool, model, param) set_recovery_enhancer_fun(tool, model, tfun) set_death_reduction(tool, prob) set_death_reduction_ptr(tool, model, param) set_death_reduction_fun(tool, model, tfun) # S3 method for class 'epiworld_agents_tools' print(x, max_print = 10, ...) set_distribution_tool(tool, distfun) distribute_tool_randomly(prevalence, as_proportion) distribute_tool_to_set(agents_ids)"},{"path":"/reference/tool.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tools in epiworld — tool","text":"name Name tool prevalence Numeric scalar. Prevalence tool. as_proportion Logical scalar. TRUE, prevalence interpreted proportion total number agents model. susceptibility_reduction Numeric. Proportion reduces susceptibility. transmission_reduction Numeric. Proportion reduces transmission. recovery_enhancer Numeric. Proportion improves recovery. death_reduction Numeric. Proportion reduces probability death.e tool object class epiworld_tool model Model proportion Deprecated. tool_pos Positive integer. Index tool's position model. vars Integer vector. Indices (starting 0) positions variables used compute logit probability. coefs Numeric vector. length vars, vector coefficients associated logit probability. prob Numeric scalar. probability (zero one). param Character scalar. Name parameter featured model added tool (see details). tfun object class epiworld_tool_fun. x object class epiworld_agents_tools. max_print Numeric scalar. Maximum number tools print. ... Currently ignored. distfun object class epiworld_tool_distfun. agents_ids Integer vector. Indices agents tool assigned.","code":""},{"path":"/reference/tool.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Tools in epiworld — tool","text":"tool function creates tool class epiworld_tool. set_name_tool function assigns name tool class epiworld_tool returns tool. get_name_tool function returns name tool class epiworld_tool. rm_tool function removes specified tool model. set_susceptibility_reduction function assigns probability reduction specified tool class epiworld_tool. set_transmission_reduction function assigns probability reduction specified tool class epiworld_tool. set_recovery_enhancer function assigns probability increase specified tool class epiworld_tool. set_death_reduction function assigns probability decrease specified tool class epiworld_tool. distribute_tool_randomly function returns distribution function class epiworld_tool_distfun. distribute_tool_to_set function returns distribution function class epiworld_tool_distfun.","code":""},{"path":"/reference/tool.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tools in epiworld — tool","text":"name epiworld_tool object can manipulated functions set_name_tool() get_name_tool(). add_tool function adds specified tool model class epiworld_model specified proportion. case set_susceptibility_reduction_ptr, set_transmission_reduction_ptr, set_recovery_enhancer, set_death_reduction_ptr, corresponding parameters passed pointer tool. implication using pointers values read directly model object, changes reflected. set_distribution_tool function assigns distribution function specified tool class epiworld_tool. distribution function can created using functions distribute_tool_randomly() distribute_tool_to_set(). distribute_tool_randomly function creates distribution function randomly assigns tool proportion population. distribute_tool_to_set function creates distribution function assigns tool set agents.","code":""},{"path":"/reference/tool.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tools in epiworld — tool","text":"","code":"# Simple model model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Running and printing run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. plot(model_sirconn) epitool <- tool( name = \"Vaccine\", prevalence = 0.5, as_proportion = TRUE, susceptibility_reduction = .9, transmission_reduction = .5, recovery_enhancer = .5, death_reduction = .9 ) epitool #> Tool : Vaccine #> Id : (empty) #> state_init : -99 #> state_post : -99 #> queue_init : 0 #> queue_post : 0 set_name_tool(epitool, \"Pfizer\") # Assigning name to the tool get_name_tool(epitool) # Returning the name of the tool #> [1] \"Pfizer\" add_tool(model_sirconn, epitool) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sirconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 1 tool(s). #> The model has 3 states. #> The final distribution is: 8804 Susceptible, 0 Infected, and 1196 Recovered. plot(model_sirconn) # To declare a certain number of individuals with the tool rm_tool(model_sirconn, 0) # Removing epitool from the model # Setting prevalence to 0.1 set_distribution_tool(epitool, distribute_tool_randomly(0.1, TRUE)) add_tool(model_sirconn, epitool) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Adjusting probabilities due to tool set_susceptibility_reduction(epitool, 0.1) # Susceptibility reduction #> Tool : Pfizer #> Id : 0 #> state_init : -99 #> state_post : -99 #> queue_init : 0 #> queue_post : 0 set_transmission_reduction(epitool, 0.2) # Transmission reduction set_recovery_enhancer(epitool, 0.15) # Probability increase of recovery set_death_reduction(epitool, 0.05) # Probability reduction of death rm_tool(model_sirconn, 0) add_tool(model_sirconn, epitool) run(model_sirconn, ndays = 100, seed = 1912) # Run model to view changes #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Using the logit function -------------- sir <- ModelSIR( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1 ) # Adding a small world population agents_smallworld( sir, n = 10000, k = 5, d = FALSE, p = .01 ) # Creating a tool mask_wearing <- tool( name = \"Mask\", prevalence = 0.5, as_proportion = TRUE, susceptibility_reduction = 0.0, transmission_reduction = 0.3, # Only transmission recovery_enhancer = 0.0, death_reduction = 0.0 ) add_tool(sir, mask_wearing) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. hist_0 <- get_hist_total(sir) # And adding features dat <- cbind( female = sample.int(2, 10000, replace = TRUE) - 1, x = rnorm(10000) ) set_agents_data(sir, dat) # Creating the logit function tfun <- tool_fun_logit( vars = c(0L, 1L), coefs = c(-1, 1), model = sir ) # The infection prob is lower hist(plogis(dat %*% rbind(.5, 1))) tfun # printing #> An epiworld_tool_function object. #> (model: Susceptible-Infected-Recovered (SIR)) #> This function was built using -tool_fun_logit()-. and it features the following coefficients: #> 0: -1.00 #> 1: 1.00 set_susceptibility_reduction_fun( tool = get_tool(sir, 0), model = sir, tfun = tfun ) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. hist_1 <- get_hist_total(sir) op <- par(mfrow = c(1, 2)) plot(hist_0) abline(v = 30) plot(hist_1) abline(v = 30) par(op)"},{"path":"/reference/virus.html","id":null,"dir":"Reference","previous_headings":"","what":"Virus design — virus","title":"Virus design — virus","text":"Viruses can considered anything can transmitted (e.g., diseases, well ideas.) models epiworldR can feature multiple viruses.","code":""},{"path":"/reference/virus.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Virus design — virus","text":"","code":"virus( name, prevalence, as_proportion, prob_infecting, recovery_rate = 0.5, prob_death = 0, post_immunity = -1, incubation = 7 ) set_name_virus(virus, name) get_name_virus(virus) add_virus(model, virus, proportion) virus_set_state(virus, init, end, removed) rm_virus(model, virus_pos) virus_fun_logit(vars, coefs, model) set_prob_infecting(virus, prob) set_prob_infecting_ptr(virus, model, param) set_prob_infecting_fun(virus, model, vfun) set_prob_recovery(virus, prob) set_prob_recovery_ptr(virus, model, param) set_prob_recovery_fun(virus, model, vfun) set_prob_death(virus, prob) set_prob_death_ptr(virus, model, param) set_prob_death_fun(virus, model, vfun) set_incubation(virus, incubation) set_incubation_ptr(virus, model, param) set_incubation_fun(virus, model, vfun) set_distribution_virus(virus, distfun) distribute_virus_randomly(prevalence, as_proportion) distribute_virus_set(agents_ids)"},{"path":"/reference/virus.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Virus design — virus","text":"name virus prevalence Numeric scalar. Prevalence virus. as_proportion Logical scalar. TRUE, prevalence set proportion total number agents model. prob_infecting Numeric scalar. Probability infection (transmission). recovery_rate Numeric scalar. Probability recovery. prob_death Numeric scalar. Probability death. post_immunity Numeric scalar. Post immunity (prob re-infection). incubation Numeric scalar. Incubation period (days) virus. virus object class epiworld_virus model object class epiworld_model. proportion Deprecated. init, end, removed states acquiring virus, removing virus, removing agent result virus, respectively. virus_pos Positive integer. Index virus's position model. vars Integer vector. Indices (starting 0) positions variables used compute logit probability. coefs Numeric vector. length vars, vector coefficients associated logit probability. prob Numeric scalar. probability (zero one). param Character scalar. Name parameter featured model added virus (see details). vfun object class epiworld_virus_fun. distfun object class epiworld_distribution_virus. agents_ids Integer vector. Indices agents receive virus.","code":""},{"path":"/reference/virus.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Virus design — virus","text":"set_name_virus function return value, merely assigns name virus choice. get_name_virus function returns name virus class epiworld_virus. add_virus function return value, instead adds virus choice model object class epiworld_model. virus_set_state function return value assigns epidemiological properties specified virus class epiworld_virus. rm_virus function return value, instead removes specified virus model class epiworld_model. set_prob_infecting function return value, instead assigns probability infection specified virus class epiworld_virus. set_prob_recovery function return value, instead assigns probability recovery specified virus class epiworld_virus. set_prob_death function return value, instead assigns probability death specified virus class epiworld_virus. set_incubation function return value, instead assigns incubation period specified virus class epiworld_virus. distribute_virus_randomly function returns function can used distribute virus model.","code":""},{"path":"/reference/virus.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Virus design — virus","text":"virus() function can used initialize virus. Virus features can modified using functions set_prob_*. function virus_fun_logit() creates \"virus function\" can evaluated transmission, recovery, death. name sugests, computes probabilities using logit function (see examples). name epiworld_virus object can manipulated functions set_name_virus() get_name_virus(). case set_prob_infecting_ptr, set_prob_recovery_ptr, set_prob_death_ptr, corresponding parameters passed pointer virus. implication using pointers values read directly model object, changes reflected. distribute_virus_randomly function factory function used randomly distribute virus model. prevalence can set proportion number agents. resulting function can passed set_distribution_virus.","code":""},{"path":"/reference/virus.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Virus design — virus","text":"","code":"mseirconn <- ModelSEIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 4, incubation_days = 7, transmission_rate = 0.5, recovery_rate = 0.99 ) delta <- virus( \"Delta Variant\", 0, .5, .2, .01, prevalence = 0.3, as_proportion = TRUE ) # Adding virus and setting/getting virus name add_virus(mseirconn, delta) set_name_virus(delta, \"COVID-19 Strain\") get_name_virus(delta) #> [1] \"COVID-19 Strain\" run(mseirconn, ndays = 100, seed = 992) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. mseirconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> It features 10000 agents, 2 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 3609 Susceptible, 113 Exposed, 11 Infected, and 6267 Recovered. rm_virus(mseirconn, 0) # Removing the first virus from the model object set_distribution_virus(delta, distribute_virus_randomly(100, as_proportion = FALSE)) add_virus(mseirconn, delta) # Setting parameters for the delta virus manually set_prob_infecting(delta, 0.5) set_prob_recovery(delta, 0.9) set_prob_death(delta, 0.01) run(mseirconn, ndays = 100, seed = 992) # Run the model to observe changes #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # If the states were (for example): # 1: Infected # 2: Recovered # 3: Dead delta2 <- virus( \"Delta Variant 2\", 0, .5, .2, .01, prevalence = 0, as_proportion = TRUE ) virus_set_state(delta2, 1, 2, 3) # Using the logit function -------------- sir <- ModelSIR( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery = 0.1 ) # Adding a small world population agents_smallworld( sir, n = 10000, k = 5, d = FALSE, p = .01 ) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(sir) # And adding features dat <- cbind( female = sample.int(2, 10000, replace = TRUE) - 1, x = rnorm(10000) ) set_agents_data(sir, dat) # Creating the logit function vfun <- virus_fun_logit( vars = c(0L, 1L), coefs = c(-1, 1), model = sir ) # The infection prob is lower hist(plogis(dat %*% rbind(-1, 1))) vfun # printing #> An epiworld_virus_function object. #> (model: Susceptible-Infected-Recovered (SIR)) #> This function was built using -virus_fun_logit()-. and it features the following coefficients: #> 0: -1.00 #> 1: 1.00 set_prob_infecting_fun( virus = get_virus(sir, 0), model = sir, vfun = vfun ) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(sir)"},{"path":"/news/index.html","id":"epiworldr-03-2","dir":"Changelog","previous_headings":"","what":"epiworldR 0.3-2","title":"epiworldR 0.3-2","text":"CRAN release: 2024-10-08 Starting version 0.3-0, epiworldR versioned using version C++ library, epiworld. Adds new mixing models ModelSIRMixing ModelSEIRMixing. Ports Entity class. Entities used group agents within model. Refactors add_tool, add_virus, add_entity simplifying syntax. Now, functions receive model object. Prevalence specified object . add_tool_n add_virus_n now deprecated. globalaction_* now defunct. Use globalevent_* instead. New functions specify viruses, tools, entities distributed among agents: distribute_viruses, distribute_tools, distribute_entities.","code":""},{"path":"/news/index.html","id":"epiworldr-01-0","dir":"Changelog","previous_headings":"","what":"epiworldR 0.1-0","title":"epiworldR 0.1-0","text":"CRAN release: 2024-04-08 Force model update agents’ states running simulation. causing issues calling run_multiple() single call run(). Reported 14.","code":""},{"path":"/news/index.html","id":"epiworldr-00-4","dir":"Changelog","previous_headings":"","what":"epiworldR 0.0-4","title":"epiworldR 0.0-4","text":"CRAN release: 2024-02-09 Added missing checks tool class adding model add_too_n. Various small improvements.","code":""},{"path":"/news/index.html","id":"epiworldr-00-3","dir":"Changelog","previous_headings":"","what":"epiworldR 0.0-3","title":"epiworldR 0.0-3","text":"CRAN release: 2023-09-08 Added following models: ModelSEIRD, ModelSEIRDCONN, ModelSIRD, ModelSIRDCONN, ModelSISD. Fixed bug reported issue 6.","code":""},{"path":"/news/index.html","id":"epiworldr-00-2","dir":"Changelog","previous_headings":"","what":"epiworldR 0.0-2","title":"epiworldR 0.0-2","text":"CRAN release: 2023-06-21 Added NEWS.md file track changes package. Fixed bug reported CRAN reference nullptr. Renamed arguments across Models favor consistency. Figures now show virus/tool name instead id. Fixed bug run_multiple added tests (C++). Redid autoconf Makevars using RcppArmadillo template checking OpenMP.","code":""}] +[{"path":[]},{"path":"/CODE_OF_CONDUCT.html","id":"our-pledge","dir":"","previous_headings":"","what":"Our Pledge","title":"Contributor Covenant Code of Conduct","text":"members, contributors, leaders pledge make participation community harassment-free experience everyone, regardless age, body size, visible invisible disability, ethnicity, sex characteristics, gender identity expression, level experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, sexual identity orientation. pledge act interact ways contribute open, welcoming, diverse, inclusive, healthy community.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"our-standards","dir":"","previous_headings":"","what":"Our Standards","title":"Contributor Covenant Code of Conduct","text":"Examples behavior contributes positive environment community include: Demonstrating empathy kindness toward people respectful differing opinions, viewpoints, experiences Giving gracefully accepting constructive feedback Accepting responsibility apologizing affected mistakes, learning experience Focusing best just us individuals, overall community Examples unacceptable behavior include: use sexualized language imagery, sexual attention advances kind Trolling, insulting derogatory comments, personal political attacks Public private harassment Publishing others’ private information, physical email address, without explicit permission conduct reasonably considered inappropriate professional setting","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"enforcement-responsibilities","dir":"","previous_headings":"","what":"Enforcement Responsibilities","title":"Contributor Covenant Code of Conduct","text":"Community leaders responsible clarifying enforcing standards acceptable behavior take appropriate fair corrective action response behavior deem inappropriate, threatening, offensive, harmful. Community leaders right responsibility remove, edit, reject comments, commits, code, wiki edits, issues, contributions aligned Code Conduct, communicate reasons moderation decisions appropriate.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"scope","dir":"","previous_headings":"","what":"Scope","title":"Contributor Covenant Code of Conduct","text":"Code Conduct applies within community spaces, also applies individual officially representing community public spaces. Examples representing community include using official e-mail address, posting via official social media account, acting appointed representative online offline event.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"enforcement","dir":"","previous_headings":"","what":"Enforcement","title":"Contributor Covenant Code of Conduct","text":"Instances abusive, harassing, otherwise unacceptable behavior may reported community leaders responsible enforcement derekmeyer37@gmail.com. complaints reviewed investigated promptly fairly. community leaders obligated respect privacy security reporter incident.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"enforcement-guidelines","dir":"","previous_headings":"","what":"Enforcement Guidelines","title":"Contributor Covenant Code of Conduct","text":"Community leaders follow Community Impact Guidelines determining consequences action deem violation Code Conduct:","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_1-correction","dir":"","previous_headings":"Enforcement Guidelines","what":"1. Correction","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Use inappropriate language behavior deemed unprofessional unwelcome community. Consequence: private, written warning community leaders, providing clarity around nature violation explanation behavior inappropriate. public apology may requested.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_2-warning","dir":"","previous_headings":"Enforcement Guidelines","what":"2. Warning","title":"Contributor Covenant Code of Conduct","text":"Community Impact: violation single incident series actions. Consequence: warning consequences continued behavior. interaction people involved, including unsolicited interaction enforcing Code Conduct, specified period time. includes avoiding interactions community spaces well external channels like social media. Violating terms may lead temporary permanent ban.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_3-temporary-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"3. Temporary Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: serious violation community standards, including sustained inappropriate behavior. Consequence: temporary ban sort interaction public communication community specified period time. public private interaction people involved, including unsolicited interaction enforcing Code Conduct, allowed period. Violating terms may lead permanent ban.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"id_4-permanent-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"4. Permanent Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Demonstrating pattern violation community standards, including sustained inappropriate behavior, harassment individual, aggression toward disparagement classes individuals. Consequence: permanent ban sort public interaction within community.","code":""},{"path":"/CODE_OF_CONDUCT.html","id":"attribution","dir":"","previous_headings":"","what":"Attribution","title":"Contributor Covenant Code of Conduct","text":"Code Conduct adapted Contributor Covenant, version 2.1, available https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. Community Impact Guidelines inspired Mozilla’s code conduct enforcement ladder. answers common questions code conduct, see FAQ https://www.contributor-covenant.org/faq. Translations available https://www.contributor-covenant.org/translations.","code":""},{"path":"/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"MIT License","title":"MIT License","text":"Copyright (c) 2023 George G. Vega Yon Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.","code":""},{"path":[]},{"path":"/articles/getting-started.html","id":"setup-and-running-the-model","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Setup and running the model","title":"Getting started with epiworldR","text":"example implements social network parameters listed within ModelSIRCONN function. virus name specified (COVID-19), 50000 agents initialized, virus prevalence 0.001 declared, agent contact two others (contact_rate), transmission rate given agent 0.3, recovery rate set 13\\frac{1}{3}. create model epiworldR, simply use ModelSIRCONN function. , example take basic features epiworldR. Printing model shows us information. Nevertheless, can extract detailed information using summary method. First, name model, population size, number entities (think public spaces agents can make social contact one another), duration days, number viruses, amount time last replicate took run (last run elapsed t), rewiring status (). model also includes list global actions (interventions) called model run. Next, see list viruses used model. case, COVID-19 virus used. Note epiworldR can include one virus model. Tool(s) lists agents’ tools fight virus. Examples may include masking, vaccines, social distancing, etc. model, tools specified. Lastly, model parameters listed. execute model, use run function SIR model object, number simulation days, optional seed reproducibility. Next, print results simulated model using model_sir. two additional sections included summary running model. First, see distribution population time 50. section describes flow agents state (SIR) 50 days. example, ’ll see number agents susceptible state decreased 49,995 3,276, number agents infected state increased 5 1, recovered agents increased 46,723 50 days. counts states change based model parameters simulation run-time. transmission probabilities section outputs 3x3 matrix describes probability moving one state another. example, susceptible row, agent 0.95 probability remaining susceptible state 0.05 probability moving susceptible state infected state. Notice chance skipping states. words, agent can’t jump susceptible state recovered state; agent must pass infected state progress recovered state. logic applies moving backward; agent become susceptible infection.","code":"library(epiworldR) model_sir <- ModelSIRCONN( name = \"COVID-19\", n = 50000, prevalence = 0.0001, contact_rate = 2, transmission_rate = 0.5, recovery_rate = 1 / 3 ) # Printing the model model_sir #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 50000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. The model hasn't been run yet. summary(model_sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) (connected) #> Population size : 50000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 0 (of 0) #> Number of viruses : 1 #> Last run elapsed t : - #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 2.0000 #> - Recovery rate : 0.3333 #> - Transmission rate : 0.5000 run(model_sir, ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. summary(model_sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) (connected) #> Population size : 50000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 #> Last run elapsed t : 101.00ms #> Last run speed : 24.67 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 2.0000 #> - Recovery rate : 0.3333 #> - Transmission rate : 0.5000 #> #> Distribution of the population at time 50: #> - (0) Susceptible : 49995 -> 3276 #> - (1) Infected : 5 -> 1 #> - (2) Recovered : 0 -> 46723 #> #> Transition Probabilities: #> - Susceptible 0.95 0.05 0.00 #> - Infected 0.00 0.69 0.31 #> - Recovered 0.00 0.00 1.00"},{"path":[]},{"path":"/articles/getting-started.html","id":"extracting-information","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Extracting information","title":"Getting started with epiworldR","text":"running epiworldR model, list functions can called using epiworld model object. demonstrate, start basic plot get_hist_total functions. evident plot, SIR model constructed epiworldR displays changes susceptible, infected, recovered case counts time (days). Notice certain amount time, curves flatten. , table representation plot printed, complete state within SIR model, date, agent counts. essential statistic epidemiological models reproductive number: epiworldR method plot reproductive number automatically. function takes average values table date repeats data accounted . Another typical piece information daily incidence. number new cases per day. epiworldR, can get incidence looking daily transitions states. Although function get_hist_transition_matrix provides desired data, function plot_incidence nice wrapper visualizing data:","code":"methods(class = \"epiworld_model\") #> [1] add_param add_tool #> [3] add_virus agents_from_edgelist #> [5] agents_smallworld get_agents #> [7] get_hist_tool get_hist_total #> [9] get_hist_transition_matrix get_hist_virus #> [11] get_n_replicates get_n_tools #> [13] get_n_viruses get_name #> [15] get_ndays get_param #> [17] get_reproductive_number get_states #> [19] get_today_total get_transition_probability #> [21] get_transmissions print #> [23] queuing_off queuing_on #> [25] run_multiple run #> [27] set_name set_param #> [29] size summary #> [31] today verbose_off #> [33] verbose_on #> see '?methods' for accessing help and source code plot(model_sir) head(get_hist_total(model_sir)) #> date state counts #> 1 0 Susceptible 49995 #> 2 0 Infected 5 #> 3 0 Recovered 0 #> 4 1 Susceptible 49988 #> 5 1 Infected 12 #> 6 1 Recovered 0 repnum <- get_reproductive_number(model_sir) head(repnum) #> virus_id virus source source_exposure_date rt #> 1 0 COVID-19 7312 44 0 #> 2 0 COVID-19 46328 43 0 #> 3 0 COVID-19 43475 42 0 #> 4 0 COVID-19 23672 42 0 #> 5 0 COVID-19 18224 42 1 #> 6 0 COVID-19 48317 41 2 x <- plot(repnum, type = \"b\") subset(x, date == 10) # Reproductive number on day 10 #> virus_id virus date avg n sd lb ub #> 11 0 COVID-19 10 2.601587 630 2.29016 0 8 plot_incidence(model_sir)"},{"path":"/articles/getting-started.html","id":"adding-more-virusesviruses","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Adding more viruses/viruses","title":"Getting started with epiworldR","text":"epiworldR supports multi-virus models. code gives instructions implement . Using virus function, give name new virus/virus corresponding probability infecting given agent. example, prob_infecting set 1.0, making highly contagious. officially add new virus model, use add_virus function calling original epiworldR model object, new virus, new virus’ prevalence (set 0.01 example). running updated model new virus included 50 days, output describes simulation. confirm flu included, notice presence “Flu” Virus(es) section output. output interpretable specified previous sections. Plotting previous model (including flu) yields following. Notice presence two reproductive numbers plotted time. Variant 0 refers COVID-19, virus 1 refers flu.","code":"# Building the virus flu <- virus( name = \"Flu\", prob_infecting = .3, prevalence = .0001, as_proportion = TRUE ) # Adding the virus to the model add_virus(model_sir, flu) run(model_sir, ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. model_sir #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 50000 agents, 2 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 3285 Susceptible, 3 Infected, and 46712 Recovered. repnum2 <- get_reproductive_number(model_sir) op <- par(mfrow = c(2, 1)) plot(model_sir) plot(repnum2, type = \"b\") par(op)"},{"path":"/articles/getting-started.html","id":"tools","dir":"Articles","previous_headings":"Example 1: Simulating an SIR model","what":"Tools","title":"Getting started with epiworldR","text":"Now, implementation tools combat viruses viruses model demonstrated. First, sake simplicity, remove flu virus SIR model object (keep mind index flu virus model object 1). Next, provide parameters new tool using tool function. parameters include name tool, reduction probabilities SIR model parameters, increased probability recovery option. order add tool SIR model, use add_tool function SIR model object, new tool, prevalence tool. example, assume 85% population received vaccination.","code":"# Removing the flu virus from the model rm_virus(model_sir, 1) vaccine <- tool( name = \"Vaccine\", prevalence = 0.5, as_proportion = TRUE, susceptibility_reduction = .9, transmission_reduction = .5, recovery_enhancer = .5, death_reduction = .9 ) add_tool(model_sir, vaccine) run(model_sir, ndays = 50, seed = 1231) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. repnum3 <- get_reproductive_number(model_sir) op <- par(mfrow = c(2, 1)) plot_incidence(model_sir) plot(repnum3, type = \"b\") par(op)"},{"path":"/articles/implementation.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Implementation details of epiworldR","text":"following vignette provides detailed information implementation epiworldR. package wrapper C++ package epiworld, framework building agent-based models.1","code":""},{"path":"/articles/implementation.html","id":"general-flow-of-the-models","dir":"Articles","previous_headings":"","what":"General flow of the models","title":"Implementation details of epiworldR","text":"core function epiworldR run() function. function executes model saves results database part underlying C++ object. package implements discrete-time ABM, meaning model executed discrete steps (e.g., days). run() function executes following steps: model reset(), involves: () resetting agents, available, restoring population backup2, (b) resetting database, (c) distributing viruses tools, (d) setting initial state agents. steps fixing current_date = 0. model’s state recorded database, current_date incremented 1. resetting model, start iterative process repeating following steps: state agent updated. States updated according corresponding update_state function. Since model discrete-time, state changes stored promises, meaning agents’ states updated immediately. Instead, state updated end updates. done avoid updating state agent using updated state update state another agent. example, agent ii infects agent jj, agent jj able infect agent ii step. update schedule laid , changes made effective, , instance, individuals became infected update start next step infected state. Global actions executed. also change agents’ states, just like previous step, changes stored promises made effective actions evaluated. model’s state recorded database, current_date incremented 1. model checks whether simulation stop. simulation stop, model stops. Otherwise, model goes back step . steps included epiworld epiworldR network rewiring mutation viruses. implemented future versions epiworldR.","code":""},{"path":[]},{"path":"/articles/implementation.html","id":"transmission-probability","dir":"Articles","previous_headings":"Computing probabilities","what":"Transmission probability","title":"Implementation details of epiworldR","text":"Generally, epiworldR assumes step simulation, susceptible agents can acquire disease one infected agent. probability transmission ii jj given following formula: P(→j|one)=pij×∏k≠(1−pkj)∏k(1−pkj)+∑kpkj×∏l≠k(1−plj) P(\\j| \\mbox{one}) = \\frac{p_{ij} \\times \\prod_{k\\neq }\\left(1 - p_{kj}\\right)}{\\prod_k\\left(1 - p_{kj}\\right) + \\sum_k p_{kj} \\times \\prod_{l\\neq k}\\left(1 - p_{lj}\\right)} adjusted probabilities pijp_{ij} computed function ii, jj, virus. following section describes probabilities computed.","code":""},{"path":"/articles/implementation.html","id":"adjusted-probabilities","dir":"Articles","previous_headings":"Computing probabilities","what":"Adjusted probabilities","title":"Implementation details of epiworldR","text":"Viruses tools provide way adjust agents move states. Viruses epiworldR contain various baseline probabilities used across models, including transmission, recovery, death. hand, tools alter probabilities reducing/increasing . Furthermore, tools alter agents’ susceptibility, infectiousness, recovery, death probabilities. Currently, tools alter probabilities constant factor, pij=pv×(1−factorhost)×(1−factortarget) p_{ij} = p_{v} \\times \\left(1 - factor_{host}\\right) \\times \\left(1 - factor_{target}\\right) pvp_{v} raw transmission probability virus vv, factortfactor_{t} increasing/reducing factors tools process. example, p_v 0.9, host wearing mask, factormask host=0.3factor_{\\mbox{mask host}} = 0.3 target vaccinated, factorvaccinated target=0.5factor_{\\mbox{vaccinated target}} = 0.5, adjusted probability pijp_{ij} 0.9×(1−0.3)×(1−0.5)=0.270.9 \\times (1 - 0.3) \\times (1 - 0.5) = 0.27. agents one tool, factors combined follows: factoragent=1−∏t∈toolsagent(1−factort) factor_{agent} = 1 - \\prod_{t\\tools_{agent}}\\left(1 - factor_{t}\\right) Therefore, example, vaccinated agent wearing mask factor 1−(1−0.30)×(1−0.5)=0.651 - (1 - 0.30) \\times (1 - 0.5) = 0.65. adjusted probabilities principle also applies recovery rates SIR SEIR models.","code":""},{"path":"/articles/implementation.html","id":"transmission-in-connected-modelsmodels","dir":"Articles","previous_headings":"Computing probabilities","what":"Transmission in connected models3","title":"Implementation details of epiworldR","text":"“connected” models provide version agents live fully connected network. means agent can infect agent, making version similar typical compartmental models. models, transmission probability depends contact rate. susceptible agent, transmission process simulated follows: number contacts cc drawn binomial distribution parameters nn pp, nn number agents p=p =contact_rate/n/ n. , cc agents randomly selected population. Transmission can occur agents susceptible agent. probability transmission cc agents calculated described previous section.","code":""},{"path":"/articles/likelihood-free-mcmc.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"purpose “lfmcmc” function perform Likelihood-Free Markhov Chain Monte Carlo simulation.","code":""},{"path":[]},{"path":"/articles/likelihood-free-mcmc.html","id":"setup-and-running-the-model","dir":"Articles","previous_headings":"Example: Using LFMCMC to calibrate an SIR Model","what":"Setup and Running the Model","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"Create SIR Model add small world population. , run model.","code":"library(epiworldR) model_seed <- 122 model_sir <- ModelSIR( name = \"COVID-19\", prevalence = .1, transmission_rate = .9, recovery_rate = .3 ) agents_smallworld( model_sir, n = 1000, k = 5, d = FALSE, p = 0.01 ) verbose_off(model_sir) run( model_sir, ndays = 50, seed = model_seed ) summary(model_sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Recovered (SIR) #> Population size : 1000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 #> Last run elapsed t : 876.00µs #> Last run speed : 57.08 million agents x day / second #> Rewiring : off #> #> Global events: #> (none) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Recovery rate : 0.3000 #> - Transmission rate : 0.9000 #> #> Distribution of the population at time 50: #> - (0) Susceptible : 900 -> 0 #> - (1) Infected : 100 -> 0 #> - (2) Recovered : 0 -> 1000 #> #> Transition Probabilities: #> - Susceptible 0.62 0.38 0.00 #> - Infected 0.00 0.69 0.31 #> - Recovered 0.00 0.00 1.00"},{"path":"/articles/likelihood-free-mcmc.html","id":"setup-lfmcmc","dir":"Articles","previous_headings":"Example: Using LFMCMC to calibrate an SIR Model","what":"Setup LFMCMC","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"","code":"# Extract the observed data from the model obs_data <- unname(as.integer(get_today_total(model_sir))) # Define the LFMCMC simulation function simfun <- function(params) { set_param(model_sir, \"Recovery rate\", params[1]) set_param(model_sir, \"Transmission rate\", params[2]) run( model_sir, ndays = 50 ) res <- unname(as.integer(get_today_total(model_sir))) return(res) } # Define the LFMCMC summary function sumfun <- function(dat) { return(dat) } # Define the LFMCMC proposal function # - Based on proposal_fun_normal from lfmcmc-meat.hpp propfun <- function(params_prev) { res <- params_prev + rnorm(length(params_prev), ) return(res) } # Define the LFMCMC kernel function # - Based on kernel_fun_uniform from lfmcmc-meat.hpp kernelfun <- function(stats_now, stats_obs, epsilon) { ans <- sum(mapply(function(v1, v2) (v1 - v2)^2, stats_obs, stats_now)) return(ifelse(sqrt(ans) < epsilon, 1.0, 0.0)) } # Create the LFMCMC model lfmcmc_model <- LFMCMC(model_sir) |> set_simulation_fun(simfun) |> set_summary_fun(sumfun) |> set_proposal_fun(propfun) |> set_kernel_fun(kernelfun) |> set_observed_data(obs_data)"},{"path":"/articles/likelihood-free-mcmc.html","id":"run-lfmcmc-simulation","dir":"Articles","previous_headings":"Example: Using LFMCMC to calibrate an SIR Model","what":"Run LFMCMC simulation","title":"Likelihood Free Markhov Chain Monte Carlo (LFMCMC)","text":"","code":"# Set initial parameters par0 <- as.double(c(0.1, 0.5)) n_samp <- 2000 epsil <- as.double(1.0) # Run the LFMCMC simulation run_lfmcmc( lfmcmc = lfmcmc_model, params_init_ = par0, n_samples_ = n_samp, epsilon_ = epsil, seed = model_seed ) # Print the results set_stats_names(lfmcmc_model, get_states(model_sir)) set_par_names(lfmcmc_model, c(\"Immune recovery\", \"Infectiousness\")) print(lfmcmc_model) #> ___________________________________________ #> #> LIKELIHOOD-FREE MARKOV CHAIN MONTE CARLO #> #> N Samples : 2000 #> Elapsed t : 1.00s #> #> Parameters: #> -Immune recovery : 11.58 [ 0.63, 23.19] (initial : 0.10) #> -Infectiousness : 18.97 [ 1.22, 49.18] (initial : 0.50) #> #> Statistics: #> -Susceptible : 4.45 [ 0.00, 0.00] (Observed: 0.00) #> -Infected : 2.61 [ 0.00, 0.00] (Observed: 0.00) #> -Recovered : 992.44 [ 1000.00, 1000.00] (Observed: 1000.00) #> ___________________________________________"},{"path":"/articles/mixing.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Mixing models","text":"vignette shows create mixing model using epiworldR package. Mixing models feature multiple populations. group, called Entities, subset agents. agents can interact within group agents groups. contact matrix defines interaction agents.","code":""},{"path":"/articles/mixing.html","id":"an-seir-model-with-mixing","dir":"Articles","previous_headings":"","what":"An SEIR model with mixing","title":"Mixing models","text":"example, simulate outbreak featuring three populations. contact matrix defined follows: [0.90.050.050.10.80.10.10.20.7] \\left[% \\begin{array}{ccc} 0.9 & 0.05 & 0.05 \\\\ 0.1 & 0.8 & 0.1 \\\\ 0.1 & 0.2 & 0.7 \\\\ \\end{array}% \\right] matrix represents probability agent population ii interacting agent population jj. matrix row-stochastic, meaning sum row equal 1. build model using entity class epiworld. following code chunk instantiates three entities contact matrix. hand, can proceed create mixing model. following code chunk creates model, SEIR mixing, adds entities model: function add_entity adds corresponding entity. default behavior randomly assigns agents entities beginning simulation. Agents may assigned one entity. following code-chunk simulates model 100 days, summarizes results, plots incidence curve:","code":"library(epiworldR) e1 <- entity(\"Population 1\", 3e3, as_proportion = FALSE) e2 <- entity(\"Population 2\", 3e3, as_proportion = FALSE) e3 <- entity(\"Population 3\", 3e3, as_proportion = FALSE) # Row-stochastic matrix (rowsums 1) cmatrix <- c( c(0.9, 0.05, 0.05), c(0.1, 0.8, 0.1), c(0.1, 0.2, 0.7) ) |> matrix(byrow = TRUE, nrow = 3) N <- 9e3 flu_model <- ModelSEIRMixing( name = \"Flu\", n = N, prevalence = 1 / N, contact_rate = 20, transmission_rate = 0.1, recovery_rate = 1 / 7, incubation_days = 7, contact_matrix = cmatrix ) # Adding the entities flu_model |> add_entity(e1) |> add_entity(e2) |> add_entity(e3) set.seed(331) run(flu_model, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(flu_model) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) with Mixing #> Population size : 9000 #> Agents' data : (none) #> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 127.00ms #> Last run speed : 7.08 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - Flu #> #> Tool(s): #> (none) #> #> Model parameters: #> - Avg. Incubation days : 7.0000 #> - Contact rate : 20.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 8999 -> 137 #> - (1) Exposed : 1 -> 35 #> - (2) Infected : 0 -> 139 #> - (3) Recovered : 0 -> 8689 #> #> Transition Probabilities: #> - Susceptible 0.96 0.04 0.00 0.00 #> - Exposed 0.00 0.84 0.16 0.00 #> - Infected 0.00 0.00 0.86 0.14 #> - Recovered 0.00 0.00 0.00 1.00 plot_incidence(flu_model)"},{"path":"/articles/mixing.html","id":"investigating-the-history","dir":"Articles","previous_headings":"","what":"Investigating the history","title":"Mixing models","text":"running simulation, possible question : many agents entity infected day? following code chunk retrieves agents entity transmissions occurred simulation: can retrieve daily incidence entity merging transmissions agents’ entities. following code chunk accomplishes : information, can now visualize daily incidence entity. following code chunk plots daily incidence entity:","code":"library(data.table) agents_entities <- lapply(get_entities(flu_model), \\(e) { entity_get_agents(e) }) |> rbindlist() head(agents_entities) #> agent entity #> #> 1: 507 0 #> 2: 1710 0 #> 3: 8984 0 #> 4: 7844 0 #> 5: 760 0 #> 6: 4379 0 # Retrieving the transmissions transmissions <- get_transmissions(flu_model) |> data.table() # We only need the date and the source transmissions <- subset( transmissions, select = c(\"date\", \"source\") ) # Attaching the entity to the source transmissions <- merge( transmissions, agents_entities, by.x = \"source\", by.y = \"agent\" ) # Aggregating by date x entity (counts) transmissions <- transmissions[, .N, by = .(date, entity)] # Taking a look at the data head(transmissions) #> date entity N #> #> 1: 75 1 12 #> 2: 47 0 114 #> 3: 51 0 133 #> 4: 52 0 152 #> 5: 47 2 74 #> 6: 48 2 87 setorder(transmissions, date, entity) ran <- range(transmissions$N) transmissions[entity == 0, plot( x = date, y = N, type = \"l\", col = \"black\", ylim = ran)] #> NULL transmissions[entity == 1, lines(x = date, y = N, col = \"red\")] #> NULL transmissions[entity == 2, lines(x = date, y = N, col = \"blue\")] #> NULL legend( \"topright\", legend = c(\"Population 1\", \"Population 2\", \"Population 3\"), col = c(\"black\", \"red\", \"blue\"), lty = 1 )"},{"path":"/articles/run-multiple.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Run Multiple","text":"purpose “run_multiple” function run specified number simulations using model object. , function makes possible compare model results across several separate repeated simulations.","code":""},{"path":[]},{"path":"/articles/run-multiple.html","id":"setup-and-running-model","dir":"Articles","previous_headings":"Example: Simulating a SEIRCONN Model 50 Times","what":"Setup and Running Model","title":"Run Multiple","text":"use “run_multiple” function epiworld, create epimodel choice; case, example uses SEIRCONN model COVID-19, 100000 people, initial prevalence 0.0001 (0.01%), contact rate 2, probability transmission 0.5, total 7 incubation days, probability recovery 13\\frac{1}{3}.","code":"library(epiworldR) model_seirconn <- ModelSEIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.0001, contact_rate = 2, transmission_rate = 0.5, incubation_days = 7, recovery_rate = 1 / 3 )"},{"path":"/articles/run-multiple.html","id":"generating-a-saver","dir":"Articles","previous_headings":"Example: Simulating a SEIRCONN Model 50 Times","what":"Generating a Saver","title":"Run Multiple","text":"Next, generate saver purpose extracting “total_hist” “reproductive” information model object. Now, use “run_multiple” function model object, number desired days run simulation, number simulations run, number threads parallel computing. Using “run_multiple_get_results” function, extract results model object simulated 50 times comparison across simulations.","code":"# Generating a saver saver <- make_saver(\"total_hist\", \"reproductive\") # Running and printing run_multiple(model_seirconn, ndays = 50, nsims = 50, saver = saver, nthreads = 2) #> Starting multiple runs (50) using 2 thread(s) #> _________________________________________________________________________ #> _________________________________________________________________________ #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Retrieving the results ans <- run_multiple_get_results(model_seirconn) head(ans$total_hist) #> sim_num date nviruses state counts #> 1 1 0 1 Susceptible 9999 #> 2 1 0 1 Exposed 1 #> 3 1 0 1 Infected 0 #> 4 1 0 1 Recovered 0 #> 5 1 1 1 Susceptible 9999 #> 6 1 1 1 Exposed 1 head(ans$reproductive) #> sim_num virus_id virus source source_exposure_date rt #> 1 2 0 COVID-19 9964 50 0 #> 2 2 0 COVID-19 9828 50 0 #> 3 2 0 COVID-19 9689 50 0 #> 4 2 0 COVID-19 9687 50 0 #> 5 2 0 COVID-19 9651 50 0 #> 6 2 0 COVID-19 9277 50 0"},{"path":"/articles/run-multiple.html","id":"plotting","dir":"Articles","previous_headings":"Example: Simulating a SEIRCONN Model 50 Times","what":"Plotting","title":"Run Multiple","text":"plot epicurves reproductive numbers time using boxplots, extract results model object using “run_multiple_get_results”. example, dates filtered less equal 20 observe epicurves first 20 days. Notice boxplot table represents observed values 50 simulations date. view plot reproductive number 50 days 50 simulations, store reproductive results new object using “run_multiple_get_results”, plot using “boxplot” function. Notice source exposure date displays boxplot representing distribution reproductive numbers across 50 simulations. expected, reproductive number average, decreases time.","code":"seirconn_50 <- run_multiple_get_results(model_seirconn)$total_hist seirconn_50 <- seirconn_50[seirconn_50$date <= 20, ] plot(seirconn_50) seirconn_50_r <- run_multiple_get_results(model_seirconn)$reproductive plot(seirconn_50_r) # boxplot(rt ~ source_exposure_date, data = seirconn_50_r, # main = \"Reproductive Number\", # xlab = \"Source Exposure Date\", # ylab = \"rt\", # border = \"black\", # las = 2)"},{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"George Vega Yon. Author, maintainer. Derek Meyer. Author. Susan Holmes. Reviewer. JOSS reviewer Abinash Satapathy. Reviewer. JOSS reviewer Carinogurjao. Reviewer. Centers Disease Control Prevention. Funder. Award number 1U01CK000585; 75D30121F00003","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Meyer, Derek Vega Yon, George (2023). epiworldR: Fast Agent-Based Epi Models. Journal Open Source Software, 8(90), 5781, https://doi.org/10.21105/joss.05781 Meyer D, Vega Yon G (????). epiworldR: Fast Agent-Based Epi Models. R package version 0.4-3, https://github.com/UofUEpiBio/epiworldR.","code":"@Article{, entry = {Article}, title = {epiworldR: Fast Agent-Based Epi Models}, author = {Derek Meyer and George {Vega Yon}}, journal = {The Journal of Open Source Software}, year = {2023}, month = {oct}, volume = {8}, number = {90}, doi = {10.21105/joss.05781}, url = {https://joss.theoj.org/papers/10.21105/joss.05781}, } @Manual{, title = {{{epiworldR: Fast Agent-Based Epi Models}}}, author = {Derek Meyer and George {Vega Yon}}, note = {R package version 0.4-3}, url = {https://github.com/UofUEpiBio/epiworldR}, }"},{"path":"/index.html","id":"epiworldr","dir":"","previous_headings":"","what":"Fast Agent-Based Epi Models","title":"Fast Agent-Based Epi Models","text":"R package wrapper C++ library epiworld. provides general framework modeling disease transmission using agent-based models. main features include: Fast simulation average 30 million agents/day per second. One model can include multiple diseases. Policies (tools) can multiple user-defined. Transmission can function agents’ features. ---box parallelization multiple simulations. package’s description: flexible framework Agent-Based Models (ABM), epiworldR package provides methods prototyping disease outbreaks transmission models using C++ backend, making fast. supports multiple epidemiological models, including Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), others, involving arbitrary mitigation policies multiple-disease models. Users can specify infectiousness/susceptibility rates function agents’ features, providing great complexity model dynamics. Furthermore, epiworldR ideal simulation studies featuring large populations. Current available models: ModelDiffNet ModelSEIR ModelSEIRCONN ModelSEIRD ModelSEIRDCONN ModelSEIRMixing ModelSIR ModelSIRCONN ModelSIRD ModelSIRDCONN ModelSIRLogit ModelSIRMixing ModelSIS ModelSISD ModelSURV","code":""},{"path":"/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Fast Agent-Based Epi Models","text":"can install development version epiworldR GitHub : CRAN","code":"devtools::install_github(\"UofUEpiBio/epiworldR\") install.packages(\"epiworldR\")"},{"path":"/index.html","id":"examples","dir":"","previous_headings":"","what":"Examples","title":"Fast Agent-Based Epi Models","text":"R package includes several popular epidemiological models, including SIS, SIR, SEIR using either fully connected graph (similar compartmental model) user-defined network.","code":""},{"path":"/index.html","id":"sir-model-using-a-random-graph","dir":"","previous_headings":"","what":"SIR model using a random graph","title":"Fast Agent-Based Epi Models","text":"Susceptible-Infected-Recovered model features population 100,000 agents simulated small-world network. agent connected ten agents. One percent population virus, 70% chance transmission. Infected individuals recover 0.3 rate: Visualizing outputs","code":"library(epiworldR) # Creating a SIR model sir <- ModelSIR( name = \"COVID-19\", prevalence = .01, transmission_rate = .7, recovery = .3 ) |> # Adding a Small world population agents_smallworld(n = 100000, k = 10, d = FALSE, p = .01) |> # Running the model for 50 days run(ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. sir #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered (SIR) #> It features 100000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 822 Susceptible, 415 Infected, and 98763 Recovered. summary(sir) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Recovered (SIR) #> Population size : 100000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 50 (of 50) #> Number of viruses : 1 #> Last run elapsed t : 62.00ms #> Last run speed : 79.47 million agents x day / second #> Rewiring : off #> #> Global events: #> (none) #> #> Virus(es): #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Recovery rate : 0.3000 #> - Transmission rate : 0.7000 #> #> Distribution of the population at time 50: #> - (0) Susceptible : 99000 -> 822 #> - (1) Infected : 1000 -> 415 #> - (2) Recovered : 0 -> 98763 #> #> Transition Probabilities: #> - Susceptible 0.91 0.09 0.00 #> - Infected 0.00 0.70 0.30 #> - Recovered 0.00 0.00 1.00 plot(sir) plot_incidence(sir)"},{"path":"/index.html","id":"seir-model-with-a-fully-connected-graph","dir":"","previous_headings":"","what":"SEIR model with a fully connected graph","title":"Fast Agent-Based Epi Models","text":"SEIR model similar SIR model includes exposed state. , simulate population 10,000 agents 0.01 prevalence, 0.6 transmission rate, 0.5 recovery rate, 7 days-incubation period. population fully connected, meaning agents can transmit disease agent: Computing key statistics","code":"model_seirconn <- ModelSEIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 10, incubation_days = 7, transmission_rate = 0.1, recovery_rate = 1 / 7 ) |> add_virus( virus( name = \"COVID-19\", prevalence = 0.01, as_proportion = TRUE, prob_infecting = 0.01, recovery_rate = 0.6, prob_death = 0.5, incubation = 7 )) set.seed(132) run(model_seirconn, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(model_seirconn) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> Population size : 10000 #> Agents' data : (none) #> Number of entities : 0 #> Days (duration) : 100 (of 100) #> Number of viruses : 2 #> Last run elapsed t : 15.00ms #> Last run speed : 64.01 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - COVID-19 #> - COVID-19 #> #> Tool(s): #> (none) #> #> Model parameters: #> - Avg. Incubation days : 7.0000 #> - Contact rate : 10.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 9800 -> 11 #> - (1) Exposed : 200 -> 0 #> - (2) Infected : 0 -> 3 #> - (3) Recovered : 0 -> 9986 #> #> Transition Probabilities: #> - Susceptible 0.94 0.06 0.00 0.00 #> - Exposed 0.00 0.85 0.15 0.00 #> - Infected 0.00 0.00 0.86 0.14 #> - Recovered 0.00 0.00 0.00 1.00 plot(model_seirconn) repnum <- get_reproductive_number(model_seirconn) head(plot(repnum)) #> virus_id virus date avg n sd lb ub #> 1 0 COVID-19 0 5.769231 91 5.455022 1.000 20.750 #> 2 0 COVID-19 2 6.400000 10 4.880801 0.450 14.875 #> 3 0 COVID-19 3 5.166667 18 4.422536 0.425 13.000 #> 4 0 COVID-19 4 4.659091 44 3.784566 0.000 12.850 #> 5 0 COVID-19 5 5.205882 34 3.273210 0.000 12.175 #> 6 0 COVID-19 6 3.137255 51 2.713077 0.000 8.750 head(plot_generation_time(model_seirconn)) #> date avg n sd ci_lower ci_upper virus virus_id #> 1 2 4.444444 9 2.185813 2.2 8.000 COVID-19 0 #> 2 3 7.411765 17 3.922034 2.4 15.000 COVID-19 0 #> 3 4 8.538462 39 7.100208 2.0 22.000 COVID-19 0 #> 4 5 6.312500 32 3.905641 2.0 13.225 COVID-19 0 #> 5 6 7.200000 40 4.052223 2.0 15.100 COVID-19 0 #> 6 7 7.660000 50 4.461216 2.0 17.000 COVID-19 0"},{"path":"/index.html","id":"sir-logit","dir":"","previous_headings":"","what":"SIR Logit","title":"Fast Agent-Based Epi Models","text":"model provides complex transmission recovery pattern based agents’ features. , can reflect co-morbidities change probability infection recovery. , simulate population including dataset two features: intercept binary variable Female. probability infection recovery functions intercept Female variables. following code simulates population 100,000 agents small-world network. agent connected eight agents. One percent population virus, 80% chance transmission. Infected individuals recover 0.3 rate:","code":"# Simulating a population of 100,000 agents set.seed(2223) n <- 100000 # Agents' features X <- cbind( Intercept = 1, Female = sample.int(2, n, replace = TRUE) - 1 ) coef_infect <- c(.1, -2, 2) coef_recover <- rnorm(2) # Creating the model model_logit <- ModelSIRLogit( \"covid2\", data = X, coefs_infect = coef_infect, coefs_recover = coef_recover, coef_infect_cols = 1L:ncol(X), coef_recover_cols = 1L:ncol(X), prob_infection = .8, recovery_rate = .3, prevalence = .01 ) # Adding a small-world population agents_smallworld(model_logit, n, 8, FALSE, .01) # Running the model run(model_logit, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(model_logit) # Females are supposed to be more likely to become infected rn <- get_reproductive_number(model_logit) (table( X[, \"Female\"], (1:n %in% rn$source) ) |> prop.table())[, 2] #> 0 1 #> 0.12984 0.14201 # Looking into the agents get_agents(model_logit) #> Agents from the model \"Susceptible-Infected-Removed (SIR) (logit)\": #> Agent: 0, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 1, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 2, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 3, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 4, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 5, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 6, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 7, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 8, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 9, state: Recovered (2), Has virus: no, NTools: 0i NNeigh: 8 #> ... 99990 more agents ..."},{"path":"/index.html","id":"transmission-network","dir":"","previous_headings":"","what":"Transmission network","title":"Fast Agent-Based Epi Models","text":"example shows can draw transmission network simulation. following code simulates population 500 agents small-world network. agent connected ten agents. One percent population virus, 50% chance transmission. Infected individuals recover 0.5 rate:","code":"# Creating a SIR model sir <- ModelSIR( name = \"COVID-19\", prevalence = .01, transmission_rate = .5, recovery = .5 ) |> # Adding a Small world population agents_smallworld(n = 500, k = 10, d = FALSE, p = .01) |> # Running the model for 50 days run(ndays = 50, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. # Transmission network net <- get_transmissions(sir) # Plotting library(epiworldR) library(netplot) #> Loading required package: grid x <- igraph::graph_from_edgelist( as.matrix(net[, 2:3]) + 1 ) nplot(x, edge.curvature = 0, edge.color = \"gray\", skip.vertex = TRUE)"},{"path":"/index.html","id":"multiple-simulations","dir":"","previous_headings":"","what":"Multiple simulations","title":"Fast Agent-Based Epi Models","text":"epiworldR supports running multiple simulations using run_multiple function. following code simulates 50 SIR models 1000 agents . agent connected ten agents. One percent population virus, 90% chance transmission. Infected individuals recover 0.1 rate. results saved data.frame:","code":"model_sir <- ModelSIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 1000, contact_rate = 2, transmission_rate = 0.9, recovery_rate = 0.1 ) # Generating a saver saver <- make_saver(\"total_hist\", \"reproductive\") # Running and printing # Notice the use of nthread = 2 to run the simulations in parallel run_multiple(model_sir, ndays = 100, nsims = 50, saver = saver, nthread = 2) #> Starting multiple runs (50) #> _________________________________________________________________________ #> _________________________________________________________________________ #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Retrieving the results ans <- run_multiple_get_results(model_sir) head(ans$total_hist) #> sim_num date nviruses state counts #> 1 1 0 1 Susceptible 990 #> 2 1 0 1 Infected 10 #> 3 1 0 1 Recovered 0 #> 4 1 1 1 Susceptible 971 #> 5 1 1 1 Infected 29 #> 6 1 1 1 Recovered 0 head(ans$reproductive) #> sim_num virus_id virus source source_exposure_date rt #> 1 1 0 COVID-19 943 9 0 #> 2 1 0 COVID-19 40 9 0 #> 3 1 0 COVID-19 6 9 0 #> 4 1 0 COVID-19 973 8 0 #> 5 1 0 COVID-19 495 9 0 #> 6 1 0 COVID-19 480 8 0 plot(ans$reproductive)"},{"path":"/index.html","id":"tutorials","dir":"","previous_headings":"","what":"Tutorials","title":"Fast Agent-Based Epi Models","text":"virtual INSNA Sunbelt 2023 session can found : https://github.com/UofUEpiBio/epiworldR-workshop/tree/sunbelt2023-virtual -person INSNA Sunbelt 2023 session can found : https://github.com/UofUEpiBio/epiworldR-workshop/tree/sunbetl2023-inperson","code":""},{"path":"/index.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Fast Agent-Based Epi Models","text":"use epiworldR research, please cite follows:","code":"citation(\"epiworldR\") #> To cite epiworldR in publications use: #> #> Meyer, Derek and Vega Yon, George (2023). epiworldR: Fast Agent-Based #> Epi Models. Journal of Open Source Software, 8(90), 5781, #> https://doi.org/10.21105/joss.05781 #> #> And the actual R package: #> #> Meyer D, Vega Yon G (????). _epiworldR: Fast Agent-Based Epi Models_. #> R package version 0.3-2, . #> #> To see these entries in BibTeX format, use 'print(, #> bibtex=TRUE)', 'toBibtex(.)', or set #> 'options(citation.bibtex.max=999)'."},{"path":"/index.html","id":"existing-alternatives","dir":"","previous_headings":"","what":"Existing Alternatives","title":"Fast Agent-Based Epi Models","text":"Several alternatives epiworldR exist provide researchers range options, unique features strengths, enabling exploration analysis infectious disease dynamics agent-based modeling. manually curated table existing alternatives, including ABM [@ABM], abmR [@abmR], cystiSim [@cystiSim], villager [@villager], RNetLogo [@RNetLogo].","code":""},{"path":"/index.html","id":"other-abm-r-packages","dir":"","previous_headings":"","what":"Other ABM R packages","title":"Fast Agent-Based Epi Models","text":"may want check R packages agent-based modeling: ABM, abmR, cystiSim, villager, RNetLogo.","code":""},{"path":"/index.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Fast Agent-Based Epi Models","text":"epiworldR project released Contributor Code Conduct. contributing project, agree abide terms.","code":""},{"path":"/paper.html","id":null,"dir":"","previous_headings":"","what":"Introduction","title":"Introduction","text":"Agent-based modeling (ABM) emerged powerful computational approach studying complex systems across various fields, including social sciences epidemiology. simulating interactions behaviors individual entities, known agents, ABM provides unique lens researchers can analyze understand emergent properties dynamics systems. epiworldR package provides flexible framework ABM implementation methods prototyping disease outbreaks transmission models using C++ backend. supports multiple epidemiological models, including Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), others, involving arbitrary mitigation policies multiple-disease models. Users can specify transmission/susceptibility rates function agents’ features, providing great complexity model dynamics.","code":""},{"path":"/paper.html","id":"key-features","dir":"","previous_headings":"","what":"Key Features","title":"Introduction","text":"Built robust foundation C++, package combines efficient computation flexibility R, providing seamless user experience several standout features: Multiple Viruses - feature allows researchers simulate analyze dynamics various infectious diseases simultaneously. Multiple Tools - capability enables users design model objects may reflect real-world interventions. Examples include vaccines, mask wearing protocols, social distancing, much . Multiple Runs - epiworldR ability run simulations multiple times, providing complete picture simulation results behaviors. Global Actions - Similar adding multiple tools, global actions allow users implement interventions policies global scale point simulation, mimicking real-world scenarios aiding assessment impact. Built-Epidemiological Models - feature ensures researchers access well-established widely recognized frameworks, making easier compare benchmark results. Included popular epidemiological models : SIR, SIS, SEIR, SIR connected, SIS connected, SEIR connected, . extensive range features, epiworldR empowers researchers practitioners field epidemiology conduct thorough analyses, make informed decisions, contribute advancement public health.","code":""},{"path":"/paper.html","id":"existing-alternatives","dir":"","previous_headings":"","what":"Existing Alternatives","title":"Introduction","text":"Several alternatives epiworldR exist provide researchers range options, unique features strengths, enabling exploration analysis infectious disease dynamics agent-based modeling. manually curated table existing alternatives including ABM [@ABM], abmR [@abmR], cystiSim [@cystiSim], villager [@villager], RNetLogo [@RNetLogo].","code":""},{"path":"/paper.html","id":"statement-of-need","dir":"","previous_headings":"","what":"Statement of Need","title":"Introduction","text":"epiworldR package addresses need sophisticated epidemiological research offering user-friendly agent-based modeling (ABM) tool simulating analyzing infectious disease dynamics. caters diverse audience researchers, epidemiologists, public health practitioners, social scientists, policymakers, enabling study complex disease spread patterns, evaluate intervention strategies, prepare emerging pathogens. Unlike traditional epidemiological models, epiworldR’s ABM approach captures individual-level behaviors interactions, providing realistic representation disease dynamics. distinction sets apart compartmental models ABM frameworks, making epiworldR valuable accessible tool advancing infectious disease modeling enhancing outbreak preparedness.","code":""},{"path":"/paper.html","id":"conclusion","dir":"","previous_headings":"","what":"Conclusion","title":"Introduction","text":"development epiworldR package ushered new era agent-based modeling field social science epidemiology. harnessing power C++ flexibility R, comprehensive package offers multitude features enhance modeling analysis complex infectious disease dynamics. package’s ability handle multiple viruses tools, diverse set epidemiological models, capability run simulations multiple times, inclusion global actions capability empower researchers explore wide range scenarios make informed decisions regarding public health interventions. epiworldR serves valuable resource social science epidemiological communities, enabling study real-world phenomena, prediction outcomes, policy analysis. field epidemiology continues evolve, epiworldR stands forefront, providing researchers practitioners powerful tool navigate complexities infectious diseases contribute improvement global health outcomes.","code":""},{"path":[]},{"path":"/reference/LFMCMC.html","id":null,"dir":"Reference","previous_headings":"","what":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC)","code":""},{"path":"/reference/LFMCMC.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"","code":"LFMCMC(model) run_lfmcmc(lfmcmc, params_init_, n_samples_, epsilon_, seed = NULL) set_observed_data(lfmcmc, observed_data_) set_proposal_fun(lfmcmc, fun) use_proposal_norm_reflective(lfmcmc) set_simulation_fun(lfmcmc, fun) set_summary_fun(lfmcmc, fun) set_kernel_fun(lfmcmc, fun) use_kernel_fun_gaussian(lfmcmc) set_par_names(lfmcmc, names) set_stats_names(lfmcmc, names) # S3 method for class 'epiworld_lfmcmc' print(x, ...)"},{"path":"/reference/LFMCMC.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"model model class epiworld_model lfmcmc LFMCMC model params_init_ Initial model parameters n_samples_ Number samples epsilon_ Epsilon parameter seed Random engine seed observed_data_ Observed data fun LFMCMC kernel function names model stats names x LFMCMC model print ... Ignored","code":""},{"path":"/reference/LFMCMC.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"LFMCMC function returns model class epiworld_lfmcmc. simulated model class epiworld_lfmcmc. lfmcmc model observed data added lfmcmc model proposal function added LFMCMC model proposal function set norm reflective lfmcmc model simulation function added lfmcmc model summary function added lfmcmc model kernel function added LFMCMC model kernel function set gaussian lfmcmc model parameter names added lfmcmc model stats names added lfmcmc model","code":""},{"path":"/reference/LFMCMC.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"Performs Likelihood-Free Markhov Chain Monte Carlo simulation","code":""},{"path":"/reference/LFMCMC.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Likelihood-Free Markhov Chain Monte Carlo (LFMCMC) — LFMCMC","text":"","code":"## Setup an SIR model to use in the simulation model_seed <- 122 model_sir <- ModelSIR(name = \"COVID-19\", prevalence = .1, transmission_rate = .9, recovery_rate = .3) agents_smallworld( model_sir, n = 1000, k = 5, d = FALSE, p = 0.01 ) verbose_off(model_sir) run(model_sir, ndays = 50, seed = model_seed) ## Setup LFMCMC # Extract the observed data from the model obs_data <- unname(as.integer(get_today_total(model_sir))) # Define the simulation function simfun <- function(params) { set_param(model_sir, \"Recovery rate\", params[1]) set_param(model_sir, \"Transmission rate\", params[2]) run(model_sir, ndays = 50) res <- unname(as.integer(get_today_total(model_sir))) return(res) } # Define the summary function sumfun <- function(dat) { return(dat) } # Create the LFMCMC model lfmcmc_model <- LFMCMC(model_sir) |> set_simulation_fun(simfun) |> set_summary_fun(sumfun) |> use_proposal_norm_reflective() |> use_kernel_fun_gaussian() |> set_observed_data(obs_data) ## Run LFMCMC simulation # Set initial parameters par0 <- as.double(c(0.1, 0.5)) n_samp <- 2000 epsil <- as.double(1.0) # Run the LFMCMC simulation run_lfmcmc( lfmcmc = lfmcmc_model, params_init_ = par0, n_samples_ = n_samp, epsilon_ = epsil, seed = model_seed ) # Print the results set_stats_names(lfmcmc_model, get_states(model_sir)) set_par_names(lfmcmc_model, c(\"Immune recovery\", \"Infectiousness\")) print(lfmcmc_model) #> ___________________________________________ #> #> LIKELIHOOD-FREE MARKOV CHAIN MONTE CARLO #> #> N Samples : 2000 #> Elapsed t : 1.00s #> #> Parameters: #> -Immune recovery : 0.45 [ 0.14, 0.95] (initial : 0.10) #> -Infectiousness : 0.85 [ 0.54, 1.00] (initial : 0.50) #> #> Statistics: #> -Susceptible : 0.22 [ 0.00, 2.00] (Observed: 0.00) #> -Infected : 0.07 [ 0.00, 1.00] (Observed: 0.00) #> -Recovered : 995.71 [ 998.00, 1000.00] (Observed: 1000.00) #> ___________________________________________ #>"},{"path":"/reference/ModelDiffNet.html","id":null,"dir":"Reference","previous_headings":"","what":"Network Diffusion Model — ModelDiffNet","title":"Network Diffusion Model — ModelDiffNet","text":"network diffusion model simple model assumes probability adoption behavior proportional number adopters network.","code":""},{"path":"/reference/ModelDiffNet.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Network Diffusion Model — ModelDiffNet","text":"","code":"ModelDiffNet( name, prevalence, prob_adopt, normalize_exposure = TRUE, data = matrix(nrow = 0, ncol = 0), data_cols = 1L:ncol(data), params = vector(\"double\") ) # S3 method for class 'epiworld_diffnet' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelDiffNet.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Network Diffusion Model — ModelDiffNet","text":"name Name model. prevalence Prevalence disease. prob_adopt Probability adoption. normalize_exposure Normalize exposure. data Data. data_cols Data columns. params Parameters. x Object class epiworld_diffnet. main Title plot ... Passed graphics::plot.","code":""},{"path":"/reference/ModelDiffNet.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Network Diffusion Model — ModelDiffNet","text":"object class epiworld_diffnet epiworld_model.","code":""},{"path":"/reference/ModelDiffNet.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Network Diffusion Model — ModelDiffNet","text":"Different common epidemiological models, network diffusion model assumes probability adoption behavior proportional number adopters network. model defined following equations: $$ P(adopt) = \\mbox{Logit}^{-1}(prob\\_adopt + params * data + exposure) $$ exposure number adopters agent's network. Another important difference transmission network necesary useful since adoption model particular neighbor.","code":""},{"path":[]},{"path":"/reference/ModelDiffNet.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Network Diffusion Model — ModelDiffNet","text":"","code":"set.seed(2223) n <- 10000 # Generating synthetic data on a matrix with 2 columns. X <- cbind( age = sample(1:100, n, replace = TRUE), female = sample.int(2, n, replace = TRUE) - 1 ) adopt_chatgpt <- ModelDiffNet( \"ChatGPT\", prevalence = .01, prob_adopt = .1, data = X, params = c(1, 4) ) # Simulating a population from smallworld agents_smallworld(adopt_chatgpt, n, 8, FALSE, .01) # Running the model for 50 steps run(adopt_chatgpt, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. # Plotting the model plot(adopt_chatgpt)"},{"path":"/reference/ModelSEIR.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"Susceptible Exposed Infected Recovered model (SEIR)","code":""},{"path":"/reference/ModelSEIR.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"","code":"ModelSEIR(name, prevalence, transmission_rate, incubation_days, recovery_rate) # S3 method for class 'epiworld_seir' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIR.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. x Object class SEIR. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSEIR.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"ModelSEIRfunction returns model class epiworld_model. plot function returns plot SEIR model class epiworld_model.","code":""},{"path":"/reference/ModelSEIR.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) Proportion non-infected agents removed, (2) Proportion exposed agents set infected.","code":""},{"path":[]},{"path":"/reference/ModelSEIR.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Recovered model (SEIR) — ModelSEIR","text":"","code":"model_seir <- ModelSEIR(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, incubation_days = 4) # Adding a small world population agents_smallworld( model_seir, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_seir, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seir #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 0 Susceptible, 0 Exposed, 0 Infected, and 1000 Removed. plot(model_seir, main = \"SEIR Model\")"},{"path":"/reference/ModelSEIRCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"SEIR connected model implements model agents connected. equivalent compartmental model (wiki).","code":""},{"path":"/reference/ModelSEIRCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"","code":"ModelSEIRCONN( name, n, prevalence, contact_rate, transmission_rate, incubation_days, recovery_rate ) # S3 method for class 'epiworld_seirconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"name String. Name virus. n Number individuals population. prevalence Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Probability recovery_rate. x Object class SEIRCONN. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"ModelSEIRCONNfunction returns model class epiworld_model. plot function returns plot SEIRCONN model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSEIRCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Removed model (SEIR connected) — ModelSEIRCONN","text":"","code":"# An example with COVID-19 model_seirconn <- ModelSEIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 2, incubation_days = 7, transmission_rate = 0.5, recovery_rate = 0.3 ) # Running and printing run(model_seirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 446 Susceptible, 4 Exposed, 3 Infected, and 9547 Recovered. plot(model_seirconn) # Adding the flu flu <- virus(\"Flu\", .9, 1 / 7, prevalence = 0.001, as_proportion = TRUE) add_virus(model_seirconn, flu) #' # Running and printing run(model_seirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> It features 10000 agents, 2 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 0 Susceptible, 0 Exposed, 0 Infected, and 10000 Recovered. plot(model_seirconn)"},{"path":"/reference/ModelSEIRD.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD)","code":""},{"path":"/reference/ModelSEIRD.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"","code":"ModelSEIRD( name, prevalence, transmission_rate, incubation_days, recovery_rate, death_rate ) # S3 method for class 'epiworld_seird' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRD.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. death_rate Numeric scalar 0 1. Rate death virus. x Object class SEIRD. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRD.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"ModelSEIRDfunction returns model class epiworld_model. plot function returns plot SEIRD model class epiworld_model.","code":""},{"path":"/reference/ModelSEIRD.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) Proportion exposed agents infected, (2) proportion non-infected agents already removed, (3) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSEIRD.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible-Exposed-Infected-Recovered-Deceased model (SEIRD) — ModelSEIRD","text":"","code":"model_seird <- ModelSEIRD(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, incubation_days = 4, death_rate = 0.01) # Adding a small world population agents_smallworld( model_seird, n = 100000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_seird, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seird #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed-Deceased (SEIRD) #> It features 100000 agents, 1 virus(es), and 0 tool(s). #> The model has 5 states. #> The final distribution is: 2654 Susceptible, 383 Exposed, 1389 Infected, 87607 Removed, and 7967 Deceased. plot(model_seird, main = \"SEIRD Model\")"},{"path":"/reference/ModelSEIRDCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"SEIRD connected model implements model agents connected. equivalent compartmental model (wiki).","code":""},{"path":"/reference/ModelSEIRDCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"","code":"ModelSEIRDCONN( name, n, prevalence, contact_rate, transmission_rate, incubation_days, recovery_rate, death_rate ) # S3 method for class 'epiworld_seirdconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRDCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"name String. Name virus. n Number individuals population. prevalence Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. incubation_days Numeric scalar greater 0. Average number incubation days. recovery_rate Numeric scalar 0 1. Probability recovery_rate. death_rate Numeric scalar 0 1. Probability death. x Object class SEIRCONN. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRDCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"ModelSEIRDCONNfunction returns model class epiworld_model. plot function returns plot SEIRDCONN model class epiworld_model.","code":""},{"path":"/reference/ModelSEIRDCONN.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) Proportion exposed agents infected, (2) proportion non-infected agents already removed, (3) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSEIRDCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Removed Deceased model (SEIRD connected) — ModelSEIRDCONN","text":"","code":"# An example with COVID-19 model_seirdconn <- ModelSEIRDCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 2, incubation_days = 7, transmission_rate = 0.5, recovery_rate = 0.3, death_rate = 0.01 ) # Running and printing run(model_seirdconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirdconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed-Deceased (SEIRD) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 5 states. #> The final distribution is: 490 Susceptible, 2 Exposed, 1 Infected, 9280 Removed, and 227 Deceased. plot(model_seirdconn) # Adding the flu flu <- virus( \"Flu\", prob_infecting = .3, recovery_rate = 1 / 7, prob_death = 0.001, prevalence = 0.001, as_proportion = TRUE ) add_virus(model = model_seirdconn, virus = flu) #' # Running and printing run(model_seirdconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_seirdconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed-Deceased (SEIRD) (connected) #> It features 10000 agents, 2 virus(es), and 0 tool(s). #> The model has 5 states. #> The final distribution is: 449 Susceptible, 8 Exposed, 8 Infected, 9331 Removed, and 204 Deceased. plot(model_seirdconn)"},{"path":"/reference/ModelSEIRMixing.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"Susceptible Exposed Infected Removed model (SEIR) mixing","code":""},{"path":"/reference/ModelSEIRMixing.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"","code":"ModelSEIRMixing( name, n, prevalence, contact_rate, transmission_rate, incubation_days, recovery_rate, contact_matrix ) # S3 method for class 'epiworld_seirmixing' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSEIRMixing.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. incubation_days Numeric scalar. Average number days incubation period. recovery_rate Numeric scalar 0 1. Probability recovery. contact_matrix Matrix contact rates individuals. x Object class SIRCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSEIRMixing.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"ModelSEIRMixingfunction returns model class epiworld_model. plot function returns plot SEIRMixing model class epiworld_model.","code":""},{"path":"/reference/ModelSEIRMixing.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"contact_matrix matrix contact rates entities. matrix size n x n, n number entities. row-stochastic matrix, .e., sum row 1. initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSEIRMixing.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Exposed Infected Removed model (SEIR) with mixing — ModelSEIRMixing","text":"","code":"# Start off creating three entities. # Individuals will be distribured randomly between the three. e1 <- entity(\"Population 1\", 3e3, as_proportion = FALSE) e2 <- entity(\"Population 2\", 3e3, as_proportion = FALSE) e3 <- entity(\"Population 3\", 3e3, as_proportion = FALSE) # Row-stochastic matrix (rowsums 1) cmatrix <- c( c(0.9, 0.05, 0.05), c(0.1, 0.8, 0.1), c(0.1, 0.2, 0.7) ) |> matrix(byrow = TRUE, nrow = 3) N <- 9e3 flu_model <- ModelSEIRMixing( name = \"Flu\", n = N, prevalence = 1 / N, contact_rate = 20, transmission_rate = 0.1, recovery_rate = 1 / 7, incubation_days = 7, contact_matrix = cmatrix ) # Adding the entities to the model flu_model |> add_entity(e1) |> add_entity(e2) |> add_entity(e3) set.seed(331) run(flu_model, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(flu_model) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) with Mixing #> Population size : 9000 #> Agents' data : (none) #> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 126.00ms #> Last run speed : 7.10 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - Flu #> #> Tool(s): #> (none) #> #> Model parameters: #> - Avg. Incubation days : 7.0000 #> - Contact rate : 20.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 8999 -> 137 #> - (1) Exposed : 1 -> 35 #> - (2) Infected : 0 -> 139 #> - (3) Recovered : 0 -> 8689 #> #> Transition Probabilities: #> - Susceptible 0.96 0.04 0.00 0.00 #> - Exposed 0.00 0.84 0.16 0.00 #> - Infected 0.00 0.00 0.86 0.14 #> - Recovered 0.00 0.00 0.00 1.00 #> plot_incidence(flu_model)"},{"path":"/reference/ModelSIR.html","id":null,"dir":"Reference","previous_headings":"","what":"SIR model — ModelSIR","title":"SIR model — ModelSIR","text":"SIR model","code":""},{"path":"/reference/ModelSIR.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIR model — ModelSIR","text":"","code":"ModelSIR(name, prevalence, transmission_rate, recovery_rate) # S3 method for class 'epiworld_sir' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIR.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIR model — ModelSIR","text":"name String. Name virus prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. x Object class SIR. main Title plot ... Additional arguments passed graphics::plot.","code":""},{"path":"/reference/ModelSIR.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIR model — ModelSIR","text":"ModelSIR function returns model class epiworld_model. plot function returns plot SIR model class epiworld_model.","code":""},{"path":"/reference/ModelSIR.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"SIR model — ModelSIR","text":"initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSIR.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIR model — ModelSIR","text":"","code":"model_sir <- ModelSIR(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1) # Adding a small world population agents_smallworld( model_sir, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sir, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sir #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered (SIR) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 0 Susceptible, 3 Infected, and 997 Recovered. # Plotting plot(model_sir)"},{"path":"/reference/ModelSIRCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"Susceptible Infected Removed model (SIR connected)","code":""},{"path":"/reference/ModelSIRCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"","code":"ModelSIRCONN( name, n, prevalence, contact_rate, transmission_rate, recovery_rate ) # S3 method for class 'epiworld_sirconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. recovery_rate Numeric scalar 0 1. Probability recovery. x Object class SIRCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSIRCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"ModelSIRCONNfunction returns model class epiworld_model. plot function returns plot SIRCONN model class epiworld_model.","code":""},{"path":"/reference/ModelSIRCONN.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSIRCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Infected Removed model (SIR connected) — ModelSIRCONN","text":"","code":"model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Running and printing run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sirconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 2012 Susceptible, 0 Infected, and 7988 Recovered. plot(model_sirconn, main = \"SIRCONN Model\")"},{"path":"/reference/ModelSIRD.html","id":null,"dir":"Reference","previous_headings":"","what":"SIRD model — ModelSIRD","title":"SIRD model — ModelSIRD","text":"SIRD model","code":""},{"path":"/reference/ModelSIRD.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIRD model — ModelSIRD","text":"","code":"ModelSIRD(name, prevalence, transmission_rate, recovery_rate, death_rate) # S3 method for class 'epiworld_sird' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRD.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIRD model — ModelSIRD","text":"name String. Name virus prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery_rate virus. death_rate Numeric scalar 0 1. Rate death virus. x Object class SIR. main Title plot ... Additional arguments passed graphics::plot.","code":""},{"path":"/reference/ModelSIRD.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIRD model — ModelSIRD","text":"ModelSIRD function returns model class epiworld_model. plot function returns plot SIRD model class epiworld_model.","code":""},{"path":"/reference/ModelSIRD.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"SIRD model — ModelSIRD","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) proportion non-infected agents already removed, (2) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSIRD.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIRD model — ModelSIRD","text":"","code":"model_sird <- ModelSIRD( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, death_rate = 0.01 ) # Adding a small world population agents_smallworld( model_sird, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sird, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sird #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered-Deceased (SIRD) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 0 Susceptible, 0 Infected, 913 Recovered, and 87 Deceased. # Plotting plot(model_sird)"},{"path":"/reference/ModelSIRDCONN.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"Susceptible Infected Removed Deceased model (SIRD connected)","code":""},{"path":"/reference/ModelSIRDCONN.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"","code":"ModelSIRDCONN( name, n, prevalence, contact_rate, transmission_rate, recovery_rate, death_rate ) # S3 method for class 'epiworld_sirdconn' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRDCONN.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. recovery_rate Numeric scalar 0 1. Probability recovery. death_rate Numeric scalar 0 1. Probability death. x Object class SIRDCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSIRDCONN.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"ModelSIRDCONNfunction returns model class epiworld_model. plot function returns plot SIRDCONN model class epiworld_model.","code":""},{"path":"/reference/ModelSIRDCONN.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"initial_states function allows user set initial state model. user must provide vector proportions indicating following values: (1) proportion non-infected agents already removed, (2) proportion non-ifected agents already deceased.","code":""},{"path":[]},{"path":"/reference/ModelSIRDCONN.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Infected Removed Deceased model (SIRD connected) — ModelSIRDCONN","text":"","code":"model_sirdconn <- ModelSIRDCONN( name = \"COVID-19\", n = 100000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.5, death_rate = 0.1 ) # Running and printing run(model_sirdconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sirdconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed-Deceased (SIRD) (connected) #> It features 100000 agents, 1 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 3678 Susceptible, 0 Infected, 86905 Recovered, and 9417 Deceased. plot(model_sirdconn, main = \"SIRDCONN Model\")"},{"path":"/reference/ModelSIRLogit.html","id":null,"dir":"Reference","previous_headings":"","what":"SIR Logistic model — ModelSIRLogit","title":"SIR Logistic model — ModelSIRLogit","text":"SIR Logistic model","code":""},{"path":"/reference/ModelSIRLogit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIR Logistic model — ModelSIRLogit","text":"","code":"ModelSIRLogit( vname, data, coefs_infect, coefs_recover, coef_infect_cols, coef_recover_cols, prob_infection, recovery_rate, prevalence )"},{"path":"/reference/ModelSIRLogit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIR Logistic model — ModelSIRLogit","text":"vname Name virus. data numeric matrix n rows. coefs_infect Numeric vector. Coefficients associated infect. coefs_recover Numeric vector. Coefficients associated recover. coef_infect_cols Integer vector. Columns coeficient. coef_recover_cols Integer vector. Columns coeficient. prob_infection Numeric scalar. Baseline probability infection. recovery_rate Numeric scalar. Baseline probability recovery. prevalence Numeric scalar. Prevalence (initial state) proportion.","code":""},{"path":"/reference/ModelSIRLogit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIR Logistic model — ModelSIRLogit","text":"ModelSIRLogit function returns model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSIRLogit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIR Logistic model — ModelSIRLogit","text":"","code":"set.seed(2223) n <- 100000 # Creating the data to use for the \"ModelSIRLogit\" function. It contains # information on the sex of each agent and will be used to determine # differences in disease progression between males and females. Note that # the number of rows in these data are identical to n (100000). X <- cbind( Intercept = 1, Female = sample.int(2, n, replace = TRUE) - 1 ) # Declare coefficients for each sex regarding transmission_rate and recovery. coef_infect <- c(.1, -2, 2) coef_recover <- rnorm(2) # Feed all above information into the \"ModelSIRLogit\" function. model_logit <- ModelSIRLogit( \"covid2\", data = X, coefs_infect = coef_infect, coefs_recover = coef_recover, coef_infect_cols = 1L:ncol(X), coef_recover_cols = 1L:ncol(X), prob_infection = .8, recovery_rate = .3, prevalence = .01 ) agents_smallworld(model_logit, n, 8, FALSE, .01) run(model_logit, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(model_logit) # Females are supposed to be more likely to become infected. rn <- get_reproductive_number(model_logit) # Probability of infection for males and females. (table( X[, \"Female\"], (1:n %in% rn$source) ) |> prop.table())[, 2] #> 0 1 #> 0.13466 0.14878 # Looking into the individual agents. get_agents(model_logit) #> Agents from the model \"Susceptible-Infected-Removed (SIR) (logit)\": #> Agent: 0, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 1, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 2, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 3, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 4, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 5, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 6, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 7, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 8, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> Agent: 9, state: Susceptible (0), Has virus: no, NTools: 0i NNeigh: 8 #> ... 99990 more agents ..."},{"path":"/reference/ModelSIRMixing.html","id":null,"dir":"Reference","previous_headings":"","what":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"Susceptible Infected Removed model (SIR) mixing","code":""},{"path":"/reference/ModelSIRMixing.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"","code":"ModelSIRMixing( name, n, prevalence, contact_rate, transmission_rate, recovery_rate, contact_matrix ) # S3 method for class 'epiworld_sirmixing' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIRMixing.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"name String. Name virus n Number individuals population. prevalence Double. Initial proportion individuals virus. contact_rate Numeric scalar. Average number contacts per step. transmission_rate Numeric scalar 0 1. Probability transmission. recovery_rate Numeric scalar 0 1. Probability recovery. contact_matrix Matrix contact rates individuals. x Object class SIRCONN. main Title plot ... Currently ignore.","code":""},{"path":"/reference/ModelSIRMixing.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"ModelSIRMixingfunction returns model class epiworld_model. plot function returns plot SIRMixing model class epiworld_model.","code":""},{"path":"/reference/ModelSIRMixing.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"contact_matrix matrix contact rates entities. matrix size n x n, n number entities. row-stochastic matrix, .e., sum row 1. initial_states function allows user set initial state model. particular, user can specify many non-infected agents removed beginning simulation.","code":""},{"path":[]},{"path":"/reference/ModelSIRMixing.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Susceptible Infected Removed model (SIR) with mixing — ModelSIRMixing","text":"","code":"# From the vignette # Start off creating three entities. # Individuals will be distribured randomly between the three. e1 <- entity(\"Population 1\", 3e3, as_proportion = FALSE) e2 <- entity(\"Population 2\", 3e3, as_proportion = FALSE) e3 <- entity(\"Population 3\", 3e3, as_proportion = FALSE) # Row-stochastic matrix (rowsums 1) cmatrix <- c( c(0.9, 0.05, 0.05), c(0.1, 0.8, 0.1), c(0.1, 0.2, 0.7) ) |> matrix(byrow = TRUE, nrow = 3) N <- 9e3 flu_model <- ModelSIRMixing( name = \"Flu\", n = N, prevalence = 1 / N, contact_rate = 20, transmission_rate = 0.1, recovery_rate = 1 / 7, contact_matrix = cmatrix ) # Adding the entities to the model flu_model |> add_entity(e1) |> add_entity(e2) |> add_entity(e3) set.seed(331) run(flu_model, ndays = 100) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(flu_model) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) with Mixing #> Population size : 9000 #> Agents' data : (none) #> Number of entities : 3 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 67.00ms #> Last run speed : 13.36 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - Flu #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 20.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 8999 -> 134 #> - (1) Infected : 1 -> 0 #> - (2) Recovered : 0 -> 8866 #> #> Transition Probabilities: #> - Susceptible 0.96 0.04 0.00 #> - Infected 0.00 0.87 0.13 #> - Recovered 0.00 0.00 1.00 #> plot_incidence(flu_model)"},{"path":"/reference/ModelSIS.html","id":null,"dir":"Reference","previous_headings":"","what":"SIS model — ModelSIS","title":"SIS model — ModelSIS","text":"Susceptible-Infected-Susceptible model (SIS) (wiki)","code":""},{"path":"/reference/ModelSIS.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SIS model — ModelSIS","text":"","code":"ModelSIS(name, prevalence, transmission_rate, recovery_rate) # S3 method for class 'epiworld_sis' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSIS.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SIS model — ModelSIS","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery virus. x Object class SIS. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSIS.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SIS model — ModelSIS","text":"ModelSIS function returns model class epiworld_model. plot function returns plot SIS model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSIS.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SIS model — ModelSIS","text":"","code":"model_sis <- ModelSIS(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1) # Adding a small world population agents_smallworld( model_sis, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sis, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sis #> ________________________________________________________________________________ #> Susceptible-Infected-Susceptible (SIS) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 2 states. #> The final distribution is: 99 Susceptible, and 901 Infected. # Plotting plot(model_sis, main = \"SIS Model\")"},{"path":"/reference/ModelSISD.html","id":null,"dir":"Reference","previous_headings":"","what":"SISD model — ModelSISD","title":"SISD model — ModelSISD","text":"Susceptible-Infected-Susceptible-Deceased model (SISD) (wiki)","code":""},{"path":"/reference/ModelSISD.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SISD model — ModelSISD","text":"","code":"ModelSISD(name, prevalence, transmission_rate, recovery_rate, death_rate) # S3 method for class 'epiworld_sisd' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSISD.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SISD model — ModelSISD","text":"name String. Name virus. prevalence Double. Initial proportion individuals virus. transmission_rate Numeric scalar 0 1. Virus's rate infection. recovery_rate Numeric scalar 0 1. Rate recovery virus. death_rate Numeric scalar 0 1. Rate death virus. x Object class SISD. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSISD.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SISD model — ModelSISD","text":"ModelSISD function returns model class epiworld_model. plot function returns plot SISD model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSISD.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SISD model — ModelSISD","text":"","code":"model_sisd <- ModelSISD( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1, death_rate = 0.01 ) # Adding a small world population agents_smallworld( model_sisd, n = 1000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_sisd, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sisd #> ________________________________________________________________________________ #> Susceptible-Infected-Susceptible-Deceased (SISD) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 94 Susceptible, 441 Infected, and 465 Deceased. # Plotting plot(model_sisd, main = \"SISD Model\")"},{"path":"/reference/ModelSURV.html","id":null,"dir":"Reference","previous_headings":"","what":"SURV model — ModelSURV","title":"SURV model — ModelSURV","text":"SURV model","code":""},{"path":"/reference/ModelSURV.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SURV model — ModelSURV","text":"","code":"ModelSURV( name, prevalence, efficacy_vax, latent_period, infect_period, prob_symptoms, prop_vaccinated, prop_vax_redux_transm, prop_vax_redux_infect, surveillance_prob, transmission_rate, prob_death, prob_noreinfect ) # S3 method for class 'epiworld_surv' plot(x, main = get_name(x), ...)"},{"path":"/reference/ModelSURV.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SURV model — ModelSURV","text":"name String. Name virus. prevalence Initial number individuals virus. efficacy_vax Double. Efficacy vaccine. (1 - P(acquire disease)). latent_period Double. Shape parameter 'Gamma(latent_period, 1)' distribution. coincides expected number latent days. infect_period Double. Shape parameter 'Gamma(infected_period, 1)' distribution. coincides expected number infectious days. prob_symptoms Double. Probability generating symptoms. prop_vaccinated Double. Probability vaccination. Coincides initial prevalence vaccinated individuals. prop_vax_redux_transm Double. Factor vaccine reduces transmissibility. prop_vax_redux_infect Double. Factor vaccine reduces chances becoming infected. surveillance_prob Double. Probability testing agent. transmission_rate Double. Raw transmission probability. prob_death Double. Raw probability death symptomatic individuals. prob_noreinfect Double. Probability re-infection. x Object class SURV. main Title plot. ... Currently ignore.","code":""},{"path":"/reference/ModelSURV.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SURV model — ModelSURV","text":"ModelSURVfunction returns model class epiworld_model. plot function returns plot SURV model class epiworld_model.","code":""},{"path":[]},{"path":"/reference/ModelSURV.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"SURV model — ModelSURV","text":"","code":"model_surv <- ModelSURV( name = \"COVID-19\", prevalence = 20, efficacy_vax = 0.6, latent_period = 4, infect_period = 5, prob_symptoms = 0.5, prop_vaccinated = 0.7, prop_vax_redux_transm = 0.8, prop_vax_redux_infect = 0.95, surveillance_prob = 0.1, transmission_rate = 0.2, prob_death = 0.001, prob_noreinfect = 0.5 ) # Adding a small world population agents_smallworld( model_surv, n = 10000, k = 5, d = FALSE, p = .01 ) # Running and printing run(model_surv, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_surv #> ________________________________________________________________________________ #> Surveillance #> It features 10000 agents, 1 virus(es), and 1 tool(s). #> The model has 8 states. #> The final distribution is: 9974 Susceptible, 0 Latent, 0 Symptomatic, 0 Symptomatic isolated, 0 Asymptomatic, 0 Asymptomatic isolated, 26 Recovered, and 0 Removed. # Plotting plot(model_surv, main = \"SURV Model\")"},{"path":"/reference/agents.html","id":null,"dir":"Reference","previous_headings":"","what":"Agents in epiworldR — agents","title":"Agents in epiworldR — agents","text":"functions provide read-access agents model. get_agents function returns object class epiworld_agents contains information agents model. get_agent function returns information single agent. get_state function returns state single agent.","code":""},{"path":"/reference/agents.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Agents in epiworldR — agents","text":"","code":"get_agents(model, ...) # S3 method for class 'epiworld_model' get_agents(model, ...) # S3 method for class 'epiworld_agents' x[i] # S3 method for class 'epiworld_agent' print(x, compressed = FALSE, ...) # S3 method for class 'epiworld_agents' print(x, compressed = TRUE, max_print = 10, ...) get_state(x)"},{"path":"/reference/agents.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Agents in epiworldR — agents","text":"model object class epiworld_model. ... Ignored x object class epiworld_agents Index (id) agent (0 n-1) compressed Logical scalar. FALSE, prints detailed information agent. max_print Integer scalar. Maximum number agents print.","code":""},{"path":"/reference/agents.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Agents in epiworldR — agents","text":"get_agents function returns object class epiworld_agents. [ method returns object class epiworld_agent. print function returns information individual agent class epiworld_agent. get_state function returns state epiworld_agents object.","code":""},{"path":[]},{"path":"/reference/agents.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Agents in epiworldR — agents","text":"","code":"model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. x <- get_agents(model_sirconn) # Storing all agent information into object of # class epiworld_agents print(x, compressed = FALSE, max_print = 5) # Displaying detailed information of #> Agents from the model \"Susceptible-Infected-Removed (SIR) (connected)\": #> Information about agent id 0 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 1 #> State : Recovered (2) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 2 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 3 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> Information about agent id 4 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 #> ... 9995 more agents ... # the first 5 agents using # compressed=F. Using compressed=T # results in less-detailed # information about each agent. x[0] # Print information about the first agent. Substitute the agent of #> Information about agent id 0 #> State : Susceptible (0) #> Has virus : no #> Tool count : 0 #> Neigh. count : 0 # interest's position where '0' is."},{"path":"/reference/agents_smallworld.html","id":null,"dir":"Reference","previous_headings":"","what":"Load agents to a model — agents_smallworld","title":"Load agents to a model — agents_smallworld","text":"functions provide access network model. network represented edgelist. agents_smallworld function generates small world network Watts-Strogatz algorithm. agents_from_edgelist function loads network edgelist. get_network function returns edgelist network.","code":""},{"path":"/reference/agents_smallworld.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Load agents to a model — agents_smallworld","text":"","code":"agents_smallworld(model, n, k, d, p) agents_from_edgelist(model, source, target, size, directed) get_network(model) get_agents_states(model) add_virus_agent(agent, model, virus, state_new = -99, queue = -99) add_tool_agent(agent, model, tool, state_new = -99, queue = -99) has_virus(agent, virus) has_tool(agent, tool) change_state(agent, model, state_new, queue = -99) get_agents_tools(model)"},{"path":"/reference/agents_smallworld.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Load agents to a model — agents_smallworld","text":"model Model object class epiworld_model. n, size Number individuals population. k Number ties small world network. d, directed Logical scalar. Whether graph directed . p Probability rewiring. source, target Integer vectors describing source target edgelist. agent Agent object class epiworld_agent. virus Virus object class epiworld_virus. state_new Integer scalar. New state agent action executed. queue Integer scalar. Change queuing system action executed. tool Tool object class epiworld_tool.","code":""},{"path":"/reference/agents_smallworld.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Load agents to a model — agents_smallworld","text":"'agents_smallworld' function returns model agents loaded. agents_from_edgelist function returns empty model class epiworld_model. get_network function returns data frame two columns (source target) describing edgelist network. get_agents_states returns character vector states agents end simulation. function add_virus_agent adds virus agent returns agent invisibly. function add_tool_agent adds tool agent returns agent invisibly. functions has_virus has_tool return logical scalar indicating whether agent virus/tool . get_agents_tools returns list class epiworld_agents_tools epiworld_tools (list lists).","code":""},{"path":"/reference/agents_smallworld.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Load agents to a model — agents_smallworld","text":"new_state queue parameters optional. provided, agent updated default values virus/tool.","code":""},{"path":"/reference/agents_smallworld.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Load agents to a model — agents_smallworld","text":"","code":"# Initializing SIR model with agents_smallworld sir <- ModelSIR(name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1) agents_smallworld( sir, n = 1000, k = 5, d = FALSE, p = .01 ) run(sir, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. sir #> ________________________________________________________________________________ #> Susceptible-Infected-Recovered (SIR) #> It features 1000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 0 Susceptible, 3 Infected, and 997 Recovered. # We can also retrieve the network net <- get_network(sir) head(net) #> from to #> 1 0 1 #> 2 0 2 #> 3 0 998 #> 4 0 999 #> 5 1 2 #> 6 1 3 # Simulating a bernoulli graph set.seed(333) n <- 1000 g <- matrix(runif(n^2) < .01, nrow = n) diag(g) <- FALSE el <- which(g, arr.ind = TRUE) - 1L # Generating an empty model sir <- ModelSIR(\"COVID-19\", .01, .8, .3) agents_from_edgelist( sir, source = el[, 1], target = el[, 2], size = n, directed = TRUE ) # Running the simulation run(sir, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(sir)"},{"path":"/reference/entities.html","id":null,"dir":"Reference","previous_headings":"","what":"Get entities — entities","title":"Get entities — entities","text":"Entities epiworld objects can contain agents.","code":""},{"path":"/reference/entities.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get entities — entities","text":"","code":"get_entities(model) # S3 method for class 'epiworld_entities' x[i] entity(name, prevalence, as_proportion, to_unassigned = TRUE) get_entity_size(entity) get_entity_name(entity) entity_add_agent(entity, agent, model = attr(entity, \"model\")) rm_entity(model, id) add_entity(model, entity) load_agents_entities_ties(model, agents_id, entities_id) entity_get_agents(entity) distribute_entity_randomly(prevalence, as_proportion, to_unassigned = TRUE) distribute_entity_to_set(agents_ids) set_distribution_entity(entity, distfun)"},{"path":"/reference/entities.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get entities — entities","text":"model Model object class epiworld_model. x Object class epiworld_entities. Integer index. name Character scalar. Name entity. prevalence Numeric scalar. Prevalence entity. as_proportion Logical scalar. TRUE, prevalence interpreted proportion. to_unassigned Logical scalar. TRUE, entity added unassigned pool. entity Entity object class epiworld_entity. agent Agent object class epiworld_agent. id Integer scalar. Entity id remove (starting zero). agents_id Integer vector. entities_id Integer vector. agents_ids Integer vector. Ids agents distribute. distfun Distribution function object class epiworld_distribution_entity.","code":""},{"path":"/reference/entities.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get entities — entities","text":"function entity creates entity object. function get_entity_size returns number agents entity. function get_entity_name returns name entity. function entity_add_agent adds agent entity. function rm_entity removes entity model. function load_agents_entities_ties loads agents entities. function entity_get_agents returns integer vector agents entity (ids).","code":""},{"path":"/reference/entities.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get entities — entities","text":"Epiworld entities especially useful mixing models, particularly ModelSIRMixing ModelSEIRMixing.","code":""},{"path":"/reference/entities.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get entities — entities","text":"","code":"# Creating a mixing model mymodel <- ModelSIRMixing( name = \"My model\", n = 10000, prevalence = .001, contact_rate = 10, transmission_rate = .1, recovery_rate = 1 / 7, contact_matrix = matrix(c(.9, .1, .1, .9), 2, 2) ) ent1 <- entity(\"First\", 5000, FALSE) ent2 <- entity(\"Second\", 5000, FALSE) mymodel |> add_entity(ent1) |> add_entity(ent2) run(mymodel, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. summary(mymodel) #> ________________________________________________________________________________ #> ________________________________________________________________________________ #> SIMULATION STUDY #> #> Name of the model : Susceptible-Infected-Removed (SIR) with Mixing #> Population size : 10000 #> Agents' data : (none) #> Number of entities : 2 #> Days (duration) : 100 (of 100) #> Number of viruses : 1 #> Last run elapsed t : 66.00ms #> Last run speed : 15.11 million agents x day / second #> Rewiring : off #> #> Global events: #> - Update infected individuals (runs daily) #> #> Virus(es): #> - My model #> #> Tool(s): #> (none) #> #> Model parameters: #> - Contact rate : 10.0000 #> - Prob. Recovery : 0.1429 #> - Prob. Transmission : 0.1000 #> #> Distribution of the population at time 100: #> - (0) Susceptible : 9990 -> 376 #> - (1) Infected : 10 -> 1 #> - (2) Recovered : 0 -> 9623 #> #> Transition Probabilities: #> - Susceptible 0.97 0.03 0.00 #> - Infected 0.00 0.86 0.14 #> - Recovered 0.00 0.00 1.00 #>"},{"path":"/reference/epiworld-data.html","id":null,"dir":"Reference","previous_headings":"","what":"Accessing the database of epiworld — epiworld-data","title":"Accessing the database of epiworld — epiworld-data","text":"Models epiworld stored database. database can accessed using functions described manual page. elements database : transition matrix, incidence matrix, reproductive number, generation time, daily incidence virus tool level.","code":""},{"path":"/reference/epiworld-data.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Accessing the database of epiworld — epiworld-data","text":"","code":"get_hist_total(x) get_today_total(x) get_hist_virus(x) get_hist_tool(x) get_transition_probability(x) get_reproductive_number(x) # S3 method for class 'epiworld_repnum' plot( x, y = NULL, ylab = \"Average Rep. Number\", xlab = \"Day (step)\", main = \"Reproductive Number\", type = \"b\", plot = TRUE, ... ) plot_reproductive_number(x, ...) get_hist_transition_matrix(x, skip_zeros = FALSE) # S3 method for class 'epiworld_hist_transition' as.array(x, ...) plot_incidence(x, ...) # S3 method for class 'epiworld_hist_transition' plot( x, type = \"b\", xlab = \"Day (step)\", ylab = \"Counts\", main = \"Daily incidence\", plot = TRUE, ... ) get_transmissions(x) get_generation_time(x) # S3 method for class 'epiworld_generation_time' plot( x, type = \"b\", xlab = \"Day (step)\", ylab = \"Avg. Generation Time\", main = \"Generation Time\", plot = TRUE, ... ) plot_generation_time(x, ...)"},{"path":"/reference/epiworld-data.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Accessing the database of epiworld — epiworld-data","text":"x object class epiworld_sir, epiworld_seir, etc. model. y Ignored. ylab, xlab, main, type parameters passed graphics::plot() plot Logical scalar. TRUE (default), function desired statistic. ... case plot methods, arguments passed graphics::plot. skip_zeros Logical scalar. FALSE return entries transition matrix.","code":""},{"path":"/reference/epiworld-data.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Accessing the database of epiworld — epiworld-data","text":"get_hist_total function returns object class epiworld_hist_total. get_today_total function returns named vector total number individuals state end simulation. get_hist_virus function returns object class epiworld_hist_virus. get_hist_tool function returns object epiworld_hist_virus. get_transition_probability function returns object class matrix. get_reproductive_number function returns object class epiworld_repnum. plot function returns plot reproductive number time. get_hist_transition_matrix returns data.frame four columns: \"state_from\", \"state_to\", \"date\", \"counts.\" .array method epiworld_hist_transition objects turns data.frame returned get_hist_transition_matrix array nstates x nstates x (ndays + 1) entries, first entry initial state. plot_incidence function returns plot originating object get_hist_transition_matrix. plot function returns plot originates epiworld_hist_transition object. function get_transmissions returns data.frame following columns: date, source, target, virus_id, virus, source_exposure_date. function get_generation_time returns data.frame following columns: \"agent\", \"virus_id\", \"virus\", \"date\", \"gentime\". function plot_generation_time wrapper plot get_generation_time.","code":""},{"path":"/reference/epiworld-data.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Accessing the database of epiworld — epiworld-data","text":"plot_reproductive_number function wrapper around get_reproductive_number plots result. plot_incidence function wrapper get_hist_transition_matrix plot method. plot method epiworld_hist_transition class plots daily incidence state. function returns data frame used plotting.","code":""},{"path":[]},{"path":"/reference/epiworld-data.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Accessing the database of epiworld — epiworld-data","text":"","code":"# SEIR Connected seirconn <- ModelSEIRCONN( name = \"Disease\", n = 10000, prevalence = 0.1, contact_rate = 2.0, transmission_rate = 0.8, incubation_days = 7.0, recovery_rate = 0.3 ) # Running the simulation for 50 steps (days) set.seed(937) run(seirconn, 50) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. # Retrieving the transition probability get_transition_probability(seirconn) #> Susceptible Exposed Infected Recovered #> Susceptible 0.9028099 0.09719012 0.0000000 0.0000000 #> Exposed 0.0000000 0.85844742 0.1415526 0.0000000 #> Infected 0.0000000 0.00000000 0.7000978 0.2999022 #> Recovered 0.0000000 0.00000000 0.0000000 1.0000000 # Retrieving date, state, and counts dataframe including any added tools get_hist_tool(seirconn) #> [1] date tool_id tool state counts #> <0 rows> (or 0-length row.names) # Retrieving overall date, state, and counts dataframe head(get_hist_total(seirconn)) #> date state counts #> 1 0 Susceptible 9000 #> 2 0 Exposed 1000 #> 3 0 Infected 0 #> 4 0 Recovered 0 #> 5 1 Susceptible 9000 #> 6 1 Exposed 861 # Retrieving date, state, and counts dataframe by variant head(get_hist_virus(seirconn)) #> date virus_id virus state counts #> 1 0 0 Disease Susceptible 0 #> 2 0 0 Disease Exposed 1000 #> 3 0 0 Disease Infected 0 #> 4 0 0 Disease Recovered 0 #> 5 1 0 Disease Susceptible 0 #> 6 1 0 Disease Exposed 861 # Retrieving (and plotting) the reproductive number rp <- get_reproductive_number(seirconn) plot(rp) # Also equivalent to plot_reproductive_number(seirconn) # We can go further and get all the history t_hist <- get_hist_transition_matrix(seirconn) head(t_hist) #> state_from state_to date counts #> 1 Susceptible Susceptible 0 9000 #> 2 Exposed Susceptible 0 0 #> 3 Infected Susceptible 0 0 #> 4 Recovered Susceptible 0 0 #> 5 Susceptible Exposed 0 1000 #> 6 Exposed Exposed 0 0 # And turn it into an array as.array(t_hist)[, , 1:3] #> , , 0 #> #> Susceptible Exposed Infected Recovered #> Susceptible 9000 1000 0 0 #> Exposed 0 0 0 0 #> Infected 0 0 0 0 #> Recovered 0 0 0 0 #> #> , , 1 #> #> Susceptible Exposed Infected Recovered #> Susceptible 9000 0 0 0 #> Exposed 0 861 139 0 #> Infected 0 0 0 0 #> Recovered 0 0 0 0 #> #> , , 2 #> #> Susceptible Exposed Infected Recovered #> Susceptible 8822 178 0 0 #> Exposed 0 737 124 0 #> Infected 0 0 92 47 #> Recovered 0 0 0 0 #> # We cam also get (and plot) the incidence, as well as # the generation time inci <- plot_incidence(seirconn) gent <- plot_generation_time(seirconn)"},{"path":"/reference/epiworld-methods.html","id":null,"dir":"Reference","previous_headings":"","what":"Methods for epiworldR objects — epiworld-methods","title":"Methods for epiworldR objects — epiworld-methods","text":"functions described section methods objects class epiworld_model. Besides printing plotting, methods provide access manipulate model parameters, getting information model running simulation.","code":""},{"path":"/reference/epiworld-methods.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Methods for epiworldR objects — epiworld-methods","text":"","code":"queuing_on(x) queuing_off(x) verbose_off(x) verbose_on(x) run(model, ndays, seed = NULL) # S3 method for class 'epiworld_model' summary(object, ...) get_states(x) get_param(x, pname) add_param(x, pname, pval) # S3 method for class 'epiworld_model' add_param(x, pname, pval) set_param(x, pname, pval) set_name(x, mname) get_name(x) get_n_viruses(x) get_n_tools(x) get_ndays(x) today(x) get_n_replicates(x) size(x) set_agents_data(model, data) get_agents_data_ncols(model) get_virus(model, virus_pos) get_tool(model, tool_pos) initial_states(model, proportions) clone_model(model)"},{"path":"/reference/epiworld-methods.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Methods for epiworldR objects — epiworld-methods","text":"x object class epiworld_model. model Model object. ndays Number days (steps) simulation. seed Seed set initializing random number generator (passed set.seed()). object Object class epiworld_model. ... Additional arguments. pname String. Name parameter. pval Numeric. Value parameter. mname String. Name model. data numeric matrix. virus_pos Integer. Relative location (starting 0) virus model tool_pos Integer. Relative location (starting 0) tool model proportions Numeric vector. Proportions agents distributed (see details).","code":""},{"path":"/reference/epiworld-methods.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Methods for epiworldR objects — epiworld-methods","text":"verbose_on verbose_off functions return model, however verbose_off returns model progress bar. run function returns simulated model class epiworld_model. summary function prints detailed view model, returns model invisibly. get_states function returns unique states found model. get_param function returns selected parameter model object class epiworld_model. add_param returns model added parameter invisibly. set_param function return value instead alters parameter value. set_name function return value instead alters object epiworld_model. get_name returns name model. get_n_viruses returns number viruses model. get_n_tools returns number tools model. get_ndays returns number days model. today returns current model day get_n_replicates returns number replicates model. size.epiworld_model returns number agents model. 'set_agents_data' function returns object class DataFrame. 'get_agents_data_ncols' returns number columns model dataframe. 'get_virus' returns virus. get_tool returns tool. inital_states returns model updated initial state. clone_model returns copy model.","code":""},{"path":"/reference/epiworld-methods.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Methods for epiworldR objects — epiworld-methods","text":"verbose_on verbose_off functions activate deactivate printing progress screen, respectively. functions return model (x) invisibly. epiworld_model objects pointers underlying C++ class epiworld. generate copy model, use clone_model, otherwise, assignment operator copy pointer.","code":""},{"path":"/reference/epiworld-methods.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Methods for epiworldR objects — epiworld-methods","text":"","code":"model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Queuing - If you wish to implement the queuing function, declare whether # you would like it \"on\" or \"off\", if any. queuing_on(model_sirconn) #> Warning: SIR Connected models do not have queue. queuing_off(model_sirconn) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Verbose - \"on\" prints the progress bar on the screen while \"off\" # deactivates the progress bar. Declare which function you want to implement, # if any. verbose_on(model_sirconn) verbose_off(model_sirconn) run(model_sirconn, ndays = 100, seed = 1912) get_states(model_sirconn) # Returns all unique states found within the model. #> [1] \"Susceptible\" \"Infected\" \"Recovered\" get_param(model_sirconn, \"Contact rate\") # Returns the value of the selected #> [1] 5 # parameter within the model object. # In order to view the parameters, # run the model object and find the # \"Model parameters\" section. set_param(model_sirconn, \"Contact rate\", 2) # Allows for adjustment of model # parameters within the model # object. In this example, the # Contact rate parameter is # changed to 2. You can now rerun # the model to observe any # differences. set_name(model_sirconn, \"My Epi-Model\") # This function allows for setting # a name for the model. Running the # model object, the name of the model # is now reflected next to \"Name of # the model\". get_name(model_sirconn) # Returns the set name of the model. #> [1] \"My Epi-Model\" get_n_viruses(model_sirconn) # Returns the number of viruses in the model. #> [1] 1 # In this case, there is only one virus: # \"COVID-19\". get_n_tools(model_sirconn) # Returns the number of tools in the model. In #> [1] 0 # this case, there are zero tools. get_ndays(model_sirconn) # Returns the length of the simulation in days. This #> [1] 100 # will match \"ndays\" within the \"run\" function. today(model_sirconn) # Returns the current day of the simulation. This will #> [1] 100 # match \"get_ndays()\" if run at the end of a simulation, but will differ if run # during a simulation get_n_replicates(model_sirconn) # Returns the number of replicates of the #> [1] 2 # model. size(model_sirconn) # Returns the population size in the model. In this case, #> [1] 10000 # there are 10,000 agents in the model. # Set Agents Data # First, your data matrix must have the same number of rows as agents in the # model. Below is a generated matrix which will be passed into the # \"set_agents_data\" function. data <- matrix(data = runif(20000, min = 0, max = 100), nrow = 10000, ncol = 2) set_agents_data(model_sirconn, data) get_agents_data_ncols(model_sirconn) # Returns number of columns #> [1] 2 get_virus(model_sirconn, 0) # Returns information about the first virus in #> Virus : COVID-19 #> Id : 0 #> state_init : 1 #> state_post : 2 #> state_removed : 2 #> queue_init : 2 #> queue_post : -2 #> queue_removed : -99 # the model (index begins at 0). add_tool(model_sirconn, tool(\"Vaccine\", .9, .9, .5, 1, prevalence = 0.5, as_prop = TRUE)) get_tool(model_sirconn, 0) # Returns information about the first tool in the #> Tool : Vaccine #> Id : 0 #> state_init : -99 #> state_post : -99 #> queue_init : 0 #> queue_post : 0 # model. In this case, there are no tools so an # error message will occur."},{"path":"/reference/epiworldR-deprecated.html","id":null,"dir":"Reference","previous_headings":"","what":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","title":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","text":"Starting version 0.0-4, epiworld changed refered \"actions.\" Following traditional ABMs, actions now called \"events.\"","code":""},{"path":"/reference/epiworldR-deprecated.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","text":"","code":"add_tool_n(model, tool, n) add_virus_n(model, virus, n) globalaction_tool(...) globalaction_tool_logit(...) globalaction_set_params(...) globalaction_fun(...)"},{"path":"/reference/epiworldR-deprecated.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Deprecated and removed functions in epiworldR — epiworldR-deprecated","text":"model Model object class epiworld_model. tool Tool object class epiworld_tool. n Deprecated. virus Virus object class epiworld_virus. ... Arguments passed new function.","code":""},{"path":"/reference/epiworldR-package.html","id":null,"dir":"Reference","previous_headings":"","what":"epiworldR — epiworldR-package","title":"epiworldR — epiworldR-package","text":"flexible framework Agent-Based Models (ABM), 'epiworldR' package provides methods prototyping disease outbreaks transmission models using 'C++' backend, making fast. supports multiple epidemiological models, including Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), Susceptible-Exposed-Infected-Removed (SEIR), others, involving arbitrary mitigation policies multiple-disease models. Users can specify infectiousness/susceptibility rates function agents' features, providing great complexity model dynamics. Furthermore, 'epiworldR' ideal simulation studies featuring large populations.","code":""},{"path":[]},{"path":"/reference/epiworldR-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"epiworldR — epiworldR-package","text":"Maintainer: George Vega Yon g.vegayon@gmail.com (ORCID) Authors: Derek Meyer derekmeyer37@gmail.com (ORCID) contributors: Susan Holmes (ORCID) (JOSS reviewer) [reviewer] Abinash Satapathy (ORCID) (JOSS reviewer) [reviewer] Carinogurjao [reviewer] Centers Disease Control Prevention (Award number 1U01CK000585; 75D30121F00003) [funder]","code":""},{"path":"/reference/global-events.html","id":null,"dir":"Reference","previous_headings":"","what":"Global Events — global-events","title":"Global Events — global-events","text":"Global events functions executed time step simulation. useful implementing interventions, vaccination, isolation, social distancing means tools.","code":""},{"path":"/reference/global-events.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Global Events — global-events","text":"","code":"globalevent_tool(tool, prob, name = get_name_tool(tool), day = -99) globalevent_tool_logit( tool, vars, coefs, name = get_name_tool(tool), day = -99 ) globalevent_set_params( param, value, name = paste0(\"Set \", param, \" to \", value), day = -99 ) globalevent_fun(fun, name = deparse(substitute(fun)), day = -99) add_globalevent(model, event, action = NULL) rm_globalevent(model, event)"},{"path":"/reference/global-events.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Global Events — global-events","text":"tool object class tool. prob Numeric scalar. probability 0 1. name Character scalar. name action. day Integer. day (step) action executed (see details). vars Integer vector. position variables model. coefs Numeric vector. coefficients logistic regression. param Character scalar. name parameter set. value Numeric scalar. value parameter. fun Function. function executed. model object class epiworld_model. event event added removed. add, object class epiworld_globalevent. remove, integer position event model (starting zero). action (Deprecated) use event instead.","code":""},{"path":"/reference/global-events.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Global Events — global-events","text":"globalevent_set_params function returns object class epiworld_globalevent_set_param epiworld_globalevent. globalevent_tool returns object class epiworld_globalevent_tool epiworld_globalevent. globalevent_tool_logit returns object class epiworld_globalevent_tool_logit epiworld_globalevent. function add_globalevent returns model added event function rm_globalevent returns model removed event.","code":""},{"path":"/reference/global-events.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Global Events — global-events","text":"function globalevent_tool_logit allows specify logistic regression model probability using tool. model specified vector coefficients coefs vector variables vars. vars integer vector indicating position variables model. function globalevent_set_param allows set parameter model. parameter specified name param value value. function globalevent_fun allows specify function executed given day. function object must receive object class epiworld_model argument. function add_globalevent adds global action model. model checks actions executed time step. added action matches current time step, action executed. day negative, action executed time step. day positive, action executed specified time step.","code":""},{"path":[]},{"path":"/reference/global-events.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Global Events — global-events","text":"","code":"# Simple model model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Creating a tool epitool <- tool( name = \"Vaccine\", prevalence = 0, as_proportion = FALSE, susceptibility_reduction = .9, transmission_reduction = .5, recovery_enhancer = .5, death_reduction = .9 ) # Adding a global event vaccine_day_20 <- globalevent_tool(epitool, .2, day = 20) add_globalevent(model_sirconn, vaccine_day_20) # Running and printing run(model_sirconn, ndays = 40, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. model_sirconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 1 tool(s). #> The model has 3 states. #> The final distribution is: 2012 Susceptible, 0 Infected, and 7988 Recovered. plot_incidence(model_sirconn) # Example 2: Changing the contact rate ------------------------------------- model_sirconn2 <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) closure_day_10 <- globalevent_set_params(\"Contact rate\", 0, day = 10) add_globalevent(model_sirconn2, closure_day_10) # Running and printing run(model_sirconn2, ndays = 40, seed = 1912) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. model_sirconn2 #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 0 tool(s). #> The model has 3 states. #> The final distribution is: 2083 Susceptible, 0 Infected, and 7917 Recovered. plot_incidence(model_sirconn2) # Example using `globalevent_fun` to record the state of the # agents at each time step. # We start by creating an SIR connected model model <- ModelSIRCONN( name = \"SIR with Global Saver\", n = 1000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.3 ) # We create the object where the history of the agents will be stored agents_history <- NULL # This function prints the total number of agents in each state # and stores the history of the agents in the object `agents_history` hist_saver <- function(m) { message(\"Today's totals are: \", paste(get_today_total(m), collapse = \", \")) # We use the `<<-` operator to assign the value to the global variable # `agents_history` (see ?\"<<-\") agents_history <<- cbind( agents_history, get_agents_states(m) ) }"},{"path":"/reference/run_multiple.html","id":null,"dir":"Reference","previous_headings":"","what":"Run multiple simulations at once — run_multiple","title":"Run multiple simulations at once — run_multiple","text":"run_multiple function allows running multiple simulations . available, users can take advantage parallel computing speed process.","code":""},{"path":"/reference/run_multiple.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Run multiple simulations at once — run_multiple","text":"","code":"run_multiple( m, ndays, nsims, seed = sample.int(10000, 1), saver = make_saver(), reset = TRUE, verbose = TRUE, nthreads = 1L ) run_multiple_get_results(m) make_saver(..., fn = \"\")"},{"path":"/reference/run_multiple.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Run multiple simulations at once — run_multiple","text":"m, ndays, seed See run. nsims Integer. Number replicats saver object class epiworld_saver. reset TRUE (default,) resets simulation. verbose TRUE (default,) prints progress bar. nthreads Integer. Number threads (parallel computing.) ... List strings (characters) specifying save (see details). fn file name pattern.","code":""},{"path":"/reference/run_multiple.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Run multiple simulations at once — run_multiple","text":"case make_saver, list class epiworld_saver. run_multiple function runs specified number simulations returns model object class epiworld_model. run_multiple_get_results function returns named list data specified make_saver.","code":""},{"path":"/reference/run_multiple.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Run multiple simulations at once — run_multiple","text":"Currently, following elements can saved: total_hist History model (total numbers per time). virus_info Information viruses. virus_hist Changes viruses. tool_info Information tools. tool_hist Changes tools. transmission Transmission events. transition Transition matrices. reproductive Reproductive number. generation Estimation generation time.","code":""},{"path":"/reference/run_multiple.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Run multiple simulations at once — run_multiple","text":"","code":"model_sir <- ModelSIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 1000, contact_rate = 2, transmission_rate = 0.9, recovery_rate = 0.1 ) # Generating a saver saver <- make_saver(\"total_hist\", \"reproductive\") # Running and printing run_multiple(model_sir, ndays = 100, nsims = 50, saver = saver, nthreads = 2) #> Starting multiple runs (50) using 2 thread(s) #> _________________________________________________________________________ #> _________________________________________________________________________ #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Retrieving the results ans <- run_multiple_get_results(model_sir) head(ans$total_hist) #> sim_num date nviruses state counts #> 1 1 0 1 Susceptible 990 #> 2 1 0 1 Infected 10 #> 3 1 0 1 Recovered 0 #> 4 1 1 1 Susceptible 981 #> 5 1 1 1 Infected 18 #> 6 1 1 1 Recovered 1 head(ans$reproductive) #> sim_num virus_id virus source source_exposure_date rt #> 1 1 0 COVID-19 519 10 0 #> 2 1 0 COVID-19 152 9 0 #> 3 1 0 COVID-19 949 8 0 #> 4 1 0 COVID-19 921 8 0 #> 5 1 0 COVID-19 855 8 0 #> 6 1 0 COVID-19 816 8 0 # Plotting multi_sir <- run_multiple_get_results(model_sir)$total_hist multi_sir <- multi_sir[multi_sir$date <= 20, ] plot(multi_sir)"},{"path":"/reference/tool.html","id":null,"dir":"Reference","previous_headings":"","what":"Tools in epiworld — tool","title":"Tools in epiworld — tool","text":"Tools functions affect agents react virus. can used simulate effects vaccination, isolation, social distancing.","code":""},{"path":"/reference/tool.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tools in epiworld — tool","text":"","code":"tool( name, prevalence, as_proportion, susceptibility_reduction, transmission_reduction, recovery_enhancer, death_reduction ) set_name_tool(tool, name) get_name_tool(tool) add_tool(model, tool, proportion) rm_tool(model, tool_pos) tool_fun_logit(vars, coefs, model) set_susceptibility_reduction(tool, prob) set_susceptibility_reduction_ptr(tool, model, param) set_susceptibility_reduction_fun(tool, model, tfun) set_transmission_reduction(tool, prob) set_transmission_reduction_ptr(tool, model, param) set_transmission_reduction_fun(tool, model, tfun) set_recovery_enhancer(tool, prob) set_recovery_enhancer_ptr(tool, model, param) set_recovery_enhancer_fun(tool, model, tfun) set_death_reduction(tool, prob) set_death_reduction_ptr(tool, model, param) set_death_reduction_fun(tool, model, tfun) # S3 method for class 'epiworld_agents_tools' print(x, max_print = 10, ...) set_distribution_tool(tool, distfun) distribute_tool_randomly(prevalence, as_proportion) distribute_tool_to_set(agents_ids)"},{"path":"/reference/tool.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tools in epiworld — tool","text":"name Name tool prevalence Numeric scalar. Prevalence tool. as_proportion Logical scalar. TRUE, prevalence interpreted proportion total number agents model. susceptibility_reduction Numeric. Proportion reduces susceptibility. transmission_reduction Numeric. Proportion reduces transmission. recovery_enhancer Numeric. Proportion improves recovery. death_reduction Numeric. Proportion reduces probability death.e tool object class epiworld_tool model Model proportion Deprecated. tool_pos Positive integer. Index tool's position model. vars Integer vector. Indices (starting 0) positions variables used compute logit probability. coefs Numeric vector. length vars, vector coefficients associated logit probability. prob Numeric scalar. probability (zero one). param Character scalar. Name parameter featured model added tool (see details). tfun object class epiworld_tool_fun. x object class epiworld_agents_tools. max_print Numeric scalar. Maximum number tools print. ... Currently ignored. distfun object class epiworld_tool_distfun. agents_ids Integer vector. Indices agents tool assigned.","code":""},{"path":"/reference/tool.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Tools in epiworld — tool","text":"tool function creates tool class epiworld_tool. set_name_tool function assigns name tool class epiworld_tool returns tool. get_name_tool function returns name tool class epiworld_tool. rm_tool function removes specified tool model. set_susceptibility_reduction function assigns probability reduction specified tool class epiworld_tool. set_transmission_reduction function assigns probability reduction specified tool class epiworld_tool. set_recovery_enhancer function assigns probability increase specified tool class epiworld_tool. set_death_reduction function assigns probability decrease specified tool class epiworld_tool. distribute_tool_randomly function returns distribution function class epiworld_tool_distfun. distribute_tool_to_set function returns distribution function class epiworld_tool_distfun.","code":""},{"path":"/reference/tool.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tools in epiworld — tool","text":"name epiworld_tool object can manipulated functions set_name_tool() get_name_tool(). add_tool function adds specified tool model class epiworld_model specified proportion. case set_susceptibility_reduction_ptr, set_transmission_reduction_ptr, set_recovery_enhancer, set_death_reduction_ptr, corresponding parameters passed pointer tool. implication using pointers values read directly model object, changes reflected. set_distribution_tool function assigns distribution function specified tool class epiworld_tool. distribution function can created using functions distribute_tool_randomly() distribute_tool_to_set(). distribute_tool_randomly function creates distribution function randomly assigns tool proportion population. distribute_tool_to_set function creates distribution function assigns tool set agents.","code":""},{"path":"/reference/tool.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tools in epiworld — tool","text":"","code":"# Simple model model_sirconn <- ModelSIRCONN( name = \"COVID-19\", n = 10000, prevalence = 0.01, contact_rate = 5, transmission_rate = 0.4, recovery_rate = 0.95 ) # Running and printing run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. plot(model_sirconn) epitool <- tool( name = \"Vaccine\", prevalence = 0.5, as_proportion = TRUE, susceptibility_reduction = .9, transmission_reduction = .5, recovery_enhancer = .5, death_reduction = .9 ) epitool #> Tool : Vaccine #> Id : (empty) #> state_init : -99 #> state_post : -99 #> queue_init : 0 #> queue_post : 0 set_name_tool(epitool, \"Pfizer\") # Assigning name to the tool get_name_tool(epitool) # Returning the name of the tool #> [1] \"Pfizer\" add_tool(model_sirconn, epitool) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. model_sirconn #> ________________________________________________________________________________ #> Susceptible-Infected-Removed (SIR) (connected) #> It features 10000 agents, 1 virus(es), and 1 tool(s). #> The model has 3 states. #> The final distribution is: 8804 Susceptible, 0 Infected, and 1196 Recovered. plot(model_sirconn) # To declare a certain number of individuals with the tool rm_tool(model_sirconn, 0) # Removing epitool from the model # Setting prevalence to 0.1 set_distribution_tool(epitool, distribute_tool_randomly(0.1, TRUE)) add_tool(model_sirconn, epitool) run(model_sirconn, ndays = 100, seed = 1912) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Adjusting probabilities due to tool set_susceptibility_reduction(epitool, 0.1) # Susceptibility reduction #> Tool : Pfizer #> Id : 0 #> state_init : -99 #> state_post : -99 #> queue_init : 0 #> queue_post : 0 set_transmission_reduction(epitool, 0.2) # Transmission reduction set_recovery_enhancer(epitool, 0.15) # Probability increase of recovery set_death_reduction(epitool, 0.05) # Probability reduction of death rm_tool(model_sirconn, 0) add_tool(model_sirconn, epitool) run(model_sirconn, ndays = 100, seed = 1912) # Run model to view changes #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # Using the logit function -------------- sir <- ModelSIR( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery_rate = 0.1 ) # Adding a small world population agents_smallworld( sir, n = 10000, k = 5, d = FALSE, p = .01 ) # Creating a tool mask_wearing <- tool( name = \"Mask\", prevalence = 0.5, as_proportion = TRUE, susceptibility_reduction = 0.0, transmission_reduction = 0.3, # Only transmission recovery_enhancer = 0.0, death_reduction = 0.0 ) add_tool(sir, mask_wearing) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. hist_0 <- get_hist_total(sir) # And adding features dat <- cbind( female = sample.int(2, 10000, replace = TRUE) - 1, x = rnorm(10000) ) set_agents_data(sir, dat) # Creating the logit function tfun <- tool_fun_logit( vars = c(0L, 1L), coefs = c(-1, 1), model = sir ) # The infection prob is lower hist(plogis(dat %*% rbind(.5, 1))) tfun # printing #> An epiworld_tool_function object. #> (model: Susceptible-Infected-Recovered (SIR)) #> This function was built using -tool_fun_logit()-. and it features the following coefficients: #> 0: -1.00 #> 1: 1.00 set_susceptibility_reduction_fun( tool = get_tool(sir, 0), model = sir, tfun = tfun ) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. hist_1 <- get_hist_total(sir) op <- par(mfrow = c(1, 2)) plot(hist_0) abline(v = 30) plot(hist_1) abline(v = 30) par(op)"},{"path":"/reference/virus.html","id":null,"dir":"Reference","previous_headings":"","what":"Virus design — virus","title":"Virus design — virus","text":"Viruses can considered anything can transmitted (e.g., diseases, well ideas.) models epiworldR can feature multiple viruses.","code":""},{"path":"/reference/virus.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Virus design — virus","text":"","code":"virus( name, prevalence, as_proportion, prob_infecting, recovery_rate = 0.5, prob_death = 0, post_immunity = -1, incubation = 7 ) set_name_virus(virus, name) get_name_virus(virus) add_virus(model, virus, proportion) virus_set_state(virus, init, end, removed) rm_virus(model, virus_pos) virus_fun_logit(vars, coefs, model) set_prob_infecting(virus, prob) set_prob_infecting_ptr(virus, model, param) set_prob_infecting_fun(virus, model, vfun) set_prob_recovery(virus, prob) set_prob_recovery_ptr(virus, model, param) set_prob_recovery_fun(virus, model, vfun) set_prob_death(virus, prob) set_prob_death_ptr(virus, model, param) set_prob_death_fun(virus, model, vfun) set_incubation(virus, incubation) set_incubation_ptr(virus, model, param) set_incubation_fun(virus, model, vfun) set_distribution_virus(virus, distfun) distribute_virus_randomly(prevalence, as_proportion) distribute_virus_set(agents_ids)"},{"path":"/reference/virus.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Virus design — virus","text":"name virus prevalence Numeric scalar. Prevalence virus. as_proportion Logical scalar. TRUE, prevalence set proportion total number agents model. prob_infecting Numeric scalar. Probability infection (transmission). recovery_rate Numeric scalar. Probability recovery. prob_death Numeric scalar. Probability death. post_immunity Numeric scalar. Post immunity (prob re-infection). incubation Numeric scalar. Incubation period (days) virus. virus object class epiworld_virus model object class epiworld_model. proportion Deprecated. init, end, removed states acquiring virus, removing virus, removing agent result virus, respectively. virus_pos Positive integer. Index virus's position model. vars Integer vector. Indices (starting 0) positions variables used compute logit probability. coefs Numeric vector. length vars, vector coefficients associated logit probability. prob Numeric scalar. probability (zero one). param Character scalar. Name parameter featured model added virus (see details). vfun object class epiworld_virus_fun. distfun object class epiworld_distribution_virus. agents_ids Integer vector. Indices agents receive virus.","code":""},{"path":"/reference/virus.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Virus design — virus","text":"set_name_virus function return value, merely assigns name virus choice. get_name_virus function returns name virus class epiworld_virus. add_virus function return value, instead adds virus choice model object class epiworld_model. virus_set_state function return value assigns epidemiological properties specified virus class epiworld_virus. rm_virus function return value, instead removes specified virus model class epiworld_model. set_prob_infecting function return value, instead assigns probability infection specified virus class epiworld_virus. set_prob_recovery function return value, instead assigns probability recovery specified virus class epiworld_virus. set_prob_death function return value, instead assigns probability death specified virus class epiworld_virus. set_incubation function return value, instead assigns incubation period specified virus class epiworld_virus. distribute_virus_randomly function returns function can used distribute virus model.","code":""},{"path":"/reference/virus.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Virus design — virus","text":"virus() function can used initialize virus. Virus features can modified using functions set_prob_*. function virus_fun_logit() creates \"virus function\" can evaluated transmission, recovery, death. name sugests, computes probabilities using logit function (see examples). name epiworld_virus object can manipulated functions set_name_virus() get_name_virus(). case set_prob_infecting_ptr, set_prob_recovery_ptr, set_prob_death_ptr, corresponding parameters passed pointer virus. implication using pointers values read directly model object, changes reflected. distribute_virus_randomly function factory function used randomly distribute virus model. prevalence can set proportion number agents. resulting function can passed set_distribution_virus.","code":""},{"path":"/reference/virus.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Virus design — virus","text":"","code":"mseirconn <- ModelSEIRCONN( name = \"COVID-19\", prevalence = 0.01, n = 10000, contact_rate = 4, incubation_days = 7, transmission_rate = 0.5, recovery_rate = 0.99 ) delta <- virus( \"Delta Variant\", 0, .5, .2, .01, prevalence = 0.3, as_proportion = TRUE ) # Adding virus and setting/getting virus name add_virus(mseirconn, delta) set_name_virus(delta, \"COVID-19 Strain\") get_name_virus(delta) #> [1] \"COVID-19 Strain\" run(mseirconn, ndays = 100, seed = 992) #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. mseirconn #> ________________________________________________________________________________ #> Susceptible-Exposed-Infected-Removed (SEIR) (connected) #> It features 10000 agents, 2 virus(es), and 0 tool(s). #> The model has 4 states. #> The final distribution is: 3609 Susceptible, 113 Exposed, 11 Infected, and 6267 Recovered. rm_virus(mseirconn, 0) # Removing the first virus from the model object set_distribution_virus(delta, distribute_virus_randomly(100, as_proportion = FALSE)) add_virus(mseirconn, delta) # Setting parameters for the delta virus manually set_prob_infecting(delta, 0.5) set_prob_recovery(delta, 0.9) set_prob_death(delta, 0.01) run(mseirconn, ndays = 100, seed = 992) # Run the model to observe changes #> _________________________________________________________________________ #> Running the model... #> ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> done. # If the states were (for example): # 1: Infected # 2: Recovered # 3: Dead delta2 <- virus( \"Delta Variant 2\", 0, .5, .2, .01, prevalence = 0, as_proportion = TRUE ) virus_set_state(delta2, 1, 2, 3) # Using the logit function -------------- sir <- ModelSIR( name = \"COVID-19\", prevalence = 0.01, transmission_rate = 0.9, recovery = 0.1 ) # Adding a small world population agents_smallworld( sir, n = 10000, k = 5, d = FALSE, p = .01 ) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(sir) # And adding features dat <- cbind( female = sample.int(2, 10000, replace = TRUE) - 1, x = rnorm(10000) ) set_agents_data(sir, dat) # Creating the logit function vfun <- virus_fun_logit( vars = c(0L, 1L), coefs = c(-1, 1), model = sir ) # The infection prob is lower hist(plogis(dat %*% rbind(-1, 1))) vfun # printing #> An epiworld_virus_function object. #> (model: Susceptible-Infected-Recovered (SIR)) #> This function was built using -virus_fun_logit()-. and it features the following coefficients: #> 0: -1.00 #> 1: 1.00 set_prob_infecting_fun( virus = get_virus(sir, 0), model = sir, vfun = vfun ) run(sir, ndays = 50, seed = 11) #> _________________________________________________________________________ #> |Running the model... #> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. #> | done. plot(sir)"},{"path":"/news/index.html","id":"epiworldr-03-2","dir":"Changelog","previous_headings":"","what":"epiworldR 0.3-2","title":"epiworldR 0.3-2","text":"CRAN release: 2024-10-08 Starting version 0.3-0, epiworldR versioned using version C++ library, epiworld. Adds new mixing models ModelSIRMixing ModelSEIRMixing. Ports Entity class. Entities used group agents within model. Refactors add_tool, add_virus, add_entity simplifying syntax. Now, functions receive model object. Prevalence specified object . add_tool_n add_virus_n now deprecated. globalaction_* now defunct. Use globalevent_* instead. New functions specify viruses, tools, entities distributed among agents: distribute_viruses, distribute_tools, distribute_entities.","code":""},{"path":"/news/index.html","id":"epiworldr-01-0","dir":"Changelog","previous_headings":"","what":"epiworldR 0.1-0","title":"epiworldR 0.1-0","text":"CRAN release: 2024-04-08 Force model update agents’ states running simulation. causing issues calling run_multiple() single call run(). Reported 14.","code":""},{"path":"/news/index.html","id":"epiworldr-00-4","dir":"Changelog","previous_headings":"","what":"epiworldR 0.0-4","title":"epiworldR 0.0-4","text":"CRAN release: 2024-02-09 Added missing checks tool class adding model add_too_n. Various small improvements.","code":""},{"path":"/news/index.html","id":"epiworldr-00-3","dir":"Changelog","previous_headings":"","what":"epiworldR 0.0-3","title":"epiworldR 0.0-3","text":"CRAN release: 2023-09-08 Added following models: ModelSEIRD, ModelSEIRDCONN, ModelSIRD, ModelSIRDCONN, ModelSISD. Fixed bug reported issue 6.","code":""},{"path":"/news/index.html","id":"epiworldr-00-2","dir":"Changelog","previous_headings":"","what":"epiworldR 0.0-2","title":"epiworldR 0.0-2","text":"CRAN release: 2023-06-21 Added NEWS.md file track changes package. Fixed bug reported CRAN reference nullptr. Renamed arguments across Models favor consistency. Figures now show virus/tool name instead id. Fixed bug run_multiple added tests (C++). Redid autoconf Makevars using RcppArmadillo template checking OpenMP.","code":""}] diff --git a/sitemap.xml b/sitemap.xml index a5536b27..c66321e0 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -36,7 +36,7 @@ /reference/epiworld-methods.html /reference/epiworldR-deprecated.html /reference/epiworldR-package.html -/reference/global-actions.html +/reference/global-events.html /reference/index.html /reference/run_multiple.html /reference/tool.html