From 48fed90b17216586f3d22d54d8ff4d6eca4d345b Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 13 Jul 2023 10:12:53 +0100 Subject: [PATCH 01/40] test 2 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 15ad67a..c2b1350 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ epireview is a tool to obtain the latest data from the Pathogen Epidemiology Review Group (PERG) and contains tools to update data from new, peer-reviewed papers for existing pathogens in the database or to add entirely new pathogens. To install the latest version, use: + ```r devtools::install_github("mrc-ide/epireview", build_vignettes = TRUE) ``` From 47b9332ce018820bab06baf61edd9f1724d4609e Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 13 Jul 2023 12:54:03 +0100 Subject: [PATCH 02/40] start dataset documentation --- R/data.R | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 R/data.R diff --git a/R/data.R b/R/data.R new file mode 100644 index 0000000..b606537 --- /dev/null +++ b/R/data.R @@ -0,0 +1,65 @@ +#' Data on the models identified in the systematic review of Marburg articles +#' +#' @description +#' +#' This data set gives: +#' +#' XXYY +#' +#' @name marburg_model.csv +#' @docType data +#' @format A csv file containing the following parameters: +#' +#' XXYY +#' +#' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +#' et al. Marburg Virus Disease outbreaks, mathematical models, and disease +#' parameters: a Systematic Review [Internet]. medRxiv; 2023 [cited 2023 Jul 13]. +#' p. 2023.07.10.23292424. +#' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +#' +NULL + +#' Data on the outbreaks identified in the systematic review of Marburg articles +#' +#' @description +#' +#' This data set gives: +#' +#' XXYY +#' +#' @name marburg_outbreak.csv +#' @docType data +#' @format A csv file containing the following parameters: +#' +#' XXYY +#' +#' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +#' et al. Marburg Virus Disease outbreaks, mathematical models, and disease +#' parameters: a Systematic Review [Internet]. medRxiv; 2023 [cited 2023 Jul 13]. +#' p. 2023.07.10.23292424. +#' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +#' +NULL + +#' Data on the parameters identified in the systematic review of Marburg articles +#' +#' @description +#' +#' This data set gives: +#' +#' XXYY +#' +#' @name marburg_parameter.csv +#' @docType data +#' @format A csv file containing the following parameters: +#' +#' XXYY +#' +#' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +#' et al. Marburg Virus Disease outbreaks, mathematical models, and disease +#' parameters: a Systematic Review [Internet]. medRxiv; 2023 [cited 2023 Jul 13]. +#' p. 2023.07.10.23292424. +#' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +#' +NULL From 673c5344b9c76d5c0375b299f2bc0f0e621dfea3 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 13 Jul 2023 14:35:55 +0100 Subject: [PATCH 03/40] code cleaning, but article label missing --- R/forest_plot_delays.R | 111 ++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 63 deletions(-) diff --git a/R/forest_plot_delays.R b/R/forest_plot_delays.R index 640b24d..4fac3c8 100644 --- a/R/forest_plot_delays.R +++ b/R/forest_plot_delays.R @@ -1,7 +1,10 @@ #' Create forest plot for delays #' -#' @param df data with outbreak information +#' @param df data with parameter information #' @return returns flextable +#' @importFrom dplyr filter mutate group_by arrange +#' @importFrom stringr str_to_sentence +#' #' @examples #' #' @export @@ -10,78 +13,60 @@ forest_plot_delay <- function(df){ parameter <- "Human delay" df_delay <- df %>% - dplyr::filter(parameter_class == parameter) %>% - dplyr::mutate(parameter_value = as.numeric(parameter_value)) %>% - mutate(parameter_type_short = ifelse(parameter_type=="Human delay - generation time","Generation time", - ifelse(parameter_type=="Human delay - incubation period", - "Incubation period", - ifelse(parameter_type=="Human delay - time in care","Time in care", - ifelse(parameter_type=="Human delay - time symptom to careseeking","Time symptom to careseeking", - ifelse(parameter_type=="Human delay - time symptom to outcome" & riskfactor_outcome=="Death","Time symptom to outcome (Death)", - ifelse(parameter_type=="Human delay - time symptom to outcome" & riskfactor_outcome=="Other","Time symptom to outcome (Other)",NA))))))) %>% - dplyr::group_by(parameter_type_short) %>% - dplyr::arrange(first_author_surname) - - #dplyr::filter(parameter_type != "Human delay - generation time") + filter(parameter_class == parameter) %>% + mutate(parameter_value = as.numeric(parameter_value)) %>% + mutate(parameter_type_short = gsub("^Human delay - ", "", parameter_type)) %>% + mutate(parameter_type_short = + ifelse( + parameter_type_short == "time symptom to outcome" & + riskfactor_outcome == "Death", "Time symptom to outcome (Death)", + ifelse( + parameter_type_short == "time symptom to outcome" & + riskfactor_outcome == "Other", "Time symptom to outcome (Other)", + parameter_type_short))) %>% + mutate(parameter_type_short = str_to_sentence(parameter_type_short)) %>% + group_by(parameter_type_short) df_plot <- df_delay %>% - dplyr::filter(parameter_class == parameter) %>% - dplyr::mutate(parameter_value = as.numeric(parameter_value)) %>% - dplyr::group_by(parameter_type_short) %>% ### median function not behaving in ggplot so going with this even with grouping - mutate(median = median(parameter_value,na.rm=TRUE)) %>% - dplyr::arrange(desc(parameter_type_short), desc(parameter_value), desc(article_label)) + filter(parameter_class == parameter) %>% + mutate(parameter_value = as.numeric(parameter_value)) %>% + group_by(parameter_type_short) %>% + mutate(median = median(parameter_value, na.rm=TRUE)) %>% + arrange(desc(parameter_type_short), desc(parameter_value), desc(article_label)) df_plot$article_label_unique <- make.unique(df_plot$article_label) df_plot$article_label_unique <- factor(df_plot$article_label_unique, levels = df_plot$article_label_unique) - plot <- - ggplot(df_plot, aes(col = parameter_type_short)) + + plot <- ggplot(df_plot, aes(col = parameter_type_short)) + theme_bw() + - geom_point(aes(x=parameter_value, y=article_label_unique, shape = parameter_value_type, - ), - size = 3.5) + - scale_y_discrete(labels = setNames(df_plot$article_label, df_plot$article_label_unique)) + + geom_point(aes(x = parameter_value, y = article_label_unique, + shape = parameter_value_type), size = 3.5) + + scale_y_discrete(labels = setNames(df_plot$article_label, + df_plot$article_label_unique)) + scale_x_continuous(breaks = c(seq(0, 60, by = 10))) + - # facet_wrap(parameter_type ~ ., scales = "free", strip.position = "top", ncol = 1) + - geom_segment(aes( y=article_label_unique, yend = article_label_unique, - x=parameter_lower_bound, xend=parameter_upper_bound, - group=parameter_data_id, - # linetype="Parameter range" - ), - # position=position_dodge(width=0.5), - # width=0.4, - lwd=5, - alpha = 0.4) + - geom_errorbar(aes(y=article_label_unique, - xmin=parameter_uncertainty_lower_value, xmax=parameter_uncertainty_upper_value, - group=parameter_data_id, - # linetype="Uncertainty interval" - ), - # position=position_dodge(width=0.5), - width = 0.4, - lwd=1) + - labs(x="Delay (days)", - y="",#y="Study (First author surname and publication year)", - linetype="", - colour="", - shape = '', - caption = '*Solid transparent rectangles refer to parameter ranges while the error bars are uncertainty intervals.') + - # scale_linetype_manual(values = c("blank",'solid'), - # labels = function(x) str_wrap(x, width = 5)) + - scale_color_brewer(palette = 'Dark2',#end=0.9, + geom_segment(aes(y = article_label_unique, yend = article_label_unique, + x = parameter_lower_bound, xend = parameter_upper_bound, + group = parameter_data_id), lwd=5, alpha = 0.4) + + geom_errorbar(aes(y = article_label_unique, + xmin = parameter_uncertainty_lower_value, + xmax = parameter_uncertainty_upper_value, + group = parameter_data_id), width = 0.4, lwd = 1) + + labs(x = "Delay (days)", + y = "", + linetype = "", + colour = "", + shape = "", + caption = '*Solid transparent rectangles refer to parameter ranges + while the error bars are uncertainty intervals.') + + scale_color_brewer(palette = 'Dark2', labels = function(x) str_wrap(x, width = 18))+ - scale_shape_manual(values = c(16,15,17,18), - labels = c('Mean','Median','Std Dev', 'Other'), + scale_shape_manual(values = c(16, 15, 17, 18), + labels = c('Mean', 'Median', 'Std Dev', 'Other'), na.translate = F) + - # scale_colour_discrete(labels = c("Incubation period", - # "Time in care", - # "Symptom to careseeking", - # "Symptom to outcome")) + - theme(#legend.position="bottom", - legend.text = element_text(size=12), - strip.text = element_text(size=20)) + #xlim(c(0,56)) + - guides(colour = guide_legend(order=1,ncol =1), - linetype = guide_legend(order=2,ncol=1)) + theme(legend.text = element_text(size = 12), + strip.text = element_text(size = 20)) + + guides(colour = guide_legend(order = 1, ncol = 1), + linetype = guide_legend(order = 2, ncol = 1)) return(plot) From 114b66d25c5e1d3198a086b9f5eee34d1157627c Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 13 Jul 2023 14:50:04 +0100 Subject: [PATCH 04/40] add ggplot2 imports --- R/forest_plot_delays.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/forest_plot_delays.R b/R/forest_plot_delays.R index 4fac3c8..563b05e 100644 --- a/R/forest_plot_delays.R +++ b/R/forest_plot_delays.R @@ -2,8 +2,11 @@ #' #' @param df data with parameter information #' @return returns flextable -#' @importFrom dplyr filter mutate group_by arrange +#' @importFrom dplyr filter mutate group_by arrange desc #' @importFrom stringr str_to_sentence +#' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete scale_x_continuous +#' geom_segment geom_errorbar labs scale_color_brewer scale_shape_manual theme +#' guides #' #' @examples #' From 9bae08e9bec093ef6df540a4e107846745cbb068 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 13 Jul 2023 16:10:16 +0100 Subject: [PATCH 05/40] clean and update documentation for append_new_entry_to_table and forest_plot_delays --- NAMESPACE | 9 +++++ R/append_new_entry_to_table.R | 58 ++++++++++++++++++++------------ R/forest_plot_delays.R | 12 +++---- man/append_new_entry_to_table.Rd | 19 +++++++---- man/forest_plot_delay.Rd | 5 +-- 5 files changed, 67 insertions(+), 36 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 70e2ae6..81ad536 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -18,8 +18,10 @@ export(quality_assessment_plots) export(risk_table) export(sero_table) importFrom(dplyr,"%>%") +importFrom(dplyr,arrange) importFrom(dplyr,case_when) importFrom(dplyr,count) +importFrom(dplyr,desc) importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,mutate) @@ -30,19 +32,26 @@ importFrom(dplyr,ungroup) importFrom(ggplot2,aes) importFrom(ggplot2,coord_flip) importFrom(ggplot2,geom_bar) +importFrom(ggplot2,geom_errorbar) importFrom(ggplot2,geom_point) +importFrom(ggplot2,geom_segment) importFrom(ggplot2,geom_smooth) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggplot_add) +importFrom(ggplot2,guides) importFrom(ggplot2,labs) +importFrom(ggplot2,scale_color_brewer) importFrom(ggplot2,scale_fill_manual) +importFrom(ggplot2,scale_shape_manual) importFrom(ggplot2,scale_x_continuous) +importFrom(ggplot2,scale_y_discrete) importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(ggplot2,xlab) importFrom(ggplot2,ylab) importFrom(patchwork,wrap_plots) importFrom(readr,read_csv) +importFrom(stringr,str_to_sentence) importFrom(tibble,as_tibble) importFrom(tibble,as_tibble_row) importFrom(tidyr,pivot_longer) diff --git a/R/append_new_entry_to_table.R b/R/append_new_entry_to_table.R index 8204157..0a41f05 100644 --- a/R/append_new_entry_to_table.R +++ b/R/append_new_entry_to_table.R @@ -1,38 +1,54 @@ -#' append_new_entry_to_table +#' Append new entry to article, outbreak, model, or parameter table +#' +#' NOTE: This can only be run in a locally cloned repository #' #' @param pathogen name of pathogen -#' @param table_type -#' @param new_row all the required details for the new row +#' @param table_type table to be updated, either "article", "outbreak", "model" +#' or "parameter" +#' @param new_row the new row of data to be added to the table (must contain the +#' same number of variables as the table to be updated) #' @param validate check if the new row to be added passes minimum criteria -#' @param write_table write appended table -#' @return Null (updates table) -#' @examples +#' (either TRUE or FALSE) +#' @param write_table write appended table (either TRUE or FALSE). If TRUE the +#' new table will be written as a csv file in the data folder of a locally +#' cloned repository. +#' @return Null (updates relevant table in a locally cloned repository) #' #' @export -append_new_entry_to_table <- function(pathogen=NA, table_type=NA, new_row=NA, validate = TRUE, write_table = FALSE, vignette_prepend = "") +append_new_entry_to_table <- function(pathogen = NA, + table_type = NA, + new_row = NA, + validate = TRUE, + write_table = FALSE, + vignette_prepend = "") { - old_table <- load_data(table_type =table_type,pathogen = pathogen, vignette_prepend = vignette_prepend) + old_table <- load_data(table_type = table_type, + pathogen = pathogen, + vignette_prepend = vignette_prepend) - # check that schemas match - if(!((sum( colnames(new_row) == colnames(old_table) ) / length( colnames(new_row )) ) == 1)) + if(!((sum(colnames(new_row) == colnames(old_table)) / + length(colnames(new_row))) == 1)) stop('Schemas of new row and data sets do not match') - # check that the entry doesn't exist already -- create same for other table types as well - if( table_type=='article' & new_row$article_id %in% old_table$article_id) + if(table_type=='article' & new_row$article_id %in% old_table$article_id) stop('article_id already exists in the data set') - new_table <- rbind(old_table,new_row) + new_table <- rbind(old_table, new_row) if(validate) { - if(table_type=='article') # if not valid it will fail here. - create_new_article_entry(pathogen = pathogen, new_article = new_row %>% as.vector(), vignette_prepend = vignette_prepend) - if(table_type=='outbreak') # if not valid it will fail here. - create_new_outbreak_entry(pathogen = pathogen, new_outbreak = new_row %>% as.vector(), vignette_prepend = vignette_prepend) - if(table_type=='model') # if not valid it will fail here. - create_new_model_entry(pathogen = pathogen, new_model = new_row %>% as.vector(), vignette_prepend = vignette_prepend) - if(table_type=='parameter') # if not valid it will fail here. - create_new_parameter_entry(pathogen = pathogen, new_param = new_row %>% as.vector(), vignette_prepend = vignette_prepend) + if(table_type=='article') + create_new_article_entry(pathogen = pathogen, new_article = new_row %>% + as.vector(), vignette_prepend = vignette_prepend) + if(table_type=='outbreak') + create_new_outbreak_entry(pathogen = pathogen, new_outbreak = new_row %>% + as.vector(), vignette_prepend = vignette_prepend) + if(table_type=='model') + create_new_model_entry(pathogen = pathogen, new_model = new_row %>% + as.vector(), vignette_prepend = vignette_prepend) + if(table_type=='parameter') + create_new_parameter_entry(pathogen = pathogen, new_param = new_row %>% + as.vector(), vignette_prepend = vignette_prepend) } if(write_table) write.csv(new_table,paste0(vignette_prepend, 'data/', pathogen, '_', table_type, '.csv')) diff --git a/R/forest_plot_delays.R b/R/forest_plot_delays.R index 563b05e..5e0ba66 100644 --- a/R/forest_plot_delays.R +++ b/R/forest_plot_delays.R @@ -1,15 +1,13 @@ #' Create forest plot for delays #' -#' @param df data with parameter information -#' @return returns flextable +#' @param df processed data with parameter information (see vignette for each +#' pathogen) +#' @return returns flextable with a summary of the human delays #' @importFrom dplyr filter mutate group_by arrange desc #' @importFrom stringr str_to_sentence #' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete scale_x_continuous #' geom_segment geom_errorbar labs scale_color_brewer scale_shape_manual theme #' guides -#' -#' @examples -#' #' @export forest_plot_delay <- function(df){ @@ -38,7 +36,8 @@ forest_plot_delay <- function(df){ arrange(desc(parameter_type_short), desc(parameter_value), desc(article_label)) df_plot$article_label_unique <- make.unique(df_plot$article_label) - df_plot$article_label_unique <- factor(df_plot$article_label_unique, levels = df_plot$article_label_unique) + df_plot$article_label_unique <- factor(df_plot$article_label_unique, + levels = df_plot$article_label_unique) plot <- ggplot(df_plot, aes(col = parameter_type_short)) + theme_bw() + @@ -71,6 +70,5 @@ forest_plot_delay <- function(df){ guides(colour = guide_legend(order = 1, ncol = 1), linetype = guide_legend(order = 2, ncol = 1)) - return(plot) } diff --git a/man/append_new_entry_to_table.Rd b/man/append_new_entry_to_table.Rd index 45327dc..1a5b7f2 100644 --- a/man/append_new_entry_to_table.Rd +++ b/man/append_new_entry_to_table.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/append_new_entry_to_table.R \name{append_new_entry_to_table} \alias{append_new_entry_to_table} -\title{append_new_entry_to_table} +\title{Append new entry to article, outbreak, model, or parameter table} \usage{ append_new_entry_to_table( pathogen = NA, @@ -16,15 +16,22 @@ append_new_entry_to_table( \arguments{ \item{pathogen}{name of pathogen} -\item{new_row}{all the required details for the new row} +\item{table_type}{table to be updated, either "article", "outbreak", "model" +or "parameter"} -\item{validate}{check if the new row to be added passes minimum criteria} +\item{new_row}{the new row of data to be added to the table (must contain the +same number of variables as the table to be updated)} -\item{write_table}{write appended table} +\item{validate}{check if the new row to be added passes minimum criteria +(either TRUE or FALSE)} + +\item{write_table}{write appended table (either TRUE or FALSE). If TRUE the +new table will be written as a csv file in the data folder of a locally +cloned repository.} } \value{ -Null (updates table) +Null (updates relevant table in a locally cloned repository) } \description{ -append_new_entry_to_table +NOTE: This can only be run in a locally cloned repository } diff --git a/man/forest_plot_delay.Rd b/man/forest_plot_delay.Rd index 45961ed..61e8a75 100644 --- a/man/forest_plot_delay.Rd +++ b/man/forest_plot_delay.Rd @@ -7,10 +7,11 @@ forest_plot_delay(df) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with parameter information (see vignette for each +pathogen)} } \value{ -returns flextable +returns flextable with a summary of the human delays } \description{ Create forest plot for delays From 74d476ed6e79e0b4c12e0dcbd0022967a741aa4c Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 13 Jul 2023 16:35:02 +0100 Subject: [PATCH 06/40] edits for append_new_entry_to_table and create_new_article_entry --- NAMESPACE | 2 + R/append_new_entry_to_table.R | 6 ++- R/create_new_article_entry.R | 75 +++++++++++++++++--------------- man/append_new_entry_to_table.Rd | 6 ++- man/create_new_article_entry.Rd | 5 ++- 5 files changed, 54 insertions(+), 40 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 81ad536..1d360f5 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -26,6 +26,8 @@ importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,mutate) importFrom(dplyr,n) +importFrom(dplyr,rowwise) +importFrom(dplyr,select) importFrom(dplyr,starts_with) importFrom(dplyr,summarize) importFrom(dplyr,ungroup) diff --git a/R/append_new_entry_to_table.R b/R/append_new_entry_to_table.R index 0a41f05..dedd668 100644 --- a/R/append_new_entry_to_table.R +++ b/R/append_new_entry_to_table.R @@ -5,8 +5,10 @@ #' @param pathogen name of pathogen #' @param table_type table to be updated, either "article", "outbreak", "model" #' or "parameter" -#' @param new_row the new row of data to be added to the table (must contain the -#' same number of variables as the table to be updated) +#' @param new_row the new row of data to be added to the table, this can be +#' generated using either create_new_article_entry(), create_new_model_entry(), +#' create_new_outbreak_entry(), or create_new_parameter_entry() (must contain +#' the same number of variables as the table to be updated) #' @param validate check if the new row to be added passes minimum criteria #' (either TRUE or FALSE) #' @param write_table write appended table (either TRUE or FALSE). If TRUE the diff --git a/R/create_new_article_entry.R b/R/create_new_article_entry.R index 5e12cc5..15ec744 100644 --- a/R/create_new_article_entry.R +++ b/R/create_new_article_entry.R @@ -2,13 +2,12 @@ #' #' @param pathogen name of pathogen #' @param new_article all the required details for the new article -#' @param vignette_prepend string to allowing loading data from vignettes -#' @return return data for new row to be added with append_new_entry_to_table function -#' @importFrom tibble as_tibble -#' @importFrom tibble as_tibble_row -#' @importFrom validate validator -#' @importFrom validate confront -#' @importFrom validate summary +#' @param vignette_prepend string to allow loading data in vignettes +#' @return return new row of data to be added to the article data set using the +#' append_new_entry_to_table() function +#' @importFrom tibble as_tibble as_tibble_row +#' @importFrom validate validator confront summary +#' @importFrom dplyr rowwise mutate select filter #' @examples #' create_new_article_entry(pathogen = "marburg", new_article = c( list( "first_author_first_name" = as.character("Joe")), #' list( "first_author_surname" = as.character("Blocks")), @@ -54,21 +53,33 @@ create_new_article_entry <- function(pathogen = NA, vignette_prepend = "") { #read current article data for pathogen - old_articles <- as_tibble(load_data(table_type = 'article',pathogen = pathogen, vignette_prepend = vignette_prepend)) - new_row <- as_tibble_row(new_article) + old_articles <- as_tibble(load_data(table_type = 'article', + pathogen = pathogen, + vignette_prepend = vignette_prepend)) - # generate the below quanties - new_row$article_id <- max(old_articles$article_id) + 1 #in access db the article ids need to skip forward appropriately - new_row$covidence_id <- if(max(old_articles$covidence_id) > 1000000) max(old_articles$covidence_id) + 1 else max(old_articles$covidence_id) + 1000000 #this is to ensure we don't infer with natural covid_ids - new_row$pathogen <- switch(pathogen,"marburg"="Marburg virus", - "ebola"="Ebola virus", NA) #need to complete list for all pathogens + new_row <- as_tibble_row(new_article) + + # generate the below quantities + new_row$article_id <- max(old_articles$article_id) + 1 + new_row$covidence_id <- if(max(old_articles$covidence_id) > 1000000){ + max(old_articles$covidence_id) + 1 + } else { + max(old_articles$covidence_id) + 1000000 + } + + # update this as new pathogens are added + new_row$pathogen <- switch(pathogen, + "marburg" = "Marburg virus", + "ebola" = "Ebola virus", NA) new_row$double_extracted <- FALSE - new_row <- new_row %>% dplyr::rowwise() %>% mutate(score = mean(c(qa_m1,qa_m2,qa_a3,qa_a4,qa_d5,qa_d6,qa_d7),na.rm=TRUE)) %>% - dplyr::select(colnames(old_articles)) + new_row <- new_row %>% rowwise() %>% + mutate(score = mean(c(qa_m1, qa_m2, qa_a3, qa_a4, qa_d5, qa_d6, qa_d7), + na.rm = TRUE)) %>% + select(colnames(old_articles)) - sprintf("%s",colnames(old_articles)) - sprintf("%s",colnames(new_row)) + sprintf("%s", colnames(old_articles)) + sprintf("%s", colnames(new_row)) # check that article doesn't exist already in data by looking for doi (if it exists) if(is.character(new_row$doi) & new_row$doi %in% na.omit(old_articles$doi)) @@ -83,28 +94,24 @@ create_new_article_entry <- function(pathogen = NA, doi_is_character = is.character(doi), transmission_route_is_character = is.character(transmission_route), assumptions_is_character = is.character(assumptions), - code_available_check = code_available %in% c(0,1,NA), + code_available_check = code_available %in% c(0, 1, NA), outbreak_date_year_is_integer = is.integer(outbreak_date_year), outbreak_date_year_after_1800 = outbreak_date_year > 1800, - outbreak_date_year_not_future = outbreak_date_year < (as.integer(substring(Sys.Date(),1,4))+2), - qa_m1 = qa_m1 %in% c(0,1,NA), - qa_m2 = qa_m2 %in% c(0,1,NA), - qa_a3 = qa_a3 %in% c(0,1,NA), - qa_a4 = qa_a4 %in% c(0,1,NA), - qa_d5 = qa_d5 %in% c(0,1,NA), - qa_d6 = qa_d6 %in% c(0,1,NA), - qa_d7 = qa_d7 %in% c(0,1,NA) + outbreak_date_year_not_future = outbreak_date_year < (as.integer(substring(Sys.Date(), 1, 4)) + 2), + qa_m1 = qa_m1 %in% c(0, 1, NA), + qa_m2 = qa_m2 %in% c(0, 1, NA), + qa_a3 = qa_a3 %in% c(0, 1, NA), + qa_a4 = qa_a4 %in% c(0, 1, NA), + qa_d5 = qa_d5 %in% c(0, 1, NA), + qa_d6 = qa_d6 %in% c(0, 1, NA), + qa_d7 = qa_d7 %in% c(0, 1, NA) ) rules_output <- confront(new_row, rules) - rules_summary <- validate::summary(rules_output) + rules_summary <- summary(rules_output) - if(sum(rules_summary$fails)>0) - stop(as_tibble(rules_summary) %>% filter(fails>0) ) + if(sum(rules_summary$fails) > 0) + stop(as_tibble(rules_summary) %>% filter(fails > 0)) return(new_row) } - - - - diff --git a/man/append_new_entry_to_table.Rd b/man/append_new_entry_to_table.Rd index 1a5b7f2..85622c6 100644 --- a/man/append_new_entry_to_table.Rd +++ b/man/append_new_entry_to_table.Rd @@ -19,8 +19,10 @@ append_new_entry_to_table( \item{table_type}{table to be updated, either "article", "outbreak", "model" or "parameter"} -\item{new_row}{the new row of data to be added to the table (must contain the -same number of variables as the table to be updated)} +\item{new_row}{the new row of data to be added to the table, this can be +generated using either create_new_article_entry(), create_new_model_entry(), +create_new_outbreak_entry(), or create_new_parameter_entry() (must contain +the same number of variables as the table to be updated)} \item{validate}{check if the new row to be added passes minimum criteria (either TRUE or FALSE)} diff --git a/man/create_new_article_entry.Rd b/man/create_new_article_entry.Rd index 3f5a0c0..0417b5e 100644 --- a/man/create_new_article_entry.Rd +++ b/man/create_new_article_entry.Rd @@ -24,10 +24,11 @@ create_new_article_entry( \item{new_article}{all the required details for the new article} -\item{vignette_prepend}{string to allowing loading data from vignettes} +\item{vignette_prepend}{string to allow loading data in vignettes} } \value{ -return data for new row to be added with append_new_entry_to_table function +return new row of data to be added to the article data set using the +append_new_entry_to_table() function } \description{ Create new article entry From 1a54a9d444f4fe2095f0c9976b3c3b69d72ebcbb Mon Sep 17 00:00:00 2001 From: cm401 Date: Thu, 13 Jul 2023 16:55:35 +0100 Subject: [PATCH 07/40] Update pathogen_marburg.Rmd --- vignettes/pathogen_marburg.Rmd | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index 7f56b80..bd13891 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -13,11 +13,14 @@ vignette: > In 2018, the World Health Organization (WHO) published a list of nine known pathogens (in addition to an unknown _Pathogen X_) for research and development (R&D) prioritisation, due to both their epidemic and pandemic potential and the absence of licensed vaccines or therapeutics. Among these prioritised pathogens is MVD, a highly-lethal infectious _Filoviridae_ single-stranded RNA virus first described in Germany and Serbia (formerly Yugoslavia) in 1967. Subsequent outbreaks of this virus have primarily occurred in sub-Saharan Africa. The Pathogen Epidemiology Review Group (PERG) has published a Systemtic Review for MVD, if you use any of our results please cite our paper: > @article{marburg_systematic_review_2023, - author={}, + author = {Gina Cuomo-Dannenburg and Kelly McCain and Ruth McCabe and H Juliette T Unwin and Patrick Doohan and Rebecca K Nash and Joseph T Hicks and Kelly Charniga and Cyril Geismar and Ben Lambert and Dariya Nikitin and Janetta E Skarp and Jack Wardle and Pathogen Epidemiology Review Group and Mara Kont and Sangeeta Bhatia and Natsuko Imai and Sabine L van Elsland and Anne Cori and Christian Morgenstern}, year={2023}, title={{Marburg Virus Disease outbreaks, mathematical models, and disease parameters: a Systematic Review}}, - journal={}, - doi={}, + doi = {10.1101/2023.07.10.23292424}, + publisher = {Cold Spring Harbor Laboratory Press}, + URL = {https://www.medrxiv.org/content/early/2023/07/12/2023.07.10.23292424}, + eprint = {https://www.medrxiv.org/content/early/2023/07/12/2023.07.10.23292424.full.pdf}, + journal = {medRxiv} } All Tables and Figures from the paper are re-produced below on the **latest** available data in our data set. For convenience we label the Figures and Tables with the same numbers as in the paper. From bb3b9bbe537cda6820b97c80ddee67d3bb805e68 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 15:39:14 +0100 Subject: [PATCH 08/40] create_new_model_entry documentation --- R/create_new_model_entry.R | 121 ++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 57 deletions(-) diff --git a/R/create_new_model_entry.R b/R/create_new_model_entry.R index 17ab7f8..e203abe 100644 --- a/R/create_new_model_entry.R +++ b/R/create_new_model_entry.R @@ -1,89 +1,96 @@ #' Create new model entry #' #' @param pathogen name of pathogen -#' @param new_model all the required details for the new outbreak -#' @param vignette_prepend string to allowing loading data from vignettes -#' @return return data for new row to be added with append_new_entry_to_table function -#' @importFrom tibble as_tibble -#' @importFrom tibble as_tibble_row -#' @importFrom validate validator -#' @importFrom validate confront -#' @importFrom validate summary +#' @param new_model all the required details for the new model +#' @param vignette_prepend string to allow loading data in vignettes +#' @return return new row of data to be added to the model data set using the +#' append_new_entry_to_table() function +#' @importFrom tibble as_tibble as_tibble_row +#' @importFrom validate validator confront summary +#' @importFrom devtools load_data +#' @importFrom readr read_csv #' @examples -#' create_new_model_entry('marburg',new_model = c( list( "article_id" = as.integer(1)), -#' list( "model_type" = as.character("Compartmental")), -#' list( "compartmental_type" = as.character("SEIR,SIR")), -#' list( "stoch_deter" = as.character("Deterministic")), -#' list( "theoretical_model" = as.logical(FALSE)), -#' list( "interventions_type" = as.character("Vaccination")), -#' list( "code_available" = as.logical(TRUE)), -#' list( "transmission_route" = as.character("Sexual")), -#' list( "assumptions" = as.character("Unspecified")), -#' list( "covidence_id" = as.integer(2059))), -#' vignette_prepend = "") +#' create_new_model_entry( +#' pathogen = 'marburg', +#' new_model = c(list("article_id" = as.integer(1)), +#' list("model_type" = as.character("Compartmental")), +#' list("compartmental_type" = as.character("SEIR, SIR")), +#' list("stoch_deter" = as.character("Deterministic")), +#' list("theoretical_model" = as.logical(FALSE)), +#' list("interventions_type" = as.character("Vaccination")), +#' list("code_available" = as.logical(TRUE)), +#' list("transmission_route" = as.character("Sexual")), +#' list("assumptions" = as.character("Unspecified")), +#' list("covidence_id" = as.integer(2059))), +#' vignette_prepend = "") #' #' @export -create_new_model_entry <- function(pathogen = NA, - new_model = c( list( "article_id" = as.integer(NA)), - list( "model_type" = as.character(NA)), - list( "compartmental_type" = as.character(NA)), - list( "stoch_deter" = as.character(NA)), - list( "theoretical_model" = as.logical(NA)), - list( "interventions_type" = as.character(NA)), - list( "code_available" = as.logical(NA)), - list( "transmission_route" = as.character(NA)), - list( "assumptions" = as.character(NA)), - list( "covidence_id" = as.integer(NA))), - vignette_prepend = "") -{ +create_new_model_entry <- + function(pathogen = NA, + new_model = c(list("article_id" = as.integer(NA)), + list("model_type" = as.character(NA)), + list("compartmental_type" = as.character(NA)), + list("stoch_deter" = as.character(NA)), + list("theoretical_model" = as.logical(NA)), + list("interventions_type" = as.character(NA)), + list("code_available" = as.logical(NA)), + list("transmission_route" = as.character(NA)), + list("assumptions" = as.character(NA)), + list("covidence_id" = as.integer(NA))), + vignette_prepend = "") { + #read current article data for pathogen - articles <- as_tibble(load_data(table_type = 'article',pathogen = pathogen),vignette_prepend=vignette_prepend) - old_models <- as_tibble(load_data(table_type = 'model',pathogen = pathogen),vignette_prepend=vignette_prepend) - new_row <- as_tibble_row(new_model) + articles <- as_tibble(load_data(table_type = "article", pathogen = pathogen), + vignette_prepend = vignette_prepend) + old_models <- as_tibble(load_data(table_type = "model", pathogen = pathogen), + vignette_prepend = vignette_prepend) + new_row <- as_tibble_row(new_model) - # generate the below quanties + # generate the below quantities new_row$model_data_id <- max(old_models$model_data_id) + 1 - - new_row <- new_row %>% dplyr::select(colnames(old_models)) + new_row <- new_row %>% dplyr::select(colnames(old_models)) # Need to check that article_id & covidence_id exist in the articles table. - if(!(new_row$article_id %in% articles$article_id & articles[articles$article_id==new_row$article_id,]$covidence_id == new_row$covidence_id)) - stop('Article_id + Covidence_id pair does not exist in article data') + if (!(new_row$article_id %in% articles$article_id & + articles[articles$article_id == + new_row$article_id, ]$covidence_id == new_row$covidence_id)) + stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", "access_db_dropdown_models.csv", package = "epireview") - if(file_path_ob=="") file_path_ob <- paste0(vignette_prepend,"data/access_db_dropdown_models.csv") + file_path_ob <- system.file("data", "access_db_dropdown_models.csv", + package = "epireview") + if (file_path_ob == "") { + file_path_ob <- paste0(vignette_prepend, + "data/access_db_dropdown_models.csv") + } model_options <- read_csv(file_path_ob) #validate that the entries make sense rules <- validator( model_type_is_character = is.character(model_type), - model_types_valid = strsplit(model_type,",")[[1]] %vin% na.omit(model_options$`Model type`), + model_types_valid = strsplit(model_type, ",")[[1]] %vin% na.omit(model_options$`Model type`), compartmental_type_is_character = is.character(compartmental_type), - compartmental_type_valid = strsplit(compartmental_type,",")[[1]] %vin% na.omit(model_options$`Compartment type`), + compartmental_type_valid = strsplit(compartmental_type, ",")[[1]] %vin% na.omit(model_options$`Compartment type`), stoch_deter_is_character = is.character(stoch_deter), - stoch_deter_valid = strsplit(stoch_deter,",")[[1]] %vin% na.omit(model_options$`Stochastic or deterministic`), + stoch_deter_valid = strsplit(stoch_deter, ",")[[1]] %vin% na.omit(model_options$`Stochastic or deterministic`), intervention_type_is_character = is.character(interventions_type), - intervention_type_valid = strsplit(interventions_type,",")[[1]] %vin% na.omit(model_options$Interventions), + intervention_type_valid = strsplit(interventions_type, ",")[[1]] %vin% na.omit(model_options$Interventions), transmission_route_is_character = is.character(transmission_route), - transmission_route_valid = strsplit(transmission_route,",")[[1]] %vin% na.omit(model_options$`Transmission route`), + transmission_route_valid = strsplit(transmission_route, ",")[[1]] %vin% na.omit(model_options$`Transmission route`), assumptions_is_character = is.character(assumptions), - assumptions_valid = strsplit(assumptions,",")[[1]] %vin% na.omit(model_options$Assumptions), - code_available_check = code_available %in% c(0,1,NA), - theoretical_model_check = theoretical_model %in% c(0,1,NA) + assumptions_valid = strsplit(assumptions, ",")[[1]] %vin% na.omit(model_options$Assumptions), + code_available_check = code_available %in% c(0, 1, NA), + theoretical_model_check = theoretical_model %in% c(0, 1, NA) ) rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(fails>0)) + print(as_tibble(rules_summary) %>% filter(fails > 0)) - if(sum(rules_summary$fails)>0) - stop(as_tibble(rules_summary) %>% filter(fails>0) ) + if (sum(rules_summary$fails) > 0) { + stop(as_tibble(rules_summary) %>% filter(fails > 0)) + } return(new_row) } - - - - From f309dfb399e1bed4dd2c63cf5c00521c0365d52a Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 15:44:57 +0100 Subject: [PATCH 09/40] code cleaning --- R/create_new_article_entry.R | 91 +++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/R/create_new_article_entry.R b/R/create_new_article_entry.R index 15ec744..22d44d9 100644 --- a/R/create_new_article_entry.R +++ b/R/create_new_article_entry.R @@ -9,49 +9,52 @@ #' @importFrom validate validator confront summary #' @importFrom dplyr rowwise mutate select filter #' @examples -#' create_new_article_entry(pathogen = "marburg", new_article = c( list( "first_author_first_name" = as.character("Joe")), -#' list( "first_author_surname" = as.character("Blocks")), -#' list( "article_title" = as.character("hello")), -#' list( "doi" = as.character("NA")), -#' list( "journal" = as.character("ABC")), -#' list( "year_publication" = as.integer(2000)), -#' list( "volume" = as.integer(NA)), -#' list( "issue" = as.integer(NA)), -#' list( "page_first" = as.integer(NA)), -#' list( "page_last" = as.integer(NA)), -#' list( "paper_copy_only" = as.logical(NA)), -#' list( "notes" = as.character(NA)), -#' list( "qa_m1" = as.integer(1)), -#' list( "qa_m2" = as.integer(0)), -#' list( "qa_a3" = as.integer(NA)), -#' list( "qa_a4" = as.integer(1)), -#' list( "qa_d5" = as.integer(0)), -#' list( "qa_d6" = as.integer(NA)), -#' list( "qa_d7" = as.integer(1))), -#' vignette_prepend = "" ) +#' create_new_article_entry( +#' pathogen = "marburg", +#' new_article = c(list("first_author_first_name" = as.character("Joe")), +#' list("first_author_surname" = as.character("Blocks")), +#' list("article_title" = as.character("hello")), +#' list("doi" = as.character("NA")), +#' list("journal" = as.character("ABC")), +#' list("year_publication" = as.integer(2000)), +#' list("volume" = as.integer(NA)), +#' list("issue" = as.integer(NA)), +#' list("page_first" = as.integer(NA)), +#' list("page_last" = as.integer(NA)), +#' list("paper_copy_only" = as.logical(NA)), +#' list("notes" = as.character(NA)), +#' list("qa_m1" = as.integer(1)), +#' list("qa_m2" = as.integer(0)), +#' list("qa_a3" = as.integer(NA)), +#' list("qa_a4" = as.integer(1)), +#' list("qa_d5" = as.integer(0)), +#' list("qa_d6" = as.integer(NA)), +#' list("qa_d7" = as.integer(1))), +#' vignette_prepend = "" ) #' @export -create_new_article_entry <- function(pathogen = NA, - new_article = c( list( "first_author_first_name" = as.character(NA)), - list( "first_author_surname" = as.character(NA)), - list( "article_title" = as.character(NA)), - list( "doi" = as.character(NA)), - list( "journal" = as.character(NA)), - list( "year_publication" = as.integer(NA)), - list( "volume" = as.integer(NA)), - list( "issue" = as.integer(NA)), - list( "page_first" = as.integer(NA)), - list( "page_last" = as.integer(NA)), - list( "paper_copy_only" = as.logical(NA)), - list( "notes" = as.character(NA)), - list( "qa_m1" = as.integer(NA)), - list( "qa_m2" = as.integer(NA)), - list( "qa_a3" = as.integer(NA)), - list( "qa_a4" = as.integer(NA)), - list( "qa_d5" = as.integer(NA)), - list( "qa_d6" = as.integer(NA)), - list( "qa_d7" = as.integer(NA))), - vignette_prepend = "") -{ +create_new_article_entry <- + function(pathogen = NA, + new_article = c(list("first_author_first_name" = as.character(NA)), + list("first_author_surname" = as.character(NA)), + list("article_title" = as.character(NA)), + list("doi" = as.character(NA)), + list("journal" = as.character(NA)), + list("year_publication" = as.integer(NA)), + list("volume" = as.integer(NA)), + list("issue" = as.integer(NA)), + list("page_first" = as.integer(NA)), + list("page_last" = as.integer(NA)), + list("paper_copy_only" = as.logical(NA)), + list("notes" = as.character(NA)), + list("qa_m1" = as.integer(NA)), + list("qa_m2" = as.integer(NA)), + list("qa_a3" = as.integer(NA)), + list("qa_a4" = as.integer(NA)), + list("qa_d5" = as.integer(NA)), + list("qa_d6" = as.integer(NA)), + list("qa_d7" = as.integer(NA))), + vignette_prepend = "") { + #read current article data for pathogen old_articles <- as_tibble(load_data(table_type = 'article', pathogen = pathogen, @@ -81,9 +84,9 @@ create_new_article_entry <- function(pathogen = NA, sprintf("%s", colnames(old_articles)) sprintf("%s", colnames(new_row)) - # check that article doesn't exist already in data by looking for doi (if it exists) + # check if article already exists in data by looking for doi if(is.character(new_row$doi) & new_row$doi %in% na.omit(old_articles$doi)) - stop('doi exists in data already!') + stop("doi exists in data already!") #validate that the entries make sense rules <- validator( From b68323245f6eaa99b9a3ed877c8d59d2870a9710 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 16:10:01 +0100 Subject: [PATCH 10/40] cleaning and documentation for create_new_outbreak_entry --- R/create_new_outbreak_entry.R | 147 ++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 69 deletions(-) diff --git a/R/create_new_outbreak_entry.R b/R/create_new_outbreak_entry.R index daaaefe..a503567 100644 --- a/R/create_new_outbreak_entry.R +++ b/R/create_new_outbreak_entry.R @@ -2,98 +2,107 @@ #' #' @param pathogen name of pathogen #' @param new_outbreak all the required details for the new outbreak -#' @param vignette_prepend string to allowing loading data from vignettes -#' @importFrom tibble as_tibble -#' @importFrom tibble as_tibble_row -#' @importFrom validate validator -#' @importFrom validate confront -#' @importFrom validate summary -#' @return return data for new row to be added with append_new_entry_to_table function +#' @param vignette_prepend string to allow loading data in vignettes +#' @importFrom tibble as_tibble as_tibble_row +#' @importFrom validate validator confront summary +#' @importFrom dplyr select +#' @importFrom devtools load_data +#' @importFrom readr read_csv +#' @return return new row of data to be added to the outbreak data set using +#' the append_new_entry_to_table() function #' @examples -#' create_new_outbreak_entry('marburg',new_outbreak = c( list( "article_id" = as.integer(1)), -#' list( "outbreak_start_day" = as.integer(NA)), -#' list( "outbreak_start_month" = as.character(NA)), -#' list( "outbreak_start_year" = as.integer(1999)), -#' list( "outbreak_end_day" = as.integer(NA)), -#' list( "outbreak_end_month" = as.character(NA)), -#' list( "outbreak_date_year" = as.integer(2001)), -#' list( "outbreak_duration_months" = as.integer(NA)), -#' list( "outbreak_size" = as.integer(2)), -#' list( "asymptomatic_transmission" = as.integer(0)), -#' list( "outbreak_country" = as.character("Tanzania")), -#' list( "outbreak_location" = as.character(NA)), -#' list( "cases_confirmed" = as.integer(NA)), -#' list( "cases_mode_detection" = as.character(NA)), -#' list( "cases_suspected" = as.integer(NA)), -#' list( "cases_asymptomatic" = as.integer(NA)), -#' list( "deaths" = as.integer(2)), -#' list( "cases_severe_hospitalised" = as.integer(NA)), -#' list( "covidence_id" = as.integer(2059))), -#' vignette_prepend = "") +#' create_new_outbreak_entry( +#' pathogen = "marburg", +#' new_outbreak = c(list("article_id" = as.integer(1)), +#' list("outbreak_start_day" = as.integer(NA)), +#' list("outbreak_start_month" = as.character(NA)), +#' list("outbreak_start_year" = as.integer(1999)), +#' list("outbreak_end_day" = as.integer(NA)), +#' list("outbreak_end_month" = as.character(NA)), +#' list("outbreak_date_year" = as.integer(2001)), +#' list("outbreak_duration_months" = as.integer(NA)), +#' list("outbreak_size" = as.integer(2)), +#' list("asymptomatic_transmission" = as.integer(0)), +#' list("outbreak_country" = as.character("Tanzania")), +#' list("outbreak_location" = as.character(NA)), +#' list("cases_confirmed" = as.integer(NA)), +#' list("cases_mode_detection" = as.character(NA)), +#' list("cases_suspected" = as.integer(NA)), +#' list("cases_asymptomatic" = as.integer(NA)), +#' list("deaths" = as.integer(2)), +#' list("cases_severe_hospitalised" = as.integer(NA)), +#' list("covidence_id" = as.integer(2059))), +#' vignette_prepend = "") #' @export -create_new_outbreak_entry <- function(pathogen = NA, - new_outbreak = c( list( "article_id" = as.integer(NA)), - list( "outbreak_start_day" = as.integer(NA)), - list( "outbreak_start_month" = as.character(NA)), - list( "outbreak_start_year" = as.integer(NA)), - list( "outbreak_end_day" = as.integer(NA)), - list( "outbreak_end_month" = as.character(NA)), - list( "outbreak_date_year" = as.integer(NA)), - list( "outbreak_duration_months" = as.integer(NA)), - list( "outbreak_size" = as.integer(NA)), - list( "asymptomatic_transmission" = as.integer(NA)), - list( "outbreak_country" = as.character(NA)), - list( "outbreak_location" = as.character(NA)), - list( "cases_confirmed" = as.integer(NA)), - list( "cases_mode_detection" = as.character(NA)), - list( "cases_suspected" = as.integer(NA)), - list( "cases_asymptomatic" = as.integer(NA)), - list( "deaths" = as.integer(NA)), - list( "cases_severe_hospitalised" = as.integer(NA)), - list( "covidence_id" = as.integer(NA))), - vignette_prepend = "") -{ +create_new_outbreak_entry <- + function(pathogen = NA, + new_outbreak = c(list("article_id" = as.integer(NA)), + list("outbreak_start_day" = as.integer(NA)), + list("outbreak_start_month" = as.character(NA)), + list("outbreak_start_year" = as.integer(NA)), + list("outbreak_end_day" = as.integer(NA)), + list("outbreak_end_month" = as.character(NA)), + list("outbreak_date_year" = as.integer(NA)), + list("outbreak_duration_months" = as.integer(NA)), + list("outbreak_size" = as.integer(NA)), + list("asymptomatic_transmission" = as.integer(NA)), + list("outbreak_country" = as.character(NA)), + list("outbreak_location" = as.character(NA)), + list("cases_confirmed" = as.integer(NA)), + list("cases_mode_detection" = as.character(NA)), + list("cases_suspected" = as.integer(NA)), + list("cases_asymptomatic" = as.integer(NA)), + list("deaths" = as.integer(NA)), + list("cases_severe_hospitalised" = as.integer(NA)), + list("covidence_id" = as.integer(NA))), + vignette_prepend = "") { + #read current article data for pathogen - articles <- as_tibble(load_data(table_type = 'article',pathogen = pathogen, vignette_prepend = vignette_prepend)) - old_outbreaks <- as_tibble(load_data(table_type = 'outbreak',pathogen = pathogen, vignette_prepend = vignette_prepend)) - new_row <- as_tibble_row(new_outbreak) + articles <- as_tibble(load_data(table_type = "article", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) + old_outbreaks <- as_tibble(load_data(table_type = "outbreak", + vignette_prepend = vignette_prepend)) + new_row <- as_tibble_row(new_outbreak) - # generate the below quanties + # generate the below quantities new_row$outbreak_id <- max(old_outbreaks$outbreak_id) + 1 - - new_row <- new_row %>% dplyr::select(colnames(old_outbreaks)) + new_row <- new_row %>% select(colnames(old_outbreaks)) # Need to check that article_id & covidence_id exist in the articles table. - if(!(new_row$article_id %in% articles$article_id & articles[articles$article_id==new_row$article_id,]$covidence_id == new_row$covidence_id)) - stop('Article_id + Covidence_id pair does not exist in article data') + if (!(new_row$article_id %in% articles$article_id & + articles[articles$article_id == new_row$article_id, ]$covidence_id == + new_row$covidence_id)) + stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", "access_db_dropdown_outbreaks.csv", package = "epireview") - if(file_path_ob=="") file_path_ob <- past0(vignette_prepend,"data/access_db_dropdown_outbreaks.csv") + file_path_ob <- system.file("data", "access_db_dropdown_outbreaks.csv", + package = "epireview") + if (file_path_ob == "") { + file_path_ob <- paste0(vignette_prepend, + "data/access_db_dropdown_outbreaks.csv") + } outbreak_options <- read_csv(file_path_ob) #validate that the entries make sense rules <- validator( outbreak_country_is_character = is.character(outbreak_country), - outbreak_country_valid = strsplit(outbreak_country,",")[[1]] %vin% na.omit(outbreak_options$`Outbreak country`), + outbreak_country_valid = strsplit(outbreak_country, ",")[[1]] %vin% na.omit(outbreak_options$`Outbreak country`), cases_mode_detection_is_character = is.character(cases_mode_detection), - cases_mode_detection_valid = strsplit(cases_mode_detection,",")[[1]] %vin% na.omit(outbreak_options$`Detection mode`), + cases_mode_detection_valid = strsplit(cases_mode_detection, ",")[[1]] %vin% na.omit(outbreak_options$`Detection mode`), outbreak_date_year_is_integer = is.integer(outbreak_date_year), outbreak_date_year_after_1800 = outbreak_date_year > 1800, - outbreak_date_year_not_future = outbreak_date_year < (as.integer(substring(Sys.Date(),1,4))+2) + outbreak_date_year_not_future = outbreak_date_year < (as.integer(substring(Sys.Date(), 1, 4)) + 2) ) rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(fails>0)) + print(as_tibble(rules_summary) %>% filter(fails > 0)) - if(sum(rules_summary$fails)>0) - stop(as_tibble(rules_summary) %>% filter(fails>0) ) + if (sum(rules_summary$fails) > 0) { + stop(as_tibble(rules_summary) %>% filter(fails > 0)) + } return(new_row) } - - - - From 2fa47660dc7cf0c126060a0c019f8194e50d4d0b Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 16:23:18 +0100 Subject: [PATCH 11/40] cleaning and documentation for create_new_parameter_entry --- R/create_new_parameter_entry.R | 217 +++++++++++++++++---------------- 1 file changed, 113 insertions(+), 104 deletions(-) diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index c494d4d..6f3d6c1 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -1,128 +1,137 @@ #' Create new parameter entry #' #' @param pathogen name of pathogen -#' @param new_param all the required details for the new parameter... -#' @param vignette_prepend string to allowing loading data from vignettes -#' @return return data for new row to be added with append_new_entry_to_table function -#' @importFrom tibble as_tibble -#' @importFrom tibble as_tibble_row -#' @importFrom validate validator -#' @importFrom validate confront -#' @importFrom validate summary -#' @examples Note that this is a much shorter example as R can't handle full length parameter structure -#' create_new_parameter_entry <- function(pathogen = NA, -#' new_param = c( list( "article_id" = as.integer(1)), -#' list( "parameter_type" = as.character(NA)), -#' list( "parameter_value" = as.double(NA)), -#' list( "parameter_unit" = as.character(NA)), -#' list( "parameter_lower_bound" = as.double(NA)), -#' list( "parameter_upper_bound" = as.double(NA)), -#' list( "population_study_start_day" = as.integer(NA)), -#' list( "population_study_start_month" = as.character(NA)), -#' list( "population_study_start_year" = as.integer(NA)), -#' list( "population_study_end_day" = as.integer(NA)), -#' list( "population_study_end_month" = as.character(NA)), -#' list( "population_study_end_year" = as.integer(NA)), -#' list( "genome_site" = as.character(NA)), -#' list( "genomic_sequence_available" = as.logical(NA)), -#' list( "parameter_class" = as.character(NA)), -#' list( "covidence_id" = as.integer(2059)), -#' list( "Uncertainty" = as.character(NA)), -#' list( "Survey year" = as.character(NA))), -#' vignette_prepend = "") +#' @param new_param all the required details for the new parameter entry +#' @param vignette_prepend string to allow loading data in vignettes +#' @return new row of data to be added to the outbreak data set using the +#' append_new_entry_to_table() function +#' @importFrom tibble as_tibble as_tibble_row +#' @importFrom validate validator confront summary +#' @importFrom dplyr select +#' @importFrom devtools load_data +#' @importFrom readr read_csv +#' @examples +#' create_new_parameter_entry <- +#' function(pathogen = "marburg", +#' new_param = c(list("article_id" = as.integer(1)), +#' list("parameter_type" = as.character(NA)), +#' list("parameter_value" = as.double(NA)), +#' list("parameter_unit" = as.character(NA)), +#' list("parameter_lower_bound" = as.double(NA)), +#' list("parameter_upper_bound" = as.double(NA)), +#' list("population_study_start_day" = as.integer(NA)), +#' list("population_study_start_month" = as.character(NA)), +#' list("population_study_start_year" = as.integer(NA)), +#' list("population_study_end_day" = as.integer(NA)), +#' list("population_study_end_month" = as.character(NA)), +#' list("population_study_end_year" = as.integer(NA)), +#' list("genome_site" = as.character(NA)), +#' list("genomic_sequence_available" = as.logical(NA)), +#' list("parameter_class" = as.character(NA)), +#' list("covidence_id" = as.integer(2059)), +#' list("Uncertainty" = as.character(NA)), +#' list("Survey year" = as.character(NA))), +#' vignette_prepend = "") #' @export -create_new_parameter_entry <- function(pathogen = NA, - new_param = c( list( "article_id" = as.integer(NA)), - list( "parameter_type" = as.character(NA)), - list( "parameter_value" = as.double(NA)), - list( "parameter_unit" = as.character(NA)), - list( "parameter_lower_bound" = as.double(NA)), - list( "parameter_upper_bound" = as.double(NA)), - list( "parameter_value_type" = as.character(NA)), - list( "parameter_uncertainty_single_value" = as.double(NA)), - list( "parameter_uncertainty_singe_type" = as.character(NA)), - list( "parameter_uncertainty_lower_value" = as.double(NA)), - list( "parameter_uncertainty_upper_value" = as.double(NA)), - list( "parameter_uncertainty_type" = as.character(NA)), - list( "cfr_ifr_numerator" = as.integer(NA)), - list( "cfr_ifr_denominator" = as.integer(NA)), - list( "distribution_type" = as.character(NA)), - list( "distribution_par1_value" = as.double(NA)), - list( "distribution_par1_type" = as.character(NA)), - list( "distribution_par1_uncertainty" = as.logical(NA)), - list( "distribution_par2_value" = as.double(NA)), - list( "distribution_par2_type" = as.character(NA)), - list( "distribution_par2_uncertainty" = as.logical(NA)), - list( "method_from_supplement" = as.logical(NA)), - list( "method_moment_value" = as.character(NA)), - list( "cfr_ifr_method" = as.character(NA)), - list( "method_r" = as.character(NA)), - list( "method_disaggregated_by" = as.character(NA)), - list( "method_disaggregated" = as.logical(NA)), - list( "method_disaggregated_only" = as.logical(NA)), - list( "riskfactor_outcome" = as.character(NA)), - list( "riskfactor_name" = as.character(NA)), - list( "riskfactor_occupation" = as.character(NA)), - list( "riskfactor_significant" = as.character(NA)), - list( "riskfactor_adjusted" = as.character(NA)), - list( "population_sex" = as.character(NA)), - list( "population_sample_type" = as.character(NA)), - list( "population_group" = as.character(NA)), - list( "population_age_min" = as.integer(NA)), - list( "population_age_max" = as.integer(NA)), - list( "population_sample_size" = as.integer(NA)), - list( "population_country" = as.character(NA)), - list( "population_location" = as.character(NA)), - list( "population_study_start_day" = as.integer(NA)), - list( "population_study_start_month" = as.character(NA)), - list( "population_study_start_year" = as.integer(NA)), - list( "population_study_end_day" = as.integer(NA)), - list( "population_study_end_month" = as.character(NA)), - list( "population_study_end_year" = as.integer(NA)), - list( "genome_site" = as.character(NA)), - list( "genomic_sequence_available" = as.logical(NA)), - list( "parameter_class" = as.character(NA)), - list( "covidence_id" = as.integer(NA)), - list( "Uncertainty" = as.character(NA)), - list( "Survey year" = as.character(NA))), - vignette_prepend = "") -{ +create_new_parameter_entry <- + function(pathogen = NA, + new_param = c(list("article_id" = as.integer(NA)), + list("parameter_type" = as.character(NA)), + list("parameter_value" = as.double(NA)), + list("parameter_unit" = as.character(NA)), + list("parameter_lower_bound" = as.double(NA)), + list("parameter_upper_bound" = as.double(NA)), + list("parameter_value_type" = as.character(NA)), + list("parameter_uncertainty_single_value" = as.double(NA)), + list("parameter_uncertainty_singe_type" = as.character(NA)), + list("parameter_uncertainty_lower_value" = as.double(NA)), + list("parameter_uncertainty_upper_value" = as.double(NA)), + list("parameter_uncertainty_type" = as.character(NA)), + list("cfr_ifr_numerator" = as.integer(NA)), + list("cfr_ifr_denominator" = as.integer(NA)), + list("distribution_type" = as.character(NA)), + list("distribution_par1_value" = as.double(NA)), + list("distribution_par1_type" = as.character(NA)), + list("distribution_par1_uncertainty" = as.logical(NA)), + list("distribution_par2_value" = as.double(NA)), + list("distribution_par2_type" = as.character(NA)), + list("distribution_par2_uncertainty" = as.logical(NA)), + list("method_from_supplement" = as.logical(NA)), + list("method_moment_value" = as.character(NA)), + list("cfr_ifr_method" = as.character(NA)), + list("method_r" = as.character(NA)), + list("method_disaggregated_by" = as.character(NA)), + list("method_disaggregated" = as.logical(NA)), + list("method_disaggregated_only" = as.logical(NA)), + list("riskfactor_outcome" = as.character(NA)), + list("riskfactor_name" = as.character(NA)), + list("riskfactor_occupation" = as.character(NA)), + list("riskfactor_significant" = as.character(NA)), + list("riskfactor_adjusted" = as.character(NA)), + list("population_sex" = as.character(NA)), + list("population_sample_type" = as.character(NA)), + list("population_group" = as.character(NA)), + list("population_age_min" = as.integer(NA)), + list("population_age_max" = as.integer(NA)), + list("population_sample_size" = as.integer(NA)), + list("population_country" = as.character(NA)), + list("population_location" = as.character(NA)), + list("population_study_start_day" = as.integer(NA)), + list("population_study_start_month" = as.character(NA)), + list("population_study_start_year" = as.integer(NA)), + list("population_study_end_day" = as.integer(NA)), + list("population_study_end_month" = as.character(NA)), + list("population_study_end_year" = as.integer(NA)), + list("genome_site" = as.character(NA)), + list("genomic_sequence_available" = as.logical(NA)), + list("parameter_class" = as.character(NA)), + list("covidence_id" = as.integer(NA)), + list("Uncertainty" = as.character(NA)), + list("Survey year" = as.character(NA))), + vignette_prepend = "") { + #read current article data for pathogen - articles <- as_tibble(load_data(table_type = 'article',pathogen = pathogen, vignette_prepend = vignette_prepend)) - old_parameters <- as_tibble(load_data(table_type = 'parameter',pathogen = pathogen, vignette_prepend = vignette_prepend)) - new_row <- as_tibble_row(new_param) + articles <- as_tibble(load_data(table_type = "article", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) + old_parameters <- as_tibble(load_data(table_type = "parameter", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) + new_row <- as_tibble_row(new_param) # generate the below quanties. - new_row$parameter_data_id <- max(old_parameters$parameter_data_id) + 1 - - new_row <- new_row %>% dplyr::select(colnames(old_parameters)) + new_row$parameter_data_id <- max(old_parameters$parameter_data_id) + 1 + new_row <- new_row %>% select(colnames(old_parameters)) # Need to check that article_id & covidence_id exist in the articles table. - if(!(new_row$article_id %in% articles$article_id & articles[articles$article_id==new_row$article_id,]$covidence_id == new_row$covidence_id)) - stop('Article_id + Covidence_id pair does not exist in article data') + if (!(new_row$article_id %in% articles$article_id & + articles[articles$article_id == new_row$article_id, ]$covidence_id == + new_row$covidence_id)) + stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", "access_db_dropdown_parameters.csv", package = "epireview") - if(file_path_ob=="") file_path_ob <- paste0(vignette_prepend,"data/access_db_dropdown_parameters.csv") + file_path_ob <- system.file("data", "access_db_dropdown_parameters.csv", + package = "epireview") + if (file_path_ob=="") { + file_path_ob <- paste0(vignette_prepend, + "data/access_db_dropdown_parameters.csv") + } parameter_options <- read_csv(file_path_ob) #validate that the entries make sense rules <- validator( - model_type_is_character = is.character(population_country), - model_types_valid = strsplit(population_country,",")[[1]] %vin% na.omit(parameter_options$`Population Country`) + model_type_is_character = is.character(population_country), + model_types_valid = strsplit(population_country, ",")[[1]] %vin% + na.omit(parameter_options$`Population Country`) ) rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(fails>0)) + print(as_tibble(rules_summary) %>% filter(fails > 0)) - if(sum(rules_summary$fails)>0) - stop(as_tibble(rules_summary) %>% filter(fails>0) ) + if (sum(rules_summary$fails) > 0) + stop(as_tibble(rules_summary) %>% filter(fails > 0)) return(new_row) } - - - - From f28b57827707635d639b9a392ed16f35f59efdad Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 16:52:16 +0100 Subject: [PATCH 12/40] forest_plot_delays documentation and minor edits --- R/forest_plot_delays.R | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/R/forest_plot_delays.R b/R/forest_plot_delays.R index 5e0ba66..ec0d7af 100644 --- a/R/forest_plot_delays.R +++ b/R/forest_plot_delays.R @@ -7,9 +7,9 @@ #' @importFrom stringr str_to_sentence #' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete scale_x_continuous #' geom_segment geom_errorbar labs scale_color_brewer scale_shape_manual theme -#' guides +#' guides element_text guide_legend #' @export -forest_plot_delay <- function(df){ +forest_plot_delay <- function(df) { parameter <- "Human delay" @@ -26,14 +26,17 @@ forest_plot_delay <- function(df){ riskfactor_outcome == "Other", "Time symptom to outcome (Other)", parameter_type_short))) %>% mutate(parameter_type_short = str_to_sentence(parameter_type_short)) %>% - group_by(parameter_type_short) + group_by(parameter_type_short) %>% + arrange(first_author_surname) df_plot <- df_delay %>% filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% group_by(parameter_type_short) %>% - mutate(median = median(parameter_value, na.rm=TRUE)) %>% - arrange(desc(parameter_type_short), desc(parameter_value), desc(article_label)) + mutate(median = median(parameter_value, na.rm = TRUE)) %>% + arrange(desc(parameter_type_short), + desc(parameter_value), + desc(article_label)) df_plot$article_label_unique <- make.unique(df_plot$article_label) df_plot$article_label_unique <- factor(df_plot$article_label_unique, @@ -48,7 +51,7 @@ forest_plot_delay <- function(df){ scale_x_continuous(breaks = c(seq(0, 60, by = 10))) + geom_segment(aes(y = article_label_unique, yend = article_label_unique, x = parameter_lower_bound, xend = parameter_upper_bound, - group = parameter_data_id), lwd=5, alpha = 0.4) + + group = parameter_data_id), lwd = 5, alpha = 0.4) + geom_errorbar(aes(y = article_label_unique, xmin = parameter_uncertainty_lower_value, xmax = parameter_uncertainty_upper_value, @@ -58,13 +61,13 @@ forest_plot_delay <- function(df){ linetype = "", colour = "", shape = "", - caption = '*Solid transparent rectangles refer to parameter ranges - while the error bars are uncertainty intervals.') + - scale_color_brewer(palette = 'Dark2', - labels = function(x) str_wrap(x, width = 18))+ + caption = "*Solid transparent rectangles refer to parameter ranges + while the error bars are uncertainty intervals.") + + scale_color_brewer(palette = "Dark2", + labels = function(x) str_wrap(x, width = 18)) + scale_shape_manual(values = c(16, 15, 17, 18), - labels = c('Mean', 'Median', 'Std Dev', 'Other'), - na.translate = F) + + labels = c("Mean", "Median", "Std Dev", "Other"), + na.translate = FALSE) + theme(legend.text = element_text(size = 12), strip.text = element_text(size = 20)) + guides(colour = guide_legend(order = 1, ncol = 1), From 7c26c79eee6004761380af662e9c25e670fc0c48 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 17:00:34 +0100 Subject: [PATCH 13/40] minor lint edits and documentation return edit --- R/append_new_entry_to_table.R | 50 ++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/R/append_new_entry_to_table.R b/R/append_new_entry_to_table.R index dedd668..254d891 100644 --- a/R/append_new_entry_to_table.R +++ b/R/append_new_entry_to_table.R @@ -14,7 +14,8 @@ #' @param write_table write appended table (either TRUE or FALSE). If TRUE the #' new table will be written as a csv file in the data folder of a locally #' cloned repository. -#' @return Null (updates relevant table in a locally cloned repository) +#' @return table with new entry (if write_table = TRUE the relevant table in a +#' locally cloned repository is updated) #' #' @export append_new_entry_to_table <- function(pathogen = NA, @@ -22,38 +23,43 @@ append_new_entry_to_table <- function(pathogen = NA, new_row = NA, validate = TRUE, write_table = FALSE, - vignette_prepend = "") -{ + vignette_prepend = "") { + old_table <- load_data(table_type = table_type, pathogen = pathogen, vignette_prepend = vignette_prepend) - if(!((sum(colnames(new_row) == colnames(old_table)) / + if (!((sum(colnames(new_row) == colnames(old_table)) / length(colnames(new_row))) == 1)) - stop('Schemas of new row and data sets do not match') + stop("Schemas of new row and data sets do not match") - if(table_type=='article' & new_row$article_id %in% old_table$article_id) - stop('article_id already exists in the data set') + if (table_type == "article" & new_row$article_id %in% old_table$article_id) + stop("article_id already exists in the data set") new_table <- rbind(old_table, new_row) - if(validate) - { - if(table_type=='article') - create_new_article_entry(pathogen = pathogen, new_article = new_row %>% - as.vector(), vignette_prepend = vignette_prepend) - if(table_type=='outbreak') - create_new_outbreak_entry(pathogen = pathogen, new_outbreak = new_row %>% - as.vector(), vignette_prepend = vignette_prepend) - if(table_type=='model') - create_new_model_entry(pathogen = pathogen, new_model = new_row %>% - as.vector(), vignette_prepend = vignette_prepend) - if(table_type=='parameter') - create_new_parameter_entry(pathogen = pathogen, new_param = new_row %>% - as.vector(), vignette_prepend = vignette_prepend) + if (validate) { + if(table_type == "article") + create_new_article_entry(pathogen = pathogen, + new_article = new_row %>% as.vector(), + vignette_prepend = vignette_prepend) + if(table_type == "outbreak") + create_new_outbreak_entry(pathogen = pathogen, + new_outbreak = new_row %>% as.vector(), + vignette_prepend = vignette_prepend) + if(table_type == "model") + create_new_model_entry(pathogen = pathogen, + new_model = new_row %>% as.vector(), + vignette_prepend = vignette_prepend) + if(table_type == "parameter") + create_new_parameter_entry(pathogen = pathogen, + new_param = new_row %>% as.vector(), + vignette_prepend = vignette_prepend) } - if(write_table) write.csv(new_table,paste0(vignette_prepend, 'data/', pathogen, '_', table_type, '.csv')) + if(write_table) + write.csv(new_table, paste0(vignette_prepend, "data/", pathogen, "_", + table_type, ".csv")) return(new_table) } From 5e63856d816e7a3f7b4eb7d5455962c107803d9c Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 17:19:15 +0100 Subject: [PATCH 14/40] documentation and cleaning for delay_table --- R/delay_table.R | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/R/delay_table.R b/R/delay_table.R index 130fedc..35b9ced 100644 --- a/R/delay_table.R +++ b/R/delay_table.R @@ -1,18 +1,27 @@ -#' Create delay table +#' Create table for human delay parameters #' -#' @param df data with outbreak information +#' @param df processed data with parameter information (see vignette for each +#' pathogen) #' @param pathogen name of pathogen -#' @return returns flextable +#' @return flextable with an overview of the delay parameter estimates +#' extracted from the included studies +#' @importFrom officer fp_border +#' @importFrom flextable flextable set_flextable_defaults col_keys fontsize +#' border_remove autofit theme_booktabs vline hline bold add_footer_lines +#' @importFrom dplyr filter mutate select arrange group_by row_number +#' @importFrom stringr str_to_title str_replace #' @examples -#' +#'delay_table(df, pathogen = "marburg") #' @export -delay_table <- function(df, pathogen){ - border_style = officer::fp_border(color="black", width=1) +delay_table <- function(df, pathogen) { + + border_style <- fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") delay_tbl <- df %>% - filter(parameter_class == 'Human delay') %>% - mutate(parameter_type = str_to_title(str_replace(parameter_type, 'Human delay - ', ''))) %>% + filter(parameter_class == "Human delay") %>% + mutate(parameter_type = str_to_title( + str_replace(parameter_type, "Human delay - ", ""))) %>% select(c(Article = article_label, Country = population_country, `Survey year`, @@ -23,17 +32,18 @@ delay_table <- function(df, pathogen){ `Uncertainty type` = parameter_uncertainty_type, `Population Group` = population_group, `Timing of survey` = method_moment_value, - Outcome = riskfactor_outcome, - # `Disaggregated data\navailable` = method_disaggregated_by, - # `Risk factor outcome` = riskfactor_outcome - )) %>% + Outcome = riskfactor_outcome)) %>% arrange(`Parameter type`, Country, `Survey year`) %>% group_by(`Parameter type`) %>% mutate(index_of_change = row_number(), - index_of_change = ifelse(index_of_change == max(index_of_change),1,0)) %>% - flextable(col_keys = c("Article", "Country", "Parameter type", "Survey year", "Delays (days)", 'Statistic', - 'Uncertainty', 'Uncertainty type', 'Population Group', 'Timing of survey', 'Outcome')) %>%#,'Disaggregated data\navailable' - fontsize(i = 1, size = 12, part = "header") %>% # adjust font size of header + index_of_change = ifelse( + index_of_change == max(index_of_change), 1, 0)) %>% + flextable( + col_keys = c("Article", "Country", "Parameter type", "Survey year", + "Delays (days)", "Statistic", "Uncertainty", + "Uncertainty type", "Population Group", "Timing of survey", + "Outcome")) %>% + fontsize(i = 1, size = 12, part = "header") %>% border_remove() %>% autofit() %>% theme_booktabs() %>% From e41882a8e83cfa6d5e2032001b7fda78daae1828 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 17:23:17 +0100 Subject: [PATCH 15/40] update NAMESPACE and man files --- NAMESPACE | 18 ++++++++++++ man/append_new_entry_to_table.Rd | 3 +- man/create_new_article_entry.Rd | 42 ++++++++++++++------------- man/create_new_model_entry.Rd | 31 +++++++++++--------- man/create_new_outbreak_entry.Rd | 47 ++++++++++++++++--------------- man/create_new_parameter_entry.Rd | 30 ++++++++++++++++++-- man/delay_table.Rd | 13 ++++++--- 7 files changed, 120 insertions(+), 64 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 1d360f5..be5c094 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -17,6 +17,7 @@ export(outbreak_table) export(quality_assessment_plots) export(risk_table) export(sero_table) +importFrom(devtools,load_data) importFrom(dplyr,"%>%") importFrom(dplyr,arrange) importFrom(dplyr,case_when) @@ -26,13 +27,26 @@ importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,mutate) importFrom(dplyr,n) +importFrom(dplyr,row_number) importFrom(dplyr,rowwise) importFrom(dplyr,select) importFrom(dplyr,starts_with) importFrom(dplyr,summarize) importFrom(dplyr,ungroup) +importFrom(flextable,add_footer_lines) +importFrom(flextable,autofit) +importFrom(flextable,bold) +importFrom(flextable,border_remove) +importFrom(flextable,col_keys) +importFrom(flextable,flextable) +importFrom(flextable,fontsize) +importFrom(flextable,hline) +importFrom(flextable,set_flextable_defaults) +importFrom(flextable,theme_booktabs) +importFrom(flextable,vline) importFrom(ggplot2,aes) importFrom(ggplot2,coord_flip) +importFrom(ggplot2,element_text) importFrom(ggplot2,geom_bar) importFrom(ggplot2,geom_errorbar) importFrom(ggplot2,geom_point) @@ -40,6 +54,7 @@ importFrom(ggplot2,geom_segment) importFrom(ggplot2,geom_smooth) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggplot_add) +importFrom(ggplot2,guide_legend) importFrom(ggplot2,guides) importFrom(ggplot2,labs) importFrom(ggplot2,scale_color_brewer) @@ -51,9 +66,12 @@ importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(ggplot2,xlab) importFrom(ggplot2,ylab) +importFrom(officer,fp_border) importFrom(patchwork,wrap_plots) importFrom(readr,read_csv) +importFrom(stringr,str_replace) importFrom(stringr,str_to_sentence) +importFrom(stringr,str_to_title) importFrom(tibble,as_tibble) importFrom(tibble,as_tibble_row) importFrom(tidyr,pivot_longer) diff --git a/man/append_new_entry_to_table.Rd b/man/append_new_entry_to_table.Rd index 85622c6..32cf72e 100644 --- a/man/append_new_entry_to_table.Rd +++ b/man/append_new_entry_to_table.Rd @@ -32,7 +32,8 @@ new table will be written as a csv file in the data folder of a locally cloned repository.} } \value{ -Null (updates relevant table in a locally cloned repository) +table with new entry (if write_table = TRUE the relevant table in a +locally cloned repository is updated) } \description{ NOTE: This can only be run in a locally cloned repository diff --git a/man/create_new_article_entry.Rd b/man/create_new_article_entry.Rd index 0417b5e..5edf383 100644 --- a/man/create_new_article_entry.Rd +++ b/man/create_new_article_entry.Rd @@ -34,24 +34,26 @@ append_new_entry_to_table() function Create new article entry } \examples{ -create_new_article_entry(pathogen = "marburg", new_article = c( list( "first_author_first_name" = as.character("Joe")), - list( "first_author_surname" = as.character("Blocks")), - list( "article_title" = as.character("hello")), - list( "doi" = as.character("NA")), - list( "journal" = as.character("ABC")), - list( "year_publication" = as.integer(2000)), - list( "volume" = as.integer(NA)), - list( "issue" = as.integer(NA)), - list( "page_first" = as.integer(NA)), - list( "page_last" = as.integer(NA)), - list( "paper_copy_only" = as.logical(NA)), - list( "notes" = as.character(NA)), - list( "qa_m1" = as.integer(1)), - list( "qa_m2" = as.integer(0)), - list( "qa_a3" = as.integer(NA)), - list( "qa_a4" = as.integer(1)), - list( "qa_d5" = as.integer(0)), - list( "qa_d6" = as.integer(NA)), - list( "qa_d7" = as.integer(1))), - vignette_prepend = "" ) +create_new_article_entry( + pathogen = "marburg", + new_article = c(list("first_author_first_name" = as.character("Joe")), + list("first_author_surname" = as.character("Blocks")), + list("article_title" = as.character("hello")), + list("doi" = as.character("NA")), + list("journal" = as.character("ABC")), + list("year_publication" = as.integer(2000)), + list("volume" = as.integer(NA)), + list("issue" = as.integer(NA)), + list("page_first" = as.integer(NA)), + list("page_last" = as.integer(NA)), + list("paper_copy_only" = as.logical(NA)), + list("notes" = as.character(NA)), + list("qa_m1" = as.integer(1)), + list("qa_m2" = as.integer(0)), + list("qa_a3" = as.integer(NA)), + list("qa_a4" = as.integer(1)), + list("qa_d5" = as.integer(0)), + list("qa_d6" = as.integer(NA)), + list("qa_d7" = as.integer(1))), + vignette_prepend = "" ) } diff --git a/man/create_new_model_entry.Rd b/man/create_new_model_entry.Rd index f4e60fe..a2dea95 100644 --- a/man/create_new_model_entry.Rd +++ b/man/create_new_model_entry.Rd @@ -18,27 +18,30 @@ create_new_model_entry( \arguments{ \item{pathogen}{name of pathogen} -\item{new_model}{all the required details for the new outbreak} +\item{new_model}{all the required details for the new model} -\item{vignette_prepend}{string to allowing loading data from vignettes} +\item{vignette_prepend}{string to allow loading data in vignettes} } \value{ -return data for new row to be added with append_new_entry_to_table function +return new row of data to be added to the model data set using the +append_new_entry_to_table() function } \description{ Create new model entry } \examples{ -create_new_model_entry('marburg',new_model = c( list( "article_id" = as.integer(1)), - list( "model_type" = as.character("Compartmental")), - list( "compartmental_type" = as.character("SEIR,SIR")), - list( "stoch_deter" = as.character("Deterministic")), - list( "theoretical_model" = as.logical(FALSE)), - list( "interventions_type" = as.character("Vaccination")), - list( "code_available" = as.logical(TRUE)), - list( "transmission_route" = as.character("Sexual")), - list( "assumptions" = as.character("Unspecified")), - list( "covidence_id" = as.integer(2059))), - vignette_prepend = "") +create_new_model_entry( + pathogen = 'marburg', + new_model = c(list("article_id" = as.integer(1)), + list("model_type" = as.character("Compartmental")), + list("compartmental_type" = as.character("SEIR, SIR")), + list("stoch_deter" = as.character("Deterministic")), + list("theoretical_model" = as.logical(FALSE)), + list("interventions_type" = as.character("Vaccination")), + list("code_available" = as.logical(TRUE)), + list("transmission_route" = as.character("Sexual")), + list("assumptions" = as.character("Unspecified")), + list("covidence_id" = as.integer(2059))), + vignette_prepend = "") } diff --git a/man/create_new_outbreak_entry.Rd b/man/create_new_outbreak_entry.Rd index f6ae16b..71d99e7 100644 --- a/man/create_new_outbreak_entry.Rd +++ b/man/create_new_outbreak_entry.Rd @@ -27,33 +27,36 @@ create_new_outbreak_entry( \item{new_outbreak}{all the required details for the new outbreak} -\item{vignette_prepend}{string to allowing loading data from vignettes} +\item{vignette_prepend}{string to allow loading data in vignettes} } \value{ -return data for new row to be added with append_new_entry_to_table function +return new row of data to be added to the outbreak data set using +the append_new_entry_to_table() function } \description{ Create new outbreak entry } \examples{ -create_new_outbreak_entry('marburg',new_outbreak = c( list( "article_id" = as.integer(1)), - list( "outbreak_start_day" = as.integer(NA)), - list( "outbreak_start_month" = as.character(NA)), - list( "outbreak_start_year" = as.integer(1999)), - list( "outbreak_end_day" = as.integer(NA)), - list( "outbreak_end_month" = as.character(NA)), - list( "outbreak_date_year" = as.integer(2001)), - list( "outbreak_duration_months" = as.integer(NA)), - list( "outbreak_size" = as.integer(2)), - list( "asymptomatic_transmission" = as.integer(0)), - list( "outbreak_country" = as.character("Tanzania")), - list( "outbreak_location" = as.character(NA)), - list( "cases_confirmed" = as.integer(NA)), - list( "cases_mode_detection" = as.character(NA)), - list( "cases_suspected" = as.integer(NA)), - list( "cases_asymptomatic" = as.integer(NA)), - list( "deaths" = as.integer(2)), - list( "cases_severe_hospitalised" = as.integer(NA)), - list( "covidence_id" = as.integer(2059))), - vignette_prepend = "") +create_new_outbreak_entry( + pathogen = "marburg", + new_outbreak = c(list("article_id" = as.integer(1)), + list("outbreak_start_day" = as.integer(NA)), + list("outbreak_start_month" = as.character(NA)), + list("outbreak_start_year" = as.integer(1999)), + list("outbreak_end_day" = as.integer(NA)), + list("outbreak_end_month" = as.character(NA)), + list("outbreak_date_year" = as.integer(2001)), + list("outbreak_duration_months" = as.integer(NA)), + list("outbreak_size" = as.integer(2)), + list("asymptomatic_transmission" = as.integer(0)), + list("outbreak_country" = as.character("Tanzania")), + list("outbreak_location" = as.character(NA)), + list("cases_confirmed" = as.integer(NA)), + list("cases_mode_detection" = as.character(NA)), + list("cases_suspected" = as.integer(NA)), + list("cases_asymptomatic" = as.integer(NA)), + list("deaths" = as.integer(2)), + list("cases_severe_hospitalised" = as.integer(NA)), + list("covidence_id" = as.integer(2059))), + vignette_prepend = "") } diff --git a/man/create_new_parameter_entry.Rd b/man/create_new_parameter_entry.Rd index bb15ff8..12c9d70 100644 --- a/man/create_new_parameter_entry.Rd +++ b/man/create_new_parameter_entry.Rd @@ -50,13 +50,37 @@ create_new_parameter_entry( \arguments{ \item{pathogen}{name of pathogen} -\item{new_param}{all the required details for the new parameter...} +\item{new_param}{all the required details for the new parameter entry} -\item{vignette_prepend}{string to allowing loading data from vignettes} +\item{vignette_prepend}{string to allow loading data in vignettes} } \value{ -return data for new row to be added with append_new_entry_to_table function +new row of data to be added to the outbreak data set using the +append_new_entry_to_table() function } \description{ Create new parameter entry } +\examples{ +create_new_parameter_entry <- + function(pathogen = "marburg", + new_param = c(list("article_id" = as.integer(1)), + list("parameter_type" = as.character(NA)), + list("parameter_value" = as.double(NA)), + list("parameter_unit" = as.character(NA)), + list("parameter_lower_bound" = as.double(NA)), + list("parameter_upper_bound" = as.double(NA)), + list("population_study_start_day" = as.integer(NA)), + list("population_study_start_month" = as.character(NA)), + list("population_study_start_year" = as.integer(NA)), + list("population_study_end_day" = as.integer(NA)), + list("population_study_end_month" = as.character(NA)), + list("population_study_end_year" = as.integer(NA)), + list("genome_site" = as.character(NA)), + list("genomic_sequence_available" = as.logical(NA)), + list("parameter_class" = as.character(NA)), + list("covidence_id" = as.integer(2059)), + list("Uncertainty" = as.character(NA)), + list("Survey year" = as.character(NA))), + vignette_prepend = "") +} diff --git a/man/delay_table.Rd b/man/delay_table.Rd index 2c4cc10..0eb768f 100644 --- a/man/delay_table.Rd +++ b/man/delay_table.Rd @@ -2,18 +2,23 @@ % Please edit documentation in R/delay_table.R \name{delay_table} \alias{delay_table} -\title{Create delay table} +\title{Create table for human delay parameters} \usage{ delay_table(df, pathogen) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with parameter information (see vignette for each +pathogen)} \item{pathogen}{name of pathogen} } \value{ -returns flextable +flextable with an overview of the delay parameter estimates +extracted from the included studies } \description{ -Create delay table +Create table for human delay parameters +} +\examples{ +delay_table(df, pathogen = "marburg") } From ce7b68753fe1fced00ba09a9c99def42e70d307e Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Fri, 14 Jul 2023 17:42:14 +0100 Subject: [PATCH 16/40] remove importfrom devtools --- NAMESPACE | 2 -- R/create_new_model_entry.R | 4 ++-- R/create_new_outbreak_entry.R | 1 - R/create_new_parameter_entry.R | 1 - R/delay_table.R | 2 +- 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index be5c094..5cd16ff 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -17,7 +17,6 @@ export(outbreak_table) export(quality_assessment_plots) export(risk_table) export(sero_table) -importFrom(devtools,load_data) importFrom(dplyr,"%>%") importFrom(dplyr,arrange) importFrom(dplyr,case_when) @@ -37,7 +36,6 @@ importFrom(flextable,add_footer_lines) importFrom(flextable,autofit) importFrom(flextable,bold) importFrom(flextable,border_remove) -importFrom(flextable,col_keys) importFrom(flextable,flextable) importFrom(flextable,fontsize) importFrom(flextable,hline) diff --git a/R/create_new_model_entry.R b/R/create_new_model_entry.R index e203abe..e964551 100644 --- a/R/create_new_model_entry.R +++ b/R/create_new_model_entry.R @@ -7,7 +7,7 @@ #' append_new_entry_to_table() function #' @importFrom tibble as_tibble as_tibble_row #' @importFrom validate validator confront summary -#' @importFrom devtools load_data +#' @importFrom dplyr select #' @importFrom readr read_csv #' @examples #' create_new_model_entry( @@ -48,7 +48,7 @@ create_new_model_entry <- # generate the below quantities new_row$model_data_id <- max(old_models$model_data_id) + 1 - new_row <- new_row %>% dplyr::select(colnames(old_models)) + new_row <- new_row %>% select(colnames(old_models)) # Need to check that article_id & covidence_id exist in the articles table. if (!(new_row$article_id %in% articles$article_id & diff --git a/R/create_new_outbreak_entry.R b/R/create_new_outbreak_entry.R index a503567..17ddc4a 100644 --- a/R/create_new_outbreak_entry.R +++ b/R/create_new_outbreak_entry.R @@ -6,7 +6,6 @@ #' @importFrom tibble as_tibble as_tibble_row #' @importFrom validate validator confront summary #' @importFrom dplyr select -#' @importFrom devtools load_data #' @importFrom readr read_csv #' @return return new row of data to be added to the outbreak data set using #' the append_new_entry_to_table() function diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index 6f3d6c1..6da5448 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -8,7 +8,6 @@ #' @importFrom tibble as_tibble as_tibble_row #' @importFrom validate validator confront summary #' @importFrom dplyr select -#' @importFrom devtools load_data #' @importFrom readr read_csv #' @examples #' create_new_parameter_entry <- diff --git a/R/delay_table.R b/R/delay_table.R index 35b9ced..dffcc4c 100644 --- a/R/delay_table.R +++ b/R/delay_table.R @@ -6,7 +6,7 @@ #' @return flextable with an overview of the delay parameter estimates #' extracted from the included studies #' @importFrom officer fp_border -#' @importFrom flextable flextable set_flextable_defaults col_keys fontsize +#' @importFrom flextable flextable set_flextable_defaults fontsize #' border_remove autofit theme_booktabs vline hline bold add_footer_lines #' @importFrom dplyr filter mutate select arrange group_by row_number #' @importFrom stringr str_to_title str_replace From 9d36f0c7d2977ceee0c72805db17152aba444cd5 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 10:02:37 +0100 Subject: [PATCH 17/40] R CMD check badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2b1350..fab9d2e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # epireview -[![R build status](https://github.com/mrc-ide/EpiEstim/workflows/R-CMD-check/badge.svg)](https://github.com/mrc-ide/epireview/actions) +[![R build status](https://github.com/mrc-ide/epireview/workflows/R-CMD-check/badge.svg)](https://github.com/mrc-ide/epireview/actions) epireview is a tool to obtain the latest data from the Pathogen Epidemiology Review Group (PERG) and contains tools to update data from new, peer-reviewed papers for existing pathogens in the database or to add entirely new pathogens. From 51a549f867e1002d37f3aa55d131f846d983f070 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 12:55:11 +0100 Subject: [PATCH 18/40] update README --- README.md | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index fab9d2e..17b800a 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,18 @@ # epireview + + [![R build status](https://github.com/mrc-ide/epireview/workflows/R-CMD-check/badge.svg)](https://github.com/mrc-ide/epireview/actions) -epireview is a tool to obtain the latest data from the Pathogen Epidemiology Review Group (PERG) and contains tools to update data from new, peer-reviewed papers for existing pathogens in the database or to add entirely new pathogens. +epireview is a tool to obtain the latest data, figures and tables from the Pathogen Epidemiology Review Group (PERG). This package also contains functions to update pathogen-specific databases with new data from peer-reviewed papers as they become available. This can be submitted via a pull-request and will be checked by our team. -To install the latest version, use: +To install the latest version of epireview, use: ```r -devtools::install_github("mrc-ide/epireview", build_vignettes = TRUE) +install.packages('epireview', repos = c('https://mrc-ide.r-universe.dev', + 'https://cloud.r-project.org')) ``` ## Project overview @@ -26,24 +29,19 @@ One output of this project will be a database initially populated with all the i 4. Vignettes and the github wiki contain all required information on the data. 5. We will add functionality to create/add new pathogens which are not currently included in the review. -## Pathogen overview and time-line +## Pathogen overview and timeline -| Pathogen | Titles & Abstracts screened | Expected pre-print | Contact | doi| -| ------------- | -------------:| -----:| -- |-- | -| Marburg virus | 4,460 | June 2023 | cm401@ic.ac.uk, gc4018@ic.ac.uk|https://doi.org/10.1101/2023.07.10.23292424| -| Ebola virus | 9,563 | September 2023 | hunwin@ic.ac.uk, rknash@ic.ac.uk|| +| Pathogen | Titles & Abstracts screened | Expected pre-print | Contact | doi| +| --------- | --------------:| --------:| -- | -- | +| Marburg virus | 4,460 | June 2023 | cm401@ic.ac.uk, gc4018@ic.ac.uk | https://doi.org/10.1101/2023.07.10.23292424|| +| Ebola virus | 9,563 | September 2023 | hunwin@ic.ac.uk, rknash@ic.ac.uk|| | Lassa Mammarenavirus | 1,760 | October 2023 | pd315@ic.ac.uk || | Henipa virus | 959 | December 2023 | cw1716@ic.ac.uk || | SARS-CoV-1 | 11,918 | January 2024 | acori@ic.ac.uk, cm401@ic.ac.uk || -| Nairo virus (CCHF) | 1,967| March 2024 |dn620@ic.ac.uk, svanelsl@ic.ac.uk|| -| Zika virus| 4,518| May 2024 |kem22@ic.ac.uk|| -| Rift Valley Fever Virus| 3,341| June 2024 |gc.4018@ic.ac.uk|| -| MERS-CoV| 10,382| July 2024 |acori@ic.ac.uk|| +| Nairo virus (CCHF) | 1,967| March 2024 | dn620@ic.ac.uk, svanelsl@ic.ac.uk|| +| Zika virus| 4,518| May 2024 | kem22@ic.ac.uk|| +| Rift Valley Fever Virus| 3,341| June 2024 | gc.4018@ic.ac.uk|| +| MERS-CoV| 10,382| July 2024 | acori@ic.ac.uk|| | Comprehensive paper comparing pathogens |47,115|September 2024|acori@ic.ac.uk|| If you are interested in adding any other pathogen to the database please feel free to [contact us](cm401@ic.ac.uk). - - - - - From f7868a8178a0a5052b3c7148c12a44c2a69fb1c7 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 12:58:15 +0100 Subject: [PATCH 19/40] add hex badge --- man/figures/hex-epireview.png | Bin 0 -> 85721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 man/figures/hex-epireview.png diff --git a/man/figures/hex-epireview.png b/man/figures/hex-epireview.png new file mode 100644 index 0000000000000000000000000000000000000000..56f4c753730fc98dfad2f12dec008f169901b26f GIT binary patch literal 85721 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

pN+rVg0OYYjf*%u28aSpCo$Km7Y=q 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 literal 0 HcmV?d00001 From 73750d7df68763cbd45fe24f76ce5f4ecf5c0737 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 13:30:18 +0100 Subject: [PATCH 20/40] change load_data to load_epidata and add documentation --- R/load_data.R | 26 -------------------------- R/load_epidata.R | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 26 deletions(-) delete mode 100644 R/load_data.R create mode 100644 R/load_epidata.R diff --git a/R/load_data.R b/R/load_data.R deleted file mode 100644 index c45d931..0000000 --- a/R/load_data.R +++ /dev/null @@ -1,26 +0,0 @@ -#' Load data for a particular pathogen -#' -#' @param table_type which type of table (either article, parameter, outbreak, -#' model) should be loaded -#' @param pathogen name of pathogen -#' @return return data for table_type and pathogen -#' @importFrom readr read_csv -#' @examples -#' load_data("outbreak","marburg") -#' @export -load_data <- function(table_type = NA, pathogen = NA, vignette_prepend = "") -{ - if(is.na(table_type) || is.na(pathogen)){ - stop("table_type and pathogen name must be supplied. table_type can be - one of either 'article', 'parameter', 'outbreak' or 'model'") - } - - file_path <- system.file("data", paste0(pathogen, "_", table_type, ".csv"), package = "epireview") - - if(file_path=="") - file_path <- paste0(vignette_prepend,"data/",pathogen, "_", table_type, ".csv") - - data_tbl <- read_csv(file_path) - return(data_tbl) -} - diff --git a/R/load_epidata.R b/R/load_epidata.R new file mode 100644 index 0000000..cb50380 --- /dev/null +++ b/R/load_epidata.R @@ -0,0 +1,30 @@ +#' Load data for a particular pathogen +#' +#' @param table_type which type of table (either "article", "parameter", +#' "outbreak", or "model") should be loaded +#' @param pathogen name of pathogen +#' @param vignette_prepend string to allow loading data in vignettes +#' @return return data for specified table_type and pathogen +#' @importFrom readr read_csv +#' @examples +#' load_epidata(table_type = "outbreak", pathogen = "marburg") +#' @export +load_epidata <- function(table_type = NA, + pathogen = NA, + vignette_prepend = "") { + + if(is.na(table_type) || is.na(pathogen)){ + stop("table_type and pathogen name must be supplied. table_type can be + one of either 'article', 'parameter', 'outbreak' or 'model'") + } + + file_path <- system.file( + "data", paste0(pathogen, "_", table_type, ".csv"), package = "epireview") + + if(file_path == "") + file_path <- paste0( + vignette_prepend, "data/", pathogen, "_", table_type, ".csv") + + data_tbl <- read_csv(file_path) + return(data_tbl) +} From bb7c569cf994ed8d4cf63cfb58fe0b562c62da15 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 13:38:21 +0100 Subject: [PATCH 21/40] change load_data to load_epidata elsewhere --- R/append_new_entry_to_table.R | 6 +++--- R/create_new_article_entry.R | 6 +++--- R/create_new_model_entry.R | 10 ++++++---- R/create_new_outbreak_entry.R | 11 ++++++----- R/create_new_parameter_entry.R | 12 ++++++------ README.md | 2 +- tests/testthat/test_datatable_size.R | 5 +++-- vignettes/pathogen_database_update.Rmd | 2 +- 8 files changed, 29 insertions(+), 25 deletions(-) diff --git a/R/append_new_entry_to_table.R b/R/append_new_entry_to_table.R index 254d891..0de3cf2 100644 --- a/R/append_new_entry_to_table.R +++ b/R/append_new_entry_to_table.R @@ -25,9 +25,9 @@ append_new_entry_to_table <- function(pathogen = NA, write_table = FALSE, vignette_prepend = "") { - old_table <- load_data(table_type = table_type, - pathogen = pathogen, - vignette_prepend = vignette_prepend) + old_table <- load_epidata(table_type = table_type, + pathogen = pathogen, + vignette_prepend = vignette_prepend) if (!((sum(colnames(new_row) == colnames(old_table)) / length(colnames(new_row))) == 1)) diff --git a/R/create_new_article_entry.R b/R/create_new_article_entry.R index 22d44d9..b7d4bfb 100644 --- a/R/create_new_article_entry.R +++ b/R/create_new_article_entry.R @@ -56,9 +56,9 @@ create_new_article_entry <- vignette_prepend = "") { #read current article data for pathogen - old_articles <- as_tibble(load_data(table_type = 'article', - pathogen = pathogen, - vignette_prepend = vignette_prepend)) + old_articles <- as_tibble(load_epidata(table_type = "article", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) new_row <- as_tibble_row(new_article) diff --git a/R/create_new_model_entry.R b/R/create_new_model_entry.R index e964551..b12cd6e 100644 --- a/R/create_new_model_entry.R +++ b/R/create_new_model_entry.R @@ -40,10 +40,12 @@ create_new_model_entry <- vignette_prepend = "") { #read current article data for pathogen - articles <- as_tibble(load_data(table_type = "article", pathogen = pathogen), - vignette_prepend = vignette_prepend) - old_models <- as_tibble(load_data(table_type = "model", pathogen = pathogen), - vignette_prepend = vignette_prepend) + articles <- as_tibble(load_epidata(table_type = "article", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) + old_models <- as_tibble(load_epidata(table_type = "model", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) new_row <- as_tibble_row(new_model) # generate the below quantities diff --git a/R/create_new_outbreak_entry.R b/R/create_new_outbreak_entry.R index 17ddc4a..a1c7f67 100644 --- a/R/create_new_outbreak_entry.R +++ b/R/create_new_outbreak_entry.R @@ -57,11 +57,12 @@ create_new_outbreak_entry <- vignette_prepend = "") { #read current article data for pathogen - articles <- as_tibble(load_data(table_type = "article", - pathogen = pathogen, - vignette_prepend = vignette_prepend)) - old_outbreaks <- as_tibble(load_data(table_type = "outbreak", - vignette_prepend = vignette_prepend)) + articles <- as_tibble(load_epidata(table_type = "article", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) + old_outbreaks <- as_tibble(load_epidata(table_type = "outbreak", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) new_row <- as_tibble_row(new_outbreak) # generate the below quantities diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index 6da5448..f06fc5b 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -90,12 +90,12 @@ create_new_parameter_entry <- vignette_prepend = "") { #read current article data for pathogen - articles <- as_tibble(load_data(table_type = "article", - pathogen = pathogen, - vignette_prepend = vignette_prepend)) - old_parameters <- as_tibble(load_data(table_type = "parameter", - pathogen = pathogen, - vignette_prepend = vignette_prepend)) + articles <- as_tibble(load_epidata(table_type = "article", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) + old_parameters <- as_tibble(load_epidata(table_type = "parameter", + pathogen = pathogen, + vignette_prepend = vignette_prepend)) new_row <- as_tibble_row(new_param) # generate the below quanties. diff --git a/README.md b/README.md index 17b800a..449ec78 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ One output of this project will be a database initially populated with all the i ## Pathogen overview and timeline | Pathogen | Titles & Abstracts screened | Expected pre-print | Contact | doi| -| --------- | --------------:| --------:| -- | -- | +| --------- | -------------------:| --------:| -- | -- | | Marburg virus | 4,460 | June 2023 | cm401@ic.ac.uk, gc4018@ic.ac.uk | https://doi.org/10.1101/2023.07.10.23292424|| | Ebola virus | 9,563 | September 2023 | hunwin@ic.ac.uk, rknash@ic.ac.uk|| | Lassa Mammarenavirus | 1,760 | October 2023 | pd315@ic.ac.uk || diff --git a/tests/testthat/test_datatable_size.R b/tests/testthat/test_datatable_size.R index 8e4b631..c223e88 100644 --- a/tests/testthat/test_datatable_size.R +++ b/tests/testthat/test_datatable_size.R @@ -1,5 +1,6 @@ # Check that data exists and has minimum size -marburg_article_data <- load_data('article','marburg') +marburg_article_data <- load_epidata("article", "marburg") -test_that("Marburg articles have at least 58 lines",{expect_gte(dim(marburg_article_data)[1],58)}) +test_that("Marburg articles have at least 58 lines",{ + expect_gte(dim(marburg_article_data)[1], 58)}) diff --git a/vignettes/pathogen_database_update.Rmd b/vignettes/pathogen_database_update.Rmd index 92ff772..52b1011 100644 --- a/vignettes/pathogen_database_update.Rmd +++ b/vignettes/pathogen_database_update.Rmd @@ -26,7 +26,7 @@ library(tidyverse) library(validate) source('R/create_new_article_entry.R') source('R/append_new_entry_to_table.R') -source('R/load_data.R') +source('R/load_epidata.R') new_article <- create_new_article_entry('marburg',new_article = c( list( "first_author_first_name" = as.character("Joe")), list( "first_author_surname" = as.character("Blocks")), From 57b462c5057748543a10bd8674fa1b693539ad60 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 15:08:54 +0100 Subject: [PATCH 22/40] change logo link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 449ec78..7770f00 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # epireview - + [![R build status](https://github.com/mrc-ide/epireview/workflows/R-CMD-check/badge.svg)](https://github.com/mrc-ide/epireview/actions) From 28ef2969cf6b492111260e073db30ad848db6e3a Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 18:46:19 +0100 Subject: [PATCH 23/40] clean and document remaining functions --- NAMESPACE | 12 +- R/forest_plot_delays.R | 29 ++-- R/forest_plot_mutations.R | 112 +++++++++------- R/forest_plot_r.R | 82 ++++++------ R/forest_plot_severity.R | 163 ++++++++++++----------- R/get_table_field_options.R | 41 ++++-- R/outbreak_table.R | 73 +++++----- R/quality_assessment.R | 56 ++++---- R/risk_table.R | 135 +++++++++++-------- R/seroprevalence_table.R | 42 ++++-- man/forest_plot_R.Rd | 8 +- man/forest_plot_delay.Rd | 7 +- man/forest_plot_mutations.Rd | 8 +- man/forest_plot_severity.Rd | 8 +- man/get_available_table_field_options.Rd | 25 ---- man/get_table_field_options.Rd | 31 +++++ man/load_data.Rd | 23 ---- man/load_epidata.Rd | 25 ++++ man/marburg_model.csv.Rd | 23 ++++ man/marburg_outbreak.csv.Rd | 23 ++++ man/marburg_parameter.csv.Rd | 23 ++++ man/outbreak_table.Rd | 13 +- man/quality_assessment_plots.Rd | 11 +- man/risk_table.Rd | 6 + man/sero_table.Rd | 8 +- 25 files changed, 597 insertions(+), 390 deletions(-) delete mode 100644 man/get_available_table_field_options.Rd create mode 100644 man/get_table_field_options.Rd delete mode 100644 man/load_data.Rd create mode 100644 man/load_epidata.Rd create mode 100644 man/marburg_model.csv.Rd create mode 100644 man/marburg_outbreak.csv.Rd create mode 100644 man/marburg_parameter.csv.Rd diff --git a/NAMESPACE b/NAMESPACE index 5cd16ff..f0e21bf 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -11,8 +11,8 @@ export(forest_plot_R) export(forest_plot_delay) export(forest_plot_mutations) export(forest_plot_severity) -export(get_available_table_field_options) -export(load_data) +export(get_table_field_options) +export(load_epidata) export(outbreak_table) export(quality_assessment_plots) export(risk_table) @@ -22,14 +22,18 @@ importFrom(dplyr,arrange) importFrom(dplyr,case_when) importFrom(dplyr,count) importFrom(dplyr,desc) +importFrom(dplyr,distinct) +importFrom(dplyr,everything) importFrom(dplyr,filter) importFrom(dplyr,group_by) +importFrom(dplyr,if_else) importFrom(dplyr,mutate) importFrom(dplyr,n) importFrom(dplyr,row_number) importFrom(dplyr,rowwise) importFrom(dplyr,select) importFrom(dplyr,starts_with) +importFrom(dplyr,summarise) importFrom(dplyr,summarize) importFrom(dplyr,ungroup) importFrom(flextable,add_footer_lines) @@ -50,6 +54,7 @@ importFrom(ggplot2,geom_errorbar) importFrom(ggplot2,geom_point) importFrom(ggplot2,geom_segment) importFrom(ggplot2,geom_smooth) +importFrom(ggplot2,geom_vline) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggplot_add) importFrom(ggplot2,guide_legend) @@ -70,9 +75,12 @@ importFrom(readr,read_csv) importFrom(stringr,str_replace) importFrom(stringr,str_to_sentence) importFrom(stringr,str_to_title) +importFrom(stringr,str_wrap) importFrom(tibble,as_tibble) importFrom(tibble,as_tibble_row) importFrom(tidyr,pivot_longer) +importFrom(tidyr,pivot_wider) +importFrom(tm,removeNumbers) importFrom(validate,confront) importFrom(validate,summary) importFrom(validate,validator) diff --git a/R/forest_plot_delays.R b/R/forest_plot_delays.R index ec0d7af..5212125 100644 --- a/R/forest_plot_delays.R +++ b/R/forest_plot_delays.R @@ -1,13 +1,15 @@ #' Create forest plot for delays #' -#' @param df processed data with parameter information (see vignette for each +#' @param df processed data with human delay information (see vignette for each #' pathogen) -#' @return returns flextable with a summary of the human delays +#' @return returns plot with a summary of the human delays #' @importFrom dplyr filter mutate group_by arrange desc -#' @importFrom stringr str_to_sentence -#' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete scale_x_continuous -#' geom_segment geom_errorbar labs scale_color_brewer scale_shape_manual theme -#' guides element_text guide_legend +#' @importFrom stringr str_to_sentence str_wrap +#' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete +#' scale_x_continuous geom_segment geom_errorbar labs scale_color_brewer +#' scale_shape_manual theme guides element_text guide_legend +#' @examples +#' forest_plot_delay(df = data) #' @export forest_plot_delay <- function(df) { @@ -16,14 +18,15 @@ forest_plot_delay <- function(df) { df_delay <- df %>% filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% - mutate(parameter_type_short = gsub("^Human delay - ", "", parameter_type)) %>% mutate(parameter_type_short = - ifelse( - parameter_type_short == "time symptom to outcome" & - riskfactor_outcome == "Death", "Time symptom to outcome (Death)", - ifelse( - parameter_type_short == "time symptom to outcome" & - riskfactor_outcome == "Other", "Time symptom to outcome (Other)", + gsub("^Human delay - ", "", parameter_type)) %>% + mutate( + parameter_type_short = ifelse( + parameter_type_short == "time symptom to outcome" & + riskfactor_outcome == "Death", "Time symptom to outcome (Death)", + ifelse( + parameter_type_short == "time symptom to outcome" & + riskfactor_outcome == "Other", "Time symptom to outcome (Other)", parameter_type_short))) %>% mutate(parameter_type_short = str_to_sentence(parameter_type_short)) %>% group_by(parameter_type_short) %>% diff --git a/R/forest_plot_mutations.R b/R/forest_plot_mutations.R index 61f6cca..9d072e3 100644 --- a/R/forest_plot_mutations.R +++ b/R/forest_plot_mutations.R @@ -1,71 +1,81 @@ #' Create forest plot for genetic mutations #' -#' @param df data with outbreak information -#' @return returns flextable +#' @param df processed data with parameter information (see vignette for each +#' pathogen) +#' @return returns plot with a summary of genetic mutations +#' @importFrom dplyr filter mutate arrange group_by desc if_else +#' @importFrom ggplot2 geom_vline #' @examples -#' +#' forest_plot_mutations(df = data) #' @export -forest_plot_mutations <- function(df){ +forest_plot_mutations <- function(df) { parameter <- "Mutations" df_mutations <- df %>% - dplyr::filter(parameter_class == parameter) %>% - dplyr::mutate(parameter_value = as.numeric(parameter_value)) %>% - dplyr::group_by(parameter_type) + filter(parameter_class == parameter) %>% + mutate(parameter_value = as.numeric(parameter_value)) %>% + group_by(parameter_type) df_plot <- df_mutations %>% - dplyr::filter(parameter_class == parameter) %>% - dplyr::mutate(parameter_value = as.numeric(parameter_value)) %>% - dplyr::group_by(parameter_type) #%>% ### median function not behaving in ggplot so going with this even with grouping - # mutate(median = median(parameter_value,na.rm=TRUE)) + filter(parameter_class == parameter) %>% + mutate(parameter_value = as.numeric(parameter_value)) %>% + group_by(parameter_type) df_plot$article_label_unique <- make.unique(df_plot$article_label) df_plot <- df_plot %>% - dplyr::mutate(gene = ifelse(is.na(genome_site)==TRUE, "Whole genome", genome_site)) %>% - dplyr::arrange(gene, desc(parameter_value)) - df_plot$article_label_unique <- factor(df_plot$article_label_unique, levels = df_plot$article_label_unique) + mutate(gene = ifelse(is.na(genome_site) == TRUE, + "Whole genome", genome_site)) %>% + arrange(gene, desc(parameter_value)) + df_plot$article_label_unique <- factor(df_plot$article_label_unique, + levels = df_plot$article_label_unique) df_plot <- df_plot %>% - dplyr::mutate(parameter_value = if_else(parameter_value > 1e-02, parameter_value * 1e-04, parameter_value), - parameter_uncertainty_single_value = if_else(parameter_uncertainty_single_value > 1e-02, parameter_uncertainty_single_value * 1e-04, parameter_uncertainty_single_value)) - - - # df_plot <- df_plot %>% - # dplyr::mutate(parameter_type = ifelse(article_label == "Suzuki 1997", "Mutations - substitution rate", - # parameter_type)) + mutate(parameter_value = if_else(parameter_value > 1e-02, + parameter_value * 1e-04, parameter_value), + parameter_uncertainty_single_value = + if_else(parameter_uncertainty_single_value > 1e-02, + parameter_uncertainty_single_value * 1e-04, + parameter_uncertainty_single_value)) - plot <- - ggplot(df_plot, aes(x=(parameter_value * 1e04), y=article_label_unique, - col = gene)) + - theme_bw() + geom_point(size = 3) + - geom_vline(xintercept = 0, color = 'black', linetype = 'dashed') + - # facet_grid(gene ~ ., scales = "free_y", space = "free") + - scale_y_discrete(labels=setNames(df_plot$article_label, df_plot$article_label_unique)) + - geom_segment(aes(y=article_label_unique, yend = article_label_unique, - x=if_else((parameter_value - parameter_uncertainty_single_value)* 1e04 < 0, 0, - (parameter_value - parameter_uncertainty_single_value)* 1e04), - xend=(parameter_value + parameter_uncertainty_single_value)* 1e04, - group=parameter_data_id), - # linetype="Value \u00B1 standard error *"), - lwd=5, + plot <- ggplot(df_plot, + aes(x = (parameter_value * 1e04), y = article_label_unique, + col = gene)) + + theme_bw() + + geom_point(size = 3) + + geom_vline(xintercept = 0, color = "black", linetype = "dashed") + + scale_y_discrete(labels = setNames(df_plot$article_label, + df_plot$article_label_unique)) + + geom_segment( + aes(y = article_label_unique, + yend = article_label_unique, + x = if_else( + (parameter_value - + parameter_uncertainty_single_value) * 1e04 < 0, 0, + (parameter_value - parameter_uncertainty_single_value) * 1e04), + xend = (parameter_value + parameter_uncertainty_single_value) * 1e04, + group = parameter_data_id), + lwd = 5, alpha = 0.4) + - geom_errorbar(aes(y=article_label_unique, - xmin=parameter_uncertainty_lower_value* 1e04, - xmax=parameter_uncertainty_upper_value* 1e04, - group=parameter_data_id), - # linetype="Uncertainty interval"), + geom_errorbar(aes(y = article_label_unique, + xmin = parameter_uncertainty_lower_value * 1e04, + xmax = parameter_uncertainty_upper_value * 1e04, + group = parameter_data_id), width = 0.3, - lwd=1) + - labs(x=expression(Molecular~evolutionary~rate~(substitution/site/year ~10^{-4})), - y="",#y="Study", - linetype="",colour="", - caption = '*Solid transparent lines are calculated as the parameter value \u00B1 standard error. Error bars refer to uncertainty intervals.') + - # scale_linetype_manual(values = c("dotted","solid"),labels = function(x) str_wrap(x, width = 18)) + #+ scale_x_log10() - #geom_vline(xintercept = 0, linetype = "dotted", colour = "dark grey") + - theme(legend.text = element_text(size=12), - strip.text = element_text(size=20)) + xlim(c(0,10)) + - scale_color_brewer(palette = 'Dark2',labels = function(x) str_wrap(x, width = 10)) + - guides(colour = guide_legend(order=1,ncol=1) ) + lwd = 1) + + labs(x = expression(Molecular~evolutionary~rate~ + (substitution/site/year~10^{-4})), + y = "", + linetype = "", + colour = "", + caption = + "*Solid transparent lines are calculated as the parameter value + \u00B1 standard error. Error bars refer to uncertainty intervals.") + + theme(legend.text = element_text(size = 12), + strip.text = element_text(size = 20)) + + xlim(c(0, 10)) + + scale_color_brewer(palette = "Dark2", + labels = function(x) str_wrap(x, width = 10)) + + guides(colour = guide_legend(order = 1, ncol = 1)) return(plot) } diff --git a/R/forest_plot_r.R b/R/forest_plot_r.R index 9c3f25d..b005860 100644 --- a/R/forest_plot_r.R +++ b/R/forest_plot_r.R @@ -1,60 +1,66 @@ #' Create forest plot for reproduction numbers #' -#' @param df data with outbreak information -#' @return returns flextable +#' @param df processed data with parameter information (see vignette for each +#' pathogen) +#' @return returns plot with a summary of reproduction number estimates +#' @importFrom dplyr filter arrange mutate group_by +#' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete +#' scale_x_continuous geom_segment geom_errorbar labs scale_color_brewer +#' scale_shape_manual theme guides element_text guide_legend #' @examples -#' +#' forest_plot_R(df = data) #' @export -forest_plot_R <- function(df){ +forest_plot_R <- function(df) { parameter <- "Reproduction number" df_R <- df %>% filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% group_by(parameter_type) %>% - dplyr::arrange(first_author_surname) + arrange(first_author_surname) df_plot <- df_R %>% filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% - group_by(parameter_type) %>% ### median function not behaving in ggplot so going with this even with grouping - mutate(median = median(parameter_value,na.rm=TRUE)) + group_by(parameter_type) %>% + mutate(median = median(parameter_value, na.rm = TRUE)) df_plot$article_label_unique <- make.unique(df_plot$article_label) - df_plot <- df_plot %>% mutate(parameter_type_short = - ifelse(parameter_type=="Reproduction number (Basic R0)", - "Basic (R0)", - ifelse(parameter_type=="Reproduction number (Effective, Re)","Effective (Re)",NA))) + df_plot <- df_plot %>% + mutate(parameter_type_short = + ifelse(parameter_type == + "Reproduction number (Basic R0)", + "Basic (R0)", + ifelse(parameter_type == + "Reproduction number (Effective, Re)", + "Effective (Re)", NA))) - plot <- - ggplot(df_plot, aes(x = parameter_value, y = article_label_unique, col = parameter_type_short))+ - theme_bw()+ - # scale_x_continuous(breaks = seq(0, 2, by = 0.2))+ - # geom_errorbar(aes(y=article_label,xmin=parameter_lower_bound,xmax=parameter_upper_bound, - # group=parameter_data_id, - # linetype="Parameter range"), - # position=position_dodge(width=0.5), - # width=0.25)+ - geom_errorbar(aes(y=article_label, - xmin=parameter_uncertainty_lower_value,xmax=parameter_uncertainty_upper_value, - group=parameter_data_id, - linetype="Uncertainty interval"), - position=position_dodge(width=0.5), + plot <- ggplot(df_plot, aes(x = parameter_value, + y = article_label_unique, + col = parameter_type_short)) + + theme_bw() + + geom_errorbar(aes(y = article_label, + xmin = parameter_uncertainty_lower_value, + xmax = parameter_uncertainty_upper_value, + group = parameter_data_id, + linetype = "Uncertainty interval"), + position = position_dodge(width = 0.5), width = 0.2, - lwd=1)+ - geom_point(aes(x=parameter_value,y=article_label,group=parameter_data_id),size = 3)+ - # geom_vline(aes(xintercept=median,col="Sample median"),linetype="dashed", colour = "grey") + + lwd = 1) + + geom_point(aes(x = parameter_value, + y = article_label, + group = parameter_data_id), + size = 3) + geom_vline(xintercept = 1, linetype = "dashed", colour = "dark grey") + - labs(x="Reproduction number",y="",#y="Study", - linetype="",colour="")+ - scale_linetype_manual(values = c("solid"),labels = function(x) str_wrap(x, width = 5))+ - #scale_colour_discrete(labels = c("Basic R0", "Effective Re")) + - scale_colour_manual(values=c("#D95F02","#7570B3"))+ - theme(#legend.position="bottom", - legend.text = element_text(size=12), - strip.text = element_text(size=20)) + xlim(c(0,2)) + - guides(colour = guide_legend(order=1,ncol=1), - linetype = guide_legend(order=2,ncol=1)) + labs(x = "Reproduction number", y = "", linetype = "", colour = "") + + scale_linetype_manual(values = c("solid"), + labels = function(x) str_wrap(x, width = 5)) + + scale_colour_manual(values = c("#D95F02", "#7570B3")) + + theme(legend.text = element_text(size = 12), + strip.text = element_text(size = 20)) + + xlim(c(0, 2)) + + guides(colour = guide_legend(order = 1, ncol = 1), + linetype = guide_legend(order = 2, ncol = 1)) return(plot) } diff --git a/R/forest_plot_severity.R b/R/forest_plot_severity.R index 4aae0d0..6307ebe 100644 --- a/R/forest_plot_severity.R +++ b/R/forest_plot_severity.R @@ -1,117 +1,122 @@ #' Create forest plot for severity #' -#' @param df data with outbreak information -#' @return returns flextable +#' @param df processed data with severity information e.g. IFR and CFR (see +#' vignette for each pathogen) +#' @return returns plot with a summary of IFR and CFR estimates +#' @importFrom dplyr filter arrange mutate group_by +#' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete +#' scale_x_continuous geom_segment geom_errorbar labs scale_color_brewer +#' scale_shape_manual theme guides element_text guide_legend #' @examples -#' +#' forest_plot_severity(df = data) #' @export -forest_plot_severity <- function(df,outbreak_naive=FALSE) { +forest_plot_severity <- function(df, outbreak_naive = FALSE) { parameter <- "Severity" if(outbreak_naive) { - df <- df %>% dplyr::filter(keep_record == 1) + df <- df %>% filter(keep_record == 1) } df_cfr <- df %>% filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% group_by(parameter_type) %>% - dplyr::arrange(article_label) + arrange(article_label) - df_cfr$pooled <- (sum(df_cfr$cfr_ifr_numerator, na.rm = TRUE)/sum(df_cfr$cfr_ifr_denominator, na.rm = TRUE))*100 - p <- df_cfr$pooled[1]/100 + df_cfr$pooled <- (sum(df_cfr$cfr_ifr_numerator, na.rm = TRUE) / + sum(df_cfr$cfr_ifr_denominator, na.rm = TRUE)) * 100 + p <- df_cfr$pooled[1] / 100 n <- sum(df_cfr$cfr_ifr_denominator, na.rm = TRUE) - df_cfr$pooled_low <- (p - 1.96*(sqrt((p * (1-p))/n)))*100 - df_cfr$pooled_upp <- (p + 1.96*(sqrt((p * (1-p))/n)))*100 + df_cfr$pooled_low <- (p - 1.96 * (sqrt((p * (1 - p)) / n))) * 100 + df_cfr$pooled_upp <- (p + 1.96 * (sqrt((p * (1 - p)) / n))) * 100 df_plot <- df_cfr %>% - dplyr::filter(is.na(parameter_value) == FALSE) %>% - #dplyr::select(c(article_id:distribution_par2_uncertainty, covidence_id:pooled_upp)) %>% - dplyr::arrange((cfr_ifr_method)) + filter(is.na(parameter_value) == FALSE) %>% + arrange((cfr_ifr_method)) - ## ensuring that each entry is on it's own line df_plot$article_label_unique <- make.unique(df_plot$article_label) - - ## sorry team this is also hacky but I'm gonna scream if these points don't go where we want them - df_plot <- df_plot %>% mutate(order_num = seq(1,dim(df_plot)[1],1)) + df_plot <- df_plot %>% mutate(order_num = seq(1, dim(df_plot)[1], 1)) if(outbreak_naive) { df_plot2 <- df_plot %>% - dplyr::arrange(outbreak_start_year) %>% - dplyr::mutate(order_num = row_number(), - p = parameter_value/100, - lower_ci = (p - 1.96*(sqrt((p * (1-p))/cfr_ifr_denominator)))*100, - upper_ci = (p + 1.96*(sqrt((p * (1-p))/cfr_ifr_denominator)))*100, - outbreak_year_cnt = as.character(paste0(outbreak_year_cnt, " [n =", cfr_ifr_denominator,"]"))) + arrange(outbreak_start_year) %>% + mutate(order_num = row_number(), + p = parameter_value / 100, + lower_ci = (p - 1.96 * (sqrt((p * (1 - p)) / + cfr_ifr_denominator))) * 100, + upper_ci = (p + 1.96 * (sqrt((p * (1 - p)) / + cfr_ifr_denominator))) * 100, + outbreak_year_cnt = + as.character(paste0(outbreak_year_cnt, + " [n =", cfr_ifr_denominator,"]"))) - plot <- ggplot(df_plot2, aes(x=parameter_value, - y=reorder(article_label_unique,-order_num), + plot <- ggplot(df_plot2, aes(x = parameter_value, + y = reorder(article_label_unique, -order_num), col = article_label)) + - theme_bw() + geom_point(size = 3) + - scale_y_discrete(labels=setNames(df_plot2$outbreak_year_cnt, - df_plot2$article_label_unique)) + - #geom_rect(xmin=unique(df_cfr$pooled_low),xmax=unique(df_cfr$pooled_upp), - # ymin=-Inf,ymax=Inf,alpha=0.02,col=NA,fill="grey") + + theme_bw() + + geom_point(size = 3) + + scale_y_discrete(labels = setNames(df_plot2$outbreak_year_cnt, + df_plot2$article_label_unique)) + geom_segment(aes(y = article_label_unique, yend = article_label_unique, x = lower_ci, xend = upper_ci, - group=parameter_data_id), - lwd=3, + group = parameter_data_id), + lwd = 3, alpha = 0.4) + - labs(x="Case fatality ratio (%)",y="",#y="Study", - linetype="",colour="",fill="") + - theme(legend.position="right", - legend.text = element_text(size=12), - strip.text = element_text(size=20)) + - # xlim(c(0, 100)) + - scale_color_brewer(palette = 'Dark2')+ - guides(colour = guide_legend(order=1,ncol=1), - linetype = guide_legend(order=2,ncol=1))+ - #geom_vline(xintercept = unique(df_cfr$pooled),linetype="dashed") + - scale_linetype_manual(values = c("solid"),labels = function(x) str_wrap(x, width = 5))+ - #scale_fill_manual(values="grey") + + labs(x = "Case fatality ratio (%)", + y = "", + linetype = "", + colour = "", + fill = "") + + theme(legend.position = "right", + legend.text = element_text(size = 12), + strip.text = element_text(size = 20)) + + scale_color_brewer(palette = "Dark2") + + guides(colour = guide_legend(order = 1, ncol = 1), + linetype = guide_legend(order = 2, ncol = 1)) + + scale_linetype_manual(values = c("solid"), + labels = function(x) str_wrap(x, width = 5)) + geom_vline(xintercept = c(0, 100), linetype = "dotted") + scale_x_continuous(breaks = seq(-20, 120, by = 20)) } else { df_plot <- df_plot %>% - dplyr::arrange(article_label_unique) %>% - dplyr::mutate(order_num = row_number()) + arrange(article_label_unique) %>% + mutate(order_num = row_number()) - plot <- ggplot(df_plot, aes(x=parameter_value, y=reorder(article_label_unique,-order_num), + plot <- ggplot(df_plot, aes(x = parameter_value, + y = reorder(article_label_unique, -order_num), col = cfr_ifr_method)) + - theme_bw() + geom_point(size = 3) + - scale_y_discrete(labels=setNames(df_plot$article_label, df_plot$article_label_unique)) + - geom_errorbar(aes(y=article_label_unique, - xmin=parameter_uncertainty_lower_value, - xmax=parameter_uncertainty_upper_value, - group=parameter_data_id, - linetype="Uncertainty interval"), - position=position_dodge(width=0.5), - width=0.25, - lwd=1) + - geom_segment(aes(y=article_label_unique, + theme_bw() + + geom_point(size = 3) + + scale_y_discrete(labels = setNames(df_plot$article_label, + df_plot$article_label_unique)) + + geom_errorbar(aes(y = article_label_unique, + xmin = parameter_uncertainty_lower_value, + xmax = parameter_uncertainty_upper_value, + group = parameter_data_id, + linetype = "Uncertainty interval"), + position = position_dodge(width = 0.5), + width = 0.25, + lwd = 1) + + geom_segment(aes(y = article_label_unique, yend = article_label_unique, - x=parameter_lower_bound, - xend=parameter_upper_bound, - group=parameter_data_id), - lwd=5, + x = parameter_lower_bound, + xend = parameter_upper_bound, + group = parameter_data_id), + lwd = 5, alpha = 0.4) + - labs(x="Case fatality ratio (%)",y="",#y="Study", - linetype="",colour="",fill="") + - theme(#legend.position="right", - legend.text = element_text(size=12), - strip.text = element_text(size=20)) + - # xlim(c(0, 100)) + - scale_colour_manual(values=c("#D95F02","#7570B3"))+ - # scale_color_brewer(palette = 'Dark2') + - # scale_colour_viridis_d(option="viridis",begin=0.2,end=0.8)+ - guides(colour = guide_legend(order=1,ncol=1), - linetype = guide_legend(order=2,ncol=1))+ - #geom_vline(xintercept = unique(df_cfr$pooled),linetype="dashed")+ - #geom_rect(xmin=unique(df_cfr$pooled_low),xmax=unique(df_cfr$pooled_upp), - # ymin=-Inf,ymax=Inf,alpha=0.05,col=NA,fill="grey"#,aes(fill="CFR - pooled 95% CI") - #)+ - scale_linetype_manual(values = c("solid"),labels = function(x) str_wrap(x, width = 5))+ - #scale_fill_manual(values="grey") + + labs(x = "Case fatality ratio (%)", + y = "", + linetype = "", + colour = "", + fill = "") + + theme( + legend.text = element_text(size = 12), + strip.text = element_text(size = 20)) + + scale_colour_manual(values = c("#D95F02", "#7570B3")) + + guides(colour = guide_legend(order = 1, ncol = 1), + linetype = guide_legend(order = 2, ncol = 1)) + + scale_linetype_manual(values = c("solid"), + labels = function(x) str_wrap(x, width = 5)) + geom_vline(xintercept = c(0, 100), linetype = "dotted") + scale_x_continuous(breaks = seq(-20, 120, by = 20)) + xlim(c(-20, 120)) diff --git a/R/get_table_field_options.R b/R/get_table_field_options.R index 386f7a9..6fecdb0 100644 --- a/R/get_table_field_options.R +++ b/R/get_table_field_options.R @@ -1,22 +1,37 @@ -#' Utility to obtain available table options to pick from +#' Utility to obtain available fields in a specified table #' -#' @param table_type which type of table (either parameter, outbreak, -#' model) should be loaded -#' @param field -#' @return return data for table_type and pathogen +#' Note: This will need to be extended when other pathogens are added +#' +#' @param table_type which type of table (either "parameter", "outbreak", or +#' "model") should be loaded +#' @param field can either be "all" to return all fields in the specified +#' table_type, or a specific variable name that the user wants to return +#' @param vignette_prepend string to allow loading data in vignettes +#' @return data for specified table_type and field +#' @importFrom dplyr mutate everything #' @importFrom readr read_csv #' @examples -#' get_available_table_field_options("model",field='Model type') +#' get_available_table_field_options(table_type = "model", field = "all") +#' +#' get_available_table_field_options(table_type = "model", field = "Model type") +#' +#' get_available_table_field_options(table_type = "parameter", +#' field = "Reproduction number method") #' @export -get_available_table_field_options <- function(table_type=NA,field="all",vignette_prepend = "") -{ - file_path_ob <- system.file("data", paste0("access_db_dropdown_", table_type,"s.csv"), package = "epireview") - if(file_path_ob=="") file_path_ob <- paste0(vignette_prepend,"data/access_db_dropdown_", table_type,"s.csv") +get_table_field_options <- function(table_type = NA, + field = "all", + vignette_prepend = "") { + + file_path_ob <- system.file( + "data", paste0("access_db_dropdown_", table_type, "s.csv"), + package = "epireview") + + if (file_path_ob == "") file_path_ob <- + paste0(vignette_prepend, "data/access_db_dropdown_", table_type, "s.csv") model_options <- read_csv(file_path_ob) - if(field=="all") - { - return(model_options %>% mutate(across(everything(),~replace_na(.x, "")))) + if (field == "all") { + return(model_options %>% mutate(across(everything(), ~replace_na(.x, "")))) } else { return(as.vector(na.omit(model_options[[field]]))) } diff --git a/R/outbreak_table.R b/R/outbreak_table.R index 8d8417f..1cdd3b3 100644 --- a/R/outbreak_table.R +++ b/R/outbreak_table.R @@ -1,36 +1,47 @@ -#' Create outbreak table +#' Create table with all outbreak data for a particular pathogen #' -#' @param df data with outbreak information +#' @param df processed data with outbreak information (see vignette for each +#' pathogen) #' @param pathogen name of pathogen -#' @return returns flextable +#' @return returns flextable summarising all extracted outbreaks for the +#' specified pathogen +#' @importFrom officer fp_border +#' @importFrom dplyr filter select rowwise mutate distinct arrange group_by +#' @importFrom flextable flextable set_flextable_defaults +#' @importFrom tm removeNumbers #' @examples -#' +#' outbreak_table(df = data, pathogen = "marburg") #' @export -outbreak_table <- function(df,pathogen){ - border_style = officer::fp_border(color="black", width=1) +outbreak_table <- function(df, pathogen) { + + border_style = fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") outbreak_tbl <- df %>% - dplyr::filter(is.na(outbreak_start_year) == FALSE) %>% - select(c(article_label, outbreak_start_day, outbreak_start_month, outbreak_start_year, - outbreak_end_day, outbreak_end_month, outbreak_date_year, - outbreak_country, outbreak_location, - cases_confirmed, cases_suspected, cases_asymptomatic, cases_mode_detection, - cases_severe_hospitalised, deaths)) %>% - dplyr::rowwise() %>% - dplyr::mutate(outbreak_start_month = str_replace_all(tm::removeNumbers(outbreak_start_month), "-",""), - outbreak_end_month = str_replace_all(tm::removeNumbers(outbreak_end_month), "-","")) %>% - dplyr::mutate(outbreak_start = date_start(start_day = outbreak_start_day, - start_month = outbreak_start_month, - start_year = outbreak_start_year), - outbreak_end = date_start(start_day = outbreak_end_day, - start_month = outbreak_end_month, - start_year = outbreak_date_year), - cases_mode_detection = str_replace_all(cases_mode_detection, "Molecular (PCR etc)", "Molecular")) %>% - dplyr::distinct() %>% - dplyr::arrange(outbreak_country, outbreak_date_year) %>% + filter(is.na(outbreak_start_year) == FALSE) %>% + select(c(article_label, outbreak_start_day, outbreak_start_month, + outbreak_start_year, outbreak_end_day, outbreak_end_month, + outbreak_date_year, outbreak_country, outbreak_location, + cases_confirmed, cases_suspected, cases_asymptomatic, + cases_mode_detection, cases_severe_hospitalised, deaths)) %>% + rowwise() %>% + mutate(outbreak_start_month = + str_replace_all(removeNumbers(outbreak_start_month), "-", ""), + outbreak_end_month = + str_replace_all(removeNumbers(outbreak_end_month), "-", "")) %>% + mutate(outbreak_start = date_start(start_day = outbreak_start_day, + start_month = outbreak_start_month, + start_year = outbreak_start_year), + outbreak_end = date_start(start_day = outbreak_end_day, + start_month = outbreak_end_month, + start_year = outbreak_date_year), + cases_mode_detection = str_replace_all(cases_mode_detection, + "Molecular (PCR etc)", + "Molecular")) %>% + distinct() %>% + arrange(outbreak_country, outbreak_date_year) %>% group_by(outbreak_country, outbreak_start_year) %>% - dplyr::select(Country = outbreak_country, + select(Country = outbreak_country, Location = outbreak_location, Article = article_label, Start = outbreak_start, @@ -42,14 +53,12 @@ outbreak_table <- function(df,pathogen){ "Severe/hospitalised" = cases_severe_hospitalised, "Confirmation Method" = cases_mode_detection) %>% mutate(index_of_change = row_number(), - index_of_change = ifelse(index_of_change == max(index_of_change),1,0)) %>% - flextable(col_keys = c("Country", - "Location", "Article", - "Start", "End", - "Deaths", "Confirmed", - "Suspected", "Asymptomatic", + index_of_change = + ifelse(index_of_change == max(index_of_change), 1, 0)) %>% + flextable(col_keys = c("Country", "Location", "Article", "Start", "End", + "Deaths", "Confirmed", "Suspected", "Asymptomatic", "Severe/hospitalised", "Confirmation Method")) %>% - fontsize(i = 1, size = 12, part = "header") %>% # adjust font size of header + fontsize(i = 1, size = 12, part = "header") %>% border_remove() %>% autofit() %>% theme_booktabs() %>% diff --git a/R/quality_assessment.R b/R/quality_assessment.R index 114128a..018c67f 100644 --- a/R/quality_assessment.R +++ b/R/quality_assessment.R @@ -1,33 +1,37 @@ -#' Plots for the quality assessment of the included studies +#' Plots for the quality assessment (QA) of the included studies #' -#' @param pathogen pathogen data set to consider -#' @return two plots for quality assessment +#' @param pathogen processed data with QA information (see vignette for each +#' pathogen) +#' @param prepend string to allow loading data in vignettes +#' @return two plots to summarise the quality assessment scores #' @importFrom readr read_csv #' @importFrom dplyr %>% filter group_by ungroup count n starts_with mutate #' case_when summarize #' @importFrom readr read_csv #' @importFrom tidyr pivot_longer #' @importFrom ggplot2 ggplot aes geom_point geom_smooth theme_bw xlab ylab -#' scale_x_continuous geom_bar scale_fill_manual coord_flip theme labs ggplot_add +#' scale_x_continuous geom_bar scale_fill_manual coord_flip theme labs +#' ggplot_add #' @importFrom patchwork wrap_plots #' @examples #' quality_assessment_plots(pathogen = "marburg") #' @export +quality_assessment_plots <- function(pathogen = NA, + prepend = "") { -quality_assessment_plots <- function(pathogen = NA, prepend="") - { - - if(is.na(pathogen)){ + if (is.na(pathogen)) { stop("pathogen name must be supplied") } - file_path <- system.file("data", paste0(pathogen, "_article.csv"), package = "epireview") - if(file_path=="") file_path <- paste0(prepend,'data/',pathogen, "_article.csv") - quality <- read_csv(file_path) + file_path <- system.file("data", paste0(pathogen, "_article.csv"), + package = "epireview") + if (file_path == "") + file_path <- paste0(prepend, "data/", pathogen, "_article.csv") + quality <- read_csv(file_path) # time series plot - QA_time_series <- quality %>% + qa_time_series <- quality %>% filter(!is.na(year_publication) & !is.na(pathogen)) %>% ggplot(aes(x = year_publication, y = score)) + geom_point() + @@ -36,7 +40,7 @@ quality_assessment_plots <- function(pathogen = NA, prepend="") xlab("Year of publication") + ylab("Quality assessment score") + scale_x_continuous( - # x axis determined by nearest decade to first publication and current year + # x axis determined by nearest decade to first publication and current year breaks = seq(round(min(quality$year_publication, na.rm = TRUE), -1), as.double(substring(Sys.time(), 1, 4)), by = 10)) @@ -44,11 +48,13 @@ quality_assessment_plots <- function(pathogen = NA, prepend="") # count plot by question answers <- quality %>% filter(!is.na(year_publication) & !is.na(pathogen)) %>% - dplyr::select(covidence_id, starts_with("qa")) %>% - pivot_longer(-covidence_id, names_to = "Question", values_to = "Assessment") %>% + select(covidence_id, starts_with("qa")) %>% + pivot_longer(-covidence_id, + names_to = "Question", + values_to = "Assessment") %>% mutate(Assessment = as.factor(as.character(Assessment)), - Assessment = case_when(Assessment == '1' ~ 'Yes', - Assessment == '0' ~ 'No')) %>% + Assessment = case_when(Assessment == "1" ~ "Yes", + Assessment == "0" ~ "No")) %>% mutate(Question = case_when( Question == "qa_m1" ~ "Q1 Method: \nClear & reproducible", Question == "qa_m2" ~ "Q2 Method: \nRobust & appropriate", @@ -62,22 +68,22 @@ quality_assessment_plots <- function(pathogen = NA, prepend="") levels = rev(levels(factor(answers$Question)))) answers$Assessment[is.na(answers$Assessment)] <- "NA" - answers$Assessment <- factor(answers$Assessment,levels = c("NA", "No", "Yes")) + answers$Assessment <- factor(answers$Assessment, + levels = c("NA", "No", "Yes")) - QA_answers <- answers %>% - group_by(Question, Assessment) %>% summarize(count=n()) %>% ungroup() %>% + qa_answers <- answers %>% + group_by(Question, Assessment) %>% summarize(count = n()) %>% ungroup() %>% ggplot(aes(fill = Assessment, y = count, x = Question)) + geom_bar(position = "stack", stat = "identity") + theme_bw() + scale_fill_manual(values = c("darkolivegreen2", "coral1", "grey70"), aesthetics = "fill", name = "", - breaks = c('Yes', 'No','NA')) + + breaks = c("Yes", "No", "NA")) + xlab("") + ylab("Count of papers") + coord_flip() + - theme(legend.position = 'bottom') + theme(legend.position = "bottom") - return(wrap_plots(QA_answers + labs(tag = "A") + QA_time_series + labs(tag = "B"))) + return(wrap_plots(qa_answers + labs(tag = "A") + + qa_time_series + labs(tag = "B"))) } - - diff --git a/R/risk_table.R b/R/risk_table.R index d22d950..82ab490 100644 --- a/R/risk_table.R +++ b/R/risk_table.R @@ -2,46 +2,62 @@ #' #' @param df data with outbreak information #' @param pathogen name of pathogen +#' @param supplement either TRUE or FALSE. If TRUE, returns supplementary +#' figures. #' @return returns flextable +#' @importFrom officer fp_border +#' @importFrom dplyr mutate mutate filter select rowwise summarise +#' @importFrom tidyr pivot_longer pivot_wider +#' @importFrom flextable set_flextable_defaults flextable fontsize +#' border_remove autofit theme_booktabs vline hline bold #' @examples -#' +#' risk_table(df = data, pathogen = "marburg") #' @export -risk_table <- function(df,pathogen,supplement=FALSE){ - border_style = officer::fp_border(color="black", width=1) +risk_table <- function(df, + pathogen, + supplement = FALSE) { + + border_style <- fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") risk_tbl_supp <- df %>% - dplyr::mutate(riskfactor_occupation = str_replace_all(riskfactor_occupation, "burrial", "burial")) %>% + mutate(riskfactor_occupation = + str_replace_all(riskfactor_occupation, "burrial", "burial")) %>% rowwise() %>% - dplyr::mutate(riskfactor_1 = str_split(riskfactor_name, ";")[[1]][1], - riskfactor_2 = str_split(riskfactor_name, ";")[[1]][2], - riskfactor_3 = str_split(riskfactor_name, ";")[[1]][3]) %>% - tidyr::pivot_longer(riskfactor_1:riskfactor_3, names_to = "riskfactor_num", values_to = "riskfactor_names") %>% - dplyr::mutate(riskfactor_name = if_else(riskfactor_names == "Occupation", - "Occupation - Funeral and burial services", - riskfactor_names)) %>% - dplyr::filter(is.na(riskfactor_name) == FALSE) %>% - dplyr::select(c(Article = article_label, - Country = population_country, - `Survey year`, - 'Outcome' = riskfactor_outcome, - 'Risk factor' = riskfactor_name, - 'Significant' = riskfactor_significant, - 'Adjusted' = riskfactor_adjusted, - `Sample size` = population_sample_size, - 'Population sample type' = population_sample_type, - `Population group` = population_group, - `Timing of survey` = method_moment_value)) + mutate(riskfactor_1 = str_split(riskfactor_name, ";")[[1]][1], + riskfactor_2 = str_split(riskfactor_name, ";")[[1]][2], + riskfactor_3 = str_split(riskfactor_name, ";")[[1]][3]) %>% + pivot_longer(riskfactor_1:riskfactor_3, + names_to = "riskfactor_num", + values_to = "riskfactor_names") %>% + mutate(riskfactor_name = + if_else(riskfactor_names == "Occupation", + "Occupation - Funeral and burial services", + riskfactor_names)) %>% + filter(is.na(riskfactor_name) == FALSE) %>% + select(c(Article = article_label, + Country = population_country, + `Survey year`, + "Outcome" = riskfactor_outcome, + "Risk factor" = riskfactor_name, + "Significant" = riskfactor_significant, + "Adjusted" = riskfactor_adjusted, + `Sample size` = population_sample_size, + "Population sample type" = population_sample_type, + `Population group` = population_group, + `Timing of survey` = method_moment_value)) risk_flextable_tbl <- risk_tbl_supp %>% arrange(Outcome, Country, `Survey year`) %>% group_by(Country) %>% mutate(index_of_change = row_number(), - index_of_change = ifelse(index_of_change == max(index_of_change),1,0)) %>% - flextable(col_keys = c("Article", "Country", "Survey year", "Outcome", 'Risk factor', 'Occupation', - 'Significant', 'Adjusted', 'Sample size', 'Population sample type', - 'Population group', 'Timing of survey')) %>% - fontsize(i = 1, size = 12, part = "header") %>% # adjust font size of header + index_of_change = + ifelse(index_of_change == max(index_of_change), 1, 0)) %>% + flextable(col_keys = c("Article", "Country", "Survey year", "Outcome", + "Risk factor", "Occupation", "Significant", + "Adjusted", "Sample size", "Population sample type", + "Population group", "Timing of survey")) %>% + fontsize(i = 1, size = 12, part = "header") %>% border_remove() %>% autofit() %>% theme_booktabs() %>% @@ -50,49 +66,54 @@ risk_table <- function(df,pathogen,supplement=FALSE){ bold(i = 1, bold = TRUE, part = "header") risk_tbl <- df %>% - dplyr::mutate(riskfactor_occupation = str_replace_all(riskfactor_occupation, "burrial", "burial")) %>% + mutate(riskfactor_occupation = + str_replace_all(riskfactor_occupation, "burrial", "burial")) %>% rowwise() %>% - dplyr::mutate(riskfactor_1 = str_split(riskfactor_name, ";")[[1]][1], - riskfactor_2 = str_split(riskfactor_name, ";")[[1]][2], - riskfactor_3 = str_split(riskfactor_name, ";")[[1]][3]) %>% - tidyr::pivot_longer(riskfactor_1:riskfactor_3, names_to = "riskfactor_num", values_to = "riskfactor_names") %>% - dplyr::mutate(riskfactor_name = if_else(riskfactor_names == "Occupation", - "Occupation - Funeral and burial services", - riskfactor_names)) %>% - dplyr::filter(is.na(riskfactor_name) == FALSE) %>% - dplyr::group_by(riskfactor_outcome, riskfactor_name, riskfactor_adjusted, - riskfactor_significant) %>% - dplyr::summarise(sample_size = sum(population_sample_size, na.rm = TRUE)) %>% - tidyr::pivot_wider(names_from = riskfactor_significant, + mutate(riskfactor_1 = str_split(riskfactor_name, ";")[[1]][1], + riskfactor_2 = str_split(riskfactor_name, ";")[[1]][2], + riskfactor_3 = str_split(riskfactor_name, ";")[[1]][3]) %>% + pivot_longer(riskfactor_1:riskfactor_3, + names_to = "riskfactor_num", + values_to = "riskfactor_names") %>% + mutate(riskfactor_name = if_else(riskfactor_names == "Occupation", + "Occupation - Funeral and burial services", + riskfactor_names)) %>% + filter(is.na(riskfactor_name) == FALSE) %>% + group_by(riskfactor_outcome, + riskfactor_name, + riskfactor_adjusted, + riskfactor_significant) %>% + summarise(sample_size = sum(population_sample_size, na.rm = TRUE)) %>% + pivot_wider(names_from = riskfactor_significant, values_from = sample_size) %>% - dplyr::mutate(riskfactor_outcome = if_else(riskfactor_outcome == "Serology", + mutate(riskfactor_outcome = if_else(riskfactor_outcome == "Serology", "Seropositivity", riskfactor_outcome)) %>% - dplyr::select('Outcome' = riskfactor_outcome, - 'Risk factor' = riskfactor_name, - 'Adjusted' = riskfactor_adjusted, - Significant, 'Not significant') + select("Outcome" = riskfactor_outcome, + "Risk factor" = riskfactor_name, + "Adjusted" = riskfactor_adjusted, + Significant, "Not significant") risk_main_flextable <- risk_tbl %>% - dplyr::arrange(Outcome, `Risk factor`, Adjusted) %>% - dplyr::group_by(Outcome) %>% - dplyr::mutate(index_of_change = row_number(), - index_of_change = ifelse(index_of_change == max(index_of_change),1,0)) %>% - flextable(col_keys = c('Outcome', 'Risk factor', 'Adjusted', - 'Significant', 'Not significant')) %>% - fontsize(i = 1, size = 12, part = "header") %>% # adjust font size of header + arrange(Outcome, `Risk factor`, Adjusted) %>% + group_by(Outcome) %>% + mutate(index_of_change = row_number(), + index_of_change = + ifelse(index_of_change == max(index_of_change), 1, 0)) %>% + flextable(col_keys = c("Outcome", "Risk factor", "Adjusted", + "Significant", "Not significant")) %>% + fontsize(i = 1, size = 12, part = "header") %>% border_remove() %>% autofit() %>% theme_booktabs() %>% - vline(j = c(2,3,4), border = border_style) %>% + vline(j = c(2, 3, 4), border = border_style) %>% hline(i = ~ index_of_change == 1) %>% bold(i = 1, bold = TRUE, part = "header") - if(supplement) - { + if (supplement) { return(risk_flextable_tbl) } else { - return( risk_main_flextable ) + return(risk_main_flextable) } } diff --git a/R/seroprevalence_table.R b/R/seroprevalence_table.R index 4142bca..18b0b50 100644 --- a/R/seroprevalence_table.R +++ b/R/seroprevalence_table.R @@ -1,19 +1,23 @@ #' Create seroprevalence table #' -#' @param df data with outbreak information +#' @param df processed data with seroprevalence information (see vignette for +#' each pathogen) #' @param pathogen name of pathogen -#' @return returns flextable +#' @return returns flextable with a summary of seroprevalence data +#' @importFrom officer fp_border #' @examples -#' +#' sero_table(df = data, pathogen = "marburg") #' @export -sero_table <- function(df,pathogen){ - border_style = officer::fp_border(color="black", width=1) +sero_table <- function(df, pathogen) { + + border_style <- fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") sero_tbl <- df %>% mutate(parameter_value = round(parameter_value, 2), - parameter_type = str_replace(parameter_type, 'Seroprevalence - ', '')) %>% - filter(parameter_class == 'Seroprevalence') %>% + parameter_type = + str_replace(parameter_type, "Seroprevalence - ", "")) %>% + filter(parameter_class == "Seroprevalence") %>% select(c(Article = article_label, Country = population_country, `Survey year`, @@ -28,25 +32,35 @@ sero_table <- function(df,pathogen){ `Timing of survey` = method_moment_value, `Disaggregated data\navailable` = method_disaggregated_by)) - multicountry <- sero_tbl[which(sero_tbl$Country == "Cameroon, Central African Republic, Chad, Republic of the Congo, Equatorial Guinea, Gabon"),] + multicountry <- sero_tbl[which( + sero_tbl$Country == "Cameroon, Central African Republic, Chad, + Republic of the Congo, Equatorial Guinea, Gabon"), ] sero_flextable_tbl <- sero_tbl %>% - filter(!Country == "Cameroon, Central African Republic, Chad, Republic of the Congo, Equatorial Guinea, Gabon") %>% + filter(!Country == "Cameroon, Central African Republic, Chad, + Republic of the Congo, Equatorial Guinea, Gabon") %>% arrange(Country, `Survey year`, `Parameter type*`) %>% rbind(multicountry) %>% group_by(Country) %>% mutate(index_of_change = row_number(), - index_of_change = ifelse(index_of_change == max(index_of_change),1,0)) %>% - flextable(col_keys = c("Article", "Country", "Parameter type*", "Survey year", "Seroprevalence (%)", 'Uncertainty (%)', 'Uncertainty type', - 'Number Seropositive', 'Sample size', 'Population Group', 'Timing of survey', 'Disaggregated data\navailable')) %>% - fontsize(i = 1, size = 12, part = "header") %>% # adjust font size of header + index_of_change = ifelse( + index_of_change == max(index_of_change), 1, 0)) %>% + flextable( + col_keys = c("Article", "Country", "Parameter type*", "Survey year", + "Seroprevalence (%)", "Uncertainty (%)", "Uncertainty type", + "Number Seropositive", "Sample size", "Population Group", + "Timing of survey", "Disaggregated data\navailable")) %>% + fontsize(i = 1, size = 12, part = "header") %>% border_remove() %>% autofit() %>% theme_booktabs() %>% vline(j = c(4), border = border_style) %>% hline(i = ~ index_of_change == 1) %>% bold(i = 1, bold = TRUE, part = "header") %>% - add_footer_lines("*HAI/HI: Hemagglutination Inhibition Assay; IFA: Indirect Fluorescent Antibody assay; IgG: Immunoglobulin G; IgM: Immunoglobulin M; Unspecified assay.") + add_footer_lines("*HAI/HI: Hemagglutination Inhibition Assay; + IFA: Indirect Fluorescent Antibody assay; + IgG: Immunoglobulin G; + IgM: Immunoglobulin M; Unspecified assay.") return(sero_flextable_tbl) } diff --git a/man/forest_plot_R.Rd b/man/forest_plot_R.Rd index 7940a7c..f68e83b 100644 --- a/man/forest_plot_R.Rd +++ b/man/forest_plot_R.Rd @@ -7,11 +7,15 @@ forest_plot_R(df) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with parameter information (see vignette for each +pathogen)} } \value{ -returns flextable +returns plot with a summary of reproduction number estimates } \description{ Create forest plot for reproduction numbers } +\examples{ +forest_plot_R(df = data) +} diff --git a/man/forest_plot_delay.Rd b/man/forest_plot_delay.Rd index 61e8a75..ffb0c08 100644 --- a/man/forest_plot_delay.Rd +++ b/man/forest_plot_delay.Rd @@ -7,12 +7,15 @@ forest_plot_delay(df) } \arguments{ -\item{df}{processed data with parameter information (see vignette for each +\item{df}{processed data with human delay information (see vignette for each pathogen)} } \value{ -returns flextable with a summary of the human delays +returns plot with a summary of the human delays } \description{ Create forest plot for delays } +\examples{ +forest_plot_delay(df = data) +} diff --git a/man/forest_plot_mutations.Rd b/man/forest_plot_mutations.Rd index da7c31e..545158d 100644 --- a/man/forest_plot_mutations.Rd +++ b/man/forest_plot_mutations.Rd @@ -7,11 +7,15 @@ forest_plot_mutations(df) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with parameter information (see vignette for each +pathogen)} } \value{ -returns flextable +returns plot with a summary of genetic mutations } \description{ Create forest plot for genetic mutations } +\examples{ +forest_plot_mutations(df = data) +} diff --git a/man/forest_plot_severity.Rd b/man/forest_plot_severity.Rd index df8adec..0d0cb87 100644 --- a/man/forest_plot_severity.Rd +++ b/man/forest_plot_severity.Rd @@ -7,11 +7,15 @@ forest_plot_severity(df, outbreak_naive = FALSE) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with severity information e.g. IFR and CFR (see +vignette for each pathogen)} } \value{ -returns flextable +returns plot with a summary of IFR and CFR estimates } \description{ Create forest plot for severity } +\examples{ +forest_plot_severity(df = data) +} diff --git a/man/get_available_table_field_options.Rd b/man/get_available_table_field_options.Rd deleted file mode 100644 index 7ac1676..0000000 --- a/man/get_available_table_field_options.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_table_field_options.R -\name{get_available_table_field_options} -\alias{get_available_table_field_options} -\title{Utility to obtain available table options to pick from} -\usage{ -get_available_table_field_options( - table_type = NA, - field = "all", - vignette_prepend = "" -) -} -\arguments{ -\item{table_type}{which type of table (either parameter, outbreak, -model) should be loaded} -} -\value{ -return data for table_type and pathogen -} -\description{ -Utility to obtain available table options to pick from -} -\examples{ -get_available_table_field_options("model",field='Model type') -} diff --git a/man/get_table_field_options.Rd b/man/get_table_field_options.Rd new file mode 100644 index 0000000..583f2d2 --- /dev/null +++ b/man/get_table_field_options.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_table_field_options.R +\name{get_table_field_options} +\alias{get_table_field_options} +\title{Utility to obtain available fields in a specified table} +\usage{ +get_table_field_options(table_type = NA, field = "all", vignette_prepend = "") +} +\arguments{ +\item{table_type}{which type of table (either "parameter", "outbreak", or +"model") should be loaded} + +\item{field}{can either be "all" to return all fields in the specified +table_type, or a specific variable name that the user wants to return} + +\item{vignette_prepend}{string to allow loading data in vignettes} +} +\value{ +data for specified table_type and field +} +\description{ +Note: This will need to be extended when other pathogens are added +} +\examples{ +get_available_table_field_options(table_type = "model", field = "all") + +get_available_table_field_options(table_type = "model", field = "Model type") + +get_available_table_field_options(table_type = "parameter", + field = "Reproduction number method") +} diff --git a/man/load_data.Rd b/man/load_data.Rd deleted file mode 100644 index 0870c01..0000000 --- a/man/load_data.Rd +++ /dev/null @@ -1,23 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/load_data.R -\name{load_data} -\alias{load_data} -\title{Load data for a particular pathogen} -\usage{ -load_data(table_type = NA, pathogen = NA, vignette_prepend = "") -} -\arguments{ -\item{table_type}{which type of table (either article, parameter, outbreak, -model) should be loaded} - -\item{pathogen}{name of pathogen} -} -\value{ -return data for table_type and pathogen -} -\description{ -Load data for a particular pathogen -} -\examples{ -load_data("outbreak","marburg") -} diff --git a/man/load_epidata.Rd b/man/load_epidata.Rd new file mode 100644 index 0000000..1393b59 --- /dev/null +++ b/man/load_epidata.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/load_epidata.R +\name{load_epidata} +\alias{load_epidata} +\title{Load data for a particular pathogen} +\usage{ +load_epidata(table_type = NA, pathogen = NA, vignette_prepend = "") +} +\arguments{ +\item{table_type}{which type of table (either "article", "parameter", +"outbreak", or "model") should be loaded} + +\item{pathogen}{name of pathogen} + +\item{vignette_prepend}{string to allow loading data in vignettes} +} +\value{ +return data for specified table_type and pathogen +} +\description{ +Load data for a particular pathogen +} +\examples{ +load_epidata(table_type = "outbreak", pathogen = "marburg") +} diff --git a/man/marburg_model.csv.Rd b/man/marburg_model.csv.Rd new file mode 100644 index 0000000..cd323dd --- /dev/null +++ b/man/marburg_model.csv.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{marburg_model.csv} +\alias{marburg_model.csv} +\title{Data on the models identified in the systematic review of Marburg articles} +\format{ +A csv file containing the following parameters: + +XXYY +} +\source{ +Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +et al. Marburg Virus Disease outbreaks, mathematical models, and disease +parameters: a Systematic Review \link{Internet}. medRxiv; 2023 \link{cited 2023 Jul 13}. +p. 2023.07.10.23292424. +Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +} +\description{ +This data set gives: + +XXYY +} diff --git a/man/marburg_outbreak.csv.Rd b/man/marburg_outbreak.csv.Rd new file mode 100644 index 0000000..aa9e036 --- /dev/null +++ b/man/marburg_outbreak.csv.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{marburg_outbreak.csv} +\alias{marburg_outbreak.csv} +\title{Data on the outbreaks identified in the systematic review of Marburg articles} +\format{ +A csv file containing the following parameters: + +XXYY +} +\source{ +Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +et al. Marburg Virus Disease outbreaks, mathematical models, and disease +parameters: a Systematic Review \link{Internet}. medRxiv; 2023 \link{cited 2023 Jul 13}. +p. 2023.07.10.23292424. +Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +} +\description{ +This data set gives: + +XXYY +} diff --git a/man/marburg_parameter.csv.Rd b/man/marburg_parameter.csv.Rd new file mode 100644 index 0000000..947973c --- /dev/null +++ b/man/marburg_parameter.csv.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{marburg_parameter.csv} +\alias{marburg_parameter.csv} +\title{Data on the parameters identified in the systematic review of Marburg articles} +\format{ +A csv file containing the following parameters: + +XXYY +} +\source{ +Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +et al. Marburg Virus Disease outbreaks, mathematical models, and disease +parameters: a Systematic Review \link{Internet}. medRxiv; 2023 \link{cited 2023 Jul 13}. +p. 2023.07.10.23292424. +Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +} +\description{ +This data set gives: + +XXYY +} diff --git a/man/outbreak_table.Rd b/man/outbreak_table.Rd index f12fbf5..8c00db2 100644 --- a/man/outbreak_table.Rd +++ b/man/outbreak_table.Rd @@ -2,18 +2,23 @@ % Please edit documentation in R/outbreak_table.R \name{outbreak_table} \alias{outbreak_table} -\title{Create outbreak table} +\title{Create table with all outbreak data for a particular pathogen} \usage{ outbreak_table(df, pathogen) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with outbreak information (see vignette for each +pathogen)} \item{pathogen}{name of pathogen} } \value{ -returns flextable +returns flextable summarising all extracted outbreaks for the +specified pathogen } \description{ -Create outbreak table +Create table with all outbreak data for a particular pathogen +} +\examples{ +outbreak_table(df = data, pathogen = "marburg") } diff --git a/man/quality_assessment_plots.Rd b/man/quality_assessment_plots.Rd index 7879ec3..ead434f 100644 --- a/man/quality_assessment_plots.Rd +++ b/man/quality_assessment_plots.Rd @@ -2,18 +2,21 @@ % Please edit documentation in R/quality_assessment.R \name{quality_assessment_plots} \alias{quality_assessment_plots} -\title{Plots for the quality assessment of the included studies} +\title{Plots for the quality assessment (QA) of the included studies} \usage{ quality_assessment_plots(pathogen = NA, prepend = "") } \arguments{ -\item{pathogen}{pathogen data set to consider} +\item{pathogen}{processed data with QA information (see vignette for each +pathogen)} + +\item{prepend}{string to allow loading data in vignettes} } \value{ -two plots for quality assessment +two plots to summarise the quality assessment scores } \description{ -Plots for the quality assessment of the included studies +Plots for the quality assessment (QA) of the included studies } \examples{ quality_assessment_plots(pathogen = "marburg") diff --git a/man/risk_table.Rd b/man/risk_table.Rd index 24ed518..79e565d 100644 --- a/man/risk_table.Rd +++ b/man/risk_table.Rd @@ -10,6 +10,9 @@ risk_table(df, pathogen, supplement = FALSE) \item{df}{data with outbreak information} \item{pathogen}{name of pathogen} + +\item{supplement}{either TRUE or FALSE. If TRUE, returns supplementary +figures.} } \value{ returns flextable @@ -17,3 +20,6 @@ returns flextable \description{ Create risk table } +\examples{ +risk_table(df = data, pathogen = "marburg") +} diff --git a/man/sero_table.Rd b/man/sero_table.Rd index 8ee6216..9b7b3bf 100644 --- a/man/sero_table.Rd +++ b/man/sero_table.Rd @@ -7,13 +7,17 @@ sero_table(df, pathogen) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with seroprevalence information (see vignette for +each pathogen)} \item{pathogen}{name of pathogen} } \value{ -returns flextable +returns flextable with a summary of seroprevalence data } \description{ Create seroprevalence table } +\examples{ +sero_table(df = data, pathogen = "marburg") +} From 4057d087ee4ed9c374e253cbe150c52a24eb1783 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Mon, 17 Jul 2023 19:43:15 +0100 Subject: [PATCH 24/40] start data documentation --- R/data.R | 130 ++++++++++++++++++++++++++++++----- data/.DS_Store | Bin 6148 -> 6148 bytes man/marburg_model.csv.Rd | 33 +++++++-- man/marburg_outbreak.csv.Rd | 37 ++++++++-- man/marburg_parameter.csv.Rd | 66 ++++++++++++++++-- 5 files changed, 230 insertions(+), 36 deletions(-) diff --git a/R/data.R b/R/data.R index b606537..15db068 100644 --- a/R/data.R +++ b/R/data.R @@ -1,16 +1,35 @@ -#' Data on the models identified in the systematic review of Marburg articles +#' Data on the models identified in the systematic review of articles related +#' to Marburg virus disease. #' #' @description -#' -#' This data set gives: -#' -#' XXYY +#' This data set provides all extracted data for mathematical models applied to +#' Marburg virus disease (MVD). #' #' @name marburg_model.csv #' @docType data #' @format A csv file containing the following parameters: #' -#' XXYY +#' - model_data_id = ID variable for the model. +#' - article_id = ID variable for the article the model came from. +#' - model_type = whether the model was compartmental, branching process, +#' agent/individual based, other, or unspecified. +#' - compartmental_type = if the model is compartmental, whether the model is +#' SIS, SIR, SEIR, or "other". +#' - stoch_deter = whether the article specified whether the model was +#' stochastic, deterministic, or both. +#' - theoretical_model = "TRUE" or "FALSE". "TRUE" if the model is not fit to +#' data. +#' - interventions_type = interventions modelled e.g. vaccination, quarantine, +#' vector control, treatment, contact tracing, hospitals, treatment centres, +#' safe burials, behaviour changes, other, or unspecified. +#' - code_available = whether the code was made available in the article. +#' - transmission_route = which transmission route was modelled, e.g. airborne +#' or close contact, human to human, vector to human, animal to human, sexual, +#' or unspecified. +#' - assumptions = assumptions used in the model e.g. homogenous mixing, latent +#' period is the same as incubation period, heterogeneity in transmission rates +#' between groups or over time, age dependent susceptibility, or unspecified. +#' - covidence_id = article identifier used by the Imperial team. #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease @@ -20,19 +39,42 @@ #' NULL -#' Data on the outbreaks identified in the systematic review of Marburg articles +#' Data on the outbreaks identified in the systematic review of articles +#' related to Marburg virus disease. #' #' @description -#' -#' This data set gives: -#' -#' XXYY +#' This data set provides all extracted data for outbreaks of Marburg virus +#' disease (MVD). #' #' @name marburg_outbreak.csv #' @docType data #' @format A csv file containing the following parameters: #' -#' XXYY +#' - outbreak_id = ID variable for the outbreak. +#' - article_id = ID variable for the article the outbreak data came from. +#' - outbreak_start_day = Day that the outbreak started (numeric - DD). +#' - outbreak_start_month = Month that the outbreak started (three letter +#' abbreviation e.g. "Aug"). +#' - outbreak_start_year = Year that the outbreak started (numeric - YYYY). +#' - outbreak_end_day = Day that the outbreak ended (numeric - DD). +#' - outbreak_end_month = Month that the outbreak ended (three letter +#' abbreviation e.g. "Aug"). +#' - outbreak_date_year = Year that the outbreak ended (numeric - YYYY). +#' - outbreak_duration_months = Outbreak duration in months. +#' - outbreak_size = total outbreak size. +#' - asymptomatic_transmission = whether asymptomatic transmission occurred, +#' either TRUE or FALSE. +#' - outbreak_country = country in which the outbreak occurred. +#' - outbreak_location = location that the outbreak occurred. +#' - cases_confirmed = total number of confirmed cases. +#' - cases_mode_detection = either diagnosed based on symptoms alone +#' ("Symptoms"), confirmed via a laboratory test such as PCR ("Molecular +#' (PCR etc)"), "Not specified", or NA. +#' - cases_suspected = total number of suspected cases. +#' - cases_asymptomatic = total number of asymptomatic cases. +#' - deaths = total number of deaths. +#' - cases_severe_hospitalised = total number of severe hospitalised cases. +#' - covidence_id = article identifier used by the Imperial team. #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease @@ -42,19 +84,71 @@ NULL #' NULL -#' Data on the parameters identified in the systematic review of Marburg articles +#' Data on the parameters identified in the systematic review of articles +#' related to Marburg virus disease. #' #' @description -#' -#' This data set gives: -#' -#' XXYY +#' This data set provides all extracted parameters for Marburg virus disease +#' (MVD). #' #' @name marburg_parameter.csv #' @docType data #' @format A csv file containing the following parameters: #' -#' XXYY +#' - parameter_data_id +#' - article_id +#' - parameter_type +#' - parameter_value +#' - parameter_unit +#' - parameter_lower_bound +#' - parameter_upper_bound +#' - parameter_value_type +#' - parameter_uncertainty_single_value +#' - parameter_uncertainty_singe_type +#' - parameter_uncertainty_lower_value +#' - parameter_uncertainty_upper_value +#' - parameter_uncertainty_type +#' - cfr_ifr_numerator +#' - cfr_ifr_denominator +#' - distribution_type +#' - distribution_par1_value +#' - distribution_par1_type +#' - distribution_par1_uncertainty +#' - distribution_par2_value +#' - distribution_par2_type +#' - distribution_par2_uncertainty +#' - method_from_supplement +#' - method_moment_value +#' - cfr_ifr_method +#' - method_r +#' - method_disaggregated_by +#' - method_disaggregated +#' - method_disaggregated_only +#' - riskfactor_outcome +#' - riskfactor_name +#' - riskfactor_occupation +#' - riskfactor_significant +#' - riskfactor_adjusted +#' - population_sex +#' - population_sample_type +#' - population_group +#' - population_age_min +#' - population_age_max +#' - population_sample_size +#' - population_country +#' - population_location +#' - population_study_start_day +#' - population_study_start_month +#' - population_study_start_year +#' - population_study_end_day +#' - population_study_end_month +#' - population_study_end_year +#' - genome_site +#' - genomic_sequence_available +#' - parameter_class +#' - covidence_id +#' - Uncertainty +#' - Survey year #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease diff --git a/data/.DS_Store b/data/.DS_Store index eeeef1b237282371df92901119e1e3b3a1533027..83ab66a8b7d60508c2573d7bf5c2738914298dce 100644 GIT binary patch literal 6148 zcmeHKK~BRk5FD3ERB$N*BrcWA2P*M{P?ZB`9so^)Dnv@Ew1sQ#Jcifs7)~&2TU2!t zsV4+zx7r=s*&R0{*^U92(K@>T`T%-#!R`S=gUNI8nsvg+KG8UiC6>5FhLllF6;K6! zy8^Oy2bf^W-#u6FX8mR;QDDK8Zv*0=j*(frg@Q)MYfPj`tZ{k zTY%k>xxgAL?iwZ8CwOe-e~b9fcjR9%ucXh(zoM6IGnhd%!!c{5HswDoF{297Tj7E4 zpOdLk2lE=S9MxDhS~fF$L<}c2hFG&kp3W@dIj!;3wP|L0kC@n1`_l^W%ogh%deo>2 zr~<0Mw*s<1Sh`>mu=41(4hDAxAa*(IjBWW4kQy5>30QgL6Pod*L|>X!;@GWYC}r{HOw7 D-9eaB delta 114 zcmZoMXfc=|#>CJzu~2NHo}wrt0|NsP3otO0G88eSrxYjWB;`*mRF?rsuruT`Bm#w# ykR|hT7&i-Yh_P&J@M7M~&cV+CGz=*4oq009h%P5c+W{bEm~6u%y*Wl?2{QoL(Ha8) diff --git a/man/marburg_model.csv.Rd b/man/marburg_model.csv.Rd index cd323dd..e8d64be 100644 --- a/man/marburg_model.csv.Rd +++ b/man/marburg_model.csv.Rd @@ -3,11 +3,33 @@ \docType{data} \name{marburg_model.csv} \alias{marburg_model.csv} -\title{Data on the models identified in the systematic review of Marburg articles} +\title{Data on the models identified in the systematic review of articles related +to Marburg virus disease.} \format{ A csv file containing the following parameters: - -XXYY +\itemize{ +\item model_data_id = ID variable for the model. +\item article_id = ID variable for the article the model came from. +\item model_type = whether the model was compartmental, branching process, +agent/individual based, other, or unspecified. +\item compartmental_type = if the model is compartmental, whether the model is +SIS, SIR, SEIR, or "other". +\item stoch_deter = whether the article specified whether the model was +stochastic, deterministic, or both. +\item theoretical_model = "TRUE" or "FALSE". "TRUE" if the model is not fit to +data. +\item interventions_type = interventions modelled e.g. vaccination, quarantine, +vector control, treatment, contact tracing, hospitals, treatment centres, +safe burials, behaviour changes, other, or unspecified. +\item code_available = whether the code was made available in the article. +\item transmission_route = which transmission route was modelled, e.g. airborne +or close contact, human to human, vector to human, animal to human, sexual, +or unspecified. +\item assumptions = assumptions used in the model e.g. homogenous mixing, latent +period is the same as incubation period, heterogeneity in transmission rates +between groups or over time, age dependent susceptibility, or unspecified. +\item covidence_id = article identifier used by the Imperial team. +} } \source{ Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, @@ -17,7 +39,6 @@ p. 2023.07.10.23292424. Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 } \description{ -This data set gives: - -XXYY +This data set provides all extracted data for mathematical models applied to +Marburg virus disease (MVD). } diff --git a/man/marburg_outbreak.csv.Rd b/man/marburg_outbreak.csv.Rd index aa9e036..b299ef7 100644 --- a/man/marburg_outbreak.csv.Rd +++ b/man/marburg_outbreak.csv.Rd @@ -3,11 +3,37 @@ \docType{data} \name{marburg_outbreak.csv} \alias{marburg_outbreak.csv} -\title{Data on the outbreaks identified in the systematic review of Marburg articles} +\title{Data on the outbreaks identified in the systematic review of articles +related to Marburg virus disease.} \format{ A csv file containing the following parameters: - -XXYY +\itemize{ +\item outbreak_id = ID variable for the outbreak. +\item article_id = ID variable for the article the outbreak data came from. +\item outbreak_start_day = Day that the outbreak started (numeric - DD). +\item outbreak_start_month = Month that the outbreak started (three letter +abbreviation e.g. "Aug"). +\item outbreak_start_year = Year that the outbreak started (numeric - YYYY). +\item outbreak_end_day = Day that the outbreak ended (numeric - DD). +\item outbreak_end_month = Month that the outbreak ended (three letter +abbreviation e.g. "Aug"). +\item outbreak_date_year = Year that the outbreak ended (numeric - YYYY). +\item outbreak_duration_months = Outbreak duration in months. +\item outbreak_size = total outbreak size. +\item asymptomatic_transmission = whether asymptomatic transmission occurred, +either TRUE or FALSE. +\item outbreak_country = country in which the outbreak occurred. +\item outbreak_location = location that the outbreak occurred. +\item cases_confirmed = total number of confirmed cases. +\item cases_mode_detection = either diagnosed based on symptoms alone +("Symptoms"), confirmed via a laboratory test such as PCR ("Molecular +(PCR etc)"), "Not specified", or NA. +\item cases_suspected = total number of suspected cases. +\item cases_asymptomatic = total number of asymptomatic cases. +\item deaths = total number of deaths. +\item cases_severe_hospitalised = total number of severe hospitalised cases. +\item covidence_id = article identifier used by the Imperial team. +} } \source{ Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, @@ -17,7 +43,6 @@ p. 2023.07.10.23292424. Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 } \description{ -This data set gives: - -XXYY +This data set provides all extracted data for outbreaks of Marburg virus +disease (MVD). } diff --git a/man/marburg_parameter.csv.Rd b/man/marburg_parameter.csv.Rd index 947973c..d98ec63 100644 --- a/man/marburg_parameter.csv.Rd +++ b/man/marburg_parameter.csv.Rd @@ -3,11 +3,66 @@ \docType{data} \name{marburg_parameter.csv} \alias{marburg_parameter.csv} -\title{Data on the parameters identified in the systematic review of Marburg articles} +\title{Data on the parameters identified in the systematic review of articles +related to Marburg virus disease.} \format{ A csv file containing the following parameters: - -XXYY +\itemize{ +\item parameter_data_id +\item article_id +\item parameter_type +\item parameter_value +\item parameter_unit +\item parameter_lower_bound +\item parameter_upper_bound +\item parameter_value_type +\item parameter_uncertainty_single_value +\item parameter_uncertainty_singe_type +\item parameter_uncertainty_lower_value +\item parameter_uncertainty_upper_value +\item parameter_uncertainty_type +\item cfr_ifr_numerator +\item cfr_ifr_denominator +\item distribution_type +\item distribution_par1_value +\item distribution_par1_type +\item distribution_par1_uncertainty +\item distribution_par2_value +\item distribution_par2_type +\item distribution_par2_uncertainty +\item method_from_supplement +\item method_moment_value +\item cfr_ifr_method +\item method_r +\item method_disaggregated_by +\item method_disaggregated +\item method_disaggregated_only +\item riskfactor_outcome +\item riskfactor_name +\item riskfactor_occupation +\item riskfactor_significant +\item riskfactor_adjusted +\item population_sex +\item population_sample_type +\item population_group +\item population_age_min +\item population_age_max +\item population_sample_size +\item population_country +\item population_location +\item population_study_start_day +\item population_study_start_month +\item population_study_start_year +\item population_study_end_day +\item population_study_end_month +\item population_study_end_year +\item genome_site +\item genomic_sequence_available +\item parameter_class +\item covidence_id +\item Uncertainty +\item Survey year +} } \source{ Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, @@ -17,7 +72,6 @@ p. 2023.07.10.23292424. Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 } \description{ -This data set gives: - -XXYY +This data set provides all extracted parameters for Marburg virus disease +(MVD). } From dcfc1048226b1ac6e69704f89f9461a2ae91c35e Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Tue, 18 Jul 2023 15:15:30 +0100 Subject: [PATCH 25/40] start R CMD check fixes and new data_delay_table() function --- .Rbuildignore | 1 + DESCRIPTION | 15 +- LICENSE | 21 - LICENSE.md | 595 ++++++++++++++++++ NAMESPACE | 20 +- R/append_new_entry_to_table.R | 14 +- R/create_new_article_entry.R | 40 +- R/create_new_model_entry.R | 45 +- R/create_new_outbreak_entry.R | 28 +- R/create_new_parameter_entry.R | 159 ++--- R/data.R | 35 +- R/data_delay_table.R | 41 ++ R/date_start.R | 14 +- R/delay_table.R | 19 +- ...rest_plot_delays.R => forest_plot_delay.R} | 9 + R/forest_plot_mutations.R | 9 +- R/forest_plot_r.R | 20 +- R/forest_plot_severity.R | 23 +- R/get_table_field_options.R | 3 +- R/load_epidata.R | 4 +- R/outbreak_table.R | 11 +- R/quality_assessment.R | 7 +- R/risk_table.R | 9 + R/seroprevalence_table.R | 7 + man/append_new_entry_to_table.Rd | 2 + man/create_new_parameter_entry.Rd | 37 +- man/data_delay_table.Rd | 22 + man/delay_table.Rd | 10 +- man/forest_plot_R.Rd | 8 +- man/forest_plot_delay.Rd | 2 +- man/forest_plot_severity.Rd | 2 + man/marburg_article.Rd | 22 + ...{marburg_model.csv.Rd => marburg_model.Rd} | 7 +- ...rg_outbreak.csv.Rd => marburg_outbreak.Rd} | 7 +- ..._parameter.csv.Rd => marburg_parameter.Rd} | 7 +- vignettes/pathogen_database_field_options.Rmd | 8 +- vignettes/pathogen_marburg.Rmd | 9 +- 37 files changed, 1060 insertions(+), 232 deletions(-) delete mode 100644 LICENSE create mode 100644 LICENSE.md create mode 100644 R/data_delay_table.R rename R/{forest_plot_delays.R => forest_plot_delay.R} (88%) create mode 100644 man/data_delay_table.Rd create mode 100644 man/marburg_article.Rd rename man/{marburg_model.csv.Rd => marburg_model.Rd} (92%) rename man/{marburg_outbreak.csv.Rd => marburg_outbreak.Rd} (92%) rename man/{marburg_parameter.csv.Rd => marburg_parameter.Rd} (92%) diff --git a/.Rbuildignore b/.Rbuildignore index 5f3f6bb..5fbe2fa 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -7,3 +7,4 @@ ^doc$ ^Meta$ ^miscellaneous_files$ +^LICENSE\.md$ diff --git a/DESCRIPTION b/DESCRIPTION index ac5810f..e136041 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -6,14 +6,13 @@ Authors@R: c( comment = c(ORCID = "0000-0002-5213-4364")), person("Christian", "Morgenstern", email = "c.morgenstern@imperial.ac.uk", role = "aut", comment = c(ORCID = "0000-0003-3735-1130")), - person("Gina", "Cuomo-Dannenburg",role = "ctb", comment = c(ORCID = "0000-0001-6821-0352")), - person("Ruth", "McCabe", role = "ctb", comment = c(ORCID = "0000-0002-6368-9103")), - person("Kelly", "McCain", role = "ctb", comment = c(ORCID = "0000-0003-2393-2217"))) + person("Gina", "Cuomo-Dannenburg", role = "aut", comment = c(ORCID = "0000-0001-6821-0352")), + person("Ruth", "McCabe", role = "aut", comment = c(ORCID = "0000-0002-6368-9103")), + person("Kelly", "McCain", role = "aut", comment = c(ORCID = "0000-0003-2393-2217"))) Description: Contains the latest open access pathogen data from the Pathogen Epidemiology Review Group (PERG). Tools are available to update pathogen databases with new peer-reviewed data as it becomes available, and to summarise the latest data using tables and figures. -License: GPL (>=2) +License: GPL (>= 3) Imports: ggplot2, - tidyverse, tibble, dplyr, tidyr, @@ -21,10 +20,14 @@ Imports: patchwork, flextable, tm, + officer, + stringr, validate, - meta + rlang Suggests: knitr, + meta, + tidyverse, testthat (>= 3.0.0) Encoding: UTF-8 Roxygen: list(markdown = TRUE) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 7fd747d..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 MRC Centre for Global Infectious Disease Analysis - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..175443c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,595 @@ +GNU General Public License +========================== + +_Version 3, 29 June 2007_ +_Copyright © 2007 Free Software Foundation, Inc. <>_ + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +## Preamble + +The GNU General Public License is a free, copyleft license for software and other +kinds of works. + +The licenses for most software and other practical works are designed to take away +your freedom to share and change the works. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change all versions of a +program--to make sure it remains free software for all its users. We, the Free +Software Foundation, use the GNU General Public License for most of our software; it +applies also to any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General +Public Licenses are designed to make sure that you have the freedom to distribute +copies of free software (and charge for them if you wish), that you receive source +code or can get it if you want it, that you can change the software or use pieces of +it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or +asking you to surrender the rights. Therefore, you have certain responsibilities if +you distribute copies of the software, or if you modify it: responsibilities to +respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, +you must pass on to the recipients the same freedoms that you received. You must make +sure that they, too, receive or can get the source code. And you must show them these +terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: **(1)** assert +copyright on the software, and **(2)** offer you this License giving you legal permission +to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is +no warranty for this free software. For both users' and authors' sake, the GPL +requires that modified versions be marked as changed, so that their problems will not +be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of +the software inside them, although the manufacturer can do so. This is fundamentally +incompatible with the aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we have designed +this version of the GPL to prohibit the practice for those products. If such problems +arise substantially in other domains, we stand ready to extend this provision to +those domains in future versions of the GPL, as needed to protect the freedom of +users. + +Finally, every program is threatened constantly by software patents. States should +not allow patents to restrict development and use of software on general-purpose +computers, but in those that do, we wish to avoid the special danger that patents +applied to a free program could make it effectively proprietary. To prevent this, the +GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + +## TERMS AND CONDITIONS + +### 0. Definitions + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this +License. Each licensee is addressed as “you”. “Licensees” and +“recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work in +a fashion requiring copyright permission, other than the making of an exact copy. The +resulting work is called a “modified version” of the earlier work or a +work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on +the Program. + +To “propagate” a work means to do anything with it that, without +permission, would make you directly or secondarily liable for infringement under +applicable copyright law, except executing it on a computer or modifying a private +copy. Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through a computer +network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to the +extent that it includes a convenient and prominently visible feature that **(1)** +displays an appropriate copyright notice, and **(2)** tells the user that there is no +warranty for the work (except to the extent that warranties are provided), that +licensees may convey the work under this License, and how to view a copy of this +License. If the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +### 1. Source Code + +The “source code” for a work means the preferred form of the work for +making modifications to it. “Object code” means any non-source form of a +work. + +A “Standard Interface” means an interface that either is an official +standard defined by a recognized standards body, or, in the case of interfaces +specified for a particular programming language, one that is widely used among +developers working in that language. + +The “System Libraries” of an executable work include anything, other than +the work as a whole, that **(a)** is included in the normal form of packaging a Major +Component, but which is not part of that Major Component, and **(b)** serves only to +enable use of the work with that Major Component, or to implement a Standard +Interface for which an implementation is available to the public in source code form. +A “Major Component”, in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system (if any) on which +the executable work runs, or a compiler used to produce the work, or an object code +interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the +source code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. However, +it does not include the work's System Libraries, or general-purpose tools or +generally available free programs which are used unmodified in performing those +activities but which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for the work, and +the source code for shared libraries and dynamically linked subprograms that the work +is specifically designed to require, such as by intimate data communication or +control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +### 2. Basic Permissions + +All rights granted under this License are granted for the term of copyright on the +Program, and are irrevocable provided the stated conditions are met. This License +explicitly affirms your unlimited permission to run the unmodified Program. The +output from running a covered work is covered by this License only if the output, +given its content, constitutes a covered work. This License acknowledges your rights +of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey covered +works to others for the sole purpose of having them make modifications exclusively +for you, or provide you with facilities for running those works, provided that you +comply with the terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for you must do so +exclusively on your behalf, under your direction and control, on terms that prohibit +them from making any copies of your copyrighted material outside their relationship +with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law + +No covered work shall be deemed part of an effective technological measure under any +applicable law fulfilling obligations under article 11 of the WIPO copyright treaty +adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention +of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of +technological measures to the extent such circumvention is effected by exercising +rights under this License with respect to the covered work, and you disclaim any +intention to limit operation or modification of the work as a means of enforcing, +against the work's users, your or third parties' legal rights to forbid circumvention +of technological measures. + +### 4. Conveying Verbatim Copies + +You may convey verbatim copies of the Program's source code as you receive it, in any +medium, provided that you conspicuously and appropriately publish on each copy an +appropriate copyright notice; keep intact all notices stating that this License and +any non-permissive terms added in accord with section 7 apply to the code; keep +intact all notices of the absence of any warranty; and give all recipients a copy of +this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer +support or warranty protection for a fee. + +### 5. Conveying Modified Source Versions + +You may convey a work based on the Program, or the modifications to produce it from +the Program, in the form of source code under the terms of section 4, provided that +you also meet all of these conditions: + +* **a)** The work must carry prominent notices stating that you modified it, and giving a +relevant date. +* **b)** The work must carry prominent notices stating that it is released under this +License and any conditions added under section 7. This requirement modifies the +requirement in section 4 to “keep intact all notices”. +* **c)** You must license the entire work, as a whole, under this License to anyone who +comes into possession of a copy. This License will therefore apply, along with any +applicable section 7 additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no permission to license the +work in any other way, but it does not invalidate such permission if you have +separately received it. +* **d)** If the work has interactive user interfaces, each must display Appropriate Legal +Notices; however, if the Program has interactive interfaces that do not display +Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are +not by their nature extensions of the covered work, and which are not combined with +it such as to form a larger program, in or on a volume of a storage or distribution +medium, is called an “aggregate” if the compilation and its resulting +copyright are not used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work in an aggregate +does not cause this License to apply to the other parts of the aggregate. + +### 6. Conveying Non-Source Forms + +You may convey a covered work in object code form under the terms of sections 4 and +5, provided that you also convey the machine-readable Corresponding Source under the +terms of this License, in one of these ways: + +* **a)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by the Corresponding Source fixed on a +durable physical medium customarily used for software interchange. +* **b)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by a written offer, valid for at least +three years and valid for as long as you offer spare parts or customer support for +that product model, to give anyone who possesses the object code either **(1)** a copy of +the Corresponding Source for all the software in the product that is covered by this +License, on a durable physical medium customarily used for software interchange, for +a price no more than your reasonable cost of physically performing this conveying of +source, or **(2)** access to copy the Corresponding Source from a network server at no +charge. +* **c)** Convey individual copies of the object code with a copy of the written offer to +provide the Corresponding Source. This alternative is allowed only occasionally and +noncommercially, and only if you received the object code with such an offer, in +accord with subsection 6b. +* **d)** Convey the object code by offering access from a designated place (gratis or for +a charge), and offer equivalent access to the Corresponding Source in the same way +through the same place at no further charge. You need not require recipients to copy +the Corresponding Source along with the object code. If the place to copy the object +code is a network server, the Corresponding Source may be on a different server +(operated by you or a third party) that supports equivalent copying facilities, +provided you maintain clear directions next to the object code saying where to find +the Corresponding Source. Regardless of what server hosts the Corresponding Source, +you remain obligated to ensure that it is available for as long as needed to satisfy +these requirements. +* **e)** Convey the object code using peer-to-peer transmission, provided you inform +other peers where the object code and Corresponding Source of the work are being +offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the +Corresponding Source as a System Library, need not be included in conveying the +object code work. + +A “User Product” is either **(1)** a “consumer product”, which +means any tangible personal property which is normally used for personal, family, or +household purposes, or **(2)** anything designed or sold for incorporation into a +dwelling. In determining whether a product is a consumer product, doubtful cases +shall be resolved in favor of coverage. For a particular product received by a +particular user, “normally used” refers to a typical or common use of +that class of product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected to use, the +product. A product is a consumer product regardless of whether the product has +substantial commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +“Installation Information” for a User Product means any methods, +procedures, authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified version of +its Corresponding Source. The information must suffice to ensure that the continued +functioning of the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for +use in, a User Product, and the conveying occurs as part of a transaction in which +the right of possession and use of the User Product is transferred to the recipient +in perpetuity or for a fixed term (regardless of how the transaction is +characterized), the Corresponding Source conveyed under this section must be +accompanied by the Installation Information. But this requirement does not apply if +neither you nor any third party retains the ability to install modified object code +on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to +continue to provide support service, warranty, or updates for a work that has been +modified or installed by the recipient, or for the User Product in which it has been +modified or installed. Access to a network may be denied when the modification itself +materially and adversely affects the operation of the network or violates the rules +and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with +this section must be in a format that is publicly documented (and with an +implementation available to the public in source code form), and must require no +special password or key for unpacking, reading or copying. + +### 7. Additional Terms + +“Additional permissions” are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. Additional +permissions that are applicable to the entire Program shall be treated as though they +were included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may be +used separately under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when you +modify the work.) You may place additional permissions on material, added by you to a +covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + +* **a)** Disclaiming warranty or limiting liability differently from the terms of +sections 15 and 16 of this License; or +* **b)** Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices displayed by works +containing it; or +* **c)** Prohibiting misrepresentation of the origin of that material, or requiring that +modified versions of such material be marked in reasonable ways as different from the +original version; or +* **d)** Limiting the use for publicity purposes of names of licensors or authors of the +material; or +* **e)** Declining to grant rights under trademark law for use of some trade names, +trademarks, or service marks; or +* **f)** Requiring indemnification of licensors and authors of that material by anyone +who conveys the material (or modified versions of it) with contractual assumptions of +liability to the recipient, for any liability that these contractual assumptions +directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further +restrictions” within the meaning of section 10. If the Program as you received +it, or any part of it, contains a notice stating that it is governed by this License +along with a term that is a further restriction, you may remove that term. If a +license document contains a further restriction but permits relicensing or conveying +under this License, you may add to a covered work material governed by the terms of +that license document, provided that the further restriction does not survive such +relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in +the relevant source files, a statement of the additional terms that apply to those +files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements apply +either way. + +### 8. Termination + +You may not propagate or modify a covered work except as expressly provided under +this License. Any attempt otherwise to propagate or modify it is void, and will +automatically terminate your rights under this License (including any patent licenses +granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated **(a)** provisionally, unless and until the +copyright holder explicitly and finally terminates your license, and **(b)** permanently, +if the copyright holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently +if the copyright holder notifies you of the violation by some reasonable means, this +is the first time you have received notice of violation of this License (for any +work) from that copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of +parties who have received copies or rights from you under this License. If your +rights have been terminated and not permanently reinstated, you do not qualify to +receive new licenses for the same material under section 10. + +### 9. Acceptance Not Required for Having Copies + +You are not required to accept this License in order to receive or run a copy of the +Program. Ancillary propagation of a covered work occurring solely as a consequence of +using peer-to-peer transmission to receive a copy likewise does not require +acceptance. However, nothing other than this License grants you permission to +propagate or modify any covered work. These actions infringe copyright if you do not +accept this License. Therefore, by modifying or propagating a covered work, you +indicate your acceptance of this License to do so. + +### 10. Automatic Licensing of Downstream Recipients + +Each time you convey a covered work, the recipient automatically receives a license +from the original licensors, to run, modify and propagate that work, subject to this +License. You are not responsible for enforcing compliance by third parties with this +License. + +An “entity transaction” is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an organization, or +merging organizations. If propagation of a covered work results from an entity +transaction, each party to that transaction who receives a copy of the work also +receives whatever licenses to the work the party's predecessor in interest had or +could give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if the predecessor +has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or +affirmed under this License. For example, you may not impose a license fee, royalty, +or other charge for exercise of rights granted under this License, and you may not +initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging +that any patent claim is infringed by making, using, selling, offering for sale, or +importing the Program or any portion of it. + +### 11. Patents + +A “contributor” is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The work thus +licensed is called the contributor's “contributor version”. + +A contributor's “essential patent claims” are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, that +would be infringed by some manner, permitted by this License, of making, using, or +selling its contributor version, but do not include claims that would be infringed +only as a consequence of further modification of the contributor version. For +purposes of this definition, “control” includes the right to grant patent +sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license +under the contributor's essential patent claims, to make, use, sell, offer for sale, +import and otherwise run, modify and propagate the contents of its contributor +version. + +In the following three paragraphs, a “patent license” is any express +agreement or commitment, however denominated, not to enforce a patent (such as an +express permission to practice a patent or covenant not to sue for patent +infringement). To “grant” such a patent license to a party means to make +such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of charge +and under the terms of this License, through a publicly available network server or +other readily accessible means, then you must either **(1)** cause the Corresponding +Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the +patent license for this particular work, or **(3)** arrange, in a manner consistent with +the requirements of this License, to extend the patent license to downstream +recipients. “Knowingly relying” means you have actual knowledge that, but +for the patent license, your conveying the covered work in a country, or your +recipient's use of the covered work in a country, would infringe one or more +identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a patent +license to some of the parties receiving the covered work authorizing them to use, +propagate, modify or convey a specific copy of the covered work, then the patent +license you grant is automatically extended to all recipients of the covered work and +works based on it. + +A patent license is “discriminatory” if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on the +non-exercise of one or more of the rights that are specifically granted under this +License. You may not convey a covered work if you are a party to an arrangement with +a third party that is in the business of distributing software, under which you make +payment to the third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties who would receive +the covered work from you, a discriminatory patent license **(a)** in connection with +copies of the covered work conveyed by you (or copies made from those copies), or **(b)** +primarily for and in connection with specific products or compilations that contain +the covered work, unless you entered into that arrangement, or that patent license +was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to you +under applicable patent law. + +### 12. No Surrender of Others' Freedom + +If conditions are imposed on you (whether by court order, agreement or otherwise) +that contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot convey a covered work so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not convey it at all. For example, if you +agree to terms that obligate you to collect a royalty for further conveying from +those to whom you convey the Program, the only way you could satisfy both those terms +and this License would be to refrain entirely from conveying the Program. + +### 13. Use with the GNU Affero General Public License + +Notwithstanding any other provision of this License, you have permission to link or +combine any covered work with a work licensed under version 3 of the GNU Affero +General Public License into a single combined work, and to convey the resulting work. +The terms of this License will continue to apply to the part which is the covered +work, but the special requirements of the GNU Affero General Public License, section +13, concerning interaction through a network will apply to the combination as such. + +### 14. Revised Versions of this License + +The Free Software Foundation may publish revised and/or new versions of the GNU +General Public License from time to time. Such new versions will be similar in spirit +to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that +a certain numbered version of the GNU General Public License “or any later +version” applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by the +Free Software Foundation. If the Program does not specify a version number of the GNU +General Public License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU +General Public License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no +additional obligations are imposed on any author or copyright holder as a result of +your choosing to follow a later version. + +### 15. Disclaimer of Warranty + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +### 16. Limitation of Liability + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE +OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE +WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +### 17. Interpretation of Sections 15 and 16 + +If the disclaimer of warranty and limitation of liability provided above cannot be +given local legal effect according to their terms, reviewing courts shall apply local +law that most closely approximates an absolute waiver of all civil liability in +connection with the Program, unless a warranty or assumption of liability accompanies +a copy of the Program in return for a fee. + +_END OF TERMS AND CONDITIONS_ + +## How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to +the public, the best way to achieve this is to make it free software which everyone +can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them +to the start of each source file to most effectively state the exclusion of warranty; +and each file should have at least the “copyright” line and a pointer to +where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like this +when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type 'show c' for details. + +The hypothetical commands `show w` and `show c` should show the appropriate parts of +the General Public License. Of course, your program's commands might be different; +for a GUI interface, you would use an “about box”. + +You should also get your employer (if you work as a programmer) or school, if any, to +sign a “copyright disclaimer” for the program, if necessary. For more +information on this, and how to apply and follow the GNU GPL, see +<>. + +The GNU General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may consider it +more useful to permit linking proprietary applications with the library. If this is +what you want to do, use the GNU Lesser General Public License instead of this +License. But first, please read +<>. diff --git a/NAMESPACE b/NAMESPACE index f0e21bf..e86786c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,11 +5,12 @@ export(create_new_article_entry) export(create_new_model_entry) export(create_new_outbreak_entry) export(create_new_parameter_entry) +export(data_delay_table) export(date_start) export(delay_table) -export(forest_plot_R) export(forest_plot_delay) export(forest_plot_mutations) +export(forest_plot_r) export(forest_plot_severity) export(get_table_field_options) export(load_epidata) @@ -18,6 +19,7 @@ export(quality_assessment_plots) export(risk_table) export(sero_table) importFrom(dplyr,"%>%") +importFrom(dplyr,across) importFrom(dplyr,arrange) importFrom(dplyr,case_when) importFrom(dplyr,count) @@ -27,6 +29,7 @@ importFrom(dplyr,everything) importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,if_else) +importFrom(dplyr,left_join) importFrom(dplyr,mutate) importFrom(dplyr,n) importFrom(dplyr,row_number) @@ -60,19 +63,31 @@ importFrom(ggplot2,ggplot_add) importFrom(ggplot2,guide_legend) importFrom(ggplot2,guides) importFrom(ggplot2,labs) +importFrom(ggplot2,position_dodge) importFrom(ggplot2,scale_color_brewer) +importFrom(ggplot2,scale_colour_manual) importFrom(ggplot2,scale_fill_manual) +importFrom(ggplot2,scale_linetype_manual) importFrom(ggplot2,scale_shape_manual) importFrom(ggplot2,scale_x_continuous) importFrom(ggplot2,scale_y_discrete) importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(ggplot2,xlab) +importFrom(ggplot2,xlim) importFrom(ggplot2,ylab) importFrom(officer,fp_border) importFrom(patchwork,wrap_plots) importFrom(readr,read_csv) +importFrom(rlang,.data) +importFrom(stats,median) +importFrom(stats,na.omit) +importFrom(stats,reorder) +importFrom(stats,setNames) importFrom(stringr,str_replace) +importFrom(stringr,str_replace_all) +importFrom(stringr,str_split) +importFrom(stringr,str_split_fixed) importFrom(stringr,str_to_sentence) importFrom(stringr,str_to_title) importFrom(stringr,str_wrap) @@ -81,6 +96,9 @@ importFrom(tibble,as_tibble_row) importFrom(tidyr,pivot_longer) importFrom(tidyr,pivot_wider) importFrom(tm,removeNumbers) +importFrom(utils,globalVariables) +importFrom(utils,write.csv) +importFrom(validate,"%vin%") importFrom(validate,confront) importFrom(validate,summary) importFrom(validate,validator) diff --git a/R/append_new_entry_to_table.R b/R/append_new_entry_to_table.R index 0de3cf2..2ad7b81 100644 --- a/R/append_new_entry_to_table.R +++ b/R/append_new_entry_to_table.R @@ -14,8 +14,10 @@ #' @param write_table write appended table (either TRUE or FALSE). If TRUE the #' new table will be written as a csv file in the data folder of a locally #' cloned repository. +#' @param vignette_prepend string to allow loading data in vignettes #' @return table with new entry (if write_table = TRUE the relevant table in a #' locally cloned repository is updated) +#' @importFrom utils write.csv #' #' @export append_new_entry_to_table <- function(pathogen = NA, @@ -33,31 +35,31 @@ append_new_entry_to_table <- function(pathogen = NA, length(colnames(new_row))) == 1)) stop("Schemas of new row and data sets do not match") - if (table_type == "article" & new_row$article_id %in% old_table$article_id) + if (table_type == "article" && new_row$article_id %in% old_table$article_id) stop("article_id already exists in the data set") new_table <- rbind(old_table, new_row) if (validate) { - if(table_type == "article") + if (table_type == "article") create_new_article_entry(pathogen = pathogen, new_article = new_row %>% as.vector(), vignette_prepend = vignette_prepend) - if(table_type == "outbreak") + if (table_type == "outbreak") create_new_outbreak_entry(pathogen = pathogen, new_outbreak = new_row %>% as.vector(), vignette_prepend = vignette_prepend) - if(table_type == "model") + if (table_type == "model") create_new_model_entry(pathogen = pathogen, new_model = new_row %>% as.vector(), vignette_prepend = vignette_prepend) - if(table_type == "parameter") + if (table_type == "parameter") create_new_parameter_entry(pathogen = pathogen, new_param = new_row %>% as.vector(), vignette_prepend = vignette_prepend) } - if(write_table) + if (write_table) write.csv(new_table, paste0(vignette_prepend, "data/", pathogen, "_", table_type, ".csv")) diff --git a/R/create_new_article_entry.R b/R/create_new_article_entry.R index b7d4bfb..e34a260 100644 --- a/R/create_new_article_entry.R +++ b/R/create_new_article_entry.R @@ -8,6 +8,9 @@ #' @importFrom tibble as_tibble as_tibble_row #' @importFrom validate validator confront summary #' @importFrom dplyr rowwise mutate select filter +#' @importFrom stats na.omit +#' @importFrom utils globalVariables +#' @importFrom rlang .data #' @examples #' create_new_article_entry( #' pathogen = "marburg", @@ -64,7 +67,7 @@ create_new_article_entry <- # generate the below quantities new_row$article_id <- max(old_articles$article_id) + 1 - new_row$covidence_id <- if(max(old_articles$covidence_id) > 1000000){ + new_row$covidence_id <- if (max(old_articles$covidence_id) > 1000000) { max(old_articles$covidence_id) + 1 } else { max(old_articles$covidence_id) + 1000000 @@ -76,8 +79,10 @@ create_new_article_entry <- "ebola" = "Ebola virus", NA) new_row$double_extracted <- FALSE - new_row <- new_row %>% rowwise() %>% - mutate(score = mean(c(qa_m1, qa_m2, qa_a3, qa_a4, qa_d5, qa_d6, qa_d7), + new_row <- new_row %>% + rowwise() %>% + mutate(score = mean(c(.data$qa_m1, .data$qa_m2, .data$qa_a3, .data$qa_a4, + .data$qa_d5, .data$qa_d6, .data$qa_d7), na.rm = TRUE)) %>% select(colnames(old_articles)) @@ -85,22 +90,29 @@ create_new_article_entry <- sprintf("%s", colnames(new_row)) # check if article already exists in data by looking for doi - if(is.character(new_row$doi) & new_row$doi %in% na.omit(old_articles$doi)) + if (is.character(new_row$doi) && new_row$doi %in% na.omit(old_articles$doi)) stop("doi exists in data already!") + # Deal with R CMD Check "no visible binding for global variable" + first_author_first_name <- first_author_surname <- article_title <- + journal <- doi <- transmission_route <- assumptions <- code_available <- + outbreak_date_year <- qa_m1 <- qa_m2 <- qa_a3 <- qa_a4 <- qa_d5 <- qa_d6 <- + qa_d7 <- NULL + #validate that the entries make sense rules <- validator( - first_author_first_name_is_character = is.character(first_author_first_name), - first_author_surname_is_character = is.character(first_author_surname), - article_title_is_character = is.character(article_title), - journal_is_character = is.character(journal), + author_first_name_is_character = is.character(first_author_first_name), + author_surname_is_character = is.character(first_author_surname), + article_title_is_character = is.character(article_title), + journal_is_character = is.character(journal), doi_is_character = is.character(doi), transmission_route_is_character = is.character(transmission_route), assumptions_is_character = is.character(assumptions), - code_available_check = code_available %in% c(0, 1, NA), - outbreak_date_year_is_integer = is.integer(outbreak_date_year), - outbreak_date_year_after_1800 = outbreak_date_year > 1800, - outbreak_date_year_not_future = outbreak_date_year < (as.integer(substring(Sys.Date(), 1, 4)) + 2), + code_available_check = code_available %in% c(0, 1, NA), + outbreak_year_is_integer = is.integer(outbreak_date_year), + outbreak_year_after_1800 = outbreak_date_year > 1800, + outbreak_year_not_future = outbreak_date_year < (as.integer( + substring(Sys.Date(), 1, 4)) + 2), qa_m1 = qa_m1 %in% c(0, 1, NA), qa_m2 = qa_m2 %in% c(0, 1, NA), qa_a3 = qa_a3 %in% c(0, 1, NA), @@ -113,8 +125,8 @@ create_new_article_entry <- rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - if(sum(rules_summary$fails) > 0) - stop(as_tibble(rules_summary) %>% filter(fails > 0)) + if (sum(rules_summary$fails) > 0) + stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) return(new_row) } diff --git a/R/create_new_model_entry.R b/R/create_new_model_entry.R index b12cd6e..fffffda 100644 --- a/R/create_new_model_entry.R +++ b/R/create_new_model_entry.R @@ -6,9 +6,11 @@ #' @return return new row of data to be added to the model data set using the #' append_new_entry_to_table() function #' @importFrom tibble as_tibble as_tibble_row -#' @importFrom validate validator confront summary +#' @importFrom validate validator confront summary %vin% #' @importFrom dplyr select #' @importFrom readr read_csv +#' @importFrom stats na.omit +#' @importFrom rlang .data #' @examples #' create_new_model_entry( #' pathogen = 'marburg', @@ -53,7 +55,7 @@ create_new_model_entry <- new_row <- new_row %>% select(colnames(old_models)) # Need to check that article_id & covidence_id exist in the articles table. - if (!(new_row$article_id %in% articles$article_id & + if (!(new_row$article_id %in% articles$article_id && articles[articles$article_id == new_row$article_id, ]$covidence_id == new_row$covidence_id)) stop("Article_id + Covidence_id pair does not exist in article data") @@ -67,31 +69,42 @@ create_new_model_entry <- } model_options <- read_csv(file_path_ob) + # Deal with R CMD Check "no visible binding for global variable" + model_type <- compartmental_type <- stoch_deter <- interventions_type <- + transmission_route <- assumptions <- code_available <- theoretical_model <- + NULL + #validate that the entries make sense rules <- validator( - model_type_is_character = is.character(model_type), - model_types_valid = strsplit(model_type, ",")[[1]] %vin% na.omit(model_options$`Model type`), + model_type_is_character = is.character(model_type), + model_types_valid = strsplit(model_type, ",")[[1]] %vin% + na.omit(model_options$`Model type`), compartmental_type_is_character = is.character(compartmental_type), - compartmental_type_valid = strsplit(compartmental_type, ",")[[1]] %vin% na.omit(model_options$`Compartment type`), - stoch_deter_is_character = is.character(stoch_deter), - stoch_deter_valid = strsplit(stoch_deter, ",")[[1]] %vin% na.omit(model_options$`Stochastic or deterministic`), - intervention_type_is_character = is.character(interventions_type), - intervention_type_valid = strsplit(interventions_type, ",")[[1]] %vin% na.omit(model_options$Interventions), + compartmental_type_valid = strsplit(compartmental_type, ",")[[1]] %vin% + na.omit(model_options$`Compartment type`), + stoch_deter_is_character = is.character(stoch_deter), + stoch_deter_valid = strsplit(stoch_deter, ",")[[1]] %vin% + na.omit(model_options$`Stochastic or deterministic`), + intervention_type_is_character = is.character(interventions_type), + intervention_type_valid = strsplit(interventions_type, ",")[[1]] %vin% + na.omit(model_options$Interventions), transmission_route_is_character = is.character(transmission_route), - transmission_route_valid = strsplit(transmission_route, ",")[[1]] %vin% na.omit(model_options$`Transmission route`), - assumptions_is_character = is.character(assumptions), - assumptions_valid = strsplit(assumptions, ",")[[1]] %vin% na.omit(model_options$Assumptions), - code_available_check = code_available %in% c(0, 1, NA), - theoretical_model_check = theoretical_model %in% c(0, 1, NA) + transmission_route_valid = strsplit(transmission_route, ",")[[1]] %vin% + na.omit(model_options$`Transmission route`), + assumptions_is_character = is.character(assumptions), + assumptions_valid = strsplit(assumptions, ",")[[1]] %vin% + na.omit(model_options$Assumptions), + code_available_check = code_available %in% c(0, 1, NA), + theoretical_model_check = theoretical_model %in% c(0, 1, NA) ) rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(fails > 0)) + print(as_tibble(rules_summary) %>% filter(.data$fails > 0)) if (sum(rules_summary$fails) > 0) { - stop(as_tibble(rules_summary) %>% filter(fails > 0)) + stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) } return(new_row) diff --git a/R/create_new_outbreak_entry.R b/R/create_new_outbreak_entry.R index a1c7f67..80da244 100644 --- a/R/create_new_outbreak_entry.R +++ b/R/create_new_outbreak_entry.R @@ -4,9 +4,11 @@ #' @param new_outbreak all the required details for the new outbreak #' @param vignette_prepend string to allow loading data in vignettes #' @importFrom tibble as_tibble as_tibble_row -#' @importFrom validate validator confront summary +#' @importFrom validate validator confront summary %vin% #' @importFrom dplyr select #' @importFrom readr read_csv +#' @importFrom stats na.omit +#' @importFrom rlang .data #' @return return new row of data to be added to the outbreak data set using #' the append_new_entry_to_table() function #' @examples @@ -70,7 +72,7 @@ create_new_outbreak_entry <- new_row <- new_row %>% select(colnames(old_outbreaks)) # Need to check that article_id & covidence_id exist in the articles table. - if (!(new_row$article_id %in% articles$article_id & + if (!(new_row$article_id %in% articles$article_id && articles[articles$article_id == new_row$article_id, ]$covidence_id == new_row$covidence_id)) stop("Article_id + Covidence_id pair does not exist in article data") @@ -84,24 +86,30 @@ create_new_outbreak_entry <- } outbreak_options <- read_csv(file_path_ob) + # Deal with R CMD Check "no visible binding for global variable" + outbreak_country <- cases_mode_detection <- outbreak_date_year <- NULL + #validate that the entries make sense rules <- validator( - outbreak_country_is_character = is.character(outbreak_country), - outbreak_country_valid = strsplit(outbreak_country, ",")[[1]] %vin% na.omit(outbreak_options$`Outbreak country`), + outbreak_country_is_character = is.character(outbreak_country), + outbreak_country_valid = strsplit(outbreak_country, ",")[[1]] %vin% + na.omit(outbreak_options$`Outbreak country`), cases_mode_detection_is_character = is.character(cases_mode_detection), - cases_mode_detection_valid = strsplit(cases_mode_detection, ",")[[1]] %vin% na.omit(outbreak_options$`Detection mode`), - outbreak_date_year_is_integer = is.integer(outbreak_date_year), - outbreak_date_year_after_1800 = outbreak_date_year > 1800, - outbreak_date_year_not_future = outbreak_date_year < (as.integer(substring(Sys.Date(), 1, 4)) + 2) + cases_mode_detection_valid = strsplit(cases_mode_detection, ",")[[1]] %vin% + na.omit(outbreak_options$`Detection mode`), + outbreak_date_year_is_integer = is.integer(outbreak_date_year), + outbreak_date_year_after_1800 = outbreak_date_year > 1800, + outbreak_date_year_not_future = outbreak_date_year < + (as.integer(substring(Sys.Date(), 1, 4)) + 2) ) rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(fails > 0)) + print(as_tibble(rules_summary) %>% filter(.data$fails > 0)) if (sum(rules_summary$fails) > 0) { - stop(as_tibble(rules_summary) %>% filter(fails > 0)) + stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) } return(new_row) diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index f06fc5b..e69f515 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -6,87 +6,91 @@ #' @return new row of data to be added to the outbreak data set using the #' append_new_entry_to_table() function #' @importFrom tibble as_tibble as_tibble_row -#' @importFrom validate validator confront summary +#' @importFrom validate validator confront summary %vin% #' @importFrom dplyr select #' @importFrom readr read_csv +#' @importFrom stats na.omit +#' @importFrom rlang .data #' @examples #' create_new_parameter_entry <- #' function(pathogen = "marburg", -#' new_param = c(list("article_id" = as.integer(1)), -#' list("parameter_type" = as.character(NA)), -#' list("parameter_value" = as.double(NA)), -#' list("parameter_unit" = as.character(NA)), -#' list("parameter_lower_bound" = as.double(NA)), -#' list("parameter_upper_bound" = as.double(NA)), -#' list("population_study_start_day" = as.integer(NA)), -#' list("population_study_start_month" = as.character(NA)), -#' list("population_study_start_year" = as.integer(NA)), -#' list("population_study_end_day" = as.integer(NA)), -#' list("population_study_end_month" = as.character(NA)), -#' list("population_study_end_year" = as.integer(NA)), -#' list("genome_site" = as.character(NA)), -#' list("genomic_sequence_available" = as.logical(NA)), -#' list("parameter_class" = as.character(NA)), -#' list("covidence_id" = as.integer(2059)), -#' list("Uncertainty" = as.character(NA)), -#' list("Survey year" = as.character(NA))), +#' new_param = +#' c(list("article_id" = as.integer(1)), +#' list("parameter_type" = as.character(NA)), +#' list("parameter_value" = as.double(NA)), +#' list("parameter_unit" = as.character(NA)), +#' list("parameter_lower_bound" = as.double(NA)), +#' list("parameter_upper_bound" = as.double(NA)), +#' list("population_study_start_day" = as.integer(NA)), +#' list("population_study_start_month" = as.character(NA)), +#' list("population_study_start_year" = as.integer(NA)), +#' list("population_study_end_day" = as.integer(NA)), +#' list("population_study_end_month" = as.character(NA)), +#' list("population_study_end_year" = as.integer(NA)), +#' list("genome_site" = as.character(NA)), +#' list("genomic_sequence_available" = as.logical(NA)), +#' list("parameter_class" = as.character(NA)), +#' list("covidence_id" = as.integer(2059)), +#' list("Uncertainty" = as.character(NA)), +#' list("Survey year" = as.character(NA))), #' vignette_prepend = "") #' @export create_new_parameter_entry <- function(pathogen = NA, - new_param = c(list("article_id" = as.integer(NA)), - list("parameter_type" = as.character(NA)), - list("parameter_value" = as.double(NA)), - list("parameter_unit" = as.character(NA)), - list("parameter_lower_bound" = as.double(NA)), - list("parameter_upper_bound" = as.double(NA)), - list("parameter_value_type" = as.character(NA)), - list("parameter_uncertainty_single_value" = as.double(NA)), - list("parameter_uncertainty_singe_type" = as.character(NA)), - list("parameter_uncertainty_lower_value" = as.double(NA)), - list("parameter_uncertainty_upper_value" = as.double(NA)), - list("parameter_uncertainty_type" = as.character(NA)), - list("cfr_ifr_numerator" = as.integer(NA)), - list("cfr_ifr_denominator" = as.integer(NA)), - list("distribution_type" = as.character(NA)), - list("distribution_par1_value" = as.double(NA)), - list("distribution_par1_type" = as.character(NA)), - list("distribution_par1_uncertainty" = as.logical(NA)), - list("distribution_par2_value" = as.double(NA)), - list("distribution_par2_type" = as.character(NA)), - list("distribution_par2_uncertainty" = as.logical(NA)), - list("method_from_supplement" = as.logical(NA)), - list("method_moment_value" = as.character(NA)), - list("cfr_ifr_method" = as.character(NA)), - list("method_r" = as.character(NA)), - list("method_disaggregated_by" = as.character(NA)), - list("method_disaggregated" = as.logical(NA)), - list("method_disaggregated_only" = as.logical(NA)), - list("riskfactor_outcome" = as.character(NA)), - list("riskfactor_name" = as.character(NA)), - list("riskfactor_occupation" = as.character(NA)), - list("riskfactor_significant" = as.character(NA)), - list("riskfactor_adjusted" = as.character(NA)), - list("population_sex" = as.character(NA)), - list("population_sample_type" = as.character(NA)), - list("population_group" = as.character(NA)), - list("population_age_min" = as.integer(NA)), - list("population_age_max" = as.integer(NA)), - list("population_sample_size" = as.integer(NA)), - list("population_country" = as.character(NA)), - list("population_location" = as.character(NA)), - list("population_study_start_day" = as.integer(NA)), - list("population_study_start_month" = as.character(NA)), - list("population_study_start_year" = as.integer(NA)), - list("population_study_end_day" = as.integer(NA)), - list("population_study_end_month" = as.character(NA)), - list("population_study_end_year" = as.integer(NA)), - list("genome_site" = as.character(NA)), - list("genomic_sequence_available" = as.logical(NA)), - list("parameter_class" = as.character(NA)), - list("covidence_id" = as.integer(NA)), - list("Uncertainty" = as.character(NA)), - list("Survey year" = as.character(NA))), + new_param = + c(list("article_id" = as.integer(NA)), + list("parameter_type" = as.character(NA)), + list("parameter_value" = as.double(NA)), + list("parameter_unit" = as.character(NA)), + list("parameter_lower_bound" = as.double(NA)), + list("parameter_upper_bound" = as.double(NA)), + list("parameter_value_type" = as.character(NA)), + list("parameter_uncertainty_single_value" = as.double(NA)), + list("parameter_uncertainty_singe_type" = as.character(NA)), + list("parameter_uncertainty_lower_value" = as.double(NA)), + list("parameter_uncertainty_upper_value" = as.double(NA)), + list("parameter_uncertainty_type" = as.character(NA)), + list("cfr_ifr_numerator" = as.integer(NA)), + list("cfr_ifr_denominator" = as.integer(NA)), + list("distribution_type" = as.character(NA)), + list("distribution_par1_value" = as.double(NA)), + list("distribution_par1_type" = as.character(NA)), + list("distribution_par1_uncertainty" = as.logical(NA)), + list("distribution_par2_value" = as.double(NA)), + list("distribution_par2_type" = as.character(NA)), + list("distribution_par2_uncertainty" = as.logical(NA)), + list("method_from_supplement" = as.logical(NA)), + list("method_moment_value" = as.character(NA)), + list("cfr_ifr_method" = as.character(NA)), + list("method_r" = as.character(NA)), + list("method_disaggregated_by" = as.character(NA)), + list("method_disaggregated" = as.logical(NA)), + list("method_disaggregated_only" = as.logical(NA)), + list("riskfactor_outcome" = as.character(NA)), + list("riskfactor_name" = as.character(NA)), + list("riskfactor_occupation" = as.character(NA)), + list("riskfactor_significant" = as.character(NA)), + list("riskfactor_adjusted" = as.character(NA)), + list("population_sex" = as.character(NA)), + list("population_sample_type" = as.character(NA)), + list("population_group" = as.character(NA)), + list("population_age_min" = as.integer(NA)), + list("population_age_max" = as.integer(NA)), + list("population_sample_size" = as.integer(NA)), + list("population_country" = as.character(NA)), + list("population_location" = as.character(NA)), + list("population_study_start_day" = as.integer(NA)), + list("population_study_start_month" = as.character(NA)), + list("population_study_start_year" = as.integer(NA)), + list("population_study_end_day" = as.integer(NA)), + list("population_study_end_month" = as.character(NA)), + list("population_study_end_year" = as.integer(NA)), + list("genome_site" = as.character(NA)), + list("genomic_sequence_available" = as.logical(NA)), + list("parameter_class" = as.character(NA)), + list("covidence_id" = as.integer(NA)), + list("Uncertainty" = as.character(NA)), + list("Survey year" = as.character(NA))), vignette_prepend = "") { #read current article data for pathogen @@ -103,7 +107,7 @@ create_new_parameter_entry <- new_row <- new_row %>% select(colnames(old_parameters)) # Need to check that article_id & covidence_id exist in the articles table. - if (!(new_row$article_id %in% articles$article_id & + if (!(new_row$article_id %in% articles$article_id && articles[articles$article_id == new_row$article_id, ]$covidence_id == new_row$covidence_id)) stop("Article_id + Covidence_id pair does not exist in article data") @@ -111,12 +115,15 @@ create_new_parameter_entry <- #available options for fields file_path_ob <- system.file("data", "access_db_dropdown_parameters.csv", package = "epireview") - if (file_path_ob=="") { + if (file_path_ob == "") { file_path_ob <- paste0(vignette_prepend, "data/access_db_dropdown_parameters.csv") } parameter_options <- read_csv(file_path_ob) + # Deal with R CMD Check "no visible binding for global variable" + population_country <- NULL + #validate that the entries make sense rules <- validator( model_type_is_character = is.character(population_country), @@ -127,10 +134,10 @@ create_new_parameter_entry <- rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(fails > 0)) + print(as_tibble(rules_summary) %>% filter(.data$fails > 0)) if (sum(rules_summary$fails) > 0) - stop(as_tibble(rules_summary) %>% filter(fails > 0)) + stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) return(new_row) } diff --git a/R/data.R b/R/data.R index 15db068..70740a3 100644 --- a/R/data.R +++ b/R/data.R @@ -1,3 +1,23 @@ +#' Data on the articles identified and included in the systematic review of +#' articles related to Marburg virus disease. +#' +#' @description +#' This data set provides the details of all extracted articles included in +#' the systematic review for Marburg virus disease (MVD). +#' +#' @name marburg_article +#' @docType data +#' @format A csv file containing the following parameters: +#' +#' XXYY +#' +#' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +#' et al. Marburg Virus Disease outbreaks, mathematical models, and disease +#' parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +#' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +#' +NULL + #' Data on the models identified in the systematic review of articles related #' to Marburg virus disease. #' @@ -5,7 +25,7 @@ #' This data set provides all extracted data for mathematical models applied to #' Marburg virus disease (MVD). #' -#' @name marburg_model.csv +#' @name marburg_model #' @docType data #' @format A csv file containing the following parameters: #' @@ -33,8 +53,7 @@ #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease -#' parameters: a Systematic Review [Internet]. medRxiv; 2023 [cited 2023 Jul 13]. -#' p. 2023.07.10.23292424. +#' parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. #' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 #' NULL @@ -46,7 +65,7 @@ NULL #' This data set provides all extracted data for outbreaks of Marburg virus #' disease (MVD). #' -#' @name marburg_outbreak.csv +#' @name marburg_outbreak #' @docType data #' @format A csv file containing the following parameters: #' @@ -78,8 +97,7 @@ NULL #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease -#' parameters: a Systematic Review [Internet]. medRxiv; 2023 [cited 2023 Jul 13]. -#' p. 2023.07.10.23292424. +#' parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. #' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 #' NULL @@ -91,7 +109,7 @@ NULL #' This data set provides all extracted parameters for Marburg virus disease #' (MVD). #' -#' @name marburg_parameter.csv +#' @name marburg_parameter #' @docType data #' @format A csv file containing the following parameters: #' @@ -152,8 +170,7 @@ NULL #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease -#' parameters: a Systematic Review [Internet]. medRxiv; 2023 [cited 2023 Jul 13]. -#' p. 2023.07.10.23292424. +#' parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. #' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 #' NULL diff --git a/R/data_delay_table.R b/R/data_delay_table.R new file mode 100644 index 0000000..4509489 --- /dev/null +++ b/R/data_delay_table.R @@ -0,0 +1,41 @@ +#' Process data for delay table +#' +#' @param pathogen name of pathogen e.g. "marburg" +#' @param exclude article IDs to exclude +#' @return processed data to use as input for delay_table() +#' @importFrom readr read_csv +#' @importFrom dplyr left_join mutate select arrange filter +#' @examples +#' df <- data_delay_table(pathogen, exclude = c(17, 15)) +#' @export + +data_delay_table <- function(pathogen, exclude) { + + # Get file pathway for parameter data + file_path_pa <- system.file( + "data", paste0(pathogen, "_parameter.csv"), package = "epireview") + if (file_path_pa == "") + file_path_pa <- paste0("../data/", pathogen, "_parameter.csv") + params <- read_csv(file_path_pa) + + # Get file pathway for article data + file_path_ar <- system.file( + "data", paste0(pathogen, "_article.csv"), package = "epireview") + if (file_path_ar == "") + file_path_ar <- paste0("../data/", pathogen, "_article.csv") + articles <- read_csv(file_path_ar) + + # Deal with R CMD Check "no visible binding for global variable" + article_id <- first_author_surname <- year_publication <- NULL + + x <- left_join(params, articles %>% + select(article_id, first_author_surname, year_publication), + by = "article_id") %>% + mutate(article_label = as.character( + paste0(first_author_surname, "", year_publication)), + population_country = str_replace_all(population_country, ";", ",")) %>% + arrange(article_label, -year_publication) %>% + filter(article_id %in% exclude == FALSE) + + return(x) +} diff --git a/R/date_start.R b/R/date_start.R index 9b05d4a..a46089b 100644 --- a/R/date_start.R +++ b/R/date_start.R @@ -2,18 +2,20 @@ #' @param start_day start day #' @param start_month start month #' @param start_year start year +#' @importFrom stringr str_split_fixed #' @export date_start <- function(start_day, start_month, start_year) { start_day <- as.character(start_day) start_year <- as.character(start_year) - if(!is.na(start_day)) { - start_date <- paste0(start_day, " ", str_split_fixed(start_month, " ", 2)[1], " ", start_year) - } else if(is.na(start_day) & !is.na(start_month)) { - start_date <- paste0(str_split_fixed(start_month, " ", 2)[1], " ", start_year) - } else if(is.na(start_day) & is.na(start_month)) { + if (!is.na(start_day)) { + start_date <- paste0( + start_day, "", str_split_fixed(start_month, "", 2)[1], "", start_year) + } else if (is.na(start_day) && !is.na(start_month)) { + start_date <- paste0( + str_split_fixed(start_month, "", 2)[1], "", start_year) + } else if (is.na(start_day) && is.na(start_month)) { start_date <- start_year } start_date } - diff --git a/R/delay_table.R b/R/delay_table.R index dffcc4c..0c869a3 100644 --- a/R/delay_table.R +++ b/R/delay_table.R @@ -1,23 +1,34 @@ #' Create table for human delay parameters #' -#' @param df processed data with parameter information (see vignette for each -#' pathogen) +#' @param df processed data with parameter information produced using +#' data_delay_table() #' @param pathogen name of pathogen #' @return flextable with an overview of the delay parameter estimates #' extracted from the included studies #' @importFrom officer fp_border #' @importFrom flextable flextable set_flextable_defaults fontsize #' border_remove autofit theme_booktabs vline hline bold add_footer_lines -#' @importFrom dplyr filter mutate select arrange group_by row_number +#' @importFrom dplyr filter mutate select arrange group_by row_number %>% #' @importFrom stringr str_to_title str_replace #' @examples -#'delay_table(df, pathogen = "marburg") +#' # Process data +#' df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) +#' +#' # Get delay table +#' delay_table(df = df, pathogen = "marburg") #' @export + delay_table <- function(df, pathogen) { border_style <- fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") + # Deal with R CMD Check "no visible binding for global variable" + parameter_class <- parameter_type <- article_label <- population_country <- + `Survey year` <- parameter_value <- parameter_value_type <- Uncertainty <- + parameter_uncertainty_type <- population_group <- method_moment_value <- + riskfactor_outcome <- `Parameter type` <- Country <- index_of_change <- NULL + delay_tbl <- df %>% filter(parameter_class == "Human delay") %>% mutate(parameter_type = str_to_title( diff --git a/R/forest_plot_delays.R b/R/forest_plot_delay.R similarity index 88% rename from R/forest_plot_delays.R rename to R/forest_plot_delay.R index 5212125..8c193b8 100644 --- a/R/forest_plot_delays.R +++ b/R/forest_plot_delay.R @@ -8,6 +8,7 @@ #' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete #' scale_x_continuous geom_segment geom_errorbar labs scale_color_brewer #' scale_shape_manual theme guides element_text guide_legend +#' @importFrom stats setNames median #' @examples #' forest_plot_delay(df = data) #' @export @@ -15,6 +16,14 @@ forest_plot_delay <- function(df) { parameter <- "Human delay" + # Deal with R CMD Check "no visible binding for global variable" + parameter_class <- parameter_type <- parameter_type_short <- + article_label <- riskfactor_outcome <- first_author_surname <- + parameter_value <- article_label_unique <- parameter_value_type <- + parameter_lower_bound <- parameter_upper_bound <- + parameter_data_id <- parameter_uncertainty_lower_value <- + parameter_uncertainty_upper_value <- NULL + df_delay <- df %>% filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% diff --git a/R/forest_plot_mutations.R b/R/forest_plot_mutations.R index 9d072e3..ca5c961 100644 --- a/R/forest_plot_mutations.R +++ b/R/forest_plot_mutations.R @@ -4,7 +4,8 @@ #' pathogen) #' @return returns plot with a summary of genetic mutations #' @importFrom dplyr filter mutate arrange group_by desc if_else -#' @importFrom ggplot2 geom_vline +#' @importFrom ggplot2 geom_vline xlim +#' @importFrom stats setNames #' @examples #' forest_plot_mutations(df = data) #' @export @@ -12,6 +13,12 @@ forest_plot_mutations <- function(df) { parameter <- "Mutations" + # Deal with R CMD Check "no visible binding for global variable" + parameter_class <- parameter_value <- parameter_type <- genome_site <- + gene <- parameter_uncertainty_single_value <- article_label_unique <- + parameter_data_id <- parameter_uncertainty_lower_value <- + parameter_uncertainty_upper_value <- NULL + df_mutations <- df %>% filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% diff --git a/R/forest_plot_r.R b/R/forest_plot_r.R index b005860..2a7ab09 100644 --- a/R/forest_plot_r.R +++ b/R/forest_plot_r.R @@ -6,20 +6,30 @@ #' @importFrom dplyr filter arrange mutate group_by #' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete #' scale_x_continuous geom_segment geom_errorbar labs scale_color_brewer -#' scale_shape_manual theme guides element_text guide_legend +#' scale_shape_manual theme guides element_text guide_legend position_dodge +#' scale_linetype_manual scale_colour_manual xlim +#' @importFrom stats median #' @examples -#' forest_plot_R(df = data) +#' forest_plot_r(df = data) #' @export -forest_plot_R <- function(df) { +forest_plot_r <- function(df) { parameter <- "Reproduction number" - df_R <- df %>% filter(parameter_class == parameter) %>% + # Deal with R CMD Check "no visible binding for global variable" + parameter_value <- parameter_type <- first_author_surname <- + parameter_class <- article_label_unique <- parameter_type_short <- + article_label <- parameter_uncertainty_lower_value <- + parameter_uncertainty_upper_value <- parameter_data_id <- NULL + + df_r <- df %>% + filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% group_by(parameter_type) %>% arrange(first_author_surname) - df_plot <- df_R %>% filter(parameter_class == parameter) %>% + df_plot <- df_r %>% + filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% group_by(parameter_type) %>% mutate(median = median(parameter_value, na.rm = TRUE)) diff --git a/R/forest_plot_severity.R b/R/forest_plot_severity.R index 6307ebe..bb6c1a6 100644 --- a/R/forest_plot_severity.R +++ b/R/forest_plot_severity.R @@ -2,11 +2,14 @@ #' #' @param df processed data with severity information e.g. IFR and CFR (see #' vignette for each pathogen) +#' @param outbreak_naive TRUE or FALSE. FALSE by default. #' @return returns plot with a summary of IFR and CFR estimates #' @importFrom dplyr filter arrange mutate group_by #' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete #' scale_x_continuous geom_segment geom_errorbar labs scale_color_brewer #' scale_shape_manual theme guides element_text guide_legend +#' scale_linetype_manual position_dodge scale_colour_manual xlim +#' @importFrom stats setNames reorder #' @examples #' forest_plot_severity(df = data) #' @export @@ -14,11 +17,20 @@ forest_plot_severity <- function(df, outbreak_naive = FALSE) { parameter <- "Severity" - if(outbreak_naive) { + # Deal with R CMD Check "no visible binding for global variable" + keep_record <- parameter_class <- parameter_value <- parameter_type <- + article_label <- cfr_ifr_method <- outbreak_start_year <- + cfr_ifr_denominator <- outbreak_year_cnt <- article_label_unique <- + order_num <- lower_ci <- upper_ci <- parameter_data_id <- + parameter_uncertainty_lower_value <- parameter_lower_bound <- + parameter_uncertainty_upper_value <- parameter_upper_bound <- NULL + + if (outbreak_naive) { df <- df %>% filter(keep_record == 1) } - df_cfr <- df %>% filter(parameter_class == parameter) %>% + df_cfr <- df %>% + filter(parameter_class == parameter) %>% mutate(parameter_value = as.numeric(parameter_value)) %>% group_by(parameter_type) %>% arrange(article_label) @@ -37,7 +49,7 @@ forest_plot_severity <- function(df, outbreak_naive = FALSE) { df_plot$article_label_unique <- make.unique(df_plot$article_label) df_plot <- df_plot %>% mutate(order_num = seq(1, dim(df_plot)[1], 1)) - if(outbreak_naive) { + if (outbreak_naive) { df_plot2 <- df_plot %>% arrange(outbreak_start_year) %>% mutate(order_num = row_number(), @@ -46,9 +58,8 @@ forest_plot_severity <- function(df, outbreak_naive = FALSE) { cfr_ifr_denominator))) * 100, upper_ci = (p + 1.96 * (sqrt((p * (1 - p)) / cfr_ifr_denominator))) * 100, - outbreak_year_cnt = - as.character(paste0(outbreak_year_cnt, - " [n =", cfr_ifr_denominator,"]"))) + outbreak_year_cnt = as.character(paste0( + outbreak_year_cnt, " [n =", cfr_ifr_denominator, "]"))) plot <- ggplot(df_plot2, aes(x = parameter_value, y = reorder(article_label_unique, -order_num), diff --git a/R/get_table_field_options.R b/R/get_table_field_options.R index 6fecdb0..2a8ea33 100644 --- a/R/get_table_field_options.R +++ b/R/get_table_field_options.R @@ -8,8 +8,9 @@ #' table_type, or a specific variable name that the user wants to return #' @param vignette_prepend string to allow loading data in vignettes #' @return data for specified table_type and field -#' @importFrom dplyr mutate everything +#' @importFrom dplyr mutate everything across #' @importFrom readr read_csv +#' @importFrom stats na.omit #' @examples #' get_available_table_field_options(table_type = "model", field = "all") #' diff --git a/R/load_epidata.R b/R/load_epidata.R index cb50380..e7662af 100644 --- a/R/load_epidata.R +++ b/R/load_epidata.R @@ -13,7 +13,7 @@ load_epidata <- function(table_type = NA, pathogen = NA, vignette_prepend = "") { - if(is.na(table_type) || is.na(pathogen)){ + if (is.na(table_type) || is.na(pathogen)) { stop("table_type and pathogen name must be supplied. table_type can be one of either 'article', 'parameter', 'outbreak' or 'model'") } @@ -21,7 +21,7 @@ load_epidata <- function(table_type = NA, file_path <- system.file( "data", paste0(pathogen, "_", table_type, ".csv"), package = "epireview") - if(file_path == "") + if (file_path == "") file_path <- paste0( vignette_prepend, "data/", pathogen, "_", table_type, ".csv") diff --git a/R/outbreak_table.R b/R/outbreak_table.R index 1cdd3b3..7e8a5f4 100644 --- a/R/outbreak_table.R +++ b/R/outbreak_table.R @@ -9,14 +9,23 @@ #' @importFrom dplyr filter select rowwise mutate distinct arrange group_by #' @importFrom flextable flextable set_flextable_defaults #' @importFrom tm removeNumbers +#' @importFrom stringr str_replace_all #' @examples #' outbreak_table(df = data, pathogen = "marburg") #' @export outbreak_table <- function(df, pathogen) { - border_style = fp_border(color = "black", width = 1) + border_style <- fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") + # Deal with R CMD Check "no visible binding for global variable" + article_label <- outbreak_start_day <- outbreak_start_month <- + outbreak_start_year <- outbreak_end_day <- outbreak_end_month <- + outbreak_date_year <- outbreak_country <- outbreak_location <- + cases_confirmed <- cases_suspected <- cases_asymptomatic <- + cases_mode_detection <- cases_severe_hospitalised <- deaths <- + outbreak_start <- outbreak_end <- index_of_change <- NULL + outbreak_tbl <- df %>% filter(is.na(outbreak_start_year) == FALSE) %>% select(c(article_label, outbreak_start_day, outbreak_start_month, diff --git a/R/quality_assessment.R b/R/quality_assessment.R index 018c67f..93cf789 100644 --- a/R/quality_assessment.R +++ b/R/quality_assessment.R @@ -30,6 +30,9 @@ quality_assessment_plots <- function(pathogen = NA, file_path <- paste0(prepend, "data/", pathogen, "_article.csv") quality <- read_csv(file_path) + # Deal with R CMD Check "no visible binding for global variable" + year_publication <- score <- covidence_id <- Assessment <- Question <- NULL + # time series plot qa_time_series <- quality %>% filter(!is.na(year_publication) & !is.na(pathogen)) %>% @@ -72,7 +75,9 @@ quality_assessment_plots <- function(pathogen = NA, levels = c("NA", "No", "Yes")) qa_answers <- answers %>% - group_by(Question, Assessment) %>% summarize(count = n()) %>% ungroup() %>% + group_by(Question, Assessment) %>% + summarize(count = n()) %>% + ungroup() %>% ggplot(aes(fill = Assessment, y = count, x = Question)) + geom_bar(position = "stack", stat = "identity") + theme_bw() + diff --git a/R/risk_table.R b/R/risk_table.R index 82ab490..b5c5408 100644 --- a/R/risk_table.R +++ b/R/risk_table.R @@ -8,6 +8,7 @@ #' @importFrom officer fp_border #' @importFrom dplyr mutate mutate filter select rowwise summarise #' @importFrom tidyr pivot_longer pivot_wider +#' @importFrom stringr str_replace_all str_split #' @importFrom flextable set_flextable_defaults flextable fontsize #' border_remove autofit theme_booktabs vline hline bold #' @examples @@ -20,6 +21,14 @@ risk_table <- function(df, border_style <- fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") + # Deal with R CMD Check "no visible binding for global variable" + riskfactor_occupation <- riskfactor_name <- riskfactor_1 <- riskfactor_3 <- + riskfactor_names <- article_label <- population_country <- `Survey year` <- + riskfactor_outcome <- riskfactor_significant <- riskfactor_adjusted <- + population_sample_size <- population_sample_type <- population_group <- + method_moment_value <- Outcome <- Country <- index_of_change <- + sample_size <- Significant <- `Risk factor` <- Adjusted <- NULL + risk_tbl_supp <- df %>% mutate(riskfactor_occupation = str_replace_all(riskfactor_occupation, "burrial", "burial")) %>% diff --git a/R/seroprevalence_table.R b/R/seroprevalence_table.R index 18b0b50..00f065e 100644 --- a/R/seroprevalence_table.R +++ b/R/seroprevalence_table.R @@ -13,6 +13,13 @@ sero_table <- function(df, pathogen) { border_style <- fp_border(color = "black", width = 1) set_flextable_defaults(background.color = "white") + # Deal with R CMD Check "no visible binding for global variable" + parameter_class <- parameter_value <- parameter_type <- article_label <- + population_country <- `Survey year` <- Uncertainty <- + parameter_uncertainty_type <- cfr_ifr_numerator <- cfr_ifr_denominator <- + population_group <- method_moment_value <- method_disaggregated_by <- + Country <- `Parameter type*` <- index_of_change <- NULL + sero_tbl <- df %>% mutate(parameter_value = round(parameter_value, 2), parameter_type = diff --git a/man/append_new_entry_to_table.Rd b/man/append_new_entry_to_table.Rd index 32cf72e..bf6f021 100644 --- a/man/append_new_entry_to_table.Rd +++ b/man/append_new_entry_to_table.Rd @@ -30,6 +30,8 @@ the same number of variables as the table to be updated)} \item{write_table}{write appended table (either TRUE or FALSE). If TRUE the new table will be written as a csv file in the data folder of a locally cloned repository.} + +\item{vignette_prepend}{string to allow loading data in vignettes} } \value{ table with new entry (if write_table = TRUE the relevant table in a diff --git a/man/create_new_parameter_entry.Rd b/man/create_new_parameter_entry.Rd index 12c9d70..ac9da81 100644 --- a/man/create_new_parameter_entry.Rd +++ b/man/create_new_parameter_entry.Rd @@ -64,23 +64,24 @@ Create new parameter entry \examples{ create_new_parameter_entry <- function(pathogen = "marburg", - new_param = c(list("article_id" = as.integer(1)), - list("parameter_type" = as.character(NA)), - list("parameter_value" = as.double(NA)), - list("parameter_unit" = as.character(NA)), - list("parameter_lower_bound" = as.double(NA)), - list("parameter_upper_bound" = as.double(NA)), - list("population_study_start_day" = as.integer(NA)), - list("population_study_start_month" = as.character(NA)), - list("population_study_start_year" = as.integer(NA)), - list("population_study_end_day" = as.integer(NA)), - list("population_study_end_month" = as.character(NA)), - list("population_study_end_year" = as.integer(NA)), - list("genome_site" = as.character(NA)), - list("genomic_sequence_available" = as.logical(NA)), - list("parameter_class" = as.character(NA)), - list("covidence_id" = as.integer(2059)), - list("Uncertainty" = as.character(NA)), - list("Survey year" = as.character(NA))), + new_param = + c(list("article_id" = as.integer(1)), + list("parameter_type" = as.character(NA)), + list("parameter_value" = as.double(NA)), + list("parameter_unit" = as.character(NA)), + list("parameter_lower_bound" = as.double(NA)), + list("parameter_upper_bound" = as.double(NA)), + list("population_study_start_day" = as.integer(NA)), + list("population_study_start_month" = as.character(NA)), + list("population_study_start_year" = as.integer(NA)), + list("population_study_end_day" = as.integer(NA)), + list("population_study_end_month" = as.character(NA)), + list("population_study_end_year" = as.integer(NA)), + list("genome_site" = as.character(NA)), + list("genomic_sequence_available" = as.logical(NA)), + list("parameter_class" = as.character(NA)), + list("covidence_id" = as.integer(2059)), + list("Uncertainty" = as.character(NA)), + list("Survey year" = as.character(NA))), vignette_prepend = "") } diff --git a/man/data_delay_table.Rd b/man/data_delay_table.Rd new file mode 100644 index 0000000..bf527c0 --- /dev/null +++ b/man/data_delay_table.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_delay_table.R +\name{data_delay_table} +\alias{data_delay_table} +\title{Process data for delay table} +\usage{ +data_delay_table(pathogen, exclude) +} +\arguments{ +\item{pathogen}{name of pathogen e.g. "marburg"} + +\item{exclude}{article IDs to exclude} +} +\value{ +processed data to use as input for delay_table() +} +\description{ +Process data for delay table +} +\examples{ +df <- data_delay_table(pathogen, exclude = c(17, 15)) +} diff --git a/man/delay_table.Rd b/man/delay_table.Rd index 0eb768f..7910801 100644 --- a/man/delay_table.Rd +++ b/man/delay_table.Rd @@ -7,8 +7,8 @@ delay_table(df, pathogen) } \arguments{ -\item{df}{processed data with parameter information (see vignette for each -pathogen)} +\item{df}{processed data with parameter information produced using +data_delay_table()} \item{pathogen}{name of pathogen} } @@ -20,5 +20,9 @@ extracted from the included studies Create table for human delay parameters } \examples{ -delay_table(df, pathogen = "marburg") +# Process data +df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) + +# Get delay table +delay_table(df = df, pathogen = "marburg") } diff --git a/man/forest_plot_R.Rd b/man/forest_plot_R.Rd index f68e83b..e3df1f4 100644 --- a/man/forest_plot_R.Rd +++ b/man/forest_plot_R.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/forest_plot_r.R -\name{forest_plot_R} -\alias{forest_plot_R} +\name{forest_plot_r} +\alias{forest_plot_r} \title{Create forest plot for reproduction numbers} \usage{ -forest_plot_R(df) +forest_plot_r(df) } \arguments{ \item{df}{processed data with parameter information (see vignette for each @@ -17,5 +17,5 @@ returns plot with a summary of reproduction number estimates Create forest plot for reproduction numbers } \examples{ -forest_plot_R(df = data) +forest_plot_r(df = data) } diff --git a/man/forest_plot_delay.Rd b/man/forest_plot_delay.Rd index ffb0c08..3a8d2c1 100644 --- a/man/forest_plot_delay.Rd +++ b/man/forest_plot_delay.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/forest_plot_delays.R +% Please edit documentation in R/forest_plot_delay.R \name{forest_plot_delay} \alias{forest_plot_delay} \title{Create forest plot for delays} diff --git a/man/forest_plot_severity.Rd b/man/forest_plot_severity.Rd index 0d0cb87..2d040c1 100644 --- a/man/forest_plot_severity.Rd +++ b/man/forest_plot_severity.Rd @@ -9,6 +9,8 @@ forest_plot_severity(df, outbreak_naive = FALSE) \arguments{ \item{df}{processed data with severity information e.g. IFR and CFR (see vignette for each pathogen)} + +\item{outbreak_naive}{TRUE or FALSE. FALSE by default.} } \value{ returns plot with a summary of IFR and CFR estimates diff --git a/man/marburg_article.Rd b/man/marburg_article.Rd new file mode 100644 index 0000000..db9660b --- /dev/null +++ b/man/marburg_article.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{marburg_article} +\alias{marburg_article} +\title{Data on the articles identified and included in the systematic review of +articles related to Marburg virus disease.} +\format{ +A csv file containing the following parameters: + +XXYY +} +\source{ +Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +et al. Marburg Virus Disease outbreaks, mathematical models, and disease +parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +} +\description{ +This data set provides the details of all extracted articles included in +the systematic review for Marburg virus disease (MVD). +} diff --git a/man/marburg_model.csv.Rd b/man/marburg_model.Rd similarity index 92% rename from man/marburg_model.csv.Rd rename to man/marburg_model.Rd index e8d64be..53b2dcc 100644 --- a/man/marburg_model.csv.Rd +++ b/man/marburg_model.Rd @@ -1,8 +1,8 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} -\name{marburg_model.csv} -\alias{marburg_model.csv} +\name{marburg_model} +\alias{marburg_model} \title{Data on the models identified in the systematic review of articles related to Marburg virus disease.} \format{ @@ -34,8 +34,7 @@ between groups or over time, age dependent susceptibility, or unspecified. \source{ Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, et al. Marburg Virus Disease outbreaks, mathematical models, and disease -parameters: a Systematic Review \link{Internet}. medRxiv; 2023 \link{cited 2023 Jul 13}. -p. 2023.07.10.23292424. +parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 } \description{ diff --git a/man/marburg_outbreak.csv.Rd b/man/marburg_outbreak.Rd similarity index 92% rename from man/marburg_outbreak.csv.Rd rename to man/marburg_outbreak.Rd index b299ef7..58ac36d 100644 --- a/man/marburg_outbreak.csv.Rd +++ b/man/marburg_outbreak.Rd @@ -1,8 +1,8 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} -\name{marburg_outbreak.csv} -\alias{marburg_outbreak.csv} +\name{marburg_outbreak} +\alias{marburg_outbreak} \title{Data on the outbreaks identified in the systematic review of articles related to Marburg virus disease.} \format{ @@ -38,8 +38,7 @@ either TRUE or FALSE. \source{ Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, et al. Marburg Virus Disease outbreaks, mathematical models, and disease -parameters: a Systematic Review \link{Internet}. medRxiv; 2023 \link{cited 2023 Jul 13}. -p. 2023.07.10.23292424. +parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 } \description{ diff --git a/man/marburg_parameter.csv.Rd b/man/marburg_parameter.Rd similarity index 92% rename from man/marburg_parameter.csv.Rd rename to man/marburg_parameter.Rd index d98ec63..c76b759 100644 --- a/man/marburg_parameter.csv.Rd +++ b/man/marburg_parameter.Rd @@ -1,8 +1,8 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} -\name{marburg_parameter.csv} -\alias{marburg_parameter.csv} +\name{marburg_parameter} +\alias{marburg_parameter} \title{Data on the parameters identified in the systematic review of articles related to Marburg virus disease.} \format{ @@ -67,8 +67,7 @@ A csv file containing the following parameters: \source{ Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, et al. Marburg Virus Disease outbreaks, mathematical models, and disease -parameters: a Systematic Review \link{Internet}. medRxiv; 2023 \link{cited 2023 Jul 13}. -p. 2023.07.10.23292424. +parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 } \description{ diff --git a/vignettes/pathogen_database_field_options.Rmd b/vignettes/pathogen_database_field_options.Rmd index 17c9a28..cdc2aec 100644 --- a/vignettes/pathogen_database_field_options.Rmd +++ b/vignettes/pathogen_database_field_options.Rmd @@ -18,7 +18,7 @@ vignette: > } ``` -The field options for each table can be retrieved from `get_available_table_field_options(table_type = "model",field = 'Model type')` which would return the available options for the model type field in the Models dataset. Below we display _all_ options for _all_ table types. +The field options for each table can be retrieved from `get_table_field_options(table_type = "model", field = 'Model type')` which would return the available options for the model type field in the Models dataset. Below we display _all_ options for _all_ table types. ## Model field options @@ -27,7 +27,7 @@ library(tidyverse) library(flextable) source("../R/get_table_field_options.R") -tbl <- get_available_table_field_options('model',vignette_prepend = "../") +tbl <- get_table_field_options('model',vignette_prepend = "../") tbl %>% flextable() ``` @@ -35,7 +35,7 @@ tbl %>% flextable() ## Parameter field options ```{r parameter options, echo=FALSE, message=FALSE, warning=FALSE, paged.print=TRUE} -tbl <- get_available_table_field_options('parameter',vignette_prepend = "../") +tbl <- get_table_field_options('parameter',vignette_prepend = "../") tbl %>% flextable() ``` @@ -43,7 +43,7 @@ tbl %>% flextable() ## Outbreak field options ```{r outbreak options, echo=FALSE, message=FALSE, warning=FALSE, paged.print=TRUE} -tbl <- get_available_table_field_options('outbreak',vignette_prepend = "../") +tbl <- get_table_field_options('outbreak',vignette_prepend = "../") tbl %>% flextable() ``` diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index bd13891..7d25284 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -38,7 +38,7 @@ source('../R/quality_assessment.R') source('../R/outbreak_table.R') source('../R/forest_plot_mutations.R') source('../R/forest_plot_r.R') -source('../R/forest_plot_delays.R') +source('../R/forest_plot_delay.R') source('../R/forest_plot_severity.R') source('../R/delay_table.R') source('../R/risk_table.R') @@ -48,6 +48,9 @@ library(tidyverse) library(patchwork) library(ggplot2) library(flextable) +library(officer) +library(tm) +library(meta) ``` ## Outbreaks @@ -106,7 +109,7 @@ df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surn mutate(parameter_value_type = ifelse(parameter_data_id == 16, 'Other', parameter_value_type), parameter_value_type = ordered(parameter_value_type, levels = c('Mean','Median','Standard Deviation','Other','Unspecified') )) -forest_plot_R(df) +forest_plot_r(df) ``` ### Severity @@ -114,8 +117,6 @@ forest_plot_R(df) ```{r cfr_panel_A, echo=FALSE, fig.height=4, fig.width=9, message=FALSE, warning=FALSE} -library(meta) - file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') params <- read_csv(file_path_pa) From 00e97edbf9e20368ea65013b799eb50dffb2fe20 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Tue, 18 Jul 2023 17:00:02 +0100 Subject: [PATCH 26/40] add new data_forest_plot_delay function --- NAMESPACE | 2 + R/data_delay_table.R | 5 +- R/data_forest_plot_delay.R | 86 ++++++++++++++++++++++++++++++++++ R/forest_plot_delay.R | 9 ++-- man/data_delay_table.Rd | 2 +- man/data_forest_plot_delay.Rd | 22 +++++++++ man/forest_plot_delay.Rd | 11 +++-- vignettes/pathogen_marburg.Rmd | 43 ++--------------- 8 files changed, 130 insertions(+), 50 deletions(-) create mode 100644 R/data_forest_plot_delay.R create mode 100644 man/data_forest_plot_delay.Rd diff --git a/NAMESPACE b/NAMESPACE index e86786c..b4484c2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,6 +6,7 @@ export(create_new_model_entry) export(create_new_outbreak_entry) export(create_new_parameter_entry) export(data_delay_table) +export(data_forest_plot_delay) export(date_start) export(delay_table) export(forest_plot_delay) @@ -88,6 +89,7 @@ importFrom(stringr,str_replace) importFrom(stringr,str_replace_all) importFrom(stringr,str_split) importFrom(stringr,str_split_fixed) +importFrom(stringr,str_starts) importFrom(stringr,str_to_sentence) importFrom(stringr,str_to_title) importFrom(stringr,str_wrap) diff --git a/R/data_delay_table.R b/R/data_delay_table.R index 4509489..31b6600 100644 --- a/R/data_delay_table.R +++ b/R/data_delay_table.R @@ -6,7 +6,7 @@ #' @importFrom readr read_csv #' @importFrom dplyr left_join mutate select arrange filter #' @examples -#' df <- data_delay_table(pathogen, exclude = c(17, 15)) +#' df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) #' @export data_delay_table <- function(pathogen, exclude) { @@ -26,7 +26,8 @@ data_delay_table <- function(pathogen, exclude) { articles <- read_csv(file_path_ar) # Deal with R CMD Check "no visible binding for global variable" - article_id <- first_author_surname <- year_publication <- NULL + article_id <- first_author_surname <- year_publication <- + population_country <- article_label <- NULL x <- left_join(params, articles %>% select(article_id, first_author_surname, year_publication), diff --git a/R/data_forest_plot_delay.R b/R/data_forest_plot_delay.R new file mode 100644 index 0000000..166dc6c --- /dev/null +++ b/R/data_forest_plot_delay.R @@ -0,0 +1,86 @@ +#' Process data for use in forest_plot_delay() +#' +#' @param pathogen name of pathogen e.g. "marburg" +#' @param exclude article IDs to exclude +#' @return processed data to use as input for forest_plot_delay() +#' @importFrom readr read_csv +#' @importFrom stringr str_starts +#' @importFrom dplyr select arrange filter mutate rowwise +#' @examples +#' data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +#' @export + +data_forest_plot_delay <- function(pathogen, exclude) { + + # Get file pathway for parameter data + file_path_pa <- system.file( + "data", paste0(pathogen, "_parameter.csv"), package = "epireview") + if (file_path_pa == "") + file_path_pa <- paste0("../data/", pathogen, "_parameter.csv") + params <- read_csv(file_path_pa) + + # Get file pathway for article data + file_path_ar <- system.file( + "data", paste0(pathogen, "_article.csv"), package = "epireview") + if (file_path_ar == "") + file_path_ar <- paste0("../data/", pathogen, "_article.csv") + articles <- read_csv(file_path_ar) + + # Deal with R CMD Check "no visible binding for global variable" + parameter_class <- parameter_type <- article_id <- article_label <- + first_author_surname <- year_publication <- parameter_value <- + parameter_value_type <- parameter_lower_bound <- parameter_upper_bound <- + parameter_data_id <- parameter_uncertainty_lower_value <- + parameter_uncertainty_upper_value <- population_country <- + parameter_uncertainty_type <- cfr_ifr_method <- NULL + + df <- left_join(params, articles %>% + select(article_id, first_author_surname, year_publication), + by = "article_id") %>% + mutate(article_label = as.character( + paste0(first_author_surname, "", year_publication)), + population_country = str_replace_all(population_country, ";", ",")) %>% + arrange(article_label, -year_publication) %>% + filter(article_id %in% exclude == FALSE) %>% + mutate( + parameter_uncertainty_lower_value = + replace(parameter_uncertainty_lower_value, + (parameter_uncertainty_type == "Range" & + !is.na(parameter_lower_bound) & + parameter_class == "Human delay"), NA), + parameter_uncertainty_upper_value = + replace(parameter_uncertainty_upper_value, + (parameter_uncertainty_type == "Range" & + !is.na(parameter_upper_bound) & + parameter_class == "Human delay"), NA)) + +# pathogen specific edits +if (pathogen == "marburg") { + df <- df %>% + rowwise() %>% + mutate(parameter_uncertainty_lower_value = + replace(parameter_uncertainty_lower_value, + parameter_data_id == 43, + parameter_uncertainty_lower_value * 1e-4), + parameter_uncertainty_upper_value = + replace(parameter_uncertainty_upper_value, + parameter_data_id == 43, + parameter_uncertainty_upper_value * 1e-4)) %>% + mutate(parameter_value = + replace(parameter_value, parameter_data_id == 34, 0.93), + cfr_ifr_method = + replace(cfr_ifr_method, str_starts(parameter_type, "Severity") & + is.na(cfr_ifr_method), "Unknown")) %>% + mutate(parameter_value_type = + ifelse(parameter_data_id == 16, "Other", parameter_value_type), + parameter_value_type = + ordered(parameter_value_type, levels = c("Mean", + "Median", + "Standard Deviation", + "Other", + "Unspecified"))) +} + +return(df) + +} diff --git a/R/forest_plot_delay.R b/R/forest_plot_delay.R index 8c193b8..1f095a9 100644 --- a/R/forest_plot_delay.R +++ b/R/forest_plot_delay.R @@ -1,7 +1,7 @@ -#' Create forest plot for delays +#' Create forest plot for human delays #' -#' @param df processed data with human delay information (see vignette for each -#' pathogen) +#' @param df processed data with human delay information produced using +#' data_forest_plot_delay() #' @return returns plot with a summary of the human delays #' @importFrom dplyr filter mutate group_by arrange desc #' @importFrom stringr str_to_sentence str_wrap @@ -10,7 +10,8 @@ #' scale_shape_manual theme guides element_text guide_legend #' @importFrom stats setNames median #' @examples -#' forest_plot_delay(df = data) +#' df <- data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +#' forest_plot_delay(df = df) #' @export forest_plot_delay <- function(df) { diff --git a/man/data_delay_table.Rd b/man/data_delay_table.Rd index bf527c0..e28b3b9 100644 --- a/man/data_delay_table.Rd +++ b/man/data_delay_table.Rd @@ -18,5 +18,5 @@ processed data to use as input for delay_table() Process data for delay table } \examples{ -df <- data_delay_table(pathogen, exclude = c(17, 15)) +df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) } diff --git a/man/data_forest_plot_delay.Rd b/man/data_forest_plot_delay.Rd new file mode 100644 index 0000000..3e53a60 --- /dev/null +++ b/man/data_forest_plot_delay.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_forest_plot_delay.R +\name{data_forest_plot_delay} +\alias{data_forest_plot_delay} +\title{Process data for use in forest_plot_delay()} +\usage{ +data_forest_plot_delay(pathogen, exclude) +} +\arguments{ +\item{pathogen}{name of pathogen e.g. "marburg"} + +\item{exclude}{article IDs to exclude} +} +\value{ +processed data to use as input for forest_plot_delay() +} +\description{ +Process data for use in forest_plot_delay() +} +\examples{ +data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +} diff --git a/man/forest_plot_delay.Rd b/man/forest_plot_delay.Rd index 3a8d2c1..ac878da 100644 --- a/man/forest_plot_delay.Rd +++ b/man/forest_plot_delay.Rd @@ -2,20 +2,21 @@ % Please edit documentation in R/forest_plot_delay.R \name{forest_plot_delay} \alias{forest_plot_delay} -\title{Create forest plot for delays} +\title{Create forest plot for human delays} \usage{ forest_plot_delay(df) } \arguments{ -\item{df}{processed data with human delay information (see vignette for each -pathogen)} +\item{df}{processed data with human delay information produced using +data_forest_plot_delay()} } \value{ returns plot with a summary of the human delays } \description{ -Create forest plot for delays +Create forest plot for human delays } \examples{ -forest_plot_delay(df = data) +df <- data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +forest_plot_delay(df = df) } diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index 7d25284..207ad3c 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -38,8 +38,10 @@ source('../R/quality_assessment.R') source('../R/outbreak_table.R') source('../R/forest_plot_mutations.R') source('../R/forest_plot_r.R') +source('../R/data_forest_plot_delay.R') source('../R/forest_plot_delay.R') source('../R/forest_plot_severity.R') +source('../R/data_delay_table.R') source('../R/delay_table.R') source('../R/risk_table.R') source('../R/seroprevalence_table.R') @@ -216,49 +218,14 @@ forest_plot_severity(df_out,outbreak_naive = TRUE) ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') -params <- read_csv(file_path_pa) - -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname,year_publication), by="article_id") %>% - mutate(article_label = as.character(paste0(first_author_surname," ",year_publication)), - population_country = str_replace_all(population_country,";",", ")) %>% - dplyr::arrange(article_label, -year_publication) %>% - dplyr::filter(article_id %in% c(17,15) == FALSE) - -delay_table(df,'marburg') +df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) +delay_table(df, "marburg") ``` **Figure 3 (B):** Delay parameters, stratified into five categories: Generation Time, Incubation Period, Time in Care, Time from Symptom to Careseeking and Time from Symptom to Outcome as indicated by different colours. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') -params <- read_csv(file_path_pa) - -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname, year_publication), by = 'article_id') %>% - mutate(article_label = as.character(paste0(first_author_surname, " ", year_publication)), - population_country = str_replace_all(population_country, ";", ", ")) %>% - dplyr::arrange(article_label, -year_publication) %>% - dplyr::filter(article_id %in% c(17,15) == FALSE) %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, (parameter_uncertainty_type == "Range" & !is.na(parameter_lower_bound) & parameter_class == "Human delay"), NA), - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, (parameter_uncertainty_type=="Range" & !is.na(parameter_upper_bound) & parameter_class == "Human delay"), NA)) %>% - rowwise() %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, parameter_data_id == 43, parameter_uncertainty_lower_value * 1e-4), # need to adjust for scaling - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, parameter_data_id == 43, parameter_uncertainty_upper_value * 1e-4)) %>% # need to adjust for scaling - mutate(parameter_value = replace(parameter_value, parameter_data_id == 34, 0.93), - cfr_ifr_method = replace(cfr_ifr_method, str_starts(parameter_type,"Severity") & is.na(cfr_ifr_method), "Unknown")) %>% - mutate(parameter_value_type = ifelse(parameter_data_id == 16, 'Other', parameter_value_type), - parameter_value_type = ordered(parameter_value_type, levels = c('Mean','Median','Standard Deviation','Other','Unspecified') )) - +df <- data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) forest_plot_delay(df) ``` From f0d8a02683d0059492370ebbc3e8692ce230032f Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Tue, 18 Jul 2023 18:03:03 +0100 Subject: [PATCH 27/40] change new function to data_forest_plots as data processing is the same for multiple plots --- NAMESPACE | 3 +- ...orest_plot_delay.R => data_forest_plots.R} | 31 ++++---- R/forest_plot_delay.R | 4 +- R/forest_plot_mutations.R | 7 +- R/forest_plot_r.R | 7 +- R/forest_plot_severity.R | 7 +- man/data_forest_plot_delay.Rd | 22 ------ man/data_forest_plots.Rd | 25 ++++++ man/forest_plot_R.Rd | 7 +- man/forest_plot_delay.Rd | 4 +- man/forest_plot_mutations.Rd | 7 +- man/forest_plot_severity.Rd | 7 +- man/get_table_field_options.Rd | 8 +- vignettes/pathogen_marburg.Rmd | 76 ++----------------- 14 files changed, 81 insertions(+), 134 deletions(-) rename R/{data_forest_plot_delay.R => data_forest_plots.R} (77%) delete mode 100644 man/data_forest_plot_delay.Rd create mode 100644 man/data_forest_plots.Rd diff --git a/NAMESPACE b/NAMESPACE index b4484c2..b2206aa 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,7 +6,7 @@ export(create_new_model_entry) export(create_new_outbreak_entry) export(create_new_parameter_entry) export(data_delay_table) -export(data_forest_plot_delay) +export(data_forest_plots) export(date_start) export(delay_table) export(forest_plot_delay) @@ -97,6 +97,7 @@ importFrom(tibble,as_tibble) importFrom(tibble,as_tibble_row) importFrom(tidyr,pivot_longer) importFrom(tidyr,pivot_wider) +importFrom(tidyr,replace_na) importFrom(tm,removeNumbers) importFrom(utils,globalVariables) importFrom(utils,write.csv) diff --git a/R/data_forest_plot_delay.R b/R/data_forest_plots.R similarity index 77% rename from R/data_forest_plot_delay.R rename to R/data_forest_plots.R index 166dc6c..71b0fe3 100644 --- a/R/data_forest_plot_delay.R +++ b/R/data_forest_plots.R @@ -1,16 +1,18 @@ -#' Process data for use in forest_plot_delay() +#' Process data for use in forest_plot_delay(), forest_plot_mutations(), +#' forest_plot_r() and forest_plot_severity() #' #' @param pathogen name of pathogen e.g. "marburg" #' @param exclude article IDs to exclude -#' @return processed data to use as input for forest_plot_delay() +#' @return processed data to use as input for forest_plot_delay(), +#' forest_plot_mutations(), forest_plot_r() and forest_plot_severity() #' @importFrom readr read_csv #' @importFrom stringr str_starts #' @importFrom dplyr select arrange filter mutate rowwise #' @examples -#' data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +#' data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) #' @export -data_forest_plot_delay <- function(pathogen, exclude) { +data_forest_plots <- function(pathogen, exclude) { # Get file pathway for parameter data file_path_pa <- system.file( @@ -42,17 +44,16 @@ data_forest_plot_delay <- function(pathogen, exclude) { population_country = str_replace_all(population_country, ";", ",")) %>% arrange(article_label, -year_publication) %>% filter(article_id %in% exclude == FALSE) %>% - mutate( - parameter_uncertainty_lower_value = - replace(parameter_uncertainty_lower_value, - (parameter_uncertainty_type == "Range" & - !is.na(parameter_lower_bound) & - parameter_class == "Human delay"), NA), - parameter_uncertainty_upper_value = - replace(parameter_uncertainty_upper_value, - (parameter_uncertainty_type == "Range" & - !is.na(parameter_upper_bound) & - parameter_class == "Human delay"), NA)) + mutate(parameter_uncertainty_lower_value = + replace(parameter_uncertainty_lower_value, + (parameter_uncertainty_type == "Range" & + !is.na(parameter_lower_bound) & + parameter_class == "Human delay"), NA), + parameter_uncertainty_upper_value = + replace(parameter_uncertainty_upper_value, + (parameter_uncertainty_type == "Range" & + !is.na(parameter_upper_bound) & + parameter_class == "Human delay"), NA)) # pathogen specific edits if (pathogen == "marburg") { diff --git a/R/forest_plot_delay.R b/R/forest_plot_delay.R index 1f095a9..cad7a94 100644 --- a/R/forest_plot_delay.R +++ b/R/forest_plot_delay.R @@ -1,7 +1,7 @@ #' Create forest plot for human delays #' #' @param df processed data with human delay information produced using -#' data_forest_plot_delay() +#' data_forest_plots() #' @return returns plot with a summary of the human delays #' @importFrom dplyr filter mutate group_by arrange desc #' @importFrom stringr str_to_sentence str_wrap @@ -10,7 +10,7 @@ #' scale_shape_manual theme guides element_text guide_legend #' @importFrom stats setNames median #' @examples -#' df <- data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +#' df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) #' forest_plot_delay(df = df) #' @export forest_plot_delay <- function(df) { diff --git a/R/forest_plot_mutations.R b/R/forest_plot_mutations.R index ca5c961..a25cf44 100644 --- a/R/forest_plot_mutations.R +++ b/R/forest_plot_mutations.R @@ -1,13 +1,14 @@ #' Create forest plot for genetic mutations #' -#' @param df processed data with parameter information (see vignette for each -#' pathogen) +#' @param df processed data with parameter information produced using +#' data_forest_plots() #' @return returns plot with a summary of genetic mutations #' @importFrom dplyr filter mutate arrange group_by desc if_else #' @importFrom ggplot2 geom_vline xlim #' @importFrom stats setNames #' @examples -#' forest_plot_mutations(df = data) +#' df = data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +#' forest_plot_mutations(df = df) #' @export forest_plot_mutations <- function(df) { diff --git a/R/forest_plot_r.R b/R/forest_plot_r.R index 2a7ab09..1c2988e 100644 --- a/R/forest_plot_r.R +++ b/R/forest_plot_r.R @@ -1,7 +1,7 @@ #' Create forest plot for reproduction numbers #' -#' @param df processed data with parameter information (see vignette for each -#' pathogen) +#' @param df processed data with parameter information produced using +#' data_forest_plots() #' @return returns plot with a summary of reproduction number estimates #' @importFrom dplyr filter arrange mutate group_by #' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete @@ -10,7 +10,8 @@ #' scale_linetype_manual scale_colour_manual xlim #' @importFrom stats median #' @examples -#' forest_plot_r(df = data) +#' df = data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +#' forest_plot_r(df = df) #' @export forest_plot_r <- function(df) { diff --git a/R/forest_plot_severity.R b/R/forest_plot_severity.R index bb6c1a6..502ae9e 100644 --- a/R/forest_plot_severity.R +++ b/R/forest_plot_severity.R @@ -1,7 +1,7 @@ #' Create forest plot for severity #' -#' @param df processed data with severity information e.g. IFR and CFR (see -#' vignette for each pathogen) +#' @param df processed data with severity information produced using +#' data_forest_plots() #' @param outbreak_naive TRUE or FALSE. FALSE by default. #' @return returns plot with a summary of IFR and CFR estimates #' @importFrom dplyr filter arrange mutate group_by @@ -11,7 +11,8 @@ #' scale_linetype_manual position_dodge scale_colour_manual xlim #' @importFrom stats setNames reorder #' @examples -#' forest_plot_severity(df = data) +#' df = data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +#' forest_plot_severity(df = df) #' @export forest_plot_severity <- function(df, outbreak_naive = FALSE) { diff --git a/man/data_forest_plot_delay.Rd b/man/data_forest_plot_delay.Rd deleted file mode 100644 index 3e53a60..0000000 --- a/man/data_forest_plot_delay.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/data_forest_plot_delay.R -\name{data_forest_plot_delay} -\alias{data_forest_plot_delay} -\title{Process data for use in forest_plot_delay()} -\usage{ -data_forest_plot_delay(pathogen, exclude) -} -\arguments{ -\item{pathogen}{name of pathogen e.g. "marburg"} - -\item{exclude}{article IDs to exclude} -} -\value{ -processed data to use as input for forest_plot_delay() -} -\description{ -Process data for use in forest_plot_delay() -} -\examples{ -data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) -} diff --git a/man/data_forest_plots.Rd b/man/data_forest_plots.Rd new file mode 100644 index 0000000..c12e32d --- /dev/null +++ b/man/data_forest_plots.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_forest_plots.R +\name{data_forest_plots} +\alias{data_forest_plots} +\title{Process data for use in forest_plot_delay(), forest_plot_mutations(), +forest_plot_r() and forest_plot_severity()} +\usage{ +data_forest_plots(pathogen, exclude) +} +\arguments{ +\item{pathogen}{name of pathogen e.g. "marburg"} + +\item{exclude}{article IDs to exclude} +} +\value{ +processed data to use as input for forest_plot_delay(), +forest_plot_mutations(), forest_plot_r() and forest_plot_severity() +} +\description{ +Process data for use in forest_plot_delay(), forest_plot_mutations(), +forest_plot_r() and forest_plot_severity() +} +\examples{ +data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +} diff --git a/man/forest_plot_R.Rd b/man/forest_plot_R.Rd index e3df1f4..72c9f93 100644 --- a/man/forest_plot_R.Rd +++ b/man/forest_plot_R.Rd @@ -7,8 +7,8 @@ forest_plot_r(df) } \arguments{ -\item{df}{processed data with parameter information (see vignette for each -pathogen)} +\item{df}{processed data with parameter information produced using +data_forest_plots()} } \value{ returns plot with a summary of reproduction number estimates @@ -17,5 +17,6 @@ returns plot with a summary of reproduction number estimates Create forest plot for reproduction numbers } \examples{ -forest_plot_r(df = data) +df = data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +forest_plot_r(df = df) } diff --git a/man/forest_plot_delay.Rd b/man/forest_plot_delay.Rd index ac878da..f61ee03 100644 --- a/man/forest_plot_delay.Rd +++ b/man/forest_plot_delay.Rd @@ -8,7 +8,7 @@ forest_plot_delay(df) } \arguments{ \item{df}{processed data with human delay information produced using -data_forest_plot_delay()} +data_forest_plots()} } \value{ returns plot with a summary of the human delays @@ -17,6 +17,6 @@ returns plot with a summary of the human delays Create forest plot for human delays } \examples{ -df <- data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) forest_plot_delay(df = df) } diff --git a/man/forest_plot_mutations.Rd b/man/forest_plot_mutations.Rd index 545158d..03410a4 100644 --- a/man/forest_plot_mutations.Rd +++ b/man/forest_plot_mutations.Rd @@ -7,8 +7,8 @@ forest_plot_mutations(df) } \arguments{ -\item{df}{processed data with parameter information (see vignette for each -pathogen)} +\item{df}{processed data with parameter information produced using +data_forest_plots()} } \value{ returns plot with a summary of genetic mutations @@ -17,5 +17,6 @@ returns plot with a summary of genetic mutations Create forest plot for genetic mutations } \examples{ -forest_plot_mutations(df = data) +df = data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +forest_plot_mutations(df = df) } diff --git a/man/forest_plot_severity.Rd b/man/forest_plot_severity.Rd index 2d040c1..47423aa 100644 --- a/man/forest_plot_severity.Rd +++ b/man/forest_plot_severity.Rd @@ -7,8 +7,8 @@ forest_plot_severity(df, outbreak_naive = FALSE) } \arguments{ -\item{df}{processed data with severity information e.g. IFR and CFR (see -vignette for each pathogen)} +\item{df}{processed data with severity information produced using +data_forest_plots()} \item{outbreak_naive}{TRUE or FALSE. FALSE by default.} } @@ -19,5 +19,6 @@ returns plot with a summary of IFR and CFR estimates Create forest plot for severity } \examples{ -forest_plot_severity(df = data) +df = data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +forest_plot_severity(df = df) } diff --git a/man/get_table_field_options.Rd b/man/get_table_field_options.Rd index 583f2d2..67491b4 100644 --- a/man/get_table_field_options.Rd +++ b/man/get_table_field_options.Rd @@ -22,10 +22,10 @@ data for specified table_type and field Note: This will need to be extended when other pathogens are added } \examples{ -get_available_table_field_options(table_type = "model", field = "all") +get_table_field_options(table_type = "model", field = "all") -get_available_table_field_options(table_type = "model", field = "Model type") +get_table_field_options(table_type = "model", field = "Model type") -get_available_table_field_options(table_type = "parameter", - field = "Reproduction number method") +get_table_field_options(table_type = "parameter", + field = "Reproduction number method") } diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index 207ad3c..257a411 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -38,7 +38,7 @@ source('../R/quality_assessment.R') source('../R/outbreak_table.R') source('../R/forest_plot_mutations.R') source('../R/forest_plot_r.R') -source('../R/data_forest_plot_delay.R') +source('../R/data_forest_plots.R') source('../R/forest_plot_delay.R') source('../R/forest_plot_severity.R') source('../R/data_delay_table.R') @@ -88,29 +88,7 @@ outbreak_table(df,'marburg') **Figure 3 (A):** Estimates of the reproduction number. The blue and red points correspond to estimates of the effective reproduction number (Re) and basic reproduction number (R0) respectively, with associated uncertainty shown by the solid lines where available. The dashed vertical line presents the threshold for epidemic growth. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') -params <- read_csv(file_path_pa) - -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname, year_publication), by = 'article_id') %>% - mutate(article_label = as.character(paste0(first_author_surname, " ", year_publication)), - population_country = str_replace_all(population_country, ";", ", ")) %>% - dplyr::arrange(article_label, -year_publication) %>% - dplyr::filter(article_id %in% c(17,15) == FALSE) %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, (parameter_uncertainty_type == "Range" & !is.na(parameter_lower_bound) & parameter_class == "Human delay"), NA), - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, (parameter_uncertainty_type=="Range" & !is.na(parameter_upper_bound) & parameter_class == "Human delay"), NA)) %>% - rowwise() %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, parameter_data_id == 43, parameter_uncertainty_lower_value * 1e-4), # need to adjust for scaling - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, parameter_data_id == 43, parameter_uncertainty_upper_value * 1e-4)) %>% # need to adjust for scaling - mutate(parameter_value = replace(parameter_value, parameter_data_id == 34, 0.93), - cfr_ifr_method = replace(cfr_ifr_method, str_starts(parameter_type,"Severity") & is.na(cfr_ifr_method), "Unknown")) %>% - mutate(parameter_value_type = ifelse(parameter_data_id == 16, 'Other', parameter_value_type), - parameter_value_type = ordered(parameter_value_type, levels = c('Mean','Median','Standard Deviation','Other','Unspecified') )) - +df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) forest_plot_r(df) ``` @@ -119,28 +97,7 @@ forest_plot_r(df) ```{r cfr_panel_A, echo=FALSE, fig.height=4, fig.width=9, message=FALSE, warning=FALSE} -file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') -params <- read_csv(file_path_pa) - -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname, year_publication), by = 'article_id') %>% - mutate(article_label = as.character(paste0(first_author_surname, " ", year_publication)), - population_country = str_replace_all(population_country, ";", ", ")) %>% - dplyr::arrange(article_label, -year_publication) %>% - dplyr::filter(article_id %in% c(17,15) == FALSE) %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, (parameter_uncertainty_type == "Range" & !is.na(parameter_lower_bound) & parameter_class == "Human delay"), NA), - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, (parameter_uncertainty_type=="Range" & !is.na(parameter_upper_bound) & parameter_class == "Human delay"), NA)) %>% - rowwise() %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, parameter_data_id == 43, parameter_uncertainty_lower_value * 1e-4), # need to adjust for scaling - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, parameter_data_id == 43, parameter_uncertainty_upper_value * 1e-4)) %>% # need to adjust for scaling - mutate(parameter_value = replace(parameter_value, parameter_data_id == 34, 0.93), - cfr_ifr_method = replace(cfr_ifr_method, str_starts(parameter_type,"Severity") & is.na(cfr_ifr_method), "Unknown")) %>% - mutate(parameter_value_type = ifelse(parameter_data_id == 16, 'Other', parameter_value_type), - parameter_value_type = ordered(parameter_value_type, levels = c('Mean','Median','Standard Deviation','Other','Unspecified') )) +df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) df_out <- left_join(outbreak, articles %>% dplyr::select(covidence_id, first_author_surname, year_publication), by = "covidence_id") %>% mutate(article_label = as.character(paste0(first_author_surname, " ", year_publication)), @@ -204,6 +161,7 @@ forest.meta(meta_cfr_outbreak, layout="RevMan5", xlab="Proportion", comb.r=T, co **Figure S2 (A):** Overview of the estimates of the case fatality ratio (CFR) obtained from the included studies. CFR estimates reported in the included studies, stratified according to estimation method. Points represent central estimates. Error bars represent an uncertainty interval associated with the point estimate, as reported in the original study. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} +df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) forest_plot_severity(df) ``` **Figure S2 (B):** Overview of the estimates of the case fatality ratio (CFR) obtained from the included studies. CFR estimated from extracted outbreak data, including only one observation per outbreak using the study with the longest duration of the outbreak reported ensuring each case is not double counted. Shaded bars represents the imputed Binomial confidence interval for studies with a sample size, n > 1. Vertical dotted lines represent 0% and 100% CFR. @@ -225,7 +183,7 @@ delay_table(df, "marburg") **Figure 3 (B):** Delay parameters, stratified into five categories: Generation Time, Incubation Period, Time in Care, Time from Symptom to Careseeking and Time from Symptom to Outcome as indicated by different colours. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -df <- data_forest_plot_delay(pathogen = "marburg", exclude = c(15, 17)) +df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) forest_plot_delay(df) ``` @@ -254,29 +212,7 @@ sero_table(df,'marburg') **Figure 3 (C):** Evolutionary rates. Colours indicate different genome types; points represent central estimates. Solid lines represent an uncertainty interval associated with the point estimate while ribbons indicate a parameter value +/- standard error with a minimum value of 0. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') -params <- read_csv(file_path_pa) - -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname, year_publication), by = 'article_id') %>% - mutate(article_label = as.character(paste0(first_author_surname, " ", year_publication)), - population_country = str_replace_all(population_country, ";", ", ")) %>% - dplyr::arrange(article_label, -year_publication) %>% - dplyr::filter(article_id %in% c(17,15) == FALSE) %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, (parameter_uncertainty_type == "Range" & !is.na(parameter_lower_bound) & parameter_class == "Human delay"), NA), - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, (parameter_uncertainty_type=="Range" & !is.na(parameter_upper_bound) & parameter_class == "Human delay"), NA)) %>% - rowwise() %>% - mutate(parameter_uncertainty_lower_value = replace(parameter_uncertainty_lower_value, parameter_data_id == 43, parameter_uncertainty_lower_value * 1e-4), # need to adjust for scaling - parameter_uncertainty_upper_value = replace(parameter_uncertainty_upper_value, parameter_data_id == 43, parameter_uncertainty_upper_value * 1e-4)) %>% # need to adjust for scaling - mutate(parameter_value = replace(parameter_value, parameter_data_id == 34, 0.93), - cfr_ifr_method = replace(cfr_ifr_method, str_starts(parameter_type,"Severity") & is.na(cfr_ifr_method), "Unknown")) %>% - mutate(parameter_value_type = ifelse(parameter_data_id == 16, 'Other', parameter_value_type), - parameter_value_type = ordered(parameter_value_type, levels = c('Mean','Median','Standard Deviation','Other','Unspecified') )) - +df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) forest_plot_mutations(df) ``` From e1f9a46f6ee5c6cea83eee30c1a01218a4361bf2 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Tue, 18 Jul 2023 18:03:36 +0100 Subject: [PATCH 28/40] additional tidyr import --- R/get_table_field_options.R | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/R/get_table_field_options.R b/R/get_table_field_options.R index 2a8ea33..7b905c3 100644 --- a/R/get_table_field_options.R +++ b/R/get_table_field_options.R @@ -9,15 +9,16 @@ #' @param vignette_prepend string to allow loading data in vignettes #' @return data for specified table_type and field #' @importFrom dplyr mutate everything across +#' @importFrom tidyr replace_na #' @importFrom readr read_csv #' @importFrom stats na.omit #' @examples -#' get_available_table_field_options(table_type = "model", field = "all") +#' get_table_field_options(table_type = "model", field = "all") #' -#' get_available_table_field_options(table_type = "model", field = "Model type") +#' get_table_field_options(table_type = "model", field = "Model type") #' -#' get_available_table_field_options(table_type = "parameter", -#' field = "Reproduction number method") +#' get_table_field_options(table_type = "parameter", +#' field = "Reproduction number method") #' @export get_table_field_options <- function(table_type = NA, field = "all", From c5b394a137675e87a0b83db88fcbada20028f375 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Tue, 18 Jul 2023 18:27:14 +0100 Subject: [PATCH 29/40] new data_outbreak_table function --- NAMESPACE | 1 + R/data_outbreak_table.R | 52 ++++++++++++++++++++++++++++++++++ R/outbreak_table.R | 7 +++-- man/data_outbreak_table.Rd | 20 +++++++++++++ man/outbreak_table.Rd | 3 +- vignettes/pathogen_marburg.Rmd | 30 +++++++------------- 6 files changed, 90 insertions(+), 23 deletions(-) create mode 100644 R/data_outbreak_table.R create mode 100644 man/data_outbreak_table.Rd diff --git a/NAMESPACE b/NAMESPACE index b2206aa..d971ec6 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,6 +7,7 @@ export(create_new_outbreak_entry) export(create_new_parameter_entry) export(data_delay_table) export(data_forest_plots) +export(data_outbreak_table) export(date_start) export(delay_table) export(forest_plot_delay) diff --git a/R/data_outbreak_table.R b/R/data_outbreak_table.R new file mode 100644 index 0000000..cec3500 --- /dev/null +++ b/R/data_outbreak_table.R @@ -0,0 +1,52 @@ +#' Process data for outbreak table +#' +#' @param pathogen name of pathogen e.g. "marburg" +#' @return processed data to use as input for outbreak_table() +#' @importFrom readr read_csv +#' @importFrom dplyr left_join mutate select arrange +#' @examples +#' df <- data_outbreak_table(pathogen = "marburg") +#' @export + +data_outbreak_table <- function(pathogen) { + + # Get file pathway for outbreak data + file_path_ob <- system.file( + "data", paste0(pathogen, "_outbreak.csv"), package = "epireview") + if (file_path_ob == "") + file_path_ob <- paste0("../data/", pathogen, "_outbreak.csv") + outbreak <- read_csv(file_path_ob) + + # Get file pathway for article data + file_path_ar <- system.file( + "data", paste0(pathogen, "_article.csv"), package = "epireview") + if (file_path_ar == "") + file_path_ar <- paste0("../data/", pathogen, "_article.csv") + articles <- read_csv(file_path_ar) + + # Deal with R CMD Check "no visible binding for global variable" + article_id <- first_author_surname <- year_publication <- + outbreak_country <- outbreak_location <- cases_mode_detection <- + article_label <- NULL + + df <- left_join(outbreak, articles %>% + select(article_id, first_author_surname, year_publication), + by = "article_id") %>% + mutate(article_label = as.character( + paste0(first_author_surname, "", year_publication)), + outbreak_country = str_replace_all(outbreak_country, ";", ","), + outbreak_country = str_replace_all( + outbreak_country, "Yuogslavia", "Yugoslavia"), + outbreak_country = str_replace_all( + outbreak_country, "Congo, Dem. Rep.", + "Democratic Republic of the Congo"), + outbreak_location = str_replace_all( + outbreak_location, "Marburg (23), Frankfurt am Main (6), Belgrade (2)", + "Marburg, Frankfurt am Main, Belgrade"), + cases_mode_detection = + gsub("[()]", "", str_replace_all( + cases_mode_detection, "(PCR etc)", " "))) %>% + arrange(article_label, -year_publication) + + return(df) +} diff --git a/R/outbreak_table.R b/R/outbreak_table.R index 7e8a5f4..8ee770f 100644 --- a/R/outbreak_table.R +++ b/R/outbreak_table.R @@ -1,7 +1,7 @@ #' Create table with all outbreak data for a particular pathogen #' -#' @param df processed data with outbreak information (see vignette for each -#' pathogen) +#' @param df processed data with outbreak information produced by +#' data_outbreak_table() #' @param pathogen name of pathogen #' @return returns flextable summarising all extracted outbreaks for the #' specified pathogen @@ -11,7 +11,8 @@ #' @importFrom tm removeNumbers #' @importFrom stringr str_replace_all #' @examples -#' outbreak_table(df = data, pathogen = "marburg") +#' df <- data_outbreak_table(pathogen = "marburg") +#' outbreak_table(df = df, pathogen = "marburg") #' @export outbreak_table <- function(df, pathogen) { diff --git a/man/data_outbreak_table.Rd b/man/data_outbreak_table.Rd new file mode 100644 index 0000000..20b0a8b --- /dev/null +++ b/man/data_outbreak_table.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_outbreak_table.R +\name{data_outbreak_table} +\alias{data_outbreak_table} +\title{Process data for outbreak table} +\usage{ +data_outbreak_table(pathogen) +} +\arguments{ +\item{pathogen}{name of pathogen e.g. "marburg"} +} +\value{ +processed data to use as input for outbreak_table() +} +\description{ +Process data for outbreak table +} +\examples{ +df <- data_outbreak_table(pathogen = "marburg") +} diff --git a/man/outbreak_table.Rd b/man/outbreak_table.Rd index 8c00db2..193dfd3 100644 --- a/man/outbreak_table.Rd +++ b/man/outbreak_table.Rd @@ -20,5 +20,6 @@ specified pathogen Create table with all outbreak data for a particular pathogen } \examples{ -outbreak_table(df = data, pathogen = "marburg") +df <- data_outbreak_table(pathogen = "marburg") +outbreak_table(df = df, pathogen = "marburg") } diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index 257a411..15dd46d 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -35,6 +35,7 @@ All Tables and Figures from the paper are re-produced below on the **latest** av ```{r setup, echo=FALSE, message=FALSE, warning=FALSE} knitr::opts_chunk$set(echo = FALSE) source('../R/quality_assessment.R') +source('../R/data_outbreak_table.R') source('../R/outbreak_table.R') source('../R/forest_plot_mutations.R') source('../R/forest_plot_r.R') @@ -59,25 +60,8 @@ library(meta) **Table 1:** Overview of MVD outbreaks i.e. location, timing, and size, as reported in the studies included in this review. We report in bold the country and outbreak year, the location refers to the place of the actual outbreak in the country if known. Blank cells correspond to information which we were unable to find in or extract from the literature. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_ob <- system.file("data", "marburg_outbreak.csv", package = "epireview") -if(file_path_ob=="") file_path_ob <- paste0('../data/marburg_outbreak.csv') -outbreak <- read_csv(file_path_ob) - -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(outbreak, articles %>% dplyr::select(article_id, first_author_surname,year_publication), by="article_id") %>% - mutate(article_label = as.character(paste0(first_author_surname," ",year_publication)), - outbreak_country = str_replace_all(outbreak_country,";",", "), - outbreak_country = str_replace_all(outbreak_country, "Yuogslavia", "Yugoslavia"), - outbreak_country = str_replace_all(outbreak_country, "Congo, Dem. Rep.", "Democratic Republic of the Congo"), - outbreak_location = str_replace_all(outbreak_location, "Marburg (23), Frankfurt am Main (6), Belgrade (2)", - "Marburg, Frankfurt am Main, Belgrade"), - cases_mode_detection = gsub("[()]", "", str_replace_all(cases_mode_detection, "(PCR etc)", " "))) %>% - dplyr::arrange(article_label, -year_publication) - -outbreak_table(df,'marburg') +df <- data_outbreak_table(pathogen = "marburg") +outbreak_table(df, "marburg") ``` ## Parameters @@ -99,6 +83,14 @@ forest_plot_r(df) ```{r cfr_panel_A, echo=FALSE, fig.height=4, fig.width=9, message=FALSE, warning=FALSE} df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) +file_path_ob <- system.file("data", "marburg_outbreak.csv", package = "epireview") +if(file_path_ob=="") file_path_ob <- paste0('../data/marburg_outbreak.csv') +outbreak <- read_csv(file_path_ob) + +file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") +if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') +articles <- read_csv(file_path_ar) + df_out <- left_join(outbreak, articles %>% dplyr::select(covidence_id, first_author_surname, year_publication), by = "covidence_id") %>% mutate(article_label = as.character(paste0(first_author_surname, " ", year_publication)), outbreak_country = str_replace_all(outbreak_country, ";", ", ")) %>% From 3de99a3c0dcdc06a38f50d9f08d1b065204d0ddc Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Wed, 19 Jul 2023 09:15:09 +0100 Subject: [PATCH 30/40] add new data_risk_table --- NAMESPACE | 1 + R/data_risk_table.R | 45 ++++++++++++++++++++++++++++++++++ R/risk_table.R | 6 +++-- man/data_risk_table.Rd | 22 +++++++++++++++++ man/outbreak_table.Rd | 4 +-- man/risk_table.Rd | 6 +++-- vignettes/pathogen_marburg.Rmd | 18 +++----------- 7 files changed, 81 insertions(+), 21 deletions(-) create mode 100644 R/data_risk_table.R create mode 100644 man/data_risk_table.Rd diff --git a/NAMESPACE b/NAMESPACE index d971ec6..afe0c79 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,6 +8,7 @@ export(create_new_parameter_entry) export(data_delay_table) export(data_forest_plots) export(data_outbreak_table) +export(data_risk_table) export(date_start) export(delay_table) export(forest_plot_delay) diff --git a/R/data_risk_table.R b/R/data_risk_table.R new file mode 100644 index 0000000..53c0ad4 --- /dev/null +++ b/R/data_risk_table.R @@ -0,0 +1,45 @@ +#' Process data for use in risk_table() +#' +#' @param pathogen name of pathogen e.g. "marburg" +#' @param exclude article IDs to exclude +#' @return processed data to use as input for risk_table() +#' @importFrom readr read_csv +#' @importFrom stringr str_replace_all +#' @importFrom dplyr select arrange filter mutate +#' @examples +#' data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +#' @export + +data_risk_table <- function(pathogen, exclude) { + +# Get file pathway for parameter data +file_path_pa <- system.file( + "data", paste0(pathogen, "_parameter.csv"), package = "epireview") +if (file_path_pa == "") + file_path_pa <- paste0("../data/", pathogen, "_parameter.csv") +params <- read_csv(file_path_pa) + +# Get file pathway for article data +file_path_ar <- system.file( + "data", paste0(pathogen, "_article.csv"), package = "epireview") +if (file_path_ar == "") + file_path_ar <- paste0("../data/", pathogen, "_article.csv") +articles <- read_csv(file_path_ar) + +# Deal with R CMD Check "no visible binding for global variable" +article_id <- article_label <- first_author_surname <- year_publication <- + population_country <- NULL + +df <- left_join(params, articles %>% + select(article_id, first_author_surname, year_publication), + by = "article_id") %>% + mutate(article_label = + as.character(paste0(first_author_surname, "", year_publication)), + population_country = + str_replace_all(population_country, ";", ",")) %>% + arrange(article_label, -year_publication) %>% + filter(article_id %in% exclude == FALSE) + +return(df) + +} diff --git a/R/risk_table.R b/R/risk_table.R index b5c5408..93dd465 100644 --- a/R/risk_table.R +++ b/R/risk_table.R @@ -1,6 +1,7 @@ #' Create risk table #' -#' @param df data with outbreak information +#' @param df processed data with risk factor information produced by +#' data_risk_table() #' @param pathogen name of pathogen #' @param supplement either TRUE or FALSE. If TRUE, returns supplementary #' figures. @@ -12,7 +13,8 @@ #' @importFrom flextable set_flextable_defaults flextable fontsize #' border_remove autofit theme_booktabs vline hline bold #' @examples -#' risk_table(df = data, pathogen = "marburg") +#' df <- data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +#' risk_table(df = df, pathogen = "marburg") #' @export risk_table <- function(df, pathogen, diff --git a/man/data_risk_table.Rd b/man/data_risk_table.Rd new file mode 100644 index 0000000..83ed06e --- /dev/null +++ b/man/data_risk_table.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_risk_table.R +\name{data_risk_table} +\alias{data_risk_table} +\title{Process data for use in risk_table()} +\usage{ +data_risk_table(pathogen, exclude) +} +\arguments{ +\item{pathogen}{name of pathogen e.g. "marburg"} + +\item{exclude}{article IDs to exclude} +} +\value{ +processed data to use as input for risk_table() +} +\description{ +Process data for use in risk_table() +} +\examples{ +data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +} diff --git a/man/outbreak_table.Rd b/man/outbreak_table.Rd index 193dfd3..b0a9118 100644 --- a/man/outbreak_table.Rd +++ b/man/outbreak_table.Rd @@ -7,8 +7,8 @@ outbreak_table(df, pathogen) } \arguments{ -\item{df}{processed data with outbreak information (see vignette for each -pathogen)} +\item{df}{processed data with outbreak information produced by +data_outbreak_table()} \item{pathogen}{name of pathogen} } diff --git a/man/risk_table.Rd b/man/risk_table.Rd index 79e565d..6200357 100644 --- a/man/risk_table.Rd +++ b/man/risk_table.Rd @@ -7,7 +7,8 @@ risk_table(df, pathogen, supplement = FALSE) } \arguments{ -\item{df}{data with outbreak information} +\item{df}{processed data with risk factor information produced by +data_risk_table()} \item{pathogen}{name of pathogen} @@ -21,5 +22,6 @@ returns flextable Create risk table } \examples{ -risk_table(df = data, pathogen = "marburg") +df <- data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +risk_table(df = df, pathogen = "marburg") } diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index 15dd46d..2201be1 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -44,6 +44,7 @@ source('../R/forest_plot_delay.R') source('../R/forest_plot_severity.R') source('../R/data_delay_table.R') source('../R/delay_table.R') +source('../R/data_risk_table.R') source('../R/risk_table.R') source('../R/seroprevalence_table.R') source('../R/date_start.R') @@ -212,21 +213,8 @@ forest_plot_mutations(df) **Table 3:** Aggregated information on risk factors associated with MVD infection and seropositivity. Risk factors were mapped onto our risk factor classification (see Supplement) by interpreting the authors’ descriptions. Adjusted refers to whether estimates are adjusted (i.e. from a multivariate analysis) or not (i.e. from a univariate analysis), with unknown showing that this information is not clearly stated in the original study. Statistical significance was determined according to the original authors’ statistical approaches when specified, or using a p-value of 0.05 otherwise. The numbers in the significant and not significant columns represent the total sample size included in the analyses for this risk factor and outcome category. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') -params <- read_csv(file_path_pa) - -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname,year_publication), by="article_id") %>% - mutate(article_label = as.character(paste0(first_author_surname," ",year_publication)), - population_country = str_replace_all(population_country,";",", ")) %>% - dplyr::arrange(article_label, -year_publication) %>% - dplyr::filter(article_id %in% c(17,15) == FALSE) - -risk_table(df,'marburg') +df <- data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +risk_table(df, "marburg") ``` From 9169501bdd041ae10a0a399978994d91c8b444dc Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Wed, 19 Jul 2023 09:27:04 +0100 Subject: [PATCH 31/40] merge param table data processing into one function data_param_table() --- NAMESPACE | 3 +- R/{data_delay_table.R => data_param_table.R} | 7 +-- R/data_risk_table.R | 45 -------------------- R/delay_table.R | 4 +- R/risk_table.R | 4 +- R/{seroprevalence_table.R => sero_table.R} | 7 +-- man/data_delay_table.Rd | 22 ---------- man/data_param_table.Rd | 23 ++++++++++ man/data_risk_table.Rd | 22 ---------- man/delay_table.Rd | 4 +- man/risk_table.Rd | 4 +- man/sero_table.Rd | 9 ++-- vignettes/pathogen_marburg.Rmd | 13 +++--- 13 files changed, 51 insertions(+), 116 deletions(-) rename R/{data_delay_table.R => data_param_table.R} (86%) delete mode 100644 R/data_risk_table.R rename R/{seroprevalence_table.R => sero_table.R} (93%) delete mode 100644 man/data_delay_table.Rd create mode 100644 man/data_param_table.Rd delete mode 100644 man/data_risk_table.Rd diff --git a/NAMESPACE b/NAMESPACE index afe0c79..1932fb2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,10 +5,9 @@ export(create_new_article_entry) export(create_new_model_entry) export(create_new_outbreak_entry) export(create_new_parameter_entry) -export(data_delay_table) export(data_forest_plots) export(data_outbreak_table) -export(data_risk_table) +export(data_param_table) export(date_start) export(delay_table) export(forest_plot_delay) diff --git a/R/data_delay_table.R b/R/data_param_table.R similarity index 86% rename from R/data_delay_table.R rename to R/data_param_table.R index 31b6600..81596d7 100644 --- a/R/data_delay_table.R +++ b/R/data_param_table.R @@ -2,14 +2,15 @@ #' #' @param pathogen name of pathogen e.g. "marburg" #' @param exclude article IDs to exclude -#' @return processed data to use as input for delay_table() +#' @return processed data to use as input for delay_table(), risk_table() and +#' seroprevalence_table() #' @importFrom readr read_csv #' @importFrom dplyr left_join mutate select arrange filter #' @examples -#' df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) +#' df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) #' @export -data_delay_table <- function(pathogen, exclude) { +data_param_table <- function(pathogen, exclude) { # Get file pathway for parameter data file_path_pa <- system.file( diff --git a/R/data_risk_table.R b/R/data_risk_table.R deleted file mode 100644 index 53c0ad4..0000000 --- a/R/data_risk_table.R +++ /dev/null @@ -1,45 +0,0 @@ -#' Process data for use in risk_table() -#' -#' @param pathogen name of pathogen e.g. "marburg" -#' @param exclude article IDs to exclude -#' @return processed data to use as input for risk_table() -#' @importFrom readr read_csv -#' @importFrom stringr str_replace_all -#' @importFrom dplyr select arrange filter mutate -#' @examples -#' data_risk_table(pathogen = "marburg", exclude = c(15, 17)) -#' @export - -data_risk_table <- function(pathogen, exclude) { - -# Get file pathway for parameter data -file_path_pa <- system.file( - "data", paste0(pathogen, "_parameter.csv"), package = "epireview") -if (file_path_pa == "") - file_path_pa <- paste0("../data/", pathogen, "_parameter.csv") -params <- read_csv(file_path_pa) - -# Get file pathway for article data -file_path_ar <- system.file( - "data", paste0(pathogen, "_article.csv"), package = "epireview") -if (file_path_ar == "") - file_path_ar <- paste0("../data/", pathogen, "_article.csv") -articles <- read_csv(file_path_ar) - -# Deal with R CMD Check "no visible binding for global variable" -article_id <- article_label <- first_author_surname <- year_publication <- - population_country <- NULL - -df <- left_join(params, articles %>% - select(article_id, first_author_surname, year_publication), - by = "article_id") %>% - mutate(article_label = - as.character(paste0(first_author_surname, "", year_publication)), - population_country = - str_replace_all(population_country, ";", ",")) %>% - arrange(article_label, -year_publication) %>% - filter(article_id %in% exclude == FALSE) - -return(df) - -} diff --git a/R/delay_table.R b/R/delay_table.R index 0c869a3..da43791 100644 --- a/R/delay_table.R +++ b/R/delay_table.R @@ -1,7 +1,7 @@ #' Create table for human delay parameters #' #' @param df processed data with parameter information produced using -#' data_delay_table() +#' data_param_table() #' @param pathogen name of pathogen #' @return flextable with an overview of the delay parameter estimates #' extracted from the included studies @@ -12,7 +12,7 @@ #' @importFrom stringr str_to_title str_replace #' @examples #' # Process data -#' df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) +#' df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) #' #' # Get delay table #' delay_table(df = df, pathogen = "marburg") diff --git a/R/risk_table.R b/R/risk_table.R index 93dd465..f22bb28 100644 --- a/R/risk_table.R +++ b/R/risk_table.R @@ -1,7 +1,7 @@ #' Create risk table #' #' @param df processed data with risk factor information produced by -#' data_risk_table() +#' data_param_table() #' @param pathogen name of pathogen #' @param supplement either TRUE or FALSE. If TRUE, returns supplementary #' figures. @@ -13,7 +13,7 @@ #' @importFrom flextable set_flextable_defaults flextable fontsize #' border_remove autofit theme_booktabs vline hline bold #' @examples -#' df <- data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +#' df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) #' risk_table(df = df, pathogen = "marburg") #' @export risk_table <- function(df, diff --git a/R/seroprevalence_table.R b/R/sero_table.R similarity index 93% rename from R/seroprevalence_table.R rename to R/sero_table.R index 00f065e..39c98fa 100644 --- a/R/seroprevalence_table.R +++ b/R/sero_table.R @@ -1,12 +1,13 @@ #' Create seroprevalence table #' -#' @param df processed data with seroprevalence information (see vignette for -#' each pathogen) +#' @param df processed data with outbreak information produced by +#' data_param_table() #' @param pathogen name of pathogen #' @return returns flextable with a summary of seroprevalence data #' @importFrom officer fp_border #' @examples -#' sero_table(df = data, pathogen = "marburg") +#' df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) +#' sero_table(df = df, pathogen = "marburg") #' @export sero_table <- function(df, pathogen) { diff --git a/man/data_delay_table.Rd b/man/data_delay_table.Rd deleted file mode 100644 index e28b3b9..0000000 --- a/man/data_delay_table.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/data_delay_table.R -\name{data_delay_table} -\alias{data_delay_table} -\title{Process data for delay table} -\usage{ -data_delay_table(pathogen, exclude) -} -\arguments{ -\item{pathogen}{name of pathogen e.g. "marburg"} - -\item{exclude}{article IDs to exclude} -} -\value{ -processed data to use as input for delay_table() -} -\description{ -Process data for delay table -} -\examples{ -df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) -} diff --git a/man/data_param_table.Rd b/man/data_param_table.Rd new file mode 100644 index 0000000..8aaf53b --- /dev/null +++ b/man/data_param_table.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_param_table.R +\name{data_param_table} +\alias{data_param_table} +\title{Process data for delay table} +\usage{ +data_param_table(pathogen, exclude) +} +\arguments{ +\item{pathogen}{name of pathogen e.g. "marburg"} + +\item{exclude}{article IDs to exclude} +} +\value{ +processed data to use as input for delay_table(), risk_table() and +seroprevalence_table() +} +\description{ +Process data for delay table +} +\examples{ +df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) +} diff --git a/man/data_risk_table.Rd b/man/data_risk_table.Rd deleted file mode 100644 index 83ed06e..0000000 --- a/man/data_risk_table.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/data_risk_table.R -\name{data_risk_table} -\alias{data_risk_table} -\title{Process data for use in risk_table()} -\usage{ -data_risk_table(pathogen, exclude) -} -\arguments{ -\item{pathogen}{name of pathogen e.g. "marburg"} - -\item{exclude}{article IDs to exclude} -} -\value{ -processed data to use as input for risk_table() -} -\description{ -Process data for use in risk_table() -} -\examples{ -data_risk_table(pathogen = "marburg", exclude = c(15, 17)) -} diff --git a/man/delay_table.Rd b/man/delay_table.Rd index 7910801..1c8001c 100644 --- a/man/delay_table.Rd +++ b/man/delay_table.Rd @@ -8,7 +8,7 @@ delay_table(df, pathogen) } \arguments{ \item{df}{processed data with parameter information produced using -data_delay_table()} +data_param_table()} \item{pathogen}{name of pathogen} } @@ -21,7 +21,7 @@ Create table for human delay parameters } \examples{ # Process data -df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) +df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) # Get delay table delay_table(df = df, pathogen = "marburg") diff --git a/man/risk_table.Rd b/man/risk_table.Rd index 6200357..06a9d48 100644 --- a/man/risk_table.Rd +++ b/man/risk_table.Rd @@ -8,7 +8,7 @@ risk_table(df, pathogen, supplement = FALSE) } \arguments{ \item{df}{processed data with risk factor information produced by -data_risk_table()} +data_param_table()} \item{pathogen}{name of pathogen} @@ -22,6 +22,6 @@ returns flextable Create risk table } \examples{ -df <- data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) risk_table(df = df, pathogen = "marburg") } diff --git a/man/sero_table.Rd b/man/sero_table.Rd index 9b7b3bf..ebe859b 100644 --- a/man/sero_table.Rd +++ b/man/sero_table.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/seroprevalence_table.R +% Please edit documentation in R/sero_table.R \name{sero_table} \alias{sero_table} \title{Create seroprevalence table} @@ -7,8 +7,8 @@ sero_table(df, pathogen) } \arguments{ -\item{df}{processed data with seroprevalence information (see vignette for -each pathogen)} +\item{df}{processed data with outbreak information produced by +data_param_table()} \item{pathogen}{name of pathogen} } @@ -19,5 +19,6 @@ returns flextable with a summary of seroprevalence data Create seroprevalence table } \examples{ -sero_table(df = data, pathogen = "marburg") +df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) +sero_table(df = df, pathogen = "marburg") } diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index 2201be1..872c12c 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -34,19 +34,18 @@ All Tables and Figures from the paper are re-produced below on the **latest** av ```{r setup, echo=FALSE, message=FALSE, warning=FALSE} knitr::opts_chunk$set(echo = FALSE) -source('../R/quality_assessment.R') +source('../R/data_param_table.R') +source('../R/data_forest_plots.R') source('../R/data_outbreak_table.R') +source('../R/quality_assessment.R') source('../R/outbreak_table.R') source('../R/forest_plot_mutations.R') source('../R/forest_plot_r.R') -source('../R/data_forest_plots.R') source('../R/forest_plot_delay.R') source('../R/forest_plot_severity.R') -source('../R/data_delay_table.R') source('../R/delay_table.R') -source('../R/data_risk_table.R') source('../R/risk_table.R') -source('../R/seroprevalence_table.R') +source('../R/sero_table.R') source('../R/date_start.R') library(tidyverse) library(patchwork) @@ -169,7 +168,7 @@ forest_plot_severity(df_out,outbreak_naive = TRUE) ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -df <- data_delay_table(pathogen = "marburg", exclude = c(17, 15)) +df <- data_param_table(pathogen = "marburg", exclude = c(17, 15)) delay_table(df, "marburg") ``` @@ -213,7 +212,7 @@ forest_plot_mutations(df) **Table 3:** Aggregated information on risk factors associated with MVD infection and seropositivity. Risk factors were mapped onto our risk factor classification (see Supplement) by interpreting the authors’ descriptions. Adjusted refers to whether estimates are adjusted (i.e. from a multivariate analysis) or not (i.e. from a univariate analysis), with unknown showing that this information is not clearly stated in the original study. Statistical significance was determined according to the original authors’ statistical approaches when specified, or using a p-value of 0.05 otherwise. The numbers in the significant and not significant columns represent the total sample size included in the analyses for this risk factor and outcome category. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -df <- data_risk_table(pathogen = "marburg", exclude = c(15, 17)) +df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) risk_table(df, "marburg") ``` From 197e233d833e58458a75ada0a6c4bb010f778a3a Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Wed, 19 Jul 2023 09:36:24 +0100 Subject: [PATCH 32/40] update documentation --- R/delay_table.R | 3 --- R/risk_table.R | 6 +++--- R/sero_table.R | 2 +- man/delay_table.Rd | 3 --- man/risk_table.Rd | 6 +++--- man/sero_table.Rd | 2 +- 6 files changed, 8 insertions(+), 14 deletions(-) diff --git a/R/delay_table.R b/R/delay_table.R index da43791..9edb791 100644 --- a/R/delay_table.R +++ b/R/delay_table.R @@ -11,10 +11,7 @@ #' @importFrom dplyr filter mutate select arrange group_by row_number %>% #' @importFrom stringr str_to_title str_replace #' @examples -#' # Process data #' df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) -#' -#' # Get delay table #' delay_table(df = df, pathogen = "marburg") #' @export diff --git a/R/risk_table.R b/R/risk_table.R index f22bb28..079a590 100644 --- a/R/risk_table.R +++ b/R/risk_table.R @@ -1,11 +1,11 @@ #' Create risk table #' -#' @param df processed data with risk factor information produced by +#' @param df processed data with parameter information produced by #' data_param_table() #' @param pathogen name of pathogen #' @param supplement either TRUE or FALSE. If TRUE, returns supplementary -#' figures. -#' @return returns flextable +#' table. +#' @return returns flextable with summary of risk factor data #' @importFrom officer fp_border #' @importFrom dplyr mutate mutate filter select rowwise summarise #' @importFrom tidyr pivot_longer pivot_wider diff --git a/R/sero_table.R b/R/sero_table.R index 39c98fa..1efa7cb 100644 --- a/R/sero_table.R +++ b/R/sero_table.R @@ -1,6 +1,6 @@ #' Create seroprevalence table #' -#' @param df processed data with outbreak information produced by +#' @param df processed data with parameter information produced by #' data_param_table() #' @param pathogen name of pathogen #' @return returns flextable with a summary of seroprevalence data diff --git a/man/delay_table.Rd b/man/delay_table.Rd index 1c8001c..0c32bd5 100644 --- a/man/delay_table.Rd +++ b/man/delay_table.Rd @@ -20,9 +20,6 @@ extracted from the included studies Create table for human delay parameters } \examples{ -# Process data df <- data_param_table(pathogen = "marburg", exclude = c(15, 17)) - -# Get delay table delay_table(df = df, pathogen = "marburg") } diff --git a/man/risk_table.Rd b/man/risk_table.Rd index 06a9d48..aef7f9c 100644 --- a/man/risk_table.Rd +++ b/man/risk_table.Rd @@ -7,16 +7,16 @@ risk_table(df, pathogen, supplement = FALSE) } \arguments{ -\item{df}{processed data with risk factor information produced by +\item{df}{processed data with parameter information produced by data_param_table()} \item{pathogen}{name of pathogen} \item{supplement}{either TRUE or FALSE. If TRUE, returns supplementary -figures.} +table.} } \value{ -returns flextable +returns flextable with summary of risk factor data } \description{ Create risk table diff --git a/man/sero_table.Rd b/man/sero_table.Rd index ebe859b..78438c4 100644 --- a/man/sero_table.Rd +++ b/man/sero_table.Rd @@ -7,7 +7,7 @@ sero_table(df, pathogen) } \arguments{ -\item{df}{processed data with outbreak information produced by +\item{df}{processed data with parameter information produced by data_param_table()} \item{pathogen}{name of pathogen} From 676cbee5dbfcb498851e26de77759de33f76f4ff Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Wed, 19 Jul 2023 09:44:04 +0100 Subject: [PATCH 33/40] remove rlang --- DESCRIPTION | 3 +-- NAMESPACE | 1 - R/create_new_article_entry.R | 18 ++++++++---------- R/create_new_model_entry.R | 7 +++---- R/create_new_outbreak_entry.R | 8 ++++---- R/create_new_parameter_entry.R | 7 +++---- 6 files changed, 19 insertions(+), 25 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e136041..a005fea 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -22,8 +22,7 @@ Imports: tm, officer, stringr, - validate, - rlang + validate Suggests: knitr, meta, diff --git a/NAMESPACE b/NAMESPACE index 1932fb2..ddaad9a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -81,7 +81,6 @@ importFrom(ggplot2,ylab) importFrom(officer,fp_border) importFrom(patchwork,wrap_plots) importFrom(readr,read_csv) -importFrom(rlang,.data) importFrom(stats,median) importFrom(stats,na.omit) importFrom(stats,reorder) diff --git a/R/create_new_article_entry.R b/R/create_new_article_entry.R index e34a260..82510a7 100644 --- a/R/create_new_article_entry.R +++ b/R/create_new_article_entry.R @@ -10,7 +10,6 @@ #' @importFrom dplyr rowwise mutate select filter #' @importFrom stats na.omit #' @importFrom utils globalVariables -#' @importFrom rlang .data #' @examples #' create_new_article_entry( #' pathogen = "marburg", @@ -73,6 +72,12 @@ create_new_article_entry <- max(old_articles$covidence_id) + 1000000 } + # Deal with R CMD Check "no visible binding for global variable" + first_author_first_name <- first_author_surname <- article_title <- + journal <- doi <- transmission_route <- assumptions <- code_available <- + outbreak_date_year <- qa_m1 <- qa_m2 <- qa_a3 <- qa_a4 <- qa_d5 <- qa_d6 <- + qa_d7 <- fails <- NULL + # update this as new pathogens are added new_row$pathogen <- switch(pathogen, "marburg" = "Marburg virus", @@ -81,8 +86,7 @@ create_new_article_entry <- new_row <- new_row %>% rowwise() %>% - mutate(score = mean(c(.data$qa_m1, .data$qa_m2, .data$qa_a3, .data$qa_a4, - .data$qa_d5, .data$qa_d6, .data$qa_d7), + mutate(score = mean(c(qa_m1, qa_m2, qa_a3, qa_a4, qa_d5, qa_d6, qa_d7), na.rm = TRUE)) %>% select(colnames(old_articles)) @@ -93,12 +97,6 @@ create_new_article_entry <- if (is.character(new_row$doi) && new_row$doi %in% na.omit(old_articles$doi)) stop("doi exists in data already!") - # Deal with R CMD Check "no visible binding for global variable" - first_author_first_name <- first_author_surname <- article_title <- - journal <- doi <- transmission_route <- assumptions <- code_available <- - outbreak_date_year <- qa_m1 <- qa_m2 <- qa_a3 <- qa_a4 <- qa_d5 <- qa_d6 <- - qa_d7 <- NULL - #validate that the entries make sense rules <- validator( author_first_name_is_character = is.character(first_author_first_name), @@ -126,7 +124,7 @@ create_new_article_entry <- rules_summary <- summary(rules_output) if (sum(rules_summary$fails) > 0) - stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) + stop(as_tibble(rules_summary) %>% filter(fails > 0)) return(new_row) } diff --git a/R/create_new_model_entry.R b/R/create_new_model_entry.R index fffffda..8c2f04a 100644 --- a/R/create_new_model_entry.R +++ b/R/create_new_model_entry.R @@ -10,7 +10,6 @@ #' @importFrom dplyr select #' @importFrom readr read_csv #' @importFrom stats na.omit -#' @importFrom rlang .data #' @examples #' create_new_model_entry( #' pathogen = 'marburg', @@ -72,7 +71,7 @@ create_new_model_entry <- # Deal with R CMD Check "no visible binding for global variable" model_type <- compartmental_type <- stoch_deter <- interventions_type <- transmission_route <- assumptions <- code_available <- theoretical_model <- - NULL + fails <- NULL #validate that the entries make sense rules <- validator( @@ -101,10 +100,10 @@ create_new_model_entry <- rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(.data$fails > 0)) + print(as_tibble(rules_summary) %>% filter(fails > 0)) if (sum(rules_summary$fails) > 0) { - stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) + stop(as_tibble(rules_summary) %>% filter(fails > 0)) } return(new_row) diff --git a/R/create_new_outbreak_entry.R b/R/create_new_outbreak_entry.R index 80da244..f54b9d6 100644 --- a/R/create_new_outbreak_entry.R +++ b/R/create_new_outbreak_entry.R @@ -8,7 +8,6 @@ #' @importFrom dplyr select #' @importFrom readr read_csv #' @importFrom stats na.omit -#' @importFrom rlang .data #' @return return new row of data to be added to the outbreak data set using #' the append_new_entry_to_table() function #' @examples @@ -87,7 +86,8 @@ create_new_outbreak_entry <- outbreak_options <- read_csv(file_path_ob) # Deal with R CMD Check "no visible binding for global variable" - outbreak_country <- cases_mode_detection <- outbreak_date_year <- NULL + outbreak_country <- cases_mode_detection <- outbreak_date_year <- + fails <- NULL #validate that the entries make sense rules <- validator( @@ -106,10 +106,10 @@ create_new_outbreak_entry <- rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(.data$fails > 0)) + print(as_tibble(rules_summary) %>% filter(fails > 0)) if (sum(rules_summary$fails) > 0) { - stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) + stop(as_tibble(rules_summary) %>% filter(fails > 0)) } return(new_row) diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index e69f515..563957f 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -10,7 +10,6 @@ #' @importFrom dplyr select #' @importFrom readr read_csv #' @importFrom stats na.omit -#' @importFrom rlang .data #' @examples #' create_new_parameter_entry <- #' function(pathogen = "marburg", @@ -122,7 +121,7 @@ create_new_parameter_entry <- parameter_options <- read_csv(file_path_ob) # Deal with R CMD Check "no visible binding for global variable" - population_country <- NULL + population_country <- fails <- NULL #validate that the entries make sense rules <- validator( @@ -134,10 +133,10 @@ create_new_parameter_entry <- rules_output <- confront(new_row, rules) rules_summary <- summary(rules_output) - print(as_tibble(rules_summary) %>% filter(.data$fails > 0)) + print(as_tibble(rules_summary) %>% filter(fails > 0)) if (sum(rules_summary$fails) > 0) - stop(as_tibble(rules_summary) %>% filter(.data$fails > 0)) + stop(as_tibble(rules_summary) %>% filter(fails > 0)) return(new_row) } From 7a0f7da0a93c9d78a7da2de82fb83694ded5eccc Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Wed, 19 Jul 2023 12:17:16 +0100 Subject: [PATCH 34/40] document data and change dropdown filenames --- R/create_new_model_entry.R | 4 +- R/create_new_outbreak_entry.R | 5 +- R/create_new_parameter_entry.R | 5 +- R/data.R | 296 +++++++++++++----- R/get_table_field_options.R | 18 +- ...models.csv => marburg_dropdown_models.csv} | 0 ...aks.csv => marburg_dropdown_outbreaks.csv} | 0 ...rs.csv => marburg_dropdown_parameters.csv} | 0 man/get_table_field_options.Rd | 19 +- man/marburg_article.Rd | 36 ++- man/marburg_dropdown_models.Rd | 28 ++ man/marburg_dropdown_outbreaks.Rd | 24 ++ man/marburg_dropdown_parameters.Rd | 44 +++ man/marburg_model.Rd | 13 +- man/marburg_parameter.Rd | 145 +++++---- vignettes/pathogen_database_field_options.Rmd | 12 +- 16 files changed, 498 insertions(+), 151 deletions(-) rename data/{access_db_dropdown_models.csv => marburg_dropdown_models.csv} (100%) rename data/{access_db_dropdown_outbreaks.csv => marburg_dropdown_outbreaks.csv} (100%) rename data/{access_db_dropdown_parameters.csv => marburg_dropdown_parameters.csv} (100%) create mode 100644 man/marburg_dropdown_models.Rd create mode 100644 man/marburg_dropdown_outbreaks.Rd create mode 100644 man/marburg_dropdown_parameters.Rd diff --git a/R/create_new_model_entry.R b/R/create_new_model_entry.R index 8c2f04a..9189647 100644 --- a/R/create_new_model_entry.R +++ b/R/create_new_model_entry.R @@ -60,11 +60,11 @@ create_new_model_entry <- stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", "access_db_dropdown_models.csv", + file_path_ob <- system.file("data", paste0(pathogen, "_dropdown_models.csv"), package = "epireview") if (file_path_ob == "") { file_path_ob <- paste0(vignette_prepend, - "data/access_db_dropdown_models.csv") + "data/", pathogen, "_dropdown_models.csv") } model_options <- read_csv(file_path_ob) diff --git a/R/create_new_outbreak_entry.R b/R/create_new_outbreak_entry.R index f54b9d6..d6be562 100644 --- a/R/create_new_outbreak_entry.R +++ b/R/create_new_outbreak_entry.R @@ -77,11 +77,12 @@ create_new_outbreak_entry <- stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", "access_db_dropdown_outbreaks.csv", + file_path_ob <- system.file("data", + paste0(pathogen, "_dropdown_outbreaks.csv"), package = "epireview") if (file_path_ob == "") { file_path_ob <- paste0(vignette_prepend, - "data/access_db_dropdown_outbreaks.csv") + "data/", pathogen, "_dropdown_outbreaks.csv") } outbreak_options <- read_csv(file_path_ob) diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index 563957f..0e5bbec 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -112,11 +112,12 @@ create_new_parameter_entry <- stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", "access_db_dropdown_parameters.csv", + file_path_ob <- system.file("data", + paste0(pathogen, "_dropdown_parameters.csv"), package = "epireview") if (file_path_ob == "") { file_path_ob <- paste0(vignette_prepend, - "data/access_db_dropdown_parameters.csv") + "data/", pathogen, "_dropdown_parameters.csv") } parameter_options <- read_csv(file_path_ob) diff --git a/R/data.R b/R/data.R index 70740a3..967bee1 100644 --- a/R/data.R +++ b/R/data.R @@ -9,7 +9,38 @@ #' @docType data #' @format A csv file containing the following parameters: #' -#' XXYY +#' - "article_id" = ID variable for the article. +#' - "pathogen" = pathogen name. +#' - "covidence_id" = article identifier used by the Imperial team. +#' - "first_author_first_name" = first author first name or initials. +#' - "article_title" = title of article. +#' - "doi" = the doi of the article. +#' - "journal" = journal that the article is published in. +#' - "year_publication" = year of article publication. +#' - "volume" = journal volume. +#' - "issue" = journal issue. +#' - "page_first" = first page number. +#' - "page_last" = last page number. +#' - "paper_copy_only" = if the article is not available online. +#' - "notes" = notes the extractor has made. +#' - "first_author_surname" = surname of the first author. +#' - "double_extracted" = either single extracted (0) or double extracted (1). +#' - "qa_m1" = quality assessment: "Is the methodological/statistical approach +#' suitable? Q1. Clear and reproducible?" (either 0, 1, or NA) +#' - "qa_m2" = quality assessment: "Is the methodological/statistical approach +#' suitable? Q2. Robust and appropriate for the aim?" (either 0, 1, or NA) +#' - "qa_a3" = quality assessment: "Are the assumptions appropriate? Q3. Clear +#' and reproducible?" (either 0, 1, or NA) +#' - "qa_a4" = quality assessment: "Are the assumptions appropriate? Q4. +#' Justified?" (either 0, 1, or NA) +#' - "qa_d5" = quality assessment: "Are the data appropriate for the selected +#' methodological approach? Q5. Clearly described and reproducible?" +#' (either 0, 1, or NA) +#' - "qa_d6" = quality assessment: "Are issues in data... Q6. Clearly discussed +#' and acknowledged?" (either 0, 1, or NA) +#' - "qa_d7" = quality assessment: "Are issues in data... Q7. Accounted for in +#' chosen methodological approach?" (either 0, 1, or NA) +#' - "score" = overall quality assessment score. #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease @@ -32,23 +63,24 @@ NULL #' - model_data_id = ID variable for the model. #' - article_id = ID variable for the article the model came from. #' - model_type = whether the model was compartmental, branching process, -#' agent/individual based, other, or unspecified. +#' agent/individual based, other, or unspecified. #' - compartmental_type = if the model is compartmental, whether the model is -#' SIS, SIR, SEIR, or "other". +#' SIS, SIR, SEIR, or "other". #' - stoch_deter = whether the article specified whether the model was -#' stochastic, deterministic, or both. +#' stochastic, deterministic, or both. #' - theoretical_model = "TRUE" or "FALSE". "TRUE" if the model is not fit to -#' data. +#' data. #' - interventions_type = interventions modelled e.g. vaccination, quarantine, -#' vector control, treatment, contact tracing, hospitals, treatment centres, -#' safe burials, behaviour changes, other, or unspecified. +#' vector control, treatment, contact tracing, hospitals, treatment +#' centres, safe burials, behaviour changes, other, or unspecified. #' - code_available = whether the code was made available in the article. #' - transmission_route = which transmission route was modelled, e.g. airborne -#' or close contact, human to human, vector to human, animal to human, sexual, -#' or unspecified. +#' or close contact, human to human, vector to human, animal to human, +#' sexual, or unspecified. #' - assumptions = assumptions used in the model e.g. homogenous mixing, latent -#' period is the same as incubation period, heterogeneity in transmission rates -#' between groups or over time, age dependent susceptibility, or unspecified. +#' period is the same as incubation period, heterogeneity in transmission +#' rates between groups or over time, age dependent susceptibility, or +#' unspecified. #' - covidence_id = article identifier used by the Imperial team. #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, @@ -73,22 +105,22 @@ NULL #' - article_id = ID variable for the article the outbreak data came from. #' - outbreak_start_day = Day that the outbreak started (numeric - DD). #' - outbreak_start_month = Month that the outbreak started (three letter -#' abbreviation e.g. "Aug"). +#' abbreviation e.g. "Aug"). #' - outbreak_start_year = Year that the outbreak started (numeric - YYYY). #' - outbreak_end_day = Day that the outbreak ended (numeric - DD). #' - outbreak_end_month = Month that the outbreak ended (three letter -#' abbreviation e.g. "Aug"). +#' abbreviation e.g. "Aug"). #' - outbreak_date_year = Year that the outbreak ended (numeric - YYYY). #' - outbreak_duration_months = Outbreak duration in months. #' - outbreak_size = total outbreak size. #' - asymptomatic_transmission = whether asymptomatic transmission occurred, -#' either TRUE or FALSE. +#' either TRUE or FALSE. #' - outbreak_country = country in which the outbreak occurred. #' - outbreak_location = location that the outbreak occurred. #' - cases_confirmed = total number of confirmed cases. #' - cases_mode_detection = either diagnosed based on symptoms alone -#' ("Symptoms"), confirmed via a laboratory test such as PCR ("Molecular -#' (PCR etc)"), "Not specified", or NA. +#' ("Symptoms"), confirmed via a laboratory test such as PCR ("Molecular +#' (PCR etc)"), "Not specified", or NA. #' - cases_suspected = total number of suspected cases. #' - cases_asymptomatic = total number of asymptomatic cases. #' - deaths = total number of deaths. @@ -113,60 +145,184 @@ NULL #' @docType data #' @format A csv file containing the following parameters: #' -#' - parameter_data_id -#' - article_id -#' - parameter_type -#' - parameter_value -#' - parameter_unit -#' - parameter_lower_bound -#' - parameter_upper_bound -#' - parameter_value_type -#' - parameter_uncertainty_single_value -#' - parameter_uncertainty_singe_type -#' - parameter_uncertainty_lower_value -#' - parameter_uncertainty_upper_value -#' - parameter_uncertainty_type -#' - cfr_ifr_numerator -#' - cfr_ifr_denominator -#' - distribution_type -#' - distribution_par1_value -#' - distribution_par1_type -#' - distribution_par1_uncertainty -#' - distribution_par2_value -#' - distribution_par2_type -#' - distribution_par2_uncertainty -#' - method_from_supplement -#' - method_moment_value -#' - cfr_ifr_method -#' - method_r -#' - method_disaggregated_by -#' - method_disaggregated -#' - method_disaggregated_only -#' - riskfactor_outcome -#' - riskfactor_name -#' - riskfactor_occupation -#' - riskfactor_significant -#' - riskfactor_adjusted -#' - population_sex -#' - population_sample_type -#' - population_group -#' - population_age_min -#' - population_age_max -#' - population_sample_size -#' - population_country -#' - population_location -#' - population_study_start_day -#' - population_study_start_month -#' - population_study_start_year -#' - population_study_end_day -#' - population_study_end_month -#' - population_study_end_year -#' - genome_site -#' - genomic_sequence_available -#' - parameter_class -#' - covidence_id -#' - Uncertainty -#' - Survey year +#' - parameter_data_id = ID variable for the parameter. +#' - article_id = ID variable for the article the outbreak data came from. +#' - parameter_type = extracted parameter (see marburg_dropdown_parameters +#' for the full list of parameters extracted). +#' - parameter_value = extracted parameter value as stated in the article. +#' - parameter_unit = units of the extracted parameter (see +#' marburg_dropdown_parameters for the full list of parameter units). +#' - parameter_lower_bound = minimum value of the parameter across any +#' dimension of disaggregation. +#' - parameter_upper_bound = maximum value of the parameter across any +#' dimension of disaggregation. +#' - parameter_value_type = whether the parameter value is the mean, median, +#' standard deviation. +#' - parameter_uncertainty_single_value = extracted uncertainty if only a +#' single value provided. +#' - parameter_uncertainty_single_type = uncertainty type if only a single +#' value is reported e.g. "Standard Error (SE)" (see +#' marburg_dropdown_parameters for the full list of options). +#' - parameter_uncertainty_lower_value = lower value of paired uncertainty. +#' - parameter_uncertainty_upper_value = upper value of paired uncertainty. +#' - parameter_uncertainty_type = uncertainty type if a pair of values are +#' provided, e.g. "CI90%", "CRI95%" (see marburg_dropdown_parameters +#' for the full list of options). +#' - cfr_ifr_numerator = numerator of the cfr or ifr provided in the article. +#' - cfr_ifr_denominator = denominator of the cfr or ifr provided in the +#' article. +#' - distribution_type = if uncertainty is given as a distribution (see +#' marburg_dropdown_parameters for the full list of options). +#' - distribution_par1_value = value for distribution parameter 1. +#' - distribution_par1_type = distribution parameter 1 type, e.g. shape, scale +#' (see marburg_dropdown_parameters for the full list of options). +#' - distribution_par1_uncertainty = TRUE/FALSE. +#' - distribution_par2_value = value for distribution parameter 2. +#' - distribution_par2_type = distribution parameter 2 type, e.g. shape, scale +#' (see marburg_dropdown_parameters for the full list of options). +#' - distribution_par2_uncertainty = TRUE/FALSE. +#' - method_from_supplement = whether the parameter was taken from the +#' supplementary material of the article. TRUE/FALSE. +#' - method_moment_value = time period, either "Pre outbreak", Start outbreak", +#' "Mid outbreak", "Post Outbreak", or "Other", if specified in the article. +#' - cfr_ifr_method = whether the method used to calculate the cfr/ifr was +#' "Naive", "Adjusted", "Unknown". +#' - method_r = method used to estimate the reproduction number (see +#' marburg_dropdown_parameters for the full list of options). +#' - method_disaggregated_by = how the parameter is disaggregated e.g. by Age, +#' Sex, Region. +#' - method_disaggregated = whether the parameter is disaggregated (TRUE/FALSE). +#' - method_disaggregated_only = whether only disaggregated data is available +#' (TRUE/FALSE). +#' - riskfactor_outcome = the outcome(s) for which the risk factor was +#' evaluated e.g. "Death" or "Infection" (see marburg_dropdown_parameters +#' for the full list of options). +#' - riskfactor_name = the potential risk factor(s) evaluated e.g. "Age" (see +#' marburg_dropdown_parameters for the full list of options). +#' - riskfactor_occupation = specific occupation(s) if occupation is a risk +#' factor (see marburg_dropdown_parameters for the full list of options). +#' - riskfactor_significant = either "Significant", "Not significant", +#' "Unspecified" or NA. +#' - riskfactor_adjusted = either "Adjusted", "Not adjusted", "Unspecified". +#' - population_sex = the sex of the study population, either "Female", "Male", +#' "Both", "Unspecified". +#' - population_sample_type = how the study was conducted e.g. "Hospital based", +#' "Population based" (see 'Setting' in marburg_dropdown_parameters for the +#' full list of options). +#' - population_group = population group e.g. "Healthcare workers" (see +#' marburg_dropdown_parameters for the full list of options). +#' - population_age_min = minimum age in sample (if reported). +#' - population_age_max = maximum age in the sample (if reported). +#' - population_sample_size = total number of participants/samples tested. +#' - population_country = country/countries that the study took place in. +#' - population_location = location that the study took place e.g. region, city. +#' - population_study_start_day = day study started (numeric - DD) +#' - population_study_start_month = month study started (three letter +#' abbreviation e.g. "Feb") +#' - population_study_start_year = year study started (numeric - YYYY) +#' - population_study_end_day = day study ended (numeric - DD) +#' - population_study_end_month = month study ended (three letter abbreviation +#' e.g. "Feb") +#' - population_study_end_year = year study ended (numeric - YYYY) +#' - genome_site = the portion of the pathogen’s genome used to estimate any +#' extracted parameters. I.e. the gene, gene segment, codon position, or a +#' more generic description (‘whole genome’ or ‘intergenic positions’). +#' - genomic_sequence_available = whether the study sequenced new pathogen +#' isolates and their accession numbers have been provided for retrieval +#' from a public database. TRUE/FALSE. +#' - parameter_class = class of the extracted parameter. Either "Human delay", +#' "Seroprevalence", "Severity", "Reproduction number", "Mutations", +#' "Risk factors", or "Other transmission parameters". +#' - covidence_id = article identifier used by the Imperial team. +#' - Uncertainty = remove? +#' - Survey year = remove? +#' +#' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +#' et al. Marburg Virus Disease outbreaks, mathematical models, and disease +#' parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +#' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +#' +NULL + +#' Dropdown menu options for model extractions in the systematic review of +#' articles related to Marburg virus disease (MVD). +#' +#' @description +#' This data set provides all the dropdown menu options extractors had when +#' extracting data for mathematical models applied to MVD. +#' +#' @name marburg_dropdown_models +#' @docType data +#' @format A csv file containing the dropdown options for: +#' +#' - Model type +#' - Stochastic or deterministic +#' - Transmission route +#' - Compartment type +#' - Assumptions +#' - Interventions +#' +#' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +#' et al. Marburg Virus Disease outbreaks, mathematical models, and disease +#' parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +#' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +#' +NULL + +#' Dropdown menu options for outbreak extractions in the systematic review of +#' articles related to Marburg virus disease (MVD). +#' +#' @description +#' This data set provides all the dropdown menu options extractors had when +#' extracting outbreak data for MVD. +#' +#' @name marburg_dropdown_outbreaks +#' @docType data +#' @format A csv file containing the dropdown options for: +#' +#' - Outbreak country +#' - Detection mode +#' +#' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +#' et al. Marburg Virus Disease outbreaks, mathematical models, and disease +#' parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +#' Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +#' +NULL + +#' Dropdown menu options for parameter extractions in the systematic review of +#' articles related to Marburg virus disease (MVD). +#' +#' @description +#' This data set provides all the dropdown menu options extractors had when +#' extracting parameter data for MVD. +#' +#' @name marburg_dropdown_parameters +#' @docType data +#' @format A csv file containing the dropdown options for: +#' +#' - Population Country +#' - Parameter type +#' - Units +#' - Parameter uncertainty - single type +#' - Parameter uncertainty - paired type +#' - Distribution type +#' - Distribution parameter 1 - type +#' - Distribution parameter 2 - type +#' - Disaggregated by +#' - Sex +#' - Setting +#' - Group +#' - Timing +#' - Reproduction number method +#' - Time from +#' - Time to +#' - IFR_CFR_method +#' - Riskfactor outcome +#' - Riskfactor name +#' - Riskfactor occupation +#' - Riskfactor significant +#' - Riskfactor adjusted #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease diff --git a/R/get_table_field_options.R b/R/get_table_field_options.R index 7b905c3..6478f8f 100644 --- a/R/get_table_field_options.R +++ b/R/get_table_field_options.R @@ -4,6 +4,7 @@ #' #' @param table_type which type of table (either "parameter", "outbreak", or #' "model") should be loaded +#' @param pathogen pathogen name e.g. "marburg" #' @param field can either be "all" to return all fields in the specified #' table_type, or a specific variable name that the user wants to return #' @param vignette_prepend string to allow loading data in vignettes @@ -13,23 +14,28 @@ #' @importFrom readr read_csv #' @importFrom stats na.omit #' @examples -#' get_table_field_options(table_type = "model", field = "all") +#' get_table_field_options(table_type = "model", +#' pathogen = "marburg", +#' field = "all") #' -#' get_table_field_options(table_type = "model", field = "Model type") +#' get_table_field_options(table_type = "model", +#' pathogen = "marburg", +#' field = "Model type") #' -#' get_table_field_options(table_type = "parameter", +#' get_table_field_options(table_type = "parameter", pathogen = "marburg", #' field = "Reproduction number method") #' @export get_table_field_options <- function(table_type = NA, + pathogen = NA, field = "all", vignette_prepend = "") { file_path_ob <- system.file( - "data", paste0("access_db_dropdown_", table_type, "s.csv"), + "data", paste0(pathogen, "_dropdown_", table_type, "s.csv"), package = "epireview") - if (file_path_ob == "") file_path_ob <- - paste0(vignette_prepend, "data/access_db_dropdown_", table_type, "s.csv") + if (file_path_ob == "") file_path_ob <- paste0( + vignette_prepend, "data/", pathogen, "_dropdown_", table_type, "s.csv") model_options <- read_csv(file_path_ob) if (field == "all") { diff --git a/data/access_db_dropdown_models.csv b/data/marburg_dropdown_models.csv similarity index 100% rename from data/access_db_dropdown_models.csv rename to data/marburg_dropdown_models.csv diff --git a/data/access_db_dropdown_outbreaks.csv b/data/marburg_dropdown_outbreaks.csv similarity index 100% rename from data/access_db_dropdown_outbreaks.csv rename to data/marburg_dropdown_outbreaks.csv diff --git a/data/access_db_dropdown_parameters.csv b/data/marburg_dropdown_parameters.csv similarity index 100% rename from data/access_db_dropdown_parameters.csv rename to data/marburg_dropdown_parameters.csv diff --git a/man/get_table_field_options.Rd b/man/get_table_field_options.Rd index 67491b4..4eaed60 100644 --- a/man/get_table_field_options.Rd +++ b/man/get_table_field_options.Rd @@ -4,12 +4,19 @@ \alias{get_table_field_options} \title{Utility to obtain available fields in a specified table} \usage{ -get_table_field_options(table_type = NA, field = "all", vignette_prepend = "") +get_table_field_options( + table_type = NA, + pathogen = NA, + field = "all", + vignette_prepend = "" +) } \arguments{ \item{table_type}{which type of table (either "parameter", "outbreak", or "model") should be loaded} +\item{pathogen}{pathogen name e.g. "marburg"} + \item{field}{can either be "all" to return all fields in the specified table_type, or a specific variable name that the user wants to return} @@ -22,10 +29,14 @@ data for specified table_type and field Note: This will need to be extended when other pathogens are added } \examples{ -get_table_field_options(table_type = "model", field = "all") +get_table_field_options(table_type = "model", + pathogen = "marburg", + field = "all") -get_table_field_options(table_type = "model", field = "Model type") +get_table_field_options(table_type = "model", + pathogen = "marburg", + field = "Model type") -get_table_field_options(table_type = "parameter", +get_table_field_options(table_type = "parameter", pathogen = "marburg", field = "Reproduction number method") } diff --git a/man/marburg_article.Rd b/man/marburg_article.Rd index db9660b..5037fe8 100644 --- a/man/marburg_article.Rd +++ b/man/marburg_article.Rd @@ -7,8 +7,40 @@ articles related to Marburg virus disease.} \format{ A csv file containing the following parameters: - -XXYY +\itemize{ +\item "article_id" = ID variable for the article. +\item "pathogen" = pathogen name. +\item "covidence_id" = article identifier used by the Imperial team. +\item "first_author_first_name" = first author first name or initials. +\item "article_title" = title of article. +\item "doi" = the doi of the article. +\item "journal" = journal that the article is published in. +\item "year_publication" = year of article publication. +\item "volume" = journal volume. +\item "issue" = journal issue. +\item "page_first" = first page number. +\item "page_last" = last page number. +\item "paper_copy_only" = if the article is not available online. +\item "notes" = notes the extractor has made. +\item "first_author_surname" = surname of the first author. +\item "double_extracted" = either single extracted (0) or double extracted (1). +\item "qa_m1" = quality assessment: "Is the methodological/statistical approach +suitable? Q1. Clear and reproducible?" (either 0, 1, or NA) +\item "qa_m2" = quality assessment: "Is the methodological/statistical approach +suitable? Q2. Robust and appropriate for the aim?" (either 0, 1, or NA) +\item "qa_a3" = quality assessment: "Are the assumptions appropriate? Q3. Clear +and reproducible?" (either 0, 1, or NA) +\item "qa_a4" = quality assessment: "Are the assumptions appropriate? Q4. +Justified?" (either 0, 1, or NA) +\item "qa_d5" = quality assessment: "Are the data appropriate for the selected +methodological approach? Q5. Clearly described and reproducible?" +(either 0, 1, or NA) +\item "qa_d6" = quality assessment: "Are issues in data... Q6. Clearly discussed +and acknowledged?" (either 0, 1, or NA) +\item "qa_d7" = quality assessment: "Are issues in data... Q7. Accounted for in +chosen methodological approach?" (either 0, 1, or NA) +\item "score" = overall quality assessment score. +} } \source{ Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, diff --git a/man/marburg_dropdown_models.Rd b/man/marburg_dropdown_models.Rd new file mode 100644 index 0000000..32f7fcd --- /dev/null +++ b/man/marburg_dropdown_models.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{marburg_dropdown_models} +\alias{marburg_dropdown_models} +\title{Dropdown menu options for model extractions in the systematic review of +articles related to Marburg virus disease (MVD).} +\format{ +A csv file containing the dropdown options for: +\itemize{ +\item Model type +\item Stochastic or deterministic +\item Transmission route +\item Compartment type +\item Assumptions +\item Interventions +} +} +\source{ +Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +et al. Marburg Virus Disease outbreaks, mathematical models, and disease +parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +} +\description{ +This data set provides all the dropdown menu options extractors had when +extracting data for mathematical models applied to MVD. +} diff --git a/man/marburg_dropdown_outbreaks.Rd b/man/marburg_dropdown_outbreaks.Rd new file mode 100644 index 0000000..2728e48 --- /dev/null +++ b/man/marburg_dropdown_outbreaks.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{marburg_dropdown_outbreaks} +\alias{marburg_dropdown_outbreaks} +\title{Dropdown menu options for outbreak extractions in the systematic review of +articles related to Marburg virus disease (MVD).} +\format{ +A csv file containing the dropdown options for: +\itemize{ +\item Outbreak country +\item Detection mode +} +} +\source{ +Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +et al. Marburg Virus Disease outbreaks, mathematical models, and disease +parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +} +\description{ +This data set provides all the dropdown menu options extractors had when +extracting outbreak data for MVD. +} diff --git a/man/marburg_dropdown_parameters.Rd b/man/marburg_dropdown_parameters.Rd new file mode 100644 index 0000000..4297e35 --- /dev/null +++ b/man/marburg_dropdown_parameters.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{marburg_dropdown_parameters} +\alias{marburg_dropdown_parameters} +\title{Dropdown menu options for parameter extractions in the systematic review of +articles related to Marburg virus disease (MVD).} +\format{ +A csv file containing the dropdown options for: +\itemize{ +\item Population Country +\item Parameter type +\item Units +\item Parameter uncertainty - single type +\item Parameter uncertainty - paired type +\item Distribution type +\item Distribution parameter 1 - type +\item Distribution parameter 2 - type +\item Disaggregated by +\item Sex +\item Setting +\item Group +\item Timing +\item Reproduction number method +\item Time from +\item Time to +\item IFR_CFR_method +\item Riskfactor outcome +\item Riskfactor name +\item Riskfactor occupation +\item Riskfactor significant +\item Riskfactor adjusted +} +} +\source{ +Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, +et al. Marburg Virus Disease outbreaks, mathematical models, and disease +parameters: a Systematic Review. medRxiv; 2023. 2023.07.10.23292424. +Available from: https://www.medrxiv.org/content/10.1101/2023.07.10.23292424v1 +} +\description{ +This data set provides all the dropdown menu options extractors had when +extracting parameter data for MVD. +} diff --git a/man/marburg_model.Rd b/man/marburg_model.Rd index 53b2dcc..55f4b8c 100644 --- a/man/marburg_model.Rd +++ b/man/marburg_model.Rd @@ -19,15 +19,16 @@ stochastic, deterministic, or both. \item theoretical_model = "TRUE" or "FALSE". "TRUE" if the model is not fit to data. \item interventions_type = interventions modelled e.g. vaccination, quarantine, -vector control, treatment, contact tracing, hospitals, treatment centres, -safe burials, behaviour changes, other, or unspecified. +vector control, treatment, contact tracing, hospitals, treatment +centres, safe burials, behaviour changes, other, or unspecified. \item code_available = whether the code was made available in the article. \item transmission_route = which transmission route was modelled, e.g. airborne -or close contact, human to human, vector to human, animal to human, sexual, -or unspecified. +or close contact, human to human, vector to human, animal to human, +sexual, or unspecified. \item assumptions = assumptions used in the model e.g. homogenous mixing, latent -period is the same as incubation period, heterogeneity in transmission rates -between groups or over time, age dependent susceptibility, or unspecified. +period is the same as incubation period, heterogeneity in transmission +rates between groups or over time, age dependent susceptibility, or +unspecified. \item covidence_id = article identifier used by the Imperial team. } } diff --git a/man/marburg_parameter.Rd b/man/marburg_parameter.Rd index c76b759..19458bc 100644 --- a/man/marburg_parameter.Rd +++ b/man/marburg_parameter.Rd @@ -8,60 +8,97 @@ related to Marburg virus disease.} \format{ A csv file containing the following parameters: \itemize{ -\item parameter_data_id -\item article_id -\item parameter_type -\item parameter_value -\item parameter_unit -\item parameter_lower_bound -\item parameter_upper_bound -\item parameter_value_type -\item parameter_uncertainty_single_value -\item parameter_uncertainty_singe_type -\item parameter_uncertainty_lower_value -\item parameter_uncertainty_upper_value -\item parameter_uncertainty_type -\item cfr_ifr_numerator -\item cfr_ifr_denominator -\item distribution_type -\item distribution_par1_value -\item distribution_par1_type -\item distribution_par1_uncertainty -\item distribution_par2_value -\item distribution_par2_type -\item distribution_par2_uncertainty -\item method_from_supplement -\item method_moment_value -\item cfr_ifr_method -\item method_r -\item method_disaggregated_by -\item method_disaggregated -\item method_disaggregated_only -\item riskfactor_outcome -\item riskfactor_name -\item riskfactor_occupation -\item riskfactor_significant -\item riskfactor_adjusted -\item population_sex -\item population_sample_type -\item population_group -\item population_age_min -\item population_age_max -\item population_sample_size -\item population_country -\item population_location -\item population_study_start_day -\item population_study_start_month -\item population_study_start_year -\item population_study_end_day -\item population_study_end_month -\item population_study_end_year -\item genome_site -\item genomic_sequence_available -\item parameter_class -\item covidence_id -\item Uncertainty -\item Survey year +\item parameter_data_id = ID variable for the parameter. +\item article_id = ID variable for the article the outbreak data came from. +\item parameter_type = extracted parameter (see marburg_dropdown_parameters +for the full list of parameters extracted). +\item parameter_value = extracted parameter value as stated in the article. +\item parameter_unit = units of the extracted parameter (see +marburg_dropdown_parameters for the full list of parameter units). +\item parameter_lower_bound = minimum value of the parameter across any +dimension of disaggregation. +\item parameter_upper_bound = maximum value of the parameter across any +dimension of disaggregation. +\item parameter_value_type = whether the parameter value is the mean, median, +standard deviation. +\item parameter_uncertainty_single_value = extracted uncertainty if only a +single value provided. +\item parameter_uncertainty_single_type = uncertainty type if only a single +value is reported e.g. "Standard Error (SE)" (see +marburg_dropdown_parameters for the full list of options). +\item parameter_uncertainty_lower_value = lower value of paired uncertainty. +\item parameter_uncertainty_upper_value = upper value of paired uncertainty. +\item parameter_uncertainty_type = uncertainty type if a pair of values are +provided, e.g. "CI90\%", "CRI95\%" (see marburg_dropdown_parameters +for the full list of options). +\item cfr_ifr_numerator = numerator of the cfr or ifr provided in the article. +\item cfr_ifr_denominator = denominator of the cfr or ifr provided in the +article. +\item distribution_type = if uncertainty is given as a distribution (see +marburg_dropdown_parameters for the full list of options). +\item distribution_par1_value = value for distribution parameter 1. +\item distribution_par1_type = distribution parameter 1 type, e.g. shape, scale +(see marburg_dropdown_parameters for the full list of options). +\item distribution_par1_uncertainty = TRUE/FALSE. +\item distribution_par2_value = value for distribution parameter 2. +\item distribution_par2_type = distribution parameter 2 type, e.g. shape, scale +(see marburg_dropdown_parameters for the full list of options). +\item distribution_par2_uncertainty = TRUE/FALSE. +\item method_from_supplement = whether the parameter was taken from the +supplementary material of the article. TRUE/FALSE. +\item method_moment_value = time period, either "Pre outbreak", Start outbreak", +"Mid outbreak", "Post Outbreak", or "Other", if specified in the article. +\item cfr_ifr_method = whether the method used to calculate the cfr/ifr was +"Naive", "Adjusted", "Unknown". +\item method_r = method used to estimate the reproduction number (see +marburg_dropdown_parameters for the full list of options). +\item method_disaggregated_by = how the parameter is disaggregated e.g. by Age, +Sex, Region. +\item method_disaggregated = whether the parameter is disaggregated (TRUE/FALSE). +\item method_disaggregated_only = whether only disaggregated data is available +(TRUE/FALSE). +\item riskfactor_outcome = the outcome(s) for which the risk factor was +evaluated e.g. "Death" or "Infection" (see marburg_dropdown_parameters +for the full list of options). +\item riskfactor_name = the potential risk factor(s) evaluated e.g. "Age" (see +marburg_dropdown_parameters for the full list of options). +\item riskfactor_occupation = specific occupation(s) if occupation is a risk +factor (see marburg_dropdown_parameters for the full list of options). +\item riskfactor_significant = either "Significant", "Not significant", +"Unspecified" or NA. +\item riskfactor_adjusted = either "Adjusted", "Not adjusted", "Unspecified". +\item population_sex = the sex of the study population, either "Female", "Male", +"Both", "Unspecified". +\item population_sample_type = how the study was conducted e.g. "Hospital based", +"Population based" (see 'Setting' in marburg_dropdown_parameters for the +full list of options). +\item population_group = population group e.g. "Healthcare workers" (see +marburg_dropdown_parameters for the full list of options). +\item population_age_min = minimum age in sample (if reported). +\item population_age_max = maximum age in the sample (if reported). +\item population_sample_size = total number of participants/samples tested. +\item population_country = country/countries that the study took place in. +\item population_location = location that the study took place e.g. region, city. +\item population_study_start_day = day study started (numeric - DD) +\item population_study_start_month = month study started (three letter +abbreviation e.g. "Feb") +\item population_study_start_year = year study started (numeric - YYYY) +\item population_study_end_day = day study ended (numeric - DD) +\item population_study_end_month = month study ended (three letter abbreviation +e.g. "Feb") +\item population_study_end_year = year study ended (numeric - YYYY) +\item genome_site = the portion of the pathogen’s genome used to estimate any +extracted parameters. I.e. the gene, gene segment, codon position, or a +more generic description (‘whole genome’ or ‘intergenic positions’). +\item genomic_sequence_available = whether the study sequenced new pathogen +isolates and their accession numbers have been provided for retrieval +from a public database. TRUE/FALSE. +\item parameter_class = class of the extracted parameter. Either "Human delay", +"Seroprevalence", "Severity", "Reproduction number", "Mutations", +"Risk factors", or "Other transmission parameters". +\item covidence_id = article identifier used by the Imperial team. +\item Uncertainty = remove? +\item Survey year = remove? } } \source{ diff --git a/vignettes/pathogen_database_field_options.Rmd b/vignettes/pathogen_database_field_options.Rmd index cdc2aec..4aa0482 100644 --- a/vignettes/pathogen_database_field_options.Rmd +++ b/vignettes/pathogen_database_field_options.Rmd @@ -27,7 +27,9 @@ library(tidyverse) library(flextable) source("../R/get_table_field_options.R") -tbl <- get_table_field_options('model',vignette_prepend = "../") +tbl <- get_table_field_options(table_type = "model", + pathogen = "marburg", + vignette_prepend = "../") tbl %>% flextable() ``` @@ -35,7 +37,9 @@ tbl %>% flextable() ## Parameter field options ```{r parameter options, echo=FALSE, message=FALSE, warning=FALSE, paged.print=TRUE} -tbl <- get_table_field_options('parameter',vignette_prepend = "../") +tbl <- get_table_field_options(table_type = "parameter", + pathogen = "marburg", + vignette_prepend = "../") tbl %>% flextable() ``` @@ -43,7 +47,9 @@ tbl %>% flextable() ## Outbreak field options ```{r outbreak options, echo=FALSE, message=FALSE, warning=FALSE, paged.print=TRUE} -tbl <- get_table_field_options('outbreak',vignette_prepend = "../") +tbl <- get_table_field_options(table_type = "outbreak", + pathogen = "marburg", + vignette_prepend = "../") tbl %>% flextable() ``` From e903f38ad469e3d969da4112b4429a412b76d879 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Wed, 19 Jul 2023 16:48:55 +0100 Subject: [PATCH 35/40] move data to extdata --- R/append_new_entry_to_table.R | 2 +- R/create_new_article_entry.R | 20 +- R/create_new_model_entry.R | 4 +- R/create_new_outbreak_entry.R | 4 +- R/create_new_parameter_entry.R | 4 +- R/data_forest_plots.R | 8 +- R/data_outbreak_table.R | 8 +- R/data_param_table.R | 8 +- R/get_table_field_options.R | 4 +- R/load_epidata.R | 4 +- R/quality_assessment.R | 4 +- data/.DS_Store | Bin 6148 -> 0 bytes {data => inst/extdata}/marburg_article.csv | 118 ++--- .../extdata}/marburg_dropdown_models.csv | 0 .../extdata}/marburg_dropdown_outbreaks.csv | 440 +++++++++--------- .../extdata}/marburg_dropdown_parameters.csv | 10 +- {data => inst/extdata}/marburg_model.csv | 2 +- {data => inst/extdata}/marburg_outbreak.csv | 2 +- {data => inst/extdata}/marburg_parameter.csv | 4 +- vignettes/pathogen_marburg.Rmd | 18 +- 20 files changed, 332 insertions(+), 332 deletions(-) delete mode 100644 data/.DS_Store rename {data => inst/extdata}/marburg_article.csv (96%) rename {data => inst/extdata}/marburg_dropdown_models.csv (100%) rename {data => inst/extdata}/marburg_dropdown_outbreaks.csv (89%) rename {data => inst/extdata}/marburg_dropdown_parameters.csv (91%) rename {data => inst/extdata}/marburg_model.csv (96%) rename {data => inst/extdata}/marburg_outbreak.csv (98%) rename {data => inst/extdata}/marburg_parameter.csv (97%) diff --git a/R/append_new_entry_to_table.R b/R/append_new_entry_to_table.R index 2ad7b81..784ae40 100644 --- a/R/append_new_entry_to_table.R +++ b/R/append_new_entry_to_table.R @@ -60,7 +60,7 @@ append_new_entry_to_table <- function(pathogen = NA, } if (write_table) - write.csv(new_table, paste0(vignette_prepend, "data/", pathogen, "_", + write.csv(new_table, paste0(vignette_prepend, "extdata/", pathogen, "_", table_type, ".csv")) return(new_table) diff --git a/R/create_new_article_entry.R b/R/create_new_article_entry.R index 82510a7..1f17596 100644 --- a/R/create_new_article_entry.R +++ b/R/create_new_article_entry.R @@ -103,21 +103,21 @@ create_new_article_entry <- author_surname_is_character = is.character(first_author_surname), article_title_is_character = is.character(article_title), journal_is_character = is.character(journal), - doi_is_character = is.character(doi), - transmission_route_is_character = is.character(transmission_route), - assumptions_is_character = is.character(assumptions), + doi_is_character = is.character(doi), + transmission_route_is_character = is.character(transmission_route), + assumptions_is_character = is.character(assumptions), code_available_check = code_available %in% c(0, 1, NA), outbreak_year_is_integer = is.integer(outbreak_date_year), outbreak_year_after_1800 = outbreak_date_year > 1800, outbreak_year_not_future = outbreak_date_year < (as.integer( substring(Sys.Date(), 1, 4)) + 2), - qa_m1 = qa_m1 %in% c(0, 1, NA), - qa_m2 = qa_m2 %in% c(0, 1, NA), - qa_a3 = qa_a3 %in% c(0, 1, NA), - qa_a4 = qa_a4 %in% c(0, 1, NA), - qa_d5 = qa_d5 %in% c(0, 1, NA), - qa_d6 = qa_d6 %in% c(0, 1, NA), - qa_d7 = qa_d7 %in% c(0, 1, NA) + qa_m1 = qa_m1 %in% c(0, 1, NA), + qa_m2 = qa_m2 %in% c(0, 1, NA), + qa_a3 = qa_a3 %in% c(0, 1, NA), + qa_a4 = qa_a4 %in% c(0, 1, NA), + qa_d5 = qa_d5 %in% c(0, 1, NA), + qa_d6 = qa_d6 %in% c(0, 1, NA), + qa_d7 = qa_d7 %in% c(0, 1, NA) ) rules_output <- confront(new_row, rules) diff --git a/R/create_new_model_entry.R b/R/create_new_model_entry.R index 9189647..74bd472 100644 --- a/R/create_new_model_entry.R +++ b/R/create_new_model_entry.R @@ -60,11 +60,11 @@ create_new_model_entry <- stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", paste0(pathogen, "_dropdown_models.csv"), + file_path_ob <- system.file("extdata", paste0(pathogen, "_dropdown_models.csv"), package = "epireview") if (file_path_ob == "") { file_path_ob <- paste0(vignette_prepend, - "data/", pathogen, "_dropdown_models.csv") + "extdata/", pathogen, "_dropdown_models.csv") } model_options <- read_csv(file_path_ob) diff --git a/R/create_new_outbreak_entry.R b/R/create_new_outbreak_entry.R index d6be562..aec1b08 100644 --- a/R/create_new_outbreak_entry.R +++ b/R/create_new_outbreak_entry.R @@ -77,12 +77,12 @@ create_new_outbreak_entry <- stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", + file_path_ob <- system.file("extdata", paste0(pathogen, "_dropdown_outbreaks.csv"), package = "epireview") if (file_path_ob == "") { file_path_ob <- paste0(vignette_prepend, - "data/", pathogen, "_dropdown_outbreaks.csv") + "extdata/", pathogen, "_dropdown_outbreaks.csv") } outbreak_options <- read_csv(file_path_ob) diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index 0e5bbec..86cfa94 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -112,12 +112,12 @@ create_new_parameter_entry <- stop("Article_id + Covidence_id pair does not exist in article data") #available options for fields - file_path_ob <- system.file("data", + file_path_ob <- system.file("extdata", paste0(pathogen, "_dropdown_parameters.csv"), package = "epireview") if (file_path_ob == "") { file_path_ob <- paste0(vignette_prepend, - "data/", pathogen, "_dropdown_parameters.csv") + "extdata/", pathogen, "_dropdown_parameters.csv") } parameter_options <- read_csv(file_path_ob) diff --git a/R/data_forest_plots.R b/R/data_forest_plots.R index 71b0fe3..e491bc3 100644 --- a/R/data_forest_plots.R +++ b/R/data_forest_plots.R @@ -16,16 +16,16 @@ data_forest_plots <- function(pathogen, exclude) { # Get file pathway for parameter data file_path_pa <- system.file( - "data", paste0(pathogen, "_parameter.csv"), package = "epireview") + "extdata", paste0(pathogen, "_parameter.csv"), package = "epireview") if (file_path_pa == "") - file_path_pa <- paste0("../data/", pathogen, "_parameter.csv") + file_path_pa <- paste0("../extdata/", pathogen, "_parameter.csv") params <- read_csv(file_path_pa) # Get file pathway for article data file_path_ar <- system.file( - "data", paste0(pathogen, "_article.csv"), package = "epireview") + "extdata", paste0(pathogen, "_article.csv"), package = "epireview") if (file_path_ar == "") - file_path_ar <- paste0("../data/", pathogen, "_article.csv") + file_path_ar <- paste0("../extdata/", pathogen, "_article.csv") articles <- read_csv(file_path_ar) # Deal with R CMD Check "no visible binding for global variable" diff --git a/R/data_outbreak_table.R b/R/data_outbreak_table.R index cec3500..fa6037b 100644 --- a/R/data_outbreak_table.R +++ b/R/data_outbreak_table.R @@ -12,16 +12,16 @@ data_outbreak_table <- function(pathogen) { # Get file pathway for outbreak data file_path_ob <- system.file( - "data", paste0(pathogen, "_outbreak.csv"), package = "epireview") + "extdata", paste0(pathogen, "_outbreak.csv"), package = "epireview") if (file_path_ob == "") - file_path_ob <- paste0("../data/", pathogen, "_outbreak.csv") + file_path_ob <- paste0("../extdata/", pathogen, "_outbreak.csv") outbreak <- read_csv(file_path_ob) # Get file pathway for article data file_path_ar <- system.file( - "data", paste0(pathogen, "_article.csv"), package = "epireview") + "extdata", paste0(pathogen, "_article.csv"), package = "epireview") if (file_path_ar == "") - file_path_ar <- paste0("../data/", pathogen, "_article.csv") + file_path_ar <- paste0("../extdata/", pathogen, "_article.csv") articles <- read_csv(file_path_ar) # Deal with R CMD Check "no visible binding for global variable" diff --git a/R/data_param_table.R b/R/data_param_table.R index 81596d7..212b51d 100644 --- a/R/data_param_table.R +++ b/R/data_param_table.R @@ -14,16 +14,16 @@ data_param_table <- function(pathogen, exclude) { # Get file pathway for parameter data file_path_pa <- system.file( - "data", paste0(pathogen, "_parameter.csv"), package = "epireview") + "extdata", paste0(pathogen, "_parameter.csv"), package = "epireview") if (file_path_pa == "") - file_path_pa <- paste0("../data/", pathogen, "_parameter.csv") + file_path_pa <- paste0("../extdata/", pathogen, "_parameter.csv") params <- read_csv(file_path_pa) # Get file pathway for article data file_path_ar <- system.file( - "data", paste0(pathogen, "_article.csv"), package = "epireview") + "extdata", paste0(pathogen, "_article.csv"), package = "epireview") if (file_path_ar == "") - file_path_ar <- paste0("../data/", pathogen, "_article.csv") + file_path_ar <- paste0("../extdata/", pathogen, "_article.csv") articles <- read_csv(file_path_ar) # Deal with R CMD Check "no visible binding for global variable" diff --git a/R/get_table_field_options.R b/R/get_table_field_options.R index 6478f8f..f0c50a2 100644 --- a/R/get_table_field_options.R +++ b/R/get_table_field_options.R @@ -31,11 +31,11 @@ get_table_field_options <- function(table_type = NA, vignette_prepend = "") { file_path_ob <- system.file( - "data", paste0(pathogen, "_dropdown_", table_type, "s.csv"), + "extdata", paste0(pathogen, "_dropdown_", table_type, "s.csv"), package = "epireview") if (file_path_ob == "") file_path_ob <- paste0( - vignette_prepend, "data/", pathogen, "_dropdown_", table_type, "s.csv") + vignette_prepend, "extdata/", pathogen, "_dropdown_", table_type, "s.csv") model_options <- read_csv(file_path_ob) if (field == "all") { diff --git a/R/load_epidata.R b/R/load_epidata.R index e7662af..17a4c00 100644 --- a/R/load_epidata.R +++ b/R/load_epidata.R @@ -19,11 +19,11 @@ load_epidata <- function(table_type = NA, } file_path <- system.file( - "data", paste0(pathogen, "_", table_type, ".csv"), package = "epireview") + "extdata", paste0(pathogen, "_", table_type, ".csv"), package = "epireview") if (file_path == "") file_path <- paste0( - vignette_prepend, "data/", pathogen, "_", table_type, ".csv") + vignette_prepend, "extdata/", pathogen, "_", table_type, ".csv") data_tbl <- read_csv(file_path) return(data_tbl) diff --git a/R/quality_assessment.R b/R/quality_assessment.R index 93cf789..08dee91 100644 --- a/R/quality_assessment.R +++ b/R/quality_assessment.R @@ -24,10 +24,10 @@ quality_assessment_plots <- function(pathogen = NA, stop("pathogen name must be supplied") } - file_path <- system.file("data", paste0(pathogen, "_article.csv"), + file_path <- system.file("extdata", paste0(pathogen, "_article.csv"), package = "epireview") if (file_path == "") - file_path <- paste0(prepend, "data/", pathogen, "_article.csv") + file_path <- paste0(prepend, "extdata/", pathogen, "_article.csv") quality <- read_csv(file_path) # Deal with R CMD Check "no visible binding for global variable" diff --git a/data/.DS_Store b/data/.DS_Store deleted file mode 100644 index 83ab66a8b7d60508c2573d7bf5c2738914298dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKK~BRk5FD3ERB$N*BrcWA2P*M{P?ZB`9so^)Dnv@Ew1sQ#Jcifs7)~&2TU2!t zsV4+zx7r=s*&R0{*^U92(K@>T`T%-#!R`S=gUNI8nsvg+KG8UiC6>5FhLllF6;K6! zy8^Oy2bf^W-#u6FX8mR;QDDK8Zv*0=j*(frg@Q)MYfPj`tZ{k zTY%k>xxgAL?iwZ8CwOe-e~b9fcjR9%ucXh(zoM6IGnhd%!!c{5HswDoF{297Tj7E4 zpOdLk2lE=S9MxDhS~fF$L<}c2hFG&kp3W@dIj!;3wP|L0kC@n1`_l^W%ogh%deo>2 zr~<0Mw*s<1Sh`>mu=41(4hDAxAa*(IjBWW4kQy5>30QgL6Pod*L|>X!;@GWYC}r{HOw7 D-9eaB diff --git a/data/marburg_article.csv b/inst/extdata/marburg_article.csv similarity index 96% rename from data/marburg_article.csv rename to inst/extdata/marburg_article.csv index 05ac5eb..4c45658 100644 --- a/data/marburg_article.csv +++ b/inst/extdata/marburg_article.csv @@ -1,71 +1,71 @@ -article_id,pathogen,covidence_id,first_author_first_name,article_title,doi,journal,year_publication,volume,issue,page_first,page_last,paper_copy_only,notes,first_author_surname,double_extracted,qa_m1,qa_m2,qa_a3,qa_a4,qa_d5,qa_d6,qa_d7,score +article_id,pathogen,covidence_id,first_author_first_name,article_title,doi,journal,year_publication,volume,issue,page_first,page_last,paper_copy_only,notes,first_author_surname,double_extracted,qa_m1,qa_m2,qa_a3,qa_a4,qa_d5,qa_d6,qa_d7,score 1,Marburg virus,2059,G A,Haemorrhagic fever virus activity in equatorial Africa: distribution and prevalence of filovirus reactive antibody in the Central African Republic,NA,German Medical Monthly,1968,13,10,457,460,TRUE,"scanned version of paper from library -Covers discovery of Marburg in Germany, first detected case.",Martini,0,NA,NA,NA,NA,1,0,0,0.33333333333333337 -2,Marburg virus,2042,Christian,Antibodies to haemorrhagic fever viruses in Madagascar,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1989,83,NA,407,409,FALSE,NA,Mathiot,1,0,0,NA,NA,0,0,0,0 -3,Marburg virus,1649,Y,The origin and evolution of Ebola and Marburg viruses,10.1093/oxfordjournals.molbev.a025820,Molecular biology and evolution,1997,14,8,800,806,FALSE,Mutation rate,Suzuki,1,1,0,0,0,1,1,0,0.42857142857142855 -4,Marburg virus,1692,D.H.,Marburg-Virus Disease in Kenya,NA,The Lancet,1982,1,8276,816,820,TRUE,"This outbreak is of 2 patients, whose 186 contacts were followed up with serology testing in addition to various samples from the population. It does not specify whether if it is IgG or IgM, so I assumed IgG since it is longer lasting",Smith,1,1,1,NA,NA,0,0,0,0.4 -5,Marburg virus,2597,E. D.,Filovirus activity among selected ethnic groups inhabiting the tropical forest of equatorial Africa,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1993,87,5,536,538,FALSE,NA,Johnson,0,1,1,NA,NA,1,0,0,0.6 -6,Marburg virus,3795,JS,Outbreak of Marburg virus disease in Johannesburg,10.1136/bmj.4.5995.489,The British Medical Journal,1975,4,5995,489,493,FALSE,3 person outbreak in Johannesburg in 1975. First recorded outbreak in Africa.,Gear,0,1,0,0,0,1,0,0,0.2857142857142857 -7,Marburg virus,2596,E.D.,Haemorrhagic fever virus activity in equatorial Africa: distribution and prevalence of filovirus reactive antibody in the Central African Republic,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1993,87,NA,530,535,FALSE,"This is a large-sample (4295) general population seroprevalence study. Though a bit dated (1993), it (relatively) carefully consdiers geographic and ethnic diversity within the Central African Republic, and finds population-level seroprevalence of 3.2%",Johnson,0,1,1,NA,NA,1,1,0,0.8 +Covers discovery of Marburg in Germany, first detected case.",Martini,0,NA,NA,NA,NA,1,0,0,0.333333333 +2,Marburg virus,2042,Christian,Antibodies to haemorrhagic fever viruses in Madagascar,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1989,83,NA,407,409,FALSE,NA,Mathiot,1,0,0,NA,NA,0,0,0,0 +3,Marburg virus,1649,Y,The origin and evolution of Ebola and Marburg viruses,10.1093/oxfordjournals.molbev.a025820,Molecular biology and evolution,1997,14,8,800,806,FALSE,Mutation rate,Suzuki,1,1,0,0,0,1,1,0,0.428571429 +4,Marburg virus,1692,D.H.,Marburg-Virus Disease in Kenya,NA,The Lancet,1982,1,8276,816,820,TRUE,"This outbreak is of 2 patients, whose 186 contacts were followed up with serology testing in addition to various samples from the population. It does not specify whether if it is IgG or IgM, so I assumed IgG since it is longer lasting",Smith,1,1,1,NA,NA,0,0,0,0.4 +5,Marburg virus,2597,E. D.,Filovirus activity among selected ethnic groups inhabiting the tropical forest of equatorial Africa,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1993,87,5,536,538,FALSE,NA,Johnson,0,1,1,NA,NA,1,0,0,0.6 +6,Marburg virus,3795,JS,Outbreak of Marburg virus disease in Johannesburg,10.1136/bmj.4.5995.489,The British Medical Journal,1975,4,5995,489,493,FALSE,3 person outbreak in Johannesburg in 1975. First recorded outbreak in Africa.,Gear,0,1,0,0,0,1,0,0,0.285714286 +7,Marburg virus,2596,E.D.,Haemorrhagic fever virus activity in equatorial Africa: distribution and prevalence of filovirus reactive antibody in the Central African Republic,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1993,87,NA,530,535,FALSE,"This is a large-sample (4295) general population seroprevalence study. Though a bit dated (1993), it (relatively) carefully consdiers geographic and ethnic diversity within the Central African Republic, and finds population-level seroprevalence of 3.2%",Johnson,0,1,1,NA,NA,1,1,0,0.8 8,Marburg virus,1615,O,Viral hemorrhagic fever antibodies in Nigerian populations,10.4269/ajtmh.1988.38.407,The American Journal of Tropical Medicine and Hygiene,1988,38,2,407,410,TRUE,"Parameters for Lassa, RVF, Ebola, Marburg & CCHF, only Marburg parameters extracted here but this paper should be in the other pathogens; -quality assessment difficult because no details on sampling",Tomori,1,1,1,NA,NA,0,0,0,0.4 -9,Marburg virus,1693,Smiley,Suspected Exposure to Filoviruses Among People Contacting Wildlife in Southwestern Uganda,10.1093/infdis/jiy251,The Journal of Infectious Diseases,2018,218,NA,277,286,FALSE,NA,Evans,1,1,1,NA,NA,1,1,0,0.8 -10,Marburg virus,1692,D,Marburg-virus disease in Kenya,NA,Lancet,1982,1,8276,816,820,TRUE,NA,Smith,1,1,1,NA,NA,0,0,0,0.4 -11,Marburg virus,1983,N,Risk Factors Associated with Ebola and Marburg Viruses Seroprevalence in Blood Donors in the Republic of Congo,10.1371/journal.pntd.0003833,PLoS neglected tropical diseases,2015,9,6,NA,NA,FALSE,NA,Moyen,1,1,1,NA,NA,0,1,0,0.6 -12,Marburg virus,1930,Luke,"Isolated Case of Marburg Virus Disease, Kampala, Uganda, 2014",https://dx.doi.org/10.3201/eid2306.170047,Emerging Infectious Diseases,2017,23,6,1001,1004,FALSE,single case outbreak,Nyakarahuka,1,NA,NA,NA,NA,1,NA,NA,1 -14,Marburg virus,1930,L,Isolated Case of Marburg Virus Disease Kampala Uganda 2014,10.3201/eid2306.170047,Emerging Infectious Diseases,2017,23,6,1001,1004,FALSE,NA,Nyakarahuka,1,NA,NA,NA,NA,1,NA,NA,1 -15,Marburg virus,1931,Luke,How severe and prevalent are Ebola and Marburg viruses? A systematic review and meta-analysis of the case fatality rates and seroprevalence,10.1186/s12879-016-2045-6,BMC infectious diseases,2016,16,1,708,NA,FALSE,Meta-analysis of CFR and seroprevalence,Nyakarahuka,1,NA,NA,NA,NA,NA,NA,NA,NA -17,Marburg virus,1931,Luke,How severe and prevalent are Ebola and Marburg viruses? A systematic review and meta-analysis of the case fatality rates and seroprevalence,10.1186/s12879-016-2045-6,BMC infectious diseases,2016,16,1,708,NA,FALSE,Meta-analysis approach to estimate the case fatality and seroprevalence rates. 12 CFR studies (excluded 0% CFR and 100% CFR - not valid?) - 9 countries. 11 seroprevalence studies - 7+ countries (one study looks at central african countries).,Nyakarahuka,1,NA,NA,NA,NA,NA,NA,NA,NA -20,Marburg virus,2060,G A,Marburg virus disease,NA,Postgraduate Medical Journal,1973,NA,49,542,546,FALSE,NA,Martini,0,NA,NA,NA,NA,1,0,0,0.33333333333333337 +quality assessment difficult because no details on sampling",Tomori,1,1,1,NA,NA,0,0,0,0.4 +9,Marburg virus,1693,Smiley,Suspected Exposure to Filoviruses Among People Contacting Wildlife in Southwestern Uganda,10.1093/infdis/jiy251,The Journal of Infectious Diseases,2018,218,NA,277,286,FALSE,NA,Evans,1,1,1,NA,NA,1,1,0,0.8 +10,Marburg virus,1692,D,Marburg-virus disease in Kenya,NA,Lancet,1982,1,8276,816,820,TRUE,NA,Smith,1,1,1,NA,NA,0,0,0,0.4 +11,Marburg virus,1983,N,Risk Factors Associated with Ebola and Marburg Viruses Seroprevalence in Blood Donors in the Republic of Congo,10.1371/journal.pntd.0003833,PLoS neglected tropical diseases,2015,9,6,NA,NA,FALSE,NA,Moyen,1,1,1,NA,NA,0,1,0,0.6 +12,Marburg virus,1930,Luke,"Isolated Case of Marburg Virus Disease, Kampala, Uganda, 2014",https://dx.doi.org/10.3201/eid2306.170047,Emerging Infectious Diseases,2017,23,6,1001,1004,FALSE,single case outbreak,Nyakarahuka,1,NA,NA,NA,NA,1,NA,NA,1 +14,Marburg virus,1930,L,Isolated Case of Marburg Virus Disease Kampala Uganda 2014,10.3201/eid2306.170047,Emerging Infectious Diseases,2017,23,6,1001,1004,FALSE,NA,Nyakarahuka,1,NA,NA,NA,NA,1,NA,NA,1 +15,Marburg virus,1931,Luke,How severe and prevalent are Ebola and Marburg viruses? A systematic review and meta-analysis of the case fatality rates and seroprevalence,10.1186/s12879-016-2045-6,BMC infectious diseases,2016,16,1,708,NA,FALSE,Meta-analysis of CFR and seroprevalence,Nyakarahuka,1,NA,NA,NA,NA,NA,NA,NA,NA +17,Marburg virus,1931,Luke,How severe and prevalent are Ebola and Marburg viruses? A systematic review and meta-analysis of the case fatality rates and seroprevalence,10.1186/s12879-016-2045-6,BMC infectious diseases,2016,16,1,708,NA,FALSE,Meta-analysis approach to estimate the case fatality and seroprevalence rates. 12 CFR studies (excluded 0% CFR and 100% CFR - not valid?) - 9 countries. 11 seroprevalence studies - 7+ countries (one study looks at central african countries).,Nyakarahuka,1,NA,NA,NA,NA,NA,NA,NA,NA +20,Marburg virus,2060,G A,Marburg virus disease,NA,Postgraduate Medical Journal,1973,NA,49,542,546,FALSE,NA,Martini,0,NA,NA,NA,NA,1,0,0,0.333333333 21,Marburg virus,2762,Mattias,Serosurvey on Household Contacts of Marburg Hemorrhagic Fever Patients,10.3201/eid1205.050622,Emerging infectious diseases,2006,12,3,433,439,FALSE,"Suspected cases come from symptomatic contacts who were not identified at the time of the outbreak. -Secondary attack rate and tertiary attack rates are reported in the paper, but only the secondary is recorded in the parameter form.",Borchert,0,0,1,NA,NA,1,1,0,0.6 -22,Marburg virus,2614,B,"Haemorrhagic fever in Gabon. I. Incidence of Lassa, Ebola and Marburg viruses in Haut-Ogooue",10.1016/0035-9203(82)90089-x,Transactions of the Royal Society of Tropical Medicine and Hygiene,1982,76,NA,719,720,FALSE,One thing looked at is pregnant women and newborns,Ivanoff,0,1,0,NA,NA,0,0,0,0.2 -23,Marburg virus,2883,CG,Genomic analysis of filoviruses associated with four viral hemorrhagic fever outbreaks in Uganda and the Democratic Republic of the Congo in 2012,10.1016/j.virol.2013.04.014,Virology,2013,442,2,97,100,FALSE,NA,Albarino,0,1,0,NA,NA,1,0,0,0.4 -24,Marburg virus,2601,B. K.,Antibodies against haemorrhagic fever viruses in Kenya populations,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1983,77,5,731,733,FALSE,NA,Johnson,0,1,1,NA,NA,0,0,0,0.4 -25,Marburg virus,2116,F,Arbovirus infections and viral haemorrhagic fevers in Uganda: a serological survey in Karamoja district 1984,10.1016/0035-9203(89)90352-0,Transactions of the Royal Society of Tropical Medicine and Hygiene,1989,NA,NA,851,854,FALSE,NA,Rodhain,0,1,1,NA,NA,0,0,0,0.4 -26,Marburg virus,2032,A,Repeated outbreaks of Viral hemorrhagic fevers in Uganda,10.4314/ahs.v12i4.31,African Health Sciences,2012,12,4,579,883,FALSE,NA,Mbonye,1,1,0,0,0,0,0,0,0.14285714285714288 -27,Marburg virus,2886,Marco,Transmission potential and design of adequate control measures for Marburg hemorrhagic fever,10.1371/journal.pone.0050948,PloS one,2012,7,12,NA,NA,FALSE,NA,Ajelli,0,1,1,1,1,1,1,1,1 -28,Marburg virus,1615,Oyewale,Viral hemorrhagic fever antibodies in Nigerian populations,NA,The American Society of Tropical Medicine and Hygiene,1988,38,2,407,410,FALSE,NA,Tomori,1,1,1,NA,NA,0,0,0,0.4 -29,Marburg virus,1483,Gianguglielmo,Distribution of Marburg virus in Africa: An evolutionary approach,10.1016/j.meegid.2016.06.014,"Infection, genetics and evolution : journal of molecular epidemiology and evolutionary genetics in infectious diseases",2016,44,NA,NA,NA,FALSE,NA,Zehender,1,1,1,1,1,1,1,1,1 -30,Marburg virus,1983,Nanikaly,Risk Factors Associated with Ebola and Marburg Viruses Seroprevalence in Blood Donors in the Republic of Congo,10.1371/journal.pntd.0003833,PLOS Neglected Tropical Diseases,2015,9,6,NA,NA,FALSE,"Seroprevalence survey of 809 rural/urban blood donors (9.3% rural, 90.7% urban)",Moyen,1,1,1,NA,NA,0,1,0,0.6 -31,Marburg virus,1871,Boris I,Calculation of incubation period and serial interval from multiple outbreaks of Marburg virus disease,10.1186/1756-0500-7-906,BMC research notes,2014,7,NA,906,NA,FALSE,NA,Palvin,1,0,0,0,0,1,0,0,0.14285714285714288 -32,Marburg virus,2808,S.,Evidence for occurrence of filovirus antibodies in humans and imported monkeys: do subclinical filovirus infections occur worldwide?,NA,Medical microbiology and immunology,1992,181,1,43,55,FALSE,ELISA positive sera were confirmed using immunofluorescence and immunoblot tests.,Becker,0,0,1,NA,NA,0,0,0,0.2 -33,Marburg virus,2696,Serena,Molecular evolution of viruses of the family filoviridae based on 97 whole-genome sequences,10.1128/JVI.03118-12,Journal of Virology,2013,87,NA,2608,2616,FALSE,Parameters are x10-4 which isn’t in the value field on the parameter form. Also the sequences include bats as well as humans,Carroll,0,1,1,NA,NA,0,0,0,0.4 -34,Marburg virus,1927,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,1,1,1,NA,NA,0,0,0,0.4 -35,Marburg virus,2869,Brian,Seasonal pulses of Marburg virus circulation in juvenile Rousettus aegyptiacus bats coincide with periods of increased risk of human infection,10.1371/journal.ppat.1002877,PLOS Pathogens,2012,8,10,NA,NA,FALSE,Study focused on bats but contains risk factors for 13 suspected virus spillover events to humans.,Amman,0,1,1,1,1,1,1,1,1 -36,Marburg virus,1483,Gianguglielmo,"Infection, genetics and evolution : journal of molecular epidemiology and evolutionary genetics in infectious diseases",10.1016/j.meegid.2016.06.014,NA,2016,44,NA,8,16,FALSE,NA,Zehender,1,1,1,1,1,1,1,1,1 +Secondary attack rate and tertiary attack rates are reported in the paper, but only the secondary is recorded in the parameter form.",Borchert,0,0,1,NA,NA,1,1,0,0.6 +22,Marburg virus,2614,B,"Haemorrhagic fever in Gabon. I. Incidence of Lassa, Ebola and Marburg viruses in Haut-Ogooue",10.1016/0035-9203(82)90089-x,Transactions of the Royal Society of Tropical Medicine and Hygiene,1982,76,NA,719,720,FALSE,One thing looked at is pregnant women and newborns,Ivanoff,0,1,0,NA,NA,0,0,0,0.2 +23,Marburg virus,2883,CG,Genomic analysis of filoviruses associated with four viral hemorrhagic fever outbreaks in Uganda and the Democratic Republic of the Congo in 2012,10.1016/j.virol.2013.04.014,Virology,2013,442,2,97,100,FALSE,NA,Albarino,0,1,0,NA,NA,1,0,0,0.4 +24,Marburg virus,2601,B. K.,Antibodies against haemorrhagic fever viruses in Kenya populations,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1983,77,5,731,733,FALSE,NA,Johnson,0,1,1,NA,NA,0,0,0,0.4 +25,Marburg virus,2116,F,Arbovirus infections and viral haemorrhagic fevers in Uganda: a serological survey in Karamoja district 1984,10.1016/0035-9203(89)90352-0,Transactions of the Royal Society of Tropical Medicine and Hygiene,1989,NA,NA,851,854,FALSE,NA,Rodhain,0,1,1,NA,NA,0,0,0,0.4 +26,Marburg virus,2032,A,Repeated outbreaks of Viral hemorrhagic fevers in Uganda,10.4314/ahs.v12i4.31,African Health Sciences,2012,12,4,579,883,FALSE,NA,Mbonye,1,1,0,0,0,0,0,0,0.142857143 +27,Marburg virus,2886,Marco,Transmission potential and design of adequate control measures for Marburg hemorrhagic fever,10.1371/journal.pone.0050948,PloS one,2012,7,12,NA,NA,FALSE,NA,Ajelli,0,1,1,1,1,1,1,1,1 +28,Marburg virus,1615,Oyewale,Viral hemorrhagic fever antibodies in Nigerian populations,NA,The American Society of Tropical Medicine and Hygiene,1988,38,2,407,410,FALSE,NA,Tomori,1,1,1,NA,NA,0,0,0,0.4 +29,Marburg virus,1483,Gianguglielmo,Distribution of Marburg virus in Africa: An evolutionary approach,10.1016/j.meegid.2016.06.014,"Infection, genetics and evolution : journal of molecular epidemiology and evolutionary genetics in infectious diseases",2016,44,NA,NA,NA,FALSE,NA,Zehender,1,1,1,1,1,1,1,1,1 +30,Marburg virus,1983,Nanikaly,Risk Factors Associated with Ebola and Marburg Viruses Seroprevalence in Blood Donors in the Republic of Congo,10.1371/journal.pntd.0003833,PLOS Neglected Tropical Diseases,2015,9,6,NA,NA,FALSE,"Seroprevalence survey of 809 rural/urban blood donors (9.3% rural, 90.7% urban)",Moyen,1,1,1,NA,NA,0,1,0,0.6 +31,Marburg virus,1871,Boris I,Calculation of incubation period and serial interval from multiple outbreaks of Marburg virus disease,10.1186/1756-0500-7-906,BMC research notes,2014,7,NA,906,NA,FALSE,NA,Palvin,1,0,0,0,0,1,0,0,0.142857143 +32,Marburg virus,2808,S.,Evidence for occurrence of filovirus antibodies in humans and imported monkeys: do subclinical filovirus infections occur worldwide?,NA,Medical microbiology and immunology,1992,181,1,43,55,FALSE,ELISA positive sera were confirmed using immunofluorescence and immunoblot tests.,Becker,0,0,1,NA,NA,0,0,0,0.2 +33,Marburg virus,2696,Serena,Molecular evolution of viruses of the family filoviridae based on 97 whole-genome sequences,10.1128/JVI.03118-12,Journal of Virology,2013,87,NA,2608,2616,FALSE,Parameters are x10-4 which isnt in the value field on the parameter form. Also the sequences include bats as well as humans,Carroll,0,1,1,NA,NA,0,0,0,0.4 +34,Marburg virus,1927,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,1,1,1,NA,NA,0,0,0,0.4 +35,Marburg virus,2869,Brian,Seasonal pulses of Marburg virus circulation in juvenile Rousettus aegyptiacus bats coincide with periods of increased risk of human infection,10.1371/journal.ppat.1002877,PLOS Pathogens,2012,8,10,NA,NA,FALSE,Study focused on bats but contains risk factors for 13 suspected virus spillover events to humans.,Amman,0,1,1,1,1,1,1,1,1 +36,Marburg virus,1483,Gianguglielmo,"Infection, genetics and evolution : journal of molecular epidemiology and evolutionary genetics in infectious diseases",10.1016/j.meegid.2016.06.014,NA,2016,44,NA,8,16,FALSE,NA,Zehender,1,1,1,1,1,1,1,1,1 37,Marburg virus,2369,Jean Paul,"Ebola and Marburg virus antibody prevalence in selected populations of the Central African Republic -decision-making",NA,Microbes and infection,2000,2,1,39,44,FALSE,First 4 Qas hard to evaluate since method of participant selection was not included in this paper,Gonzalez,0,1,1,NA,NA,0,0,0,0.4 -38,Marburg virus,3473,RJ,Undiagnosed Acute Viral Febrile Illnesses Sierra Leone,10.3201/eid2007.131265,Emerging Infectious Diseases,2014,20,7,1176,1182,FALSE,Serology study of patients with suspected Lassa fever but negative on serology. Also reported number of IgM positive that were not also IgG positive,Schoepp,0,0,0,NA,NA,1,1,0,0.4 -39,Marburg virus,1595,Fransje W,Hemorrhagic fever virus infections in an isolated rainforest area of central Liberia. Limitations of the indirect immunofluorescence slide test for antibody screening in Africa,NA,Tropical and Geographical Medicince,1986,38,NA,209,214,FALSE,NA,Van der Waals,1,1,1,NA,NA,0,0,0,0.4 -40,Marburg virus,2370,J. P.,Antibody prevalence against haemorrhagic fever viruses in randomized representative Central African populations,NA,Research in virology,1989,140,NA,319,331,FALSE,NA,Gonzalez,0,1,0,NA,NA,1,1,1,0.8 -41,Marburg virus,2042,Christian C.,Antibodies to haemorrhagic fever viruses in Madagascar populations,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1989,83,NA,407,409,FALSE,NA,Mathiot,1,0,0,NA,NA,0,0,0,0 -42,Marburg virus,2241,Barbara,"Multidistrict Outbreak of Marburg Virus Disease-Uganda, 2012",10.1093/infdis/jiv351,The Journal of Infectious Diseases,2015,212,NA,119,128,FALSE,"It's in Supplement 2 of the journal. Page numbers are S119 and S128. Use risk factor outcome to indicate what outcome is being recorded. Death = death, other = recovery",Knust,0,1,0,NA,NA,1,0,0,0.4 -43,Marburg virus,2761,Matthias,Pygmy populations seronegative for Marburg virus,10.3201/eid1101.040377,Emerging Infectious Diseases,2005,11,1,174,177,FALSE,NA,Borchert,0,1,1,1,1,1,1,1,1 -44,Marburg virus,2120,Paul,"Factors associated with Marburg hemorrhagic fever: analysis of patient data from Uige, Angola",10.1086/652748,The Journal of infectious diseases,2010,201,12,1909,1918,FALSE,NA,Roddy,0,1,1,NA,NA,1,1,0,0.8 -45,Marburg virus,2759,Matthias,Short communication: a cluster of Marburg virus disease involving an infant,10.1046/j.1365-3156.2002.00945.x,Tropical Medicine & International Health,2002,7,10,902,906,FALSE,NA,Borchert,0,1,1,NA,NA,1,1,0,0.8 -46,Marburg virus,4657,Matthias,"Use of Protective Gear and the Occurrence of Occupational Marburg Hemorrhagic Fever in Health Workers from Watsa Health Zone, Democratic Republic of the Congo",10.1086/520540,The Journal of Infectious Diseases,2007,196,NA,168,175,FALSE,Serosurvey of surviving HCW who had treated patients with Marburg haemorrhagic fever during outbreak (Oct '98 - Sep '00),Borchert,0,1,1,NA,NA,0,1,0,0.6 -47,Marburg virus,1595,Fransje W.,Hemorrhagic fever virus infections in an isolated rainforest area of central Liberia. Limitations of the indirect immunofluorescence slide test for antibody screening in Africa,NA,Tropical and geographical medicine,1986,38,1,209,214,TRUE,"This is a small-sample (225) seroprevalence study with a focus on epileptics, to explore whether MBG and other HFVs are risk factors for epilepsy. The conclusion is negative, but it calculates some seroprevalence estimates",Van der Waals,1,1,1,NA,NA,0,0,0,0.4 +decision-making",NA,Microbes and infection,2000,2,1,39,44,FALSE,First 4 Qas hard to evaluate since method of participant selection was not included in this paper,Gonzalez,0,1,1,NA,NA,0,0,0,0.4 +38,Marburg virus,3473,RJ,Undiagnosed Acute Viral Febrile Illnesses Sierra Leone,10.3201/eid2007.131265,Emerging Infectious Diseases,2014,20,7,1176,1182,FALSE,Serology study of patients with suspected Lassa fever but negative on serology. Also reported number of IgM positive that were not also IgG positive,Schoepp,0,0,0,NA,NA,1,1,0,0.4 +39,Marburg virus,1595,Fransje W,Hemorrhagic fever virus infections in an isolated rainforest area of central Liberia. Limitations of the indirect immunofluorescence slide test for antibody screening in Africa,NA,Tropical and Geographical Medicince,1986,38,NA,209,214,FALSE,NA,Van der Waals,1,1,1,NA,NA,0,0,0,0.4 +40,Marburg virus,2370,J. P.,Antibody prevalence against haemorrhagic fever viruses in randomized representative Central African populations,NA,Research in virology,1989,140,NA,319,331,FALSE,NA,Gonzalez,0,1,0,NA,NA,1,1,1,0.8 +41,Marburg virus,2042,Christian C.,Antibodies to haemorrhagic fever viruses in Madagascar populations,NA,Transactions of the Royal Society of Tropical Medicine and Hygiene,1989,83,NA,407,409,FALSE,NA,Mathiot,1,0,0,NA,NA,0,0,0,0 +42,Marburg virus,2241,Barbara,"Multidistrict Outbreak of Marburg Virus Disease-Uganda, 2012",10.1093/infdis/jiv351,The Journal of Infectious Diseases,2015,212,NA,119,128,FALSE,"It's in Supplement 2 of the journal. Page numbers are S119 and S128. Use risk factor outcome to indicate what outcome is being recorded. Death = death, other = recovery",Knust,0,1,0,NA,NA,1,0,0,0.4 +43,Marburg virus,2761,Matthias,Pygmy populations seronegative for Marburg virus,10.3201/eid1101.040377,Emerging Infectious Diseases,2005,11,1,174,177,FALSE,NA,Borchert,0,1,1,1,1,1,1,1,1 +44,Marburg virus,2120,Paul,"Factors associated with Marburg hemorrhagic fever: analysis of patient data from Uige, Angola",10.1086/652748,The Journal of infectious diseases,2010,201,12,1909,1918,FALSE,NA,Roddy,0,1,1,NA,NA,1,1,0,0.8 +45,Marburg virus,2759,Matthias,Short communication: a cluster of Marburg virus disease involving an infant,10.1046/j.1365-3156.2002.00945.x,Tropical Medicine & International Health,2002,7,10,902,906,FALSE,NA,Borchert,0,1,1,NA,NA,1,1,0,0.8 +46,Marburg virus,4657,Matthias,"Use of Protective Gear and the Occurrence of Occupational Marburg Hemorrhagic Fever in Health Workers from Watsa Health Zone, Democratic Republic of the Congo",10.1086/520540,The Journal of Infectious Diseases,2007,196,NA,168,175,FALSE,Serosurvey of surviving HCW who had treated patients with Marburg haemorrhagic fever during outbreak (Oct '98 - Sep '00),Borchert,0,1,1,NA,NA,0,1,0,0.6 +47,Marburg virus,1595,Fransje W.,Hemorrhagic fever virus infections in an isolated rainforest area of central Liberia. Limitations of the indirect immunofluorescence slide test for antibody screening in Africa,NA,Tropical and geographical medicine,1986,38,1,209,214,TRUE,"This is a small-sample (225) seroprevalence study with a focus on epileptics, to explore whether MBG and other HFVs are risk factors for epilepsy. The conclusion is negative, but it calculates some seroprevalence estimates",Van der Waals,1,1,1,NA,NA,0,0,0,0.4 48,Marburg virus,1649,Y,The origin and evolution of Ebola and Marburg viruses,10.1093/oxfordjournals.molbev.a025820,Molecular Biology and Evolution,1997,14,8,800,806,FALSE,"Nonsynonymous substitution rates only - couldn't do synonymous because such a large number of them. Parameter values are x10-4. -Some mutation rates were estimated to be negative so were not presented in the paper.",Suzuki,1,1,0,0,0,1,1,0,0.42857142857142855 -49,Marburg virus,4693,Jennifer,"Outbreak of Marburg Hemorrhagic Fever Among Miners in Kamwenge and Ibanda Districts, Uganda, 2007",10.1093/infdis/jir312,The Journal of Infectious Diseases,2011,204,NA,796,799,FALSE,Article appeared in Issue suppl_3. All infected individuals in outbreak were mineworkers in tunnel with bat population.,Adjemian,0,1,1,NA,NA,1,0,0,0.6 -50,Marburg virus,2032,A,Repeated outbreaks of Viral hemorrhagic fevers in Uganda,NA,African health sciences,2012,12,4,579,583,FALSE,Contains epidemic curve and CFR split by confirmed and suspected,Mbonye,1,1,0,0,0,0,0,0,0.14285714285714288 -51,Marburg virus,1649,Y,The origin and evolution of Ebola and Marburg viruses,NA,Molecular biology and evolution,1997,14,8,800,806,FALSE,Rates of non-synonymous substitutions. Table 4 compares substitution rates b/w viruses,Suzuki,1,1,0,0,0,1,1,0,0.42857142857142855 -52,Marburg virus,1692,D H,Marburg-virus disease in Kenya,NA,Lancet,1982,1,8276,816,820,TRUE,3 positive samples from hospital workers,Smith,1,1,1,NA,NA,0,0,0,0.4 +Some mutation rates were estimated to be negative so were not presented in the paper.",Suzuki,1,1,0,0,0,1,1,0,0.428571429 +49,Marburg virus,4693,Jennifer,"Outbreak of Marburg Hemorrhagic Fever Among Miners in Kamwenge and Ibanda Districts, Uganda, 2007",10.1093/infdis/jir312,The Journal of Infectious Diseases,2011,204,NA,796,799,FALSE,Article appeared in Issue suppl_3. All infected individuals in outbreak were mineworkers in tunnel with bat population.,Adjemian,0,1,1,NA,NA,1,0,0,0.6 +50,Marburg virus,2032,A,Repeated outbreaks of Viral hemorrhagic fevers in Uganda,NA,African health sciences,2012,12,4,579,583,FALSE,Contains epidemic curve and CFR split by confirmed and suspected,Mbonye,1,1,0,0,0,0,0,0,0.142857143 +51,Marburg virus,1649,Y,The origin and evolution of Ebola and Marburg viruses,NA,Molecular biology and evolution,1997,14,8,800,806,FALSE,Rates of non-synonymous substitutions. Table 4 compares substitution rates b/w viruses,Suzuki,1,1,0,0,0,1,1,0,0.428571429 +52,Marburg virus,1692,D H,Marburg-virus disease in Kenya,NA,Lancet,1982,1,8276,816,820,TRUE,3 positive samples from hospital workers,Smith,1,1,1,NA,NA,0,0,0,0.4 54,Marburg virus,1613,Jonathan S.,"Marburgvirus Genomics and Association with a Large Hemorrhagic -Fever Outbreak in Angola",10.1128/jvi.00069-06,Journal of Virology,2006,80,13,6497,6516,FALSE,Paper couldn't establish rateof mutation over tie for outbreka due to epidemiological link between the 11 patient samples not being established.,Towner,1,NA,NA,NA,NA,1,NA,NA,1 -55,Marburg virus,2600,B.K.,"Viral haemorrhagic fever surveillance in Kenya, 1980-1981",NA,Tropical and Geographical Medicine,1983,35,1,43,47,TRUE,NA,Johnson,0,1,1,NA,NA,1,0,NA,0.75 -56,Marburg virus,1927,Aileen,Serosurveillance of viral pathogens circulating in West Africa,10.1186/s12985-016-0621-4,Virology journal,2016,13,1,163,NA,FALSE,NA,O'Hearn,1,1,1,NA,NA,0,0,0,0.4 -57,Marburg virus,2819,Daniel,Marburg Hemorrhagic Fever Associated with Multiple Genetic Lineages of Virus,10.1056/NEJMoa051465,The New England journal of medicine,2006,355,9,909,919,FALSE,NA,Bausch,0,1,1,NA,NA,1,1,1,1 -58,Marburg virus,2822,Daniel,"Risk factors for Marburg hemorrhagic fever, Democratic Republic of the Congo",10.3201/eid0912.030355,Emerging infectious diseases,2003,9,12,1531,1537,FALSE,NA,Bausch,0,1,1,NA,NA,1,1,0,0.8 -59,Marburg virus,1613,Jonathan S.,Marburgvirus genomics and association with a large hemorrhagic fever outbreak in Angola,https://doi.org/10.1128/JVI.00069-06,Journal of Virology,2006,80,13,6497,6516,FALSE,"Only outbreak data was extracted from this paper, no data on parameters of interest identified",Towner,1,NA,NA,NA,NA,1,NA,NA,1 -60,Marburg virus,2573,J. Lyle,"Epidemiologic investigation of Marburg virus disease, Southern Africa, 1975",NA,The American journal of tropical medicine and hygiene,1978,27,6,1210,1215,TRUE,"This is not available online, but I requested a copy from the library and uploaded the pdf to Covidence. Only outbreak data was extracted, since there were no parameters of interest (using our wording) identified.",Conrad,0,NA,NA,NA,NA,1,NA,NA,1 -61,Marburg virus,1693,Tierra Smiley,Suspected Exposure to Filoviruses Among People Contacting Wildlife in Southwestern Uganda,10.1093/infdis/jiy251,The Journal of Infectious Diseases,2018,218,5,277,286,FALSE,NA,Evans,1,1,1,NA,NA,1,1,0,0.8 -62,Marburg virus,1871,Boris I,Calculation of incubation period and serial interval from multiple outbreaks of Marburg virus disease,10.1186/1756-0500-7-906,BMC Research Notes,2014,7,906,1,6,FALSE,This is a review of published cases - not original data as such - EXCLUDE?,Pavlin,1,0,0,0,0,1,0,0,0.14285714285714288 -63,Marburg virus,5648,S,Viral haemorrhagic fevers and malaria co-infections among febrile patients seeking health care in Tanzania,https://doi.org/10.1186/s40249-022-00959-z,Infectious Diseases of Poverty,2022,NA,NA,NA,NA,FALSE,NA,Rugarabamu,0,1,1,NA,NA,1,0,0,0.6 +Fever Outbreak in Angola",10.1128/jvi.00069-06,Journal of Virology,2006,80,13,6497,6516,FALSE,Paper couldn't establish rateof mutation over tie for outbreka due to epidemiological link between the 11 patient samples not being established.,Towner,1,NA,NA,NA,NA,1,NA,NA,1 +55,Marburg virus,2600,B.K.,"Viral haemorrhagic fever surveillance in Kenya, 1980-1981",NA,Tropical and Geographical Medicine,1983,35,1,43,47,TRUE,NA,Johnson,0,1,1,NA,NA,1,0,NA,0.75 +56,Marburg virus,1927,Aileen,Serosurveillance of viral pathogens circulating in West Africa,10.1186/s12985-016-0621-4,Virology journal,2016,13,1,163,NA,FALSE,NA,O'Hearn,1,1,1,NA,NA,0,0,0,0.4 +57,Marburg virus,2819,Daniel,Marburg Hemorrhagic Fever Associated with Multiple Genetic Lineages of Virus,10.1056/NEJMoa051465,The New England journal of medicine,2006,355,9,909,919,FALSE,NA,Bausch,0,1,1,NA,NA,1,1,1,1 +58,Marburg virus,2822,Daniel,"Risk factors for Marburg hemorrhagic fever, Democratic Republic of the Congo",10.3201/eid0912.030355,Emerging infectious diseases,2003,9,12,1531,1537,FALSE,NA,Bausch,0,1,1,NA,NA,1,1,0,0.8 +59,Marburg virus,1613,Jonathan S.,Marburgvirus genomics and association with a large hemorrhagic fever outbreak in Angola,https://doi.org/10.1128/JVI.00069-06,Journal of Virology,2006,80,13,6497,6516,FALSE,"Only outbreak data was extracted from this paper, no data on parameters of interest identified",Towner,1,NA,NA,NA,NA,1,NA,NA,1 +60,Marburg virus,2573,J. Lyle,"Epidemiologic investigation of Marburg virus disease, Southern Africa, 1975",NA,The American journal of tropical medicine and hygiene,1978,27,6,1210,1215,TRUE,"This is not available online, but I requested a copy from the library and uploaded the pdf to Covidence. Only outbreak data was extracted, since there were no parameters of interest (using our wording) identified.",Conrad,0,NA,NA,NA,NA,1,NA,NA,1 +61,Marburg virus,1693,Tierra Smiley,Suspected Exposure to Filoviruses Among People Contacting Wildlife in Southwestern Uganda,10.1093/infdis/jiy251,The Journal of Infectious Diseases,2018,218,5,277,286,FALSE,NA,Evans,1,1,1,NA,NA,1,1,0,0.8 +62,Marburg virus,1871,Boris I,Calculation of incubation period and serial interval from multiple outbreaks of Marburg virus disease,10.1186/1756-0500-7-906,BMC Research Notes,2014,7,906,1,6,FALSE,This is a review of published cases - not original data as such - EXCLUDE?,Pavlin,1,0,0,0,0,1,0,0,0.142857143 +63,Marburg virus,5648,S,Viral haemorrhagic fevers and malaria co-infections among febrile patients seeking health care in Tanzania,https://doi.org/10.1186/s40249-022-00959-z,Infectious Diseases of Poverty,2022,NA,NA,NA,NA,FALSE,NA,Rugarabamu,0,1,1,NA,NA,1,0,0,0.6 \ No newline at end of file diff --git a/data/marburg_dropdown_models.csv b/inst/extdata/marburg_dropdown_models.csv similarity index 100% rename from data/marburg_dropdown_models.csv rename to inst/extdata/marburg_dropdown_models.csv diff --git a/data/marburg_dropdown_outbreaks.csv b/inst/extdata/marburg_dropdown_outbreaks.csv similarity index 89% rename from data/marburg_dropdown_outbreaks.csv rename to inst/extdata/marburg_dropdown_outbreaks.csv index f6dec3f..9740919 100644 --- a/data/marburg_dropdown_outbreaks.csv +++ b/inst/extdata/marburg_dropdown_outbreaks.csv @@ -1,220 +1,220 @@ -Outbreak country,Detection mode -Afghanistan,Symptoms -Albania,Molecular (PCR etc) -Algeria,Not specified -American Samoa, -Andorra, -Angola, -Antigua and Barbuda, -Argentina, -Armenia, -Aruba, -Australia, -Austria, -Azerbaijan, -"Bahamas, The", -Bahrain, -Bangladesh, -Barbados, -Belarus, -Belgium, -Belize, -Benin, -Bermuda, -Bhutan, -Bolivia, -Bosnia and Herzegovina, -Botswana, -Brazil, -British Virgin Islands, -Brunei Darussalam, -Bulgaria, -Burkina Faso, -Burundi, -Cabo Verde, -Cambodia, -Cameroon, -Canada, -Cayman Islands, -Central African Republic, -Chad, -Channel Islands, -Chile, -China, -Colombia, -Comoros, -"Congo, Dem. Rep.", -"Congo, Rep.", -Costa Rica, -Côte d'Ivoire, -Croatia, -Cuba, -Curaçao, -Cyprus, -Czech Republic, -Denmark, -Djibouti, -Dominica, -Dominican Republic, -Ecuador, -"Egypt, Arab Rep.", -El Salvador, -Equatorial Guinea, -Eritrea, -Estonia, -Eswatini, -Ethiopia, -Faroe Islands, -Fiji, -Finland, -France, -French Polynesia, -Gabon, -"Gambia, The", -Georgia, -Germany, -Ghana, -Gibraltar, -Greece, -Greenland, -Grenada, -Guam, -Guatemala, -Guinea, -Guinea-Bissau, -Guyana, -Haiti, -Honduras, -"Hong Kong SAR, China", -Hungary, -Iceland, -India, -Indonesia, -"Iran, Islamic Rep.", -Iraq, -Ireland, -Isle of Man, -Israel, -Italy, -Jamaica, -Japan, -Jordan, -Kazakhstan, -Kenya, -Kiribati, -"Korea, Dem. People's Rep.", -"Korea, Rep.", -Kosovo, -Kuwait, -Kyrgyz Republic, -Lao PDR, -Latvia, -Lebanon, -Lesotho, -Liberia, -Libya, -Liechtenstein, -Lithuania, -Luxembourg, -"Macao SAR, China", -Madagascar, -Malawi, -Malaysia, -Maldives, -Mali, -Malta, -Marshall Islands, -Mauritania, -Mauritius, -Mexico, -"Micronesia, Fed. Sts.", -Moldova, -Monaco, -Mongolia, -Montenegro, -Morocco, -Mozambique, -Myanmar, -Namibia, -Nauru, -Nepal, -Netherlands, -New Caledonia, -New Zealand, -Nicaragua, -Niger, -Nigeria, -North Macedonia, -Northern Mariana Islands, -Norway, -Oman, -Pakistan, -Palau, -Panama, -Papua New Guinea, -Paraguay, -Peru, -Philippines, -Poland, -Portugal, -Puerto Rico, -Qatar, -Romania, -Russian Federation, -Rwanda, -Samoa, -San Marino, -São Tomé and Principe, -Saudi Arabia, -Senegal, -Serbia, -Seychelles, -Sierra Leone, -Singapore, -Sint Maarten (Dutch part), -Slovak Republic, -Slovenia, -Solomon Islands, -Somalia, -South Africa, -South Sudan, -Spain, -Sri Lanka, -St. Kitts and Nevis, -St. Lucia, -St. Martin (French part), -St. Vincent and the Grenadines, -Sudan, -Suriname, -Sweden, -Switzerland, -Syrian Arab Republic, -"Taiwan, China", -Tajikistan, -Tanzania, -Thailand, -Timor Leste, -Togo, -Tonga, -Trinidad and Tobago, -Tunisia, -Turkey, -Turkmenistan, -Turks and Caicos Islands, -Tuvalu, -Uganda, -Ukraine, -United Arab Emirates, -United Kingdom, -United States, -Uruguay, -Uzbekistan, -Vanuatu, -Venezuela, -Vietnam, -Virgin Islands, -West Bank and Gaza, -Yemen, -Yuogslavia, -Zambia, -Zimbabwe, +Outbreak country,Detection mode +Afghanistan,Symptoms +Albania,Molecular (PCR etc) +Algeria,Not specified +American Samoa, +Andorra, +Angola, +Antigua and Barbuda, +Argentina, +Armenia, +Aruba, +Australia, +Austria, +Azerbaijan, +"Bahamas, The", +Bahrain, +Bangladesh, +Barbados, +Belarus, +Belgium, +Belize, +Benin, +Bermuda, +Bhutan, +Bolivia, +Bosnia and Herzegovina, +Botswana, +Brazil, +British Virgin Islands, +Brunei Darussalam, +Bulgaria, +Burkina Faso, +Burundi, +Cabo Verde, +Cambodia, +Cameroon, +Canada, +Cayman Islands, +Central African Republic, +Chad, +Channel Islands, +Chile, +China, +Colombia, +Comoros, +"Congo, Dem. Rep.", +"Congo, Rep.", +Costa Rica, +C\u00F4te d'Ivoire, +Croatia, +Cuba, +Cura\u00E7ao, +Cyprus, +Czech Republic, +Denmark, +Djibouti, +Dominica, +Dominican Republic, +Ecuador, +"Egypt, Arab Rep.", +El Salvador, +Equatorial Guinea, +Eritrea, +Estonia, +Eswatini, +Ethiopia, +Faroe Islands, +Fiji, +Finland, +France, +French Polynesia, +Gabon, +"Gambia, The", +Georgia, +Germany, +Ghana, +Gibraltar, +Greece, +Greenland, +Grenada, +Guam, +Guatemala, +Guinea, +Guinea-Bissau, +Guyana, +Haiti, +Honduras, +"Hong Kong SAR, China", +Hungary, +Iceland, +India, +Indonesia, +"Iran, Islamic Rep.", +Iraq, +Ireland, +Isle of Man, +Israel, +Italy, +Jamaica, +Japan, +Jordan, +Kazakhstan, +Kenya, +Kiribati, +"Korea, Dem. People's Rep.", +"Korea, Rep.", +Kosovo, +Kuwait, +Kyrgyz Republic, +Lao PDR, +Latvia, +Lebanon, +Lesotho, +Liberia, +Libya, +Liechtenstein, +Lithuania, +Luxembourg, +"Macao SAR, China", +Madagascar, +Malawi, +Malaysia, +Maldives, +Mali, +Malta, +Marshall Islands, +Mauritania, +Mauritius, +Mexico, +"Micronesia, Fed. Sts.", +Moldova, +Monaco, +Mongolia, +Montenegro, +Morocco, +Mozambique, +Myanmar, +Namibia, +Nauru, +Nepal, +Netherlands, +New Caledonia, +New Zealand, +Nicaragua, +Niger, +Nigeria, +North Macedonia, +Northern Mariana Islands, +Norway, +Oman, +Pakistan, +Palau, +Panama, +Papua New Guinea, +Paraguay, +Peru, +Philippines, +Poland, +Portugal, +Puerto Rico, +Qatar, +Romania, +Russian Federation, +Rwanda, +Samoa, +San Marino, +S\u00E3o Tom\u00E9 and Pr\u00EDncipe, +Saudi Arabia, +Senegal, +Serbia, +Seychelles, +Sierra Leone, +Singapore, +Sint Maarten (Dutch part), +Slovak Republic, +Slovenia, +Solomon Islands, +Somalia, +South Africa, +South Sudan, +Spain, +Sri Lanka, +St. Kitts and Nevis, +St. Lucia, +St. Martin (French part), +St. Vincent and the Grenadines, +Sudan, +Suriname, +Sweden, +Switzerland, +Syrian Arab Republic, +"Taiwan, China", +Tajikistan, +Tanzania, +Thailand, +Timor Leste, +Togo, +Tonga, +Trinidad and Tobago, +Tunisia, +Turkey, +Turkmenistan, +Turks and Caicos Islands, +Tuvalu, +Uganda, +Ukraine, +United Arab Emirates, +United Kingdom, +United States, +Uruguay, +Uzbekistan, +Vanuatu, +Venezuela, +Vietnam, +Virgin Islands, +West Bank and Gaza, +Yemen, +Yuogslavia, +Zambia, +Zimbabwe, \ No newline at end of file diff --git a/data/marburg_dropdown_parameters.csv b/inst/extdata/marburg_dropdown_parameters.csv similarity index 91% rename from data/marburg_dropdown_parameters.csv rename to inst/extdata/marburg_dropdown_parameters.csv index 11fa984..161ec5c 100644 --- a/data/marburg_dropdown_parameters.csv +++ b/inst/extdata/marburg_dropdown_parameters.csv @@ -1,7 +1,7 @@ Population Country,Parameter type,Units,Parameter uncertainty - single type,Parameter uncertainty - paired type,Distribution type,Distribution parameter 1 - type,Distribution parameter 2 - type,Disaggregated by,Sex,Setting,Group,Timing,Reproduction number method,Time from,Time to,IFR_CFR_method,Riskfactor outcome,Riskfactor name,Riskfactor occupation,Riskfactor significant,Riskfactor adjusted -Afghanistan,Mutations – mutation rate,Percentage (%),Standard Error (SE),CI90%,Bernoulli,Shape,Shape,Age,Female,Community based,Healthcare workers,Start outbreak,Renewal equations / Branching process,Exposure/Infection,Exposure/Infection,Naive,Infection,Age,Abattoir services,Significant,Adjusted +Afghanistan,Mutations - mutation rate,Percentage (%),Standard Error (SE),CI90%,Bernoulli,Shape,Shape,Age,Female,Community based,Healthcare workers,Start outbreak,Renewal equations / Branching process,Exposure/Infection,Exposure/Infection,Naive,Infection,Age,Abattoir services,Significant,Adjusted Albania,Mutations - evolutionary rate,Per hour,Standard deviation (Sd),CI95%,Beta,Scale,Scale,Disease generation,Male,Hospital based,Farmers,Mid outbreak,Growth rate,Infectiousness,Infectiousness,Adjusted,Severe disease,Close contact,Correctional facilities,Not significant ,Not adjusted -Algeria,Mutations – substitution rate,Per day,Variance,CRI90%,Beta-Binomial,Mean,Mean,Level of exposure,Both,Household based,Outdoor workers,End outbreak,Compartmental model,Symptom Onset/Fever,Symptom Onset/Fever,Unspecified,Death,Contact with animal,Education,Unspecified,Unspecified +Algeria,Mutations - substitution rate,Per day,Variance,CRI90%,Beta-Binomial,Mean,Mean,Level of exposure,Both,Household based,Outdoor workers,End outbreak,Compartmental model,Symptom Onset/Fever,Symptom Onset/Fever,Unspecified,Death,Contact with animal,Education,Unspecified,Unspecified American Samoa,Growth rate (r),Per week,Coefficient of variation,CRI95%,Cauchy,Coefficient of variation,Coefficient of variation,Occupation,Unspecified,Housing estate based,Animal workers,Post outbreak,Next generation matrix,Seeking Care,Seeking Care,,Recovery,Cormobidity,Funeral and burial services,, Andorra,Doubling time,Per month,Other,Range,Cauchy-half,Variance,Variance,Region,,Population based,Butchers,Endemic,Empirical (contact tracing),Admission to Care/Hospitalisation,Admission to Care/Hospitalisation,,Serology,Funeral,Healthcare,, Angola,Halving time,Per year,,Inter Quartile Range (IQR),Chi-Square-Inverse,Meanlog,Meanlog,Sex,,School based,Abattoir workers,Unspecified,Genomics,Admission to Critical Care/ICU,Admission to Critical Care/ICU,,Other,Hospitalisation,Laboratory,, @@ -46,10 +46,10 @@ Comoros,,,,,,,,,,,,,,,,,,,,, "Congo, Dem. Rep.",,,,,,,,,,,,,,,,,,,,, "Congo, Rep.",,,,,,,,,,,,,,,,,,,,, Costa Rica,,,,,,,,,,,,,,,,,,,,, -Côte d'Ivoire,,,,,,,,,,,,,,,,,,,,, +C\u00F4te d'Ivoire,,,,,,,,,,,,,,,,,,,,, Croatia,,,,,,,,,,,,,,,,,,,,, Cuba,,,,,,,,,,,,,,,,,,,,, -Curaçao,,,,,,,,,,,,,,,,,,,,, +Cura\u00E7ao,,,,,,,,,,,,,,,,,,,,, Cyprus,,,,,,,,,,,,,,,,,,,,, Czech Republic,,,,,,,,,,,,,,,,,,,,, Denmark,,,,,,,,,,,,,,,,,,,,, @@ -164,7 +164,7 @@ Russian Federation,,,,,,,,,,,,,,,,,,,,, Rwanda,,,,,,,,,,,,,,,,,,,,, Samoa,,,,,,,,,,,,,,,,,,,,, San Marino,,,,,,,,,,,,,,,,,,,,, -São Tomé and Principe,,,,,,,,,,,,,,,,,,,,, +S\u00E3o Tom\u00E9 and Pr\u00EDncipe,,,,,,,,,,,,,,,,,,,,, Saudi Arabia,,,,,,,,,,,,,,,,,,,,, Senegal,,,,,,,,,,,,,,,,,,,,, Serbia,,,,,,,,,,,,,,,,,,,,, diff --git a/data/marburg_model.csv b/inst/extdata/marburg_model.csv similarity index 96% rename from data/marburg_model.csv rename to inst/extdata/marburg_model.csv index f8e0804..3adf64e 100644 --- a/data/marburg_model.csv +++ b/inst/extdata/marburg_model.csv @@ -1,2 +1,2 @@ model_data_id,article_id,model_type,compartmental_type,stoch_deter,theoretical_model,interventions_type,code_available,transmission_route,assumptions,covidence_id -1,27,Agent / Individual based,SEIR,Stochastic,TRUE,Behaviour changes;Quarantine,FALSE,Human to human (direct non-sexual contact),Age dependent susceptibility;Heterogenity in transmission rates - over time;Homogeneous mixing;Latent period is same as incubation period,2886 \ No newline at end of file +1,27,Agent / Individual based,SEIR,Stochastic,TRUE,Behaviour changes;Quarantine,FALSE,Human to human (direct non-sexual contact),Age dependent susceptibility;Heterogenity in transmission rates - over time;Homogeneous mixing;Latent period is same as incubation period,2886 diff --git a/data/marburg_outbreak.csv b/inst/extdata/marburg_outbreak.csv similarity index 98% rename from data/marburg_outbreak.csv rename to inst/extdata/marburg_outbreak.csv index 0dc04ba..1586e07 100644 --- a/data/marburg_outbreak.csv +++ b/inst/extdata/marburg_outbreak.csv @@ -21,4 +21,4 @@ outbreak_id,article_id,outbreak_start_day,outbreak_start_month,outbreak_start_ye 24,62,NA,NA,1990,NA,NA,NA,NA,NA,FALSE,Russian Federation,NA,1,NA,NA,NA,0,NA,1871 27,62,NA,NA,2007,NA,NA,NA,NA,NA,FALSE,Uganda,NA,4,NA,NA,NA,2,NA,1871 28,62,NA,NA,2008,NA,NA,NA,NA,NA,FALSE,United States,Colorado,1,NA,NA,NA,0,NA,1871 -29,62,NA,NA,2008,NA,NA,NA,NA,NA,FALSE,Netherlands,NA,1,NA,NA,NA,1,NA,1871 \ No newline at end of file +29,62,NA,NA,2008,NA,NA,NA,NA,NA,FALSE,Netherlands,NA,1,NA,NA,NA,1,NA,1871 diff --git a/data/marburg_parameter.csv b/inst/extdata/marburg_parameter.csv similarity index 97% rename from data/marburg_parameter.csv rename to inst/extdata/marburg_parameter.csv index 346a767..92b6cbe 100644 --- a/data/marburg_parameter.csv +++ b/inst/extdata/marburg_parameter.csv @@ -22,7 +22,7 @@ parameter_data_id,article_id,parameter_type,parameter_value,parameter_unit,param 45,27,Human delay - time symptom to outcome,9,Days,NA,NA,Median,NA,NA,0,56,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Death,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886,0 - 56,Mar-Nov 2005 46,27,Growth rate (r),0.056,Per day,NA,NA,Mean,NA,NA,0.0508,0.0612,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,TRUE,Other transmission parameters,2886,"0.0508, 0.0612",Mar-Nov 2005 48,27,Doubling time,12.4,Days,NA,NA,Mean,NA,NA,11.3,13.6,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,TRUE,Other transmission parameters,2886,"11.3, 13.6",Mar-Nov 2005 -50,33,Mutations – substitution rate,2,Substitutions/site/year,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,TRUE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,60,Angola;Democratic Republic of the Congo;Germany;Kenya;Netherlands;Uganda;Zimbabwe,NA,NA,NA,1967,NA,NA,2009,NA,FALSE,Mutations,2696,NA,1967-2009 +50,33,Mutations - substitution rate,2,Substitutions/site/year,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,TRUE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,60,Angola;Democratic Republic of the Congo;Germany;Kenya;Netherlands;Uganda;Zimbabwe,NA,NA,NA,1967,NA,NA,2009,NA,FALSE,Mutations,2696,NA,1967-2009 52,27,Reproduction number (Basic R0),1.59,No units,NA,NA,Mean,NA,NA,1.53,1.66,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,Growth rate,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Reproduction number,2886,"1.53, 1.66",Mar-Nov 2005 53,27,Severity - case fatality rate (CFR),88,Percentage (%),NA,NA,Mean,NA,NA,84,91,CI95%,329,374,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Severity,2886,"84, 91",Mar-Nov 2005 54,35,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Infection,Contact with animal;Other,NA,Significant,Unknown,NA,NA,NA,NA,NA,NA,Uganda,"Python cave, Kitake mine",NA,NA,NA,NA,NA,NA,NA,FALSE,Risk factors,2869,NA,NA @@ -48,7 +48,7 @@ parameter_data_id,article_id,parameter_type,parameter_value,parameter_unit,param 92,58,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Serology,Contact with animal;Household contact;Occupation,Funeral and burrial services,Not significant,Adjusted,Both,Population based,NA,14,79,912,Democratic Republic of the Congo,"Durba, Watsa",NA,May,1999,NA,May,1999,NA,FALSE,Risk factors,2822,NA,May-99 94,58,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Serology,Hospitalisation,NA,Significant,Adjusted,Both,Population based,NA,14,79,915,Democratic Republic of the Congo,NA,NA,May,1999,NA,May,1999,NA,FALSE,Risk factors,2822,NA,May-99 100,42,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Infection,Other;Sex,NA,Not significant,Unknown,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Risk factors,2241,NA,2012 -101,63,Seroprevalence - IgM,0.3,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,1,308,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,Unknown,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Hospital based,NA,NA,NA,308,Tanzania,Buhigwe = 33; Kalambo = 31; Kyela = 48; Kilindi = 31; Kinondoni = 39; Kondoa = 32; Mvomero = 49; Ukerewe = 45,NA,Jun,2018,NA,Nov,2018,NA,FALSE,Seroprevalence,5648,NA,Jun-Nov 2018 +101,63,Seroprevalence - IgM,0.3,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,1,308,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,Unknown,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Hospital based,NA,NA,NA,308,Tanzania,Buhigwe; Kalambo; Kyela; Kilindi; Kinondoni; Kondoa; Mvomero; Ukerewe,NA,Jun,2018,NA,Nov,2018,NA,FALSE,Seroprevalence,5648,NA,Jun-Nov 2018 106,20,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,79,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Other,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,TRUE,Seroprevalence,2060,NA,NA 55,36,Mutations - evolutionary rate,0.00033,Substitutions/site/year,NA,NA,Mean,NA,NA,2.00E-04,0.00048,Highest Posterior Density Interval 95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,TRUE,Mutations,1483,2e-04 - 0.00048,NA 76,48,Mutations - mutation rate,3.80E-05,Substitutions/site/year,NA,NA,NA,0.000469,Standard Error (SE),NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2,"Germany, Kenya",Marburg,NA,NA,1967,NA,NA,1980,VP30,FALSE,Mutations,1649,NA,1967-1980 diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index 872c12c..a1f392a 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -83,12 +83,12 @@ forest_plot_r(df) ```{r cfr_panel_A, echo=FALSE, fig.height=4, fig.width=9, message=FALSE, warning=FALSE} df <- data_forest_plots(pathogen = "marburg", exclude = c(15, 17)) -file_path_ob <- system.file("data", "marburg_outbreak.csv", package = "epireview") -if(file_path_ob=="") file_path_ob <- paste0('../data/marburg_outbreak.csv') +file_path_ob <- system.file("extdata", "marburg_outbreak.csv", package = "epireview") +if(file_path_ob=="") file_path_ob <- paste0('../extdata/marburg_outbreak.csv') outbreak <- read_csv(file_path_ob) -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') +file_path_ar <- system.file("extdata","marburg_article.csv", package = "epireview") +if(file_path_ar=="") file_path_ar <- paste0('../extdata/marburg_article.csv') articles <- read_csv(file_path_ar) df_out <- left_join(outbreak, articles %>% dplyr::select(covidence_id, first_author_surname, year_publication), by = "covidence_id") %>% @@ -183,12 +183,12 @@ forest_plot_delay(df) **Table 4:** Overview of seroprevalence estimates as reported in the included studies. Estimates were primarily reported as percentages, as shown here. Associated uncertainty and sample sizes are provided where these were reported. Where available, additional information regarding the location and timing of the estimates, the antibody being tested for, the target population, the timing in relation to any ongoing outbreak and the availability of disaggregated data is also summarised. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_pa <- system.file("data", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../data/marburg_parameter.csv') +file_path_pa <- system.file("extdata", "marburg_parameter.csv", package = "epireview") +if(file_path_pa=="") file_path_pa <- paste0('../extdata/marburg_parameter.csv') params <- read_csv(file_path_pa) -file_path_ar <- system.file("data","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../data/marburg_article.csv') +file_path_ar <- system.file("extdata","marburg_article.csv", package = "epireview") +if(file_path_ar=="") file_path_ar <- paste0('../extdata/marburg_article.csv') articles <- read_csv(file_path_ar) df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname,year_publication), by="article_id") %>% @@ -229,7 +229,7 @@ risk_table(df,'marburg',supplement=TRUE) **Figure S3:** (A) Count of papers for each quality assessment question scoring Yes, No or not applicable. (B) Quality Assessment Score defined as proportion of Yes votes for each paper relative to sum of Yes and No answers, removing NAs. The time trend is fitted using Local Polynomial Regression Fitting. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -test <- system.file("data", "marburg_outbreak.csv", package = "epireview") +test <- system.file("extdata", "marburg_outbreak.csv", package = "epireview") if(test=="") file_prepend = "../" else file_prepend = "" quality_assessment_plots(pathogen = "marburg",prepend = file_prepend) From 0af37dd32ad0f62922929cbb4910bab722f0288b Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Wed, 19 Jul 2023 18:29:49 +0100 Subject: [PATCH 36/40] vignette edits --- vignettes/epireview_overview.Rmd | 16 +- vignettes/pathogen_database_update.Rmd | 285 ++++++++++++++----------- vignettes/pathogen_marburg.Rmd | 47 ++-- 3 files changed, 185 insertions(+), 163 deletions(-) diff --git a/vignettes/epireview_overview.Rmd b/vignettes/epireview_overview.Rmd index 3488a59..9cb2719 100644 --- a/vignettes/epireview_overview.Rmd +++ b/vignettes/epireview_overview.Rmd @@ -1,23 +1,23 @@ --- -title: "Epireview" +title: "epireview" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteEngine{knitr::rmarkdown} - %\VignetteIndexEntry{Epireview} + %\VignetteIndexEntry{epireview} %\usepackage[utf8]{inputenc} --- -We developed the R package ***epireview*** to provide a central location to host and access the extracted data for the nine priority pathogens, allow for submissions of outbreak, model, and parameter data from new peer-reviewed papers via pull requests, and includes functions to produce the figures and tables included in this paper and update them with any additional data. This package will be updated as the overall project by the Pathogen Epidemiology Review Group (PERG) continues to extract modelling parameters for the rest of the nine priority pathogens as defined by WHO. +***epireview*** contains the latest open access pathogen data from the Pathogen Epidemiology Review Group (PERG), who aim to extract modelling parameters for nine priority pathogens as defined by WHO. This R package contains tools to update pathogen databases with new peer-reviewed data as it becomes available, and to summarise the latest data using tables and figures. There are several vignettes available: -- [**Marburg Virus Disease (MVD)**]() with tables and figures from this paper that will be updated as data are added to the database. +- [**Marburg Virus Disease (MVD)**]() with tables and figures from this paper that will be updated as new data are added to the database. -- [**Pathogen database options**]() that lists the options for each model, outbreak, or parameter field and describes how to access them using a function in the package. +- [**Pathogen database options**]() which lists the options for each model, outbreak, or parameter field and describes how to access them using a function in the package. -- [**How to update database with new article data**](https://mrc-ide.github.io/epireview/articles/pathogen_database_update.html)to explain the process of updating the database with new article, model, outbreak, or pathogen data. +- [**How to update the database with new article data**](https://mrc-ide.github.io/epireview/articles/pathogen_database_update.html) to explain the process of updating the database with new article, model, outbreak, or pathogen data. -In addition to this the github repo has a [**wiki**]() which provides details on the data extraction together with examples and an overview of the quality assessment. +In addition to this, the github repo has a [**wiki**]() which provides details on the data extraction process together with examples and an overview of the quality assessment measures. -We also provide an empty [access database file]() which can be used as a starting point for any new pathogens which are not already covered by this review. For updates to the existing datasets please follow the [*How to update the database with new article data*](https://mrc-ide.github.io/epireview/articles/pathogen_database_update.html)guide. +We also provide an empty [access database file]() which can be used as a starting point for any new pathogens which are not already covered by this review. For updates to the existing datasets please follow the [*How to update the database with new article data*](https://mrc-ide.github.io/epireview/articles/pathogen_database_update.html) guide. diff --git a/vignettes/pathogen_database_update.Rmd b/vignettes/pathogen_database_update.Rmd index 52b1011..f584ed9 100644 --- a/vignettes/pathogen_database_update.Rmd +++ b/vignettes/pathogen_database_update.Rmd @@ -1,5 +1,5 @@ --- -title: "How to update database with new article data" +title: "How to update the database with new article data" date: "Latest update: June 2023" output: rmarkdown::html_vignette: @@ -10,15 +10,15 @@ vignette: > %\usepackage[utf8]{inputenc} --- -As new articles on WHO priority pathogens are published we provide the ability for people to update the database with new data. New data will be represented as new rows in the four data sets (articles, outbreaks, parameters and models) and any new article will have a new row in the articles dataset and potentially multiple rows in any of the others. We would suggest the below process to add new data, however the only requirement is a submission of a pull request with the updated csv files together with details of the peer-reviewed paper which is being added. The paper should conform with the inclusion and exclusion criteria of the underlying systematic review. +We provide the ability for people to update the database with new data as it becomes available. New data will be represented as a new row in the article data set, and potentially multiple new rows in the other three data sets (outbreaks, parameters and models). We suggest the below process to add new data, however the only requirement is the submission of a pull request, with the updated csv files together with details of the peer-reviewed paper which is being added. The paper must conform with the inclusion and exclusion criteria of the underlying systematic review. ## Step 1 -- git clone repo -Please clone the git repository ``git clone https://github.com/mrc-ide/epireview.git`` and create a new branch to add data for the paper(s) +Please clone the git repository ``git clone https://github.com/mrc-ide/epireview.git`` and create a new branch to add data for the paper(s). ## Step 2 -- add article details -Please provide all available data for the article. For the quality assessment we refer to the wiki on the [epireview github repo](https://github.com/mrc-ide/epireview/wiki/Quality-assessment) which has details on how to assess quality for paper (the score should be 0, 1 or NA if not applicable). +Please provide all available data for the article. For the quality assessment, we refer to the wiki on the [epireview github repo](https://github.com/mrc-ide/epireview/wiki/Quality-assessment), which provides details for how to assess the quality of papers (the score should be 0, 1 or NA if not applicable). ```{r add article, eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} # load packages and source code @@ -28,39 +28,46 @@ source('R/create_new_article_entry.R') source('R/append_new_entry_to_table.R') source('R/load_epidata.R') -new_article <- create_new_article_entry('marburg',new_article = c( list( "first_author_first_name" = as.character("Joe")), - list( "first_author_surname" = as.character("Blocks")), - list( "article_title" = as.character("hello")), - list( "doi" = as.character(NA)), - list( "journal" = as.character("ABC")), - list( "year_publication" = as.integer(2000)), - list( "volume" = as.integer(NA)), - list( "issue" = as.integer(NA)), - list( "page_first" = as.integer(NA)), - list( "page_last" = as.integer(NA)), - list( "paper_copy_only" = as.logical(NA)), - list( "notes" = as.character(NA)), - list( "qa_m1" = as.integer(1)), - list( "qa_m2" = as.integer(0)), - list( "qa_a3" = as.integer(NA)), - list( "qa_a4" = as.integer(1)), - list( "qa_d5" = as.integer(0)), - list( "qa_d6" = as.integer(NA)), - list( "qa_d7" = as.integer(1))), - vignette_prepend = "") +new_article <- + create_new_article_entry( + pathogen = "marburg", + new_article = c(list("first_author_first_name" = as.character("Joe")), + list("first_author_surname" = as.character("Blocks")), + list("article_title" = as.character("hello")), + list("doi" = as.character(NA)), + list("journal" = as.character("ABC")), + list("year_publication" = as.integer(2000)), + list("volume" = as.integer(NA)), + list("issue" = as.integer(NA)), + list("page_first" = as.integer(NA)), + list("page_last" = as.integer(NA)), + list("paper_copy_only" = as.logical(NA)), + list("notes" = as.character(NA)), + list("qa_m1" = as.integer(1)), + list("qa_m2" = as.integer(0)), + list("qa_a3" = as.integer(NA)), + list("qa_a4" = as.integer(1)), + list("qa_d5" = as.integer(0)), + list("qa_d6" = as.integer(NA)), + list("qa_d7" = as.integer(1))), + vignette_prepend = "") ``` -This creates a new entry for this article. We enforce that first author initial or first name, surname, article title, journal and year of publication needs to be provided. Please take note of the `article_id` and `covidence_id` as you will need these to link any parameters, outbreaks or models to this paper. This can be appended to the articles dataset by running the following command (which included validations for the data provided): +This creates a new entry for this article. We enforce that the first author's first name (or initials), first author's surname, article title, journal, and year of publication, needs to be provided. Please take note of the `article_id` and `covidence_id` as you will need these to link any parameters, outbreaks and models to this paper. This can be appended to the article dataset by running the following command (which includes validations for the data provided): ```{r eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} -new_article_dataset <- append_new_entry_to_table(pathogen = 'marburg', table_type = 'article', new_row = new_article, - validate = TRUE, write_table = TRUE, vignette_prepend = "" ) +new_article_dataset <- append_new_entry_to_table(pathogen = "marburg", + table_type = "article", + new_row = new_article, + validate = TRUE, + write_table = TRUE, + vignette_prepend = "") ``` ## Step 3 -- add model details -If the paper does not include a model you can skip this section. For this table we have a set number of field options which can be accepted. These field options can be viewed in the `Database field options` vignette. The validations in the function will assert that valid options have been used. +If the paper does not include a model you can skip this section. For the model table we have a set number of field options which can be accepted. These field options can be viewed in the `Database field options` vignette. The validations in the function will assert that valid options have been used. ```{r add model, eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} # load packages and source code @@ -68,30 +75,36 @@ library(tidyverse) library(validate) source('R/create_new_model_entry.R') -new_model <- create_new_model_entry('marburg',c( list( "article_id" = as.integer(1)), - list( "model_type" = as.character("Compartmental")), - list( "compartmental_type" = as.character("SEIR,SIR")), - list( "stoch_deter" = as.character("Deterministic")), - list( "theoretical_model" = as.logical(FALSE)), - list( "interventions_type" = as.character("Vaccination")), - list( "code_available" = as.logical(TRUE)), - list( "transmission_route" = as.character("Sexual")), - list( "assumptions" = as.character("Unspecified")), - list( "covidence_id" = as.integer(2059))), - vignette_prepend = "") +new_model <- create_new_model_entry( + pathogen = "marburg", + new_model = c(list("article_id" = as.integer(1)), + list("model_type" = as.character("Compartmental")), + list("compartmental_type" = as.character("SEIR, SIR")), + list("stoch_deter" = as.character("Deterministic")), + list("theoretical_model" = as.logical(FALSE)), + list("interventions_type" = as.character("Vaccination")), + list("code_available" = as.logical(TRUE)), + list("transmission_route" = as.character("Sexual")), + list("assumptions" = as.character("Unspecified")), + list("covidence_id" = as.integer(2059))), + vignette_prepend = "") ``` -If you would like to add multiple models it is important to add each model first to the dataset before adding an additional one in order to ensure that the `model_data_id` is set correctly. +If you would like to add multiple models, it is important to add each model sequentially in order to ensure that the `model_data_id` is set correctly. ```{r eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} -new_model_dataset <- append_new_entry_to_table(pathogen = 'marburg', table_type = 'model', new_row = new_model, - validate = TRUE, write_table = TRUE, vignette_prepend = "" ) +new_model_dataset <- append_new_entry_to_table(pathogen = "marburg", + table_type = "model", + new_row = new_model, + validate = TRUE, + write_table = TRUE, + vignette_prepend = "") ``` ## Step 4 -- add outbreak details -If the paper does not include a model you can skip this section. For this table we have a set number of field options which can be accepted. These field options can be viewed in the `Database field options` vignette. The validations in the function will assert that valid options have been used. +If the paper does not include an outbreak you can skip this section. For this table we have a set number of field options which can be accepted. These field options can be viewed in the `Database field options` vignette. The validations in the function will assert that valid options have been used. ```{r add outbreak, eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} # load packages and source code @@ -99,40 +112,46 @@ library(tidyverse) library(validate) source('R/create_new_outbreak_entry.R') -new_outbreak <- create_new_outbreak_entry('marburg',new_outbreak = c( list( "article_id" = as.integer(1)), - list( "outbreak_start_day" = as.integer(NA)), - list( "outbreak_start_month" = as.character(NA)), - list( "outbreak_start_year" = as.integer(1999)), - list( "outbreak_end_day" = as.integer(NA)), - list( "outbreak_end_month" = as.character(NA)), - list( "outbreak_date_year" = as.integer(2001)), - list( "outbreak_duration_months" = as.integer(NA)), - list( "outbreak_size" = as.integer(2)), - list( "asymptomatic_transmission" = as.integer(0)), - list( "outbreak_country" = as.character("Tanzania")), - list( "outbreak_location" = as.character(NA)), - list( "cases_confirmed" = as.integer(NA)), - list( "cases_mode_detection" = as.character(NA)), - list( "cases_suspected" = as.integer(NA)), - list( "cases_asymptomatic" = as.integer(NA)), - list( "deaths" = as.integer(2)), - list( "cases_severe_hospitalised" = as.integer(NA)), - list( "covidence_id" = as.integer(2059)) ), - vignette_prepend = "") +new_outbreak <- create_new_outbreak_entry( + pathogen = "marburg", + new_outbreak = c(list("article_id" = as.integer(1)), + list("outbreak_start_day" = as.integer(NA)), + list("outbreak_start_month" = as.character(NA)), + list("outbreak_start_year" = as.integer(1999)), + list("outbreak_end_day" = as.integer(NA)), + list("outbreak_end_month" = as.character(NA)), + list("outbreak_date_year" = as.integer(2001)), + list("outbreak_duration_months" = as.integer(NA)), + list("outbreak_size" = as.integer(2)), + list("asymptomatic_transmission" = as.integer(0)), + list("outbreak_country" = as.character("Tanzania")), + list("outbreak_location" = as.character(NA)), + list("cases_confirmed" = as.integer(NA)), + list("cases_mode_detection" = as.character(NA)), + list("cases_suspected" = as.integer(NA)), + list("cases_asymptomatic" = as.integer(NA)), + list("deaths" = as.integer(2)), + list("cases_severe_hospitalised" = as.integer(NA)), + list("covidence_id" = as.integer(2059))), + vignette_prepend = "") ``` -If you would like to add multiple outbreaks it is important to add each outbreak first to the dataset before adding an additional one in order to ensure that the `outbreak_id` is set correctly. +If you would like to add multiple outbreaks, it is important to add each outbreak sequentially in order to ensure that the `outbreak_id` is set correctly. ```{r eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} -new_outbreak_dataset <- append_new_entry_to_table(pathogen = 'marburg', table_type = 'outbreak', new_row = new_outbreak, - validate = TRUE, write_table = TRUE, vignette_prepend = "" ) +new_outbreak_dataset <- append_new_entry_to_table(pathogen = "marburg", + table_type = "outbreak", + new_row = new_outbreak, + validate = TRUE, + write_table = TRUE, + vignette_prepend = "") ``` ## Step 5 -- add parameter details -If the paper does not include a model you can skip this section. +If the paper does not include parameters you can skip this section. ```{r add parameter, eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} # load packages and source code @@ -140,78 +159,84 @@ library(tidyverse) library(validate) source('R/create_new_parameter_entry.R') -new_parameter <- create_new_parameter_entry(pathogen = 'marburg', - new_param = c( list( "article_id" = as.integer(1)), - list( "parameter_type" = as.character(NA)), - list( "parameter_value" = as.double(NA)), - list( "parameter_unit" = as.character(NA)), - list( "parameter_lower_bound" = as.double(NA)), - list( "parameter_upper_bound" = as.double(NA)), - list( "parameter_value_type" = as.character(NA)), - list( "parameter_uncertainty_single_value" = as.double(NA)), - list( "parameter_uncertainty_singe_type" = as.character(NA)), - list( "parameter_uncertainty_lower_value" = as.double(NA)), - list( "parameter_uncertainty_upper_value" = as.double(NA)), - list( "parameter_uncertainty_type" = as.character(NA)), - list( "cfr_ifr_numerator" = as.integer(NA)), - list( "cfr_ifr_denominator" = as.integer(NA)), - list( "distribution_type" = as.character(NA)), - list( "distribution_par1_value" = as.double(NA)), - list( "distribution_par1_type" = as.character(NA)), - list( "distribution_par1_uncertainty" = as.logical(NA)), - list( "distribution_par2_value" = as.double(NA)), - list( "distribution_par2_type" = as.character(NA)), - list( "distribution_par2_uncertainty" = as.logical(NA)), - list( "method_from_supplement" = as.logical(NA)), - list( "method_moment_value" = as.character(NA)), - list( "cfr_ifr_method" = as.character(NA)), - list( "method_r" = as.character(NA)), - list( "method_disaggregated_by" = as.character(NA)), - list( "method_disaggregated" = as.logical(NA)), - list( "method_disaggregated_only" = as.logical(NA)), - list( "riskfactor_outcome" = as.character(NA)), - list( "riskfactor_name" = as.character(NA)), - list( "riskfactor_occupation" = as.character(NA)), - list( "riskfactor_significant" = as.character(NA)), - list( "riskfactor_adjusted" = as.character(NA)), - list( "population_sex" = as.character(NA)), - list( "population_sample_type" = as.character(NA)), - list( "population_group" = as.character(NA)), - list( "population_age_min" = as.integer(NA)), - list( "population_age_max" = as.integer(NA)), - list( "population_sample_size" = as.integer(NA)), - list( "population_country" = as.character(NA)), - list( "population_location" = as.character(NA)), - list( "population_study_start_day" = as.integer(NA)), - list( "population_study_start_month" = as.character(NA)), - list( "population_study_start_year" = as.integer(NA)), - list( "population_study_end_day" = as.integer(NA)), - list( "population_study_end_month" = as.character(NA)), - list( "population_study_end_year" = as.integer(NA)), - list( "genome_site" = as.character(NA)), - list( "genomic_sequence_available" = as.logical(NA)), - list( "parameter_class" = as.character(NA)), - list( "covidence_id" = as.integer(2059)), - list( "Uncertainty" = as.character(NA)), - list( "Survey year" = as.character(NA))), - vignette_prepend = "") +new_parameter <- create_new_parameter_entry( + pathogen = "marburg", + new_param = c(list("article_id" = as.integer(1)), + list("parameter_type" = as.character(NA)), + list("parameter_value" = as.double(NA)), + list("parameter_unit" = as.character(NA)), + list("parameter_lower_bound" = as.double(NA)), + list("parameter_upper_bound" = as.double(NA)), + list("parameter_value_type" = as.character(NA)), + list("parameter_uncertainty_single_value" = as.double(NA)), + list("parameter_uncertainty_singe_type" = as.character(NA)), + list("parameter_uncertainty_lower_value" = as.double(NA)), + list("parameter_uncertainty_upper_value" = as.double(NA)), + list("parameter_uncertainty_type" = as.character(NA)), + list("cfr_ifr_numerator" = as.integer(NA)), + list("cfr_ifr_denominator" = as.integer(NA)), + list("distribution_type" = as.character(NA)), + list("distribution_par1_value" = as.double(NA)), + list("distribution_par1_type" = as.character(NA)), + list("distribution_par1_uncertainty" = as.logical(NA)), + list("distribution_par2_value" = as.double(NA)), + list("distribution_par2_type" = as.character(NA)), + list("distribution_par2_uncertainty" = as.logical(NA)), + list("method_from_supplement" = as.logical(NA)), + list("method_moment_value" = as.character(NA)), + list("cfr_ifr_method" = as.character(NA)), + list("method_r" = as.character(NA)), + list("method_disaggregated_by" = as.character(NA)), + list("method_disaggregated" = as.logical(NA)), + list("method_disaggregated_only" = as.logical(NA)), + list("riskfactor_outcome" = as.character(NA)), + list("riskfactor_name" = as.character(NA)), + list("riskfactor_occupation" = as.character(NA)), + list("riskfactor_significant" = as.character(NA)), + list("riskfactor_adjusted" = as.character(NA)), + list("population_sex" = as.character(NA)), + list("population_sample_type" = as.character(NA)), + list("population_group" = as.character(NA)), + list("population_age_min" = as.integer(NA)), + list("population_age_max" = as.integer(NA)), + list("population_sample_size" = as.integer(NA)), + list("population_country" = as.character(NA)), + list("population_location" = as.character(NA)), + list("population_study_start_day" = as.integer(NA)), + list("population_study_start_month" = as.character(NA)), + list("population_study_start_year" = as.integer(NA)), + list("population_study_end_day" = as.integer(NA)), + list("population_study_end_month" = as.character(NA)), + list("population_study_end_year" = as.integer(NA)), + list("genome_site" = as.character(NA)), + list("genomic_sequence_available" = as.logical(NA)), + list("parameter_class" = as.character(NA)), + list("covidence_id" = as.integer(2059)), + list("Uncertainty" = as.character(NA)), + list("Survey year" = as.character(NA))), + vignette_prepend = "") ``` -If you would like to add multiple parameters it is important to add each parameter first to the dataset before adding an additional one in order to ensure that the `parameter_data_id` is set correctly. +If you would like to add multiple parameters, it is important to add each parameter sequentially in order to ensure that the `parameter_data_id` is set correctly. ```{r eval=FALSE, message=FALSE, warning=FALSE, include=TRUE} -new_parameter_dataset <- append_new_entry_to_table(pathogen = 'marburg', table_type = 'parameter', new_row = new_parameter, - validate = TRUE, write_table = TRUE, vignette_prepend = "" ) +new_parameter_dataset <- append_new_entry_to_table(pathogen = "marburg", + table_type = "parameter", + new_row = new_parameter, + validate = TRUE, + write_table = TRUE, + vignette_prepend = "") ``` ## Step 6 -- create a pull request -Once you have completed the above steps to add all required data for a new paper you can commit the updates to the dataset on your branch and push your branch. Please submit a pull request with the following +Once you have completed the above steps, you can push the updated datasets to your branch of the epireview repository, and then submit a pull request. Please ensure that your pull request contains the following: -- [ ] Details of the paper, including doi, and that you have confirmed that this paper is in line with inclusion and exclusion criteria of the systematic review -- [ ] What pathogen this update concerns and what tables you have updated -- [ ] Any comments / observations the reviewer may find helpful +- [ ] Details of the paper, including doi +- [ ] Confirmation that you have checked that this paper satisfies the inclusion and exclusion criteria of the systematic review +- [ ] The pathogen this update concerns and which tables you have updated +- [ ] Any comments or observations that the reviewer may find helpful -We strongly encourage the use of the utility functions set out in this vignette. We will run the data again through these validation tests and if they fail the pull request will be rejected. +We strongly encourage the use of the utility functions set out in this vignette. We will run the data through these validation tests again, and if they fail, the pull request will be rejected. diff --git a/vignettes/pathogen_marburg.Rmd b/vignettes/pathogen_marburg.Rmd index a1f392a..f2469e3 100644 --- a/vignettes/pathogen_marburg.Rmd +++ b/vignettes/pathogen_marburg.Rmd @@ -10,7 +10,7 @@ vignette: > %\usepackage[utf8]{inputenc} --- -In 2018, the World Health Organization (WHO) published a list of nine known pathogens (in addition to an unknown _Pathogen X_) for research and development (R&D) prioritisation, due to both their epidemic and pandemic potential and the absence of licensed vaccines or therapeutics. Among these prioritised pathogens is MVD, a highly-lethal infectious _Filoviridae_ single-stranded RNA virus first described in Germany and Serbia (formerly Yugoslavia) in 1967. Subsequent outbreaks of this virus have primarily occurred in sub-Saharan Africa. The Pathogen Epidemiology Review Group (PERG) has published a Systemtic Review for MVD, if you use any of our results please cite our paper: +In 2018, the World Health Organization (WHO) published a list of nine known pathogens (in addition to an unknown _Pathogen X_) for research and development (R&D) prioritisation, due to both their epidemic and pandemic potential and the absence of licensed vaccines or therapeutics. Among these prioritised pathogens is MVD, a highly-lethal infectious _Filoviridae_ single-stranded RNA virus first described in Germany and Serbia (formerly Yugoslavia) in 1967. Subsequent outbreaks of this virus have primarily occurred in sub-Saharan Africa. The Pathogen Epidemiology Review Group (PERG) has published a systematic review for MVD, if you use any of our results please cite our paper: > @article{marburg_systematic_review_2023, author = {Gina Cuomo-Dannenburg and Kelly McCain and Ruth McCabe and H Juliette T Unwin and Patrick Doohan and Rebecca K Nash and Joseph T Hicks and Kelly Charniga and Cyril Geismar and Ben Lambert and Dariya Nikitin and Janetta E Skarp and Jack Wardle and Pathogen Epidemiology Review Group and Mara Kont and Sangeeta Bhatia and Natsuko Imai and Sabine L van Elsland and Anne Cori and Christian Morgenstern}, @@ -143,11 +143,24 @@ forest.meta(meta_cfr, layout="RevMan5", xlab="Proportion", comb.r=T, comb.f=F, x **Figure 2 (B):** CFR estimated from extracted outbreak data, including only one observation per outbreak using the study with the longest duration of the outbreak reported ensuring no case is double counted. ```{r cfr_panel_B, echo=FALSE, fig.height=5.5, fig.width=9, message=FALSE, warning=FALSE} -cfr_outbreak <- df_out %>% filter(keep_record==1) - -meta_cfr_outbreak <- metaprop(cfr_ifr_numerator, cfr_ifr_denominator, studlab=article_label, sm="PLOGIT", data=cfr_outbreak, method="GLMM", method.tau="ML") - -forest.meta(meta_cfr_outbreak, layout="RevMan5", xlab="Proportion", comb.r=T, comb.f=F, xlim = c(0,1), fontsize=10, digits=3) +cfr_outbreak <- df_out %>% filter(keep_record == 1) + +meta_cfr_outbreak <- metaprop(cfr_ifr_numerator, + cfr_ifr_denominator, + studlab = article_label, + sm = "PLOGIT", + data = cfr_outbreak, + method = "GLMM", + method.tau = "ML") + +forest.meta(meta_cfr_outbreak, + layout = "RevMan5", + xlab = "Proportion", + comb.r = T, + comb.f = F, + xlim = c(0,1), + fontsize = 10, + digits = 3) ``` **Figure S2 (A):** Overview of the estimates of the case fatality ratio (CFR) obtained from the included studies. CFR estimates reported in the included studies, stratified according to estimation method. Points represent central estimates. Error bars represent an uncertainty interval associated with the point estimate, as reported in the original study. @@ -183,21 +196,8 @@ forest_plot_delay(df) **Table 4:** Overview of seroprevalence estimates as reported in the included studies. Estimates were primarily reported as percentages, as shown here. Associated uncertainty and sample sizes are provided where these were reported. Where available, additional information regarding the location and timing of the estimates, the antibody being tested for, the target population, the timing in relation to any ongoing outbreak and the availability of disaggregated data is also summarised. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -file_path_pa <- system.file("extdata", "marburg_parameter.csv", package = "epireview") -if(file_path_pa=="") file_path_pa <- paste0('../extdata/marburg_parameter.csv') -params <- read_csv(file_path_pa) - -file_path_ar <- system.file("extdata","marburg_article.csv", package = "epireview") -if(file_path_ar=="") file_path_ar <- paste0('../extdata/marburg_article.csv') -articles <- read_csv(file_path_ar) - -df <- left_join(params, articles %>% dplyr::select(article_id, first_author_surname,year_publication), by="article_id") %>% - mutate(article_label = as.character(paste0(first_author_surname," ",year_publication)), - population_country = str_replace_all(population_country,";",", ")) %>% - dplyr::arrange(article_label, -year_publication) %>% - dplyr::filter(article_id %in% c(17,15) == FALSE) - -sero_table(df,'marburg') +df <- data_param_table(pathogen = "marburg", exclude = c(17, 15)) +sero_table(df, "marburg") ``` ### Molecular evolutionary rates @@ -229,9 +229,6 @@ risk_table(df,'marburg',supplement=TRUE) **Figure S3:** (A) Count of papers for each quality assessment question scoring Yes, No or not applicable. (B) Quality Assessment Score defined as proportion of Yes votes for each paper relative to sum of Yes and No answers, removing NAs. The time trend is fitted using Local Polynomial Regression Fitting. ```{r echo=FALSE, fig.height=4, fig.width=8, message=FALSE, warning=FALSE, paged.print=TRUE} -test <- system.file("extdata", "marburg_outbreak.csv", package = "epireview") -if(test=="") file_prepend = "../" else file_prepend = "" - -quality_assessment_plots(pathogen = "marburg",prepend = file_prepend) +quality_assessment_plots(pathogen = "marburg", prepend = file_prepend) ``` From 2bcd9e63554da1f442bf865d3ab9caf0f8b7cae6 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 20 Jul 2023 10:10:47 +0100 Subject: [PATCH 37/40] remove Survey.year and Uncertainty --- R/create_new_parameter_entry.R | 8 ++------ R/data.R | 2 -- man/create_new_parameter_entry.Rd | 7 ++----- man/marburg_parameter.Rd | 2 -- 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/R/create_new_parameter_entry.R b/R/create_new_parameter_entry.R index 86cfa94..4883d72 100644 --- a/R/create_new_parameter_entry.R +++ b/R/create_new_parameter_entry.R @@ -29,9 +29,7 @@ #' list("genome_site" = as.character(NA)), #' list("genomic_sequence_available" = as.logical(NA)), #' list("parameter_class" = as.character(NA)), -#' list("covidence_id" = as.integer(2059)), -#' list("Uncertainty" = as.character(NA)), -#' list("Survey year" = as.character(NA))), +#' list("covidence_id" = as.integer(2059))), #' vignette_prepend = "") #' @export create_new_parameter_entry <- @@ -87,9 +85,7 @@ create_new_parameter_entry <- list("genome_site" = as.character(NA)), list("genomic_sequence_available" = as.logical(NA)), list("parameter_class" = as.character(NA)), - list("covidence_id" = as.integer(NA)), - list("Uncertainty" = as.character(NA)), - list("Survey year" = as.character(NA))), + list("covidence_id" = as.integer(NA))), vignette_prepend = "") { #read current article data for pathogen diff --git a/R/data.R b/R/data.R index 967bee1..91a68fc 100644 --- a/R/data.R +++ b/R/data.R @@ -234,8 +234,6 @@ NULL #' "Seroprevalence", "Severity", "Reproduction number", "Mutations", #' "Risk factors", or "Other transmission parameters". #' - covidence_id = article identifier used by the Imperial team. -#' - Uncertainty = remove? -#' - Survey year = remove? #' #' @source Cuomo-Dannenburg G, McCain K, McCabe R, Unwin HJT, Doohan P, Nash RK, #' et al. Marburg Virus Disease outbreaks, mathematical models, and disease diff --git a/man/create_new_parameter_entry.Rd b/man/create_new_parameter_entry.Rd index ac9da81..a0e8bc8 100644 --- a/man/create_new_parameter_entry.Rd +++ b/man/create_new_parameter_entry.Rd @@ -42,8 +42,7 @@ create_new_parameter_entry( list(population_study_end_day = as.integer(NA)), list(population_study_end_month = as.character(NA)), list(population_study_end_year = as.integer(NA)), list(genome_site = as.character(NA)), list(genomic_sequence_available = as.logical(NA)), - list(parameter_class = as.character(NA)), list(covidence_id = as.integer(NA)), - list(Uncertainty = as.character(NA)), list(`Survey year` = as.character(NA))), + list(parameter_class = as.character(NA)), list(covidence_id = as.integer(NA))), vignette_prepend = "" ) } @@ -80,8 +79,6 @@ create_new_parameter_entry <- list("genome_site" = as.character(NA)), list("genomic_sequence_available" = as.logical(NA)), list("parameter_class" = as.character(NA)), - list("covidence_id" = as.integer(2059)), - list("Uncertainty" = as.character(NA)), - list("Survey year" = as.character(NA))), + list("covidence_id" = as.integer(2059))), vignette_prepend = "") } diff --git a/man/marburg_parameter.Rd b/man/marburg_parameter.Rd index 19458bc..aea55f3 100644 --- a/man/marburg_parameter.Rd +++ b/man/marburg_parameter.Rd @@ -97,8 +97,6 @@ from a public database. TRUE/FALSE. "Seroprevalence", "Severity", "Reproduction number", "Mutations", "Risk factors", or "Other transmission parameters". \item covidence_id = article identifier used by the Imperial team. -\item Uncertainty = remove? -\item Survey year = remove? } } \source{ From f292429e1636b499c666471c1cc316f15c37f8b5 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 20 Jul 2023 10:13:39 +0100 Subject: [PATCH 38/40] remove Survey.year and Uncertainty from csv --- inst/extdata/marburg_parameter.csv | 142 ++++++++++++++--------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/inst/extdata/marburg_parameter.csv b/inst/extdata/marburg_parameter.csv index 92b6cbe..3e93caf 100644 --- a/inst/extdata/marburg_parameter.csv +++ b/inst/extdata/marburg_parameter.csv @@ -1,71 +1,71 @@ -parameter_data_id,article_id,parameter_type,parameter_value,parameter_unit,parameter_lower_bound,parameter_upper_bound,parameter_value_type,parameter_uncertainty_single_value,parameter_uncertainty_singe_type,parameter_uncertainty_lower_value,parameter_uncertainty_upper_value,parameter_uncertainty_type,cfr_ifr_numerator,cfr_ifr_denominator,distribution_type,distribution_par1_value,distribution_par1_type,distribution_par1_uncertainty,distribution_par2_value,distribution_par2_type,distribution_par2_uncertainty,method_from_supplement,method_moment_value,cfr_ifr_method,method_r,method_disaggregated_by,method_disaggregated,method_disaggregated_only,riskfactor_outcome,riskfactor_name,riskfactor_occupation,riskfactor_significant,riskfactor_adjusted,population_sex,population_sample_type,population_group,population_age_min,population_age_max,population_sample_size,population_country,population_location,population_study_start_day,population_study_start_month,population_study_start_year,population_study_end_day,population_study_end_month,population_study_end_year,genome_site,genomic_sequence_available,parameter_class,covidence_id,Uncertainty,Survey year -12,6,Human delay - time symptom to careseeking,4,Days,NA,NA,Other,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Start outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Male,Hospital based,Other,20,20,1,South Africa,Johannesburg,NA,Feb,1975,NA,Feb,1975,NA,FALSE,Human delay,3795,NA,Feb-75 -14,6,Human delay - incubation period,NA,Days,7,8,NA,NA,NA,7,8,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Female,Hospital based,Healthcare workers,20,20,1,South Africa,Johannesburg,NA,Feb,1975,NA,Feb,1975,NA,FALSE,Human delay,3795,07-Aug,Feb-75 -16,6,Human delay - time symptom to outcome,9,Days,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Start outbreak,NA,NA,NA,FALSE,FALSE,Other,NA,NA,NA,NA,Male,Hospital based,Other,20,20,1,South Africa,Johannesburg,NA,Feb,1975,NA,Feb,1975,NA,FALSE,Human delay,3795,NA,Feb-75 -18,5,Seroprevalence - IFA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,3,427,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,Outdoor workers,1,NA,427,Central African Republic,Lobaye District,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2597,NA,NA -22,21,Attack rate,21,Percentage (%),NA,NA,NA,NA,NA,11,34,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Household based,Household contacts of survivors,NA,NA,53,Democratic Republic of the Congo,Watsa and Durba,NA,NA,NA,NA,NA,NA,NA,FALSE,Other transmission parameters,2762,"11, 34",NA -23,20,Human delay - incubation period,NA,Days,4,7,NA,NA,NA,4,7,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,31,Germany;Yugoslavia,"Marburg (23), Frankfurt am Main (6), Belgrade (2)",NA,Aug,1968,NA,Nov,1968,NA,FALSE,Human delay,2060,04-Jul,Aug-Nov 1968 -24,22,Seroprevalence - IFA,0,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,0,197,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,197,Gabon,Franceville,13,Feb,1980,19,Mar,1980,NA,FALSE,Seroprevalence,2614,NA,Feb-Mar 1980 -25,22,Seroprevalence - IFA,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,0,28,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Female,NA,Pregnant women,NA,NA,28,Gabon,Franceville,13,Feb,1980,19,Mar,1980,NA,FALSE,Seroprevalence,2614,NA,Feb-Mar 1980 -26,22,Seroprevalence - IFA,0,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,0,28,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,Other,0,0,NA,Gabon,Franceville,13,Feb,1980,19,Mar,1980,NA,FALSE,Seroprevalence,2614,NA,Feb-Mar 1980 -27,20,Severity - case fatality rate (CFR),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,7,31,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,31,Germany;Yugoslavia,"Marburg (23), Frankfurt am Main (6), Belgrade (2)",NA,Aug,1968,NA,Nov,1968,NA,FALSE,Severity,2060,NA,Aug-Nov 1968 -29,24,Seroprevalence - IFA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,8,1899,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,NA,NA,NA,NA,1899,Kenya,"Lodwar, Laisamis, Nzoia, Masinga, Nairobi, Malindi, Kilifi",NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2601,NA,NA -32,25,Seroprevalence - HAI/HI,4.5,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,6,132,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,NA,20,40,132,Uganda,Karamoja,NA,May,1984,NA,May,1984,NA,FALSE,Seroprevalence,2116,NA,May-84 -33,21,Seroprevalence - IgG,1.65,Percentage (%),NA,NA,NA,NA,NA,0.2,5.8,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Household based,Household contacts of survivors,NA,NA,121,Democratic Republic of the Congo,Watsa and Durba,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2762,"0.2, 5.8",NA -34,21,"Reproduction number (Effective, Re)",NA,No units,NA,NA,0.93,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,Empirical (contact tracing),NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Household based,Household contacts of survivors,NA,NA,NA,Democratic Republic of the Congo,Watsa and Durba,NA,NA,NA,NA,NA,NA,NA,FALSE,Reproduction number,2762,NA,NA -38,32,Seroprevalence - IgG,2.6,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,Other,NA,NA,1288,Germany,Marburg,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2808,NA,NA -40,27,Human delay - generation time,9,Days,NA,NA,Mean,NA,NA,8.2,10,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886,"8.2, 10",Mar-Nov 2005 -41,27,Human delay - generation time,5.4,Days,NA,NA,Standard Deviation,NA,NA,3.9,8.6,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886,"3.9, 8.6",Mar-Nov 2005 -42,27,Human delay - time symptom to outcome,7,Days,NA,NA,Median,NA,NA,5,9,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Death,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886,05-Sep,Mar-Nov 2005 -43,33,Mutations - evolutionary rate,5.67,Substitutions/site/year,NA,NA,NA,NA,NA,0.49,8.97,Highest Posterior Density Interval 95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,TRUE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,60,Angola;Democratic Republic of the Congo;Germany;Kenya;Netherlands;Uganda;Zimbabwe,NA,NA,NA,1967,NA,NA,2009,NA,TRUE,Mutations,2696,0.49 - 8.97,1967-2009 -44,27,Human delay - generation time,9.3,Days,NA,NA,Mean,NA,NA,3.7,14.6,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886,"3.7, 14.6",Mar-Nov 2005 -45,27,Human delay - time symptom to outcome,9,Days,NA,NA,Median,NA,NA,0,56,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Death,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886,0 - 56,Mar-Nov 2005 -46,27,Growth rate (r),0.056,Per day,NA,NA,Mean,NA,NA,0.0508,0.0612,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,TRUE,Other transmission parameters,2886,"0.0508, 0.0612",Mar-Nov 2005 -48,27,Doubling time,12.4,Days,NA,NA,Mean,NA,NA,11.3,13.6,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,TRUE,Other transmission parameters,2886,"11.3, 13.6",Mar-Nov 2005 -50,33,Mutations - substitution rate,2,Substitutions/site/year,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,TRUE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,60,Angola;Democratic Republic of the Congo;Germany;Kenya;Netherlands;Uganda;Zimbabwe,NA,NA,NA,1967,NA,NA,2009,NA,FALSE,Mutations,2696,NA,1967-2009 -52,27,Reproduction number (Basic R0),1.59,No units,NA,NA,Mean,NA,NA,1.53,1.66,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,Growth rate,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Reproduction number,2886,"1.53, 1.66",Mar-Nov 2005 -53,27,Severity - case fatality rate (CFR),88,Percentage (%),NA,NA,Mean,NA,NA,84,91,CI95%,329,374,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Severity,2886,"84, 91",Mar-Nov 2005 -54,35,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Infection,Contact with animal;Other,NA,Significant,Unknown,NA,NA,NA,NA,NA,NA,Uganda,"Python cave, Kitake mine",NA,NA,NA,NA,NA,NA,NA,FALSE,Risk factors,2869,NA,NA -57,37,Seroprevalence - IgG,2.4,Percentage (%),0,5.6,NA,NA,NA,0,5.6,Range,33,1340,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Community based,NA,NA,NA,1340,Central African Republic,NA,NA,Nov,1995,NA,Nov,1995,NA,FALSE,Seroprevalence,2369,0 - 5.6,Nov-95 -58,38,Seroprevalence - IgM,3.6,Percentage (%),NA,NA,Unspecified,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Other,Persons under investigation,NA,NA,220,Sierra Leone,NA,NA,Oct,2006,NA,Oct,2008,NA,FALSE,Seroprevalence,3473,NA,2006-2008 -60,40,Seroprevalence - Unspecified,0.39,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,20,5070,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,5070,Cameroon;Central African Republic;Chad;Republic of the Congo;Equatorial Guinea;Gabon,NA,NA,NA,1985,NA,NA,1987,NA,FALSE,Seroprevalence,2370,NA,1985-1987 -62,43,Seroprevalence - IFA,0,Percentage (%),0,1.2,Mean,NA,NA,0,1.2,Range,0,300,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Serology,Contact with animal;Gathering,NA,Not significant,Unknown,Both,Community based,NA,10,75,300,Democratic Republic of the Congo,Watsa,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2761,0 - 1.2,NA -63,42,Severity - case fatality rate (CFR),58,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,15,26,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,Naive,NA,Sex,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Severity,2241,NA,2012 -64,42,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Infection,Gathering,NA,Significant,Unknown,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Risk factors,2241,NA,2012 -65,43,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Infection,Household contact;Other,NA,Significant,Unknown,Both,Hospital based,Persons under investigation,NA,NA,102,Angola,Uige,1,Mar,2005,1,Jul,2005,NA,FALSE,Risk factors,2761,NA,Mar-Jul 2005 -66,43,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Infection,Gathering;Occupation,Funeral and burrial services,Significant,Unknown,Both,Hospital based,Persons under investigation,NA,NA,102,Angola,Uige,1,Mar,2005,1,Jul,2005,NA,FALSE,Risk factors,2761,NA,Mar-Jul 2005 -67,42,Human delay - time symptom to outcome,9,Days,6.5,9,Mean,NA,NA,6.5,9,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,Other,TRUE,FALSE,Death,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241,6.5 - 9,2012 -68,42,Human delay - time symptom to careseeking,4,Days,NA,NA,Mean,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241,NA,2012 -69,42,Human delay - time symptom to outcome,22,Days,16,30,Mean,NA,NA,16,30,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Other,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241,16 - 30,2012 -70,42,Human delay - time in care,14.3,Days,4,22,Mean,NA,NA,4,22,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Other,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241,Apr-22,2012 -71,42,Severity - case fatality rate (CFR),44,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,4,9,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,Adjusted,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Community based,General population,NA,NA,9,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Severity,2241,NA,2012 -72,46,Seroprevalence - IgG,2.1,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,Healthcare workers,23,62,48,Democratic Republic of the Congo,Durba and Watsa,NA,NA,2001,NA,NA,2002,NA,FALSE,Seroprevalence,4657,NA,2001-2002 -78,7,Seroprevalence - IFA,3.2,Percentage (%),NA,NA,Mean,NA,NA,1,7.4,Range,137,4295,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Pre outbreak,NA,NA,"Age, Region, Sex",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,4295,Central African Republic,"Nola, Ikaumba, Bozo, Bangassou, Bouar, Obo, Mbre, Birao",NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2596,1 - 7.4,NA -86,55,Seroprevalence - IFA,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,0,741,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,741,Kenya,Nzoia & Mumias,NA,March,1980,NA,Dec,1981,NA,FALSE,Seroprevalence,2600,NA,1980-1981 -88,57,Severity - case fatality rate (CFR),83,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,125,150,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,Other,NA,NA,150,Democratic Republic of the Congo,"Durba, Watsa",NA,NA,1999,NA,NA,2000,NA,FALSE,Severity,2819,NA,1999-2000 -89,57,Human delay - time symptom to careseeking,4.5,Days,NA,NA,Median,NA,NA,0,24,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,Other,NA,NA,150,Democratic Republic of the Congo,"Durba, Watsa",NA,NA,1999,NA,NA,2000,NA,FALSE,Human delay,2819,0 - 24,1999-2000 -90,58,Seroprevalence - IgG,2,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,15,912,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,NA,14,79,912,Democratic Republic of the Congo,"Durba, Watsa",NA,May,1999,NA,May,1999,NA,FALSE,Seroprevalence,2822,NA,May-99 -92,58,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Serology,Contact with animal;Household contact;Occupation,Funeral and burrial services,Not significant,Adjusted,Both,Population based,NA,14,79,912,Democratic Republic of the Congo,"Durba, Watsa",NA,May,1999,NA,May,1999,NA,FALSE,Risk factors,2822,NA,May-99 -94,58,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Serology,Hospitalisation,NA,Significant,Adjusted,Both,Population based,NA,14,79,915,Democratic Republic of the Congo,NA,NA,May,1999,NA,May,1999,NA,FALSE,Risk factors,2822,NA,May-99 -100,42,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Infection,Other;Sex,NA,Not significant,Unknown,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Risk factors,2241,NA,2012 -101,63,Seroprevalence - IgM,0.3,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,1,308,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,Unknown,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Hospital based,NA,NA,NA,308,Tanzania,Buhigwe; Kalambo; Kyela; Kilindi; Kinondoni; Kondoa; Mvomero; Ukerewe,NA,Jun,2018,NA,Nov,2018,NA,FALSE,Seroprevalence,5648,NA,Jun-Nov 2018 -106,20,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,79,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Other,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,TRUE,Seroprevalence,2060,NA,NA -55,36,Mutations - evolutionary rate,0.00033,Substitutions/site/year,NA,NA,Mean,NA,NA,2.00E-04,0.00048,Highest Posterior Density Interval 95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,TRUE,Mutations,1483,2e-04 - 0.00048,NA -76,48,Mutations - mutation rate,3.80E-05,Substitutions/site/year,NA,NA,NA,0.000469,Standard Error (SE),NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2,"Germany, Kenya",Marburg,NA,NA,1967,NA,NA,1980,VP30,FALSE,Mutations,1649,NA,1967-1980 -77,48,Mutations - mutation rate,0.000127,Substitutions/site/year,NA,NA,NA,0.000229,Standard Error (SE),NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2,"Germany, Kenya",Marburg,NA,NA,1967,NA,NA,1980,VP24,FALSE,Mutations,1649,NA,1967-1980 -75,48,Mutations - substitution rate,0.00036,Substitutions/site/year,NA,NA,NA,0.000257,Standard Error (SE),NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2,"Germany, Kenya",Marburg,NA,NA,1967,NA,NA,1980,VP35,FALSE,Mutations,1649,NA,1967-1980 -79,47,Seroprevalence - IFA,1.3,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,3,225,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,NA,NA,"Other, Region",TRUE,FALSE,NA,NA,NA,NA,NA,NA,Community based,Other,15.9,26.4,225,Liberia,Grand Bassa County,NA,Nov,1981,NA,Jan,1982,NA,FALSE,Seroprevalence,1595,NA,1981-1982 -9,8,Seroprevalence - IFA,1.7,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,29,1677,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,5,70,1677,Nigeria,Benue; Gongola; Ondo; Makurdi; Plateau,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1615,NA,NA -2,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,2,186,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Community based,Persons under investigation,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692,NA,NA -3,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,3,100,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Hospital based,Healthcare workers,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692,NA,NA -4,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,224,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Community based,General population,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692,NA,NA -6,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,63,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Other,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692,NA,NA -7,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,79,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Other,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692,NA,NA -8,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,44,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Outdoor workers,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692,NA,NA -21,15,Seroprevalence - Unspecified,1.2,Percentage (%),0,3.2,Mean,NA,NA,0.5,2,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,Adjusted,NA,"Region, Time",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,NA,"Central African Republic, Democratic Republic of the Congo, Germany, Kenya, Liberia, Madagascar",NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1931,"0.5, 2",NA -36,30,Seroprevalence - IgG,0.5,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Pre outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,NA,18,65,809,Republic of the Congo,Brazzaville; Pointe-Noire; Gamboma; Owando; Oyo; Ewo,NA,Mar,2011,NA,Jul,2011,NA,FALSE,Seroprevalence,1983,NA,Mar-Jul 2011 -1,41,Seroprevalence - Unspecified,0,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,381,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,NA,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,381,Madagascar,"Antananarivo (45), Mandoto (149), Andasibe (56), Tsiroanoamandidy (105), Ampijoroa (26)",NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2042,NA,NA -19,15,Severity - case fatality rate (CFR),65,Percentage (%),0,100,Other,NA,NA,32,88,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,Naive,NA,"Region, Time",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,NA,"Angola, Democratic Republic of the Congo, Germany, Kenya, Netherlands, Russian Federation, South Africa, Uganda, United States, Yugoslavia",NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Severity,1931,"32, 88",NA -20,17,Severity - case fatality rate (CFR),53.8,Percentage (%),NA,NA,NA,NA,NA,26.5,80,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,Adjusted,NA,"Region, Time",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,NA,"Angola, Democratic Republic of the Congo, Germany, Kenya, Netherlands, Russian Federation, South Africa, Uganda, United States, Yugoslavia",NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Severity,1931,"26.5, 80",NA -37,26,Severity - case fatality rate (CFR),50,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,7,14,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,NA,1.3,70,14,Uganda,Kabale and Ibanda,3,Sep,2012,13,Nov,2012,NA,FALSE,Severity,2032,NA,Sep-Nov 2012 -11,9,Seroprevalence - IgG,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,331,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Hospital based,Other,NA,NA,NA,Uganda,Bwindi,NA,Mar,2013,NA,Jul,2013,NA,FALSE,Seroprevalence,1693,NA,Mar-Jul 2013 \ No newline at end of file +parameter_data_id,article_id,parameter_type,parameter_value,parameter_unit,parameter_lower_bound,parameter_upper_bound,parameter_value_type,parameter_uncertainty_single_value,parameter_uncertainty_singe_type,parameter_uncertainty_lower_value,parameter_uncertainty_upper_value,parameter_uncertainty_type,cfr_ifr_numerator,cfr_ifr_denominator,distribution_type,distribution_par1_value,distribution_par1_type,distribution_par1_uncertainty,distribution_par2_value,distribution_par2_type,distribution_par2_uncertainty,method_from_supplement,method_moment_value,cfr_ifr_method,method_r,method_disaggregated_by,method_disaggregated,method_disaggregated_only,riskfactor_outcome,riskfactor_name,riskfactor_occupation,riskfactor_significant,riskfactor_adjusted,population_sex,population_sample_type,population_group,population_age_min,population_age_max,population_sample_size,population_country,population_location,population_study_start_day,population_study_start_month,population_study_start_year,population_study_end_day,population_study_end_month,population_study_end_year,genome_site,genomic_sequence_available,parameter_class,covidence_id +12,6,Human delay - time symptom to careseeking,4,Days,NA,NA,Other,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Start outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Male,Hospital based,Other,20,20,1,South Africa,Johannesburg,NA,Feb,1975,NA,Feb,1975,NA,FALSE,Human delay,3795 +14,6,Human delay - incubation period,NA,Days,7,8,NA,NA,NA,7,8,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Female,Hospital based,Healthcare workers,20,20,1,South Africa,Johannesburg,NA,Feb,1975,NA,Feb,1975,NA,FALSE,Human delay,3795 +16,6,Human delay - time symptom to outcome,9,Days,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Start outbreak,NA,NA,NA,FALSE,FALSE,Other,NA,NA,NA,NA,Male,Hospital based,Other,20,20,1,South Africa,Johannesburg,NA,Feb,1975,NA,Feb,1975,NA,FALSE,Human delay,3795 +18,5,Seroprevalence - IFA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,3,427,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,Outdoor workers,1,NA,427,Central African Republic,Lobaye District,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2597 +22,21,Attack rate,21,Percentage (%),NA,NA,NA,NA,NA,11,34,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Household based,Household contacts of survivors,NA,NA,53,Democratic Republic of the Congo,Watsa and Durba,NA,NA,NA,NA,NA,NA,NA,FALSE,Other transmission parameters,2762 +23,20,Human delay - incubation period,NA,Days,4,7,NA,NA,NA,4,7,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,31,Germany;Yugoslavia,"Marburg (23), Frankfurt am Main (6), Belgrade (2)",NA,Aug,1968,NA,Nov,1968,NA,FALSE,Human delay,2060 +24,22,Seroprevalence - IFA,0,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,0,197,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,197,Gabon,Franceville,13,Feb,1980,19,Mar,1980,NA,FALSE,Seroprevalence,2614 +25,22,Seroprevalence - IFA,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,0,28,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Female,NA,Pregnant women,NA,NA,28,Gabon,Franceville,13,Feb,1980,19,Mar,1980,NA,FALSE,Seroprevalence,2614 +26,22,Seroprevalence - IFA,0,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,0,28,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,Other,0,0,NA,Gabon,Franceville,13,Feb,1980,19,Mar,1980,NA,FALSE,Seroprevalence,2614 +27,20,Severity - case fatality rate (CFR),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,7,31,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,31,Germany;Yugoslavia,"Marburg (23), Frankfurt am Main (6), Belgrade (2)",NA,Aug,1968,NA,Nov,1968,NA,FALSE,Severity,2060 +29,24,Seroprevalence - IFA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,8,1899,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,NA,NA,NA,NA,1899,Kenya,"Lodwar, Laisamis, Nzoia, Masinga, Nairobi, Malindi, Kilifi",NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2601 +32,25,Seroprevalence - HAI/HI,4.5,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,6,132,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,NA,20,40,132,Uganda,Karamoja,NA,May,1984,NA,May,1984,NA,FALSE,Seroprevalence,2116 +33,21,Seroprevalence - IgG,1.65,Percentage (%),NA,NA,NA,NA,NA,0.2,5.8,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Household based,Household contacts of survivors,NA,NA,121,Democratic Republic of the Congo,Watsa and Durba,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2762 +34,21,"Reproduction number (Effective, Re)",NA,No units,NA,NA,0.93,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,Empirical (contact tracing),NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Household based,Household contacts of survivors,NA,NA,NA,Democratic Republic of the Congo,Watsa and Durba,NA,NA,NA,NA,NA,NA,NA,FALSE,Reproduction number,2762 +38,32,Seroprevalence - IgG,2.6,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,Other,NA,NA,1288,Germany,Marburg,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2808 +40,27,Human delay - generation time,9,Days,NA,NA,Mean,NA,NA,8.2,10,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886 +41,27,Human delay - generation time,5.4,Days,NA,NA,Standard Deviation,NA,NA,3.9,8.6,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886 +42,27,Human delay - time symptom to outcome,7,Days,NA,NA,Median,NA,NA,5,9,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Death,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886 +43,33,Mutations - evolutionary rate,5.67,Substitutions/site/year,NA,NA,NA,NA,NA,0.49,8.97,Highest Posterior Density Interval 95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,TRUE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,60,Angola;Democratic Republic of the Congo;Germany;Kenya;Netherlands;Uganda;Zimbabwe,NA,NA,NA,1967,NA,NA,2009,NA,TRUE,Mutations,2696 +44,27,Human delay - generation time,9.3,Days,NA,NA,Mean,NA,NA,3.7,14.6,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886 +45,27,Human delay - time symptom to outcome,9,Days,NA,NA,Median,NA,NA,0,56,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Death,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Human delay,2886 +46,27,Growth rate (r),0.056,Per day,NA,NA,Mean,NA,NA,0.0508,0.0612,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,TRUE,Other transmission parameters,2886 +48,27,Doubling time,12.4,Days,NA,NA,Mean,NA,NA,11.3,13.6,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,TRUE,Other transmission parameters,2886 +50,33,Mutations - substitution rate,2,Substitutions/site/year,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,TRUE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,60,Angola;Democratic Republic of the Congo;Germany;Kenya;Netherlands;Uganda;Zimbabwe,NA,NA,NA,1967,NA,NA,2009,NA,FALSE,Mutations,2696 +52,27,Reproduction number (Basic R0),1.59,No units,NA,NA,Mean,NA,NA,1.53,1.66,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,Growth rate,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Reproduction number,2886 +53,27,Severity - case fatality rate (CFR),88,Percentage (%),NA,NA,Mean,NA,NA,84,91,CI95%,329,374,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,374,Angola,Uige,25,Mar,2005,9,Nov,2005,NA,FALSE,Severity,2886 +54,35,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Infection,Contact with animal;Other,NA,Significant,Unknown,NA,NA,NA,NA,NA,NA,Uganda,"Python cave, Kitake mine",NA,NA,NA,NA,NA,NA,NA,FALSE,Risk factors,2869 +57,37,Seroprevalence - IgG,2.4,Percentage (%),0,5.6,NA,NA,NA,0,5.6,Range,33,1340,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Community based,NA,NA,NA,1340,Central African Republic,NA,NA,Nov,1995,NA,Nov,1995,NA,FALSE,Seroprevalence,2369 +58,38,Seroprevalence - IgM,3.6,Percentage (%),NA,NA,Unspecified,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Other,Persons under investigation,NA,NA,220,Sierra Leone,NA,NA,Oct,2006,NA,Oct,2008,NA,FALSE,Seroprevalence,3473 +60,40,Seroprevalence - Unspecified,0.39,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,20,5070,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,5070,Cameroon;Central African Republic;Chad;Republic of the Congo;Equatorial Guinea;Gabon,NA,NA,NA,1985,NA,NA,1987,NA,FALSE,Seroprevalence,2370 +62,43,Seroprevalence - IFA,0,Percentage (%),0,1.2,Mean,NA,NA,0,1.2,Range,0,300,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Serology,Contact with animal;Gathering,NA,Not significant,Unknown,Both,Community based,NA,10,75,300,Democratic Republic of the Congo,Watsa,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2761 +63,42,Severity - case fatality rate (CFR),58,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,15,26,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,Naive,NA,Sex,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Severity,2241 +64,42,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Infection,Gathering,NA,Significant,Unknown,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Risk factors,2241 +65,43,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Infection,Household contact;Other,NA,Significant,Unknown,Both,Hospital based,Persons under investigation,NA,NA,102,Angola,Uige,1,Mar,2005,1,Jul,2005,NA,FALSE,Risk factors,2761 +66,43,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,Infection,Gathering;Occupation,Funeral and burrial services,Significant,Unknown,Both,Hospital based,Persons under investigation,NA,NA,102,Angola,Uige,1,Mar,2005,1,Jul,2005,NA,FALSE,Risk factors,2761 +67,42,Human delay - time symptom to outcome,9,Days,6.5,9,Mean,NA,NA,6.5,9,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,Other,TRUE,FALSE,Death,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241 +68,42,Human delay - time symptom to careseeking,4,Days,NA,NA,Mean,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241 +69,42,Human delay - time symptom to outcome,22,Days,16,30,Mean,NA,NA,16,30,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Other,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241 +70,42,Human delay - time in care,14.3,Days,4,22,Mean,NA,NA,4,22,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Other,NA,NA,NA,NA,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Human delay,2241 +71,42,Severity - case fatality rate (CFR),44,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,4,9,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,Adjusted,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Community based,General population,NA,NA,9,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Severity,2241 +72,46,Seroprevalence - IgG,2.1,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,Healthcare workers,23,62,48,Democratic Republic of the Congo,Durba and Watsa,NA,NA,2001,NA,NA,2002,NA,FALSE,Seroprevalence,4657 +78,7,Seroprevalence - IFA,3.2,Percentage (%),NA,NA,Mean,NA,NA,1,7.4,Range,137,4295,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Pre outbreak,NA,NA,"Age, Region, Sex",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,4295,Central African Republic,"Nola, Ikaumba, Bozo, Bangassou, Bouar, Obo, Mbre, Birao",NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2596 +86,55,Seroprevalence - IFA,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,0,741,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,741,Kenya,Nzoia & Mumias,NA,March,1980,NA,Dec,1981,NA,FALSE,Seroprevalence,2600 +88,57,Severity - case fatality rate (CFR),83,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,125,150,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,Other,NA,NA,150,Democratic Republic of the Congo,"Durba, Watsa",NA,NA,1999,NA,NA,2000,NA,FALSE,Severity,2819 +89,57,Human delay - time symptom to careseeking,4.5,Days,NA,NA,Median,NA,NA,0,24,Range,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,Other,NA,NA,150,Democratic Republic of the Congo,"Durba, Watsa",NA,NA,1999,NA,NA,2000,NA,FALSE,Human delay,2819 +90,58,Seroprevalence - IgG,2,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,15,912,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,NA,14,79,912,Democratic Republic of the Congo,"Durba, Watsa",NA,May,1999,NA,May,1999,NA,FALSE,Seroprevalence,2822 +92,58,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Serology,Contact with animal;Household contact;Occupation,Funeral and burrial services,Not significant,Adjusted,Both,Population based,NA,14,79,912,Democratic Republic of the Congo,"Durba, Watsa",NA,May,1999,NA,May,1999,NA,FALSE,Risk factors,2822 +94,58,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,Serology,Hospitalisation,NA,Significant,Adjusted,Both,Population based,NA,14,79,915,Democratic Republic of the Congo,NA,NA,May,1999,NA,May,1999,NA,FALSE,Risk factors,2822 +100,42,Risk factors,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,Infection,Other;Sex,NA,Not significant,Unknown,Both,Community based,General population,0,64,26,Uganda,"Ibanda, Kabale and Kamwenge Districts",NA,NA,2012,NA,NA,2012,NA,FALSE,Risk factors,2241 +101,63,Seroprevalence - IgM,0.3,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,1,308,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,Unknown,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,Both,Hospital based,NA,NA,NA,308,Tanzania,Buhigwe; Kalambo; Kyela; Kilindi; Kinondoni; Kondoa; Mvomero; Ukerewe,NA,Jun,2018,NA,Nov,2018,NA,FALSE,Seroprevalence,5648 +106,20,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,79,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Other,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,TRUE,Seroprevalence,2060 +55,36,Mutations - evolutionary rate,0.00033,Substitutions/site/year,NA,NA,Mean,NA,NA,2.00E-04,0.00048,Highest Posterior Density Interval 95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,TRUE,Mutations,1483 +76,48,Mutations - mutation rate,3.80E-05,Substitutions/site/year,NA,NA,NA,0.000469,Standard Error (SE),NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2,"Germany, Kenya",Marburg,NA,NA,1967,NA,NA,1980,VP30,FALSE,Mutations,1649 +77,48,Mutations - mutation rate,0.000127,Substitutions/site/year,NA,NA,NA,0.000229,Standard Error (SE),NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2,"Germany, Kenya",Marburg,NA,NA,1967,NA,NA,1980,VP24,FALSE,Mutations,1649 +75,48,Mutations - substitution rate,0.00036,Substitutions/site/year,NA,NA,NA,0.000257,Standard Error (SE),NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2,"Germany, Kenya",Marburg,NA,NA,1967,NA,NA,1980,VP35,FALSE,Mutations,1649 +79,47,Seroprevalence - IFA,1.3,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,3,225,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,NA,NA,"Other, Region",TRUE,FALSE,NA,NA,NA,NA,NA,NA,Community based,Other,15.9,26.4,225,Liberia,Grand Bassa County,NA,Nov,1981,NA,Jan,1982,NA,FALSE,Seroprevalence,1595 +9,8,Seroprevalence - IFA,1.7,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,29,1677,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,5,70,1677,Nigeria,Benue; Gongola; Ondo; Makurdi; Plateau,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1615 +2,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,2,186,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Community based,Persons under investigation,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692 +3,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,3,100,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Hospital based,Healthcare workers,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692 +4,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,224,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Community based,General population,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692 +6,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,63,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Other,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692 +7,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,79,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Other,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692 +8,4,Seroprevalence - Unspecified,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,44,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Trade / business based,Outdoor workers,NA,NA,NA,Kenya,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1692 +21,15,Seroprevalence - Unspecified,1.2,Percentage (%),0,3.2,Mean,NA,NA,0.5,2,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Post outbreak,Adjusted,NA,"Region, Time",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,NA,"Central African Republic, Democratic Republic of the Congo, Germany, Kenya, Liberia, Madagascar",NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,1931 +36,30,Seroprevalence - IgG,0.5,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Pre outbreak,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,Population based,NA,18,65,809,Republic of the Congo,Brazzaville; Pointe-Noire; Gamboma; Owando; Oyo; Ewo,NA,Mar,2011,NA,Jul,2011,NA,FALSE,Seroprevalence,1983 +1,41,Seroprevalence - Unspecified,0,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,381,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Other,NA,NA,Region,TRUE,FALSE,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,381,Madagascar,"Antananarivo (45), Mandoto (149), Andasibe (56), Tsiroanoamandidy (105), Ampijoroa (26)",NA,NA,NA,NA,NA,NA,NA,FALSE,Seroprevalence,2042 +19,15,Severity - case fatality rate (CFR),65,Percentage (%),0,100,Other,NA,NA,32,88,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,Naive,NA,"Region, Time",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,NA,"Angola, Democratic Republic of the Congo, Germany, Kenya, Netherlands, Russian Federation, South Africa, Uganda, United States, Yugoslavia",NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Severity,1931 +20,17,Severity - case fatality rate (CFR),53.8,Percentage (%),NA,NA,NA,NA,NA,26.5,80,CI95%,NA,NA,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,Adjusted,NA,"Region, Time",TRUE,FALSE,NA,NA,NA,NA,NA,Both,Population based,General population,NA,NA,NA,"Angola, Democratic Republic of the Congo, Germany, Kenya, Netherlands, Russian Federation, South Africa, Uganda, United States, Yugoslavia",NA,NA,NA,NA,NA,NA,NA,NA,FALSE,Severity,1931 +37,26,Severity - case fatality rate (CFR),50,Percentage (%),NA,NA,NA,NA,NA,NA,NA,NA,7,14,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,Mid outbreak,Naive,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,Both,NA,NA,1.3,70,14,Uganda,Kabale and Ibanda,3,Sep,2012,13,Nov,2012,NA,FALSE,Severity,2032 +11,9,Seroprevalence - IgG,NA,NA,NA,NA,Other,NA,NA,NA,NA,NA,0,331,NA,NA,NA,FALSE,NA,NA,FALSE,FALSE,NA,NA,NA,NA,FALSE,FALSE,NA,NA,NA,NA,NA,NA,Hospital based,Other,NA,NA,NA,Uganda,Bwindi,NA,Mar,2013,NA,Jul,2013,NA,FALSE,Seroprevalence,1693 \ No newline at end of file From ecdf9b5511ccc8dacc716fb04c6f6d3d9bef9d4e Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 20 Jul 2023 10:20:34 +0100 Subject: [PATCH 39/40] clarify outbreak_naive parameter --- R/forest_plot_severity.R | 3 ++- man/forest_plot_severity.Rd | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/R/forest_plot_severity.R b/R/forest_plot_severity.R index 502ae9e..3387d7f 100644 --- a/R/forest_plot_severity.R +++ b/R/forest_plot_severity.R @@ -2,7 +2,8 @@ #' #' @param df processed data with severity information produced using #' data_forest_plots() -#' @param outbreak_naive TRUE or FALSE. FALSE by default. +#' @param outbreak_naive whether to use unadjusted case and death counts (TRUE) +#' or the adjusted case and death counts (FALSE). FALSE by default. #' @return returns plot with a summary of IFR and CFR estimates #' @importFrom dplyr filter arrange mutate group_by #' @importFrom ggplot2 aes theme_bw geom_point scale_y_discrete diff --git a/man/forest_plot_severity.Rd b/man/forest_plot_severity.Rd index 47423aa..ce17d62 100644 --- a/man/forest_plot_severity.Rd +++ b/man/forest_plot_severity.Rd @@ -10,7 +10,8 @@ forest_plot_severity(df, outbreak_naive = FALSE) \item{df}{processed data with severity information produced using data_forest_plots()} -\item{outbreak_naive}{TRUE or FALSE. FALSE by default.} +\item{outbreak_naive}{whether to use unadjusted case and death counts (TRUE) +or the adjusted case and death counts (FALSE). FALSE by default.} } \value{ returns plot with a summary of IFR and CFR estimates From 97b3d4b8e90faf56069e646382e4d73ef937b6b1 Mon Sep 17 00:00:00 2001 From: rebeccanash Date: Thu, 20 Jul 2023 10:37:04 +0100 Subject: [PATCH 40/40] documentation --- R/data.R | 6 ++++-- man/marburg_parameter.Rd | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/R/data.R b/R/data.R index 91a68fc..1de64f7 100644 --- a/R/data.R +++ b/R/data.R @@ -176,11 +176,13 @@ NULL #' - distribution_par1_value = value for distribution parameter 1. #' - distribution_par1_type = distribution parameter 1 type, e.g. shape, scale #' (see marburg_dropdown_parameters for the full list of options). -#' - distribution_par1_uncertainty = TRUE/FALSE. +#' - distribution_par1_uncertainty = whether the article reported uncertainty +#' for the distribution parameter estimates (TRUE/FALSE). #' - distribution_par2_value = value for distribution parameter 2. #' - distribution_par2_type = distribution parameter 2 type, e.g. shape, scale #' (see marburg_dropdown_parameters for the full list of options). -#' - distribution_par2_uncertainty = TRUE/FALSE. +#' - distribution_par2_uncertainty = whether the article reported uncertainty +#' for the distribution parameter estimates (TRUE/FALSE). #' - method_from_supplement = whether the parameter was taken from the #' supplementary material of the article. TRUE/FALSE. #' - method_moment_value = time period, either "Pre outbreak", Start outbreak", diff --git a/man/marburg_parameter.Rd b/man/marburg_parameter.Rd index aea55f3..b55700f 100644 --- a/man/marburg_parameter.Rd +++ b/man/marburg_parameter.Rd @@ -39,11 +39,13 @@ marburg_dropdown_parameters for the full list of options). \item distribution_par1_value = value for distribution parameter 1. \item distribution_par1_type = distribution parameter 1 type, e.g. shape, scale (see marburg_dropdown_parameters for the full list of options). -\item distribution_par1_uncertainty = TRUE/FALSE. +\item distribution_par1_uncertainty = whether the article reported uncertainty +for the distribution parameter estimates (TRUE/FALSE). \item distribution_par2_value = value for distribution parameter 2. \item distribution_par2_type = distribution parameter 2 type, e.g. shape, scale (see marburg_dropdown_parameters for the full list of options). -\item distribution_par2_uncertainty = TRUE/FALSE. +\item distribution_par2_uncertainty = whether the article reported uncertainty +for the distribution parameter estimates (TRUE/FALSE). \item method_from_supplement = whether the parameter was taken from the supplementary material of the article. TRUE/FALSE. \item method_moment_value = time period, either "Pre outbreak", Start outbreak",