diff --git a/config.yaml b/config.yaml index 13796a34..18d87eb4 100644 --- a/config.yaml +++ b/config.yaml @@ -64,7 +64,7 @@ episodes: - describe-cases.Rmd - simple-analysis.Rmd - delays-reuse.Rmd -- quantify-transmissibility.Rmd +# - quantify-transmissibility.Rmd - delays-functions.Rmd # Information for Learners diff --git a/episodes/delays-functions.Rmd b/episodes/delays-functions.Rmd index d4544531..6a5fda14 100644 --- a/episodes/delays-functions.Rmd +++ b/episodes/delays-functions.Rmd @@ -62,15 +62,14 @@ covid_serialint <- ) ``` -Now, we have an epidemiological parameter we can use in our analysis! In the chunk below we replaced one of the **summary statistics** inputs into `EpiNow2::dist_spec()` +Now, we have an epidemiological parameter we can use in our analysis! In the chunk below we replaced one of the **summary statistics** inputs into `EpiNow2::LogNormal()` ```r generation_time <- - EpiNow2::dist_spec( + EpiNow2::LogNormal( mean = covid_serialint$summary_stats$mean, # replaced! sd = covid_serialint$summary_stats$sd, # replaced! - max = 20, - distribution = "gamma" + max = 20 ) ``` @@ -209,9 +208,9 @@ An interpretation could be: ## Discretise a continuous distribution -We are getting closer to the end! `EpiNow2::dist_spec()` still needs a maximum value (`max`). +We are getting closer to the end! `EpiNow2::LogNormal()` still needs a maximum value (`max`). -One way to do this is to get the quantile value for the distribution's 99.9th percentile or `0.999` cumulative probability. For this, we need access to the set of distribution functions for our `` object. +One way to do this is to get the quantile value for the distribution's 99th percentile or `0.99` cumulative probability. For this, we need access to the set of distribution functions for our `` object. We can use the set of distribution functions for a _continuous_ distribution (as above). However, these values will be _continuous_ numbers. We can **discretise** the continuous distribution stored in our `` object to get discrete values from a continuous distribution. @@ -240,11 +239,11 @@ plot(covid_serialint) plot(covid_serialint_discrete) ``` -To finally get a `max` value, let's access the quantile value of the 99.9th percentile or `0.999` probability of the distribution with the `prob_dist$q` notation, similarly to how we access the `summary_stats` values. +To finally get a `max` value, let's access the quantile value of the 99th percentile or `0.99` probability of the distribution with the `prob_dist$q` notation, similarly to how we access the `summary_stats` values. ```{r} covid_serialint_discrete_max <- - quantile(covid_serialint_discrete, p = 0.999) + quantile(covid_serialint_discrete, p = 0.99) ``` ::::::::::::::::::::::::::::::::: challenge @@ -312,7 +311,7 @@ From a maximum value with `quantile()`, we can create a sequence of quantile val ```{r,eval=TRUE} # create a discrete distribution visualisation # from a maximum value from the distribution -quantile(covid_serialint_discrete, p = 0.999) %>% +quantile(covid_serialint_discrete, p = 0.99) %>% # generate quantile values # as a sequence for each natural number seq(1L, to = ., by = 1L) %>% @@ -346,13 +345,13 @@ quantile(covid_serialint_discrete, p = 0.999) %>% ## Plug-in `{epiparameter}` to `{EpiNow2}` -Now we can plug everything into the `EpiNow2::dist_spec()` function! +Now we can plug everything into the `EpiNow2::LogNormal()` function! - the **summary statistics** `mean` and `sd` of the distribution, - a maximum value `max`, - the `distribution` name. -However, when using `EpiNow2::dist_spec()`, to define a **Lognormal** distribution, like the one in the `covid_serialint` object, we need to convert its summary statistics to distribution parameters named logmean and logsd. With `{epiparameter}` we can directly get the *distribution parameters* using `epiparameter::get_parameters()`: +When using `EpiNow2::LogNormal()` to define a **log normal** distribution like the one in the `covid_serialint` object we can specify the mean and sd as parameters. Alternatively, to get the "natural" parameters for a log normal distribution we can convert its summary statistics to distribution parameters named `meanlog` and `sdlog`. With `{epiparameter}` we can directly get the *distribution parameters* using `epiparameter::get_parameters()`: ```{r} covid_serialint_parameters <- @@ -363,11 +362,10 @@ Then, we have: ```{r} serial_interval_covid <- - dist_spec( - mean = covid_serialint_parameters["meanlog"], - sd = covid_serialint_parameters["sdlog"], - max = covid_serialint_discrete_max, - distribution = "lognormal" + EpiNow2::LogNormal( + meanlog = covid_serialint_parameters["meanlog"], + sdlog = covid_serialint_parameters["sdlog"], + max = covid_serialint_discrete_max ) serial_interval_covid @@ -378,7 +376,7 @@ Assuming a COVID-19 scenario, let's use the first 60 days of the `example_confir ```{r,message=FALSE} epinow_estimates_cg <- epinow( # cases - reported_cases = example_confirmed[1:60], + data = example_confirmed[1:60], # delays generation_time = generation_time_opts(serial_interval_covid) ) @@ -449,17 +447,16 @@ covid_serialint <- covid_serialint_discrete_max <- covid_serialint %>% discretise() %>% - quantile(p = 0.999) + quantile(p = 0.99) covid_serialint_parameters <- epiparameter::get_parameters(covid_serialint) covid_serial_interval <- - dist_spec( - mean = covid_serialint_parameters["meanlog"], - sd = covid_serialint_parameters["sdlog"], - max = covid_serialint_discrete_max, - distribution = "lognormal" + EpiNow2::LogNormal( + meanlog = covid_serialint_parameters["meanlog"], + sdlog = covid_serialint_parameters["sdlog"], + max = covid_serialint_discrete_max ) # incubation time --------------------------------------------------------- @@ -476,17 +473,16 @@ covid_incubation <- epiparameter::epidist_db( covid_incubation_discrete_max <- covid_incubation %>% discretise() %>% - quantile(p = 0.999) + quantile(p = 0.99) covid_incubation_parameters <- epiparameter::get_parameters(covid_incubation) covid_incubation_time <- - dist_spec( - mean = covid_incubation_parameters["meanlog"], - sd = covid_incubation_parameters["sdlog"], - max = covid_incubation_discrete_max, - distribution = "lognormal" # do not forget this! + EpiNow2::LogNormal( + meanlog = covid_incubation_parameters["meanlog"], + sdlog = covid_incubation_parameters["sdlog"], + max = covid_incubation_discrete_max ) # epinow ------------------------------------------------------------------ @@ -494,7 +490,7 @@ covid_incubation_time <- # run epinow epinow_estimates_cgi <- epinow( # cases - reported_cases = example_confirmed[1:60], + data = example_confirmed[1:60], # delays generation_time = generation_time_opts(covid_serial_interval), delays = delay_opts(covid_incubation_time) @@ -559,8 +555,8 @@ To calculate the $R_t$ using `{EpiNow2}`, we need: To get delay distribution using `{epiparameter}` we can use functions like: -- `epidist_db()` -- `list_distributions()` +- `epiparameter::epidist_db()` +- `epiparameter::parameter_tbl()` - `discretise()` - `quantile()` @@ -582,7 +578,7 @@ ebola_confirmed <- # list distributions epidist_db(disease = "ebola") %>% - list_distributions() + epiparameter::parameter_tbl() ``` ```{r,message=FALSE,eval=TRUE} @@ -600,11 +596,10 @@ ebola_serial <- epidist_db( ebola_serial_discrete <- discretise(ebola_serial) serial_interval_ebola <- - dist_spec( + EpiNow2::Gamma( mean = ebola_serial$summary_stats$mean, sd = ebola_serial$summary_stats$sd, - max = quantile(ebola_serial_discrete, p = 0.999), - distribution = "gamma" + max = quantile(ebola_serial_discrete, p = 0.99) ) # incubation time --------------------------------------------------------- @@ -620,11 +615,10 @@ ebola_incubation <- epidist_db( ebola_incubation_discrete <- discretise(ebola_incubation) incubation_period_ebola <- - dist_spec( + EpiNow2::Gamma( mean = ebola_incubation$summary_stats$mean, sd = ebola_incubation$summary_stats$sd, - max = quantile(ebola_serial_discrete, p = 0.999), - distribution = "gamma" + max = quantile(ebola_serial_discrete, p = 0.99) ) # epinow ------------------------------------------------------------------ @@ -632,7 +626,7 @@ incubation_period_ebola <- # run epinow epinow_estimates_egi <- epinow( # cases - reported_cases = ebola_confirmed, + data = ebola_confirmed, # delays generation_time = generation_time_opts(serial_interval_ebola), delays = delay_opts(incubation_period_ebola) @@ -654,7 +648,7 @@ Use the `influenza_england_1978_school` dataset from the `{outbreaks}` package t ::::::::::::::::: hint -`EpiNow2::dist_spec()` also accepts Probability Mass Functions (PMF) from any distribution family. Read the reference guide on [Specify a distribution](https://epiforecasts.io/EpiNow2/reference/dist_spec.html). +`EpiNow2::NonParametric()` accepts Probability Mass Functions (PMF) from any distribution family. Read the reference guide on [Probability distributions](https://epiforecasts.io/EpiNow2/reference/Distributions.html). :::::::::::::::::::::: @@ -663,8 +657,7 @@ Use the `influenza_england_1978_school` dataset from the `{outbreaks}` package t ```{r,message=FALSE,eval=TRUE} # What parameters are available for Influenza? epidist_db(disease = "influenza") %>% - list_distributions() %>% - as_tibble() %>% + epiparameter::parameter_tbl() %>% count(epi_distribution) # generation time --------------------------------------------------------- @@ -685,7 +678,7 @@ influenza_generation_discrete <- epiparameter::discretise(influenza_generation) influenza_generation_max <- - quantile(influenza_generation_discrete, p = 0.999) + quantile(influenza_generation_discrete, p = 0.99) influenza_generation_pmf <- density( @@ -695,9 +688,9 @@ influenza_generation_pmf <- influenza_generation_pmf -# EpiNow2::dist_spec() can also accept the PMF values +# EpiNow2::NonParametric() can also accept the PMF values generation_time_influenza <- - dist_spec( + EpiNow2::NonParametric( pmf = influenza_generation_pmf ) @@ -716,7 +709,7 @@ influenza_incubation_discrete <- epiparameter::discretise(influenza_incubation) influenza_incubation_max <- - quantile(influenza_incubation_discrete, p = 0.999) + quantile(influenza_incubation_discrete, p = 0.99) influenza_incubation_pmf <- density( @@ -726,9 +719,9 @@ influenza_incubation_pmf <- influenza_incubation_pmf -# EpiNow2::dist_spec() can also accept the PMF values +# EpiNow2::NonParametric() can also accept the PMF values incubation_time_influenza <- - dist_spec( + EpiNow2::NonParametric( pmf = influenza_incubation_pmf ) @@ -761,7 +754,7 @@ plot(epinow_estimates_igi) ### How to get distribution parameters from statistical distributions? -How to get the mean and standard deviation from a generation time with *only* distribution parameters but no summary statistics like `mean` or `sd` for `EpiNow2::dist_spec()`? +How to get the mean and standard deviation from a generation time with *only* distribution parameters but no summary statistics like `mean` or `sd` for `EpiNow2::Gamma()` or `EpiNow2::LogNormal()`? Look at the `{epiparameter}` vignette on [parameter extraction and conversion](https://epiverse-trace.github.io/epiparameter/articles/extract_convert.html) and its [use cases](https://epiverse-trace.github.io/epiparameter/articles/extract_convert.html#use-cases)! diff --git a/episodes/delays-reuse.Rmd b/episodes/delays-reuse.Rmd index b5d7a518..3ad60711 100644 --- a/episodes/delays-reuse.Rmd +++ b/episodes/delays-reuse.Rmd @@ -50,9 +50,9 @@ However, early in an epidemic, modelling efforts can be delayed by the lack of a -To exemplify how to use the `{epiparameter}` R package in your analysis pipeline, our goal in this episode will be to choose one specific set of epidemiological parameters from the literature, instead of copying-and-pasting them by hand, to plug them into an `{EpiNow2}` analysis workflow. +To exemplify how to use the `{epiparameter}` R package in your analysis pipeline, our goal in this episode will be to access one specific set of epidemiological parameters from the literature, instead of copying-and-pasting them by hand, to plug them into an `{EpiNow2}` analysis workflow. - + Let's start loading the `{epiparameter}` package. We'll use the pipe `%>%` to connect some of their functions, some `{tibble}` and `{dplyr}` functions, so let's also call to the `{tidyverse}` package: @@ -76,37 +76,32 @@ This help us remember package functions and avoid namespace conflicts. ## The problem -If we want to estimate the transmissibility of an infection, it's common to use a package such as `{EpiEstim}` or `{EpiNow2}`. However, both require some epidemiological information as an input. For example, in `{EpiNow2}` we use `EpiNow2::dist_spec()` to specify a [generation time](../learners/reference.md#generationtime) as a probability `distribution` adding its `mean`, standard deviation (`sd`), and maximum value (`max`). To specify a `generation_time` that follows a _Gamma_ distribution with mean $\mu = 4$, standard deviation $\sigma = 2$, and a maximum value of 20, we write: +If we want to estimate the transmissibility of an infection, it's common to use a package such as `{EpiEstim}` or `{EpiNow2}`. However, both require some epidemiological information as an input. For example, in `{EpiNow2}` we use `EpiNow2::Gamma()` to specify a [generation time](../learners/reference.md#generationtime) as a probability distribution adding its `mean`, standard deviation (`sd`), and maximum value (`max`). + +To specify a `generation_time` that follows a _Gamma_ distribution with mean $\mu = 4$, standard deviation $\sigma = 2$, and a maximum value of 20, we write: ```r generation_time <- - EpiNow2::dist_spec( + EpiNow2::Gamma( mean = 4, sd = 2, - max = 20, - distribution = "gamma" + max = 20 ) ``` It is a common practice for analysts to manually search the available literature and copy and paste the **summary statistics** or the **distribution parameters** from scientific publications. A challenge that is often faced is that the reporting of different statistical distributions is not consistent across the literature. `{epiparameter}`’s objective is to facilitate the access to reliable estimates of distribution parameters for a range of infectious diseases, so that they can easily be implemented in outbreak analytic pipelines. -In this episode, we will *choose* the summary statistics from the library of epidemiological parameters provided by `{epiparameter}`. +In this episode, we will *access* the summary statistics of generation time for COVID-19 from the library of epidemiological parameters provided by `{epiparameter}`. These metrics can be used to estimate the transmissibility of this disease using `{EpiNow2}` in subsequent episodes. - + +Currently, in the library of epidemiological parameters, we have one `"generation"` time entry for Influenza. Instead, we can look at the `serial` intervals for `COVID`-19. Let find what we need to consider for this! ## Generation time vs serial interval @@ -135,7 +130,7 @@ To summarise these data from individual and pair time periods, we can find the * -![Fitted serial interval distribution for (a) COVID-19 and (b) MERS-CoV based on reported transmission pairs in Saudi Arabia. We fitted three commonly used distributions, Lognormal, Gamma, and Weibull distributions, respectively ([Althobaity et al., 2022](https://www.sciencedirect.com/science/article/pii/S2468042722000537#fig5)).](fig/seria-interval-fitted-distributions.jpg) +![Fitted serial interval distribution for (a) COVID-19 and (b) MERS-CoV based on reported transmission pairs in Saudi Arabia. We fitted three commonly used distributions, Log normal, Gamma, and Weibull distributions, respectively ([Althobaity et al., 2022](https://www.sciencedirect.com/science/article/pii/S2468042722000537#fig5)).](fig/seria-interval-fitted-distributions.jpg) Statistical distributions are summarised in terms of their **summary statistics** like the *location* (mean and percentiles) and *spread* (variance or standard deviation) of the distribution, or with their **distribution parameters** that inform about the *form* (shape and rate/scale) of the distribution. These estimated values can be reported with their **uncertainty** (95% confidence intervals). @@ -199,37 +194,17 @@ The objective of the assessment above is to assess the interpretation of a large ## Choosing epidemiological parameters -In this section, we will use `{epiparameter}` to obtain the generation time and the serial interval for COVID-19, so these metrics can be used to estimate the transmissibility of this disease using `{EpiNow2}` in subsequent sections of this episode. +In this section, we will use `{epiparameter}` to obtain the serial interval for COVID-19, as an alternative to the generation time. -Let's start by looking at how many entries are available in the epidemiological distributions database in `{epiparameter}` (`epidist_db`) for the `disease` named `covid`-19: +Let's ask now how many parameters we have in the epidemiological distributions database (`epidist_db()`) with the `disease` named `covid`-19. Run this locally! -```{r} +```{r,eval=FALSE} epiparameter::epidist_db( disease = "covid" ) ``` -::::::::::::::::::: checklist - -### The double-colon - -The double-colon `::` in R is used to access functions or objects from a specific package without loading the entire package into the current environment. This allows for a more targeted approach to using package components and helps avoid namespace conflicts. - -`::` lets you call a specific function from a package by explicitly mentioning the package name. For example, `dplyr::filter(data, condition)` uses `filter()` from the `{dplyr}` package without loading the entire package. - -::::::::::::::::::: - -From the `{epiparameter}` package, we can use the `epidist_db()` function to ask for any `disease` and also for a specific epidemiological distribution (`epi_dist`). - -Let's ask now how many parameters we have in the epidemiological distributions database (`epidist_db`) with the generation time using the string `generation`: - -```{r} -epiparameter::epidist_db( - epi_dist = "generation" -) -``` - -Currently, in the library of epidemiological parameters, we have one `generation` time entry for Influenza. Considering the above-mentioned considerations, we can look at the `serial` intervals for `COVID`-19. Run this locally! +From the `{epiparameter}` package, we can use the `epidist_db()` function to ask for any `disease` and also for a specific epidemiological distribution (`epi_dist`). Run this in your console: ```{r,eval=FALSE} epiparameter::epidist_db( @@ -248,19 +223,19 @@ With this query combination, we get more than one delay distribution. This outpu ::::::::::::::::::::::::: -To summarise an `` object and get the column names from the underlying parameter database, we can add the `epiparameter::list_distributions()` function to the previous code using the pipe `%>%`: +As suggested in the outputs, to summarise an `` object and get the column names from the underlying parameter database, we can add the `epiparameter::parameter_tbl()` function to the previous code using the pipe `%>%`: ```{r} epiparameter::epidist_db( disease = "covid", epi_dist = "serial" ) %>% - epiparameter::list_distributions() + epiparameter::parameter_tbl() ``` -In the `epiparameter::list_distributions()` output, we can also find different types of probability distributions (e.g., Log-normal, Weibull, Normal). +In the `epiparameter::parameter_tbl()` output, we can also find different types of probability distributions (e.g., Log-normal, Weibull, Normal). -`{epiparameter}` uses the `base` R naming convention for distributions. This is why **Lognormal** is called `lnorm`. +`{epiparameter}` uses the `base` R naming convention for distributions. This is why **Log normal** is called `lnorm`. ::::::::::::::::: spoiler @@ -314,7 +289,7 @@ Find: - How many delay distributions are for that disease? -- How many types of probability distribution (e.g., gamma, lognormal) are for a given delay in that disease? +- How many types of probability distribution (e.g., gamma, log normal) are for a given delay in that disease? Ask: @@ -335,7 +310,7 @@ The `epidist_db()` function with `disease` and `epi_dist` gets a list of all ent - the **type** of a probability distribution, and - distribution parameter values. -The combo of `epidist_db()` plus `list_distributions()` gets a data frame of all entries with columns like: +The combo of `epidist_db()` plus `parameter_tbl()` gets a data frame of all entries with columns like: - the **type** of the probability distribution per delay, and - author and year of the study. @@ -364,7 +339,7 @@ epiparameter::epidist_db( ) ``` -We use `list_distributions()` to get a summary display of all: +We use `parameter_tbl()` to get a summary display of all: ```{r,eval=TRUE} # we expect 2 different types of delay distributions @@ -373,10 +348,10 @@ epiparameter::epidist_db( disease = "ebola", epi_dist = "incubation" ) %>% - list_distributions() + parameter_tbl() ``` -We find two types of probability distributions for this query: _lognormal_ and _gamma_. +We find two types of probability distributions for this query: _log normal_ and _gamma_. How does `{epiparameter}` do the collection and review of peer-reviewed literature? We invite you to read the vignette on ["Data Collation and Synthesis Protocol"](https://epiverse-trace.github.io/epiparameter/articles/data_protocol.html)! @@ -395,7 +370,7 @@ epiparameter::epidist_db( epi_dist = "serial", author = "Hiroshi" ) %>% - epiparameter::list_distributions() + epiparameter::parameter_tbl() ``` We still get more than one epidemiological parameter. We can set the `single_epidist` argument to `TRUE` to only one: @@ -486,19 +461,18 @@ We can get the `mean` and standard deviation (`sd`) from this `` diving covid_serialint$summary_stats$mean ``` -Now, we have an epidemiological parameter we can reuse! We can replace the **summary statistics** numbers we plug into the `EpiNow2::dist_spec()` function: +Now, we have an epidemiological parameter we can reuse! Given that the `covid_serialint` is a `lnorm` or log normal distribution, we can replace the **summary statistics** numbers we plug into the `EpiNow2::LogNormal()` function: ```r generation_time <- - EpiNow2::dist_spec( + EpiNow2::LogNormal( mean = covid_serialint$summary_stats$mean, # replaced! sd = covid_serialint$summary_stats$sd, # replaced! - max = 20, - distribution = "gamma" + max = 20 ) ``` -In the next episode we'll learn how to use `{EpiNow2}` to correctly specify distributions, estimate transmissibility. Then, how to use **distribution functions** to get a maximum value (`max`) for `EpiNow2::dist_spec()` and use `{epiparameter}` in your analysis. +In the next episode we'll learn how to use `{EpiNow2}` to correctly specify distributions, estimate transmissibility. Then, how to use **distribution functions** to get a maximum value (`max`) for `EpiNow2::LogNormal()` and use `{epiparameter}` in your analysis. :::::::::::::::::::::::::::::: callout @@ -609,7 +583,7 @@ For Ebola: An informative delay should measure the time from symptom onset to recovery or death. -Find a way to access the whole `{epiparameter}` database and find how that delay may be stored. The `list_distributions()` output is a dataframe. +Find a way to access the whole `{epiparameter}` database and find how that delay may be stored. The `parameter_tbl()` output is a dataframe. :::::::::::::::::::::: @@ -618,7 +592,7 @@ Find a way to access the whole `{epiparameter}` database and find how that delay ```{r,eval=TRUE} # one way to get the list of all the available parameters epidist_db(disease = "all") %>% - list_distributions() %>% + parameter_tbl() %>% as_tibble() %>% distinct(epi_distribution) @@ -682,7 +656,7 @@ update it from last epiparameter test - Use `{epiparameter}` to access the literature catalogue of epidemiological delay distributions. - Use `epidist_db()` to select single delay distributions. -- Use `list_distributions()` for an overview of multiple delay distributions. +- Use `parameter_tbl()` for an overview of multiple delay distributions. - Reuse known estimates for unknown disease in the early stage of an outbreak when no contact tracing data is available. :::::::::::::::::::::::::::::::::::::::::::::::: diff --git a/episodes/quantify-transmissibility.Rmd b/episodes/quantify-transmissibility.Rmd index 1bdab56a..5a39057e 100644 --- a/episodes/quantify-transmissibility.Rmd +++ b/episodes/quantify-transmissibility.Rmd @@ -28,6 +28,8 @@ Learners should familiarise themselves with following concepts before working th **Epidemic theory**: Effective reproduction number. +**Data science**: Data transformation and visualization. You can review the episode on [Aggregate and visualize](https://epiverse-trace.github.io/tutorials-early/describe-cases.html) incidence data. + ::::::::::::::::::::::::::::::::: @@ -50,13 +52,19 @@ To estimate these key metrics using case data we must account for delays between In the next tutorials we will focus on how to use the functions in `{EpiNow2}` to estimate transmission metrics of case data. We will not cover the theoretical background of the models or inference framework, for details on these concepts see the [vignette](https://epiforecasts.io/EpiNow2/dev/articles/estimate_infections.html). -In this tutorial we are going to learn how to use the `{EpiNow2}` package to estimate the time-varying reproduction number. We’ll use the `{dplyr}` package to arrange some of its inputs, `{ggplot2}` to visualize case distribution, and the pipe `%>%` to connect some of their functions, so let’s also call to the `{tidyverse}` package: +In this tutorial we are going to learn how to use the `{EpiNow2}` package to estimate the time-varying reproduction number. We'll get input data from `{incidence2}`. We’ll use the `{tidyr}` and `{dplyr}` packages to arrange some of its outputs, `{ggplot2}` to visualize case distribution, and the pipe `%>%` to connect some of their functions, so let’s also call to the `{tidyverse}` package: -```{r,message=FALSE,warning=FALSE} +```r library(EpiNow2) +library(incidence2) +library(tidyverse) +``` + +```{r,echo=FALSE,eval=TRUE,message=FALSE,warning=FALSE} library(tidyverse) ``` + ::::::::::::::::::: checklist ### The double-colon @@ -111,61 +119,60 @@ To use the data, we must format the data to have two columns: + `date`: the date (as a date object see `?is.Date()`), + `confirm`: number of confirmed cases on that date. -Let's use `{dplyr}` for this: +Let's use `{tidyr}` and `{incidence2}` for this: ```{r, warning = FALSE, message = FALSE} -library(dplyr) - cases <- incidence2::covidregionaldataUK %>% - select(date, cases_new) %>% - group_by(date) %>% - summarise(confirm = sum(cases_new, na.rm = TRUE)) %>% - ungroup() + # use {tidyr} to preprocess missing values + tidyr::replace_na(base::list(cases_new = 0)) %>% + # use {incidence2} to compute the daily incidence + incidence2::incidence( + date_index = "date", + counts = "cases_new", + count_values_to = "confirm", + date_names_to = "date", + complete_dates = TRUE + ) %>% + dplyr::select(-count_variable) ``` -::::::::::::::::::::::::: spoiler - -### When to use incidence2? +With `incidence2::incidence()` we aggregate cases in different time *intervals* (i.e., days, weeks or months) or per *group* categories. Also we can have complete dates for all the range of dates per group category using `complete_dates = TRUE` +Explore later the [`incidence2::incidence()` reference manual](https://www.reconverse.org/incidence2/reference/incidence.html) -We can also use the `{incidence2}` package to: +::::::::::::::::::::::::: spoiler -- Aggregate cases (similar to the code above) but in different time *intervals* (i.e., days, weeks or months) or per *group* categories. Explore later the [`incidence2::incidence()` reference manual](https://www.reconverse.org/incidence2/reference/incidence.html). +### Can we replicate {incidence2} with {dplyr}? -- Complete dates for all the range of dates per group category using `incidence2::complete_dates()`. Read further in its [function reference manual](https://www.reconverse.org/incidence2/reference/complete_dates.html). +We can get an object similar to `cases` from the `incidence2::covidregionaldataUK` data frame using the `{dplyr}` package. ```{r, warning = FALSE, message = FALSE, eval=FALSE} -library(tidyr) -library(dplyr) - incidence2::covidregionaldataUK %>% - # preprocess missing values - tidyr::replace_na(list(cases_new = 0)) %>% - # compute the daily incidence - incidence2::incidence( - date_index = "date", - counts = "cases_new", - count_values_to = "confirm", - date_names_to = "date" - ) %>% - # complete range of dates - incidence2::complete_dates() + dplyr::select(date, cases_new) %>% + dplyr::group_by(date) %>% + dplyr::summarise(confirm = sum(cases_new, na.rm = TRUE)) %>% + dplyr::ungroup() ``` +However, the `incidence2::incidence()` function contains convenient arguments like `complete_dates` that facilitate getting an incidence object with the same range of dates for each grouping without the need of extra code lines or a time-series package. + ::::::::::::::::::::::::: There are case data available for `r dim(cases)[1]` days, but in an outbreak situation it is likely we would only have access to the beginning of this data set. Therefore we assume we only have the first 90 days of this data. ```{r echo = FALSE} -ggplot(cases[1:90, ], aes(x = date, y = confirm)) + +# keep the first 90 dates and visualize epicurve +cases %>% + dplyr::slice_head(n = 90) %>% + # use ggplot2 + ggplot(aes(x = date, y = confirm)) + geom_col() + theme_grey( base_size = 15 ) ``` - - ### Delay distributions + We assume there are delays from the time of infection until the time a case is reported. We specify these delays as distributions to account for the uncertainty in individual level differences. The delay can consist of multiple types of delays/processes. A typical delay from time of infection to case reporting may consist of:

