From 2c5d29a45e8da03fd2fee4066addc7a9b3206218 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:03:13 -0400 Subject: [PATCH 01/37] import epidatasets --- DESCRIPTION | 2 ++ man/epiprocess.Rd | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 18aec43fb..7eb05ac60 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,6 +30,7 @@ Imports: cli, data.table, dplyr (>= 1.0.8), + epidatasets, genlasso, glue, ggplot2, @@ -58,6 +59,7 @@ Suggests: VignetteBuilder: knitr Remotes: + cmu-delphi/epidatasets, cmu-delphi/epidatr, reconverse/outbreaks, glmgen/genlasso diff --git a/man/epiprocess.Rd b/man/epiprocess.Rd index a3e983665..f6345cbec 100644 --- a/man/epiprocess.Rd +++ b/man/epiprocess.Rd @@ -2,8 +2,8 @@ % Please edit documentation in R/epiprocess.R \docType{package} \name{epiprocess} -\alias{epiprocess} \alias{epiprocess-package} +\alias{epiprocess} \title{epiprocess: Tools for basic signal processing in epidemiology} \description{ This package introduces a common data structure for epidemiological data sets From 3f4a07d6b4a0967bbcd0997af2d02c50e6c57c5b Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:14:08 -0400 Subject: [PATCH 02/37] remove locally-generated data --- NAMESPACE | 1 - R/data.R | 165 ----------------------- data-raw/archive_cases_dv_subset.R | 42 ------ data-raw/incidence_num_outlier_example.R | 18 --- data-raw/jhu_csse_county_level_subset.R | 24 ---- data-raw/jhu_csse_daily_subset.R | 61 --------- data/incidence_num_outlier_example.rda | Bin 3213 -> 0 bytes data/jhu_csse_county_level_subset.rda | Bin 20371 -> 0 bytes data/jhu_csse_daily_subset.rda | Bin 81174 -> 0 bytes man/archive_cases_dv_subset.Rd | 56 -------- man/incidence_num_outlier_example.Rd | 48 ------- man/jhu_csse_county_level_subset.Rd | 52 ------- man/jhu_csse_daily_subset.Rd | 57 -------- 13 files changed, 524 deletions(-) delete mode 100644 data-raw/archive_cases_dv_subset.R delete mode 100644 data-raw/incidence_num_outlier_example.R delete mode 100644 data-raw/jhu_csse_county_level_subset.R delete mode 100644 data-raw/jhu_csse_daily_subset.R delete mode 100644 data/incidence_num_outlier_example.rda delete mode 100644 data/jhu_csse_county_level_subset.rda delete mode 100644 data/jhu_csse_daily_subset.rda delete mode 100644 man/archive_cases_dv_subset.Rd delete mode 100644 man/incidence_num_outlier_example.Rd delete mode 100644 man/jhu_csse_county_level_subset.Rd delete mode 100644 man/jhu_csse_daily_subset.Rd diff --git a/NAMESPACE b/NAMESPACE index fc6aaf74c..1c3ac6c84 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -45,7 +45,6 @@ S3method(ungroup,epi_df) S3method(ungroup,grouped_epi_archive) S3method(unnest,epi_df) export("%>%") -export(archive_cases_dv_subset) export(arrange) export(arrange_canonical) export(as_epi_archive) diff --git a/R/data.R b/R/data.R index ec677547f..7776690d6 100644 --- a/R/data.R +++ b/R/data.R @@ -1,94 +1,3 @@ -#' Subset of JHU daily state cases and deaths -#' -#' This data source of confirmed COVID-19 cases and deaths -#' is based on reports made available by the Center for -#' Systems Science and Engineering at Johns Hopkins University. -#' This example data ranges from Mar 1, 2020 to Dec 31, 2021, and is limited to -#' California, Florida, Texas, New York, Georgia, and Pennsylvania. -#' -#' @format A tibble with 4026 rows and 6 variables: -#' \describe{ -#' \item{geo_value}{the geographic value associated with each row -#' of measurements.} -#' \item{time_value}{the time value associated with each row of measurements.} -#' \item{case_rate_7d_av}{7-day average signal of number of new -#' confirmed COVID-19 cases per 100,000 population, daily} -#' \item{death_rate_7d_av}{7-day average signal of number of new confirmed -#' deaths due to COVID-19 per 100,000 population, daily} -#' \item{cases}{Number of new confirmed COVID-19 cases, daily} -#' \item{cases_7d_av}{7-day average signal of number of new confirmed -#' COVID-19 cases, daily} -#' } -#' @source This object contains a modified part of the -#' \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository -#' by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins -#' University} as -#' \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished -#' in the COVIDcast Epidata API}. This data set is licensed under the terms of -#' the \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons -#' Attribution 4.0 International license} by the Johns Hopkins University on -#' behalf of its Center for Systems Science in Engineering. Copyright Johns -#' Hopkins University 2020. -#' -#' Modifications: -#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From -#' the COVIDcast Epidata API}: The case signal is taken directly from the JHU -#' CSSE \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub -#' repository}. The rate signals were computed by Delphi using Census -#' population data. The 7-day average signals were computed by Delphi by -#' calculating moving averages of the preceding 7 days, so the signal for June -#' 7 is the average of the underlying data for June 1 through 7, inclusive. -#' * Furthermore, the data has been limited to a very small number of rows, the -#' signal names slightly altered, and formatted into a tibble. -"jhu_csse_daily_subset" - - -#' Subset of daily doctor visits and cases in archive format -#' -#' This data source is based on information about outpatient visits, -#' provided to us by health system partners, and also contains confirmed -#' COVID-19 cases based on reports made available by the Center for -#' Systems Science and Engineering at Johns Hopkins University. -#' This example data ranges from June 1, 2020 to Dec 1, 2021, and -#' is also limited to California, Florida, Texas, and New York. -#' -#' @format An `epi_archive` data format. The data table DT has 129,638 rows and 5 columns: -#' \describe{ -#' \item{geo_value}{the geographic value associated with each row of measurements.} -#' \item{time_value}{the time value associated with each row of measurements.} -#' \item{version}{the time value specifying the version for each row of measurements. } -#' \item{percent_cli}{percentage of doctor’s visits with CLI (COVID-like -#' illness) computed from medical insurance claims} -#' \item{case_rate_7d_av}{7-day average signal of number of new confirmed -#' deaths due to COVID-19 per 100,000 population, daily} -#' } -#' @source -#' This object contains a modified part of the -#' \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by -#' the Center for Systems Science and Engineering (CSSE) at Johns Hopkins -#' University} as -#' \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished -#' in the COVIDcast Epidata API}. This data set is licensed under the terms of -#' the \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons -#' Attribution 4.0 International license} by Johns Hopkins University on behalf -#' of its Center for Systems Science in Engineering. Copyright Johns Hopkins -#' University 2020. -#' -#' Modifications: -#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{From -#' the COVIDcast Doctor Visits API}: The signal `percent_cli` is taken -#' directly from the API without changes. -#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From -#' the COVIDcast Epidata API}: `case_rate_7d_av` signal was computed by Delphi -#' from the original JHU-CSSE data by calculating moving averages of the -#' preceding 7 days, so the signal for June 7 is the average of the underlying -#' data for June 1 through 7, inclusive. -#' * Furthermore, the data is a subset of the full dataset, the signal names -#' slightly altered, and formatted into a tibble. -#' -#' @export -"archive_cases_dv_subset" - #' Detect whether `pkgload` is unregistering a package (with some unlikely false positives) #' #' More precisely, detects the presence of a call to an `unregister` or @@ -215,77 +124,3 @@ delayed_assign_with_unregister_awareness( "archive_cases_dv_subset", as_epi_archive(archive_cases_dv_subset_dt, compactify = FALSE) ) - -#' Subset of JHU daily cases from California and Florida -#' -#' This data source of confirmed COVID-19 cases -#' is based on reports made available by the Center for -#' Systems Science and Engineering at Johns Hopkins University. -#' This example data is a snapshot as of Oct 28, 2021 and captures the cases -#' from June 1, 2020 to May 31, 2021 -#' and is limited to California and Florida. -#' -#' @format A tibble with 730 rows and 3 variables: -#' \describe{ -#' \item{geo_value}{the geographic value associated with each row of measurements.} -#' \item{time_value}{the time value associated with each row of measurements.} -#' \item{cases}{Number of new confirmed COVID-19 cases, daily} -#' } -#' @source This object contains a modified part of the -#' \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by -#' the Center for Systems Science and Engineering (CSSE) at Johns Hopkins -#' University} as -#' \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished -#' in the COVIDcast Epidata API}. This data set is licensed under the terms of -#' the \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons -#' Attribution 4.0 International license} by the Johns Hopkins University on -#' behalf of its Center for Systems Science in Engineering. Copyright Johns -#' Hopkins University 2020. -#' -#' Modifications: -#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From -#' the COVIDcast Epidata API}: These signals are taken directly from the JHU -#' CSSE \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub -#' repository} without changes. -#' * Furthermore, the data has been limited to a very small number of rows, the -#' signal names slightly altered, and formatted into a tibble. -"incidence_num_outlier_example" - -#' Subset of JHU daily cases from counties in Massachusetts and Vermont -#' -#' This data source of confirmed COVID-19 cases and deaths -#' is based on reports made available by the Center for -#' Systems Science and Engineering at Johns Hopkins University. -#' This example data ranges from Mar 1, 2020 to Dec 31, 2021, -#' and is limited to Massachusetts and Vermont. -#' -#' @format A tibble with 16,212 rows and 5 variables: -#' \describe{ -#' \item{geo_value}{the geographic value associated with each row of measurements.} -#' \item{time_value}{the time value associated with each row of measurements.} -#' \item{cases}{Number of new confirmed COVID-19 cases, daily} -#' \item{county_name}{the name of the county} -#' \item{state_name}{the full name of the state} -#' } -#' @source This object contains a modified part of the -#' \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by -#' the Center for Systems Science and Engineering (CSSE) at Johns Hopkins -#' University} as -#' \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished -#' in the COVIDcast Epidata API}. This data set is licensed under the terms of -#' the -#' \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} -#' by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. -#' Copyright Johns Hopkins University 2020. -#' -#' Modifications: -#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From -#' the COVIDcast Epidata API}: These signals are taken directly from the JHU -#' CSSE \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub -#' repository} without changes. The 7-day average signals are computed by -#' Delphi by calculating moving averages of the preceding 7 days, so the -#' signal for June 7 is the average of the underlying data for June 1 through -#' 7, inclusive. -#' * Furthermore, the data has been limited to a very small number of rows, the -#' signal names slightly altered, and formatted into a tibble. -"jhu_csse_county_level_subset" diff --git a/data-raw/archive_cases_dv_subset.R b/data-raw/archive_cases_dv_subset.R deleted file mode 100644 index 5ba7ac4b3..000000000 --- a/data-raw/archive_cases_dv_subset.R +++ /dev/null @@ -1,42 +0,0 @@ -library(epidatr) -library(epiprocess) -library(data.table) -library(dplyr) - -dv_subset <- pub_covidcast( - source = "doctor-visits", - signals = "smoothed_adj_cli", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl,ny,tx", - time_values = epirange(20200601, 20211201), - issues = epirange(20200601, 20211201) -) %>% - select(geo_value, time_value, version = issue, percent_cli = value) %>% - # We're using compactify=FALSE here and below to avoid some testthat test - # failures on tests that were based on a non-compactified version. - as_epi_archive(compactify = FALSE) - -case_rate_subset <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_7dav_incidence_prop", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl,ny,tx", - time_values = epirange(20200601, 20211201), - issues = epirange(20200601, 20211201) -) %>% - select(geo_value, time_value, version = issue, case_rate_7d_av = value) %>% - as_epi_archive(compactify = FALSE) - -archive_cases_dv_subset <- epix_merge(dv_subset, case_rate_subset, - sync = "locf", - compactify = FALSE -) - -# If we directly store an epi_archive R6 object as data, it will store its class -# implementation there as well. To prevent mismatches between these stored -# implementations and the latest class definition, don't store them as R6 -# objects; store the DT and construct the R6 object on request. -archive_cases_dv_subset_dt <- archive_cases_dv_subset$DT -usethis::use_data(archive_cases_dv_subset_dt, overwrite = TRUE, internal = TRUE) diff --git a/data-raw/incidence_num_outlier_example.R b/data-raw/incidence_num_outlier_example.R deleted file mode 100644 index a5cb4d899..000000000 --- a/data-raw/incidence_num_outlier_example.R +++ /dev/null @@ -1,18 +0,0 @@ -library(epidatr) -library(epiprocess) -library(dplyr) -library(tidyr) - -incidence_num_outlier_example <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_incidence_num", - geo_type = "state", - time_type = "day", - geo_values = "fl,nj", - time_values = epirange(20200601, 20210531), - as_of = 20211028 -) %>% - select(geo_value, time_value, cases = value) %>% - as_epi_df() - -usethis::use_data(incidence_num_outlier_example, overwrite = TRUE) diff --git a/data-raw/jhu_csse_county_level_subset.R b/data-raw/jhu_csse_county_level_subset.R deleted file mode 100644 index faed75e8a..000000000 --- a/data-raw/jhu_csse_county_level_subset.R +++ /dev/null @@ -1,24 +0,0 @@ -library(epidatr) -library(covidcast) -library(epiprocess) -library(dplyr) - -# Use covidcast::county_census to get the county and state names -y <- covidcast::county_census %>% - filter(STNAME %in% c("Massachusetts", "Vermont"), STNAME != CTYNAME) %>% - select(geo_value = FIPS, county_name = CTYNAME, state_name = STNAME) - -# Fetch only counties from Massachusetts and Vermont, then append names columns as well -jhu_csse_county_level_subset <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_incidence_num", - geo_type = "county", - time_type = "day", - geo_values = paste(y$geo_value, collapse = ","), - time_values = epirange(20200601, 20211231), -) %>% - select(geo_value, time_value, cases = value) %>% - full_join(y, by = "geo_value") %>% - as_epi_df() - -usethis::use_data(jhu_csse_county_level_subset, overwrite = TRUE) diff --git a/data-raw/jhu_csse_daily_subset.R b/data-raw/jhu_csse_daily_subset.R deleted file mode 100644 index affeb1935..000000000 --- a/data-raw/jhu_csse_daily_subset.R +++ /dev/null @@ -1,61 +0,0 @@ -library(epidatr) -library(epiprocess) -library(dplyr) - -confirmed_incidence_num <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_incidence_num", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl,ny,tx,ga,pa", - time_values = epirange(20200301, 20211231), -) %>% - select(geo_value, time_value, cases = value) %>% - arrange(geo_value, time_value) - -confirmed_7dav_incidence_num <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_7dav_incidence_num", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl,ny,tx,ga,pa", - time_values = epirange(20200301, 20211231), -) %>% - select(geo_value, time_value, cases_7d_av = value) %>% - arrange(geo_value, time_value) - -confirmed_7dav_incidence_prop <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_7dav_incidence_prop", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl,ny,tx,ga,pa", - time_values = epirange(20200301, 20211231), -) %>% - select(geo_value, time_value, case_rate_7d_av = value) %>% - arrange(geo_value, time_value) - -deaths_7dav_incidence_prop <- pub_covidcast( - source = "jhu-csse", - signals = "deaths_7dav_incidence_prop", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl,ny,tx,ga,pa", - time_values = epirange(20200301, 20211231), -) %>% - select(geo_value, time_value, death_rate_7d_av = value) %>% - arrange(geo_value, time_value) - -jhu_csse_daily_subset <- confirmed_incidence_num %>% - full_join(confirmed_7dav_incidence_num, - by = c("geo_value", "time_value") - ) %>% - full_join(confirmed_7dav_incidence_prop, - by = c("geo_value", "time_value") - ) %>% - full_join(deaths_7dav_incidence_prop, - by = c("geo_value", "time_value") - ) %>% - as_epi_df() - -usethis::use_data(jhu_csse_daily_subset, overwrite = TRUE) diff --git a/data/incidence_num_outlier_example.rda b/data/incidence_num_outlier_example.rda deleted file mode 100644 index e898b5eaa6b359ce9ab2bc6aa435a4a071eab54e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3213 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 b0Y9{K1Sk&auyI=J=h0v@?K2sN-;aL)=ZuL` diff --git a/data/jhu_csse_county_level_subset.rda b/data/jhu_csse_county_level_subset.rda deleted file mode 100644 index aca0983debba2ca6617234f82193e2a9dc63294c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20371 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

9Zq_+dd1od4~t8 z!6wqsZlv3Is9&G(ZhbB)2)_*Cyu{P)UG%D4(>%}73k#oU+umyodY%EPlun7{X}#W~TxRcbUSF^-|!^6vXn>~iYK!rKZfWhhSUMsdB;3g9qHmZzRi?9oGzK*s3*+S(z{kqc1Z*vv_#&D2wFJ z?qwHoMK$f+O)>VAG`gFwaS^~baWUrn#C)Xgw0S;Mi7&sCx&etbIT`sYn@X#kfBsMI zy5RoO3Q_{kn(vWTaH9h#{lVGlJ%3H@))Sh)!}~QPE64U+pHAB*wwyl9*57uFq2(x6 z>M%4Tx@!hC1TV&s+F>C(bFu~D0&zXw-@_0{h%Z6Io`Cci!YaV22P&VvsSk@qSN(87k2H**|`uK{XbXK2so(fWL{v)8T0Azm(LFg&y0UhWb|x8kTVPLM71? z*b(B_aVUJ9c-?yzqJ=`!v5xP0fM6bGy?$E9-8|T878>(;lu(dlIqsp5E<@D#R zh+^eK&-`=lniF~9h_ei8&fNb&ZZxruA#ri7`<0t*Kl11I^3>Vi)3WT+P?W_gqZ1X0 zxf|RsaJmuM>21!Y+5bBrNY9}JPe~X^y<(}@Kw%stz$rCWOs0_bzM@dAWt}taA0k(0hN?H3oj)Q7wYb}vPc=~g>=*zP)Eogvc zi@h%QU!^s;tjy1$Bzi)LLGfMj#~43L#Bz-_`zzl2+2IQAA7qwBZyV+WIMu{&a;?kO;nZB?8R}qaess!ySl9!+xGJ? zbd?BLsW=qdbmD1(#$$ZY#;nc&#Lym32*!3UxF+yQIY>C>P@FNv4lLRuX^J2S{sYwR zxo=|YK6}1$?psMn!6h7XEt;8d=gOJtaU@ElVP`FF^rN%uCCG1@O= zqL!Gz$WT9RW@*N+o;IEQs$xqGmyabAIXk(#{wUu-@#W-u6#84$H-eL6o#b^|ZjgjY ziKuGN316J^_R>L_Zw-6MB0NQ0bb{uIsHQ?suRBhFpnfkESB?8Gtcsa??z=Jkw5=AG zDbp-3zlnd$S3CS25pu;SvqtAOfrAue+W*!S8o+EAhB*9+b(m3lNep5Fq}1ksd-b7V zIy}`@Fe@!h3EFb;P8`;>vJ^bQWQrOhtNN%COK@V_gGm^)<_ji(9TMwpSJ|3w%w6>n zEW&-^rOXQENFDrUx(EwT?&H(~F4S%rNbZ7CcK9F3gFV^bYwt#<-?~9ux#hn0Qis9E z&JAV;lGSDzV*p7M%w;o?n|`C^Gy^$uM^0G+opis}0w7{ym)?XfSPkNjTZJQ zawDtVqN`F4)I$-;3W5Q9syMFg2NWNGaY5pM4sssyxc{D!4_jz*&+l`q)vj1$8JJY< zQxGD6VcxR6yeSwbRou=hn3pg6SUcKO7Z{48lB>5^>in;mSBENx<3RSn%B#lAM#AG` z%%(ou3`NH8mjhna>F!}6MCO>?Uz=*rj2Xzlw9}*yq6SO)y8%UY#gq+XWoTv2-BhEg z*Q*>^8_43-LUteE)IRH#$9%9#nOwhhetD=jvtea!-T1%VP4M|RMf~G;%M^}d&0X!i z@^jgn4m|G`TSJ)O#?HdK`8m}V(RcrAWscb)Y8866P&-v-dK`^=uV4%!1}ky3KUbhmOGr)xwm=$ zh{3L9Jz&Q%m_27J<0WrtZ{Ie=U!mTy{$N4hLl#f+27ak*CeIhd#OX-IgYTO=+M6r; z2UUTZN}x0ANVmNB2R!<^T)X3o~f)E)hg*z~Qn*Hu+d&EH3C zoRwbTSWcH7L~(1DM{!S>^bxSph{IX19`By7v20aJOZOLSoe>I8&EOMm223 zhRE>yT1~zd$KACLUnQ}@W6MzeOk^R|m<-g534h_+$Iy z_-G7I4L?&NYx<{VW0Rgydh{!-!n9Vdic>JeG-fRqPC2(vM#qUV^0{L6ID{_-7j?sm zvjN03{j*kr)Czw3Yq5%iW}P;`*$1hgz~V)a>~ikY}9WN*zzfqK7VkugYUsK$O7AaQIwiLxdV zBwPoo9Fx9_-vNvJbDI+2XWgxHUkXV{fwIZR{L4rLrwQ zorxgo7y|<@c$(uy6DpRfHvSz2%@B4?rH@YNS`9<-R+k1@5^nd~vcXusPI2&cs(Ee# zg1=0S=tx%*9zG)UCQy{ zEm9g#?F4$6PkI$HQ3{Z)xoH<83u{mvrpgV@2`6`Q%4GgKSeqU9#P$u4z?lt&7E*|i z7WWdWPSSSB!s*?F{l$G6XjN`^fNDh}=oZ!OwQ+p+C% zO)Sv4+7}|i-LK=i`H^*Rs>D1t{{5Y6U!z8ng8F1n&6kvFCO^+CYtS><{k z5Fiwl3pE67$!msK%IfYwbNwFoe9R~>VK@Z@y0UIBP2mhnxUxw2!a!AWvnjhEr{dq| zy8z=?M^4${>QCu0D?9cb+!Y-sS>eJOtM9pI+M7^uLC3nF?Yxyk93R*PD^uSsGr@{7 z|GB!uw`~6TP1$Pqs;Y%XWtanu@r7vco=C>`pWLN%@F{-%>P(b(1ty)ZdP!kRIme08 zV&{;wXRv%sWDrJjz%4S5C^FHlM2t_!Dx(0$x!mRTLcJ1 zOnwj$;vDQX+Gp`Ky9b3f*X7Z{ksEQMF#Mh+?jcNSA1wNMfdCg~D7dE@Yo#=N`IR%C zw965mQz(<28?3`nZH_($Rv%*gKRU?oHad)@*cdoQDaJ%)Mk}t}X6`BKoKZ)90~_(W z9fx=ZEzNtdyVjU%rrwk}Q}oKc7mO@lX}Ss?&x>?tZ710f-7s?oSTD`NV3;QshAYf0 z@Z4Ertv<2Ew@~9mVDMtndFhzRD2Bg^VKK_YQ8cBRX3N-RxvN3o7(d9YAp~K;Vu9Jb z&q4*!vRIyb%)>3v!JAA>)(f)pHZlD+>c=&y!R|EKH-Bf&Jx}HnH%|JWj`~@^P#R5_ z`Y>>6bfi8~-06(+*R8ZjsHBfSa`2HFG|pJf`8FZ$H6e_?_T2TzvbZdb-ODzdl8D05NUh_UaqvC;XRTk(!JAcg=`$-i}Fg92bH1CSgb0dyeB(G3PN zi-{bA{wvOIeGaWhVm)cQ%JRtfYtWCx$P#{x!H~$Z{7wwsR1C*-i=-fprmOoN1m-de zZ!>Y=*n}}n9jlI5gD`_AG7E?{=FhoAT&uUGiKFwVM;HhwK9CVKL#s!d44=BWp!7whK;ls z8u%DO$uurH!!@&i8;E2P=62UUTVHpbIP6W`@Up131`Tu0!z`)p8t2)x6c^c8(AMm_ zurp$()I6a0H{L{8g=3Vg0m zcVUf9nqv5^T)JEZg4XL>9=lrQ?#g?zzZ@Kfv8K!WA{zH;It# zO)2<0JZBrv@jZI>O*_Mk(ae-l3@5AWf}8)GmvVZHDGrir%k9sbd-e^P)folSD-L{OE|&YgLJ~ zUdb5N3t&%dA5q{FMFKfxk%9vPAcP9AwkCoru}-6jXYL__zgS&vO zvfyt~qUO@54V?0cUU$Y=yPFj=hOEfOss=+0VV8{nVpu}zhMmijQiDlL&`d6`r^^FT zmxvvyk%VT7Qw%=VTS;iqj`FravrGGCN3;O+uv{G zeb!p#M@ghwj8KP995`H`Q!}C1)jDx$u*x_hL=ORq?V!=1E;M!+#6t0`G9S8X>TZrB zw8u948Co$a(>l|!v78Bc6!)){zFp#^Jj)yG<(2}2`#V{Ibr*4Po6u%lD5Sc^zbiQ% z2^FN6v#~fRbLylV&HdT@J2hfNyn+a8j1yC~I@@`3{X`!=yl8bTK^o!%Q)GjKl}yYr^`ji$PkSe3*TB&GA1RR{LHLuvN}A-?_d zuapQDH0E3a>w$b=zPB?GU7XU68$S7)qFp&bdhU@H`pUiFEWS?!O4}~*#L8H<4>soU zJ4&RT$oIV`s}jA)zb?xrO!1fn)|;BoYp&%G4HmO+msjyc;Px(AI2(}R6AApEr$vrO zI++;Geo2RK(hz9nkB+rU@O@~_)Mjs4dg!>?>w*#j%gKJxtb~EDTN4SVmi1n+`L*f04(Q0{Geclaw$v2-@r+9F)hw z^k0v@YPNhf*Z#7>=;$0E^GO$00?$T-!Lbbagny!M#?cCy`JH<(!-Dl7ol#}EZ?%r$ zNBEzhX|TbOjz>$Rpbr+v`x@Z(iAX=j^Ux8*YesnJWO=NoDLC`BU(cTw=PM%t9vDs~ z4PjNzuty~?`>JFID!Cx`%{$7+IgQe0WzB2j8@TOHYnu#!-vfDAwSQj&<_w~(Z#;dd zZ9{+4CtAC|Ao``iaDPKul47*IM-;0?o%>m=s=cjzHiJOrGedWCItiQ$K*gUc7!N(& zGp3BJ187_SGSH1?8nKMSKDkO9SXh-y?e4F^<6y8DV59P2oMKJT&0V>@J0t#SdQg10 z8J=T7yvSH#jr(tR+g!XYY*5=rLyb=-z}hfnkZF4&RL#k8={1?RMWxs{LjN;>v}3l9 zqg1|so)1Bi^hWtU8Uy6MhH+_Q(PKi$hvywpvh!K`l)}c07TfEVWS#%#qHM?y%1PH)5n=&XG5ezX7XoNjM1E}}OP;Z8}U!NgAM#@fYvDf>S zHrkeLo7l+myz{PQiYa6X7g&Zh_V+Kwd%}5*W#p-l)CdmX3}E+%+2exJ)RtPorJQa! z__;TC8hS82v7neTjnO!|ckiW+CQHJTxbOPvKl&9mX*$c9uen!lhRZh9mY-DX3vjb4 zhW@zOp@dJHXco6Gb)?%e&7X03WsqQ*wq?4lI~jhB>_qW2u2WjUsHahbhZJ;@$y^?Z zuO@YY{I5|kNs%56(rTj>!GZ=mEKylqo1T~?fwoLci>2OIpM72+q}Y_t+`6rmX@O@4 zEMUc-%Nh?Wcc(95vn*CsnZvCvjAP~)%TDH)9tpPUwjoulgrYnBkSfpV{F$fl?)ePb zHGdx7L-O7^QZ+X>pUkJ0KLKNLJ5?Kt!tT~Yz--vCwi>`YSv-Fq2ezR_n(MFG%O=KO z6-76WHSK1sY@akK#Od+PLIH<1QIY#GV`~`L#v)}Leypbf!gXA08y}Qq8cqV4Vuj;1 zcVy~E$;bY+mieqz>^B9h4YXuw*b3c^!Q&XLO7i(wJ01Cm|M`q(1<*3|n5oWYPd*>( z1A|UU137^?8uVhr2TP8Xw)Q+jZkey`N*exHvbI3)bW&?ub5IyJnt}I{pZ;4;c=C0O zbA}9q1M%tBKQ_+I2cX;v9DCxikm;P4@fxtoFV5*5r$PU#A|>U^Z)2LY7w>0=ZF9*x zIc1;vxlDwvRux8O*<#bZJtLwXhW-+17FQK zSQKb+Rys{J_X@AC;=WNFy{8iWnrs+2;T z2YM!F)u+Ny1~Q{o8!t2*F;52?#-7eHr)~noHdV9?h~<tPU{cxwn|jC?{gWZ9KmqpyJM7#C;BU2}=E10lUGOSmHtf1`rseQ`)39IG>DNF%yIX~(HS0ul-UYSoedgt&SJ zBv3pW0n9kanBz6@{3%el_$l1`ef9+@8KhnZEmOt6cy?6rO1zr19n1oiaKngM+EWxk zNTO1VhfD>;CxbDAh3Jw#oBkZWW4xdbkZi$hyS$KKwl)2q?=y;pp~Wq)P~IQUs5wAq zHg=dRj8T{(1t~dMOsQD;Aop7;=))@om2vBZFhWb|hlKw_2K82=zH@Xp3XuutuIc` zke2vf*`#wm#JT9Xf{Y~Wu@HA#wkk?%j2?!x90|i0fVDXt^L|zbm_l&c!C6b`- zZ+zSZN4HkHsN6#aoYoQ1EIY^>ne#POEJ{DG!Kago#-D>x+dL|smpwk-b2Mh7i_Bip zk?zgq=$|uHsCx;wmacihTiP2Wu1bO#M1>0V^P;K-=bLA*H(yqc5k)!UH&)&!rRAqn zIH6=5Iw_n9LF@HXIz^G#`i-btJ_@>GDdw^`{^C6-7S8>+mN-q}0rf(6Yu zcAHBd8e;p;iJF*LT{O8m3ySXPZ+jT}t&b&F=2>B6Tgl@qam+y3*0UTQfngMd;CyVV zh=`d*aJhDJA`V3sR{&&$hNZEf?z4(+nc1t@I^S7892QDYg%Cf+l488bDeZKz8^53Q zZ{{43v9z^mmVft#L-B{tb5EIxRIZ%d0zg9A_QT-3MJ;mF*-gAiII%4`CqCQ zDs^B2;K&$e0tXvWf`Aoga~j*_aevrJ*nD$Ho>o5@U3bptB$%c#>DSR_{KUW~FFdaq zIKLSw8*)u12J(Y`J|=|9p)D`AOW5nu9YxLSDaMWOXZjedE$-c6q*=55nhYFUk79Ox zOlz^UB5b_Bj75m1py57d#RagfWqXika$KKbLAo0Kql`UfS8^V6UK{d--e6=>8>rdB zjfi~s@n$xb|EP$x3BE>^GMj3?8|Pja@@;5&oQ@0Q!P_N$wJ|yIZh5{~*wogRmL|8i zIg4DcDg9!hFe|>}L+tk@cr~&H3RaGj~enYJ7#zYfgt_{@mwEH}2VbZD#0A5^>zS%yGbTfZep96f2PH(b7zSglA+n@Q|Sy79_ z|0G;{k`9<(ach;AIy#X90*F~QexB{c`de;(PAVj#YZ2E zbUGBdPS>X6waL0aWUM?ebRO=#kL^|{IP)%qVayu2@I{Pm^&!`mG>Y=$*ltOdvD&N< z;#ehM%N?F}Z8z+bWX@0Lb`{)5Mxfy8Jq~PWl1LcgmFNOvS;R8Pd z*$O<|d41#gXc6*oa;SG|}jT&>HQ`@xfd^U59N z<(U`J+aLp4e}Tk*ilU}3P!j%AOjny$VAdWBxp=jXPziCMxxw9^n&UtqXekMi)M@R=$ z1c{^jBQIOX;vm=V!;T_o88Fkv@R-6)JR!sgNm`yswIFCobFli%3H6r#Wxg)PhI|j7 z0~`5B>4(DWHCe}Ngyj{PDV(L|g}j>z)AdASjjJDry?nSduc;8*`JJF_^9RF5acZ@= zu9*)Ou3ZVGuf6is_JgOO*U}d*c;VOH$m1N@Ohdk|5c~R@Q1k;KEVoL1{C5vL6Oe-!Q^9chiU;W1HGpRNNppE?2cYG(ir@<*_ zpU7>(z%%YbhGEu}bI=$>@1aXFI+@ryr`ZM0quM`VgLItLrorJps}Hq08O--Fbmqik zE$2v#rf~@zUJ8gX7?$j&<0QctT0_GApS12bwJ?A0buLejZ$^L8lOU7ZI=S~o*5o7j zR1ADcv=>%%o0so*cX-gaJ!Y&iB-?4A>-$;5BxpD}O$j=zUmdi9b34{)n1cm*3UjZbicZOomY)OFEd7iM{@>saMN zrwtohj1^Y2H}2J1+TuUinvU_d%@=+L%b2iBh@&-;j;E^X`x{7v)6xnA^0)r=pq* z`xdZP5pV_j3!W?BumZUXd@pQYfWA>!MV1$YU7=yc#1-IOL0<*=3luJ3xMKRn!xea1 z0ab;d7lc}|SB1nDh*kl9!oUltD}cFTr zi%u)}up-C{A}r{(LbZ!fEl9Is?~9BrK(S)J3uG(^xkAp zx&b#IkWbhps3mYEFel32wV9#7+Go35n0Yu-t7jJe+u6FCiU)=jZc}%EMXAphDVZ)i zB)#?AjCL^hw{`BvA~x4ocK)BK^NP3keqYlkk;~vY@q1QCvi1k%^nL_;C+xav+^#%l z2d~TC_MhS9dRb|WKP7;?USd$5p40{$vxInuoY)hVMTau1vi_R&GY4B61=5U92064# z)C>L?A@=(ZHft`jx6LNnhe}>W)WElY!M&df!_=(uFf$B;OeefChGqr^WHTlhOfqD0 zDxxM-bC6dqRa6%sqAIE)prWX_MHl{7T&gA*NPO2zcy&qxZPA`Q=W@Caix@hzhbfcA z)bw3|YdFo2aedDxWmqOSNFSo?xFtJg9JVa(`?YjGJMy1%j|v8uaK~}((gXhHU0MzS zp9!&b#kEX!7_{xN4~*|Kf?ngy`y)M09ODS>+bi=GUq#Uy3r}?qexV=d*FL#Pg%Qm> zJ?AW&D=ewV_JVd12zT&`R&2&9hy|M0X-7HMIXI;_W^S4$yX=WfksJ9%H2Fawx zSDTGSctJ^yT&L+I1$I7)W247+LRmXj8W!b9Ap8m z-HE;C1XsStSBT(qz1>^>CbDi_Wn!&cjyivS3_>PeT|V^Kn3Kl)VXk_R2~`%q$RP3# z2l&E}*CnJYfw;m_wI9*{uox*ejW=0K;ZWsq6CDffT8Zyvweh?gFXJR`c%{1fB!MqC z&Vx|xnC@PK=Sy60?hFJ&g6u~c2i0cS8R1xG25- zdkw~DMhOJT$ZOAG+MH{G^Ac^O_g+KoHubPDI?d(Ek8>4ah(O$vw>`72I;~zAKv@{< zKf>6?g7c=$#P#X#0V0ZY;*=^H91E05AZp(pOW$N!1r8iTFi;w`H^eCoCs==`5c(qg zoiyX*j{aPd4vzR7H^&ovQ3pI2l7lu<5MAsI>NKNR%gYP~O-0ph9hU2}Nm`S*83F-P zXmKxe;oD97IkDyGXN4&Fjyjalj8K_9_Xmzlz9v{6 zAMEnd%7{;+33u`Rku1##=5T76<-OcCdoX+jxOKY?2==;+UlfD`cs@(aMGFjuVUIs; z`J7B5eoq?p+G5GC^xsRVX)KmZgrP;TCLdoMX_-+XW?mn+LnYtdyoF#?Wz@4b51A0J z#7;j}PQf^L11j^Ti!-@(Cn%|miy0Y|1J#e$%h@0ZOoNFRp1V#Ll)ZW!xXa5CSn;}G z9IvgU7y4L@<}pWe1Lv3@ZG>77JDyq=SbMum7K`-)vrI(A;hseU1ikt+2@#{PL+or) zPnR_mF=su&`)sFkFpAtodD>h2kk{o`1tWkgut)>}zC?UpJrIC3ST|4Jbcor;;0LwS zUc?*`WE~{k#>>i_->ib^Tn!9KKJ;R%wLr+mPBqPKVE-kUclL;m@g_L$9LC^qc^-6`6KFA3-O+J^A#Q7P^0w_S>8MOk z^Jb5g?P`BWIh-Ff(y7s|%Wks(buwl4zVHMizWm!c z+&b`)k&Z7r*C?1+YM7WuJatmU@#Aze&#*uq{M$WLw&JHc@5b#MNK)M_I}RXQVaK@) z1K2E1FU^~185EZ|lVju_jtu7}{sz&}ZpAU<{4?wN=hX5MP2|gGkB@|(xcZ)1q`B`Q zZBHvu@PUu5la3Qx?8TYokcc>{Slnjv(4wU*%|34w#)@&@VqPlF1r; zac|v+LG-nAXF7S8h|IOT$yJKM4%1H>_Wzii=|A6$Q6VcX3cJDAF~i(Gx9)8ek;Qf3 z!Y$7qyl748(~3E*ZEwi_e?FVYrH!gYNLykhVfz-OOwm>Yr?jR~uTHNy%P{NKbJKkZ zO7M0i&6vlAdNa{t_31(<%^FR!uqSZbhkDgV?V#&@4m}nxF%I@ zKVr_i?@jC0P~m=K;@VCy>|Mjz=R=!_kJ+PBcy%e`Jm$5*mA#E~Tf9-3!ljtlAUw;j zB;lY$=TDIU<{omrFay#Bx+t9mI*Y{T7vC%11*^Q4Mua3Pq>dP2nUiFf8p3Nx2v4-u zs@JxwswUy8?dTDx#JuI19}?}gCLTOs?BeRm>@X`mec6_~!5Z_X+t#@U>65kb*r;tD zJjH+8YX9R$;%gdmN{OGotoI&em5_f9*vhdAw8( zPXUdFI}aJ}hDIn?f7x8RKfiKz@wjT^9BjJ@A#Z#wieU6)rpBze=_5W9Y6=BhXd*Rf zf-qwflm!iDkt^=kHO*Gzrln9mXQwWIwQdKHTblljj0(=n)|}D4y1zm?yB!*}EJ$n! zuOiCX&0tP0kJ^uOH+*+t@+>ceTNCJCL{j+>b527}NBm8XbDZD9qEGnfn|YKHA+g)8 z62d>tcpTa`Ub>4M)z7u%j4{j^;K&=6M;cH;0j3OhgdXa_U%0?dXCW-w9GFK9ZlL2N zL;$0z2B82e$R;Rg<~U>!Dj5X=is9A@aNsAtv}JX+P?ZKVVcdqkKv&wTP_nTsnBI^@ zJ#K_g_~1Ix_1hoLBS5A#&Ibc9Ggx~M+sMKXGAuaewsQL74j1$edcr$zs~}wa>#T~I z_>Y|>i9YSVV{gJe%7O03ERRc5Ui1ci-u-%&nwPs+nQLZ>ikdrbuQs9g#fi;5&~8yj z!mzc(-$16p-=uPK9X4N5nGh@b6NLasTw6PmvQ$iT5vs_*@44S0^x>Zm7a`RxxR{qM zvWy;k@*AX}fF>62%7%mpo?DofG~g& zKIx7Dbqx-!F}pz#sZJ2?xaTi&X;}6VbWIFEyeo=($}0nyEw0kF{@c;FAf|m}#&Jt2 zna93B+BZX}bW95Tt12&NBupx1UQo@DNL=rw(F!g6&tfh=<#gH{uc%rzr=$!_-8HsB^Ne zH42ybJ`#2LdB>gBqIyO$X4;5<$ov~`eU#w*DU6Z>Nf<}Nk#0tKoqQFPXyRV`G2`~N z9#XQX1>PTi>Jj%nktsjPztg6A@yVc2A4PR57DJ7CW0=|lKIE>6IKE3JJ*4rQ+oLbE zM`>k79}{d(g_^+UHyeRkd0ipAOWe2=P>A)!XI|#EV}XW=bBh>jQ7dS`%7T|rqx1-k zG<(BpI_Nefvy`322VZ^^B)s0>w_0pqMeP$^9J|q5=3*yPkDTPtc zx6W|^VW>Zx*EMraSa`gi2X^ZdI7D&9+tHT8DG-Pjy<7J@7kmw@V3_~fIc$A|h&eIM zcIoc#bDn2^KC{S~w>f9Cp8>k}roOxXb5(ZbN0I??bD359anFO1e0%9lSKXfMWf15V zFA2vbD1$%&XyNm82~rrf$IbwOuU_r9%W6VQuRa~qhH1}qnu7(?SlF0#&>iFg39ZR)~g`>|d&H)mXej^B1M(Q-q7=jY#( z0lcsy`bi#BibBrk2VFy+K_Rwi0@<%YA-K?Oa1##+EqhAt*Ymv~i;a5N%7O?(P25`Ut%8NwwNbK>LH`nbnyd{1TN40T1UWma{de^qQV`(z!X?Vh1dwMAb(nr{*{nb z8!62#`)>c4;(Ru1GpX%;NCcJnZn%gC9Fo6H*F?%4sMlA_F%~#?yy%a9CF9s``-(90 z5fxs zp|bArdtd^%fIGqj zA!oPY*?wttY#`@>%Nni_+aa->_XNY?BH5IcsM(*vmyO{9&UG9-nZKy<_@+& zJo?Oi&P3uoxtiy|bUq1dkv}L7BB3gDg}WEBj9Vfw*LQPT)Vw;#lQK8R!}*Ec<^ec> z{~JD)QsE9~s}QA}3{5OQ5CgEq{RCh4;G%&jzX%57VbX~ATP9=7{G5k0h*4%AGuJy| zY=B@EDri_&Biod7m=KBb=8sSs4BQp(2+p4FDNYp-L(C!LBzdu?R`L#aN+VON zP(#JMc(!W09c_^@ zPah%a0`mwBZEOjxf^nq%1ac{{8w>%8rh3`A3wAeTkVwTxw~ThkmMF<3OEHNKrr(Lo^Q3OBQQamR)B*B8 ze0NDjCqn3dDtI#$BoImP-4Z}J65Mbn8%GBYVX2K;mX@=jhob2yeKmL{`ZkWk`uMVc zy0nC8XwTEwP{KOsJf70yr*E@!)7m)-5S^9=A~=@tjR)Yn$#xZpRQKG(LcU+Epvn** z{qPPZ{3Go{b9P}9=qA_A96>g(X%qz=xcLWRNRgc|B?o@?qScxq?a-V*7I%u@gVL}O zG3IotQ&5m^TX>_g;43#rAU;Nh8Z=H`8R$T)d_)zI?imG7w7C(Np-btH0Ic^sTV zD<@2mkGE3CaNSudIRRF!p^oubfxvn>9L55vEm8%SNJkt)H0QQz;_G8AOJx}DwCRgA znmU&P9ko4Isze`|1%!3Iv-@YZV!*qc#niso-ZJj&Qka0ohkjd@J@&c|0SW8r9!c6_ z@QE5%fP@@CQq=;3Ep9tWac;2jAu8|oI%si0hT+h0A#ok;_aiqjR<^^G6;tZDS2?1H zM7WJixSiNwFksggmX=@Z9e93+lx7~tVVc*49QOBITP=`2*y+p51M^R|zQFSmNI6n) z?hgc43{U=N719CQHKBFh1aM;-wEI*FAlqG@LB;D#qS?9UPxT^sA!9181&*8yicj_1 z-k7EOyrexwuVdWcN66naUq90c7!9)-#npgt-pcS6kEg6i&xZ7kja|QvR@<~(3%^I_ z)#1ml9m%@xZqgu#U;V`{)S3ZPfiuc3v|ZPz3EKb+;Z;whcXm1Z)FGe$DsXja&W0gg zZKZo*6PXEhIBxyhL+M2Wig6(6K@qhMJG5vC%CIPJTikE{BGH3OgDsmagnX_sZXf$L zXQ=FqOj8f-xZa;rl|Smjs_{Ya#K174;xHtrObABpgca5hj3WYw!bU_l_9$(?#X#I9 zP~ZC|G4^5`gapRuj4lIwJd z_jTiJu2>1o+B8&)W*n&8|^*e!QvZl&8D&oXvqlIFbF#=B)Mz?N){49a&r5J zh(#{w;RK`Oa0(*{3*%r;U|FUFBQ(H*lEyLOZIsyG%phq1GB^yOzd)ET>>#tSgj`5M zLYA{xtafVQ7B!p5*LHX@#nwM{a?M1eggsL&1JKMipA_fz*t-W2(0s?^x7@-T#@J^1 z(~y9Us5vaoXn-$NUQ|U4Ig(pt*Vrk1Nqyk0vra{8I6p)8?@C`Z=zuE^90I zb){`>C8B@beR)j#cePK08HMV{^u~_yFuOWvJ*q9OTSOjsbz-ae~st|I)1)Zq14T3p>!f(2z6 zVs4y%erD5>n9Jm&moH^m7VY3(6ZCPi@=jOPQDVU;bYQKaN)C z@Io)DfiE{_{f;Ov8TXeQ4=(Bli{&5y!??S$TuCym2LzDhBM5``#|6FiT27}0e4qn3 z3XFX57cKuGh3tSh1hNe%MN9pdVD(^9;GP0V`dnedR$jet+B0zt;UrQKnkqp?gBvVH znQ|TG4l<)k3iG;OO{D%g-7AoH_%c5)J zv)=on)Ax&V@0^zG|GE?uDQ{Mt4o?XItf=Y}PwG)aj*|8!@UF;_J8Dll}A`-~$=mr<> zF>aK%hS#khI86AoFsUrY6JS?IKj|oP>_{HR$fP_RtwISvt$%Ex->Z*h0)mT(1VC!N zowO+y3}gK5M-R4&kW{`Pho$c=r_0)xn}zjA9!P3)p#^8|z%o&xNrOr$dwYk!3*9R( zTq!$i&wp1O!UM~@#L}&46jWM6ar|mOhGH>(Fg6xhFdDE64h-Aw`zf?CXGOh$&73@3 zV=w%E8I#4%_`SfOA=U@;sblB%owd}l<_mjYmTPMclz$ApEBSUJ1Kqyy#Cy zOvw31J=_VO$x!7)N8O z+!Vi zrUEvcm}qbIkJKpAo+7;&oe$L3M01ZrfRxh*I%@74nHr)=3~K8HU&*8%mX4?p0BZt( zNRH*F$7X0V#Te3@yy$hBlZ{HE+t&dxU4U#71+EsS6<<1gfQq9#`Hk+sh!3By-qZF3GNO< zS&D;nDj9CmbgAt;od3wGef0c2$BCNLPIv^bM_vi0ya3zqbH^$f_#)wC;LzweRQz>u*9k)BY!HRUzEwlzei>hp-eX z6c_NmE*3!{-_TN}PlH7G_u89H&R-l&Mr`2t|}Q4Sw6LLvMt7mZ7O ziM>a*Ax0;zbz1!MI)foh1rviPPG9+(d7^Cc@-{fVcs~!R{WT-3vh%UJ@B;xs+ucUW zYgY&M4qE0IRP=_t0ICS)Eo3YOrk5)ewEB@cjFmyqH_a!PgQe=v-?Ng9p{8gzCGE(< zCbC4xSwnLQ-G5uI>}J*@yN;YNto%tgZGu4@@=wT18|pO|(1j+vVRa}`2kLvjllC#km;PfFIetP;T;t5A=xkPNXbxIqX5AHUK@t;!t=Ws3 zH;$QYz`4q!4v=<>sBy`zm|m{|m*5eD30Uq`QP)jlSe8u!|BLN2~1oy)b_t+p7+4^`OY$@|_@<1Vyikbv2u$bYx!==EA;0)X&5 zZ~ZSbn-N}sPr)%kYR)|^&T6s`B`4Jd4%!q&Hc&fz!Z{fXfjUJ?f9q`jX{K{CDKU0> zJHo8lDj_`?f|qgHN8lkh%a7Ef42L_&u_Rt&(^({%n~4jh`Fd`i|rra?N94qEd;O+u{M!1?HE zzcyaKwx*ZO4nqUA^r{*98}q7loBx%|=Hrz%WF&jj3PgX^_esS#43Y$TADS2e6h|T= zsGy>vD!4^OQ4~cHRnPus+~e`NzZv%*rFs2N^Xg`!^86D`57|1Ph(AB`1%vYR!r@k%j*K1ctjMD)jcEpXGZz0 z&oNf0(EEO?IhBooTsoy*e}M`T5w*PA0kaX6$|VabL-g@zb=eK)i;Ev$Ptku%!`y#G z-S-AP#gRK$bN=?eE^ay5*(S94pPNBw7~Us&jN)VMR`jBW0K4bxx=LK;v39WkAX0W} zIp#_GZ>!?XKCRR|#kT}jCx?b?w8iKRs{*<)r>DqFiQd(W6CnURYz|FMmOANkEhE|rhjhOa%-0|;fAA~=dX;u&KN^ZW*mr@D(DZUGfc6n9FR*feA$D|^U z$tC{xO0S=DP&8@B zge0&6!mc#T;FOU8BVZy@2oRuA5)ecH04a;QFTp9Dz_Bb3nXX7#blCUwE@}MDt`9=9^ z8NtI#FkBbUvW^s_{!6m=Dnj5hPaxhHs`l4&$##gy7rO30R=2KoR+T&l?;V!abM>>z zdG8uOMEAxLWS<8WJ5OtiMSod6$0A=wN)PDeKbn1I9> zpA7OOk*e;bbM9ikxqGL=frHW}l%LAIwjSGHS$bo=a90&~~91ia79(D-R{bNw>(T}vv z9OAqHaIKLziF7M4mz-csWk3{OR`f)q>Ftj|hG?({CkIsB1{X1AdX>U>kgOClGU4w_=PzXYR z$3h^*K?9YytG-;`Ev5J+0D7}rO zyFao${fLkjl!@zpePC{r?J&$3M*KN%u>eGRTl)bQa{`cdJh)UT$B$35ogOo4Qw!zj zM$RMp)04`_Sg~P#Gm@Tg&pE72;e3SeC64%+=CNfdHV^i5jSauhbcyWwRGPgD^$4q~ zk1GEkweuNplU9pIfl19DzNJ`j@`a6S|GT0wyM5VgoROaGsLl6toB1}1W|Jys^y<`s zEq&GQmh@>MVQHA|1I*fwx}n7()=DX;pY#2l?mwDl__fW8#3N*LJKp#2(#UC{2JO!>S z9p`(oxc&FV+i$a9bV-->IZWd|U9Pvg&>zEH82IOnh_Kqu?ec%=Na?hXlRZNC@39YG znCn2<_K4fCVL6L>82f5@$ZL?DsE*KUfI&S$7-d*N#GkIRUdoO-SjNNf014Ro(O(@< z^$?phfbV|L;}DE4IJ7`y@i#`H3Y)Bii9wv3aKt353x~%4K^GxB0fczu9EKP4qPvKe zN*k{9R7jE>%PM$g#`k-FL+-70+&XuR!fhxJhNZ6mhS}t|%yu8lV))e}iIg62?(W4` zFOMf`v63+~OxR!|lt23bbpJa7&8WBR8?$UqEkih)4c5^ejwkM8f9+7G)prg`on(dY z+@1#5<7X6n7utNB2FF*ZOewDg(?Up$NxyMD_KgmLjY3?9&IeE)*O@dKB=gs%`tun+ ztgWGsK4!O_^y?KCgLA`B$WM7p7Z^Fz2;Sq`N=KZD&o3rF;lY|9v*a>(tU)%mvn_2x z1J~}-(^f(CU9n1b z8VEI3Cw(kjHk0a{1#M*Z!|qGkxIEct!v3vWGa(ai@-Ogt_x~T`&>ci5VE?`^RT4xo#<2J<)ZW|LjVRK$)&aTs=~ zF5wvYTLE-X{A~aSSRu=}H7pSLNBG7XZbX1TnH+RQ$=$<<8_r`c%jOLN?ex)J@6*&V zQL@O(@xPap-b&`F6x9kv9+MHsMqx)^CD+(-TU0MG(82J9nol{4c4FP=A&??g^ewjm z7_DZFot|p7N^vk7Ce{49Rq+ z7-~b*>1HVm+PIbA*lJ0ENUbh8!1A=Xv=m*aPV_-yYitJF8YMfyXg<=&dpgm;EWH4l zCIDF(f7x9Ifn?p&$*z7#(E2ab9WVa0eP0>t&1^Y&P5S>V*;t|3iZ#qq#;In`TkI_p zFLXbciq zK>Adm;Ch@qbQ3)XQ=2RLiskhFbkE$L9lbw(P3tMD#w|kq83~Ggw;)Vts;Au$F~Bzy z_O^%3u`*z!fg=GcfHrw5h?(UQ9>BgzG$5ahj*R1;2kUR2hhMRTkq)D0k~gu~$%_9R z30%{hw{K&!s~Le_{8UUS*jPn*&)R7?t2X1|1zG0$KmC0WEXB^m_Z4dMmgp{4vDii+ zwhO+=zE217&Y=&Wvd($v9#+^-Vez#{zTz zK76NWx4Fmdv{F|)hEWw1F0s5Q(vSrO1O%Es-z_DcxnYek6(yXp!eZ+ohE5yE|4 z=l21E6_97_FW~!V%xO4>-0Fk$cyuLebYkqRI-dO*)m71>39Km{DVVg0$15C!k?>{e!6u*q@E2 zCv?6+`v5O<0b%_VFRPtjX~=Hf5#JZ#1=EY(yMK@MXafF3k{0jBG^|kFQrMkvqtZ_H zYvWOi()rkOC}BpipHzu<2K14N0GHPC(=$GbE+64BQSpuBCJBOqYx3VOj~w-C!qKwu zI&kvR5-k~C-V5_@q)NoMU@hg+6q9v8lcj0|mR!Irn~N_CUfSJIgxgfw#UG22cig-N zS4qy6U_LT2e3z#g#@tOsFnxD_&U~+y;zmdH_LKowyLX*yB#M0;xW!W?Wk^E=C@7P@ zKgh^$vmS(SNJ+or4zo0s-CY|aew*K~Xj1J^HhmR7+0rq76 zv5!BO;TaD@h$0h#vI&bG58{|XIB)W~mc`^b^7t|28K{)swB*I^9^p&H7HpFpxu-KBCD$QH2CF>w?ql9R2`QJIp1@$6 z(EiLTz@ZqwtQi1W)a(>G%QG|-pMLNolL$=q4o>=$l4>D2O?5;UfS(wj0wKhkN{HJ| zUkB9%YRn1WLFmNu8FtS-=mX^#JXpSntabUZIVnRo_HRqDwqKt-K+uVwm>@@;F3xj^Xkijhhi~)T zpd!$T9r=YXEaY&QiD+cHTSC>>!O>nAj6EjHqKYP}g{Kz4^?|*F@&4s6;+N(Ks8rQWg z*c|q(&6?Ac)>|}iw7C8oF6?1PiC)NV!bJn?sIJ;;l)*NBlOrdwOLitMDU> z7%F%aMSFNIuqR{W!wfI^XgT1oaGRW2QAGe4y_5S3y&$hJfB7rB>U^ReWM1BsaQ59Ax3YUw zO!V<-sH(E{zm3VrUN6Gx)aGFH5w>=!r!O6G#_Q(ZoJ=tI23~GnNu<~53db$I_}~29nn=A zxri0zdE#m-1>Kqm4t)`;w^z2 z<{zeR2Ytugl+eGIdae1ql!o!syP5frt)7-shZ#iow(un^;)XfIawmRAG)CowJ9#_0 zL57KTPqv~yCZM!FE|~Oo9-dt)`}`F__%(11m5rQRFxUw-ttePPe60_&Cw}^`{E@=E z{K%v9fx6mpO~$IJA0$Axc~@Tq_lA2_sd^KpuQ!>U#WVnuFY5IV@)#o1nrBy5#WYRv z?eSR1ITXO$K7B+He8N=J(KEQy{~SB#9Umi;LV=Dtu(T}SRp3etCyESnzHf=R$c!Jr zck~TZo`)OGB?tWejtovQ@CHxr<`K{f#C#c?1o$Aa$aotODys zA_lH-x*@=`?SvMI6}RSN>in=Ld~gg6We+gS28&=^#|W7%EL|6-kW=b`0x2#`;#sdJ zzJnG@IL9Oqia#_;!?62iVn*CZ0tpeWTZAf$7{gDgt{Eq`HHC24p|o>B4?Wf@NgZnEgyxF#2~ z<$Vifv_JRY<7odFDXIa;yl*Y=H4bMk<}k2=d-GowG%th_Q4v3x?YqoMb@5xsNS!vs zgv`df4d->FZxpR13)OW6-t=THJ&^1S%+qnJO8I)I9U&tD=p(-)#gkauu6nvx9JYx~ zo#lbnDof{Qd1060-};-$U5fzzCcfxq&v})LX-krd+9uE|j1VTV8=lso3^l7^E}>VR zW~B-#3pO}LTM{GYo^?+faVPEMrY#Y0G=_+=W|iBD_Pyhv)BAcObLN|(F5UCGXQ%j# z-^iaq@TY_AFaNkrk4 zm4MZ}DYtaxkWV;nPp0)@#A2i5R5@ckOt2!qRt0qU^Hfs3Gu4g#Agl_pW@y@<0U=q3 zNhAf%NiZQ3JNTH$ifu(+$uYJwf#V_V{U$9h=z8(@4Eiz=JZP0Z=IHVupLA<3g2t(9 zMZcel;8`UF?i8*pAAboQ+Uk{Sk5P{PrG}th%-f!IL%7$iU_|@(!0{44FiL6EPDA^~ zPFLjl!w>neNw}rA@-!)Yet`^>43&nDNspLR3F1My&fXW{K20>#fIM81ymGz}D4LWt}qP{a%>-HojIa$=7_RaFM=!0btQq!_yhoi%_kR;65Ai3*OzJOYb z!zt%b0b3dy@CJ3vw%Rii4B?}`Ig%0^G8WftW}*0bcX%QZAp#fTqeTSTF~Ct`Dx!=C z*jry7m78|D9A%J9YZVtgfOz)d-3-u&;bt62m>pMuv`WT#JAoz z9Km6&J@hC`{etl+tfhgp&1g)Dw>|s(MkDXdPx4py!IvnfKy`_2v^3DEIS1PRnrOZbD zuQ!KmRadV6S5ZAanpPtw;d{Trdmn6i;lL}~QX4B%ae7P`0a9iE*h;hW7!3CJ6R_~@ z(m&q-48&efB=|c}1z)+vcoA{|Neih^4pZ8L_S51cf!#DsPS5SjI7??dsAo+X{>&k+ zi#cIp$nk1n_{hqjZNoURQR9?D2YnQ z7>H=DD|C5=7KDhv&Ye#@+rXe_DVJBC@aIES6f#ZY!tG!CHgm>I*k)C|iaVOG+u&*7 zsx&;;kM+{Z?1Km5!DijwkVj6k5d$u{M6Nu^bqjqkXKHZA*BW z-?H$44CX^fF}AfAuuNM2&i4;tH8uTLnnz39CO9dNd19rHOTCg2j}!0+=qF{g*|uL%T#WxU9$r0lL-Me0k?fA{5t@)|`JVBN{QA=_1nLp`< zrOW>w7lJ`nk+TPpbAFUPtIM6&_xmu4K!jTjI5K#+;8nVyyVnOgi^2CaK=@>|`(Kje zuGz6fHg>`AHO-)q#PyCV13^H*d2)JG*8%2SU+};;jB;nt!=vkyy^qKy9XL2O0E|`G z_f3Y@mh2SFM3f=r2XEBW*IOjCG^vw|NF*M%wx9q*)pP+R$_uPh+R;INIg(&*e=_1` zm9Ie=H|f*K@KAOfz<-U4O3n(X2^hBvzUo^WvglDyhu|(A8(LH3UaQyddcP%rmWQDw zCI4?M{>(wiZ-DWkb};gmxVJP1wHWb0=jlt_yn^y(c9sa#V^S}(0W?cpj;_rJ3BUU*G(+<&%CMPHumxWMzlX{YKab%`}ftSNjDW zWa!c%wX&7j*yaBbG*$T*LAj&g7r|coQjfS@GEXd4P%{F}^>!YQnPG3&K&Q_gRWt-t zRNZv22{g`bw6xLPr_!L_W4OaU9pgIBit7~W?Dls=g3x-F zJf5Z}5IWnkyvGWBi3gybqG~blD^)!Hyok~2a|F{*zDK%mTLhA^q~I+@j#^XkwyS$v z{s{^8Pk12t<#aKhULY8Z{7phL!1`DIK!a$SOgzIg2vDBUOQ=oV>C%C0*b2u(ebV+q zjDdcHD-U(fU7GFAF_1F5>ZiT} zjUWw?5^xt`$f@;1{vYFlqzAN5K@v3v)DY>9D+q%~SN!XvhBzJ8f!B7_3NXX;%gef} zZipE~%%6s_0xnW%Qu~m1si}d`1fv#GFnkxXC9CMsLfK(Tq*M$3m3}dt)JZ4~37{(^ z@P1z5e_inXzWt8UDdJD>-HRY{B{TkLbRLOwOsgpxX@Q{lBP@dgNC_U}UESIet&z8< zY$ISfN2iD8L;^3oqb;?!lbIS!n9p$Gtzsteg_Yd^Pl}-g5EblTUV(k_-Kz)gX#5!4 z;>E5O#-i69B#9Jc7t?DsjsNc|DaZJyVsTx)>@7HUCf6x6`BwBc}ZG6W5>9k&7VG;%R z!hI~ykUx&>uYzEpwu*pM&|+pE+VywtxTqz3e?OOzDRq$1XD71N{`O)8Zi|xFiNND+ zVM(A9uY7tI=h@Zb1pez^HNYQFvu1pC0?1Ys8BQV(kRk`5q4b`7SVVLsN6dw&!u}G0 zTV3iN;a-O~i=YN&)}I|gacvneq!jRg4#_wV5ez@h2fay3O+5^1!gwszKjUW?Uy0Dp zT(%C920AJFLh}CcR0Vfo*r1_G*m2#>h(2=vVxMoY0cx2NQLSq@o(Dm7!_~qx@|xcI z^8>1$0biy#p_Vo>wG==^wukR(F&B-VyqIDXJ@`2g6UE9vppOUd)+PXHg-T4b4bEUfr7hvI zaK5_uQ8tx?7X1Bg)7D4b8PzNdcsEF?qu1R@JP7mp{~Wg&->3l^B!?{4WLa@tUeS8g zz!M{9%t8*YJDhVL5ID1-!!~@g!=z_Pk)NHx$2#++Z&pR{?3-)Vr6sqb}L4cBfMM$(0Rt@`Nx6zTv!MZ3VA=z6S$ew-vv_ zYlHG)y;*Io_t3SraQ0%(>iG3!+6s@05n8+y=e3-Vjm}mp)AF*53-M*VbjmU;;l>wV zq2J0d)O9RWO6&{LGaUN(h=ToH!gb!{F$isw-mAy9sT381m=P`Q)lg9O_Q{ae#uLr- z1P9$tia4{4eVn3DIW@R(XNNE7P z#$|+eurC>1L>2-6^%>=gRbt;hHf7@bJg2fC4=8sjMu_E!({V`CBC2G|Q#cW02r<*A zu`f!;=_`K(5#4-6Koyjw7+x3V&H*=&$6q%C(HM_8PMZYh>DQ<`X)=w&_^@z>Qd0zR z&Y&3`aK)N*6n5%%8kAP2mc8(ZeyCAF2ezP_k(<27M*)72jbFya8Maw)gSls5o5$0t zB=ELqFfD`ai;X}&QQpuJ$51k;8BuFwiWQakw1mhB+<)wQKcIdrx{2!G?%WDTXB&8! zfO8&9! za`wPj<8+BC`C$CNud_@+8vnW2RWZ*9&KPW?^C*5sm5da1Sil!$?$N+`3GrZgtV$da zq1Iv6c*hkJxwgg$a82LwCBY{|C%PCc@;fOFKdMJxnTO=gBD}7Ss z{S6NbIK{9@YFX#z2{?gNChIdIDF2I@+Q!`~Vc=zUi`3xAxwf%UUx=Aa+Mj#jhwDS> z$IBy;jA{i-EV~j)-Ak|cW71at)DDZWjdX-^cOVBdROPnG_wtNxGX4HU&iz|JBTSF{^N zeJ3UcihwS374vc*{q81jy9d1hDd@wOL184--+d$+TNiVY%j8^9>*3gZCDp@+0h@Xu zA=&{iZfPB$>@;v6jSl+QUCLl`aU83Ty@>gf7Yqjm&em879QJ77$fB=ao0MJ!3~wbB z6wcVXkO_1009#?f{+#pabPrbn8!!N-#V@CSswhFq)w=)QPrq!!lxIgmhJ@KQgI&Qz z=($k}T#g+N25GCWX-d)o2nBd#DY2!*r}MV4Yg6WlU0NLidSllR-d{Q82s`hpASqPi z>1lTF(|`70DAvJK^qE<{1hm0T9!Q53=sIha24Sg>%=&qXct zfS{|UG>r|XY)(@f3y;-dVT4&l{5? z$4$?8bAXr+M0sPLASxatLteCd5)ZsomlV^Qut@K>%=t^+inInj*_TV9U@UwIH2 zetS4Am54wHM~D)Fn;kA^PSgz));IcDs%mSe1I19)hbh0oK Date: Fri, 30 Aug 2024 15:10:18 -0400 Subject: [PATCH 03/37] reexport data from epidatasets --- NAMESPACE | 5 ++ R/reexports.R | 93 ++++++++++++++++++++++++++++ _pkgdown.yml | 8 ++- man/archive_cases_dv_subset_dt.Rd | 66 ++++++++++++++++++++ man/cases_deaths_subset.Rd | 77 +++++++++++++++++++++++ man/covid_incidence_county_subset.Rd | 72 +++++++++++++++++++++ man/covid_incidence_outliers.Rd | 64 +++++++++++++++++++ man/jhu_confirmed_cumulative_num.Rd | 65 +++++++++++++++++++ 8 files changed, 447 insertions(+), 3 deletions(-) create mode 100644 man/archive_cases_dv_subset_dt.Rd create mode 100644 man/cases_deaths_subset.Rd create mode 100644 man/covid_incidence_county_subset.Rd create mode 100644 man/covid_incidence_outliers.Rd create mode 100644 man/jhu_confirmed_cumulative_num.Rd diff --git a/NAMESPACE b/NAMESPACE index 1c3ac6c84..a7d65d517 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -45,14 +45,18 @@ S3method(ungroup,epi_df) S3method(ungroup,grouped_epi_archive) S3method(unnest,epi_df) export("%>%") +export(archive_cases_dv_subset_dt) export(arrange) export(arrange_canonical) export(as_epi_archive) export(as_epi_df) export(as_tsibble) export(autoplot) +export(cases_deaths_subset) export(clone) export(complete) +export(covid_incidence_county_subset) +export(covid_incidence_outliers) export(detect_outlr) export(detect_outlr_rm) export(detect_outlr_stl) @@ -75,6 +79,7 @@ export(growth_rate) export(guess_period) export(is_epi_df) export(is_grouped_epi_archive) +export(jhu_confirmed_cumulative_num) export(key_colnames) export(max_version_with_row_in) export(mutate) diff --git a/R/reexports.R b/R/reexports.R index 00ac83c2c..f0a3938e1 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -75,3 +75,96 @@ tidyr::full_seq #' @importFrom ggplot2 autoplot #' @export ggplot2::autoplot + + +# epidatasets ------------------------------------------------------------------- + +#' @inherit epidatasets::cases_deaths_subset description source references title +#' @inheritSection epidatasets::cases_deaths_subset Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::cases_deaths_subset +#' +#' # works +#' library(epiprocess) +#' cases_deaths_subset +#' +#' # fails +#' data(cases_deaths_subset, package = "epiprocess") +#' @export +cases_deaths_subset <- epidatasets::cases_deaths_subset + +#' @inherit epidatasets::archive_cases_dv_subset_dt description source references title +#' @inheritSection epidatasets::archive_cases_dv_subset_dt Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::archive_cases_dv_subset_dt +#' +#' # works +#' library(epiprocess) +#' archive_cases_dv_subset_dt +#' +#' # fails +#' data(archive_cases_dv_subset_dt, package = "epiprocess") +#' @export +archive_cases_dv_subset_dt <- epidatasets::archive_cases_dv_subset_dt + +#' @inherit epidatasets::covid_incidence_county_subset description source references title +#' @inheritSection epidatasets::covid_incidence_county_subset Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::covid_incidence_county_subset +#' +#' # works +#' library(epiprocess) +#' covid_incidence_county_subset +#' +#' # fails +#' data(covid_incidence_county_subset, package = "epiprocess") +#' @export +covid_incidence_county_subset <- epidatasets::covid_incidence_county_subset + +#' @inherit epidatasets::covid_incidence_outliers description source references title +#' @inheritSection epidatasets::covid_incidence_outliers Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::covid_incidence_outliers +#' +#' # works +#' library(epiprocess) +#' covid_incidence_outliers +#' +#' # fails +#' data(covid_incidence_outliers, package = "epiprocess") +#' @export +covid_incidence_outliers <- epidatasets::covid_incidence_outliers + +#' @inherit epidatasets::jhu_confirmed_cumulative_num description source references title +#' @inheritSection epidatasets::jhu_confirmed_cumulative_num Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::jhu_confirmed_cumulative_num +#' +#' # works +#' library(epiprocess) +#' jhu_confirmed_cumulative_num +#' +#' # fails +#' data(jhu_confirmed_cumulative_num, package = "epiprocess") +#' @export +jhu_confirmed_cumulative_num <- epidatasets::jhu_confirmed_cumulative_num diff --git a/_pkgdown.yml b/_pkgdown.yml index 62f006fec..442273db9 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -91,9 +91,11 @@ reference: - group_by.epi_archive - title: Example data - contents: - - archive_cases_dv_subset - - incidence_num_outlier_example - - contains("jhu_csse") + - cases_deaths_subset + - archive_cases_dv_subset_dt + - covid_incidence_county_subset + - covid_incidence_outliers + - jhu_confirmed_cumulative_num - title: Basic automatic plotting - contents: - autoplot.epi_df diff --git a/man/archive_cases_dv_subset_dt.Rd b/man/archive_cases_dv_subset_dt.Rd new file mode 100644 index 000000000..014303843 --- /dev/null +++ b/man/archive_cases_dv_subset_dt.Rd @@ -0,0 +1,66 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reexports.R +\docType{data} +\name{archive_cases_dv_subset_dt} +\alias{archive_cases_dv_subset_dt} +\title{Subset of daily COVID-19 doctor visits and cases from 6 states in archive format} +\format{ +An object of class \code{data.table} (inherits from \code{data.frame}) with 129638 rows and 5 columns. +} +\source{ +This object contains a modified part of the \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. This data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by Johns Hopkins University on behalf of its Center for Systems Science in Engineering. +Copyright Johns Hopkins University 2020. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{From the COVIDcast Doctor Visits API}: The signal \code{percent_cli} is taken directly from the API without changes. +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: \code{case_rate_7d_av} signal was computed by Delphi from the original JHU-CSSE data by calculating moving averages of the preceding 7 days, so the signal for June 7 is the average of the underlying data for June 1 through 7, inclusive. +\item Furthermore, the data has been limited to a very small number of rows, the +signal names slightly altered, and formatted into a tibble. +} +} +\usage{ +archive_cases_dv_subset_dt +} +\description{ +This data source is based on information about outpatient visits, +provided to us by health system partners, and also contains confirmed +COVID-19 cases based on reports made available by the Center for +Systems Science and Engineering at Johns Hopkins University. +This example data ranges from June 1, 2020 to Dec 1, 2021, and +is also limited to California, Florida, Texas, and New York. + +It is used in the {epiprocess} \code{compactify}, \code{epix_archive}, and +advanced-use vignettes. +} +\section{Data dictionary}{ + + +An \code{epi_archive$DT} data format with columns: +\describe{ +\item{geo_value}{the geographic value associated with each row of measurements.} +\item{time_value}{the time value associated with each row of measurements.} +\item{version}{the time value specifying the version for each row of measurements. } +\item{percent_cli}{percentage of doctor’s visits with CLI (COVID-like illness) computed from medical insurance claims} +\item{case_rate_7d_av}{7-day average signal of number of new confirmed deaths due to COVID-19 per 100,000 population, daily} +} + +} + +\examples{ + # Since this is a re-exported dataset, it cannot be loaded using + # the `data()` function. `data()` looks for a file of the same name + # in the `data/` directory, which doesn't exist in this package. + # works + epiprocess::archive_cases_dv_subset_dt + + # works + library(epiprocess) + archive_cases_dv_subset_dt + + # fails + data(archive_cases_dv_subset_dt, package = "epiprocess") +} +\keyword{datasets} diff --git a/man/cases_deaths_subset.Rd b/man/cases_deaths_subset.Rd new file mode 100644 index 000000000..7eb58582e --- /dev/null +++ b/man/cases_deaths_subset.Rd @@ -0,0 +1,77 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reexports.R +\docType{data} +\name{cases_deaths_subset} +\alias{cases_deaths_subset} +\title{Subset of JHU daily state COVID-19 cases and deaths from 4 states} +\format{ +An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 4026 rows and 6 columns. +} +\source{ +This object contains a modified part of the +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} +as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. +This data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by the Johns Hopkins University on behalf of its Center for Systems Science +in Engineering. Copyright Johns Hopkins University 2020. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: +The case signal is taken directly from the JHU CSSE +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository}. +The rate signals were computed by Delphi using Census population data. +The 7-day average signals were computed by Delphi by calculating moving +averages of the preceding 7 days, so the signal for June 7 is the +average of the underlying data for June 1 through 7, inclusive. +\item Furthermore, the data has been limited to a very small number of rows, the +signal names slightly altered, and formatted into a tibble. +} +} +\usage{ +cases_deaths_subset +} +\description{ +This data source of confirmed COVID-19 cases and deaths +is based on reports made available by the Center for +Systems Science and Engineering at Johns Hopkins University. +This example data ranges from Mar 1, 2020 to Dec 31, 2021, and is limited to +California, Florida, Texas, New York, Georgia, and Pennsylvania. + +It is used in the {epiprocess} growth rate and \code{epi_slide} vignettes. +} +\section{Data dictionary}{ + + +A tibble with columns: +\describe{ +\item{geo_value}{the geographic value associated with each row +of measurements.} +\item{time_value}{the time value associated with each row of measurements.} +\item{case_rate_7d_av}{7-day average signal of number of new +confirmed COVID-19 cases per 100,000 population, daily} +\item{death_rate_7d_av}{7-day average signal of number of new confirmed +deaths due to COVID-19 per 100,000 population, daily} +\item{cases}{Number of new confirmed COVID-19 cases, daily} +\item{cases_7d_av}{7-day average signal of number of new confirmed +COVID-19 cases, daily} +} + +} + +\examples{ + # Since this is a re-exported dataset, it cannot be loaded using + # the `data()` function. `data()` looks for a file of the same name + # in the `data/` directory, which doesn't exist in this package. + # works + epiprocess::cases_deaths_subset + + # works + library(epiprocess) + cases_deaths_subset + + # fails + data(cases_deaths_subset, package = "epiprocess") +} +\keyword{datasets} diff --git a/man/covid_incidence_county_subset.Rd b/man/covid_incidence_county_subset.Rd new file mode 100644 index 000000000..0b70e3c38 --- /dev/null +++ b/man/covid_incidence_county_subset.Rd @@ -0,0 +1,72 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reexports.R +\docType{data} +\name{covid_incidence_county_subset} +\alias{covid_incidence_county_subset} +\title{Subset of JHU daily COVID-19 cases from counties in Massachusetts and Vermont} +\format{ +An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 16212 rows and 5 columns. +} +\source{ +This object contains a modified part of the +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} as +\href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. +This data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by the Johns Hopkins University on behalf of its Center for Systems +Science in Engineering. Copyright Johns Hopkins University 2020. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: +These signals are taken directly from the JHU CSSE +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} +without changes. The 7-day average signals are computed by Delphi by +as moving averages of the preceding 7 days, so the signal for +June 7 is the average of the underlying data for June 1 through 7, +inclusive. +\item Furthermore, the data has been limited to a very small number of rows, +formatted into a tibble, and the signal names slightly altered. +} +} +\usage{ +covid_incidence_county_subset +} +\description{ +This data source of confirmed COVID-19 cases and deaths +is based on reports made available by the Center for +Systems Science and Engineering at Johns Hopkins University. +This example data ranges from Mar 1, 2020 to Dec 31, 2021, +and is limited to Massachusetts and Vermont. + +It is used in the {epiprocess} aggregation vignette. +} +\section{Data dictionary}{ + + +A tibble with columns: +\describe{ +\item{geo_value}{the geographic value associated with each row of measurements.} +\item{time_value}{the time value associated with each row of measurements.} +\item{cases}{Number of new confirmed COVID-19 cases, daily} +\item{county_name}{the name of the county} +\item{state_name}{the full name of the state} +} + +} + +\examples{ + # Since this is a re-exported dataset, it cannot be loaded using + # the `data()` function. `data()` looks for a file of the same name + # in the `data/` directory, which doesn't exist in this package. + # works + epiprocess::covid_incidence_county_subset + + # works + library(epiprocess) + covid_incidence_county_subset + + # fails + data(covid_incidence_county_subset, package = "epiprocess") +} +\keyword{datasets} diff --git a/man/covid_incidence_outliers.Rd b/man/covid_incidence_outliers.Rd new file mode 100644 index 000000000..cf07b64bb --- /dev/null +++ b/man/covid_incidence_outliers.Rd @@ -0,0 +1,64 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reexports.R +\docType{data} +\name{covid_incidence_outliers} +\alias{covid_incidence_outliers} +\title{Subset of JHU daily COVID-19 cases from California and Florida} +\format{ +An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 730 rows and 3 columns. +} +\source{ +This object contains a modified part of the +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} +as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. +This data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by the Johns Hopkins University on behalf of its Center for Systems +Science in Engineering. Copyright Johns Hopkins University 2020. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: +These signals are taken directly from the JHU CSSE \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} without changes. +\item Furthermore, the data has been limited to a very small number of rows, +formatted into a tibble, and the signal names slightly altered. +} +} +\usage{ +covid_incidence_outliers +} +\description{ +This data source of confirmed COVID-19 cases is based on reports made +available by the Center for Systems Science and Engineering at Johns +Hopkins University. This example data is downloaded from the CMU Delphi +COVIDcast Epidata API. It is a snapshot as of Oct 28, 2021 and captures the +cases from June 1, 2020 to May 31, 2021 and is limited to California and +Florida. This data set is used in the {epiprocess} vignette on outliers. +} +\section{Data dictionary}{ + + +A tibble with columns: +\describe{ +\item{geo_value}{the geographic value associated with each row of measurements.} +\item{time_value}{the time value associated with each row of measurements.} +\item{cases}{Number of new confirmed COVID-19 cases, daily} +} + +} + +\examples{ + # Since this is a re-exported dataset, it cannot be loaded using + # the `data()` function. `data()` looks for a file of the same name + # in the `data/` directory, which doesn't exist in this package. + # works + epiprocess::covid_incidence_outliers + + # works + library(epiprocess) + covid_incidence_outliers + + # fails + data(covid_incidence_outliers, package = "epiprocess") +} +\keyword{datasets} diff --git a/man/jhu_confirmed_cumulative_num.Rd b/man/jhu_confirmed_cumulative_num.Rd new file mode 100644 index 000000000..37f808058 --- /dev/null +++ b/man/jhu_confirmed_cumulative_num.Rd @@ -0,0 +1,65 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reexports.R +\docType{data} +\name{jhu_confirmed_cumulative_num} +\alias{jhu_confirmed_cumulative_num} +\title{Subset of COVID-19 Cumulative Cases from 4 states} +\format{ +An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 2808 rows and 15 columns. +} +\source{ +This object contains a modified part of the \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. This data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. +Copyright Johns Hopkins University 2020. +} +\usage{ +jhu_confirmed_cumulative_num +} +\description{ +Data set for 4 states containing COVID-19 Cumulative Cases as reported by +JHU-CSSE and downloaded from the CMU Delphi COVIDcast Epidata API. This +data set covers the period from March 2020 to January 2022, and is limited +to California, Florida, New York, and Texas. + +It is used in the {epiprocess} "Getting Started" vignette. +} +\section{Data dictionary}{ + + +A tibble with 2,808 rows and 15 variables: +\describe{ +\item{geo_value}{the geographic value associated with each row of measurements.} +\item{signal}{name of metric, derived from upstream data.} +\item{source}{name of upstream data source.} +\item{geo_type}{spatial resolution of the signal.} +\item{time_type}{temporal resolution of the signal.} +\item{time_value}{the time value associated with each row of measurements.} +\item{direction}{trend classifier (+1 -> increasing, 0 -> steady or not determined, -1 -> decreasing).} +\item{issue}{time unit (e.g., date) when the signal data were published.} +\item{lag}{time delta (e.g. days) between when the underlying events happened and when the data were published.} +\item{missing_value}{an integer code that is zero when the value field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} +\item{missing_stderr}{an integer code that is zero when the stderr field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} +\item{missing_sample_size}{an integer code that is zero when the sample_size field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} +\item{value}{Cumulative number of confirmed COVID-19 cases, derived from the underlying data source.} +\item{stderr}{approximate standard error of the statistic with respect to its sampling distribution, null when not applicable.} +\item{sample_size}{number of “data points” used in computing the statistic, null when not applicable.} +} + +} + +\examples{ + # Since this is a re-exported dataset, it cannot be loaded using + # the `data()` function. `data()` looks for a file of the same name + # in the `data/` directory, which doesn't exist in this package. + # works + epiprocess::jhu_confirmed_cumulative_num + + # works + library(epiprocess) + jhu_confirmed_cumulative_num + + # fails + data(jhu_confirmed_cumulative_num, package = "epiprocess") +} +\keyword{datasets} From 6a7555363dd890474f3d14b8f85af4f20a9b74f2 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:31:21 -0400 Subject: [PATCH 04/37] jhu_csse_daily_subset -> cases_deaths_subset --- R/autoplot.R | 10 ++++----- R/correlation.R | 8 +++---- R/growth_rate.R | 4 ++-- R/slide.R | 30 +++++++++++++-------------- man/autoplot.epi_df.Rd | 10 ++++----- man/epi_cor.Rd | 8 +++---- man/epi_slide.Rd | 10 ++++----- man/epi_slide_mean.Rd | 10 ++++----- man/epi_slide_opt.Rd | 8 +++---- man/epi_slide_sum.Rd | 2 +- man/growth_rate.Rd | 4 ++-- tests/testthat/test-archive.R | 2 +- tests/testthat/test-as_tibble-decay.R | 4 ++-- tests/testthat/test-correlation.R | 4 ++-- vignettes/growth_rate.Rmd | 4 ++-- vignettes/slide.Rmd | 4 ++-- 16 files changed, 61 insertions(+), 61 deletions(-) diff --git a/R/autoplot.R b/R/autoplot.R index 7443628ba..073758a3e 100644 --- a/R/autoplot.R +++ b/R/autoplot.R @@ -26,19 +26,19 @@ #' @export #' #' @examples -#' autoplot(jhu_csse_daily_subset, cases, death_rate_7d_av) -#' autoplot(jhu_csse_daily_subset, case_rate_7d_av, .facet_by = "geo_value") -#' autoplot(jhu_csse_daily_subset, case_rate_7d_av, +#' autoplot(cases_deaths_subset, cases, death_rate_7d_av) +#' autoplot(cases_deaths_subset, case_rate_7d_av, .facet_by = "geo_value") +#' autoplot(cases_deaths_subset, case_rate_7d_av, #' .color_by = "none", #' .facet_by = "geo_value" #' ) -#' autoplot(jhu_csse_daily_subset, case_rate_7d_av, +#' autoplot(cases_deaths_subset, case_rate_7d_av, #' .color_by = "none", #' .base_color = "red", .facet_by = "geo_value" #' ) #' #' # .base_color specification won't have any effect due .color_by default -#' autoplot(jhu_csse_daily_subset, case_rate_7d_av, +#' autoplot(cases_deaths_subset, case_rate_7d_av, #' .base_color = "red", .facet_by = "geo_value" #' ) autoplot.epi_df <- function( diff --git a/R/correlation.R b/R/correlation.R index 5e9694c42..ff153364a 100644 --- a/R/correlation.R +++ b/R/correlation.R @@ -44,7 +44,7 @@ #' #' # linear association of case and death rates on any given day #' epi_cor( -#' x = jhu_csse_daily_subset, +#' x = cases_deaths_subset, #' var1 = case_rate_7d_av, #' var2 = death_rate_7d_av, #' cor_by = "time_value" @@ -52,7 +52,7 @@ #' #' # correlation of death rates and lagged case rates #' epi_cor( -#' x = jhu_csse_daily_subset, +#' x = cases_deaths_subset, #' var1 = case_rate_7d_av, #' var2 = death_rate_7d_av, #' cor_by = time_value, @@ -61,7 +61,7 @@ #' #' # correlation grouped by location #' epi_cor( -#' x = jhu_csse_daily_subset, +#' x = cases_deaths_subset, #' var1 = case_rate_7d_av, #' var2 = death_rate_7d_av, #' cor_by = geo_value @@ -69,7 +69,7 @@ #' #' # correlation grouped by location and incorporates lagged cases rates #' epi_cor( -#' x = jhu_csse_daily_subset, +#' x = cases_deaths_subset, #' var1 = case_rate_7d_av, #' var2 = death_rate_7d_av, #' cor_by = geo_value, diff --git a/R/growth_rate.R b/R/growth_rate.R index 4537375d5..3997dd91d 100644 --- a/R/growth_rate.R +++ b/R/growth_rate.R @@ -102,12 +102,12 @@ #' @export #' @examples #' # COVID cases growth rate by state using default method relative change -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' mutate(cases_gr = growth_rate(x = time_value, y = cases)) #' #' # Log scale, degree 4 polynomial and 6-fold cross validation -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' mutate(gr_poly = growth_rate(x = time_value, y = cases, log_scale = TRUE, ord = 4, k = 6)) growth_rate <- function(x = seq_along(y), y, x0 = x, diff --git a/R/slide.R b/R/slide.R index d62b3bd8a..b328b2807 100644 --- a/R/slide.R +++ b/R/slide.R @@ -46,7 +46,7 @@ #' # slide a 7-day trailing average formula on cases #' # Simple sliding means and sums are much faster to do using #' # the `epi_slide_mean` and `epi_slide_sum` functions instead. -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide(cases_7dav = mean(cases), before = 6) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -54,7 +54,7 @@ #' ungroup() #' #' # slide a 7-day leading average -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide(cases_7dav = mean(cases), after = 6) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -62,7 +62,7 @@ #' ungroup() #' #' # slide a 7-day centre-aligned average -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide(cases_7dav = mean(cases), before = 3, after = 3) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -70,7 +70,7 @@ #' ungroup() #' #' # slide a 14-day centre-aligned average -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide(cases_14dav = mean(cases), before = 6, after = 7) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -78,7 +78,7 @@ #' ungroup() #' #' # nested new columns -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide( #' a = data.frame( @@ -339,7 +339,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' @seealso [`epi_slide`] [`epi_slide_mean`] [`epi_slide_sum`] #' @examples #' # slide a 7-day trailing average formula on cases. This can also be done with `epi_slide_mean` -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, @@ -351,7 +351,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' #' # slide a 7-day trailing average formula on cases. Adjust `frollmean` settings for speed #' # and accuracy, and to allow partially-missing windows. -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, @@ -363,7 +363,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' ungroup() #' #' # slide a 7-day leading average -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, @@ -374,7 +374,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' ungroup() #' #' # slide a 7-day centre-aligned sum. This can also be done with `epi_slide_sum` -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, @@ -638,7 +638,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' @seealso [`epi_slide`] [`epi_slide_opt`] [`epi_slide_sum`] #' @examples #' # slide a 7-day trailing average formula on cases -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_mean(cases, before = 6) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -647,7 +647,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' #' # slide a 7-day trailing average formula on cases. Adjust `frollmean` settings for speed #' # and accuracy, and to allow partially-missing windows. -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_mean( #' cases, @@ -659,7 +659,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' ungroup() #' #' # slide a 7-day leading average -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_mean(cases, after = 6) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -667,7 +667,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' ungroup() #' #' # slide a 7-day centre-aligned average -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_mean(cases, before = 3, after = 3) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -675,7 +675,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' ungroup() #' #' # slide a 14-day centre-aligned average -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_mean(cases, before = 6, after = 7) %>% #' # Remove a nonessential var. to ensure new col is printed @@ -720,7 +720,7 @@ epi_slide_mean <- function(x, col_names, ..., before = NULL, after = NULL, ref_t #' @seealso [`epi_slide`] [`epi_slide_opt`] [`epi_slide_mean`] #' @examples #' # slide a 7-day trailing sum formula on cases -#' jhu_csse_daily_subset %>% +#' cases_deaths_subset %>% #' group_by(geo_value) %>% #' epi_slide_sum(cases, before = 6) %>% #' # Remove a nonessential var. to ensure new col is printed diff --git a/man/autoplot.epi_df.Rd b/man/autoplot.epi_df.Rd index c97ea02f4..d53335c14 100644 --- a/man/autoplot.epi_df.Rd +++ b/man/autoplot.epi_df.Rd @@ -50,19 +50,19 @@ A ggplot object Automatically plot an epi_df } \examples{ -autoplot(jhu_csse_daily_subset, cases, death_rate_7d_av) -autoplot(jhu_csse_daily_subset, case_rate_7d_av, .facet_by = "geo_value") -autoplot(jhu_csse_daily_subset, case_rate_7d_av, +autoplot(cases_deaths_subset, cases, death_rate_7d_av) +autoplot(cases_deaths_subset, case_rate_7d_av, .facet_by = "geo_value") +autoplot(cases_deaths_subset, case_rate_7d_av, .color_by = "none", .facet_by = "geo_value" ) -autoplot(jhu_csse_daily_subset, case_rate_7d_av, +autoplot(cases_deaths_subset, case_rate_7d_av, .color_by = "none", .base_color = "red", .facet_by = "geo_value" ) # .base_color specification won't have any effect due .color_by default -autoplot(jhu_csse_daily_subset, case_rate_7d_av, +autoplot(cases_deaths_subset, case_rate_7d_av, .base_color = "red", .facet_by = "geo_value" ) } diff --git a/man/epi_cor.Rd b/man/epi_cor.Rd index fb56073fd..5e6698c8d 100644 --- a/man/epi_cor.Rd +++ b/man/epi_cor.Rd @@ -61,7 +61,7 @@ for examples. # linear association of case and death rates on any given day epi_cor( - x = jhu_csse_daily_subset, + x = cases_deaths_subset, var1 = case_rate_7d_av, var2 = death_rate_7d_av, cor_by = "time_value" @@ -69,7 +69,7 @@ epi_cor( # correlation of death rates and lagged case rates epi_cor( - x = jhu_csse_daily_subset, + x = cases_deaths_subset, var1 = case_rate_7d_av, var2 = death_rate_7d_av, cor_by = time_value, @@ -78,7 +78,7 @@ epi_cor( # correlation grouped by location epi_cor( - x = jhu_csse_daily_subset, + x = cases_deaths_subset, var1 = case_rate_7d_av, var2 = death_rate_7d_av, cor_by = geo_value @@ -86,7 +86,7 @@ epi_cor( # correlation grouped by location and incorporates lagged cases rates epi_cor( - x = jhu_csse_daily_subset, + x = cases_deaths_subset, var1 = case_rate_7d_av, var2 = death_rate_7d_av, cor_by = geo_value, diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 5f4db7b45..86654cd74 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -151,7 +151,7 @@ through the \code{new_col_name} argument. # slide a 7-day trailing average formula on cases # Simple sliding means and sums are much faster to do using # the `epi_slide_mean` and `epi_slide_sum` functions instead. -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide(cases_7dav = mean(cases), before = 6) \%>\% # Remove a nonessential var. to ensure new col is printed @@ -159,7 +159,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 7-day leading average -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide(cases_7dav = mean(cases), after = 6) \%>\% # Remove a nonessential var. to ensure new col is printed @@ -167,7 +167,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 7-day centre-aligned average -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide(cases_7dav = mean(cases), before = 3, after = 3) \%>\% # Remove a nonessential var. to ensure new col is printed @@ -175,7 +175,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 14-day centre-aligned average -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide(cases_14dav = mean(cases), before = 6, after = 7) \%>\% # Remove a nonessential var. to ensure new col is printed @@ -183,7 +183,7 @@ jhu_csse_daily_subset \%>\% ungroup() # nested new columns -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide( a = data.frame( diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 0e2cde936..bbd2e1173 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -114,7 +114,7 @@ zero-width windows are considered, manually pass both the \code{before} and } \examples{ # slide a 7-day trailing average formula on cases -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_mean(cases, before = 6) \%>\% # Remove a nonessential var. to ensure new col is printed @@ -123,7 +123,7 @@ jhu_csse_daily_subset \%>\% # slide a 7-day trailing average formula on cases. Adjust `frollmean` settings for speed # and accuracy, and to allow partially-missing windows. -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_mean( cases, @@ -135,7 +135,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 7-day leading average -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_mean(cases, after = 6) \%>\% # Remove a nonessential var. to ensure new col is printed @@ -143,7 +143,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 7-day centre-aligned average -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_mean(cases, before = 3, after = 3) \%>\% # Remove a nonessential var. to ensure new col is printed @@ -151,7 +151,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 14-day centre-aligned average -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_mean(cases, before = 6, after = 7) \%>\% # Remove a nonessential var. to ensure new col is printed diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index 125c7b142..d9403ccab 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -135,7 +135,7 @@ zero-width windows are considered, manually pass both the \code{before} and } \examples{ # slide a 7-day trailing average formula on cases. This can also be done with `epi_slide_mean` -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, @@ -147,7 +147,7 @@ jhu_csse_daily_subset \%>\% # slide a 7-day trailing average formula on cases. Adjust `frollmean` settings for speed # and accuracy, and to allow partially-missing windows. -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, @@ -159,7 +159,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 7-day leading average -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, @@ -170,7 +170,7 @@ jhu_csse_daily_subset \%>\% ungroup() # slide a 7-day centre-aligned sum. This can also be done with `epi_slide_sum` -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index c14d74190..10be79a05 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -114,7 +114,7 @@ zero-width windows are considered, manually pass both the \code{before} and } \examples{ # slide a 7-day trailing sum formula on cases -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% epi_slide_sum(cases, before = 6) \%>\% # Remove a nonessential var. to ensure new col is printed diff --git a/man/growth_rate.Rd b/man/growth_rate.Rd index 7a3f1151e..c4e82a09d 100644 --- a/man/growth_rate.Rd +++ b/man/growth_rate.Rd @@ -136,12 +136,12 @@ user. \examples{ # COVID cases growth rate by state using default method relative change -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% mutate(cases_gr = growth_rate(x = time_value, y = cases)) # Log scale, degree 4 polynomial and 6-fold cross validation -jhu_csse_daily_subset \%>\% +cases_deaths_subset \%>\% group_by(geo_value) \%>\% mutate(gr_poly = growth_rate(x = time_value, y = cases, log_scale = TRUE, ord = 4, k = 6)) } diff --git a/tests/testthat/test-archive.R b/tests/testthat/test-archive.R index 7f20ddeba..2cf289348 100644 --- a/tests/testthat/test-archive.R +++ b/tests/testthat/test-archive.R @@ -153,7 +153,7 @@ test_that("epi_archives are correctly instantiated with a variety of data types" expect_equal(ea8$additional_metadata, list(value = df$value)) # epi_df - edf1 <- jhu_csse_daily_subset %>% + edf1 <- cases_deaths_subset %>% select(geo_value, time_value, cases) %>% mutate(version = max(time_value), code = "USA") diff --git a/tests/testthat/test-as_tibble-decay.R b/tests/testthat/test-as_tibble-decay.R index 488ace63d..a5557816b 100644 --- a/tests/testthat/test-as_tibble-decay.R +++ b/tests/testthat/test-as_tibble-decay.R @@ -1,5 +1,5 @@ test_that("as_tibble checks an attr to avoid decay to tibble", { - edf <- jhu_csse_daily_subset + edf <- cases_deaths_subset expect_identical(class(as_tibble(edf)), c("tbl_df", "tbl", "data.frame")) attr(edf, "decay_to_tibble") <- TRUE expect_identical(class(as_tibble(edf)), c("tbl_df", "tbl", "data.frame")) @@ -10,7 +10,7 @@ test_that("as_tibble checks an attr to avoid decay to tibble", { test_that("as_tibble ungroups if needed", { # tsibble is doing some method piracy, and overwriting as_tibble.grouped_df as of 1.1.5 skip_if(packageVersion("tsibble") > "1.1.4") - edf <- jhu_csse_daily_subset %>% group_by(geo_value) + edf <- cases_deaths_subset %>% group_by(geo_value) # removes the grouped_df class expect_identical(class(as_tibble(edf)), c("tbl_df", "tbl", "data.frame")) attr(edf, "decay_to_tibble") <- TRUE diff --git a/tests/testthat/test-correlation.R b/tests/testthat/test-correlation.R index 886d94c44..240f2897c 100644 --- a/tests/testthat/test-correlation.R +++ b/tests/testthat/test-correlation.R @@ -11,13 +11,13 @@ test_that("epi_cor requires two var arguments, var1 and var2", { test_that("epi_cor functions as intended", { expect_equal( epi_cor( - x = jhu_csse_daily_subset, + x = cases_deaths_subset, var1 = case_rate_7d_av, var2 = death_rate_7d_av, cor_by = geo_value, dt1 = -2 )[1], - tibble(geo_value = unique(jhu_csse_daily_subset$geo_value)) + tibble(geo_value = unique(cases_deaths_subset$geo_value)) ) edf <- as_epi_df(data.frame( diff --git a/vignettes/growth_rate.Rmd b/vignettes/growth_rate.Rmd index abef646fc..682b77eea 100644 --- a/vignettes/growth_rate.Rmd +++ b/vignettes/growth_rate.Rmd @@ -40,8 +40,8 @@ The data has 1,158 rows and 3 columns. ```{r, echo=FALSE} -data(jhu_csse_daily_subset) -x <- jhu_csse_daily_subset %>% +data(cases_deaths_subset) +x <- cases_deaths_subset %>% select(geo_value, time_value, cases = cases_7d_av) %>% filter(geo_value %in% c("pa", "ga") & time_value >= "2020-06-01") %>% arrange(geo_value, time_value) %>% diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 92590fb13..841942ccb 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -52,8 +52,8 @@ x <- pub_covidcast( The data has 2,684 rows and 3 columns. ```{r, echo=FALSE} -data(jhu_csse_daily_subset) -x <- jhu_csse_daily_subset %>% +data(cases_deaths_subset) +x <- cases_deaths_subset %>% select(geo_value, time_value, cases) %>% arrange(geo_value, time_value) %>% as_epi_df() From d7195bd2f2eba6ffb8d63f6fd86622dce3a42500 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:32:17 -0400 Subject: [PATCH 05/37] jhu_csse_county_level_subset -> covid_incidence_county_subset --- R/epi_df.R | 2 +- man/epi_df.Rd | 2 +- tests/testthat/test-epi_df.R | 2 +- vignettes/aggregation.Rmd | 4 ++-- vignettes/epiprocess.Rmd | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/epi_df.R b/R/epi_df.R index 56424bf0d..8d6177ebe 100644 --- a/R/epi_df.R +++ b/R/epi_df.R @@ -135,7 +135,7 @@ #' #' # Adding additional keys to an `epi_df` object #' -#' ex3_input <- jhu_csse_county_level_subset %>% +#' ex3_input <- covid_incidence_county_subset %>% #' dplyr::filter(time_value > "2021-12-01", state_name == "Massachusetts") %>% #' dplyr::slice_tail(n = 6) #' diff --git a/man/epi_df.Rd b/man/epi_df.Rd index dcda08722..e5608bd1d 100644 --- a/man/epi_df.Rd +++ b/man/epi_df.Rd @@ -208,7 +208,7 @@ attr(ex2, "metadata") # Adding additional keys to an `epi_df` object -ex3_input <- jhu_csse_county_level_subset \%>\% +ex3_input <- covid_incidence_county_subset \%>\% dplyr::filter(time_value > "2021-12-01", state_name == "Massachusetts") \%>\% dplyr::slice_tail(n = 6) diff --git a/tests/testthat/test-epi_df.R b/tests/testthat/test-epi_df.R index a49855aa1..6d26b88e5 100644 --- a/tests/testthat/test-epi_df.R +++ b/tests/testthat/test-epi_df.R @@ -25,7 +25,7 @@ test_that("new_epi_df works as intended", { test_that("as_epi_df errors when additional_metadata is not a list", { # This is the 3rd example from as_epi_df - ex_input <- jhu_csse_county_level_subset %>% + ex_input <- covid_incidence_county_subset %>% dplyr::filter(time_value > "2021-12-01", state_name == "Massachusetts") %>% dplyr::slice_tail(n = 6) %>% tsibble::as_tsibble() %>% diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index ec5f36af3..90aadacd7 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -45,8 +45,8 @@ library(covidcast) library(epiprocess) library(dplyr) -data(jhu_csse_county_level_subset) -x <- jhu_csse_county_level_subset +data(covid_incidence_county_subset) +x <- covid_incidence_county_subset ``` ## Converting to `tsibble` format diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 24a985050..04fc3a477 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -248,7 +248,7 @@ In the above examples, all the keys are added to objects that are not `epi_df` o We use a toy data set included in `epiprocess` prepared using the `covidcast` library and are filtering to a single state for simplicity. ```{r} -ex3 <- jhu_csse_county_level_subset %>% +ex3 <- covid_incidence_county_subset %>% filter(time_value > "2021-12-01", state_name == "Massachusetts") %>% slice_tail(n = 6) From d805c04d244d5616eae94f33c2b39035041d6f1a Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:52:06 -0400 Subject: [PATCH 06/37] incidence_num_outlier_example -> covid_incidence_outliers --- R/outliers.R | 6 +++--- man/covid_incidence_outliers.Rd | 8 +++++--- man/detect_outlr.Rd | 2 +- man/detect_outlr_rm.Rd | 2 +- man/detect_outlr_stl.Rd | 2 +- vignettes/outliers.Rmd | 23 ++--------------------- 6 files changed, 13 insertions(+), 30 deletions(-) diff --git a/R/outliers.R b/R/outliers.R index 3d0ff5e53..15201efe1 100644 --- a/R/outliers.R +++ b/R/outliers.R @@ -71,7 +71,7 @@ #' ) #' ) #' -#' x <- incidence_num_outlier_example %>% +#' x <- covid_incidence_outliers %>% #' dplyr::select(geo_value, time_value, cases) %>% #' as_epi_df() %>% #' group_by(geo_value) %>% @@ -155,7 +155,7 @@ detect_outlr <- function(x = seq_along(y), y, #' @export #' @examples #' # Detect outliers based on a rolling median -#' incidence_num_outlier_example %>% +#' covid_incidence_outliers %>% #' dplyr::select(geo_value, time_value, cases) %>% #' as_epi_df() %>% #' group_by(geo_value) %>% @@ -250,7 +250,7 @@ detect_outlr_rm <- function(x = seq_along(y), y, n = 21, #' @export #' @examples #' # Detects outliers based on a seasonal-trend decomposition using LOESS -#' incidence_num_outlier_example %>% +#' covid_incidence_outliers %>% #' dplyr::select(geo_value, time_value, cases) %>% #' as_epi_df() %>% #' group_by(geo_value) %>% diff --git a/man/covid_incidence_outliers.Rd b/man/covid_incidence_outliers.Rd index cf07b64bb..e1baa9da7 100644 --- a/man/covid_incidence_outliers.Rd +++ b/man/covid_incidence_outliers.Rd @@ -3,7 +3,7 @@ \docType{data} \name{covid_incidence_outliers} \alias{covid_incidence_outliers} -\title{Subset of JHU daily COVID-19 cases from California and Florida} +\title{Subset of JHU daily COVID-19 cases from New Jersey and Florida} \format{ An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 730 rows and 3 columns. } @@ -32,8 +32,10 @@ This data source of confirmed COVID-19 cases is based on reports made available by the Center for Systems Science and Engineering at Johns Hopkins University. This example data is downloaded from the CMU Delphi COVIDcast Epidata API. It is a snapshot as of Oct 28, 2021 and captures the -cases from June 1, 2020 to May 31, 2021 and is limited to California and -Florida. This data set is used in the {epiprocess} vignette on outliers. +cases from June 1, 2020 to May 31, 2021 and is limited to New Jersey and +Florida. + +This data set is used in the {epiprocess} vignette on outliers. } \section{Data dictionary}{ diff --git a/man/detect_outlr.Rd b/man/detect_outlr.Rd index 3ac085854..744b93451 100644 --- a/man/detect_outlr.Rd +++ b/man/detect_outlr.Rd @@ -94,7 +94,7 @@ detection_methods <- dplyr::bind_rows( ) ) -x <- incidence_num_outlier_example \%>\% +x <- covid_incidence_outliers \%>\% dplyr::select(geo_value, time_value, cases) \%>\% as_epi_df() \%>\% group_by(geo_value) \%>\% diff --git a/man/detect_outlr_rm.Rd b/man/detect_outlr_rm.Rd index 333c4a7b5..a02588ae3 100644 --- a/man/detect_outlr_rm.Rd +++ b/man/detect_outlr_rm.Rd @@ -59,7 +59,7 @@ terms of multiples of the rolling interquartile range (IQR). } \examples{ # Detect outliers based on a rolling median -incidence_num_outlier_example \%>\% +covid_incidence_outliers \%>\% dplyr::select(geo_value, time_value, cases) \%>\% as_epi_df() \%>\% group_by(geo_value) \%>\% diff --git a/man/detect_outlr_stl.Rd b/man/detect_outlr_stl.Rd index 695c2de78..b2adf9e27 100644 --- a/man/detect_outlr_stl.Rd +++ b/man/detect_outlr_stl.Rd @@ -90,7 +90,7 @@ are exactly as in \code{detect_outlr_rm()}. } \examples{ # Detects outliers based on a seasonal-trend decomposition using LOESS -incidence_num_outlier_example \%>\% +covid_incidence_outliers \%>\% dplyr::select(geo_value, time_value, cases) \%>\% as_epi_df() \%>\% group_by(geo_value) \%>\% diff --git a/vignettes/outliers.Rmd b/vignettes/outliers.Rmd index ea3c30ac7..fa1e33931 100644 --- a/vignettes/outliers.Rmd +++ b/vignettes/outliers.Rmd @@ -14,25 +14,6 @@ so that you can define your own outlier detection and correction routines and apply them to `epi_df` objects. We'll demonstrate this using state-level daily reported COVID-19 case counts from FL and NJ. -```{r, message = FALSE, eval= FALSE} -library(epidatr) -library(epiprocess) -library(dplyr) -library(tidyr) - -x <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_incidence_num", - geo_type = "state", - time_type = "day", - geo_values = "fl,nj", - time_values = epirange(20200601, 20210531), - as_of = 20211028 -) %>% - select(geo_value, time_value, cases = value) %>% - as_epi_df() -``` - The dataset has 730 rows and 3 columns. ```{r, echo=FALSE, warning=FALSE, message=FALSE} @@ -41,8 +22,8 @@ library(epiprocess) library(dplyr) library(tidyr) -data(incidence_num_outlier_example) -x <- incidence_num_outlier_example +data(covid_incidence_outliers) +x <- covid_incidence_outliers ``` ```{r, fig.width = 8, fig.height = 7, warning=FALSE,message=FALSE} From aedce88b7a036d5da56133bb4c3f3ef9bc86b787 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:54:21 -0400 Subject: [PATCH 07/37] cases in intro vignette -> jhu_confirmed_cumulative_num --- vignettes/epiprocess.Rmd | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 04fc3a477..59a376997 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -110,14 +110,8 @@ library(dplyr) library(tidyr) library(withr) -cases <- pub_covidcast( - source = "jhu-csse", - signals = "confirmed_cumulative_num", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl,ny,tx", - time_values = epirange(20200301, 20220131), -) +data(jhu_confirmed_cumulative_num) +cases <- jhu_confirmed_cumulative_num colnames(cases) ``` From 93ee50dab670f2dc046fb863e72ed0123957d474 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 30 Aug 2024 17:15:29 -0400 Subject: [PATCH 08/37] switch all vignettes to visibly loading prepared data; provide API call as example --- vignettes/advanced.Rmd | 24 +++++++++++++----------- vignettes/aggregation.Rmd | 20 +++++++++----------- vignettes/archive.Rmd | 28 +++++++++------------------- vignettes/correlation.Rmd | 13 +++++++++++-- vignettes/growth_rate.Rmd | 23 ++++++++++++----------- vignettes/slide.Rmd | 20 +++++++++++--------- 6 files changed, 65 insertions(+), 63 deletions(-) diff --git a/vignettes/advanced.Rmd b/vignettes/advanced.Rmd index 1ea13c5fd..76212a7cb 100644 --- a/vignettes/advanced.Rmd +++ b/vignettes/advanced.Rmd @@ -285,7 +285,19 @@ vignette](https://cmu-delphi.github.io/epiprocess/articles/slide.html) in order to demonstrate the preceding points regarding forecast evaluation in a more realistic setting. First, we fetch the versioned data and build the archive. -```{r, message = FALSE, warning = FALSE, eval =FALSE} +The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: +```{r, message = FALSE} +library(data.table) +library(ggplot2) +theme_set(theme_bw()) + +x <- archive_cases_dv_subset$DT %>% + filter(geo_value %in% c("ca", "fl")) %>% + as_epi_archive(compactify = FALSE) +``` + +The data can also be fetched from the Delphi API with the following query: +```{r, eval = FALSE} library(epidatr) library(data.table) library(ggplot2) @@ -332,16 +344,6 @@ x <- epix_merge( ) ``` -```{r, message = FALSE, echo =FALSE} -library(data.table) -library(ggplot2) -theme_set(theme_bw()) - -x <- archive_cases_dv_subset$DT %>% - filter(geo_value %in% c("ca", "fl")) %>% - as_epi_archive(compactify = FALSE) -``` - Next, we extend the ARX function to handle multiple geo values, since in the present case, we will not be grouping by geo value and each slide computation will be run on multiple geo values at once. Note that, because `epix_slide()` diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index 90aadacd7..b185676e9 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -12,12 +12,20 @@ epidemiological data sets. This vignette demonstrates how to carry out these kinds of tasks with `epi_df` objects. We'll work with county-level reported COVID-19 cases in MA and VT. -```{r, message = FALSE, eval= FALSE, warning= FALSE} +The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: + +```{r, warning=FALSE, message=FALSE} library(epidatr) library(covidcast) library(epiprocess) library(dplyr) +data(covid_incidence_county_subset) +x <- covid_incidence_county_subset +``` + +The data can also be fetched from the Delphi API with the following query: +```{r, message = FALSE, eval= FALSE, warning= FALSE} # Use covidcast::county_census to get the county and state names y <- covidcast::county_census %>% filter(STNAME %in% c("Massachusetts", "Vermont"), STNAME != CTYNAME) %>% @@ -39,16 +47,6 @@ x <- pub_covidcast( The data contains 16,212 rows and 5 columns. -```{r, echo=FALSE, warning=FALSE, message=FALSE} -library(epidatr) -library(covidcast) -library(epiprocess) -library(dplyr) - -data(covid_incidence_county_subset) -x <- covid_incidence_county_subset -``` - ## Converting to `tsibble` format For manipulating and wrangling time series data, the diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 35f80a2cc..009ba1565 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -25,7 +25,9 @@ signal is subject to very heavy and regular revision; you can read more about it on its [API documentation page](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html). -```{r, message = FALSE, warning = FALSE, eval=FALSE} +The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: + +```{r, message=FALSE, warning=FALSE} library(epidatr) library(epiprocess) library(data.table) @@ -33,6 +35,12 @@ library(dplyr) library(purrr) library(ggplot2) +# This fetches the raw data backing the archive_cases_dv_subset object. +dv <- archive_cases_dv_subset$DT +``` + +The data can also be fetched from the Delphi API with the following query: +```{r, message = FALSE, warning = FALSE, eval=FALSE} dv <- pub_covidcast( source = "doctor-visits", signals = "smoothed_adj_cli", @@ -44,15 +52,6 @@ dv <- pub_covidcast( ) ``` -```{r, echo=FALSE, message=FALSE, warning=FALSE} -library(epidatr) -library(epiprocess) -library(data.table) -library(dplyr) -library(purrr) -library(ggplot2) -``` - ## Getting data into `epi_archive` format An `epi_archive()` object can be constructed from a data frame, data table, or @@ -81,15 +80,6 @@ class(x) print(x) ``` -```{r, echo=FALSE, message=FALSE, warning=FALSE} -x <- archive_cases_dv_subset$DT %>% - select(geo_value, time_value, version, percent_cli) %>% - as_epi_archive(compactify = TRUE) - -class(x) -print(x) -``` - An `epi_archive` is consists of a primary field `DT`, which is a data table (from the `data.table` package) that has the columns `geo_value`, `time_value`, `version` (and possibly additional ones), and other metadata fields, such as diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index 34e8c0f01..fbb3c9077 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -21,8 +21,17 @@ library(epiprocess) library(dplyr) ``` -The data is fetched with the following query: -```{r, message = FALSE} +The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: +```{r} +data(cases_deaths_subset) +x <- cases_deaths_subset %>% + select(geo_value, time_value, case_rate = cases, death_rate = deaths) %>% + arrange(geo_value, time_value) %>% + as_epi_df() +``` + +The data can also be fetched from the Delphi API with the following query: +```{r, eval = FALSE} x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_7dav_incidence_prop", diff --git a/vignettes/growth_rate.Rmd b/vignettes/growth_rate.Rmd index 682b77eea..845a5f91b 100644 --- a/vignettes/growth_rate.Rmd +++ b/vignettes/growth_rate.Rmd @@ -21,7 +21,18 @@ library(dplyr) library(tidyr) ``` -The data is fetched with the following query: +The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: + +```{r} +data(cases_deaths_subset) +x <- cases_deaths_subset %>% + select(geo_value, time_value, cases = cases_7d_av) %>% + filter(geo_value %in% c("pa", "ga") & time_value >= "2020-06-01") %>% + arrange(geo_value, time_value) %>% + as_epi_df() +``` + +The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval=F} x <- pub_covidcast( source = "jhu-csse", @@ -38,16 +49,6 @@ x <- pub_covidcast( The data has 1,158 rows and 3 columns. - -```{r, echo=FALSE} -data(cases_deaths_subset) -x <- cases_deaths_subset %>% - select(geo_value, time_value, cases = cases_7d_av) %>% - filter(geo_value %in% c("pa", "ga") & time_value >= "2020-06-01") %>% - arrange(geo_value, time_value) %>% - as_epi_df() -``` - ## Growth rate basics The growth rate of a function $f$ defined over a continuously-valued parameter diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 841942ccb..77e7aa315 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -34,7 +34,17 @@ library(epiprocess) library(dplyr) ``` -The data is fetched with the following query: +The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: + +```{r} +data(cases_deaths_subset) +x <- cases_deaths_subset %>% + select(geo_value, time_value, cases) %>% + arrange(geo_value, time_value) %>% + as_epi_df() +``` + +The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval=F} x <- pub_covidcast( source = "jhu-csse", @@ -51,14 +61,6 @@ x <- pub_covidcast( The data has 2,684 rows and 3 columns. -```{r, echo=FALSE} -data(cases_deaths_subset) -x <- cases_deaths_subset %>% - select(geo_value, time_value, cases) %>% - arrange(geo_value, time_value) %>% - as_epi_df() -``` - ## Optimized rolling mean We first demonstrate how to apply a 7-day trailing average to the daily cases From 9066ef51e9f7411e1c512d0c07a066b14c04b83f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 5 Sep 2024 10:31:51 -0400 Subject: [PATCH 09/37] can't use data() to fetch reexports in vignettes --- vignettes/aggregation.Rmd | 9 ++++----- vignettes/archive.Rmd | 4 ++-- vignettes/correlation.Rmd | 3 +-- vignettes/epiprocess.Rmd | 3 +-- vignettes/growth_rate.Rmd | 5 ++--- vignettes/outliers.Rmd | 3 +-- vignettes/slide.Rmd | 7 +++---- 7 files changed, 14 insertions(+), 20 deletions(-) diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index b185676e9..266cf9f34 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -14,18 +14,17 @@ COVID-19 cases in MA and VT. The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: -```{r, warning=FALSE, message=FALSE} +```{r, warning = FALSE, message = FALSE} library(epidatr) library(covidcast) library(epiprocess) library(dplyr) -data(covid_incidence_county_subset) -x <- covid_incidence_county_subset +x <- epiprocess::covid_incidence_county_subset ``` The data can also be fetched from the Delphi API with the following query: -```{r, message = FALSE, eval= FALSE, warning= FALSE} +```{r, message = FALSE, eval = FALSE, warning = FALSE} # Use covidcast::county_census to get the county and state names y <- covidcast::county_census %>% filter(STNAME %in% c("Massachusetts", "Vermont"), STNAME != CTYNAME) %>% @@ -42,7 +41,7 @@ x <- pub_covidcast( ) %>% select(geo_value, time_value, cases = value) %>% full_join(y, by = "geo_value") %>% - as_epi_df(as_of = as.Date("2024-03-20")) + as_epi_df() ``` The data contains 16,212 rows and 5 columns. diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 009ba1565..715dbd8b4 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -27,7 +27,7 @@ page](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-v The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: -```{r, message=FALSE, warning=FALSE} +```{r, message = FALSE, warning = FALSE} library(epidatr) library(epiprocess) library(data.table) @@ -40,7 +40,7 @@ dv <- archive_cases_dv_subset$DT ``` The data can also be fetched from the Delphi API with the following query: -```{r, message = FALSE, warning = FALSE, eval=FALSE} +```{r, message = FALSE, warning = FALSE, eval = FALSE} dv <- pub_covidcast( source = "doctor-visits", signals = "smoothed_adj_cli", diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index fbb3c9077..8259df388 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -23,9 +23,8 @@ library(dplyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -data(cases_deaths_subset) x <- cases_deaths_subset %>% - select(geo_value, time_value, case_rate = cases, death_rate = deaths) %>% + select(geo_value, time_value, case_rate = case_rate_7d_av, death_rate = death_rate_7d_av) %>% arrange(geo_value, time_value) %>% as_epi_df() ``` diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 59a376997..986b7c073 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -110,8 +110,7 @@ library(dplyr) library(tidyr) library(withr) -data(jhu_confirmed_cumulative_num) -cases <- jhu_confirmed_cumulative_num +cases <- epiprocess::jhu_confirmed_cumulative_num colnames(cases) ``` diff --git a/vignettes/growth_rate.Rmd b/vignettes/growth_rate.Rmd index 845a5f91b..029356eb1 100644 --- a/vignettes/growth_rate.Rmd +++ b/vignettes/growth_rate.Rmd @@ -24,8 +24,7 @@ library(tidyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -data(cases_deaths_subset) -x <- cases_deaths_subset %>% +x <- epiprocess::cases_deaths_subset %>% select(geo_value, time_value, cases = cases_7d_av) %>% filter(geo_value %in% c("pa", "ga") & time_value >= "2020-06-01") %>% arrange(geo_value, time_value) %>% @@ -33,7 +32,7 @@ x <- cases_deaths_subset %>% ``` The data can also be fetched from the Delphi API with the following query: -```{r, message = FALSE, eval=F} +```{r, message = FALSE, eval = FALSE} x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_7dav_incidence_num", diff --git a/vignettes/outliers.Rmd b/vignettes/outliers.Rmd index fa1e33931..76bda0960 100644 --- a/vignettes/outliers.Rmd +++ b/vignettes/outliers.Rmd @@ -22,8 +22,7 @@ library(epiprocess) library(dplyr) library(tidyr) -data(covid_incidence_outliers) -x <- covid_incidence_outliers +x <- epiprocess::covid_incidence_outliers ``` ```{r, fig.width = 8, fig.height = 7, warning=FALSE,message=FALSE} diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 77e7aa315..175a3e7d5 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -28,7 +28,7 @@ FL, NY, and TX (note: here we're using new, not cumulative cases) using the [`epidatr`](https://github.com/cmu-delphi/epidatr) package, and then convert this to `epi_df` format. -```{r, message = FALSE, warning=FALSE} +```{r, message = FALSE, warning = FALSE} library(epidatr) library(epiprocess) library(dplyr) @@ -37,15 +37,14 @@ library(dplyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -data(cases_deaths_subset) -x <- cases_deaths_subset %>% +x <- epiprocess::cases_deaths_subset %>% select(geo_value, time_value, cases) %>% arrange(geo_value, time_value) %>% as_epi_df() ``` The data can also be fetched from the Delphi API with the following query: -```{r, message = FALSE, eval=F} +```{r, message = FALSE, eval = FALSE} x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_incidence_num", From a7d2f77d60dd0f5457d3724c7f25e8e04dc2a25e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 5 Sep 2024 10:38:31 -0400 Subject: [PATCH 10/37] document delayassign-ed archive_cases_dv_subset --- NAMESPACE | 1 + R/data.R | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/NAMESPACE b/NAMESPACE index a7d65d517..a431313ed 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -45,6 +45,7 @@ S3method(ungroup,epi_df) S3method(ungroup,grouped_epi_archive) S3method(unnest,epi_df) export("%>%") +export(archive_cases_dv_subset) export(archive_cases_dv_subset_dt) export(arrange) export(arrange_canonical) diff --git a/R/data.R b/R/data.R index 7776690d6..a5fa7ee42 100644 --- a/R/data.R +++ b/R/data.R @@ -120,6 +120,53 @@ delayed_assign_with_unregister_awareness <- function(x, value, # binding may have been created with the same name as the package promise, and # this binding will stick around even when the package is reloaded, and will # need to be `rm`-d to easily access the refreshed package promise. + +#' @name archive_cases_dv_subset +#' +#' @title Subset of daily doctor visits and cases in archive format +#' +#' @description This data source is based on information about outpatient visits, +#' provided to us by health system partners, and also contains confirmed +#' COVID-19 cases based on reports made available by the Center for +#' Systems Science and Engineering at Johns Hopkins University. +#' This example data ranges from June 1, 2020 to Dec 1, 2021, and +#' is also limited to California, Florida, Texas, and New York. +#' +#' @format An `epi_archive` data format. The data table DT has 129,638 rows and 5 columns: +#' \describe{ +#' \item{geo_value}{the geographic value associated with each row of measurements.} +#' \item{time_value}{the time value associated with each row of measurements.} +#' \item{version}{the time value specifying the version for each row of measurements. } +#' \item{percent_cli}{percentage of doctor’s visits with CLI (COVID-like +#' illness) computed from medical insurance claims} +#' \item{case_rate_7d_av}{7-day average signal of number of new confirmed +#' deaths due to COVID-19 per 100,000 population, daily} +#' } +#' @source +#' This object contains a modified part of the +#' \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by +#' the Center for Systems Science and Engineering (CSSE) at Johns Hopkins +#' University} as +#' \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished +#' in the COVIDcast Epidata API}. This data set is licensed under the terms of +#' the \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons +#' Attribution 4.0 International license} by Johns Hopkins University on behalf +#' of its Center for Systems Science in Engineering. Copyright Johns Hopkins +#' University 2020. +#' +#' Modifications: +#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{From +#' the COVIDcast Doctor Visits API}: The signal `percent_cli` is taken +#' directly from the API without changes. +#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From +#' the COVIDcast Epidata API}: `case_rate_7d_av` signal was computed by Delphi +#' from the original JHU-CSSE data by calculating moving averages of the +#' preceding 7 days, so the signal for June 7 is the average of the underlying +#' data for June 1 through 7, inclusive. +#' * Furthermore, the data is a subset of the full dataset, the signal names +#' slightly altered, and formatted into a tibble. +#' +#' @export delayed_assign_with_unregister_awareness( "archive_cases_dv_subset", as_epi_archive(archive_cases_dv_subset_dt, compactify = FALSE) From 0ba4aaa38611cf848561a088738330aa09caa7d0 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:57:30 -0400 Subject: [PATCH 11/37] rcmdcheck cleanup --- DESCRIPTION | 1 - NAMESPACE | 1 + R/epiprocess.R | 1 + vignettes/archive.Rmd | 12 ++++-------- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7eb05ac60..69709930d 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -34,7 +34,6 @@ Imports: genlasso, glue, ggplot2, - glue, lifecycle (>= 1.0.1), lubridate, magrittr, diff --git a/NAMESPACE b/NAMESPACE index a431313ed..a1051f36a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -96,6 +96,7 @@ export(ungroup) export(unnest) export(validate_epi_archive) export(version_column_names) +import(epidatasets) importFrom(checkmate,anyInfinite) importFrom(checkmate,anyMissing) importFrom(checkmate,assert) diff --git a/R/epiprocess.R b/R/epiprocess.R index ba072a2d4..2c61e5c82 100644 --- a/R/epiprocess.R +++ b/R/epiprocess.R @@ -11,6 +11,7 @@ #' test_int #' @importFrom cli cli_abort cli_warn #' @importFrom rlang %||% +#' @import epidatasets #' @name epiprocess "_PACKAGE" utils::globalVariables(c( diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 715dbd8b4..627674944 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -49,7 +49,8 @@ dv <- pub_covidcast( geo_values = "ca,fl,ny,tx", time_values = epirange(20200601, 20211201), issues = epirange(20200601, 20211201) -) +) %>% + rename(version = issue, percent_cli = value) ``` ## Getting data into `epi_archive` format @@ -71,9 +72,9 @@ format, with `issue` playing the role of `version`. We can now use redundant version updates in `as_epi_archive` using compactify, please refer to the [compactify vignette](articles/compactify.html). -```{r, eval=FALSE} +```{r} x <- dv %>% - select(geo_value, time_value, version = issue, percent_cli = value) %>% + select(geo_value, time_value, version, percent_cli) %>% as_epi_archive(compactify = TRUE) class(x) @@ -85,11 +86,6 @@ An `epi_archive` is consists of a primary field `DT`, which is a data table `version` (and possibly additional ones), and other metadata fields, such as `geo_type`. -```{r} -class(x$DT) -head(x$DT) -``` - The variables `geo_value`, `time_value`, `version` serve as **key variables** for the data table, as well as any other specified in the metadata (described below). There can only be a single row per unique combination of key variables, From e2a5da19174fd240ab13fe37e6e9f5039ee5f28b Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:59:17 -0400 Subject: [PATCH 12/37] don't export _dt underlying archive example data --- NAMESPACE | 1 - R/data.R | 70 ++++++------------- R/reexports.R | 18 ----- _pkgdown.yml | 2 +- ...ubset_dt.Rd => archive_cases_dv_subset.Rd} | 22 +++--- 5 files changed, 32 insertions(+), 81 deletions(-) rename man/{archive_cases_dv_subset_dt.Rd => archive_cases_dv_subset.Rd} (84%) diff --git a/NAMESPACE b/NAMESPACE index a1051f36a..c4ca46826 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -46,7 +46,6 @@ S3method(ungroup,grouped_epi_archive) S3method(unnest,epi_df) export("%>%") export(archive_cases_dv_subset) -export(archive_cases_dv_subset_dt) export(arrange) export(arrange_canonical) export(as_epi_archive) diff --git a/R/data.R b/R/data.R index a5fa7ee42..d29dcaabc 100644 --- a/R/data.R +++ b/R/data.R @@ -101,6 +101,27 @@ delayed_assign_with_unregister_awareness <- function(x, value, }) } +#' @name archive_cases_dv_subset +#' @title Subset of daily doctor visits and cases from 6 states in archive format +#' +#' @inherit epidatasets::archive_cases_dv_subset_dt description source references +#' @format An `epi_archive` data format. The data table DT has 129,638 rows and 5 columns. +#' @inheritSection epidatasets::archive_cases_dv_subset_dt Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::archive_cases_dv_subset +#' +#' # works +#' library(epiprocess) +#' archive_cases_dv_subset +#' +#' # fails +#' data(archive_cases_dv_subset, package = "epiprocess") +#' +#' @export # Like normal data objects, set `archive_cases_dv_subset` up as a promise, so it # doesn't take unnecessary space before it's evaluated. This also avoids a need # for @include tags. However, this pattern will use unnecessary space after this @@ -120,54 +141,7 @@ delayed_assign_with_unregister_awareness <- function(x, value, # binding may have been created with the same name as the package promise, and # this binding will stick around even when the package is reloaded, and will # need to be `rm`-d to easily access the refreshed package promise. - -#' @name archive_cases_dv_subset -#' -#' @title Subset of daily doctor visits and cases in archive format -#' -#' @description This data source is based on information about outpatient visits, -#' provided to us by health system partners, and also contains confirmed -#' COVID-19 cases based on reports made available by the Center for -#' Systems Science and Engineering at Johns Hopkins University. -#' This example data ranges from June 1, 2020 to Dec 1, 2021, and -#' is also limited to California, Florida, Texas, and New York. -#' -#' @format An `epi_archive` data format. The data table DT has 129,638 rows and 5 columns: -#' \describe{ -#' \item{geo_value}{the geographic value associated with each row of measurements.} -#' \item{time_value}{the time value associated with each row of measurements.} -#' \item{version}{the time value specifying the version for each row of measurements. } -#' \item{percent_cli}{percentage of doctor’s visits with CLI (COVID-like -#' illness) computed from medical insurance claims} -#' \item{case_rate_7d_av}{7-day average signal of number of new confirmed -#' deaths due to COVID-19 per 100,000 population, daily} -#' } -#' @source -#' This object contains a modified part of the -#' \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by -#' the Center for Systems Science and Engineering (CSSE) at Johns Hopkins -#' University} as -#' \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished -#' in the COVIDcast Epidata API}. This data set is licensed under the terms of -#' the \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons -#' Attribution 4.0 International license} by Johns Hopkins University on behalf -#' of its Center for Systems Science in Engineering. Copyright Johns Hopkins -#' University 2020. -#' -#' Modifications: -#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{From -#' the COVIDcast Doctor Visits API}: The signal `percent_cli` is taken -#' directly from the API without changes. -#' * \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From -#' the COVIDcast Epidata API}: `case_rate_7d_av` signal was computed by Delphi -#' from the original JHU-CSSE data by calculating moving averages of the -#' preceding 7 days, so the signal for June 7 is the average of the underlying -#' data for June 1 through 7, inclusive. -#' * Furthermore, the data is a subset of the full dataset, the signal names -#' slightly altered, and formatted into a tibble. -#' -#' @export delayed_assign_with_unregister_awareness( "archive_cases_dv_subset", - as_epi_archive(archive_cases_dv_subset_dt, compactify = FALSE) + as_epi_archive(epidatasets::archive_cases_dv_subset_dt, compactify = FALSE) ) diff --git a/R/reexports.R b/R/reexports.R index f0a3938e1..26f0ac0cc 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -97,24 +97,6 @@ ggplot2::autoplot #' @export cases_deaths_subset <- epidatasets::cases_deaths_subset -#' @inherit epidatasets::archive_cases_dv_subset_dt description source references title -#' @inheritSection epidatasets::archive_cases_dv_subset_dt Data dictionary -#' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::archive_cases_dv_subset_dt -#' -#' # works -#' library(epiprocess) -#' archive_cases_dv_subset_dt -#' -#' # fails -#' data(archive_cases_dv_subset_dt, package = "epiprocess") -#' @export -archive_cases_dv_subset_dt <- epidatasets::archive_cases_dv_subset_dt - #' @inherit epidatasets::covid_incidence_county_subset description source references title #' @inheritSection epidatasets::covid_incidence_county_subset Data dictionary #' @examples diff --git a/_pkgdown.yml b/_pkgdown.yml index 442273db9..72c237aa4 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -92,7 +92,7 @@ reference: - title: Example data - contents: - cases_deaths_subset - - archive_cases_dv_subset_dt + - archive_cases_dv_subset - covid_incidence_county_subset - covid_incidence_outliers - jhu_confirmed_cumulative_num diff --git a/man/archive_cases_dv_subset_dt.Rd b/man/archive_cases_dv_subset.Rd similarity index 84% rename from man/archive_cases_dv_subset_dt.Rd rename to man/archive_cases_dv_subset.Rd index 014303843..02b8539e8 100644 --- a/man/archive_cases_dv_subset_dt.Rd +++ b/man/archive_cases_dv_subset.Rd @@ -1,11 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/reexports.R -\docType{data} -\name{archive_cases_dv_subset_dt} -\alias{archive_cases_dv_subset_dt} -\title{Subset of daily COVID-19 doctor visits and cases from 6 states in archive format} +% Please edit documentation in R/data.R +\name{archive_cases_dv_subset} +\alias{archive_cases_dv_subset} +\title{Subset of daily doctor visits and cases from 6 states in archive format} \format{ -An object of class \code{data.table} (inherits from \code{data.frame}) with 129638 rows and 5 columns. +An \code{epi_archive} data format. The data table DT has 129,638 rows and 5 columns. } \source{ This object contains a modified part of the \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. This data set is licensed under the terms of the @@ -21,9 +20,6 @@ Modifications: signal names slightly altered, and formatted into a tibble. } } -\usage{ -archive_cases_dv_subset_dt -} \description{ This data source is based on information about outpatient visits, provided to us by health system partners, and also contains confirmed @@ -54,13 +50,13 @@ An \code{epi_archive$DT} data format with columns: # the `data()` function. `data()` looks for a file of the same name # in the `data/` directory, which doesn't exist in this package. # works - epiprocess::archive_cases_dv_subset_dt + epiprocess::archive_cases_dv_subset # works library(epiprocess) - archive_cases_dv_subset_dt + archive_cases_dv_subset # fails - data(archive_cases_dv_subset_dt, package = "epiprocess") + data(archive_cases_dv_subset, package = "epiprocess") + } -\keyword{datasets} From f1350101663ca4f5fde6cb164492941f7061463f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:40:24 -0400 Subject: [PATCH 13/37] reexport archive and covid_case_death_rates --- DESCRIPTION | 1 - NAMESPACE | 1 + R/data.R | 147 --------------------------------- R/reexports.R | 37 +++++++++ man/archive_cases_dv_subset.Rd | 23 ++++-- man/covid_case_death_rates.Rd | 71 ++++++++++++++++ 6 files changed, 123 insertions(+), 157 deletions(-) delete mode 100644 R/data.R create mode 100644 man/covid_case_death_rates.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 69709930d..b52d30a12 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -74,7 +74,6 @@ Collate: 'archive.R' 'autoplot.R' 'correlation.R' - 'data.R' 'epi_df.R' 'epiprocess.R' 'group_by_epi_df_methods.R' diff --git a/NAMESPACE b/NAMESPACE index c4ca46826..f820b5dc1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -55,6 +55,7 @@ export(autoplot) export(cases_deaths_subset) export(clone) export(complete) +export(covid_case_death_rates) export(covid_incidence_county_subset) export(covid_incidence_outliers) export(detect_outlr) diff --git a/R/data.R b/R/data.R deleted file mode 100644 index d29dcaabc..000000000 --- a/R/data.R +++ /dev/null @@ -1,147 +0,0 @@ -#' Detect whether `pkgload` is unregistering a package (with some unlikely false positives) -#' -#' More precisely, detects the presence of a call to an `unregister` or -#' `unregister_namespace` function from any package in the indicated part of the -#' function call stack. -#' -#' @param parent_n optional, single non-`NA` non-negative integer; how many -#' "parent"/"ancestor" calls should we skip inspecting? Default of `0L` will -#' check everything up to, but not including the call to this function. If -#' building wrappers or utilities around this function it may be useful to use -#' this default to ignore those wrappers, especially if they might trigger -#' false positives now or in some future version of this function with a looser -#' function name test. -#' -#' @return Boolean -#' -#' @noRd -some_package_is_being_unregistered <- function(parent_n = 0L) { - calls <- sys.calls() - # `calls` will include the call to this function; strip out this call plus - # `parent_n` additional requested calls to make it like we're reasoning about - # the desired call. This could prevent potential false positives from - # triggering if, in a later version, we decide to loosen the `call_name` - # checks below to something that would be `TRUE` for the name of this function - # or one of the undesired call ancestors. - calls_to_inspect <- utils::head(calls, n = -(parent_n + 1L)) - # Note that `utils::head(sys.calls(), n=-1L)` isn't equivalent, due to lazy - # argument evaluation. Note that copy-pasting the body of this function - # without this `utils::head` operation isn't always equivalent to calling it; - # e.g., within the `value` argument of a package-level `delayedAssign`, - # `sys.calls()` will return `NULL` is some or all cases, including when its - # evaluation has been triggered via `unregister`. - simple_call_names <- purrr::map_chr(calls_to_inspect, function(call) { - maybe_simple_call_name <- rlang::call_name(call) - maybe_simple_call_name %||% NA_character_ - }) - # `pkgload::unregister` is an (the?) exported function that forces - # package-level promises, while `pkgload:::unregister_namespace` is the - # internal function that does this package-level promise. Check for both just - # in case there's another exported function that calls `unregister_namespace` - # or other `pkgload` versions don't use the `unregister_namespace` internal. - # (Note that `NA_character_ %in% ` is `FALSE` rather - # than `NA`, giving the desired semantics and avoiding potential `NA`s in the - # argument to `any`.) - any(simple_call_names %in% c("unregister", "unregister_namespace")) -} - -#' [`base::delayedAssign`] with [`pkgload::unregister`] awareness, injection support -#' -#' Provides better feedback on errors during promise evaluation while a package -#' is being unregistered, to help package developers escape from a situation -#' where a buggy promise prevents package reloading. Also provide `rlang` -#' injection support (like [`rlang::env_bind_lazy`]). The call stack will look -#' different than when using `delayedAssign` directly. -#' -#' @noRd -delayed_assign_with_unregister_awareness <- function(x, value, - eval_env = rlang::caller_env(), - assign_env = rlang::caller_env()) { - value_quosure <- rlang::as_quosure(rlang::enexpr(value), eval_env) - this_env <- environment() - delayedAssign(x, eval.env = this_env, assign.env = assign_env, value = { - if (some_package_is_being_unregistered()) { - withCallingHandlers( - # `rlang::eval_tidy(value_quosure)` is shorter and would sort of work, - # but doesn't give the same `ls`, `rm`, and top-level `<-` behavior as - # we'd have with `delayedAssign`; it doesn't seem to actually evaluate - # quosure's expr in the quosure's env. Using `rlang::eval_bare` instead - # seems to do the trick. (We also could have just used a `value_expr` - # and `eval_env` together rather than introducing `value_quosure` at - # all.) - rlang::eval_bare(rlang::quo_get_expr(value_quosure), rlang::quo_get_env(value_quosure)), - error = function(err) { - cli_abort( - paste( - "An error was raised while attempting to evaluate a promise", - "(prepared with `delayed_assign_with_unregister_awareness`)", - "while an `unregister` or `unregister_namespace` call", - "was being evaluated.", - "This can happen, for example, when `devtools::load_all`", - "reloads a package that contains a buggy promise,", - "because reloading can cause old package-level promises to", - "be forced via `pkgload::unregister` and", - "`pkgload:::unregister_namespace`, due to", - "https://github.com/r-lib/pkgload/pull/157.", - "If this is the current situation, you might be able to", - "be successfully reload the package again after", - "`unloadNamespace`-ing it (but this situation will", - "keep re-occurring every other `devtools::load`", - "and every `devtools:document` until the bug or situation", - "generating the promise's error has been resolved)." - ), - class = "epiprocess__promise_evaluation_error_during_unregister", - parent = err - ) - } - ) - } else { - rlang::eval_bare(rlang::quo_get_expr(value_quosure), rlang::quo_get_env(value_quosure)) - } - }) -} - -#' @name archive_cases_dv_subset -#' @title Subset of daily doctor visits and cases from 6 states in archive format -#' -#' @inherit epidatasets::archive_cases_dv_subset_dt description source references -#' @format An `epi_archive` data format. The data table DT has 129,638 rows and 5 columns. -#' @inheritSection epidatasets::archive_cases_dv_subset_dt Data dictionary -#' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::archive_cases_dv_subset -#' -#' # works -#' library(epiprocess) -#' archive_cases_dv_subset -#' -#' # fails -#' data(archive_cases_dv_subset, package = "epiprocess") -#' -#' @export -# Like normal data objects, set `archive_cases_dv_subset` up as a promise, so it -# doesn't take unnecessary space before it's evaluated. This also avoids a need -# for @include tags. However, this pattern will use unnecessary space after this -# promise is evaluated, because `as_epi_archive` copies `archive_cases_dv_subset_dt` -# and `archive_cases_dv_subset_dt` will stick around along with `archive_cases_dv_subset` -# after they have been evaluated. We may want to add an option to avoid cloning -# in `as_epi_archive` and make use of it here. But we may also want to change -# this into an active binding that copies every time, unless we can hide the -# `DT` field from the user (make it non-`public` in general) or make it -# read-only (in this specific case), so that the user cannot modify the `DT` -# here and potentially mess up examples that they refer to later on. -# -# During development, note that reloading the package and re-evaluating this -# promise should prepare the archive from the DT using any changes that have -# been made to `as_epi_archive`; however, if earlier, any field of -# `archive_cases_dv_subset` was modified using `<-`, a global environment -# binding may have been created with the same name as the package promise, and -# this binding will stick around even when the package is reloaded, and will -# need to be `rm`-d to easily access the refreshed package promise. -delayed_assign_with_unregister_awareness( - "archive_cases_dv_subset", - as_epi_archive(epidatasets::archive_cases_dv_subset_dt, compactify = FALSE) -) diff --git a/R/reexports.R b/R/reexports.R index 26f0ac0cc..733947fa9 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -150,3 +150,40 @@ covid_incidence_outliers <- epidatasets::covid_incidence_outliers #' data(jhu_confirmed_cumulative_num, package = "epiprocess") #' @export jhu_confirmed_cumulative_num <- epidatasets::jhu_confirmed_cumulative_num + +#' @inherit epidatasets::covid_case_death_rates description source references title +#' @inheritSection epidatasets::covid_case_death_rates Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::covid_case_death_rates +#' +#' # works +#' library(epiprocess) +#' covid_case_death_rates +#' +#' # fails +#' data(covid_case_death_rates, package = "epiprocess") +#' @export +covid_case_death_rates <- epidatasets::covid_case_death_rates + +#' @inherit epidatasets::archive_cases_dv_subset description source references title +#' @inheritSection epidatasets::archive_cases_dv_subset Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::archive_cases_dv_subset +#' +#' # works +#' library(epiprocess) +#' archive_cases_dv_subset +#' +#' # fails +#' data(archive_cases_dv_subset, package = "epiprocess") +#' +#' @export +archive_cases_dv_subset <- epidatasets::archive_cases_dv_subset diff --git a/man/archive_cases_dv_subset.Rd b/man/archive_cases_dv_subset.Rd index 02b8539e8..e34645780 100644 --- a/man/archive_cases_dv_subset.Rd +++ b/man/archive_cases_dv_subset.Rd @@ -1,10 +1,11 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/data.R +% Please edit documentation in R/reexports.R +\docType{data} \name{archive_cases_dv_subset} \alias{archive_cases_dv_subset} -\title{Subset of daily doctor visits and cases from 6 states in archive format} +\title{Subset of daily COVID-19 doctor visits and cases from 6 states in archive format} \format{ -An \code{epi_archive} data format. The data table DT has 129,638 rows and 5 columns. +An object of class \code{epi_archive} of length 6. } \source{ This object contains a modified part of the \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. This data set is licensed under the terms of the @@ -20,13 +21,16 @@ Modifications: signal names slightly altered, and formatted into a tibble. } } +\usage{ +archive_cases_dv_subset +} \description{ -This data source is based on information about outpatient visits, -provided to us by health system partners, and also contains confirmed -COVID-19 cases based on reports made available by the Center for -Systems Science and Engineering at Johns Hopkins University. -This example data ranges from June 1, 2020 to Dec 1, 2021, and -is also limited to California, Florida, Texas, and New York. +This data source is based on information about outpatient visits, provided +to us by health system partners, and also contains confirmed COVID-19 +cases based on reports made available by the Center for Systems Science +and Engineering at Johns Hopkins University. This example data ranges from +June 1, 2020 to December 1, 2021, issued on dates from June 1, 2020 to December 1, +2021. It is limited to California, Florida, Texas, and New York. It is used in the {epiprocess} \code{compactify}, \code{epix_archive}, and advanced-use vignettes. @@ -60,3 +64,4 @@ An \code{epi_archive$DT} data format with columns: data(archive_cases_dv_subset, package = "epiprocess") } +\keyword{datasets} diff --git a/man/covid_case_death_rates.Rd b/man/covid_case_death_rates.Rd new file mode 100644 index 000000000..806b0e29d --- /dev/null +++ b/man/covid_case_death_rates.Rd @@ -0,0 +1,71 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reexports.R +\docType{data} +\name{covid_case_death_rates} +\alias{covid_case_death_rates} +\title{JHU daily COVID-19 cases and deaths rates from all states} +\format{ +An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 37576 rows and 4 columns. +} +\source{ +This object contains a modified part of the +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} +as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. +This data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by the Johns Hopkins University on behalf of its Center for Systems Science +in Engineering. Copyright Johns Hopkins University 2020. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: +These signals are taken directly from the JHU CSSE +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} +without changes. The 7-day average signals are computed by Delphi by +calculating moving averages of the preceding 7 days, so the signal for +June 7 is the average of the underlying data for June 1 through 7, +inclusive. +} +} +\usage{ +covid_case_death_rates +} +\description{ +This data source of confirmed COVID-19 cases and deaths is based on reports +made available by the Center for Systems Science and Engineering at Johns +Hopkins University, as downloaded from the CMU Delphi COVIDcast Epidata +API. This example data is a snapshot as of March 20, 2024, and +ranges from December 31, 2020 to December 31, 2021. It +includes all states. It is used in the {epiprocess} correlation vignette. +} +\section{Data dictionary}{ + + +A tibble with columns: +\describe{ +\item{geo_value}{the geographic value associated with each row +of measurements.} +\item{time_value}{the time value associated with each row of measurements.} +\item{case_rate}{7-day average signal of number of new +confirmed COVID-19 cases per 100,000 population, daily} +\item{death_rate}{7-day average signal of number of new confirmed +deaths due to COVID-19 per 100,000 population, daily} +} + +} + +\examples{ + # Since this is a re-exported dataset, it cannot be loaded using + # the `data()` function. `data()` looks for a file of the same name + # in the `data/` directory, which doesn't exist in this package. + # works + epiprocess::covid_case_death_rates + + # works + library(epiprocess) + covid_case_death_rates + + # fails + data(covid_case_death_rates, package = "epiprocess") +} +\keyword{datasets} From 5e8ba56bfa06c5be026db630ea58a9e84d35a6d9 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:42:12 -0400 Subject: [PATCH 14/37] note as_of in data docs; use as_of in vignette data fetch code --- man/cases_deaths_subset.Rd | 12 ++++++------ man/covid_incidence_county_subset.Rd | 5 +++-- man/covid_incidence_outliers.Rd | 4 ++-- man/jhu_confirmed_cumulative_num.Rd | 7 ++++--- vignettes/aggregation.Rmd | 7 +++++-- vignettes/correlation.Rmd | 21 ++++++++++++--------- vignettes/epiprocess.Rmd | 2 +- vignettes/growth_rate.Rmd | 9 +++++---- vignettes/outliers.Rmd | 2 +- vignettes/slide.Rmd | 9 +++++---- 10 files changed, 44 insertions(+), 34 deletions(-) diff --git a/man/cases_deaths_subset.Rd b/man/cases_deaths_subset.Rd index 7eb58582e..531da7489 100644 --- a/man/cases_deaths_subset.Rd +++ b/man/cases_deaths_subset.Rd @@ -3,7 +3,7 @@ \docType{data} \name{cases_deaths_subset} \alias{cases_deaths_subset} -\title{Subset of JHU daily state COVID-19 cases and deaths from 4 states} +\title{Subset of JHU daily state COVID-19 cases and deaths from 6 states} \format{ An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 4026 rows and 6 columns. } @@ -33,11 +33,11 @@ signal names slightly altered, and formatted into a tibble. cases_deaths_subset } \description{ -This data source of confirmed COVID-19 cases and deaths -is based on reports made available by the Center for -Systems Science and Engineering at Johns Hopkins University. -This example data ranges from Mar 1, 2020 to Dec 31, 2021, and is limited to -California, Florida, Texas, New York, Georgia, and Pennsylvania. +This data source of confirmed COVID-19 cases and deaths is based on reports +made available by the Center for Systems Science and Engineering at Johns +Hopkins University. This example data is a snapshot as of March 20, 2024, and +ranges from March 1, 2020 to December 31, 2021. It is limited to California, +Florida, Texas, New York, Georgia, and Pennsylvania. It is used in the {epiprocess} growth rate and \code{epi_slide} vignettes. } diff --git a/man/covid_incidence_county_subset.Rd b/man/covid_incidence_county_subset.Rd index 0b70e3c38..15721e7f5 100644 --- a/man/covid_incidence_county_subset.Rd +++ b/man/covid_incidence_county_subset.Rd @@ -36,8 +36,9 @@ covid_incidence_county_subset This data source of confirmed COVID-19 cases and deaths is based on reports made available by the Center for Systems Science and Engineering at Johns Hopkins University. -This example data ranges from Mar 1, 2020 to Dec 31, 2021, -and is limited to Massachusetts and Vermont. +This example data is a snapshot as of March 20, 2024, and +ranges from March 1, 2020 to December 31, 2021. +It is limited to Massachusetts and Vermont. It is used in the {epiprocess} aggregation vignette. } diff --git a/man/covid_incidence_outliers.Rd b/man/covid_incidence_outliers.Rd index e1baa9da7..81c975265 100644 --- a/man/covid_incidence_outliers.Rd +++ b/man/covid_incidence_outliers.Rd @@ -31,8 +31,8 @@ covid_incidence_outliers This data source of confirmed COVID-19 cases is based on reports made available by the Center for Systems Science and Engineering at Johns Hopkins University. This example data is downloaded from the CMU Delphi -COVIDcast Epidata API. It is a snapshot as of Oct 28, 2021 and captures the -cases from June 1, 2020 to May 31, 2021 and is limited to New Jersey and +COVIDcast Epidata API. It is a snapshot as of October 28, 2021, and captures the +cases from June 1, 2020 to May 31, 2021. It is limited to New Jersey and Florida. This data set is used in the {epiprocess} vignette on outliers. diff --git a/man/jhu_confirmed_cumulative_num.Rd b/man/jhu_confirmed_cumulative_num.Rd index 37f808058..af243a015 100644 --- a/man/jhu_confirmed_cumulative_num.Rd +++ b/man/jhu_confirmed_cumulative_num.Rd @@ -3,7 +3,7 @@ \docType{data} \name{jhu_confirmed_cumulative_num} \alias{jhu_confirmed_cumulative_num} -\title{Subset of COVID-19 Cumulative Cases from 4 states} +\title{Subset of COVID-19 cumulative case counts from 4 states} \format{ An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 2808 rows and 15 columns. } @@ -18,8 +18,9 @@ jhu_confirmed_cumulative_num } \description{ Data set for 4 states containing COVID-19 Cumulative Cases as reported by -JHU-CSSE and downloaded from the CMU Delphi COVIDcast Epidata API. This -data set covers the period from March 2020 to January 2022, and is limited +JHU-CSSE and downloaded from the CMU Delphi COVIDcast Epidata API. +This example data is a snapshot as of March 20, 2024, and +ranges from March 1, 2020 to January 31, 2022. It is limited to California, Florida, New York, and Texas. It is used in the {epiprocess} "Getting Started" vignette. diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index 266cf9f34..f7e0d6707 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -20,11 +20,13 @@ library(covidcast) library(epiprocess) library(dplyr) -x <- epiprocess::covid_incidence_county_subset +x <- covid_incidence_county_subset ``` The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval = FALSE, warning = FALSE} +d <- as.Date("2024-03-20") + # Use covidcast::county_census to get the county and state names y <- covidcast::county_census %>% filter(STNAME %in% c("Massachusetts", "Vermont"), STNAME != CTYNAME) %>% @@ -38,10 +40,11 @@ x <- pub_covidcast( time_type = "day", geo_values = paste(y$geo_value, collapse = ","), time_values = epirange(20200601, 20211231), + as_of = d ) %>% select(geo_value, time_value, cases = value) %>% full_join(y, by = "geo_value") %>% - as_epi_df() + as_epi_df(as_of = d) ``` The data contains 16,212 rows and 5 columns. diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index 8259df388..e24a21934 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -23,37 +23,40 @@ library(dplyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -x <- cases_deaths_subset %>% - select(geo_value, time_value, case_rate = case_rate_7d_av, death_rate = death_rate_7d_av) %>% - arrange(geo_value, time_value) %>% - as_epi_df() +x <- covid_case_death_rates %>% + select(geo_value, time_value, case_rate, death_rate) %>% + arrange(geo_value, time_value) ``` The data can also be fetched from the Delphi API with the following query: ```{r, eval = FALSE} +d <- as.Date("2024-03-20") + x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_7dav_incidence_prop", - geo_type = "state", time_type = "day", - geo_values = "*", + geo_type = "state", time_values = epirange(20200301, 20211231), + geo_values = "*", + as_of = d ) %>% select(geo_value, time_value, case_rate = value) y <- pub_covidcast( source = "jhu-csse", signals = "deaths_7dav_incidence_prop", - geo_type = "state", time_type = "day", - geo_values = "*", + geo_type = "state", time_values = epirange(20200301, 20211231), + geo_values = "*", + as_of = d ) %>% select(geo_value, time_value, death_rate = value) x <- x %>% full_join(y, by = c("geo_value", "time_value")) %>% - as_epi_df() + as_epi_df(as_of = d) ``` ## Correlations grouped by time diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 986b7c073..2978ff0bf 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -110,7 +110,7 @@ library(dplyr) library(tidyr) library(withr) -cases <- epiprocess::jhu_confirmed_cumulative_num +cases <- jhu_confirmed_cumulative_num colnames(cases) ``` diff --git a/vignettes/growth_rate.Rmd b/vignettes/growth_rate.Rmd index 029356eb1..406ae36fb 100644 --- a/vignettes/growth_rate.Rmd +++ b/vignettes/growth_rate.Rmd @@ -24,15 +24,15 @@ library(tidyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -x <- epiprocess::cases_deaths_subset %>% +x <- cases_deaths_subset %>% select(geo_value, time_value, cases = cases_7d_av) %>% filter(geo_value %in% c("pa", "ga") & time_value >= "2020-06-01") %>% - arrange(geo_value, time_value) %>% - as_epi_df() + arrange(geo_value, time_value) ``` The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval = FALSE} +d <- as.Date("2024-03-20") x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_7dav_incidence_num", @@ -40,10 +40,11 @@ x <- pub_covidcast( time_type = "day", geo_values = "ga,pa", time_values = epirange(20200601, 20211231), + as_of = d ) %>% select(geo_value, time_value, cases = value) %>% arrange(geo_value, time_value) %>% - as_epi_df() + as_epi_df(as_of = d) ``` The data has 1,158 rows and 3 columns. diff --git a/vignettes/outliers.Rmd b/vignettes/outliers.Rmd index 76bda0960..72706d50b 100644 --- a/vignettes/outliers.Rmd +++ b/vignettes/outliers.Rmd @@ -22,7 +22,7 @@ library(epiprocess) library(dplyr) library(tidyr) -x <- epiprocess::covid_incidence_outliers +x <- covid_incidence_outliers ``` ```{r, fig.width = 8, fig.height = 7, warning=FALSE,message=FALSE} diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 175a3e7d5..1f218adb7 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -37,14 +37,14 @@ library(dplyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -x <- epiprocess::cases_deaths_subset %>% +x <- cases_deaths_subset %>% select(geo_value, time_value, cases) %>% - arrange(geo_value, time_value) %>% - as_epi_df() + arrange(geo_value, time_value) ``` The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval = FALSE} +d <- as.Date("2024-03-20") x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_incidence_num", @@ -52,10 +52,11 @@ x <- pub_covidcast( time_type = "day", geo_values = "ca,fl,ny,tx,ga,pa", time_values = epirange(20200301, 20211231), + as_of = d ) %>% select(geo_value, time_value, cases = value) %>% arrange(geo_value, time_value) %>% - as_epi_df() + as_epi_df(as_of = d) ``` The data has 2,684 rows and 3 columns. From 171e984e085e731e45a59e0c1baa5643f0b09d1d Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 6 Sep 2024 19:33:38 -0400 Subject: [PATCH 15/37] remove data.R tests --- tests/testthat/test-data.R | 78 -------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 tests/testthat/test-data.R diff --git a/tests/testthat/test-data.R b/tests/testthat/test-data.R deleted file mode 100644 index 88ecc8c74..000000000 --- a/tests/testthat/test-data.R +++ /dev/null @@ -1,78 +0,0 @@ -test_that("`archive_cases_dv_subset` is formed successfully", { - expect_class(archive_cases_dv_subset, "epi_archive") -}) - -test_that("`delayed_assign_with_unregister_awareness` works as expected on good promises", { - # Since we're testing environment stuff, use some "my_" prefixes to try to - # prevent naming coincidences from changing behavior. - my_eval_env <- rlang::new_environment(list(x = 40L, n_evals = 0L), parent = rlang::base_env()) - my_assign_env <- rlang::new_environment() - delayed_assign_with_unregister_awareness( - "good1", - { - n_evals <- n_evals + 1L - x + 2L - }, - my_eval_env, - my_assign_env - ) - force(my_assign_env[["good1"]]) - force(my_assign_env[["good1"]]) - force(my_assign_env[["good1"]]) - expect_identical(my_assign_env[["good1"]], 42L) - expect_identical(my_eval_env[["n_evals"]], 1L) -}) - -test_that("original `delayedAssign` works as expected on good promises", { - my_eval_env <- rlang::new_environment(list(x = 40L, n_evals = 0L), parent = rlang::base_env()) - my_assign_env <- rlang::new_environment() - delayedAssign( - "good1", - { - n_evals <- n_evals + 1L - x + 2L - }, - my_eval_env, - my_assign_env - ) - force(my_assign_env[["good1"]]) - force(my_assign_env[["good1"]]) - force(my_assign_env[["good1"]]) - expect_identical(my_assign_env[["good1"]], 42L) - expect_identical(my_eval_env[["n_evals"]], 1L) -}) - -test_that("`delayed_assign_with_unregister_awareness` doesn't wrap a buggy promise if not unregistering", { - delayed_assign_with_unregister_awareness("x", cli_abort("msg", class = "original_error_class")) - expect_error(force(x), class = "original_error_class") -}) - -test_that("`delayed_assign_with_unregister_awareness` doesn't wrap a buggy promise if not unregistering", { - delayed_assign_with_unregister_awareness("x", cli_abort("msg", class = "original_error_class")) - # Take advantage of a false positive / hedge against package renaming: make - # our own `unregister` function to trigger the special error message. - unregister <- function(y) y - expect_error(unregister(force(x)), class = "epiprocess__promise_evaluation_error_during_unregister") -}) - -test_that("`delayed_assign_with_unregister_awareness` injection support works", { - my_exprs <- rlang::exprs(a = b + c, d = e) - delayed_assign_with_unregister_awareness( - "good2", list(!!!my_exprs), - eval_env = rlang::new_environment(list(b = 2L, c = 3L, e = 4L), rlang::base_env()) - ) - force(good2) - expect_identical(good2, list(a = 5L, d = 4L)) -}) - -test_that("`some_package_is_being_unregistered` doesn't fail in response to non-simple calls", { - # Prerequisite for current implementation to work (testing here to help debug - # in case some R version doesn't obey): - expect_false(NA_character_ %in% letters) - f <- function() function() some_package_is_being_unregistered() - my_expr <- rlang::expr(f()()) - # Prerequisite for this to test to actually be testing on non-simple calls: - expect_false(rlang::is_call_simple(my_expr)) - # Actual test (`FALSE` is correct; `NA` or error is not): - expect_false(rlang::eval_bare(my_expr)) -}) From 012795e7a0e21f9d8dd1b2f07877e7f4e3838bfa Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:48:34 -0400 Subject: [PATCH 16/37] use delayed assignment for datasets --- R/reexports.R | 12 ++++++------ man/archive_cases_dv_subset.Rd | 10 +++++----- man/cases_deaths_subset.Rd | 4 ++-- man/covid_case_death_rates.Rd | 2 +- man/covid_incidence_county_subset.Rd | 4 ++-- man/covid_incidence_outliers.Rd | 4 ++-- man/jhu_confirmed_cumulative_num.Rd | 11 +++++------ 7 files changed, 23 insertions(+), 24 deletions(-) diff --git a/R/reexports.R b/R/reexports.R index 733947fa9..81a1b5748 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -95,7 +95,7 @@ ggplot2::autoplot #' # fails #' data(cases_deaths_subset, package = "epiprocess") #' @export -cases_deaths_subset <- epidatasets::cases_deaths_subset +delayedAssign("cases_deaths_subset", epidatasets::cases_deaths_subset) #' @inherit epidatasets::covid_incidence_county_subset description source references title #' @inheritSection epidatasets::covid_incidence_county_subset Data dictionary @@ -113,7 +113,7 @@ cases_deaths_subset <- epidatasets::cases_deaths_subset #' # fails #' data(covid_incidence_county_subset, package = "epiprocess") #' @export -covid_incidence_county_subset <- epidatasets::covid_incidence_county_subset +delayedAssign("covid_incidence_county_subset", epidatasets::covid_incidence_county_subset) #' @inherit epidatasets::covid_incidence_outliers description source references title #' @inheritSection epidatasets::covid_incidence_outliers Data dictionary @@ -131,7 +131,7 @@ covid_incidence_county_subset <- epidatasets::covid_incidence_county_subset #' # fails #' data(covid_incidence_outliers, package = "epiprocess") #' @export -covid_incidence_outliers <- epidatasets::covid_incidence_outliers +delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) #' @inherit epidatasets::jhu_confirmed_cumulative_num description source references title #' @inheritSection epidatasets::jhu_confirmed_cumulative_num Data dictionary @@ -149,7 +149,7 @@ covid_incidence_outliers <- epidatasets::covid_incidence_outliers #' # fails #' data(jhu_confirmed_cumulative_num, package = "epiprocess") #' @export -jhu_confirmed_cumulative_num <- epidatasets::jhu_confirmed_cumulative_num +delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulative_num) #' @inherit epidatasets::covid_case_death_rates description source references title #' @inheritSection epidatasets::covid_case_death_rates Data dictionary @@ -167,7 +167,7 @@ jhu_confirmed_cumulative_num <- epidatasets::jhu_confirmed_cumulative_num #' # fails #' data(covid_case_death_rates, package = "epiprocess") #' @export -covid_case_death_rates <- epidatasets::covid_case_death_rates +delayedAssign("covid_case_death_rates", epidatasets::covid_case_death_rates) #' @inherit epidatasets::archive_cases_dv_subset description source references title #' @inheritSection epidatasets::archive_cases_dv_subset Data dictionary @@ -186,4 +186,4 @@ covid_case_death_rates <- epidatasets::covid_case_death_rates #' data(archive_cases_dv_subset, package = "epiprocess") #' #' @export -archive_cases_dv_subset <- epidatasets::archive_cases_dv_subset +delayedAssign("archive_cases_dv_subset", epidatasets::archive_cases_dv_subset) diff --git a/man/archive_cases_dv_subset.Rd b/man/archive_cases_dv_subset.Rd index e34645780..7eff52dff 100644 --- a/man/archive_cases_dv_subset.Rd +++ b/man/archive_cases_dv_subset.Rd @@ -18,7 +18,7 @@ Modifications: \item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{From the COVIDcast Doctor Visits API}: The signal \code{percent_cli} is taken directly from the API without changes. \item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: \code{case_rate_7d_av} signal was computed by Delphi from the original JHU-CSSE data by calculating moving averages of the preceding 7 days, so the signal for June 7 is the average of the underlying data for June 1 through 7, inclusive. \item Furthermore, the data has been limited to a very small number of rows, the -signal names slightly altered, and formatted into a tibble. +signal names slightly altered, and formatted into an \code{epi_archive}. } } \usage{ @@ -32,19 +32,19 @@ and Engineering at Johns Hopkins University. This example data ranges from June 1, 2020 to December 1, 2021, issued on dates from June 1, 2020 to December 1, 2021. It is limited to California, Florida, Texas, and New York. -It is used in the {epiprocess} \code{compactify}, \code{epix_archive}, and -advanced-use vignettes. +It is used in the {epiprocess} \code{compactify}, \code{epi_archive}, and +advanced-use (\code{advanced}) vignettes. } \section{Data dictionary}{ -An \code{epi_archive$DT} data format with columns: +The data in the \code{epi_archive$DT} attribute has columns: \describe{ \item{geo_value}{the geographic value associated with each row of measurements.} \item{time_value}{the time value associated with each row of measurements.} \item{version}{the time value specifying the version for each row of measurements. } \item{percent_cli}{percentage of doctor’s visits with CLI (COVID-like illness) computed from medical insurance claims} -\item{case_rate_7d_av}{7-day average signal of number of new confirmed deaths due to COVID-19 per 100,000 population, daily} +\item{case_rate_7d_av}{7-day average signal of number of new confirmed cases due to COVID-19 per 100,000 population, daily} } } diff --git a/man/cases_deaths_subset.Rd b/man/cases_deaths_subset.Rd index 531da7489..397ef93c7 100644 --- a/man/cases_deaths_subset.Rd +++ b/man/cases_deaths_subset.Rd @@ -26,7 +26,7 @@ The 7-day average signals were computed by Delphi by calculating moving averages of the preceding 7 days, so the signal for June 7 is the average of the underlying data for June 1 through 7, inclusive. \item Furthermore, the data has been limited to a very small number of rows, the -signal names slightly altered, and formatted into a tibble. +signal names slightly altered, and formatted into an \code{epi_df}. } } \usage{ @@ -44,7 +44,7 @@ It is used in the {epiprocess} growth rate and \code{epi_slide} vignettes. \section{Data dictionary}{ -A tibble with columns: +The data has columns: \describe{ \item{geo_value}{the geographic value associated with each row of measurements.} diff --git a/man/covid_case_death_rates.Rd b/man/covid_case_death_rates.Rd index 806b0e29d..f51cc858e 100644 --- a/man/covid_case_death_rates.Rd +++ b/man/covid_case_death_rates.Rd @@ -41,7 +41,7 @@ includes all states. It is used in the {epiprocess} correlation vignette. \section{Data dictionary}{ -A tibble with columns: +The data has columns: \describe{ \item{geo_value}{the geographic value associated with each row of measurements.} diff --git a/man/covid_incidence_county_subset.Rd b/man/covid_incidence_county_subset.Rd index 15721e7f5..ba2c9bc48 100644 --- a/man/covid_incidence_county_subset.Rd +++ b/man/covid_incidence_county_subset.Rd @@ -26,7 +26,7 @@ as moving averages of the preceding 7 days, so the signal for June 7 is the average of the underlying data for June 1 through 7, inclusive. \item Furthermore, the data has been limited to a very small number of rows, -formatted into a tibble, and the signal names slightly altered. +formatted into an \code{epi_df}, and the signal names slightly altered. } } \usage{ @@ -45,7 +45,7 @@ It is used in the {epiprocess} aggregation vignette. \section{Data dictionary}{ -A tibble with columns: +The data has columns: \describe{ \item{geo_value}{the geographic value associated with each row of measurements.} \item{time_value}{the time value associated with each row of measurements.} diff --git a/man/covid_incidence_outliers.Rd b/man/covid_incidence_outliers.Rd index 81c975265..0d2ea889b 100644 --- a/man/covid_incidence_outliers.Rd +++ b/man/covid_incidence_outliers.Rd @@ -21,7 +21,7 @@ Modifications: \item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: These signals are taken directly from the JHU CSSE \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} without changes. \item Furthermore, the data has been limited to a very small number of rows, -formatted into a tibble, and the signal names slightly altered. +formatted into an \code{epi_df}, and the signal names slightly altered. } } \usage{ @@ -40,7 +40,7 @@ This data set is used in the {epiprocess} vignette on outliers. \section{Data dictionary}{ -A tibble with columns: +The data has columns: \describe{ \item{geo_value}{the geographic value associated with each row of measurements.} \item{time_value}{the time value associated with each row of measurements.} diff --git a/man/jhu_confirmed_cumulative_num.Rd b/man/jhu_confirmed_cumulative_num.Rd index af243a015..fad62fa88 100644 --- a/man/jhu_confirmed_cumulative_num.Rd +++ b/man/jhu_confirmed_cumulative_num.Rd @@ -5,7 +5,7 @@ \alias{jhu_confirmed_cumulative_num} \title{Subset of COVID-19 cumulative case counts from 4 states} \format{ -An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 2808 rows and 15 columns. +An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 2808 rows and 14 columns. } \source{ This object contains a modified part of the \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. This data set is licensed under the terms of the @@ -28,7 +28,7 @@ It is used in the {epiprocess} "Getting Started" vignette. \section{Data dictionary}{ -A tibble with 2,808 rows and 15 variables: +The data has columns: \describe{ \item{geo_value}{the geographic value associated with each row of measurements.} \item{signal}{name of metric, derived from upstream data.} @@ -36,15 +36,14 @@ A tibble with 2,808 rows and 15 variables: \item{geo_type}{spatial resolution of the signal.} \item{time_type}{temporal resolution of the signal.} \item{time_value}{the time value associated with each row of measurements.} -\item{direction}{trend classifier (+1 -> increasing, 0 -> steady or not determined, -1 -> decreasing).} \item{issue}{time unit (e.g., date) when the signal data were published.} \item{lag}{time delta (e.g. days) between when the underlying events happened and when the data were published.} \item{missing_value}{an integer code that is zero when the value field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} \item{missing_stderr}{an integer code that is zero when the stderr field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} \item{missing_sample_size}{an integer code that is zero when the sample_size field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} -\item{value}{Cumulative number of confirmed COVID-19 cases, derived from the underlying data source.} -\item{stderr}{approximate standard error of the statistic with respect to its sampling distribution, null when not applicable.} -\item{sample_size}{number of “data points” used in computing the statistic, null when not applicable.} +\item{value}{cumulative number of confirmed COVID-19 cases, derived from the underlying data source.} +\item{stderr}{approximate standard error of the statistic with respect to its sampling distribution, NA when not applicable.} +\item{sample_size}{number of “data points” used in computing the statistic, NA when not applicable.} } } From ad225b2dcee135c856dab5692894cedebc3c4823 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:52:58 -0400 Subject: [PATCH 17/37] linting --- vignettes/archive.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 627674944..c414095c1 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -49,7 +49,7 @@ dv <- pub_covidcast( geo_values = "ca,fl,ny,tx", time_values = epirange(20200601, 20211201), issues = epirange(20200601, 20211201) -) %>% +) %>% rename(version = issue, percent_cli = value) ``` From d88d44d4b9af91ca8a44a8cf0f6c2623f01d1cda Mon Sep 17 00:00:00 2001 From: nmdefries Date: Mon, 16 Sep 2024 20:58:10 +0000 Subject: [PATCH 18/37] style: styler (GHA) --- R/reexports.R | 120 +++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/R/reexports.R b/R/reexports.R index 81a1b5748..0ba0e1b95 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -82,108 +82,108 @@ ggplot2::autoplot #' @inherit epidatasets::cases_deaths_subset description source references title #' @inheritSection epidatasets::cases_deaths_subset Data dictionary #' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::cases_deaths_subset +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::cases_deaths_subset #' -#' # works -#' library(epiprocess) -#' cases_deaths_subset +#' # works +#' library(epiprocess) +#' cases_deaths_subset #' -#' # fails -#' data(cases_deaths_subset, package = "epiprocess") +#' # fails +#' data(cases_deaths_subset, package = "epiprocess") #' @export delayedAssign("cases_deaths_subset", epidatasets::cases_deaths_subset) #' @inherit epidatasets::covid_incidence_county_subset description source references title #' @inheritSection epidatasets::covid_incidence_county_subset Data dictionary #' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::covid_incidence_county_subset +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::covid_incidence_county_subset #' -#' # works -#' library(epiprocess) -#' covid_incidence_county_subset +#' # works +#' library(epiprocess) +#' covid_incidence_county_subset #' -#' # fails -#' data(covid_incidence_county_subset, package = "epiprocess") +#' # fails +#' data(covid_incidence_county_subset, package = "epiprocess") #' @export delayedAssign("covid_incidence_county_subset", epidatasets::covid_incidence_county_subset) #' @inherit epidatasets::covid_incidence_outliers description source references title #' @inheritSection epidatasets::covid_incidence_outliers Data dictionary #' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::covid_incidence_outliers +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::covid_incidence_outliers #' -#' # works -#' library(epiprocess) -#' covid_incidence_outliers +#' # works +#' library(epiprocess) +#' covid_incidence_outliers #' -#' # fails -#' data(covid_incidence_outliers, package = "epiprocess") +#' # fails +#' data(covid_incidence_outliers, package = "epiprocess") #' @export delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) #' @inherit epidatasets::jhu_confirmed_cumulative_num description source references title #' @inheritSection epidatasets::jhu_confirmed_cumulative_num Data dictionary #' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::jhu_confirmed_cumulative_num +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::jhu_confirmed_cumulative_num #' -#' # works -#' library(epiprocess) -#' jhu_confirmed_cumulative_num +#' # works +#' library(epiprocess) +#' jhu_confirmed_cumulative_num #' -#' # fails -#' data(jhu_confirmed_cumulative_num, package = "epiprocess") +#' # fails +#' data(jhu_confirmed_cumulative_num, package = "epiprocess") #' @export delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulative_num) #' @inherit epidatasets::covid_case_death_rates description source references title #' @inheritSection epidatasets::covid_case_death_rates Data dictionary #' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::covid_case_death_rates +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::covid_case_death_rates #' -#' # works -#' library(epiprocess) -#' covid_case_death_rates +#' # works +#' library(epiprocess) +#' covid_case_death_rates #' -#' # fails -#' data(covid_case_death_rates, package = "epiprocess") +#' # fails +#' data(covid_case_death_rates, package = "epiprocess") #' @export delayedAssign("covid_case_death_rates", epidatasets::covid_case_death_rates) #' @inherit epidatasets::archive_cases_dv_subset description source references title #' @inheritSection epidatasets::archive_cases_dv_subset Data dictionary #' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::archive_cases_dv_subset +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::archive_cases_dv_subset #' -#' # works -#' library(epiprocess) -#' archive_cases_dv_subset +#' # works +#' library(epiprocess) +#' archive_cases_dv_subset #' -#' # fails -#' data(archive_cases_dv_subset, package = "epiprocess") +#' # fails +#' data(archive_cases_dv_subset, package = "epiprocess") #' #' @export delayedAssign("archive_cases_dv_subset", epidatasets::archive_cases_dv_subset) From 779ec2aa42eae35e1f6ca3e6de426c7c15c73b84 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 17 Sep 2024 17:41:00 -0400 Subject: [PATCH 19/37] use cases_deaths_subset instead of covid_case_death_rates --- NAMESPACE | 1 - R/reexports.R | 18 ------- man/archive_cases_dv_subset.Rd | 20 ++++---- man/cases_deaths_subset.Rd | 20 ++++---- man/covid_case_death_rates.Rd | 71 ---------------------------- man/covid_incidence_county_subset.Rd | 20 ++++---- man/covid_incidence_outliers.Rd | 20 ++++---- man/jhu_confirmed_cumulative_num.Rd | 20 ++++---- vignettes/correlation.Rmd | 4 +- 9 files changed, 52 insertions(+), 142 deletions(-) delete mode 100644 man/covid_case_death_rates.Rd diff --git a/NAMESPACE b/NAMESPACE index f820b5dc1..c4ca46826 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -55,7 +55,6 @@ export(autoplot) export(cases_deaths_subset) export(clone) export(complete) -export(covid_case_death_rates) export(covid_incidence_county_subset) export(covid_incidence_outliers) export(detect_outlr) diff --git a/R/reexports.R b/R/reexports.R index 0ba0e1b95..a86fdd1da 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -151,24 +151,6 @@ delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) #' @export delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulative_num) -#' @inherit epidatasets::covid_case_death_rates description source references title -#' @inheritSection epidatasets::covid_case_death_rates Data dictionary -#' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::covid_case_death_rates -#' -#' # works -#' library(epiprocess) -#' covid_case_death_rates -#' -#' # fails -#' data(covid_case_death_rates, package = "epiprocess") -#' @export -delayedAssign("covid_case_death_rates", epidatasets::covid_case_death_rates) - #' @inherit epidatasets::archive_cases_dv_subset description source references title #' @inheritSection epidatasets::archive_cases_dv_subset Data dictionary #' @examples diff --git a/man/archive_cases_dv_subset.Rd b/man/archive_cases_dv_subset.Rd index 7eff52dff..f07f81496 100644 --- a/man/archive_cases_dv_subset.Rd +++ b/man/archive_cases_dv_subset.Rd @@ -50,18 +50,18 @@ The data in the \code{epi_archive$DT} attribute has columns: } \examples{ - # Since this is a re-exported dataset, it cannot be loaded using - # the `data()` function. `data()` looks for a file of the same name - # in the `data/` directory, which doesn't exist in this package. - # works - epiprocess::archive_cases_dv_subset +# Since this is a re-exported dataset, it cannot be loaded using +# the `data()` function. `data()` looks for a file of the same name +# in the `data/` directory, which doesn't exist in this package. +# works +epiprocess::archive_cases_dv_subset - # works - library(epiprocess) - archive_cases_dv_subset +# works +library(epiprocess) +archive_cases_dv_subset - # fails - data(archive_cases_dv_subset, package = "epiprocess") +# fails +data(archive_cases_dv_subset, package = "epiprocess") } \keyword{datasets} diff --git a/man/cases_deaths_subset.Rd b/man/cases_deaths_subset.Rd index 397ef93c7..fdd38c610 100644 --- a/man/cases_deaths_subset.Rd +++ b/man/cases_deaths_subset.Rd @@ -61,17 +61,17 @@ COVID-19 cases, daily} } \examples{ - # Since this is a re-exported dataset, it cannot be loaded using - # the `data()` function. `data()` looks for a file of the same name - # in the `data/` directory, which doesn't exist in this package. - # works - epiprocess::cases_deaths_subset +# Since this is a re-exported dataset, it cannot be loaded using +# the `data()` function. `data()` looks for a file of the same name +# in the `data/` directory, which doesn't exist in this package. +# works +epiprocess::cases_deaths_subset - # works - library(epiprocess) - cases_deaths_subset +# works +library(epiprocess) +cases_deaths_subset - # fails - data(cases_deaths_subset, package = "epiprocess") +# fails +data(cases_deaths_subset, package = "epiprocess") } \keyword{datasets} diff --git a/man/covid_case_death_rates.Rd b/man/covid_case_death_rates.Rd deleted file mode 100644 index f51cc858e..000000000 --- a/man/covid_case_death_rates.Rd +++ /dev/null @@ -1,71 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/reexports.R -\docType{data} -\name{covid_case_death_rates} -\alias{covid_case_death_rates} -\title{JHU daily COVID-19 cases and deaths rates from all states} -\format{ -An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 37576 rows and 4 columns. -} -\source{ -This object contains a modified part of the -\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} -as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. -This data set is licensed under the terms of the -\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} -by the Johns Hopkins University on behalf of its Center for Systems Science -in Engineering. Copyright Johns Hopkins University 2020. - -Modifications: -\itemize{ -\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: -These signals are taken directly from the JHU CSSE -\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} -without changes. The 7-day average signals are computed by Delphi by -calculating moving averages of the preceding 7 days, so the signal for -June 7 is the average of the underlying data for June 1 through 7, -inclusive. -} -} -\usage{ -covid_case_death_rates -} -\description{ -This data source of confirmed COVID-19 cases and deaths is based on reports -made available by the Center for Systems Science and Engineering at Johns -Hopkins University, as downloaded from the CMU Delphi COVIDcast Epidata -API. This example data is a snapshot as of March 20, 2024, and -ranges from December 31, 2020 to December 31, 2021. It -includes all states. It is used in the {epiprocess} correlation vignette. -} -\section{Data dictionary}{ - - -The data has columns: -\describe{ -\item{geo_value}{the geographic value associated with each row -of measurements.} -\item{time_value}{the time value associated with each row of measurements.} -\item{case_rate}{7-day average signal of number of new -confirmed COVID-19 cases per 100,000 population, daily} -\item{death_rate}{7-day average signal of number of new confirmed -deaths due to COVID-19 per 100,000 population, daily} -} - -} - -\examples{ - # Since this is a re-exported dataset, it cannot be loaded using - # the `data()` function. `data()` looks for a file of the same name - # in the `data/` directory, which doesn't exist in this package. - # works - epiprocess::covid_case_death_rates - - # works - library(epiprocess) - covid_case_death_rates - - # fails - data(covid_case_death_rates, package = "epiprocess") -} -\keyword{datasets} diff --git a/man/covid_incidence_county_subset.Rd b/man/covid_incidence_county_subset.Rd index ba2c9bc48..dbd382b8c 100644 --- a/man/covid_incidence_county_subset.Rd +++ b/man/covid_incidence_county_subset.Rd @@ -57,17 +57,17 @@ The data has columns: } \examples{ - # Since this is a re-exported dataset, it cannot be loaded using - # the `data()` function. `data()` looks for a file of the same name - # in the `data/` directory, which doesn't exist in this package. - # works - epiprocess::covid_incidence_county_subset +# Since this is a re-exported dataset, it cannot be loaded using +# the `data()` function. `data()` looks for a file of the same name +# in the `data/` directory, which doesn't exist in this package. +# works +epiprocess::covid_incidence_county_subset - # works - library(epiprocess) - covid_incidence_county_subset +# works +library(epiprocess) +covid_incidence_county_subset - # fails - data(covid_incidence_county_subset, package = "epiprocess") +# fails +data(covid_incidence_county_subset, package = "epiprocess") } \keyword{datasets} diff --git a/man/covid_incidence_outliers.Rd b/man/covid_incidence_outliers.Rd index 0d2ea889b..191109700 100644 --- a/man/covid_incidence_outliers.Rd +++ b/man/covid_incidence_outliers.Rd @@ -50,17 +50,17 @@ The data has columns: } \examples{ - # Since this is a re-exported dataset, it cannot be loaded using - # the `data()` function. `data()` looks for a file of the same name - # in the `data/` directory, which doesn't exist in this package. - # works - epiprocess::covid_incidence_outliers +# Since this is a re-exported dataset, it cannot be loaded using +# the `data()` function. `data()` looks for a file of the same name +# in the `data/` directory, which doesn't exist in this package. +# works +epiprocess::covid_incidence_outliers - # works - library(epiprocess) - covid_incidence_outliers +# works +library(epiprocess) +covid_incidence_outliers - # fails - data(covid_incidence_outliers, package = "epiprocess") +# fails +data(covid_incidence_outliers, package = "epiprocess") } \keyword{datasets} diff --git a/man/jhu_confirmed_cumulative_num.Rd b/man/jhu_confirmed_cumulative_num.Rd index fad62fa88..b1636115c 100644 --- a/man/jhu_confirmed_cumulative_num.Rd +++ b/man/jhu_confirmed_cumulative_num.Rd @@ -49,17 +49,17 @@ The data has columns: } \examples{ - # Since this is a re-exported dataset, it cannot be loaded using - # the `data()` function. `data()` looks for a file of the same name - # in the `data/` directory, which doesn't exist in this package. - # works - epiprocess::jhu_confirmed_cumulative_num +# Since this is a re-exported dataset, it cannot be loaded using +# the `data()` function. `data()` looks for a file of the same name +# in the `data/` directory, which doesn't exist in this package. +# works +epiprocess::jhu_confirmed_cumulative_num - # works - library(epiprocess) - jhu_confirmed_cumulative_num +# works +library(epiprocess) +jhu_confirmed_cumulative_num - # fails - data(jhu_confirmed_cumulative_num, package = "epiprocess") +# fails +data(jhu_confirmed_cumulative_num, package = "epiprocess") } \keyword{datasets} diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index e24a21934..6556f9d75 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -23,8 +23,8 @@ library(dplyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -x <- covid_case_death_rates %>% - select(geo_value, time_value, case_rate, death_rate) %>% +x <- cases_deaths_subset %>% + select(geo_value, time_value, case_rate = case_rate_7d_av, death_rate = death_rate_7d_av) %>% arrange(geo_value, time_value) ``` From 5518c67914ed755f67958f0a402104ce74cfd985 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 1 Oct 2024 19:21:17 -0400 Subject: [PATCH 20/37] remove epidatr calls in vignettes; dontrun failing example code --- R/reexports.R | 20 +++++++++++++++----- vignettes/aggregation.Rmd | 5 +++-- vignettes/archive.Rmd | 3 ++- vignettes/correlation.Rmd | 3 ++- vignettes/epiprocess.Rmd | 1 - vignettes/growth_rate.Rmd | 4 +++- vignettes/outliers.Rmd | 1 - vignettes/slide.Rmd | 4 +++- 8 files changed, 28 insertions(+), 13 deletions(-) diff --git a/R/reexports.R b/R/reexports.R index a86fdd1da..bb8c519b5 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -93,7 +93,9 @@ ggplot2::autoplot #' cases_deaths_subset #' #' # fails -#' data(cases_deaths_subset, package = "epiprocess") +#' \dontrun{ +#' data(cases_deaths_subset, package = "epiprocess") +#' } #' @export delayedAssign("cases_deaths_subset", epidatasets::cases_deaths_subset) @@ -111,7 +113,9 @@ delayedAssign("cases_deaths_subset", epidatasets::cases_deaths_subset) #' covid_incidence_county_subset #' #' # fails -#' data(covid_incidence_county_subset, package = "epiprocess") +#' \dontrun{ +#' data(covid_incidence_county_subset, package = "epiprocess") +#' } #' @export delayedAssign("covid_incidence_county_subset", epidatasets::covid_incidence_county_subset) @@ -129,7 +133,9 @@ delayedAssign("covid_incidence_county_subset", epidatasets::covid_incidence_coun #' covid_incidence_outliers #' #' # fails -#' data(covid_incidence_outliers, package = "epiprocess") +#' \dontrun{ +#' data(covid_incidence_outliers, package = "epiprocess") +#' } #' @export delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) @@ -147,7 +153,9 @@ delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) #' jhu_confirmed_cumulative_num #' #' # fails -#' data(jhu_confirmed_cumulative_num, package = "epiprocess") +#' \dontrun{ +#' data(jhu_confirmed_cumulative_num, package = "epiprocess") +#' } #' @export delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulative_num) @@ -165,7 +173,9 @@ delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulat #' archive_cases_dv_subset #' #' # fails -#' data(archive_cases_dv_subset, package = "epiprocess") +#' \dontrun{ +#' data(archive_cases_dv_subset, package = "epiprocess") +#' } #' #' @export delayedAssign("archive_cases_dv_subset", epidatasets::archive_cases_dv_subset) diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index f7e0d6707..784d3e599 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -15,8 +15,6 @@ COVID-19 cases in MA and VT. The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r, warning = FALSE, message = FALSE} -library(epidatr) -library(covidcast) library(epiprocess) library(dplyr) @@ -25,6 +23,9 @@ x <- covid_incidence_county_subset The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval = FALSE, warning = FALSE} +library(epidatr) +library(covidcast) + d <- as.Date("2024-03-20") # Use covidcast::county_census to get the county and state names diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index c414095c1..419d1e9ac 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -28,7 +28,6 @@ page](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-v The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r, message = FALSE, warning = FALSE} -library(epidatr) library(epiprocess) library(data.table) library(dplyr) @@ -41,6 +40,8 @@ dv <- archive_cases_dv_subset$DT The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, warning = FALSE, eval = FALSE} +library(epidatr) + dv <- pub_covidcast( source = "doctor-visits", signals = "smoothed_adj_cli", diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index 6556f9d75..931564a68 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -16,7 +16,6 @@ state-level COVID-19 case and death rates, smoothed using 7-day trailing averages. ```{r, message = FALSE, warning = FALSE} -library(epidatr) library(epiprocess) library(dplyr) ``` @@ -30,6 +29,8 @@ x <- cases_deaths_subset %>% The data can also be fetched from the Delphi API with the following query: ```{r, eval = FALSE} +library(epidatr) + d <- as.Date("2024-03-20") x <- pub_covidcast( diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 2978ff0bf..14ed0e553 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -104,7 +104,6 @@ to fetch this data from the [COVIDcast API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast.html). ```{r, message = FALSE} -library(epidatr) library(epiprocess) library(dplyr) library(tidyr) diff --git a/vignettes/growth_rate.Rmd b/vignettes/growth_rate.Rmd index 406ae36fb..214776f1d 100644 --- a/vignettes/growth_rate.Rmd +++ b/vignettes/growth_rate.Rmd @@ -15,7 +15,6 @@ current vignette, applied to state-level daily reported COVID-19 cases from GA and PA, smoothed using a 7-day trailing average. ```{r, message = FALSE, warning = FALSE} -library(epidatr) library(epiprocess) library(dplyr) library(tidyr) @@ -32,7 +31,10 @@ x <- cases_deaths_subset %>% The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval = FALSE} +library(epidatr) + d <- as.Date("2024-03-20") + x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_7dav_incidence_num", diff --git a/vignettes/outliers.Rmd b/vignettes/outliers.Rmd index 72706d50b..6e3b6972a 100644 --- a/vignettes/outliers.Rmd +++ b/vignettes/outliers.Rmd @@ -17,7 +17,6 @@ reported COVID-19 case counts from FL and NJ. The dataset has 730 rows and 3 columns. ```{r, echo=FALSE, warning=FALSE, message=FALSE} -library(epidatr) library(epiprocess) library(dplyr) library(tidyr) diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 1f218adb7..e913120bf 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -29,7 +29,6 @@ FL, NY, and TX (note: here we're using new, not cumulative cases) using the and then convert this to `epi_df` format. ```{r, message = FALSE, warning = FALSE} -library(epidatr) library(epiprocess) library(dplyr) ``` @@ -44,7 +43,10 @@ x <- cases_deaths_subset %>% The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval = FALSE} +library(epidatr) + d <- as.Date("2024-03-20") + x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_incidence_num", From ef8dc27424678ee599b8f64b25ecadd5d604f3d9 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 2 Oct 2024 11:21:36 -0400 Subject: [PATCH 21/37] redocument; attribute jhu and delphi for data --- DESCRIPTION | 5 ++++- man/archive_cases_dv_subset.Rd | 21 +++++++++++++++++++-- man/cases_deaths_subset.Rd | 6 ++++-- man/covid_incidence_county_subset.Rd | 6 ++++-- man/covid_incidence_outliers.Rd | 4 +++- man/epiprocess.Rd | 3 +++ man/jhu_confirmed_cumulative_num.Rd | 12 +++++++++++- 7 files changed, 48 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b52d30a12..706fb2a87 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,7 +17,10 @@ Authors@R: c( person("Ryan", "Tibshirani", role = "aut"), person("Lionel", "Henry", role = "ctb", comment = "Author of included rlang fragments"), person("Hadley", "Wickham", role = "ctb", comment = "Author of included rlang fragments"), - person("Posit", role = "cph", comment = "Copyright holder of included rlang fragments") + person("Posit", role = "cph", comment = "Copyright holder of included rlang fragments"), + person("Johns Hopkins University Center for Systems Science and Engineering", role = "dtc", comment = "Owner of COVID-19 cases and deaths data from the COVID-19 Data Repository"), + person("Johns Hopkins University", role = "cph", comment = "Copyright holder of COVID-19 cases and deaths data from the COVID-19 Data Repository"), + person("Carnegie Mellon University Delphi Group", role = "dtc", comment = "Owner of claims-based CLI data from the Delphi Epidata API") ) Description: This package introduces a common data structure for epidemiological data reported by location and time, provides another data structure to diff --git a/man/archive_cases_dv_subset.Rd b/man/archive_cases_dv_subset.Rd index f07f81496..8a2a3dda9 100644 --- a/man/archive_cases_dv_subset.Rd +++ b/man/archive_cases_dv_subset.Rd @@ -15,11 +15,26 @@ Copyright Johns Hopkins University 2020. Modifications: \itemize{ -\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{From the COVIDcast Doctor Visits API}: The signal \code{percent_cli} is taken directly from the API without changes. \item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: \code{case_rate_7d_av} signal was computed by Delphi from the original JHU-CSSE data by calculating moving averages of the preceding 7 days, so the signal for June 7 is the average of the underlying data for June 1 through 7, inclusive. \item Furthermore, the data has been limited to a very small number of rows, the signal names slightly altered, and formatted into an \code{epi_archive}. } + +This object contains a modified part of the +\href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{Delphi \code{doctor-visits} indicator}. +This data source is computed by the Delphi +Group from information about outpatient visits, provided to Delphi by +health system partners, and published in the COVIDcast Epidata API. This +data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by the Delphi group. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html}{From the COVIDcast Doctor Visits signal}: The signal \code{smoothed_adj_cli} is taken directly from the API without changes. +\item Furthermore, the data has been limited to a very small number of rows, the +signal names slightly altered, and formatted into an \code{epi_archive}. +} } \usage{ archive_cases_dv_subset @@ -61,7 +76,9 @@ library(epiprocess) archive_cases_dv_subset # fails -data(archive_cases_dv_subset, package = "epiprocess") +\dontrun{ + data(archive_cases_dv_subset, package = "epiprocess") +} } \keyword{datasets} diff --git a/man/cases_deaths_subset.Rd b/man/cases_deaths_subset.Rd index fdd38c610..d1e9c3913 100644 --- a/man/cases_deaths_subset.Rd +++ b/man/cases_deaths_subset.Rd @@ -39,7 +39,7 @@ Hopkins University. This example data is a snapshot as of March 20, 2024, and ranges from March 1, 2020 to December 31, 2021. It is limited to California, Florida, Texas, New York, Georgia, and Pennsylvania. -It is used in the {epiprocess} growth rate and \code{epi_slide} vignettes. +It is used in the {epiprocess} growth rate, correlation, \code{epi_slide} vignettes. } \section{Data dictionary}{ @@ -72,6 +72,8 @@ library(epiprocess) cases_deaths_subset # fails -data(cases_deaths_subset, package = "epiprocess") +\dontrun{ + data(cases_deaths_subset, package = "epiprocess") +} } \keyword{datasets} diff --git a/man/covid_incidence_county_subset.Rd b/man/covid_incidence_county_subset.Rd index dbd382b8c..299edd84d 100644 --- a/man/covid_incidence_county_subset.Rd +++ b/man/covid_incidence_county_subset.Rd @@ -38,7 +38,7 @@ is based on reports made available by the Center for Systems Science and Engineering at Johns Hopkins University. This example data is a snapshot as of March 20, 2024, and ranges from March 1, 2020 to December 31, 2021. -It is limited to Massachusetts and Vermont. +It is limited to counties from Massachusetts and Vermont. It is used in the {epiprocess} aggregation vignette. } @@ -68,6 +68,8 @@ library(epiprocess) covid_incidence_county_subset # fails -data(covid_incidence_county_subset, package = "epiprocess") +\dontrun{ + data(covid_incidence_county_subset, package = "epiprocess") +} } \keyword{datasets} diff --git a/man/covid_incidence_outliers.Rd b/man/covid_incidence_outliers.Rd index 191109700..1b3f62ef9 100644 --- a/man/covid_incidence_outliers.Rd +++ b/man/covid_incidence_outliers.Rd @@ -61,6 +61,8 @@ library(epiprocess) covid_incidence_outliers # fails -data(covid_incidence_outliers, package = "epiprocess") +\dontrun{ + data(covid_incidence_outliers, package = "epiprocess") +} } \keyword{datasets} diff --git a/man/epiprocess.Rd b/man/epiprocess.Rd index f6345cbec..bf5f52799 100644 --- a/man/epiprocess.Rd +++ b/man/epiprocess.Rd @@ -40,6 +40,9 @@ Other contributors: \item Lionel Henry (Author of included rlang fragments) [contributor] \item Hadley Wickham (Author of included rlang fragments) [contributor] \item Posit (Copyright holder of included rlang fragments) [copyright holder] + \item Johns Hopkins University Center for Systems Science and Engineering (Owner of COVID-19 cases and deaths data from the COVID-19 Data Repository) [data contributor] + \item Johns Hopkins University (Copyright holder of COVID-19 cases and deaths data from the COVID-19 Data Repository) [copyright holder] + \item Carnegie Mellon University Delphi Group (Owner of claims-based CLI data from the Delphi Epidata API) [data contributor] } } diff --git a/man/jhu_confirmed_cumulative_num.Rd b/man/jhu_confirmed_cumulative_num.Rd index b1636115c..96af926f2 100644 --- a/man/jhu_confirmed_cumulative_num.Rd +++ b/man/jhu_confirmed_cumulative_num.Rd @@ -12,6 +12,14 @@ This object contains a modified part of the \href{https://github.com/CSSEGISandD \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. Copyright Johns Hopkins University 2020. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: +These signals are taken directly from the JHU CSSE \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} without changes. +\item Furthermore, the data has been limited to a very small number of rows, +formatted into an \code{epi_df}, and the signal names slightly altered. +} } \usage{ jhu_confirmed_cumulative_num @@ -60,6 +68,8 @@ library(epiprocess) jhu_confirmed_cumulative_num # fails -data(jhu_confirmed_cumulative_num, package = "epiprocess") +\dontrun{ + data(jhu_confirmed_cumulative_num, package = "epiprocess") +} } \keyword{datasets} From e04f5a76097ab5451538d192bc42804d975dd54e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 2 Oct 2024 11:54:04 -0400 Subject: [PATCH 22/37] load covidcast in aggregation vignette --- vignettes/aggregation.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index 784d3e599..74c336097 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -17,6 +17,7 @@ The data is included in this package (via the [`epidatasets` package](https://cm ```{r, warning = FALSE, message = FALSE} library(epiprocess) library(dplyr) +library(covidcast) x <- covid_incidence_county_subset ``` @@ -24,7 +25,6 @@ x <- covid_incidence_county_subset The data can also be fetched from the Delphi API with the following query: ```{r, message = FALSE, eval = FALSE, warning = FALSE} library(epidatr) -library(covidcast) d <- as.Date("2024-03-20") From 42d8d952ce44546cb69ec81db524b9b7de885890 Mon Sep 17 00:00:00 2001 From: nmdefries Date: Wed, 2 Oct 2024 20:36:19 +0000 Subject: [PATCH 23/37] style: styler (GHA) --- R/reexports.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/R/reexports.R b/R/reexports.R index bb8c519b5..800b5ea3a 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -94,7 +94,7 @@ ggplot2::autoplot #' #' # fails #' \dontrun{ -#' data(cases_deaths_subset, package = "epiprocess") +#' data(cases_deaths_subset, package = "epiprocess") #' } #' @export delayedAssign("cases_deaths_subset", epidatasets::cases_deaths_subset) @@ -114,7 +114,7 @@ delayedAssign("cases_deaths_subset", epidatasets::cases_deaths_subset) #' #' # fails #' \dontrun{ -#' data(covid_incidence_county_subset, package = "epiprocess") +#' data(covid_incidence_county_subset, package = "epiprocess") #' } #' @export delayedAssign("covid_incidence_county_subset", epidatasets::covid_incidence_county_subset) @@ -134,7 +134,7 @@ delayedAssign("covid_incidence_county_subset", epidatasets::covid_incidence_coun #' #' # fails #' \dontrun{ -#' data(covid_incidence_outliers, package = "epiprocess") +#' data(covid_incidence_outliers, package = "epiprocess") #' } #' @export delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) @@ -154,7 +154,7 @@ delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) #' #' # fails #' \dontrun{ -#' data(jhu_confirmed_cumulative_num, package = "epiprocess") +#' data(jhu_confirmed_cumulative_num, package = "epiprocess") #' } #' @export delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulative_num) @@ -174,7 +174,7 @@ delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulat #' #' # fails #' \dontrun{ -#' data(archive_cases_dv_subset, package = "epiprocess") +#' data(archive_cases_dv_subset, package = "epiprocess") #' } #' #' @export From a2c3cf0e22694559979897dde89feb4cd0e8f095 Mon Sep 17 00:00:00 2001 From: nmdefries Date: Wed, 2 Oct 2024 20:36:20 +0000 Subject: [PATCH 24/37] docs: document (GHA) --- man/cases_deaths_subset.Rd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/cases_deaths_subset.Rd b/man/cases_deaths_subset.Rd index d1e9c3913..85ddb81cb 100644 --- a/man/cases_deaths_subset.Rd +++ b/man/cases_deaths_subset.Rd @@ -39,7 +39,7 @@ Hopkins University. This example data is a snapshot as of March 20, 2024, and ranges from March 1, 2020 to December 31, 2021. It is limited to California, Florida, Texas, New York, Georgia, and Pennsylvania. -It is used in the {epiprocess} growth rate, correlation, \code{epi_slide} vignettes. +It is used in the {epiprocess} growth rate and \code{epi_slide} vignettes. } \section{Data dictionary}{ From 0e6798f02d76c8d0614971347f6d826b308c8807 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 2 Oct 2024 16:54:37 -0400 Subject: [PATCH 25/37] import glue --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 8529528be..429775436 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -45,6 +45,7 @@ Imports: epidatasets, genlasso, ggplot2, + glue, lifecycle (>= 1.0.1), lubridate, magrittr, From 47bf883c5c4164971284bf64e98e9a9dd4d0ac30 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:00:36 -0400 Subject: [PATCH 26/37] remove trailing paren --- vignettes/archive.Rmd | 1 - 1 file changed, 1 deletion(-) diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 6b8955d22..a33a1d9f1 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -53,7 +53,6 @@ dv <- pub_covidcast( issues = epirange(20200601, 20211201) ) %>% rename(version = issue, percent_cli = value) -) ``` ## Getting data into `epi_archive` format From 50af59bd1445539f1b1bbe9c13327d5677005511 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:19:49 -0400 Subject: [PATCH 27/37] news and version --- DESCRIPTION | 2 +- NEWS.md | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 429775436..5e7c47a1f 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: epiprocess Title: Tools for basic signal processing in epidemiology -Version: 0.9.0 +Version: 0.9.1 Authors@R: c( person("Jacob", "Bien", role = "ctb"), person("Logan", "Brooks", , "lcbrooks@andrew.cmu.edu", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index ee04b7f39..16a941e0c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,21 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicate PR's. +# epiprocess 0.10 + +## Breaking changes + +- Moved example datasets from being hosted in the package to being reexported + from the `epidatasets` package. The datasets can no longer be loaded with + `data()` but can be accessed with `epiprocess::` or just the name of the + dataset, after loading the package (#520). + +## Improvements + + +## Bug fixes + + # epiprocess 0.9 ## Breaking changes From cbab3526843a7ea5f7a31b8fe56363c64f3de514 Mon Sep 17 00:00:00 2001 From: nmdefries Date: Wed, 2 Oct 2024 21:24:06 +0000 Subject: [PATCH 28/37] docs: document (GHA) --- man/archive_cases_dv_subset.Rd | 2 +- man/cases_deaths_subset.Rd | 2 +- man/covid_incidence_county_subset.Rd | 2 +- man/covid_incidence_outliers.Rd | 2 +- man/jhu_confirmed_cumulative_num.Rd | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/man/archive_cases_dv_subset.Rd b/man/archive_cases_dv_subset.Rd index 8a2a3dda9..207bb025e 100644 --- a/man/archive_cases_dv_subset.Rd +++ b/man/archive_cases_dv_subset.Rd @@ -77,7 +77,7 @@ archive_cases_dv_subset # fails \dontrun{ - data(archive_cases_dv_subset, package = "epiprocess") +data(archive_cases_dv_subset, package = "epiprocess") } } diff --git a/man/cases_deaths_subset.Rd b/man/cases_deaths_subset.Rd index 85ddb81cb..45e8dd4cb 100644 --- a/man/cases_deaths_subset.Rd +++ b/man/cases_deaths_subset.Rd @@ -73,7 +73,7 @@ cases_deaths_subset # fails \dontrun{ - data(cases_deaths_subset, package = "epiprocess") +data(cases_deaths_subset, package = "epiprocess") } } \keyword{datasets} diff --git a/man/covid_incidence_county_subset.Rd b/man/covid_incidence_county_subset.Rd index 299edd84d..edc881d9d 100644 --- a/man/covid_incidence_county_subset.Rd +++ b/man/covid_incidence_county_subset.Rd @@ -69,7 +69,7 @@ covid_incidence_county_subset # fails \dontrun{ - data(covid_incidence_county_subset, package = "epiprocess") +data(covid_incidence_county_subset, package = "epiprocess") } } \keyword{datasets} diff --git a/man/covid_incidence_outliers.Rd b/man/covid_incidence_outliers.Rd index 1b3f62ef9..52b49fd31 100644 --- a/man/covid_incidence_outliers.Rd +++ b/man/covid_incidence_outliers.Rd @@ -62,7 +62,7 @@ covid_incidence_outliers # fails \dontrun{ - data(covid_incidence_outliers, package = "epiprocess") +data(covid_incidence_outliers, package = "epiprocess") } } \keyword{datasets} diff --git a/man/jhu_confirmed_cumulative_num.Rd b/man/jhu_confirmed_cumulative_num.Rd index 96af926f2..b288d974a 100644 --- a/man/jhu_confirmed_cumulative_num.Rd +++ b/man/jhu_confirmed_cumulative_num.Rd @@ -69,7 +69,7 @@ jhu_confirmed_cumulative_num # fails \dontrun{ - data(jhu_confirmed_cumulative_num, package = "epiprocess") +data(jhu_confirmed_cumulative_num, package = "epiprocess") } } \keyword{datasets} From 888bb572b447be3b08fb7f9f4d3576844948d0d3 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 3 Oct 2024 13:38:12 -0700 Subject: [PATCH 29/37] Re-export editing pass + don't re-export cumulative death data Cumulative death data is in tibble format and isn't really the type of data we expect in many functions. Probably not good to make it too accessible. --- NAMESPACE | 1 - R/reexports.R | 20 -------- man/jhu_confirmed_cumulative_num.Rd | 75 ----------------------------- vignettes/aggregation.Rmd | 2 +- vignettes/archive.Rmd | 8 +-- vignettes/correlation.Rmd | 13 ++--- vignettes/epiprocess.Rmd | 9 ++-- vignettes/growth_rate.Rmd | 2 +- vignettes/outliers.Rmd | 2 +- vignettes/slide.Rmd | 2 +- 10 files changed, 20 insertions(+), 114 deletions(-) delete mode 100644 man/jhu_confirmed_cumulative_num.Rd diff --git a/NAMESPACE b/NAMESPACE index 935a1239b..f422b627a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -87,7 +87,6 @@ export(growth_rate) export(guess_period) export(is_epi_df) export(is_grouped_epi_archive) -export(jhu_confirmed_cumulative_num) export(key_colnames) export(max_version_with_row_in) export(mutate) diff --git a/R/reexports.R b/R/reexports.R index 800b5ea3a..7358fcf4d 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -139,26 +139,6 @@ delayedAssign("covid_incidence_county_subset", epidatasets::covid_incidence_coun #' @export delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) -#' @inherit epidatasets::jhu_confirmed_cumulative_num description source references title -#' @inheritSection epidatasets::jhu_confirmed_cumulative_num Data dictionary -#' @examples -#' # Since this is a re-exported dataset, it cannot be loaded using -#' # the `data()` function. `data()` looks for a file of the same name -#' # in the `data/` directory, which doesn't exist in this package. -#' # works -#' epiprocess::jhu_confirmed_cumulative_num -#' -#' # works -#' library(epiprocess) -#' jhu_confirmed_cumulative_num -#' -#' # fails -#' \dontrun{ -#' data(jhu_confirmed_cumulative_num, package = "epiprocess") -#' } -#' @export -delayedAssign("jhu_confirmed_cumulative_num", epidatasets::jhu_confirmed_cumulative_num) - #' @inherit epidatasets::archive_cases_dv_subset description source references title #' @inheritSection epidatasets::archive_cases_dv_subset Data dictionary #' @examples diff --git a/man/jhu_confirmed_cumulative_num.Rd b/man/jhu_confirmed_cumulative_num.Rd deleted file mode 100644 index b288d974a..000000000 --- a/man/jhu_confirmed_cumulative_num.Rd +++ /dev/null @@ -1,75 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/reexports.R -\docType{data} -\name{jhu_confirmed_cumulative_num} -\alias{jhu_confirmed_cumulative_num} -\title{Subset of COVID-19 cumulative case counts from 4 states} -\format{ -An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 2808 rows and 14 columns. -} -\source{ -This object contains a modified part of the \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. This data set is licensed under the terms of the -\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} -by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. -Copyright Johns Hopkins University 2020. - -Modifications: -\itemize{ -\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: -These signals are taken directly from the JHU CSSE \href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} without changes. -\item Furthermore, the data has been limited to a very small number of rows, -formatted into an \code{epi_df}, and the signal names slightly altered. -} -} -\usage{ -jhu_confirmed_cumulative_num -} -\description{ -Data set for 4 states containing COVID-19 Cumulative Cases as reported by -JHU-CSSE and downloaded from the CMU Delphi COVIDcast Epidata API. -This example data is a snapshot as of March 20, 2024, and -ranges from March 1, 2020 to January 31, 2022. It is limited -to California, Florida, New York, and Texas. - -It is used in the {epiprocess} "Getting Started" vignette. -} -\section{Data dictionary}{ - - -The data has columns: -\describe{ -\item{geo_value}{the geographic value associated with each row of measurements.} -\item{signal}{name of metric, derived from upstream data.} -\item{source}{name of upstream data source.} -\item{geo_type}{spatial resolution of the signal.} -\item{time_type}{temporal resolution of the signal.} -\item{time_value}{the time value associated with each row of measurements.} -\item{issue}{time unit (e.g., date) when the signal data were published.} -\item{lag}{time delta (e.g. days) between when the underlying events happened and when the data were published.} -\item{missing_value}{an integer code that is zero when the value field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} -\item{missing_stderr}{an integer code that is zero when the stderr field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} -\item{missing_sample_size}{an integer code that is zero when the sample_size field is present and non-zero when the data is missing (see \href{https://cmu-delphi.github.io/delphi-epidata/api/missing_codes.html}{missing codes}).} -\item{value}{cumulative number of confirmed COVID-19 cases, derived from the underlying data source.} -\item{stderr}{approximate standard error of the statistic with respect to its sampling distribution, NA when not applicable.} -\item{sample_size}{number of “data points” used in computing the statistic, NA when not applicable.} -} - -} - -\examples{ -# Since this is a re-exported dataset, it cannot be loaded using -# the `data()` function. `data()` looks for a file of the same name -# in the `data/` directory, which doesn't exist in this package. -# works -epiprocess::jhu_confirmed_cumulative_num - -# works -library(epiprocess) -jhu_confirmed_cumulative_num - -# fails -\dontrun{ -data(jhu_confirmed_cumulative_num, package = "epiprocess") -} -} -\keyword{datasets} diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index fbe339200..3b36cc960 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -22,7 +22,7 @@ library(covidcast) x <- covid_incidence_county_subset ``` -The data can also be fetched from the Delphi API with the following query: +The data can also be fetched from the Delphi Epidata API with the following query: ```{r, message = FALSE, eval = FALSE, warning = FALSE} library(epidatr) diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index a33a1d9f1..86fc2c2b1 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -36,10 +36,10 @@ library(ggplot2) # This fetches the raw data backing the archive_cases_dv_subset object. dv <- archive_cases_dv_subset$DT %>% - tibble() + as_tibble() ``` -The data can also be fetched from the Delphi API with the following query: +The data can also be fetched from the Delphi Epidata API with the following query: ```{r, message = FALSE, warning = FALSE, eval = FALSE} library(epidatr) @@ -84,8 +84,8 @@ print(x) ``` An `epi_archive` is consists of a primary field `DT`, which is a data table -(from the `data.table` package) that has the columns `geo_value`, `time_value`, -`version` (and possibly additional ones), and other metadata fields, such as +(from the `data.table` package) that has at least the required columns +`geo_value`, `time_value`, and `version`; and other metadata fields, such as `geo_type`. The variables `geo_value`, `time_value`, `version` serve as **key variables** diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index 931564a68..adb5fe867 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -23,11 +23,12 @@ library(dplyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} x <- cases_deaths_subset %>% - select(geo_value, time_value, case_rate = case_rate_7d_av, death_rate = death_rate_7d_av) %>% + select(geo_value, time_value, + case_rate = case_rate_7d_av, death_rate = death_rate_7d_av) %>% arrange(geo_value, time_value) ``` -The data can also be fetched from the Delphi API with the following query: +The data can also be fetched from the Delphi Epidata API with the following query: ```{r, eval = FALSE} library(epidatr) @@ -36,10 +37,10 @@ d <- as.Date("2024-03-20") x <- pub_covidcast( source = "jhu-csse", signals = "confirmed_7dav_incidence_prop", - time_type = "day", geo_type = "state", - time_values = epirange(20200301, 20211231), + time_type = "day", geo_values = "*", + time_values = epirange(20200301, 20211231), as_of = d ) %>% select(geo_value, time_value, case_rate = value) @@ -47,10 +48,10 @@ x <- pub_covidcast( y <- pub_covidcast( source = "jhu-csse", signals = "deaths_7dav_incidence_prop", - time_type = "day", geo_type = "state", - time_values = epirange(20200301, 20211231), + time_type = "day", geo_values = "*", + time_values = epirange(20200301, 20211231), as_of = d ) %>% select(geo_value, time_value, death_rate = value) diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 8572c808f..96ed725fe 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -98,12 +98,12 @@ which we also broadly refer to as signal variables. The documentation for A data frame or tibble that has `geo_value` and `time_value` columns can be converted into an `epi_df` object, using the function `as_epi_df()`. As an example, we'll work with daily cumulative COVID-19 cases from four U.S. states: -CA, FL, NY, and TX, over time span from mid 2020 to early 2022, and we'll use -the [`epidatr`](https://github.com/cmu-delphi/epidatr) package -to fetch this data from the [COVIDcast -API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast.html). +CA, FL, NY, and TX, over time span from mid 2020 to early 2022. We have included +this example data in the `epidatasets::jhu_confirmed_cumulative_num` object, +which we prepared by downloading the data using `epidatr::pub_covidcast()`. ```{r, message = FALSE} +library(epidatasets) library(epiprocess) library(dplyr) library(tidyr) @@ -111,6 +111,7 @@ library(withr) cases <- jhu_confirmed_cumulative_num +class(cases) colnames(cases) ``` diff --git a/vignettes/growth_rate.Rmd b/vignettes/growth_rate.Rmd index 214776f1d..326a07c4d 100644 --- a/vignettes/growth_rate.Rmd +++ b/vignettes/growth_rate.Rmd @@ -29,7 +29,7 @@ x <- cases_deaths_subset %>% arrange(geo_value, time_value) ``` -The data can also be fetched from the Delphi API with the following query: +The data can also be fetched from the Delphi Epidata API with the following query: ```{r, message = FALSE, eval = FALSE} library(epidatr) diff --git a/vignettes/outliers.Rmd b/vignettes/outliers.Rmd index 48da8f809..1c00ff6e3 100644 --- a/vignettes/outliers.Rmd +++ b/vignettes/outliers.Rmd @@ -16,7 +16,7 @@ reported COVID-19 case counts from FL and NJ. The dataset has 730 rows and 3 columns. -```{r, echo=FALSE, warning=FALSE, message=FALSE} +```{r, echo=TRUE, warning=FALSE, message=FALSE} library(epiprocess) library(dplyr) library(tidyr) diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 935daac65..0257b3eee 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -38,7 +38,7 @@ edf <- cases_deaths_subset %>% arrange(geo_value, time_value) ``` -The data can also be fetched from the Delphi API with the following query: +The data can also be fetched from the Delphi Epidata API with the following query: ```{r, message = FALSE, eval = FALSE} library(epidatr) From dfbed13867b75cd8b1ccdd2d862dd82ead2073e4 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Thu, 3 Oct 2024 20:41:44 +0000 Subject: [PATCH 30/37] style: styler (GHA) --- vignettes/correlation.Rmd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index adb5fe867..5f363c8f9 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -24,7 +24,8 @@ The data is included in this package (via the [`epidatasets` package](https://cm ```{r} x <- cases_deaths_subset %>% select(geo_value, time_value, - case_rate = case_rate_7d_av, death_rate = death_rate_7d_av) %>% + case_rate = case_rate_7d_av, death_rate = death_rate_7d_av + ) %>% arrange(geo_value, time_value) ``` From e0cfdb0681b0308e61e33113ebe7c7533e436599 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 3 Oct 2024 14:26:24 -0700 Subject: [PATCH 31/37] Fix _pkgdown.yml --- _pkgdown.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/_pkgdown.yml b/_pkgdown.yml index 7e0582b97..c3af76d00 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -94,7 +94,6 @@ reference: - archive_cases_dv_subset - covid_incidence_county_subset - covid_incidence_outliers - - jhu_confirmed_cumulative_num - title: Basic automatic plotting - contents: - autoplot.epi_df From a7a34e6363bf6f236889830420fc24bd2d02dd23 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 4 Oct 2024 10:43:02 -0400 Subject: [PATCH 32/37] switch correlation vignette data to one with all states --- NAMESPACE | 1 + R/reexports.R | 21 ++++++++ man/covid_case_death_rates_extended.Rd | 74 ++++++++++++++++++++++++++ vignettes/correlation.Rmd | 5 +- vignettes/epiprocess.Rmd | 4 +- 5 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 man/covid_case_death_rates_extended.Rd diff --git a/NAMESPACE b/NAMESPACE index f422b627a..aa136af5e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -62,6 +62,7 @@ export(autoplot) export(cases_deaths_subset) export(clone) export(complete) +export(covid_case_death_rates_extended) export(covid_incidence_county_subset) export(covid_incidence_outliers) export(detect_outlr) diff --git a/R/reexports.R b/R/reexports.R index 7358fcf4d..e091ce120 100644 --- a/R/reexports.R +++ b/R/reexports.R @@ -159,3 +159,24 @@ delayedAssign("covid_incidence_outliers", epidatasets::covid_incidence_outliers) #' #' @export delayedAssign("archive_cases_dv_subset", epidatasets::archive_cases_dv_subset) + +#' @inherit epidatasets::covid_case_death_rates_extended description source references title +#' @inheritSection epidatasets::covid_case_death_rates_extended Data dictionary +#' @examples +#' # Since this is a re-exported dataset, it cannot be loaded using +#' # the `data()` function. `data()` looks for a file of the same name +#' # in the `data/` directory, which doesn't exist in this package. +#' # works +#' epiprocess::covid_case_death_rates_extended +#' +#' # works +#' library(epiprocess) +#' covid_case_death_rates_extended +#' +#' # fails +#' \dontrun{ +#' data(covid_case_death_rates_extended, package = "epiprocess") +#' } +#' +#' @export +delayedAssign("covid_case_death_rates_extended", epidatasets::covid_case_death_rates_extended) diff --git a/man/covid_case_death_rates_extended.Rd b/man/covid_case_death_rates_extended.Rd new file mode 100644 index 000000000..72482edde --- /dev/null +++ b/man/covid_case_death_rates_extended.Rd @@ -0,0 +1,74 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reexports.R +\docType{data} +\name{covid_case_death_rates_extended} +\alias{covid_case_death_rates_extended} +\title{JHU daily COVID-19 cases and deaths rates from all states} +\format{ +An object of class \code{epi_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 37576 rows and 4 columns. +} +\source{ +This object contains a modified part of the +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University} +as \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{republished in the COVIDcast Epidata API}. +This data set is licensed under the terms of the +\href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International license} +by the Johns Hopkins University on behalf of its Center for Systems Science +in Engineering. Copyright Johns Hopkins University 2020. + +Modifications: +\itemize{ +\item \href{https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html}{From the COVIDcast Epidata API}: +These signals are taken directly from the JHU CSSE +\href{https://github.com/CSSEGISandData/COVID-19}{COVID-19 GitHub repository} +without changes. The 7-day average signals are computed by Delphi by +calculating moving averages of the preceding 7 days, so the signal for +June 7 is the average of the underlying data for June 1 through 7, +inclusive. +} +} +\usage{ +covid_case_death_rates_extended +} +\description{ +This data source of confirmed COVID-19 cases and deaths is based on reports +made available by the Center for Systems Science and Engineering at Johns +Hopkins University, as downloaded from the CMU Delphi COVIDcast Epidata +API. This example data is a snapshot as of May 31, 2022, and +ranges from March 1, 2020 to December 31, 2021. It +includes all states. +} +\section{Data dictionary}{ + + +The data has columns: +\describe{ +\item{geo_value}{the geographic value associated with each row +of measurements.} +\item{time_value}{the time value associated with each row of measurements.} +\item{case_rate}{7-day average signal of number of new +confirmed COVID-19 cases per 100,000 population, daily} +\item{death_rate}{7-day average signal of number of new confirmed +deaths due to COVID-19 per 100,000 population, daily} +} + +} + +\examples{ +# Since this is a re-exported dataset, it cannot be loaded using +# the `data()` function. `data()` looks for a file of the same name +# in the `data/` directory, which doesn't exist in this package. +# works +epiprocess::covid_case_death_rates_extended + +# works +library(epiprocess) +covid_case_death_rates_extended + +# fails +\dontrun{ +data(covid_case_death_rates_extended, package = "epiprocess") +} + +} +\keyword{datasets} diff --git a/vignettes/correlation.Rmd b/vignettes/correlation.Rmd index 5f363c8f9..073812b3c 100644 --- a/vignettes/correlation.Rmd +++ b/vignettes/correlation.Rmd @@ -22,10 +22,7 @@ library(dplyr) The data is included in this package (via the [`epidatasets` package](https://cmu-delphi.github.io/epidatasets/)) and can be loaded with: ```{r} -x <- cases_deaths_subset %>% - select(geo_value, time_value, - case_rate = case_rate_7d_av, death_rate = death_rate_7d_av - ) %>% +x <- covid_case_death_rates_extended %>% arrange(geo_value, time_value) ``` diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 96ed725fe..66c098ae3 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -99,7 +99,7 @@ A data frame or tibble that has `geo_value` and `time_value` columns can be converted into an `epi_df` object, using the function `as_epi_df()`. As an example, we'll work with daily cumulative COVID-19 cases from four U.S. states: CA, FL, NY, and TX, over time span from mid 2020 to early 2022. We have included -this example data in the `epidatasets::jhu_confirmed_cumulative_num` object, +this example data in the `epidatasets::covid_confirmed_cumulative_num` object, which we prepared by downloading the data using `epidatr::pub_covidcast()`. ```{r, message = FALSE} @@ -109,7 +109,7 @@ library(dplyr) library(tidyr) library(withr) -cases <- jhu_confirmed_cumulative_num +cases <- covid_confirmed_cumulative_num class(cases) colnames(cases) From 9b33b0931df4cd903aedec0b2c30c1ee8787153e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:09:42 -0400 Subject: [PATCH 33/37] import readr in aggregation vignette --- vignettes/aggregation.Rmd | 1 + 1 file changed, 1 insertion(+) diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index faac00cd3..a5d8c1b45 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -18,6 +18,7 @@ The data is included in this package (via the [`epidatasets` package](https://cm library(epiprocess) library(dplyr) library(covidcast) +library(readr) x <- covid_incidence_county_subset ``` From fc3650db49c5fe5bd83439e975c0df430877d79f Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 14 Oct 2024 14:21:33 -0700 Subject: [PATCH 34/37] Note some other breaking changes in epidatasets migration --- NEWS.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 2c6332346..100c3cdde 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,8 +8,12 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat - Moved example datasets from being hosted in the package to being reexported from the `epidatasets` package. The datasets can no longer be loaded with - `data()` but can be accessed with `epiprocess::` or, after loading the package, - just the name of the dataset (#520). + `data()` but can be accessed with `epiprocess::` or, after loading the + package, just the name of the dataset (#520). Those with names starting with + `jhu` have been renamed to a more uniform scheme and now have names starting + with `covid`. The data set previously named `jhu_confirmed_cumulative_num` has + been removed from the package, but a renamed version is has been removed from + the package, but a renamed version is still available in `epidatasets`. ## Bug fixes From a32166b69be326b63a04e1f12269d5efafdb2016 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 14 Oct 2024 14:51:39 -0700 Subject: [PATCH 35/37] Address some no-visible-binding CHECKS --- R/epiprocess.R | 4 +++- R/grouped_epi_archive.R | 4 ++-- R/slide.R | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/R/epiprocess.R b/R/epiprocess.R index 283c4a469..147d4ef92 100644 --- a/R/epiprocess.R +++ b/R/epiprocess.R @@ -18,5 +18,7 @@ utils::globalVariables(c( ".x", ".group_key", ".ref_time_value", "resid", "fitted", ".response", "geo_value", "time_value", - "value", ".real" + "value", ".real", "lag", "max_value", "min_value", + "median_value", "spread", "rel_spread", "time_to", + "time_near_latest", "n_revisions" )) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index bec8c9c2b..08eb2d250 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -398,8 +398,8 @@ epix_slide.grouped_epi_archive <- function( )), capture.output(print(waldo::compare( res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], - x_arg = rlang::expr_deparse(dplyr::expr(`$`(label, !!sym(comp_nms[[comp_i]])))), # nolint: object_usage_linter - y_arg = rlang::expr_deparse(dplyr::expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) + x_arg = rlang::expr_deparse(rlang::expr(`$`(!!"label", !!sym(comp_nms[[comp_i]])))), + y_arg = rlang::expr_deparse(rlang::expr(`$`(!!"comp_value", !!sym(comp_nms[[comp_i]])))) ))), cli::format_message(c( "You likely want to rename or remove this column in your output, or debug why it has a different value." diff --git a/R/slide.R b/R/slide.R index 959c4168e..c792187ea 100644 --- a/R/slide.R +++ b/R/slide.R @@ -424,8 +424,8 @@ epi_slide_one_group <- function( )), capture.output(print(waldo::compare( res[[comp_nms[[comp_i]]]], slide_values[[comp_i]], - x_arg = rlang::expr_deparse(dplyr::expr(`$`(existing, !!sym(comp_nms[[comp_i]])))), # nolint: object_usage_linter - y_arg = rlang::expr_deparse(dplyr::expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) # nolint: object_usage_linter + x_arg = rlang::expr_deparse(dplyr::expr(`$`(!!"existing", !!sym(comp_nms[[comp_i]])))), # nolint: object_usage_linter + y_arg = rlang::expr_deparse(dplyr::expr(`$`(!!"comp_value", !!sym(comp_nms[[comp_i]])))) # nolint: object_usage_linter ))), cli::format_message(c( ">" = "You likely want to rename or remove this column from your slide From 7df79baa6507b5215c2efc12d18049850b060e59 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 14 Oct 2024 14:53:27 -0700 Subject: [PATCH 36/37] Remove now-unnecessary `library(covidcast)` --- vignettes/aggregation.Rmd | 1 - 1 file changed, 1 deletion(-) diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index a5d8c1b45..0b65c71ff 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -17,7 +17,6 @@ The data is included in this package (via the [`epidatasets` package](https://cm ```{r, warning = FALSE, message = FALSE} library(epiprocess) library(dplyr) -library(covidcast) library(readr) x <- covid_incidence_county_subset From c9d187766fe21eb52b343d892ec710a314cb1a2a Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Tue, 15 Oct 2024 04:16:10 -0700 Subject: [PATCH 37/37] Add missing topic to _pkgdown.yml --- _pkgdown.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/_pkgdown.yml b/_pkgdown.yml index c3af76d00..e8c05a656 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -94,6 +94,7 @@ reference: - archive_cases_dv_subset - covid_incidence_county_subset - covid_incidence_outliers + - covid_case_death_rates_extended - title: Basic automatic plotting - contents: - autoplot.epi_df