The goal of {epidict} is to provide standardized data dictionaries for use in epidemiological data analysis templates. Currently it supports standardised dictionaries from MSF OCA. This is a product of the R4EPIs project; learn more at https://r4epis.netlify.com
Installation
You can install {epidict} from CRAN:
install.packages("epidict")
Click here for alternative installation options
If there is a bugfix or feature that is not yet on CRAN, you can install it via the {drat} package:
You can also install the in-development version from GitHub using the {remotes} package (but there’s no guarantee that it will be stable):
# install.packages("remotes")
remotes::install_github("R4EPI/epidict")
Accessing dictionaries
There are four MSF outbreak dictionaries available in {epidict} based on DHIS2 exports:
- Acute Jaundice Syndrome (often suspected to be Hepatitis E) (“AJS”)
- Cholera/Acute watery diarrhea (“Cholera”)
- Measles/Rubella (“Measles”)
- Meningitis (“Meningitis”)
You can read more about the outbreak dictionaries at https://r4epis.netlify.com/outbreaks
The dictionary can be obtained via the msf_dict()
function, which specifies a dictionary that describes recorded variables
(data_element_shortname
) in rows and their possible options
(if categorical):
Click here for code examples
library("epidict")
msf_dict("AJS")
#> # A tibble: 68 × 8
#> data_element_uid data_element_name data_element_shortname
#> <lgl> <chr> <chr>
#> 1 NA egen_044_event_file_type event_file_type
#> 2 NA egen_001_patient_case_number case_number
#> 3 NA egen_004_date_of_consultation_admiss… date_of_consultation_…
#> 4 NA egen_022_detected_by detected_by
#> 5 NA egen_005_patient_facility_type patient_facility_type
#> 6 NA egen_029_msf_involvement msf_involvement
#> 7 NA egen_008_age_years age_years
#> 8 NA egen_009_age_months age_months
#> 9 NA egen_010_age_days age_days
#> 10 NA egen_011_sex sex
#> # ℹ 58 more rows
#> # ℹ 5 more variables: data_element_description <chr>,
#> # data_element_valuetype <chr>, data_element_formname <chr>,
#> # used_optionset_uid <chr>, options <list>
msf_dict("Cholera")
#> # A tibble: 45 × 8
#> data_element_uid data_element_name data_element_shortname
#> <chr> <chr> <chr>
#> 1 AafTlSwliVQ egen_001_patient_case_number case_number
#> 2 OTGOtWBz39J egen_004_date_of_consultation_admiss… date_of_consultation_…
#> 3 wnmMr2V3T3u egen_006_patient_origin patient_origin
#> 4 sbgqjeVwtb8 egen_008_age_years age_years
#> 5 eXYhovYyl61 egen_009_age_months age_months
#> 6 UrYJSk2Wp46 egen_010_age_days age_days
#> 7 D1Ky5K7pFN6 egen_011_sex sex
#> 8 dTm5R53YYXC egen_012_pregnancy_status pregnant
#> 9 FF7d81Zy0yQ egen_013_pregnancy_trimester trimester
#> 10 vLAmA6Pmjip egen_014_pregnant_foetus_alive_at_ad… foetus_alive_at_admis…
#> # ℹ 35 more rows
#> # ℹ 5 more variables: data_element_description <chr>,
#> # data_element_valuetype <chr>, data_element_formname <chr>,
#> # used_optionset_uid <chr>, options <list>
msf_dict("Measles")
#> # A tibble: 52 × 8
#> data_element_uid data_element_name data_element_shortname
#> <chr> <chr> <chr>
#> 1 DE_EGEN_001 egen_001_patient_case_number case_number
#> 2 DE_EGEN_004 egen_004_date_of_consultation_admiss… date_of_consultation_…
#> 3 DE_EGEN_005 egen_005_patient_facility_type patient_facility_type
#> 4 DE_EGEN_006 egen_006_patient_origin patient_origin
#> 5 DE_EGEN_008 egen_008_age_years age_years
#> 6 DE_EGEN_009 egen_009_age_months age_months
#> 7 DE_EGEN_010 egen_010_age_days age_days
#> 8 DE_EGEN_011 egen_011_sex sex
#> 9 DE_EGEN_012 egen_012_pregnancy_status pregnant
#> 10 DE_EGEN_013 egen_013_pregnancy_trimester trimester
#> # ℹ 42 more rows
#> # ℹ 5 more variables: data_element_description <chr>,
#> # data_element_valuetype <chr>, data_element_formname <chr>,
#> # used_optionset_uid <chr>, options <list>
msf_dict("Meningitis")
#> # A tibble: 53 × 8
#> data_element_uid data_element_name data_element_shortname
#> <chr> <chr> <chr>
#> 1 AafTlSwliVQ egen_001_patient_case_number case_number
#> 2 OTGOtWBz39J egen_004_date_of_consultation_admiss… date_of_consultation_…
#> 3 udXAcFEE1dl egen_005_patient_facility_type patient_facility_type
#> 4 wnmMr2V3T3u egen_006_patient_origin patient_origin
#> 5 sbgqjeVwtb8 egen_008_age_years age_years
#> 6 eXYhovYyl61 egen_009_age_months age_months
#> 7 UrYJSk2Wp46 egen_010_age_days age_days
#> 8 D1Ky5K7pFN6 egen_011_sex sex
#> 9 ADfNqpCL5kf egen_015_exit_status exit_status
#> 10 JZ8yqTow79G egen_016_date_of_exit date_of_exit
#> # ℹ 43 more rows
#> # ℹ 5 more variables: data_element_description <chr>,
#> # data_element_valuetype <chr>, data_element_formname <chr>,
#> # used_optionset_uid <chr>, options <list>
In addition, there are four MSF survey dictionaries available:
- Retrospective mortality and access to care (“Mortality”)
- Malnutrition (“Nutrition”)
- Vaccination coverage long form (“vaccination_long”)
- Vaccination coverage short form (“vaccination_short”)
You can read more about the survey dictionaries at https://r4epis.netlify.com/surveys
These are accessible via msf_dict_survey()
where the
variables are in name
. You can also read in your own Kobo
(ODK) dictionaries by specifying tempalte = FALSE
and then
setting name = <path to your .xlsx>
.
Click here for code examples
msf_dict_survey("Mortality")
#> # A tibble: 174 × 14
#> type name label_english label_french hint_english hint_french default
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 start start Start Time NA NA NA NA
#> 2 end end End Time NA NA NA NA
#> 3 today today Date of Surv… NA NA NA NA
#> 4 deviceid deviceid Phone Serial… NA NA NA NA
#> 5 date date Date Date NA NA today()
#> 6 integer team_nu… Team number Numéro d'éq… NA NA NA
#> 7 village village… Village name Nom du vill… NA NA NA
#> 8 text village… Specify other Autre, spéc… NA NA NA
#> 9 integer cluster… Cluster numb… Numéro de l… NA NA NA
#> 10 integer househo… Household nu… Numéro du m… NA NA NA
#> # ℹ 164 more rows
#> # ℹ 7 more variables: relevant <chr>, appearance <chr>, constraint <chr>,
#> # repeat_count <chr>, calculation <chr>, value_type <chr>, options <list>
msf_dict_survey("Nutrition")
#> # A tibble: 27 × 14
#> type name label_english label_french hint_english hint_french repeat_count
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 start start Start Time NA NA NA NA
#> 2 end end End Time NA NA NA NA
#> 3 today today Date of Surv… NA NA NA NA
#> 4 devic… devi… Phone Serial… NA NA NA NA
#> 5 date date Date NA NA NA NA
#> 6 integ… team… Team number NA NA NA NA
#> 7 villa… vill… Village name Nom du vill… NA NA NA
#> 8 text vill… Specify other Précisez au… NA NA NA
#> 9 geopo… vill… Village loca… Localisatio… NA NA NA
#> 10 integ… clus… Cluster numb… Numéro de g… NA NA NA
#> # ℹ 17 more rows
#> # ℹ 7 more variables: relevant <chr>, calculation <lgl>, constraint <chr>,
#> # appearance <chr>, default <chr>, value_type <chr>, options <list>
msf_dict_survey("Vaccination_long")
#> # A tibble: 106 × 14
#> type name label_english label_french hint_english hint_french default
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 start start Start Time Start Time NA NA NA
#> 2 end end End Time End Time NA NA NA
#> 3 today today Date of Surv… Date of Sur… NA NA NA
#> 4 deviceid deviceid Phone Serial… Phone Seria… NA NA NA
#> 5 date date Date Date NA NA today()
#> 6 integer team_nu… Team number Numéro de l… NA NA NA
#> 7 village village… Village name Nom du vill… NA NA NA
#> 8 text village… Specify other Veuillez sp… NA NA NA
#> 9 integer cluster… Cluster numb… Numéro de l… NA NA NA
#> 10 integer househo… Household nu… Numéro du m… NA NA NA
#> # ℹ 96 more rows
#> # ℹ 7 more variables: relevant <chr>, appearance <chr>, repeat_count <chr>,
#> # constraint <chr>, calculation <chr>, value_type <chr>, options <list>
msf_dict_survey("Vaccination_short")
#> # A tibble: 38 × 15
#> type name label_english label_french hint_english hint_french default
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 start start Start Time Start Time NA NA NA
#> 2 end end End Time End Time NA NA NA
#> 3 today today Date of Surv… Date of Sur… NA NA NA
#> 4 deviceid deviceid Phone Serial… Phone Seria… NA NA NA
#> 5 date date Date Date NA NA .today…
#> 6 integer team_nu… Team number Numéro de l… NA NA NA
#> 7 village village… Village name Nom du vill… NA NA NA
#> 8 text village… Specify other Veuillez sp… NA NA NA
#> 9 integer cluster… Cluster numb… Numéro de l… NA NA NA
#> 10 integer househo… Household nu… Numéro du m… NA NA NA
#> # ℹ 28 more rows
#> # ℹ 8 more variables: relevant <chr>, appearance <chr>, repeat_count <chr>,
#> # constraint <chr>, calculation <chr>, hxl <chr>, value_type <chr>,
#> # options <list>
Generating data
The {epidict} package has a function for generating data that’s
called gen_data()
, which takes three arguments: The
dictionary, which column describes the variable names, and how many rows
are needed in the output.
Click here for code examples
gen_data("Measles", varnames = "data_element_shortname", numcases = 100, org = "MSF")
#> # A tibble: 100 × 52
#> case_number date_of_consultation_admis…¹ patient_facility_type patient_origin
#> <chr> <date> <fct> <chr>
#> 1 A1 2018-03-05 OP Village A
#> 2 A2 2018-03-18 OP Village B
#> 3 A3 2018-02-09 IP Village A
#> 4 A4 2018-01-17 OP Village D
#> 5 A5 2018-03-01 OP Village B
#> 6 A6 2018-04-23 IP Village D
#> 7 A7 2018-04-15 OP Village B
#> 8 A8 2018-03-18 OP Village B
#> 9 A9 2018-01-08 OP Village C
#> 10 A10 2018-01-06 IP Village B
#> # ℹ 90 more rows
#> # ℹ abbreviated name: ¹date_of_consultation_admission
#> # ℹ 48 more variables: age_years <int>, age_months <int>, age_days <int>,
#> # sex <fct>, pregnant <fct>, trimester <fct>,
#> # foetus_alive_at_admission <fct>, exit_status <fct>, date_of_exit <date>,
#> # time_to_death <fct>, pregnancy_outcome_at_exit <fct>,
#> # baby_born_with_complications <fct>, previously_vaccinated <fct>, …
gen_data("Vaccination_long", varnames = "name", numcases = 100, org = "MSF")
#> # A tibble: 100 × 120
#> start end today deviceid date team_number village_name village_other
#> <lgl> <lgl> <lgl> <lgl> <date> <lgl> <fct> <lgl>
#> 1 NA NA NA NA 2018-04-30 NA village_2 NA
#> 2 NA NA NA NA 2018-03-16 NA village_4 NA
#> 3 NA NA NA NA 2018-03-10 NA village_5 NA
#> 4 NA NA NA NA 2018-03-23 NA village_2 NA
#> 5 NA NA NA NA 2018-03-03 NA village_1 NA
#> 6 NA NA NA NA 2018-02-25 NA village_2 NA
#> 7 NA NA NA NA 2018-03-02 NA village_7 NA
#> 8 NA NA NA NA 2018-03-20 NA village_8 NA
#> 9 NA NA NA NA 2018-01-11 NA village_10 NA
#> 10 NA NA NA NA 2018-04-07 NA village_9 NA
#> # ℹ 90 more rows
#> # ℹ 112 more variables: cluster_number <dbl>, household_number <int>,
#> # households_building <int>, random_hh <int>, consent <chr>,
#> # no_consent_reason <fct>, no_consent_other <lgl>, caretaker_relation <fct>,
#> # caretaker_other <lgl>, number_children <dbl>, child_number <chr>,
#> # sex <fct>, date_birth <date>, age_years <int>, age_months <int>,
#> # any_vaccine <fct>, vaccine_card <fct>, hf_records <fct>, …
Cleaning data with the dictionaries
You can use the dictionaries to clean the data via the {matchmaker} package:
Click here for code examples
library("matchmaker")
library("dplyr")
dat <- gen_data(dictionary = "Cholera",
varnames = "data_element_shortname",
numcases = 20,
org = "MSF"
)
print(dat)
#> # A tibble: 20 × 45
#> case_number date_of_consultation_admiss…¹ patient_origin age_years age_months
#> <chr> <date> <chr> <int> <int>
#> 1 A1 2018-02-28 Village A 23 NA
#> 2 A2 2018-02-08 Village A 62 NA
#> 3 A3 2018-01-30 Village D 23 NA
#> 4 A4 2018-01-12 Village C 69 NA
#> 5 A5 2018-04-12 Village A 55 NA
#> 6 A6 2018-04-22 Village C 7 NA
#> 7 A7 2018-02-07 Village B 38 NA
#> 8 A8 2018-03-09 Village D 66 NA
#> 9 A9 2018-04-26 Village A 4 NA
#> 10 A10 2018-04-08 Village C 55 NA
#> 11 A11 2018-03-26 Village D 41 NA
#> 12 A12 2018-01-13 Village D 17 NA
#> 13 A13 2018-04-15 Village B 75 NA
#> 14 A14 2018-04-28 Village C 15 NA
#> 15 A15 2018-03-01 Village A 47 NA
#> 16 A16 2018-01-14 Village A 41 NA
#> 17 A17 2018-01-22 Village D NA 15
#> 18 A18 2018-04-11 Village D 44 NA
#> 19 A19 2018-02-03 Village A 48 NA
#> 20 A20 2018-01-07 Village C 18 NA
#> # ℹ abbreviated name: ¹date_of_consultation_admission
#> # ℹ 40 more variables: age_days <int>, sex <fct>, pregnant <fct>,
#> # trimester <fct>, foetus_alive_at_admission <fct>, exit_status <fct>,
#> # date_of_exit <date>, time_to_death <fct>, pregnancy_outcome_at_exit <fct>,
#> # previously_vaccinated <fct>, previous_vaccine_doses_received <fct>,
#> # readmission <fct>, msf_involvement <fct>,
#> # cholera_treatment_facility_type <fct>, residential_status_brief <fct>, …
# We want the expanded dictionary, so we will select `compact = FALSE`
dict <- msf_dict(disease = "Cholera",
long = TRUE,
compact = FALSE,
tibble = TRUE
)
print(dict)
#> # A tibble: 182 × 11
#> data_element_uid data_element_name data_element_shortname
#> <chr> <chr> <chr>
#> 1 AafTlSwliVQ egen_001_patient_case_number case_number
#> 2 OTGOtWBz39J egen_004_date_of_consultation_admiss… date_of_consultation_…
#> 3 wnmMr2V3T3u egen_006_patient_origin patient_origin
#> 4 sbgqjeVwtb8 egen_008_age_years age_years
#> 5 eXYhovYyl61 egen_009_age_months age_months
#> 6 UrYJSk2Wp46 egen_010_age_days age_days
#> 7 D1Ky5K7pFN6 egen_011_sex sex
#> 8 D1Ky5K7pFN6 egen_011_sex sex
#> 9 D1Ky5K7pFN6 egen_011_sex sex
#> 10 dTm5R53YYXC egen_012_pregnancy_status pregnant
#> # ℹ 172 more rows
#> # ℹ 8 more variables: data_element_description <chr>,
#> # data_element_valuetype <chr>, data_element_formname <chr>,
#> # used_optionset_uid <chr>, option_code <chr>, option_name <chr>,
#> # option_uid <chr>, option_order_in_set <dbl>
# Now we can use matchmaker to filter the data
dat_clean <- matchmaker::match_df(dat, dict,
from = "option_code",
to = "option_name",
by = "data_element_shortname",
order = "option_order_in_set"
)
print(dat_clean)
#> # A tibble: 20 × 45
#> case_number date_of_consultation_admiss…¹ patient_origin age_years age_months
#> <chr> <date> <chr> <int> <int>
#> 1 A1 2018-02-28 Village A 23 NA
#> 2 A2 2018-02-08 Village A 62 NA
#> 3 A3 2018-01-30 Village D 23 NA
#> 4 A4 2018-01-12 Village C 69 NA
#> 5 A5 2018-04-12 Village A 55 NA
#> 6 A6 2018-04-22 Village C 7 NA
#> 7 A7 2018-02-07 Village B 38 NA
#> 8 A8 2018-03-09 Village D 66 NA
#> 9 A9 2018-04-26 Village A 4 NA
#> 10 A10 2018-04-08 Village C 55 NA
#> 11 A11 2018-03-26 Village D 41 NA
#> 12 A12 2018-01-13 Village D 17 NA
#> 13 A13 2018-04-15 Village B 75 NA
#> 14 A14 2018-04-28 Village C 15 NA
#> 15 A15 2018-03-01 Village A 47 NA
#> 16 A16 2018-01-14 Village A 41 NA
#> 17 A17 2018-01-22 Village D NA 15
#> 18 A18 2018-04-11 Village D 44 NA
#> 19 A19 2018-02-03 Village A 48 NA
#> 20 A20 2018-01-07 Village C 18 NA
#> # ℹ abbreviated name: ¹date_of_consultation_admission
#> # ℹ 40 more variables: age_days <int>, sex <fct>, pregnant <fct>,
#> # trimester <fct>, foetus_alive_at_admission <fct>, exit_status <fct>,
#> # date_of_exit <date>, time_to_death <fct>, pregnancy_outcome_at_exit <fct>,
#> # previously_vaccinated <fct>, previous_vaccine_doses_received <fct>,
#> # readmission <fct>, msf_involvement <fct>,
#> # cholera_treatment_facility_type <fct>, residential_status_brief <fct>, …