**time from infection to symptom onset** (the [incubation period](../learners/reference.md#incubation)) + **time from symptom onset to case notification** (the reporting time) @@ -174,6 +181,7 @@ We assume there are delays from the time of infection until the time a case is r The delay distribution for each of these processes can either estimated from data or obtained from the literature. We can express uncertainty about what the correct parameters of the distributions by assuming the distributions have **fixed** parameters or whether they have **variable** parameters. To understand the difference between **fixed** and **variable** distributions, let's consider the incubation period. ::::::::::::::::::::::::::::::::::::: callout + ### Delays and data The number of delays and type of delay are a flexible input that depend on the data. The examples below highlight how the delays can be specified for different data sources: @@ -196,24 +204,27 @@ The number of delays and type of delay are a flexible input that depend on the d The distribution of incubation period for many diseases can usually be obtained from the literature. The package `{epiparameter}` contains a library of epidemiological parameters for different diseases obtained from the literature. -We specify a (fixed) gamma distribution with mean $\mu = 4$ and standard deviation $\sigma= 2$ (shape = $4$, scale = $1$) using the function `dist_spec()` as follows: +We specify a (fixed) gamma distribution with mean $\mu = 4$ and standard deviation $\sigma= 2$ (shape = $4$, scale = $1$) using the function `Gamma()` as follows: ```{r} -incubation_period_fixed <- dist_spec( - mean = 4, sd = 2, - max = 20, distribution = "gamma" +incubation_period_fixed <- EpiNow2::Gamma( + mean = 4, + sd = 2, + max = 20 ) + incubation_period_fixed ``` The argument `max` is the maximum value the distribution can take, in this example 20 days. ::::::::::::::::::::::::::::::::::::: callout + ### Why a gamma distrubution? -The incubation period has to be positive in value. Therefore we must specific a distribution in `dist_spec` which is for positive values only. +The incubation period has to be positive in value. Therefore we must specific a distribution in `{EpiNow2}` which is for positive values only. -`dist_spec()` supports log normal and gamma distributions, which are distributions for positive values only. +`Gamma()` supports Gamma distributions and `LogNormal()` Log-normal distributions, which are distributions for positive values only. For all types of delay, we will need to use distributions for positive values only - we don't want to include delays of negative days in our analysis! @@ -231,73 +242,103 @@ and a standard deviation ($\sigma$) follows a Normal distribution with standard $$\mbox{Normal}(\sigma,\sigma_{\sigma}^2).$$ -We specify this using `dist_spec` with the additional arguments `mean_sd` ($\sigma_{\mu}$) and `sd_sd` ($\sigma_{\sigma}$). +We specify this using `Normal()` for each argument: the mean ($\mu=4$ with $\sigma_{\mu}=0.5$) and standard deviation ($\sigma=2$ with $\sigma_{\sigma}=0.5$). -```{r} -incubation_period_variable <- dist_spec( - mean = 4, sd = 2, - mean_sd = 0.5, sd_sd = 0.5, - max = 20, distribution = "gamma" +```{r,warning=FALSE,message=FALSE} +incubation_period_variable <- EpiNow2::Gamma( + mean = EpiNow2::Normal(mean = 4, sd = 0.5), + sd = EpiNow2::Normal(mean = 2, sd = 0.5), + max = 20 ) + incubation_period_variable ``` - #### Reporting delays After the incubation period, there will be an additional delay of time from symptom onset to case notification: the reporting delay. We can specify this as a fixed or variable distribution, or estimate a distribution from data. -When specifying a distribution, it is useful to visualise the probability density to see the peak and spread of the distribution, in this case we will use a log normal distribution. We can use the functions `convert_to_logmean()` and `convert_to_logsd()` to convert the mean and standard deviation of a normal distribution to that of a log normal distribution. +When specifying a distribution, it is useful to visualise the probability density to see the peak and spread of the distribution, in this case we will use a *log normal* distribution. We can use the functions `convert_to_logmean()` and `convert_to_logsd()` to convert the mean and standard deviation of a normal distribution to that of a log normal distribution. -If we want to assume that the mean reporting delay is 2 days (with a standard deviation of 1 day), the log normal distribution will look like: +If we want to assume that the mean reporting delay is 2 days (with a standard deviation of 1 day), we write: ```{r} -log_mean <- convert_to_logmean(2, 1) -log_sd <- convert_to_logsd(2, 1) -x <- seq(from = 0, to = 10, length = 1000) -df <- data.frame(x = x, density = dlnorm(x, meanlog = log_mean, sdlog = log_sd)) -ggplot(df) + - geom_line( - aes(x, density) - ) + - theme_grey( - base_size = 15 +# convert mean to logmean +log_mean <- EpiNow2::convert_to_logmean(mean = 2, sd = 1) + +# convert sd to logsd +log_sd <- EpiNow2::convert_to_logsd(mean = 2, sd = 1) +``` + +:::::::::::::::::::::: spoiler + +### Visualize a log Normal distribution using {epiparameter} + +Using `epiparameter::epidist()` we can create a custom distribution. The log normal distribution will look like: + +```r +library(epiparameter) +``` + +```{r,message=FALSE,warning=FALSE} +epiparameter::epidist( + disease = "covid", + epi_dist = "reporting delay", + prob_distribution = "lnorm", + prob_distribution_params = c( + meanlog = log_mean, + sdlog = log_sd ) +) %>% + plot() ``` -Using the mean and standard deviation for the log normal distribution, we can specify a fixed or variable distribution using `dist_spec()` as before: +:::::::::::::::::::::: -```{r} -reporting_delay_variable <- dist_spec( - mean = log_mean, sd = log_sd, - mean_sd = 0.5, sd_sd = 0.5, - max = 10, distribution = "lognormal" +Using the mean and standard deviation for the log normal distribution, we can specify a fixed or variable distribution using `LogNormal()` as before: + +```{r,warning=FALSE,message=FALSE} +reporting_delay_variable <- EpiNow2::LogNormal( + meanlog = EpiNow2::Normal(mean = log_mean, sd = 0.5), + sdlog = EpiNow2::Normal(mean = log_sd, sd = 0.5), + max = 10 ) ``` +We can plot single and combined distributions generated by `{EpiNow2}` using `plot()`. Let's combine in one plot the delay from infection to report which includes the incubation period and reporting delay: + +```{r} +plot(incubation_period_variable + reporting_delay_variable) +``` + + +:::::::::::::::::: callout + If data is available on the time between symptom onset and reporting, we can use the function `estimate_delay()` to estimate a log normal distribution from a vector of delays. The code below illustrates how to use `estimate_delay()` with synthetic delay data. ```{r, eval = FALSE } delay_data <- rlnorm(500, log(5), 1) # synthetic delay data -reporting_delay <- estimate_delay( + +reporting_delay <- EpiNow2::estimate_delay( delay_data, samples = 1000, bootstraps = 10 ) ``` +:::::::::::::::::: #### Generation time We also must specify a distribution for the generation time. Here we will use a log normal distribution with mean 3.6 and standard deviation 3.1 ([Ganyani et al. 2020](https://doi.org/10.2807/1560-7917.ES.2020.25.17.2000257)). -```{r} -generation_time_variable <- dist_spec( - mean = 3.6, sd = 3.1, - mean_sd = 0.5, sd_sd = 0.5, - max = 20, distribution = "lognormal" +```{r,warning=FALSE,message=FALSE} +generation_time_variable <- EpiNow2::LogNormal( + mean = EpiNow2::Normal(mean = 3.6, sd = 0.5), + sd = EpiNow2::Normal(mean = 3.1, sd = 0.5), + max = 20 ) ``` @@ -306,24 +347,24 @@ generation_time_variable <- dist_spec( The function `epinow()` is a wrapper for the function `estimate_infections()` used to estimate cases by date of infection. The generation time distribution and delay distributions must be passed using the functions ` generation_time_opts()` and `delay_opts()` respectively. -There are numerous other inputs that can be passed to `epinow()`, see `EpiNow2::?epinow()` for more detail. -One optional input is to specify a log normal prior for the effective reproduction number $R_t$ at the start of the outbreak. We specify a mean and standard deviation as arguments of `prior` within `rt_opts()`: +There are numerous other inputs that can be passed to `epinow()`, see `?EpiNow2::epinow()` for more detail. +One optional input is to specify a *log normal* prior for the effective reproduction number $R_t$ at the start of the outbreak. We specify a mean of 2 days and standard deviation of 2 days as arguments of `prior` within `rt_opts()`: ```{r, eval = TRUE} -rt_log_mean <- convert_to_logmean(2, 1) -rt_log_sd <- convert_to_logsd(2, 1) -rt <- rt_opts(prior = list(mean = rt_log_mean, sd = rt_log_sd)) +# define Rt prior distribution +rt_prior <- EpiNow2::rt_opts(prior = base::list(mean = 2, sd = 2)) ``` ::::::::::::::::::::::::::::::::::::: callout + ### Bayesian inference using Stan The Bayesian inference is performed using MCMC methods with the program [Stan](https://mc-stan.org/). There are a number of default inputs to the Stan functions including the number of chains and number of samples per chain (see `?EpiNow2::stan_opts()`). To reduce computation time, we can run chains in parallel. To do this, we must set the number of cores to be used. By default, 4 MCMC chains are run (see `stan_opts()$chains`), so we can set an equal number of cores to be used in parallel as follows: -```{r} -withr::local_options(list(mc.cores = 4)) +```{r,warning=FALSE,message=FALSE} +withr::local_options(base::list(mc.cores = 4)) ``` To find the maximum number of available cores on your machine, use `parallel::detectCores()`. @@ -336,14 +377,16 @@ To find the maximum number of available cores on your machine, use `parallel::de ```{r, echo = TRUE} # fixed alternatives -generation_time_fixed <- dist_spec( - mean = 3.6, sd = 3.1, - max = 20, distribution = "lognormal" +generation_time_fixed <- EpiNow2::LogNormal( + mean = 3.6, + sd = 3.1, + max = 20 ) -reporting_delay_fixed <- dist_spec( - mean = log_mean, sd = log_sd, - max = 10, distribution = "lognormal" +reporting_delay_fixed <- EpiNow2::LogNormal( + mean = log_mean, + sd = log_sd, + max = 10 ) ``` @@ -352,18 +395,17 @@ reporting_delay_fixed <- dist_spec( Now you are ready to run `EpiNow2::epinow()` to estimate the time-varying reproduction number: ```{r, message = FALSE, eval = TRUE} -reported_cases <- cases[1:90, ] +reported_cases <- cases %>% + dplyr::slice_head(n = 90) -estimates <- epinow( +estimates <- EpiNow2::epinow( # cases - reported_cases = reported_cases, + data = reported_cases, # delays - generation_time = generation_time_opts(generation_time_fixed), - delays = delay_opts(incubation_period_fixed + reporting_delay_fixed), + generation_time = EpiNow2::generation_time_opts(generation_time_fixed), + delays = EpiNow2::delay_opts(incubation_period_fixed + reporting_delay_fixed), # prior - rt = rt_opts(prior = list(mean = rt_log_mean, sd = rt_log_sd)), - # computation (optional) - stan = stan_opts(samples = 1000, chains = 3) + rt = rt_prior ) ``` @@ -371,7 +413,15 @@ estimates <- epinow( ### Do not wait for this to continue -Using `stan = stan_opts()` is optional. For the purpose of this tutorial on reducing computation time, we specified a fixed number of `samples = 1000` and `chains = 3` to the `stan` argument using the `stan_opts()` function. We expect this to take approximately 3 minutes. +We can optionally use the `stan = stan_opts()` argument and function. For the purpose of this tutorial on reducing computation time, we can specify a fixed number of `samples = 1000` and `chains = 3` to the `stan` argument using the `stan_opts()` function. We expect this to take approximately 3 minutes. + +```r +# you can add the `stan` argument +EpiNow2::epinow( + ..., + stan = EpiNow2::stan_opts(samples = 1000, chains = 3) +) +``` **Remember:** Using an appropriate number of *samples* and *chains* is crucial for ensuring convergence and obtaining reliable estimates in Bayesian computations using Stan. Inadequate sampling or insufficient chains may lead to issues such as divergent transitions, impacting the accuracy and stability of the inference process. @@ -436,29 +486,48 @@ The outbreak data of the start of the COVID-19 pandemic from the United Kingdom + `region`: the region, + `confirm`: number of confirmed cases for a region on a given date. -```{r} -regional_cases <- - incidence2::covidregionaldataUK[, c("date", "cases_new", "region")] -colnames(regional_cases) <- c("date", "confirm", "region") +```{r,warning=FALSE,message=FALSE} +regional_cases <- incidence2::covidregionaldataUK %>% + # use {tidyr} to preprocess missing values + tidyr::replace_na(base::list(cases_new = 0)) %>% + # use {incidence2} to convert aggregated data to incidence data + incidence2::incidence( + date_index = "date", + groups = "region", + counts = "cases_new", + count_values_to = "confirm", + date_names_to = "date", + complete_dates = TRUE + ) %>% + dplyr::select(-count_variable) + +# keep the first 90 dates for all regions + +# get vector of first 90 dates +date_range <- regional_cases %>% + dplyr::distinct(date) %>% + # from incidence2, dates are already arranged in ascendant order + dplyr::slice_head(n = 90) %>% + dplyr::pull(date) -# extract the first 90 dates for all regions -dates <- sort(unique(regional_cases$date))[1:90] -regional_cases <- regional_cases[which(regional_cases$date %in% dates), ] +# filter dates in date_range +regional_cases <- regional_cases %>% + dplyr::filter(magrittr::is_in(x = date, table = date_range)) -head(regional_cases) +dplyr::as_tibble(regional_cases) ``` To find regional estimates, we use the same inputs as `epinow()` to the function `regional_epinow()`: ```{r, message = FALSE, eval = TRUE} -estimates_regional <- regional_epinow( +estimates_regional <- EpiNow2::regional_epinow( # cases - reported_cases = regional_cases, + data = regional_cases, # delays - generation_time = generation_time_opts(generation_time_fixed), - delays = delay_opts(incubation_period_fixed + reporting_delay_fixed), + generation_time = EpiNow2::generation_time_opts(generation_time_fixed), + delays = EpiNow2::delay_opts(incubation_period_fixed + reporting_delay_fixed), # prior - rt = rt_opts(prior = list(mean = rt_log_mean, sd = rt_log_sd)) + rt = rt_prior ) estimates_regional$summary$summarised_results$table @@ -466,13 +535,13 @@ estimates_regional$summary$summarised_results$table estimates_regional$summary$plots$R ``` -:::::::::::::::::::::::::: testimonial + -### the i2extras package + -`{i2extras}` package also estimate transmission metrics like growth rate and doubling/halving time at different time intervals (i.e., days, weeks, or months). `{i2extras}` require `{incidence2}` objects as inputs. Read further in its [Fitting curves](https://www.reconverse.org/i2extras/articles/fitting_epicurves.html) vignette. + -:::::::::::::::::::::::::: + ## Summary diff --git a/episodes/read-cases.Rmd b/episodes/read-cases.Rmd index ac247d77..3f38fc1d 100644 --- a/episodes/read-cases.Rmd +++ b/episodes/read-cases.Rmd @@ -75,10 +75,9 @@ head(ebola_confirmed, 5) ```{r,eval=TRUE, echo=FALSE, message=FALSE} +# internal for DBI::dbWriteTable() # read data -case_data <- rio::import(file.path("data", "ebola_cases.csv")) -# preview data -head(case_data, 5) +ebola_confirmed <- rio::import(file.path("data", "ebola_cases.csv")) ``` Similarly, you can import files of other formats such as `tsv`, `xlsx`, ... etc. diff --git a/renv/activate.R b/renv/activate.R index a59fce49..d13f9932 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,11 +2,13 @@ local({ # the requested version of renv - version <- "1.0.3" + version <- "1.0.7" attr(version, "sha") <- NULL # the project directory - project <- getwd() + project <- Sys.getenv("RENV_PROJECT") + if (!nzchar(project)) + project <- getwd() # use start-up diagnostics if enabled diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE") @@ -129,6 +131,21 @@ local({ } + heredoc <- function(text, leave = 0) { + + # remove leading, trailing whitespace + trimmed <- gsub("^\\s*\\n|\\n\\s*$", "", text) + + # split into lines + lines <- strsplit(trimmed, "\n", fixed = TRUE)[[1L]] + + # compute common indent + indent <- regexpr("[^[:space:]]", lines) + common <- min(setdiff(indent, -1L)) - leave + paste(substring(lines, common), collapse = "\n") + + } + startswith <- function(string, prefix) { substring(string, 1, nchar(prefix)) == prefix } @@ -631,6 +648,9 @@ local({ # if the user has requested an automatic prefix, generate it auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) + if (is.na(auto) && getRversion() >= "4.4.0") + auto <- "TRUE" + if (auto %in% c("TRUE", "True", "true", "1")) return(renv_bootstrap_platform_prefix_auto()) @@ -822,24 +842,23 @@ local({ # the loaded version of renv doesn't match the requested version; # give the user instructions on how to proceed - remote <- if (!is.null(description[["RemoteSha"]])) { + dev <- identical(description[["RemoteType"]], "github") + remote <- if (dev) paste("rstudio/renv", description[["RemoteSha"]], sep = "@") - } else { + else paste("renv", description[["Version"]], sep = "@") - } # display both loaded version + sha if available friendly <- renv_bootstrap_version_friendly( version = description[["Version"]], - sha = description[["RemoteSha"]] + sha = if (dev) description[["RemoteSha"]] ) - fmt <- paste( - "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", - "- Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", - "- Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", - sep = "\n" - ) + fmt <- heredoc(" + renv %1$s was loaded from project library, but this project is configured to use renv %2$s. + - Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile. + - Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library. + ") catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) FALSE diff --git a/renv/profiles/lesson-requirements/renv.lock b/renv/profiles/lesson-requirements/renv.lock index 04278d0f..f391ea5c 100644 --- a/renv/profiles/lesson-requirements/renv.lock +++ b/renv/profiles/lesson-requirements/renv.lock @@ -1,22 +1,10 @@ { "R": { - "Version": "4.3.3", + "Version": "4.4.0", "Repositories": [ - { - "Name": "carpentries", - "URL": "https://carpentries.r-universe.dev" - }, - { - "Name": "carpentries_archive", - "URL": "https://carpentries.github.io/drat" - }, { "Name": "CRAN", "URL": "https://cran.rstudio.com" - }, - { - "Name": "RSPM", - "URL": "https://packagemanager.posit.co/cran/latest" } ] }, @@ -30,18 +18,18 @@ }, "DBI": { "Package": "DBI", - "Version": "1.2.1", + "Version": "1.2.3", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "methods" ], - "Hash": "9b4993e98e0e19da84c168460c032fef" + "Hash": "065ae649b05f1ff66bb0c793107508f5" }, "EpiNow2": { "Package": "EpiNow2", - "Version": "1.4.0", + "Version": "1.5.2", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -52,6 +40,7 @@ "RcppEigen", "RcppParallel", "StanHeaders", + "checkmate", "data.table", "futile.logger", "future", @@ -61,6 +50,7 @@ "lubridate", "methods", "patchwork", + "posterior", "progressr", "purrr", "rlang", @@ -72,11 +62,11 @@ "truncnorm", "utils" ], - "Hash": "e40c0a2ebd62f69b953b65e9678b2ffe" + "Hash": "22457d91d620923793295c76505bfe3d" }, "MASS": { "Package": "MASS", - "Version": "7.3-60.0.1", + "Version": "7.3-60.2", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -87,11 +77,11 @@ "stats", "utils" ], - "Hash": "b765b28387acc8ec9e9c1530713cb19c" + "Hash": "2f342c46163b0b54d7b64d1f798e2c78" }, "Matrix": { "Package": "Matrix", - "Version": "1.6-5", + "Version": "1.7-0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -104,19 +94,14 @@ "stats", "utils" ], - "Hash": "8c7115cd3a0e048bda2a7cd110549f7a" + "Hash": "1920b2f11133b12350024297d8a4ff4a" }, "QuickJSR": { "Package": "QuickJSR", - "Version": "1.1.3", + "Version": "1.2.2", "Source": "Repository", "Repository": "CRAN", - "Requirements": [ - "R6", - "Rcpp", - "jsonlite" - ], - "Hash": "765d4f4bcec02ed0663d4de3db23f6e5" + "Hash": "706b2f1907052a0082590a4f119402d6" }, "R.methodsS3": { "Package": "R.methodsS3", @@ -179,7 +164,7 @@ }, "RSQLite": { "Package": "RSQLite", - "Version": "2.3.5", + "Version": "2.3.7", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -194,7 +179,7 @@ "plogr", "rlang" ], - "Hash": "f5a75d57e0a3014a6ef537ac04a80fc6" + "Hash": "46b45a4dd7bb0e0f4e3fc22245817240" }, "Rcpp": { "Package": "Rcpp", @@ -209,7 +194,7 @@ }, "RcppEigen": { "Package": "RcppEigen", - "Version": "0.3.3.9.4", + "Version": "0.3.4.0.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -218,7 +203,7 @@ "stats", "utils" ], - "Hash": "acb0a5bf38490f26ab8661b467f4f53a" + "Hash": "df49e3306f232ec28f1604e36a202847" }, "RcppParallel": { "Package": "RcppParallel", @@ -232,7 +217,7 @@ }, "StanHeaders": { "Package": "StanHeaders", - "Version": "2.32.5", + "Version": "2.32.9", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -240,25 +225,7 @@ "RcppEigen", "RcppParallel" ], - "Hash": "b8d6850ef3e330bc108e712679e79443" - }, - "UpSetR": { - "Package": "UpSetR", - "Version": "1.4.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "ggplot2", - "grDevices", - "gridExtra", - "methods", - "plyr", - "scales", - "stats", - "utils" - ], - "Hash": "f6ef89503aaff474873f8bc1823894e1" + "Hash": "affbfba7203fd83b6594362f1355c25b" }, "abind": { "Package": "abind", @@ -274,7 +241,7 @@ }, "arm": { "Package": "arm", - "Version": "1.13-1", + "Version": "1.14-4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -291,7 +258,7 @@ "stats", "utils" ], - "Hash": "ecd1fd4d4ea49df1b62fb706c37785ac" + "Hash": "4f37635d4d4315785c975b0d89fb8a39" }, "arsenal": { "Package": "arsenal", @@ -318,13 +285,13 @@ }, "backports": { "Package": "backports", - "Version": "1.4.1", + "Version": "1.5.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "c39fbec8a30d23e721980b8afb31984c" + "Hash": "e1e1b9d75c37401117b636b7ae50827a" }, "base64enc": { "Package": "base64enc", @@ -374,7 +341,7 @@ }, "boot": { "Package": "boot", - "Version": "1.3-28.1", + "Version": "1.3-30", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -382,28 +349,27 @@ "graphics", "stats" ], - "Hash": "9a052fbcbe97a98ceb18dbfd30ebd96e" + "Hash": "96abeed416a286d4a0f52e550b612343" }, "brio": { "Package": "brio", - "Version": "1.1.4", + "Version": "1.1.5", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "68bd2b066e1fe780bbf62fc8bcc36de3" + "Hash": "c1ee497a6d999947c2c224ae46799b1a" }, "broom": { "Package": "broom", - "Version": "1.0.5", + "Version": "1.0.6", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "backports", "dplyr", - "ellipsis", "generics", "glue", "lifecycle", @@ -413,17 +379,18 @@ "tibble", "tidyr" ], - "Hash": "fd25391c3c4f6ecf0fa95f1e6d15378c" + "Hash": "a4652c36d1f8abfc3ddf4774f768c934" }, "bslib": { "Package": "bslib", - "Version": "0.6.1", + "Version": "0.7.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "base64enc", "cachem", + "fastmap", "grDevices", "htmltools", "jquerylib", @@ -434,22 +401,22 @@ "rlang", "sass" ], - "Hash": "c0d8599494bc7fb408cd206bbdd9cab0" + "Hash": "8644cc53f43828f19133548195d7e59e" }, "cachem": { "Package": "cachem", - "Version": "1.0.8", + "Version": "1.1.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "fastmap", "rlang" ], - "Hash": "c35768291560ce302c0a6589f92e837d" + "Hash": "cd9a672193789068eb5a2aad65a0dedf" }, "callr": { "Package": "callr", - "Version": "3.7.3", + "Version": "3.7.6", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -458,7 +425,7 @@ "processx", "utils" ], - "Hash": "9b2191ede20fa29828139b9900922e51" + "Hash": "d7e13f49c19103ece9e58ad2d83a7354" }, "cellranger": { "Package": "cellranger", @@ -508,32 +475,29 @@ "Version": "0.0.2", "Source": "GitHub", "RemoteType": "github", - "Remotes": "epiverse-trace/numberize", "RemoteHost": "api.github.com", "RemoteRepo": "cleanepi", "RemoteUsername": "epiverse-trace", "RemotePkgRef": "epiverse-trace/cleanepi", "RemoteRef": "HEAD", - "RemoteSha": "891aa9f90558f9effc73cd12606175a4336f3d39", + "RemoteSha": "4f1e888e6ec92eaa2c234a698508233a0e35a65a", "Requirements": [ - "R.utils", "arsenal", "checkmate", "dplyr", - "glue", "janitor", "linelist", "lubridate", "magrittr", "matchmaker", - "naniar", "numberize", "readr", + "rlang", "snakecase", - "stringr", - "utils" + "utils", + "withr" ], - "Hash": "14303262935716a84136af3ba86f3c1f" + "Hash": "a764d610b3572d869fdc56e39f5f9033" }, "cli": { "Package": "cli", @@ -569,13 +533,13 @@ }, "codetools": { "Package": "codetools", - "Version": "0.2-19", + "Version": "0.2-20", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "c089a619a7fae175d149d89164f8c7d8" + "Hash": "61e097f35917d342622f21cdc79c256e" }, "colorspace": { "Package": "colorspace", @@ -606,13 +570,13 @@ }, "countrycode": { "Package": "countrycode", - "Version": "1.5.0", + "Version": "1.6.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "bbc5ab5258e5ddf38f2cd2c5a7afa860" + "Hash": "08b7058813f13c7a1bb294fea9045e3a" }, "cpp11": { "Package": "cpp11", @@ -638,28 +602,28 @@ }, "curl": { "Package": "curl", - "Version": "5.2.0", + "Version": "5.2.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "ce88d13c0b10fe88a37d9c59dba2d7f9" + "Hash": "411ca2c03b1ce5f548345d2fc2685f7a" }, "data.table": { "Package": "data.table", - "Version": "1.15.0", + "Version": "1.15.4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "methods" ], - "Hash": "cfbbb4aed6e78cd45f17123a9ec9981a" + "Hash": "8ee9ac56ef633d0c7cab8b2ca87d683e" }, "dbplyr": { "Package": "dbplyr", - "Version": "2.4.0", + "Version": "2.5.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -683,7 +647,7 @@ "vctrs", "withr" ], - "Hash": "59351f28a81f0742720b85363c4fdd61" + "Hash": "39b2e002522bfd258039ee4e889e0fd1" }, "desc": { "Package": "desc", @@ -715,14 +679,14 @@ }, "digest": { "Package": "digest", - "Version": "0.6.34", + "Version": "0.6.35", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "utils" ], - "Hash": "7ede2ee9ea8d3edbf1ca84c1e333ad1a" + "Hash": "698ece7ba5a4fa4559e3d537e7ec3d31" }, "distcrete": { "Package": "distcrete", @@ -733,23 +697,19 @@ }, "distributional": { "Package": "distributional", - "Version": "0.3.2", + "Version": "0.4.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ - "digest", - "farver", "generics", - "ggplot2", "lifecycle", "numDeriv", "rlang", - "scales", "stats", "utils", "vctrs" ], - "Hash": "0a94c3c917918a1c90f4609171ff41b6" + "Hash": "3bad76869f2257ea4fd00a3c08c2bcce" }, "dotCall64": { "Package": "dotCall64", @@ -803,36 +763,29 @@ ], "Hash": "54ed3ea01b11e81a86544faaecfef8e2" }, - "ellipsis": { - "Package": "ellipsis", - "Version": "0.3.2", - "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ - "R", - "rlang" - ], - "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" - }, "epiparameter": { "Package": "epiparameter", - "Version": "0.0.0.9000", + "Version": "0.1.0.9000", "Source": "GitHub", "RemoteType": "github", + "RemoteHost": "api.github.com", "RemoteUsername": "epiverse-trace", "RemoteRepo": "epiparameter", - "RemoteRef": "HEAD", - "RemoteSha": "7c5a0fb9c732fbfe45177ef055f66e75063e460a", - "RemoteHost": "api.github.com", + "RemoteRef": "main", + "RemoteSha": "0f805b90f984def4851a78148f1cf44c3d480845", "Requirements": [ "R", "checkmate", + "cli", "distcrete", "distributional", + "graphics", + "pillar", + "rlang", "stats", "utils" ], - "Hash": "024a8c8a100fcd73dcf92522d7ef2e35" + "Hash": "739fc2a8d826daffda31a1e639a7dcfa" }, "evaluate": { "Package": "evaluate", @@ -859,17 +812,17 @@ }, "farver": { "Package": "farver", - "Version": "2.1.1", + "Version": "2.1.2", "Source": "Repository", "Repository": "CRAN", - "Hash": "8106d78941f34855c440ddb946b8f7a5" + "Hash": "680887028577f3fa2a81e410ed0d6e42" }, "fastmap": { "Package": "fastmap", - "Version": "1.1.1", + "Version": "1.2.0", "Source": "Repository", "Repository": "CRAN", - "Hash": "f7736a18de97dea803bde0a2daaafb27" + "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" }, "fields": { "Package": "fields", @@ -938,14 +891,14 @@ }, "fs": { "Package": "fs", - "Version": "1.6.3", + "Version": "1.6.4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "methods" ], - "Hash": "47b5f30c720c23999b913a1a635cf0bb" + "Hash": "15aeb8c27f5ea5161f9f6a641fafd93a" }, "futile.logger": { "Package": "futile.logger", @@ -972,7 +925,7 @@ }, "future": { "Package": "future", - "Version": "1.33.1", + "Version": "1.33.2", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -983,11 +936,11 @@ "parallelly", "utils" ], - "Hash": "e57e292737f7a4efa9d8a91c5908222c" + "Hash": "fd7b1d69d16d0d114e4fa82db68f184c" }, "future.apply": { "Package": "future.apply", - "Version": "1.11.1", + "Version": "1.11.2", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -997,7 +950,7 @@ "parallel", "utils" ], - "Hash": "455e00c16ec193c8edcf1b2b522b3288" + "Hash": "afe1507511629f44572e6c53b9baeb7c" }, "gargle": { "Package": "gargle", @@ -1034,7 +987,7 @@ }, "ggplot2": { "Package": "ggplot2", - "Version": "3.4.4", + "Version": "3.5.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1055,18 +1008,18 @@ "vctrs", "withr" ], - "Hash": "313d31eff2274ecf4c1d3581db7241f9" + "Hash": "44c6a2f8202d5b7e878ea274b1092426" }, "globals": { "Package": "globals", - "Version": "0.16.2", + "Version": "0.16.3", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "codetools" ], - "Hash": "baa9585ab4ce47a9f4618e671778cc6f" + "Hash": "2580567908cafd4f187c1e5a91e98b7f" }, "glue": { "Package": "glue", @@ -1134,10 +1087,14 @@ }, "grates": { "Package": "grates", - "Version": "1.1.0", + "Version": "1.2.1", "Source": "Repository", "Repository": "CRAN", - "Hash": "c937fa4cc110a4aabae986a6393dfb15" + "Requirements": [ + "R", + "utils" + ], + "Hash": "077185d8236bfbb0225d6d7a370bbfae" }, "gridExtra": { "Package": "gridExtra", @@ -1155,7 +1112,7 @@ }, "gtable": { "Package": "gtable", - "Version": "0.3.4", + "Version": "0.3.5", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1166,7 +1123,7 @@ "lifecycle", "rlang" ], - "Hash": "b29cf3031f49b04ab9c852c912547eef" + "Hash": "e18861963cbc65a27736e02b3cd3c4a0" }, "haven": { "Package": "haven", @@ -1189,26 +1146,16 @@ ], "Hash": "9171f898db9d9c4c1b2c745adc2c1ef1" }, - "here": { - "Package": "here", - "Version": "1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "rprojroot" - ], - "Hash": "24b224366f9c2e7534d2344d10d59211" - }, "highr": { "Package": "highr", - "Version": "0.10", + "Version": "0.11", "Source": "Repository", - "Repository": "RSPM", + "Repository": "CRAN", "Requirements": [ "R", "xfun" ], - "Hash": "06230136b2d2b9ba5805e1963fa6e890" + "Hash": "d65ba49117ca223614f71b60d85b8ab7" }, "hms": { "Package": "hms", @@ -1226,20 +1173,19 @@ }, "htmltools": { "Package": "htmltools", - "Version": "0.5.7", + "Version": "0.5.8.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "base64enc", "digest", - "ellipsis", "fastmap", "grDevices", "rlang", "utils" ], - "Hash": "2d7b3857980e0e0d0a1fd6f11928ab0f" + "Hash": "81d371a9cc60640e74e4ab6ac46dcedc" }, "httr": { "Package": "httr", @@ -1291,18 +1237,25 @@ }, "incidence2": { "Package": "incidence2", - "Version": "2.2.3", + "Version": "2.3.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "data.table", + "dplyr", "grDevices", "grates", "pillar", - "utils" + "rlang", + "stats", + "tibble", + "tidyr", + "tidyselect", + "utils", + "vctrs" ], - "Hash": "0e1c66f6d72eacacbd8fe6ba1ed85cc9" + "Hash": "48276866cc817bd5201d7eea7b4f3d53" }, "inline": { "Package": "inline", @@ -1369,7 +1322,7 @@ }, "knitr": { "Package": "knitr", - "Version": "1.45", + "Version": "1.47", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1381,7 +1334,7 @@ "xfun", "yaml" ], - "Hash": "1ec462871063897135c1bcbe0fc8f07d" + "Hash": "7c99b2d55584b982717fcc0950378612" }, "labeling": { "Package": "labeling", @@ -1407,7 +1360,7 @@ }, "lattice": { "Package": "lattice", - "Version": "0.22-5", + "Version": "0.22-6", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1418,7 +1371,7 @@ "stats", "utils" ], - "Hash": "7c5e89f04e72d6611c77451f6331a091" + "Hash": "cc5ac1ba4c238c7ca9fa6a87ca11a7e2" }, "lifecycle": { "Package": "lifecycle", @@ -1435,7 +1388,7 @@ }, "linelist": { "Package": "linelist", - "Version": "1.1.0", + "Version": "1.1.3", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1446,7 +1399,7 @@ "rlang", "tidyselect" ], - "Hash": "ffef5e34d44121c9808b03fca5db6bb2" + "Hash": "04c2949bdf494d59a1909b923c56a24a" }, "listenv": { "Package": "listenv", @@ -1460,7 +1413,7 @@ }, "lme4": { "Package": "lme4", - "Version": "1.1-35.1", + "Version": "1.1-35.3", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1482,11 +1435,11 @@ "stats", "utils" ], - "Hash": "07fb0c5b727b15b0ce40feb641498e4e" + "Hash": "862f9d995f528f3051f524791955b20c" }, "loo": { "Package": "loo", - "Version": "2.6.0", + "Version": "2.7.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1494,9 +1447,10 @@ "checkmate", "matrixStats", "parallel", + "posterior", "stats" ], - "Hash": "e5c8f41731502a0e98f353da23f7ca30" + "Hash": "7917e9c58d89dbb80d8eede166581fa0" }, "lubridate": { "Package": "lubridate", @@ -1547,13 +1501,13 @@ }, "matrixStats": { "Package": "matrixStats", - "Version": "1.2.0", + "Version": "1.3.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "33a3ca9e732b57244d14f5d732ffc9eb" + "Hash": "4b3ea27a19d669c0405b38134d89a9d1" }, "memoise": { "Package": "memoise", @@ -1595,13 +1549,13 @@ }, "minqa": { "Package": "minqa", - "Version": "1.2.6", + "Version": "1.2.7", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "Rcpp" ], - "Hash": "f48238f8d4740426ca12f53f27d004dd" + "Hash": "aba060ef3c097b26a4d304ea39d87f32" }, "modelr": { "Package": "modelr", @@ -1623,41 +1577,14 @@ }, "munsell": { "Package": "munsell", - "Version": "0.5.0", + "Version": "0.5.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "colorspace", "methods" ], - "Hash": "6dfe8bf774944bd5595785e3229d8771" - }, - "naniar": { - "Package": "naniar", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "UpSetR", - "cli", - "dplyr", - "forcats", - "ggplot2", - "glue", - "lifecycle", - "magrittr", - "norm", - "purrr", - "rlang", - "stats", - "tibble", - "tidyr", - "vctrs", - "viridis", - "visdat" - ], - "Hash": "74d1b68ee4d1e076dee034a9ef3acd41" + "Hash": "4fd8900853b746af55b81fda99da7695" }, "nlme": { "Package": "nlme", @@ -1683,16 +1610,6 @@ ], "Hash": "277c67a08f358f42b6a77826e4492f79" }, - "norm": { - "Package": "norm", - "Version": "1.0-11.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "stats" - ], - "Hash": "82d9d75b78bc83553c034cd5c7ed2b3c" - }, "numDeriv": { "Package": "numDeriv", "Version": "2016.8-1.1", @@ -1705,16 +1622,13 @@ }, "numberize": { "Package": "numberize", - "Version": "0.0.1", - "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteRepo": "numberize", - "RemoteUsername": "epiverse-trace", - "RemotePkgRef": "epiverse-trace/numberize", - "RemoteRef": "HEAD", - "RemoteSha": "f25903b8e42a2e9ad1ae04ea706cfdf2179196dc", - "Hash": "a801ada77eef7b3e9e506885c7a91428" + "Version": "1.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "36f35267920445fd52af1f328320f202" }, "oai": { "Package": "oai", @@ -1732,13 +1646,13 @@ }, "openssl": { "Package": "openssl", - "Version": "2.1.1", + "Version": "2.2.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "askpass" ], - "Hash": "2a0dc8c6adfb6f032e4d4af82d258ab5" + "Hash": "2bcca3848e4734eb3b16103bc9aa4b8e" }, "outbreaks": { "Package": "outbreaks", @@ -1752,7 +1666,7 @@ }, "parallelly": { "Package": "parallelly", - "Version": "1.36.0", + "Version": "1.37.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1760,7 +1674,7 @@ "tools", "utils" ], - "Hash": "bca377e1c87ec89ebed77bba00635b2e" + "Hash": "5410df8d22bd36e616f2a2343dbb328c" }, "patchwork": { "Package": "patchwork", @@ -1799,7 +1713,7 @@ }, "pkgbuild": { "Package": "pkgbuild", - "Version": "1.4.3", + "Version": "1.4.4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1810,7 +1724,7 @@ "desc", "processx" ], - "Hash": "c0143443203205e6a2760ce553dafc24" + "Hash": "a29e8e134a460a01e0ca67a4763c595b" }, "pkgconfig": { "Package": "pkgconfig", @@ -1861,6 +1775,28 @@ ], "Hash": "6b8177fd19982f0020743fadbfdbd933" }, + "posterior": { + "Package": "posterior", + "Version": "1.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "abind", + "checkmate", + "distributional", + "matrixStats", + "methods", + "parallel", + "pillar", + "rlang", + "stats", + "tensorA", + "tibble", + "vctrs" + ], + "Hash": "8dac526a34b9eb62305d16c04cb57837" + }, "praise": { "Package": "praise", "Version": "1.0.0", @@ -1880,16 +1816,16 @@ }, "processx": { "Package": "processx", - "Version": "3.8.3", + "Version": "3.8.4", "Source": "Repository", - "Repository": "RSPM", + "Repository": "CRAN", "Requirements": [ "R", "R6", "ps", "utils" ], - "Hash": "82d48b1aec56084d9438dbf98087a7e9" + "Hash": "0c90a7d71988856bad2a2a45dd871bb9" }, "progress": { "Package": "progress", @@ -1945,18 +1881,18 @@ }, "ragg": { "Package": "ragg", - "Version": "1.2.7", + "Version": "1.3.2", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "systemfonts", "textshaping" ], - "Hash": "90a1b8b7e518d7f90480d56453b4d062" + "Hash": "e3087db406e079a8a2fd87f413918ed3" }, "randomNames": { "Package": "randomNames", - "Version": "1.5-0.0", + "Version": "1.6-0.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -1965,7 +1901,7 @@ "data.table", "toOrdinal" ], - "Hash": "dbaba6859ce7a8d9265195153ab70fb7" + "Hash": "0fe1a98884093c87891c8bf5d789a801" }, "rappdirs": { "Package": "rappdirs", @@ -2032,6 +1968,16 @@ ], "Hash": "76c9e04c712a05848ae7a23d2f170a40" }, + "renv": { + "Package": "renv", + "Version": "1.0.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "397b7b2a265bc5a7a06852524dabae20" + }, "reprex": { "Package": "reprex", "Version": "2.1.0", @@ -2056,7 +2002,7 @@ }, "rio": { "Package": "rio", - "Version": "1.0.1", + "Version": "1.1.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2067,30 +2013,30 @@ "foreign", "haven", "lifecycle", + "readr", "readxl", "stats", - "stringi", "tibble", "tools", "utils", "writexl" ], - "Hash": "8e63a1ebe85848713226eb395cba420b" + "Hash": "378e96850ea82b323733b662d9f5c152" }, "rlang": { "Package": "rlang", - "Version": "1.1.3", + "Version": "1.1.4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "utils" ], - "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" + "Hash": "3eec01f8b1dee337674b2e34ab1f9bc1" }, "rmarkdown": { "Package": "rmarkdown", - "Version": "2.25", + "Version": "2.27", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2103,14 +2049,13 @@ "jsonlite", "knitr", "methods", - "stringr", "tinytex", "tools", "utils", "xfun", "yaml" ], - "Hash": "d65e35823c817f09f4de424fcdfa812a" + "Hash": "27f9502e1cdbfa195f94e03b0f517484" }, "rprojroot": { "Package": "rprojroot", @@ -2124,7 +2069,7 @@ }, "rstan": { "Package": "rstan", - "Version": "2.32.5", + "Version": "2.32.6", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2143,7 +2088,7 @@ "pkgbuild", "stats4" ], - "Hash": "378a10b6373822761ec78021c105b059" + "Hash": "8a5b5978f888a3477c116e0395d006f8" }, "rstantools": { "Package": "rstantools", @@ -2161,14 +2106,14 @@ }, "rstudioapi": { "Package": "rstudioapi", - "Version": "0.15.0", + "Version": "0.16.0", "Source": "Repository", "Repository": "CRAN", - "Hash": "5564500e25cffad9e22244ced1379887" + "Hash": "96710351d642b70e8f02ddeb237c46a7" }, "runner": { "Package": "runner", - "Version": "0.4.3", + "Version": "0.4.4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2177,11 +2122,11 @@ "methods", "parallel" ], - "Hash": "468ad9a689459cd083a686232eb3ea31" + "Hash": "28a8c14ad9f77d5b275938c65128c7e7" }, "rvest": { "Package": "rvest", - "Version": "1.0.3", + "Version": "1.0.4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2194,14 +2139,13 @@ "rlang", "selectr", "tibble", - "withr", "xml2" ], - "Hash": "a4a5ac819a467808c60e36e92ddf195e" + "Hash": "0bcf0c6f274e90ea314b812a6d19a519" }, "sass": { "Package": "sass", - "Version": "0.4.8", + "Version": "0.4.9", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2211,7 +2155,7 @@ "rappdirs", "rlang" ], - "Hash": "168f9353c76d4c4b0a0bbf72e2c2d035" + "Hash": "d53dbfddf695303ea4ad66f86e99b95d" }, "scales": { "Package": "scales", @@ -2248,16 +2192,16 @@ }, "simulist": { "Package": "simulist", - "Version": "0.2.0.9000", + "Version": "0.3.0", "Source": "GitHub", - "Remotes": "epiverse-trace/epiparameter", "RemoteType": "github", + "Remotes": "epiverse-trace/epiparameter", "RemoteHost": "api.github.com", "RemoteRepo": "simulist", "RemoteUsername": "epiverse-trace", "RemotePkgRef": "epiverse-trace/simulist", "RemoteRef": "HEAD", - "RemoteSha": "4c54346f6423e40f84d10f82d29e73fab75abe45", + "RemoteSha": "4dde87cde1c5a4310abe6b39c2c04ceac79b5761", "Requirements": [ "R", "checkmate", @@ -2266,7 +2210,7 @@ "rlang", "stats" ], - "Hash": "352c7b36c58b74fba0a2fe58b524daab" + "Hash": "c452128ef4252d6d71b9a4e37e903c3e" }, "snakecase": { "Package": "snakecase", @@ -2282,7 +2226,7 @@ }, "socialmixr": { "Package": "socialmixr", - "Version": "0.3.1", + "Version": "0.3.2", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2294,12 +2238,13 @@ "grDevices", "httr", "jsonlite", + "lifecycle", "lubridate", "oai", "wpp2017", "xml2" ], - "Hash": "216ff8ff8fd4793dc7e80d69fa955671" + "Hash": "45662d7e3ca41647455b89c74eb28abf" }, "spam": { "Package": "spam", @@ -2317,7 +2262,7 @@ }, "stringi": { "Package": "stringi", - "Version": "1.8.3", + "Version": "1.8.4", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2326,7 +2271,7 @@ "tools", "utils" ], - "Hash": "058aebddea264f4c99401515182e656a" + "Hash": "39e1144fd75428983dc3f63aa53dfa91" }, "stringr": { "Package": "stringr", @@ -2377,18 +2322,30 @@ }, "systemfonts": { "Package": "systemfonts", - "Version": "1.0.5", + "Version": "1.1.0", "Source": "Repository", - "Repository": "RSPM", + "Repository": "CRAN", "Requirements": [ "R", - "cpp11" + "cpp11", + "lifecycle" + ], + "Hash": "213b6b8ed5afbf934843e6c3b090d418" + }, + "tensorA": { + "Package": "tensorA", + "Version": "0.36.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats" ], - "Hash": "15b594369e70b975ba9f064295983499" + "Hash": "0d587599172f2ffda2c09cb6b854e0e5" }, "testthat": { "Package": "testthat", - "Version": "3.2.1", + "Version": "3.2.1.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2413,19 +2370,20 @@ "waldo", "withr" ], - "Hash": "4767a686ebe986e6cb01d075b3f09729" + "Hash": "3f6e7e5e2220856ff865e4834766bf2b" }, "textshaping": { "Package": "textshaping", - "Version": "0.3.7", + "Version": "0.4.0", "Source": "Repository", - "Repository": "RSPM", + "Repository": "CRAN", "Requirements": [ "R", "cpp11", + "lifecycle", "systemfonts" ], - "Hash": "997aac9ad649e0ef3b97f96cddd5622b" + "Hash": "5142f8bc78ed3d819d26461b641627ce" }, "tibble": { "Package": "tibble", @@ -2471,7 +2429,7 @@ }, "tidyselect": { "Package": "tidyselect", - "Version": "1.2.0", + "Version": "1.2.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -2483,7 +2441,7 @@ "vctrs", "withr" ], - "Hash": "79540e5fcd9e0435af547d885f184fd5" + "Hash": "829f27b9c4919c16b593794a6344d6c0" }, "tidyverse": { "Package": "tidyverse", @@ -2538,13 +2496,13 @@ }, "tinytex": { "Package": "tinytex", - "Version": "0.49", + "Version": "0.51", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "xfun" ], - "Hash": "5ac22900ae0f386e54f1c307eca7d843" + "Hash": "d44e2fcd2e4e076f0aac540208559d1d" }, "toOrdinal": { "Package": "toOrdinal", @@ -2568,7 +2526,7 @@ "RemoteUsername": "epiverse-trace", "RemotePkgRef": "epiverse-trace/tracetheme", "RemoteRef": "HEAD", - "RemoteSha": "26a8d219e2a5d1a47328e7905a2d3e2c0436f74c", + "RemoteSha": "caff2f46c93c27d0bf2bffda6ef2eefff3ba125e", "Requirements": [ "R", "curl", @@ -2576,7 +2534,7 @@ "jsonlite", "sysfonts" ], - "Hash": "735ab1bcf7d41136798d449130d7a9cc" + "Hash": "35df9befd59fec43bdcf3adcaa27c8d9" }, "truncnorm": { "Package": "truncnorm", @@ -2633,19 +2591,6 @@ ], "Hash": "c03fa420630029418f7e6da3667aac4a" }, - "viridis": { - "Package": "viridis", - "Version": "0.6.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "ggplot2", - "gridExtra", - "viridisLite" - ], - "Hash": "acd96d9fa70adeea4a5a1150609b9745" - }, "viridisLite": { "Package": "viridisLite", "Version": "0.4.2", @@ -2656,28 +2601,6 @@ ], "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" }, - "visdat": { - "Package": "visdat", - "Version": "0.6.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "dplyr", - "forcats", - "ggplot2", - "glue", - "magrittr", - "purrr", - "readr", - "scales", - "stats", - "tibble", - "tidyr" - ], - "Hash": "aa0c558f21cab0196eea9b51433f2c0e" - }, "vroom": { "Package": "vroom", "Version": "1.6.5", @@ -2754,14 +2677,15 @@ }, "xfun": { "Package": "xfun", - "Version": "0.41", + "Version": "0.44", "Source": "Repository", "Repository": "CRAN", "Requirements": [ + "grDevices", "stats", "tools" ], - "Hash": "460a5e0fe46a80ef87424ad216028014" + "Hash": "317a0538d32f4a009658bcedb7923f4b" }, "xml2": { "Package": "xml2",