From a09c72e25c0ddfa7b34c26c2f926becf0d11ddd0 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 13:01:18 -0400 Subject: [PATCH 01/49] V2a "received all doses" --- facebook/delphiFacebook/R/contingency_indicators.R | 4 +++- facebook/delphiFacebook/R/contingency_variables.R | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index ffaa54f76..856f0cf44 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -172,7 +172,9 @@ get_aggs <- function() { "pct_vaccinated_booster_probyes", "v_vaccinated_booster_probyes", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_booster_probno", "v_vaccinated_booster_probno", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_booster_defno", "v_vaccinated_booster_defno", compute_binary, jeffreys_multinomial_factory(4), - + + "pct_vaccine_all_doses", "v_received_all_doses", compute_binary, jeffreys_binary, + "pct_flu_vaccinated_2021", "v_flu_vaccinated_2021", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 93ce4a18e..705a28e04 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -212,6 +212,19 @@ code_addl_vaccines <- function(input_data, wave) { input_data$v_accept_covid_vaccine[input_data$start_dt < wave6_mod_date] <- NA } + if ("V2a" %in% names(input_data)) { + # coded as 1 = Yes, received all recommended doses, 2 = Plan to receive all recommended doses, + # 3 = Don't plan to receive all recommended doses. + input_data$v_received_all_doses <- case_when( + input_data$V2a == 1 ~ 1, + input_data$V2a == 2 ~ 0, + input_data$V2a == 3 ~ 0, + TRUE ~ NA_real_ + ) + } else { + input_data$v_received_all_doses <- NA_real_ + } + # hesitant_vaccine # Percentage who would definitely or probably NOT choose to get vaccinated input_data$v_hesitant_vaccine <- NA From 3da694647631e107752b6c27dbf24943712539d2 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 13:13:36 -0400 Subject: [PATCH 02/49] Q36 "yes financial threat" --- facebook/delphiFacebook/R/contingency_indicators.R | 2 ++ facebook/delphiFacebook/R/variables.R | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 856f0cf44..0e9739dd8 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -375,6 +375,8 @@ get_aggs <- function() { "pct_test_reason_travel", "t_tested_reason_travel", compute_binary, jeffreys_binary, # mental health + "pct_financial_threat", "mh_financial_threat", compute_binary, jeffreys_binary, + "pct_worried_become_ill", "mh_worried_ill", compute_binary, jeffreys_binary, "pct_finance", "mh_worried_finances", compute_binary, jeffreys_binary, # pre-wave 10 diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 137d62d76..bc930211f 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -224,6 +224,17 @@ code_mental_health <- function(input_data, wave) { } else { input_data$mh_worried_catch_covid <- NA } + + if ("Q36" %in% names(input_data)) { + # Included in waves 1, 2, 3. Coded as 1 = substantial threat, + # 2 = moderate threat, 3 = not much of a threat, 4 = not a threat at all + input_data$mh_financial_threat <- case_when( + is.na(input_data$Q36) ~ NA, + input_data$Q36 == 1 ~ TRUE, + TRUE ~ FALSE) + } else { + input_data$mh_financial_threat <- NA + } return(input_data) } From f41aff04b3a7df5f657125b910e37a8eb9c00292 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:04:59 -0400 Subject: [PATCH 03/49] C14a "wear mask + some of the time" --- facebook/delphiFacebook/R/contingency_indicators.R | 1 + facebook/delphiFacebook/R/variables.R | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 0e9739dd8..a3fc03254 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -73,6 +73,7 @@ get_aggs <- function() { ## Mask wearing and distancing "pct_wearing_mask_5d", "c_mask_often", compute_binary, jeffreys_binary, "pct_wearing_mask_7d", "c_mask_often_7d", compute_binary, jeffreys_binary, + "pct_wearing_mask_7d_alt", "c_mask_some_often_7d", compute_binary, jeffreys_binary, "pct_others_masked", "c_others_masked", compute_binary, jeffreys_binary, "pct_others_masked_public", "c_others_masked_public", compute_binary, jeffreys_binary, "pct_others_distanced_public", "c_others_distanced_public", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index bc930211f..dcbcd7f17 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -253,7 +253,7 @@ code_mask_contact <- function(input_data, wave) { case_when( is.na(item) ~ NA, item == 6 ~ NA, - item == 1 | item == 2 ~ TRUE, + item == 1 | item == 2 ~ TRUE, TRUE ~ FALSE) } @@ -281,8 +281,16 @@ code_mask_contact <- function(input_data, wave) { # added in wave 8. wearing mask most or all of the time (last 7 days); # exclude respondents who have not been in public input_data$c_mask_often_7d <- most_always(input_data$C14a) + # Same indicator but include "sometimes" wear mask in public + input_data$c_mask_some_often_7d <- case_when( + is.na(input_data$C14a) ~ NA, + input_data$C14a == 6 ~ NA, + input_data$C14a == 1 | input_data$C14a == 2 | input_data$C14a == 3 ~ TRUE, + TRUE ~ FALSE) + } else { input_data$c_mask_often_7d <- NA + input_data$c_mask_some_often_7d <- NA } if ("C16" %in% names(input_data)) { From 71a985c3bcca8ac78ab0ae9fc0dced4092ecbaae Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:19:23 -0400 Subject: [PATCH 04/49] H1 people distancing + "some of the time" --- facebook/delphiFacebook/R/contingency_indicators.R | 1 + facebook/delphiFacebook/R/variables.R | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index a3fc03254..6bb789ab9 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -77,6 +77,7 @@ get_aggs <- function() { "pct_others_masked", "c_others_masked", compute_binary, jeffreys_binary, "pct_others_masked_public", "c_others_masked_public", compute_binary, jeffreys_binary, "pct_others_distanced_public", "c_others_distanced_public", compute_binary, jeffreys_binary, + "pct_others_distanced_public_alt", "c_others_distanced_some_public", compute_binary, jeffreys_binary, "pct_cli", "hh_p_cli", compute_household_binary, jeffreys_count, "pct_ili", "hh_p_ili", compute_household_binary, jeffreys_count, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index dcbcd7f17..7dcb437fd 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -316,13 +316,22 @@ code_mask_contact <- function(input_data, wave) { if ("H1" %in% names(input_data)) { # added in wave 11. most/all *others* in public in the last 7 days; exclude # respondents who have not been in public. + # Coded as 1 = no people in public are distancing, 2 = a few people are, + # 3 = some people are, 4 = most people are, 5 = all people are, 6 = I have not been in public input_data$c_others_distanced_public <- case_when( is.na(input_data$H1) ~ NA, input_data$H1 == 6 ~ NA, input_data$H1 == 4 | input_data$H1 == 5 ~ TRUE, TRUE ~ FALSE) + # include others in public are distanced "sometimes" + input_data$c_others_distanced_some_public <- case_when( + is.na(input_data$H1) ~ NA, + input_data$H1 == 6 ~ NA, + input_data$H1 == 4 | input_data$H1 == 5 | input_data$H1 == 3 ~ TRUE, + TRUE ~ FALSE) } else { input_data$c_others_distanced_public <- NA + input_data$c_others_distanced_some_public <- NA } if ("C3" %in% names(input_data)) { From 320420c06402d3f480d94503a8116e927d228e8e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:42:18 -0400 Subject: [PATCH 05/49] C16/H2 people masked + "some of the time" --- .../delphiFacebook/R/contingency_indicators.R | 5 +++++ facebook/delphiFacebook/R/variables.R | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 6bb789ab9..e75408605 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -74,8 +74,13 @@ get_aggs <- function() { "pct_wearing_mask_5d", "c_mask_often", compute_binary, jeffreys_binary, "pct_wearing_mask_7d", "c_mask_often_7d", compute_binary, jeffreys_binary, "pct_wearing_mask_7d_alt", "c_mask_some_often_7d", compute_binary, jeffreys_binary, + "pct_others_masked", "c_others_masked", compute_binary, jeffreys_binary, + "pct_others_masked_alt", "c_others_some_masked", compute_binary, jeffreys_binary, + "pct_others_masked_public", "c_others_masked_public", compute_binary, jeffreys_binary, + "pct_others_masked_public_alt", "c_others_masked_some_public", compute_binary, jeffreys_binary, + "pct_others_distanced_public", "c_others_distanced_public", compute_binary, jeffreys_binary, "pct_others_distanced_public_alt", "c_others_distanced_some_public", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 7dcb437fd..c7597268a 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -296,21 +296,38 @@ code_mask_contact <- function(input_data, wave) { if ("C16" %in% names(input_data)) { # added in wave 5. most/all *others* seen in public wearing masks; exclude # respondents who have not been in public. + # Coded as 5 = no people in public are wearing masks, 4 = a few people are, + # 3 = some people are, 2 = most people are, 1 = all people are, 6 = I have not been in public input_data$c_others_masked <- most_always(input_data$C16) + # include others in public are masked "sometimes" + input_data$c_others_some_masked <- case_when( + is.na(input_data$C16) ~ NA, + input_data$C16 == 6 ~ NA, + input_data$C16 == 1 | input_data$C16 == 2 | input_data$C16 == 3 ~ TRUE, + TRUE ~ FALSE) } else { input_data$c_others_masked <- NA + input_data$c_others_some_masked <- NA } if ("H2" %in% names(input_data)) { # added in wave 11, replaces C16. most/all *others* seen in public wearing # masks; exclude respondents who have not been in public. Coding is reversed. + # Coded as 1 = no people in public are wearing masks, 2 = a few people are, + # 3 = some people are, 4 = most people are, 5 = all people are, 6 = I have not been in public input_data$c_others_masked_public <- case_when( is.na(input_data$H2) ~ NA, input_data$H2 == 6 ~ NA, input_data$H2 == 4 | input_data$H2 == 5 ~ TRUE, TRUE ~ FALSE) + input_data$c_others_masked_some_public <- case_when( + is.na(input_data$H2) ~ NA, + input_data$H2 == 6 ~ NA, + input_data$H2 == 4 | input_data$H2 == 5 | input_data$H2 == 3 ~ TRUE, + TRUE ~ FALSE) } else { input_data$c_others_masked_public <- NA + input_data$c_others_masked_some_public <- NA } if ("H1" %in% names(input_data)) { From 081b8c186779e80cb9d3669a1e45145b1869e337 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:41:51 -0400 Subject: [PATCH 06/49] H3 friends vaccinated + "some" --- facebook/delphiFacebook/R/contingency_indicators.R | 2 ++ facebook/delphiFacebook/R/variables.R | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index e75408605..111ed5150 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -143,7 +143,9 @@ get_aggs <- function() { "pct_hesitant_vaccine", "v_hesitant_vaccine", compute_binary, jeffreys_binary, "pct_vaccinated_or_accept", "v_covid_vaccinated_or_accept", compute_binary, jeffreys_binary, "pct_vaccinated_appointment_or_accept", "v_covid_vaccinated_appointment_or_accept", compute_binary, jeffreys_binary, + "pct_covid_vaccinated_friends", "v_covid_vaccinated_friends", compute_binary, jeffreys_binary, + "pct_covid_vaccinated_friends_alt", "v_covid_vaccinated_some_friends", compute_binary, jeffreys_binary, "pct_vaccinate_children", "v_vaccinate_children", compute_binary, jeffreys_binary, "pct_vaccinate_child_oldest", "v_vaccinate_child_oldest", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index c7597268a..7e77f2b62 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -912,8 +912,14 @@ code_vaccines <- function(input_data, wave) { is.na(input_data$H3) ~ NA, input_data$H3 == 4 | input_data$H3 == 6 ~ TRUE, TRUE ~ FALSE) + # Add "some" people + input_data$v_covid_vaccinated_some_friends <- case_when( + is.na(input_data$H3) ~ NA, + input_data$H3 == 4 | input_data$H3 == 6 | input_data$H3 == 3 ~ TRUE, + TRUE ~ FALSE) } else { input_data$v_covid_vaccinated_friends <- NA + input_data$v_covid_vaccinated_some_friends <- NA } if ("V2d" %in% names(input_data)) { From a150e3aed6f0a21671fda4d62607bdad5927cfcd Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:54:51 -0400 Subject: [PATCH 07/49] C17* historical flu vaccines --- .../delphiFacebook/R/contingency_indicators.R | 2 ++ facebook/delphiFacebook/R/variables.R | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 111ed5150..b755a6b08 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -184,6 +184,8 @@ get_aggs <- function() { "pct_vaccine_all_doses", "v_received_all_doses", compute_binary, jeffreys_binary, + "pct_flu_vaccine_june_2020", "v_flu_vaccinated_june_2020", compute_binary, jeffreys_binary, + "pct_flu_vaccine_july_2020", "v_flu_vaccinated_july_2020", compute_binary, jeffreys_binary, "pct_flu_vaccinated_2021", "v_flu_vaccinated_2021", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 7e77f2b62..f051f0e1b 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -960,7 +960,22 @@ code_vaccines <- function(input_data, wave) { input_data$v_vaccinated_booster_defno <- NA } + if ("C17" %in% names(input_data)) { + # Coded as 1 = "Yes", 4 = "No", 2 = "I don't know" + input_data$v_flu_vaccinated_june_2020 <- input_data$C17 == 1 + } else { + input_data$v_flu_vaccinated_june_2020 <- NA + } + + if ("C17a" %in% names(input_data)) { + # Coded as 1 = "Yes", 2 = "No", 3 = "I don't know" + input_data$v_flu_vaccinated_july_2020 <- input_data$C17a == 1 + } else { + input_data$v_flu_vaccinated_july_2020 <- NA + } + if ("C17b" %in% names(input_data)) { + # Coded as 1 = "Yes", 2 = "No", 3 = "I don't know" input_data$v_flu_vaccinated_2021 <- input_data$C17b == 1 } else { input_data$v_flu_vaccinated_2021 <- NA From facc7651eb636d4a73c68b5230d080a70c3ba1f2 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:59:25 -0400 Subject: [PATCH 08/49] C2 flu vaccine last 12m --- facebook/delphiFacebook/R/contingency_indicators.R | 1 + facebook/delphiFacebook/R/variables.R | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index b755a6b08..4a47fd507 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -184,6 +184,7 @@ get_aggs <- function() { "pct_vaccine_all_doses", "v_received_all_doses", compute_binary, jeffreys_binary, + "pct_flu_shot_1y", "v_flu_vaccinated_1y", compute_binary, jeffreys_binary, "pct_flu_vaccine_june_2020", "v_flu_vaccinated_june_2020", compute_binary, jeffreys_binary, "pct_flu_vaccine_july_2020", "v_flu_vaccinated_july_2020", compute_binary, jeffreys_binary, "pct_flu_vaccinated_2021", "v_flu_vaccinated_2021", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index f051f0e1b..f2f4c1159 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -960,6 +960,13 @@ code_vaccines <- function(input_data, wave) { input_data$v_vaccinated_booster_defno <- NA } + if ("C2" %in% names(input_data)) { + # Coded as 1 = "Yes", 2 = "No" + input_data$v_flu_vaccinated_1y <- input_data$C2 == 1 + } else { + input_data$v_flu_vaccinated_1y <- NA + } + if ("C17" %in% names(input_data)) { # Coded as 1 = "Yes", 4 = "No", 2 = "I don't know" input_data$v_flu_vaccinated_june_2020 <- input_data$C17 == 1 From f3bd9393ddec91573dd63b06a19758c74b5ce08e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 10 Jun 2022 17:32:36 -0400 Subject: [PATCH 09/49] mental health + sometimes --- .../delphiFacebook/R/contingency_indicators.R | 20 +++++++++++++------ facebook/delphiFacebook/R/variables.R | 17 ++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 4a47fd507..cae4663e0 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -390,17 +390,25 @@ get_aggs <- function() { "pct_financial_threat", "mh_financial_threat", compute_binary, jeffreys_binary, "pct_worried_become_ill", "mh_worried_ill", compute_binary, jeffreys_binary, + "pct_worried_catch_covid", "mh_worried_catch_covid", compute_binary, jeffreys_binary, + "pct_finance", "mh_worried_finances", compute_binary, jeffreys_binary, - # pre-wave 10 + "pct_finance_alt", "mh_very_worried_finances", compute_binary, jeffreys_binary, + "pct_anxious_5d", "mh_anxious", compute_binary, jeffreys_binary, - "pct_depressed_5d", "mh_depressed", compute_binary, jeffreys_binary, - "pct_felt_isolated_5d", "mh_isolated", compute_binary, jeffreys_binary, - # wave 10+ + "pct_anxious_5d_alt", "mh_some_anxious", compute_binary, jeffreys_binary, "pct_anxious_7d", "mh_anxious_7d", compute_binary, jeffreys_binary, + "pct_anxious_7d_alt", "mh_some_anxious_7d", compute_binary, jeffreys_binary, + + "pct_depressed_5d", "mh_depressed", compute_binary, jeffreys_binary, + "pct_depressed_5d_alt", "mh_some_depressed", compute_binary, jeffreys_binary, "pct_depressed_7d", "mh_depressed_7d", compute_binary, jeffreys_binary, + "pct_depressed_7d_alt", "mh_some_depressed_7d", compute_binary, jeffreys_binary, + + "pct_felt_isolated_5d", "mh_isolated", compute_binary, jeffreys_binary, + "pct_isolated_5d_alt", "mh_some_isolated", compute_binary, jeffreys_binary, "pct_felt_isolated_7d", "mh_isolated_7d", compute_binary, jeffreys_binary, - # wave 11 - "pct_worried_catch_covid", "mh_worried_catch_covid", compute_binary, jeffreys_binary, + "pct_isolated_7d_alt", "mh_some_isolated_7d", compute_binary, jeffreys_binary, # travel outside state # pre-wave 10 diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index f2f4c1159..dde43b881 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -197,20 +197,37 @@ code_mental_health <- function(input_data, wave) { if (wave >= 4 && wave < 10) { input_data$mh_worried_ill <- input_data$C9 == 1 | input_data$C9 == 2 + # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time input_data$mh_anxious <- input_data$C8_1 == 3 | input_data$C8_1 == 4 + input_data$mh_some_anxious <- input_data$C8_1 == 3 | input_data$C8_1 == 4 | input_data$C8_1 == 2 input_data$mh_depressed <- input_data$C8_2 == 3 | input_data$C8_2 == 4 + input_data$mh_some_depressed <- input_data$C8_2 == 3 | input_data$C8_2 == 4 | input_data$C8_2 == 2 input_data$mh_isolated <- input_data$C8_3 == 3 | input_data$C8_3 == 4 + input_data$mh_some_isolated <- input_data$C8_3 == 3 | input_data$C8_3 == 4 | input_data$C8_3 == 2 + # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all input_data$mh_worried_finances <- input_data$C15 == 1 | input_data$C15 == 2 + input_data$mh_very_worried_finances <- input_data$C15 == 1 } else if (wave == 10) { input_data$mh_worried_ill <- input_data$C9 == 1 | input_data$C9 == 2 + # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time input_data$mh_anxious_7d <- input_data$C8a_1 == 3 | input_data$C8a_1 == 4 + input_data$mh_some_anxious_7d <- input_data$C8a_1 == 3 | input_data$C8a_1 == 4 | input_data$C8a_1 == 2 input_data$mh_depressed_7d <- input_data$C8a_2 == 3 | input_data$C8a_2 == 4 + input_data$mh_some_depressed_7d <- input_data$C8a_2 == 3 | input_data$C8a_2 == 4 | input_data$C8a_2 == 2 input_data$mh_isolated_7d <- input_data$C8a_3 == 3 | input_data$C8a_3 == 4 + input_data$mh_some_isolated_7d <- input_data$C8a_3 == 3 | input_data$C8a_3 == 4 | input_data$C8a_3 == 2 + # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all input_data$mh_worried_finances <- input_data$C15 == 1 | input_data$C15 == 2 + input_data$mh_very_worried_finances <- input_data$C15 == 1 } else if (wave >= 11) { + # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time input_data$mh_anxious_7d <- input_data$C18a == 3 | input_data$C18a == 4 + input_data$mh_some_anxious_7d <- input_data$C18a == 3 | input_data$C18a == 4 | input_data$C18a == 2 input_data$mh_depressed_7d <- input_data$C18b == 3 | input_data$C18b == 4 + input_data$mh_some_depressed_7d <- input_data$C18b == 3 | input_data$C18b == 4 | input_data$C18b == 2 + # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all input_data$mh_worried_finances <- input_data$C15 == 1 | input_data$C15 == 2 + input_data$mh_very_worried_finances <- input_data$C15 == 1 } if ("G1" %in% names(input_data)) { From 29a8baa66ea863bd346d462c6a7deec921ab1728 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 13 Jun 2022 10:21:12 -0400 Subject: [PATCH 10/49] C11/C12 historical in contact with COVID-+ person --- .../delphiFacebook/R/contingency_indicators.R | 4 ++++ .../delphiFacebook/R/contingency_variables.R | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index cae4663e0..abca97b99 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -88,7 +88,11 @@ get_aggs <- function() { "pct_ili", "hh_p_ili", compute_household_binary, jeffreys_count, "pct_hh_cmnty_cli", "hh_community_yes", compute_binary, jeffreys_binary, "pct_nohh_cmnty_cli", "community_yes", compute_binary, jeffreys_binary, + "pct_direct_contact", "c_direct_contact", compute_binary, jeffreys_binary, + "pct_direct_contact_covid", "c_direct_contact_covid", compute_binary, jeffreys_binary, + "pct_direct_contact_covid_hh", "c_direct_contact_covid_hh", compute_binary, jeffreys_binary, + "pct_avoid_contact", "c_avoid_contact", compute_binary, jeffreys_binary, "pct_avoid_contact_7d", "c_avoid_contact_7d", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 705a28e04..9699c6e04 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1054,6 +1054,30 @@ code_behaviors <- function(input_data, wave) { input_data$c_direct_contact <- NA } + if ("C11" %in% names(input_data)) { + # Had "direct contact" with someone COVID-positive in the last 24 hours + # Coded as 1 = Yes, 2 = No + input_data$c_direct_contact_covid <- case_when( + input_data$C11 == 1 ~ 1, + input_data$C11 == 2 ~ 0, + TRUE ~ NA_real_ + ) + } else { + input_data$c_direct_contact_covid <- NA_real_ + } + + if (all(c("C11", "C12") %in% names(input_data))) { + # C12: was the person in C11 a member of your household + # Coded as 1 = Yes, 2 = No + input_data$c_direct_contact_covid_hh <- case_when( + input_data$C11 == 1 & input_data$C12 == 1 ~ 1, + input_data$C11 == 2 | input_data$C12 == 2 ~ 0, + TRUE ~ NA_real_ + ) + } else { + input_data$c_direct_contact_covid_hh <- NA_real_ + } + # avoid_contact # Percentage of respondents that have reported having intentionally avoided # contact with other people all or most of the time From fe26aa4a0f44beff2ff64f4bc0aee21caed8a669 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 13 Jun 2022 11:55:34 -0400 Subject: [PATCH 11/49] all work_outside_home varieties --- facebook/delphiFacebook/R/binary.R | 4 ++-- .../delphiFacebook/R/contingency_indicators.R | 7 +++++-- .../delphiFacebook/R/contingency_variables.R | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/facebook/delphiFacebook/R/binary.R b/facebook/delphiFacebook/R/binary.R index 0a2470098..b6c277bad 100644 --- a/facebook/delphiFacebook/R/binary.R +++ b/facebook/delphiFacebook/R/binary.R @@ -59,8 +59,8 @@ get_binary_indicators <- function() { # work outside home # pre-wave 4 - "wip_smoothed_work_outside_home_5d", "weight_unif", "c_work_outside_5d", 6, compute_binary_response, jeffreys_binary, - "wip_smoothed_wwork_outside_home_5d", "weight", "c_work_outside_5d", 6, compute_binary_response, jeffreys_binary, + "smoothed_work_outside_home_5d", "weight_unif", "c_work_outside_5d", 6, compute_binary_response, jeffreys_binary, + "smoothed_wwork_outside_home_5d", "weight", "c_work_outside_5d", 6, compute_binary_response, jeffreys_binary, # wave 4+, pre-wave 10 "smoothed_work_outside_home_1d", "weight_unif", "a_work_outside_home_1d", 6, compute_binary_response, jeffreys_binary, "smoothed_wwork_outside_home_1d", "weight", "a_work_outside_home_1d", 6, compute_binary_response, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index abca97b99..86d89c8b1 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -421,14 +421,17 @@ get_aggs <- function() { "pct_travel_outside_state_7d", "c_travel_state_7d", compute_binary, jeffreys_binary, # activities outside the home + "pct_work_outside_home_5d", "c_work_outside_5d", compute_binary, jeffreys_binary, "pct_work_outside_home_1d", "a_work_outside_home_1d", compute_binary, jeffreys_binary, + "pct_work_outside_home_4w", "c_work_outside_home_4w", compute_binary, jeffreys_binary, + "pct_work_outside_home_indoors_1d", "a_work_outside_home_indoors_1d", compute_binary, jeffreys_binary, + "pct_shop_1d", "a_shop_1d", compute_binary, jeffreys_binary, "pct_restaurant_1d", "a_restaurant_1d", compute_binary, jeffreys_binary, "pct_spent_time_1d", "a_spent_time_1d", compute_binary, jeffreys_binary, "pct_large_event_1d", "a_large_event_1d", compute_binary, jeffreys_binary, "pct_public_transit_1d", "a_public_transit_1d", compute_binary, jeffreys_binary, - - "pct_work_outside_home_indoors_1d", "a_work_outside_home_indoors_1d", compute_binary, jeffreys_binary, + "pct_shop_indoors_1d", "a_shop_indoors_1d", compute_binary, jeffreys_binary, "pct_restaurant_indoors_1d", "a_restaurant_indoors_1d", compute_binary, jeffreys_binary, "pct_spent_time_indoors_1d", "a_spent_time_indoors_1d", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 9699c6e04..4b1957bdd 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1078,6 +1078,22 @@ code_behaviors <- function(input_data, wave) { input_data$c_direct_contact_covid_hh <- NA_real_ } + # Work outside the home + if (all(c("D9", "D10") %in% names(input_data))) { + # D9: in the past 4 weeks, did you work + # Coded as 1 = Yes, 2 = No + # D10: if answered yes to D9, was your work in the last 4w outisde your home + # Coded as 1 = Yes, 2 = No + input_data$c_direct_contact_covid_hh <- case_when( + input_data$D9 == 1 & input_data$D10 == 1 ~ 1, + input_data$D9 == 2 | input_data$D10 == 2 ~ 0, + TRUE ~ NA_real_ + ) + } else { + input_data$c_direct_contact_covid_hh <- NA_real_ + } + + # avoid_contact # Percentage of respondents that have reported having intentionally avoided # contact with other people all or most of the time From 918fd8e78ddd9ee6f624505810da4f7e02ba90ee Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 13 Jun 2022 16:16:41 -0400 Subject: [PATCH 12/49] work with high-risk populations --- .../delphiFacebook/R/contingency_indicators.R | 5 +- .../delphiFacebook/R/contingency_variables.R | 47 ++++++++++++------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 86d89c8b1..ed0f8f12b 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -423,7 +423,7 @@ get_aggs <- function() { # activities outside the home "pct_work_outside_home_5d", "c_work_outside_5d", compute_binary, jeffreys_binary, "pct_work_outside_home_1d", "a_work_outside_home_1d", compute_binary, jeffreys_binary, - "pct_work_outside_home_4w", "c_work_outside_home_4w", compute_binary, jeffreys_binary, + "pct_work_outside_home_4w", "a_work_outside_home_4w", compute_binary, jeffreys_binary, "pct_work_outside_home_indoors_1d", "a_work_outside_home_indoors_1d", compute_binary, jeffreys_binary, "pct_shop_1d", "a_shop_1d", compute_binary, jeffreys_binary, @@ -436,6 +436,9 @@ get_aggs <- function() { "pct_restaurant_indoors_1d", "a_restaurant_indoors_1d", compute_binary, jeffreys_binary, "pct_spent_time_indoors_1d", "a_spent_time_indoors_1d", compute_binary, jeffreys_binary, "pct_large_event_indoors_1d", "a_large_event_indoors_1d", compute_binary, jeffreys_binary, + + "pct_work_healthcare_5d", "a_work_healthcare_5d", compute_binary, jeffreys_binary, + "pct_work_nursing_home_5d", "a_work_nursing_home_5d", compute_binary, jeffreys_binary, # masked activities outside the home "pct_mask_work_outside_home_1d", "a_mask_work_outside_home_1d", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 4b1957bdd..7fb2e7aa2 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1078,22 +1078,6 @@ code_behaviors <- function(input_data, wave) { input_data$c_direct_contact_covid_hh <- NA_real_ } - # Work outside the home - if (all(c("D9", "D10") %in% names(input_data))) { - # D9: in the past 4 weeks, did you work - # Coded as 1 = Yes, 2 = No - # D10: if answered yes to D9, was your work in the last 4w outisde your home - # Coded as 1 = Yes, 2 = No - input_data$c_direct_contact_covid_hh <- case_when( - input_data$D9 == 1 & input_data$D10 == 1 ~ 1, - input_data$D9 == 2 | input_data$D10 == 2 ~ 0, - TRUE ~ NA_real_ - ) - } else { - input_data$c_direct_contact_covid_hh <- NA_real_ - } - - # avoid_contact # Percentage of respondents that have reported having intentionally avoided # contact with other people all or most of the time @@ -1134,6 +1118,21 @@ code_behaviors <- function(input_data, wave) { #' #' @return augmented data frame code_addl_activities <- function(input_data, wave) { + # Work outside the home + if (all(c("D9", "D10") %in% names(input_data))) { + # D9: in the past 4 weeks, did you work + # Coded as 1 = Yes, 2 = No + # D10: if answered yes to D9, was your work in the last 4w outisde your home + # Coded as 1 = Yes, 2 = No + input_data$a_work_outside_home_4w <- case_when( + input_data$D9 == 1 & input_data$D10 == 1 ~ 1, + input_data$D9 == 2 | input_data$D10 == 2 ~ 0, + TRUE ~ NA_real_ + ) + } else { + input_data$a_work_outside_home_4w <- NA_real_ + } + calc_masking_given_activity <- function(activity, masked_during_activity) { case_when( activity & masked_during_activity ~ TRUE, @@ -1204,6 +1203,22 @@ code_addl_activities <- function(input_data, wave) { input_data$a_mask_public_transit_1d <- NA } + if ("C4" %in% names(input_data)) { + # Worked/volunteered in healthcare (hospital, medical office, etc) in last 5 days + # Coded as 1 = Yes, 2 = No + input_data$a_work_healthcare_5d <- input_data$C4 == 1 + } else { + input_data$a_work_healthcare_5d <- NA + } + + if ("C5" %in% names(input_data)) { + # Worked/visited nursing home, etc, in last 5 days + # Coded as 1 = Yes, 2 = No + input_data$a_work_nursing_home_5d <- input_data$C5 == 1 + } else { + input_data$a_work_nursing_home_5d <- NA + } + return(input_data) } From 9a65ac64a73ec114761324e017a66ba62e21e12e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 13 Jun 2022 16:51:05 -0400 Subject: [PATCH 13/49] reasons why people are not planning to complete the vaccine series --- .../delphiFacebook/R/contingency_indicators.R | 17 ++++++++ facebook/delphiFacebook/R/variables.R | 39 ++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index ed0f8f12b..c098f702c 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -279,6 +279,23 @@ get_aggs <- function() { "pct_barrier_other", "v_hesitancy_reason_other", compute_binary, jeffreys_binary, "pct_barrier_dislike_vaccines_generally", "v_hesitancy_reason_dislike_vaccines_generally", compute_binary, jeffreys_binary, + # vaccine incomplete reasons + "pct_vaccine_incomplete_sideeffect", "v_vaccine_incomplete_sideeffect", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_allergic", "v_vaccine_incomplete_allergic", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_wontwork", "v_vaccine_incomplete_wontwork", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_dontbelieve", "v_vaccine_incomplete_dontbelieve", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_dontlike", "v_vaccine_incomplete_dontlike", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_not_recommended", "v_vaccine_incomplete_not_recommended", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_wait", "v_vaccine_incomplete_wait", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_otherpeople", "v_vaccine_incomplete_otherpeople", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_cost", "v_vaccine_incomplete_cost", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_distrust_vaccine", "v_vaccine_incomplete_distrust_vaccine", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_distrust_gov", "v_vaccine_incomplete_distrust_gov", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_health", "v_vaccine_incomplete_health", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_other", "v_vaccine_incomplete_other", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_pregnant", "v_vaccine_incomplete_pregnant", compute_binary, jeffreys_binary, + "pct_vaccine_incomplete_religion", "v_vaccine_incomplete_religion", compute_binary, jeffreys_binary, + # vaccine "don't need" reasons "pct_dontneed_reason_had_covid", "v_dontneed_reason_had_covid_5abc_6", compute_binary, jeffreys_binary, "pct_dontneed_reason_dont_spend_time", "v_dontneed_reason_dont_spend_time_5abc_6", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index dde43b881..f52624e26 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -674,7 +674,44 @@ code_vaccines <- function(input_data, wave) { input_data$v_hesitancy_reason_religious <- NA_real_ input_data$v_hesitancy_reason_dislike_vaccines_generally <- NA_real_ } - + + if ("V5d" %in% names(input_data)) { + # introduced in Wave 8, removed in Wave 11 + vaccine_incomplete_reasons <- split_options(input_data$V5d) + + input_data$v_vaccine_incomplete_sideeffect <- is_selected(vaccine_incomplete_reasons, "1") + input_data$v_vaccine_incomplete_allergic <- is_selected(vaccine_incomplete_reasons, "2") + input_data$v_vaccine_incomplete_wontwork <- is_selected(vaccine_incomplete_reasons, "3") + input_data$v_vaccine_incomplete_dontbelieve <- is_selected(vaccine_incomplete_reasons, "4") + input_data$v_vaccine_incomplete_dontlike <- is_selected(vaccine_incomplete_reasons, "5") + input_data$v_vaccine_incomplete_not_recommended <- is_selected(vaccine_incomplete_reasons, "6") + input_data$v_vaccine_incomplete_wait <- is_selected(vaccine_incomplete_reasons, "7") + input_data$v_vaccine_incomplete_otherpeople <- is_selected(vaccine_incomplete_reasons, "8") + input_data$v_vaccine_incomplete_cost <- is_selected(vaccine_incomplete_reasons, "9") + input_data$v_vaccine_incomplete_distrust_vaccine <- is_selected(vaccine_incomplete_reasons, "10") + input_data$v_vaccine_incomplete_distrust_gov <- is_selected(vaccine_incomplete_reasons, "11") + input_data$v_vaccine_incomplete_health <- is_selected(vaccine_incomplete_reasons, "12") + input_data$v_vaccine_incomplete_other <- is_selected(vaccine_incomplete_reasons, "13") + input_data$v_vaccine_incomplete_pregnant <- is_selected(vaccine_incomplete_reasons, "14") + input_data$v_vaccine_incomplete_religion <- is_selected(vaccine_incomplete_reasons, "15") + } else { + input_data$v_vaccine_incomplete_sideeffect <- NA_real_ + input_data$v_vaccine_incomplete_allergic <- NA_real_ + input_data$v_vaccine_incomplete_wontwork <- NA_real_ + input_data$v_vaccine_incomplete_dontbelieve <- NA_real_ + input_data$v_vaccine_incomplete_dontlike <- NA_real_ + input_data$v_vaccine_incomplete_not_recommended <- NA_real_ + input_data$v_vaccine_incomplete_wait <- NA_real_ + input_data$v_vaccine_incomplete_otherpeople <- NA_real_ + input_data$v_vaccine_incomplete_cost <- NA_real_ + input_data$v_vaccine_incomplete_distrust_vaccine <- NA_real_ + input_data$v_vaccine_incomplete_distrust_gov <- NA_real_ + input_data$v_vaccine_incomplete_health <- NA_real_ + input_data$v_vaccine_incomplete_other <- NA_real_ + input_data$v_vaccine_incomplete_pregnant <- NA_real_ + input_data$v_vaccine_incomplete_religion <- NA_real_ + } + if ( "V6" %in% names(input_data) ) { # introduced in Wave 8 dontneed_reasons <- split_options(input_data$V6) From 0420df6021a69438008982c400b0c6cbe37080f7 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 13 Jun 2022 18:03:44 -0400 Subject: [PATCH 14/49] reasons why not tested for covid --- .../delphiFacebook/R/contingency_indicators.R | 9 ++++++++ .../delphiFacebook/R/contingency_variables.R | 22 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index c098f702c..eddd7ba8d 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -395,6 +395,15 @@ get_aggs <- function() { "pct_tested_positive_14d", "t_tested_positive_14d", compute_binary, jeffreys_binary, "pct_wanted_test_14d", "t_wanted_test_14d", compute_binary, jeffreys_binary, "pct_ever_tested", "t_ever_tested", compute_binary, jeffreys_binary, + + "pct_reason_not_tested_tried", "t_reason_not_tested_tried", compute_binary, jeffreys_binary, + "pct_reason_not_tested_appointment", "t_reason_not_tested_appointment", compute_binary, jeffreys_binary, + "pct_reason_not_tested_location", "t_reason_not_tested_location", compute_binary, jeffreys_binary, + "pct_reason_not_tested_cost", "t_reason_not_tested_cost", compute_binary, jeffreys_binary, + "pct_reason_not_tested_time", "t_reason_not_tested_time", compute_binary, jeffreys_binary, + "pct_reason_not_tested_travel", "t_reason_not_tested_travel", compute_binary, jeffreys_binary, + "pct_reason_not_tested_stigma", "t_reason_not_tested_stigma", compute_binary, jeffreys_binary, + "pct_reason_not_tested_none", "t_reason_not_tested_none", compute_binary, jeffreys_binary, ## testing reasons "pct_test_reason_sick", "t_tested_reason_sick", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 7fb2e7aa2..a5d8cf3c9 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -290,6 +290,28 @@ code_addl_vaccines <- function(input_data, wave) { input_data$t_ever_tested <- NA } + if ( "B12a" %in% names(input_data) ) { + not_tested_reasons <- split_options(input_data$B12a) + + input_data$t_reason_not_tested_tried <- is_selected(not_tested_reasons, "1") + input_data$t_reason_not_tested_appointment <- is_selected(not_tested_reasons, "2") + input_data$t_reason_not_tested_location <- is_selected(not_tested_reasons, "3") + input_data$t_reason_not_tested_cost <- is_selected(not_tested_reasons, "4") + input_data$t_reason_not_tested_time <- is_selected(not_tested_reasons, "5") + input_data$t_reason_not_tested_travel <- is_selected(not_tested_reasons, "6") + input_data$t_reason_not_tested_stigma <- is_selected(not_tested_reasons, "7") + input_data$t_reason_not_tested_none <- is_selected(not_tested_reasons, "8") + } else { + input_data$t_reason_not_tested_tried <- NA + input_data$t_reason_not_tested_appointment <- NA + input_data$t_reason_not_tested_location <- NA + input_data$t_reason_not_tested_cost <- NA + input_data$t_reason_not_tested_time <- NA + input_data$t_reason_not_tested_travel <- NA + input_data$t_reason_not_tested_stigma <- NA + input_data$t_reason_not_tested_none <- NA + } + return(input_data) } From f09d2dcdaca44dbe8c654fccc86c8cba21f800bd Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 14 Jun 2022 11:11:03 -0400 Subject: [PATCH 15/49] B* all followups to unusual symptoms question --- .../delphiFacebook/R/contingency_indicators.R | 8 ++++ .../delphiFacebook/R/contingency_variables.R | 45 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index eddd7ba8d..2b5b59c93 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -97,6 +97,10 @@ get_aggs <- function() { "pct_avoid_contact_7d", "c_avoid_contact_7d", compute_binary, jeffreys_binary, # symptoms + "pct_taken_temp", "t_taken_temp", compute_binary, jeffreys_binary, + + "pct_cough_mucus", "symp_cough_mucus", compute_binary, jeffreys_binary, + "pct_symp_fever", "symp_fever", compute_binary, jeffreys_binary, "pct_symp_cough", "symp_cough", compute_binary, jeffreys_binary, "pct_symp_shortness_breath", "symp_shortness_breath", compute_binary, jeffreys_binary, @@ -396,6 +400,10 @@ get_aggs <- function() { "pct_wanted_test_14d", "t_wanted_test_14d", compute_binary, jeffreys_binary, "pct_ever_tested", "t_ever_tested", compute_binary, jeffreys_binary, + "pct_unusual_symptom_tested", "t_unusual_symptom_tested", compute_binary, jeffreys_binary, + "pct_unusual_symptom_hospital", "t_unusual_symptom_hospital", compute_binary, jeffreys_binary, + "pct_unusual_symptom_medical_care", "t_unusual_symptom_medical_care", compute_binary, jeffreys_binary, + "pct_reason_not_tested_tried", "t_reason_not_tested_tried", compute_binary, jeffreys_binary, "pct_reason_not_tested_appointment", "t_reason_not_tested_appointment", compute_binary, jeffreys_binary, "pct_reason_not_tested_location", "t_reason_not_tested_location", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index a5d8cf3c9..c0fe11149 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -284,12 +284,50 @@ code_addl_vaccines <- function(input_data, wave) { input_data$v_vaccine_timing_dontknow <- NA } + if ("B3" %in% names(input_data)) { + input_data$t_taken_temp <- input_data$B3 == 1 + } else { + input_data$t_taken_temp <- NA + } + if ("B8" %in% names(input_data)) { input_data$t_ever_tested <- input_data$B8 == 1 } else { input_data$t_ever_tested <- NA } + if ("B5" %in% names(input_data)) { + input_data$t_unusual_symptom_tested <- case_when( + input_data$B5 %in% c(1, 2, 3) ~ 1, + input_data$B5 %in% c(4, 5) ~ 0, + TRUE ~ NA_real_ + ) + } else { + input_data$t_unusual_symptom_tested <- NA + } + + if ("B6" %in% names(input_data)) { + input_data$t_unusual_symptom_hospital <- case_when( + input_data$B6 %in% c(1, 3) ~ 1, + input_data$B6 %in% c(2) ~ 0, + TRUE ~ NA_real_ + ) + } else { + input_data$t_unusual_symptom_hospital <- NA + } + + if ("B7" %in% names(input_data)) { + # Coded as 8 = no medical care sought, 1-6 = various types of medical care sought, + # 7 = care sought but not received + input_data$t_unusual_symptom_medical_care <- case_when( + input_data$B7 == "8" ~ 0, + !is.na(input_data$B7) ~ 1, + TRUE ~ NA_real_ + ) + } else { + input_data$t_unusual_symptom_medical_care <- NA + } + if ( "B12a" %in% names(input_data) ) { not_tested_reasons <- split_options(input_data$B12a) @@ -1047,6 +1085,13 @@ code_addl_symptoms <- function(input_data, wave) { input_data$symp_sleep_changes_unusual <- NA input_data$symp_stuffy_nose_unusual <- NA } + + if ("B4" %in% names(input_data)) { + # Cough with mucus given have cough in last 1 day + input_data$symp_cough_mucus <- input_data$B4 == 1 + } else { + input_data$symp_cough_mucus <- NA + } return(input_data) } From 0df4d159782d0093808d378d24713055e75d1b7f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 14 Jun 2022 12:04:30 -0400 Subject: [PATCH 16/49] D10 work for pay outside home among those working --- facebook/delphiFacebook/R/contingency_indicators.R | 2 ++ facebook/delphiFacebook/R/contingency_variables.R | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 2b5b59c93..c58b8f9a9 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -460,6 +460,8 @@ get_aggs <- function() { "pct_work_outside_home_4w", "a_work_outside_home_4w", compute_binary, jeffreys_binary, "pct_work_outside_home_indoors_1d", "a_work_outside_home_indoors_1d", compute_binary, jeffreys_binary, + "pct_work_for_pay_outside_home_4w", "a_work_for_pay_outside_home_4w", compute_binary, jeffreys_binary, + "pct_shop_1d", "a_shop_1d", compute_binary, jeffreys_binary, "pct_restaurant_1d", "a_restaurant_1d", compute_binary, jeffreys_binary, "pct_spent_time_1d", "a_spent_time_1d", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index c0fe11149..05421c2a1 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1200,6 +1200,14 @@ code_addl_activities <- function(input_data, wave) { input_data$a_work_outside_home_4w <- NA_real_ } + if ("D10" %in% names(input_data)) { + # D10: if answered yes to D9, was your work in the last 4w outisde your home + # Coded as 1 = Yes, 2 = No + input_data$a_work_for_pay_outside_home_4w <- input_data$D10 == 1 + } else { + input_data$a_work_for_pay_outside_home_4w <- NA_real_ + } + calc_masking_given_activity <- function(activity, masked_during_activity) { case_when( activity & masked_during_activity ~ TRUE, From 23758e68f0d3e25b8f127b9cad4663c0d4666cda Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 14 Jun 2022 15:29:51 -0400 Subject: [PATCH 17/49] define variables we want to find the mean for --- .../delphiFacebook/R/contingency_indicators.R | 7 ++++- .../delphiFacebook/R/contingency_variables.R | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index c58b8f9a9..b9d8bccfa 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -542,7 +542,12 @@ get_aggs <- function() { "pct_school_safety_measures_vaccine_staff", "s_school_safety_measures_vaccine_staff", compute_binary, jeffreys_binary, "pct_school_safety_measures_vaccine_students", "s_school_safety_measures_vaccine_students", compute_binary, jeffreys_binary, "pct_school_safety_measures_cafeteria", "s_school_safety_measures_cafeteria", compute_binary, jeffreys_binary, - "pct_school_safety_measures_dont_know", "s_school_safety_measures_dont_know", compute_binary, jeffreys_binary + "pct_school_safety_measures_dont_know", "s_school_safety_measures_dont_know", compute_binary, jeffreys_binary, + + # Means + "mean_days_symptoms", "symp_n_days", compute_mean, I, + "mean_ppl_symptoms_household", "hh_number_sick", compute_mean, I, + "mean_ppl_symptoms_community", "community_number_sick", compute_mean, I ) aggs <- create_aggs_product(regions, groups, indicators) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 05421c2a1..1af2da773 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -951,6 +951,32 @@ code_attempt_vaccine <- function(input_data, wave) { #' #' @return data frame augmented with demographic grouping variables code_addl_symptoms <- function(input_data, wave) { + if ("B2b" %in% names(input_data)) { + # How many days have you had one or more new or unusual symptom? + # Free response + input_data$symp_n_days <- case_when( + input_data$B2b < 0 ~ NA_real_, + input_data$B2b > 1000 ~ NA_real_, + is.na(input_data$B2b) ~ NA_real_, + TRUE ~ as.integer(input_data$B2b) + ) + } else { + input_data$symp_n_days <- NA_real_ + } + + if ("A4" %in% names(input_data)) { + # How many additional people in your community do you know who are sick with fever + another symptom? + # Free response + input_data$community_number_sick <- case_when( + input_data$A4 < 0 ~ NA_real_, + input_data$A4 > 100 ~ NA_real_, + is.na(input_data$A4) ~ NA_real_, + TRUE ~ as.integer(input_data$A4) + ) + } else { + input_data$community_number_sick <- NA_real_ + } + # anosmia # Percentage of respondents experiencing anosmia # loss of taste or smell / # any B2 response From bca27e83104de8938dbd26b57153fec4bdfbb34e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 14 Jun 2022 16:35:01 -0400 Subject: [PATCH 18/49] define mean + percentiles calc function --- facebook/delphiFacebook/NAMESPACE | 4 +++ .../delphiFacebook/R/contingency_aggregate.R | 18 ++++++---- .../delphiFacebook/R/contingency_calculate.R | 34 +++++++++++++++++++ .../delphiFacebook/R/contingency_indicators.R | 8 ++--- .../delphiFacebook/R/contingency_variables.R | 26 +++++++------- .../man/compute_numeric_mean.Rd | 28 +++++++++++++++ 6 files changed, 96 insertions(+), 22 deletions(-) create mode 100644 facebook/delphiFacebook/man/compute_numeric_mean.Rd diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index 47752e3b4..7846002a4 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -121,6 +121,10 @@ importFrom(stringi,stri_split) importFrom(stringi,stri_sub) importFrom(stringi,stri_trans_tolower) importFrom(stringi,stri_trim) +importFrom(survey,oldsvyquantile) +importFrom(survey,svydesign) +importFrom(survey,svymean) +importFrom(survey,svyvar) importFrom(tibble,add_column) importFrom(tibble,tribble) importFrom(utils,tail) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index 5380ecbe5..fb2b8fe98 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -78,19 +78,18 @@ produce_aggregates <- function(df, aggregations, cw_list, params) { ## "effective_sample_size", "represented"), add here. # If these names change (e.g. `sample_size` to `n`), update # `contingency-combine.R`. - keep_vars <- c("val", "se", "sample_size", "represented") - + keep_vars <- c("val", "se", "sd", "p25", "p50", "p75", "sample_size", "represented") for (agg_id in names(dfs_out)) { if (nrow(dfs_out[[agg_id]]) == 0) { dfs_out[[agg_id]] <- NULL next } agg_metric <- aggregations$name[aggregations$id == agg_id] - map_old_new_names <- keep_vars - names(map_old_new_names) <- paste(keep_vars, agg_metric, sep="_") - + + tmp_keep_vars <- intersect(keep_vars, names(dfs_out[[agg_id]])) + names(tmp_keep_vars) <- paste(tmp_keep_vars, agg_metric, sep="_") dfs_out[[agg_id]] <- rename( - dfs_out[[agg_id]][, c(agg_group, keep_vars)], all_of(map_old_new_names)) + dfs_out[[agg_id]][, c(agg_group, tmp_keep_vars)], all_of(tmp_keep_vars)) } if ( length(dfs_out) != 0 ) { @@ -366,6 +365,13 @@ summarize_aggregations_group <- function(group_df, aggregations, target_group, g dfs_out[[aggregation]]$sample_size <- sample_size dfs_out[[aggregation]]$effective_sample_size <- new_row$effective_sample_size dfs_out[[aggregation]]$represented <- new_row$represented + + if (all(c("sd", "p25", "p50", "p75") %in% names(new_row))) { + dfs_out[[aggregation]]$sd <- new_row$sd + dfs_out[[aggregation]]$p25 <- new_row$p25 + dfs_out[[aggregation]]$p50 <- new_row$p50 + dfs_out[[aggregation]]$p75 <- new_row$p75 + } } } diff --git a/facebook/delphiFacebook/R/contingency_calculate.R b/facebook/delphiFacebook/R/contingency_calculate.R index 12727e794..229611ce5 100644 --- a/facebook/delphiFacebook/R/contingency_calculate.R +++ b/facebook/delphiFacebook/R/contingency_calculate.R @@ -104,3 +104,37 @@ post_convert_count_to_pct <- function(df) { return(mutate(df, val = 100 * .data$val / sum(.data$val, na.rm=TRUE))) } + +#' Return numeric response estimates. Val is the mean of a numeric vector. +#' +#' This function takes vectors as input and computes the response values +#' (a point estimate named "val" and 25, 50, and 75th percentiles). +#' +#' @param response a vector of multiple choice responses +#' @param weight a vector of sample weights for inverse probability weighting; +#' invariant up to a scaling factor +#' @param sample_size The sample size to use, which may be a non-integer (as +#' responses from ZIPs that span geographical boundaries are weighted +#' proportionately, and survey weights may also be applied) +#' @param total_represented Number of people represented in sample, which may +#' be a non-integer +#' +#' @return a list of named mean and other descriptive statistics +#' +#' @importFrom survey svydesign svymean svyvar oldsvyquantile +compute_numeric_mean <- function(response, weight, sample_size, total_represented) +{ + assert(length(response) == length(weight)) + + design <- svydesign(id = ~1, weight = ~weight, data = data.frame(response, weight)) + return(list(val = as.data.frame(svymean(~response, na.rm = TRUE, design = design))[,"mean"], + se = NA_real_, + sd = as.data.frame(sqrt(svyvar(~response, na.rm = TRUE, design = design)))[,"variance"], + p25 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.25))[,"0.25"], + p50 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.5))[,"0.5"], + p75 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.75))[,"0.75"], + sample_size = sample_size, + effective_sample_size = sample_size, + represented = total_represented + )) +} diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index b9d8bccfa..86af04c61 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -544,10 +544,10 @@ get_aggs <- function() { "pct_school_safety_measures_cafeteria", "s_school_safety_measures_cafeteria", compute_binary, jeffreys_binary, "pct_school_safety_measures_dont_know", "s_school_safety_measures_dont_know", compute_binary, jeffreys_binary, - # Means - "mean_days_symptoms", "symp_n_days", compute_mean, I, - "mean_ppl_symptoms_household", "hh_number_sick", compute_mean, I, - "mean_ppl_symptoms_community", "community_number_sick", compute_mean, I + # Means. No post-processing required. + "mean_days_symptoms", "symp_n_days", compute_numeric_mean, I, + "mean_ppl_symptoms_household", "hh_number_sick", compute_numeric_mean, I, + "mean_ppl_symptoms_community", "community_number_sick", compute_numeric_mean, I ) aggs <- create_aggs_product(regions, groups, indicators) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 1af2da773..458ef0364 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -954,27 +954,29 @@ code_addl_symptoms <- function(input_data, wave) { if ("B2b" %in% names(input_data)) { # How many days have you had one or more new or unusual symptom? # Free response + suppressWarnings({ B2b_int <- as.integer(input_data$B2b) }) input_data$symp_n_days <- case_when( - input_data$B2b < 0 ~ NA_real_, - input_data$B2b > 1000 ~ NA_real_, - is.na(input_data$B2b) ~ NA_real_, - TRUE ~ as.integer(input_data$B2b) - ) + B2b_int < 0 ~ NA_integer_, + B2b_int > 1000 ~ NA_integer_, + is.na(B2b_int) ~ NA_integer_, + TRUE ~ B2b_int + ) } else { - input_data$symp_n_days <- NA_real_ + input_data$symp_n_days <- NA_integer_ } if ("A4" %in% names(input_data)) { # How many additional people in your community do you know who are sick with fever + another symptom? # Free response + suppressWarnings({ A4_int <- as.integer(input_data$A4) }) input_data$community_number_sick <- case_when( - input_data$A4 < 0 ~ NA_real_, - input_data$A4 > 100 ~ NA_real_, - is.na(input_data$A4) ~ NA_real_, - TRUE ~ as.integer(input_data$A4) - ) + A4_int < 0 ~ NA_integer_, + A4_int > 100 ~ NA_integer_, + is.na(A4_int) ~ NA_integer_, + TRUE ~ A4_int + ) } else { - input_data$community_number_sick <- NA_real_ + input_data$community_number_sick <- NA_integer_ } # anosmia diff --git a/facebook/delphiFacebook/man/compute_numeric_mean.Rd b/facebook/delphiFacebook/man/compute_numeric_mean.Rd new file mode 100644 index 000000000..a714804d0 --- /dev/null +++ b/facebook/delphiFacebook/man/compute_numeric_mean.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/contingency_calculate.R +\name{compute_numeric_mean} +\alias{compute_numeric_mean} +\title{Return numeric response estimates. Val is the mean of a numeric vector.} +\usage{ +compute_numeric_mean(response, weight, sample_size, total_represented) +} +\arguments{ +\item{response}{a vector of multiple choice responses} + +\item{weight}{a vector of sample weights for inverse probability weighting; +invariant up to a scaling factor} + +\item{sample_size}{The sample size to use, which may be a non-integer (as +responses from ZIPs that span geographical boundaries are weighted +proportionately, and survey weights may also be applied)} + +\item{total_represented}{Number of people represented in sample, which may +be a non-integer} +} +\value{ +a list of named mean and other descriptive statistics +} +\description{ +This function takes vectors as input and computes the response values +(a point estimate named "val" and 25, 50, and 75th percentiles). +} From cf2ef612ca8b9fee3359bc717b68e7b8947adbe4 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 15 Jun 2022 13:37:42 -0400 Subject: [PATCH 19/49] test mean calculation --- facebook/delphiFacebook/DESCRIPTION | 3 ++- .../delphiFacebook/R/contingency_calculate.R | 3 +-- .../testthat/test-contingency-calculate.R | 21 +++++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index ebc5011e8..51ad1e74b 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -21,7 +21,8 @@ Imports: data.table, tibble, purrr, - Rcpp + Rcpp, + survey Suggests: knitr (>= 1.15), rmarkdown (>= 1.4), diff --git a/facebook/delphiFacebook/R/contingency_calculate.R b/facebook/delphiFacebook/R/contingency_calculate.R index 229611ce5..a5ff70676 100644 --- a/facebook/delphiFacebook/R/contingency_calculate.R +++ b/facebook/delphiFacebook/R/contingency_calculate.R @@ -122,8 +122,7 @@ post_convert_count_to_pct <- function(df) { #' @return a list of named mean and other descriptive statistics #' #' @importFrom survey svydesign svymean svyvar oldsvyquantile -compute_numeric_mean <- function(response, weight, sample_size, total_represented) -{ +compute_numeric_mean <- function(response, weight, sample_size, total_represented) { assert(length(response) == length(weight)) design <- svydesign(id = ~1, weight = ~weight, data = data.frame(response, weight)) diff --git a/facebook/delphiFacebook/unit-tests/testthat/test-contingency-calculate.R b/facebook/delphiFacebook/unit-tests/testthat/test-contingency-calculate.R index 0d79c0f62..834554b9a 100644 --- a/facebook/delphiFacebook/unit-tests/testthat/test-contingency-calculate.R +++ b/facebook/delphiFacebook/unit-tests/testthat/test-contingency-calculate.R @@ -14,3 +14,24 @@ test_that("compute_multiple_choice returns people represented in group", { out <- compute_multiple_choice(response, weight, sample_size, 70.3) expect_identical(out, expected_output) }) + +test_that("compute_numeric_mean returns correct mean and percentiles in unweighted case", { + response <- c(1, 2, 5, 1, 5) + weight <- rep(1, 5) + sample_size <- 5 + total_represented <- 5000 + + # Use linear interpolation. + quantiles <- quantile(response, probs = c(0.25, 0.5, 0.75), type=4) + expected_output <- list(val = mean(response), + se = NA_real_, + sd = sd(response), + p25 = quantiles[["25%"]], + p50 = quantiles[["50%"]], + p75 = quantiles[["75%"]], + sample_size = sample_size, + effective_sample_size = sample_size, + represented = total_represented) + out <- compute_numeric_mean(response, weight, sample_size, total_represented) + expect_identical(out, expected_output) +}) From 7148e84baf5002f77d826fdaf8647f933dae944b Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 15 Jun 2022 14:55:46 -0400 Subject: [PATCH 20/49] move new mental health inds to contingency-only func --- .../delphiFacebook/R/contingency_variables.R | 51 +++++++++++++++++++ facebook/delphiFacebook/R/responses.R | 1 + facebook/delphiFacebook/R/variables.R | 22 -------- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 458ef0364..72d7860cf 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1206,6 +1206,57 @@ code_behaviors <- function(input_data, wave) { return(input_data) } +#' Additional mental health indicators +#' +#' @param input_data input data frame of raw survey data +#' @param wave integer indicating survey version +#' +#' @return augmented data frame +code_addl_mental_health <- function(input_data, wave) { + input_data$mh_some_anxious <- NA + input_data$mh_some_anxious_7d <- NA + input_data$mh_some_depressed <- NA + input_data$mh_some_depressed_7d <- NA + input_data$mh_some_isolated <- NA + input_data$mh_some_isolated_7d <- NA + input_data$mh_very_worried_finances <- NA + + if (wave >= 4 && wave < 10) { + # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time + input_data$mh_some_anxious <- input_data$C8_1 == 3 | input_data$C8_1 == 4 | input_data$C8_1 == 2 + input_data$mh_some_depressed <- input_data$C8_2 == 3 | input_data$C8_2 == 4 | input_data$C8_2 == 2 + input_data$mh_some_isolated <- input_data$C8_3 == 3 | input_data$C8_3 == 4 | input_data$C8_3 == 2 + # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all + input_data$mh_very_worried_finances <- input_data$C15 == 1 + } else if (wave == 10) { + # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time + input_data$mh_some_anxious_7d <- input_data$C8a_1 == 3 | input_data$C8a_1 == 4 | input_data$C8a_1 == 2 + input_data$mh_some_depressed_7d <- input_data$C8a_2 == 3 | input_data$C8a_2 == 4 | input_data$C8a_2 == 2 + input_data$mh_some_isolated_7d <- input_data$C8a_3 == 3 | input_data$C8a_3 == 4 | input_data$C8a_3 == 2 + # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all + input_data$mh_very_worried_finances <- input_data$C15 == 1 + } else if (wave >= 11) { + # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time + input_data$mh_some_anxious_7d <- input_data$C18a == 3 | input_data$C18a == 4 | input_data$C18a == 2 + input_data$mh_some_depressed_7d <- input_data$C18b == 3 | input_data$C18b == 4 | input_data$C18b == 2 + # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all + input_data$mh_very_worried_finances <- input_data$C15 == 1 + } + + if ("Q36" %in% names(input_data)) { + # Included in waves 1, 2, 3. Coded as 1 = substantial threat, + # 2 = moderate threat, 3 = not much of a threat, 4 = not a threat at all + input_data$mh_financial_threat <- case_when( + is.na(input_data$Q36) ~ NA, + input_data$Q36 == 1 ~ TRUE, + TRUE ~ FALSE) + } else { + input_data$mh_financial_threat <- NA + } + + return(input_data) +} + #' Activities #' #' @param input_data input data frame of raw survey data diff --git a/facebook/delphiFacebook/R/responses.R b/facebook/delphiFacebook/R/responses.R index c2aae5981..c5f4a8032 100644 --- a/facebook/delphiFacebook/R/responses.R +++ b/facebook/delphiFacebook/R/responses.R @@ -245,6 +245,7 @@ load_response_one <- function(input_filename, params, contingency_run) { input_data <- code_vaccine_barriers(input_data, wave) input_data <- code_behaviors(input_data, wave) input_data <- code_addl_activities(input_data, wave) + input_data <- code_addl_mental_health(input_data, wave) } return(input_data) diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index f52624e26..15a68a8a9 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -199,35 +199,24 @@ code_mental_health <- function(input_data, wave) { input_data$mh_worried_ill <- input_data$C9 == 1 | input_data$C9 == 2 # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time input_data$mh_anxious <- input_data$C8_1 == 3 | input_data$C8_1 == 4 - input_data$mh_some_anxious <- input_data$C8_1 == 3 | input_data$C8_1 == 4 | input_data$C8_1 == 2 input_data$mh_depressed <- input_data$C8_2 == 3 | input_data$C8_2 == 4 - input_data$mh_some_depressed <- input_data$C8_2 == 3 | input_data$C8_2 == 4 | input_data$C8_2 == 2 input_data$mh_isolated <- input_data$C8_3 == 3 | input_data$C8_3 == 4 - input_data$mh_some_isolated <- input_data$C8_3 == 3 | input_data$C8_3 == 4 | input_data$C8_3 == 2 # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all input_data$mh_worried_finances <- input_data$C15 == 1 | input_data$C15 == 2 - input_data$mh_very_worried_finances <- input_data$C15 == 1 } else if (wave == 10) { input_data$mh_worried_ill <- input_data$C9 == 1 | input_data$C9 == 2 # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time input_data$mh_anxious_7d <- input_data$C8a_1 == 3 | input_data$C8a_1 == 4 - input_data$mh_some_anxious_7d <- input_data$C8a_1 == 3 | input_data$C8a_1 == 4 | input_data$C8a_1 == 2 input_data$mh_depressed_7d <- input_data$C8a_2 == 3 | input_data$C8a_2 == 4 - input_data$mh_some_depressed_7d <- input_data$C8a_2 == 3 | input_data$C8a_2 == 4 | input_data$C8a_2 == 2 input_data$mh_isolated_7d <- input_data$C8a_3 == 3 | input_data$C8a_3 == 4 - input_data$mh_some_isolated_7d <- input_data$C8a_3 == 3 | input_data$C8a_3 == 4 | input_data$C8a_3 == 2 # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all input_data$mh_worried_finances <- input_data$C15 == 1 | input_data$C15 == 2 - input_data$mh_very_worried_finances <- input_data$C15 == 1 } else if (wave >= 11) { # All coded as 1 = none of the time, 2 = some of the time, 3 = most of the time, 4 = all of the time input_data$mh_anxious_7d <- input_data$C18a == 3 | input_data$C18a == 4 - input_data$mh_some_anxious_7d <- input_data$C18a == 3 | input_data$C18a == 4 | input_data$C18a == 2 input_data$mh_depressed_7d <- input_data$C18b == 3 | input_data$C18b == 4 - input_data$mh_some_depressed_7d <- input_data$C18b == 3 | input_data$C18b == 4 | input_data$C18b == 2 # Coded as 1 = very worried, 2 = somewhat worried, 3 = not too worried, 4 = not worried at all input_data$mh_worried_finances <- input_data$C15 == 1 | input_data$C15 == 2 - input_data$mh_very_worried_finances <- input_data$C15 == 1 } if ("G1" %in% names(input_data)) { @@ -241,17 +230,6 @@ code_mental_health <- function(input_data, wave) { } else { input_data$mh_worried_catch_covid <- NA } - - if ("Q36" %in% names(input_data)) { - # Included in waves 1, 2, 3. Coded as 1 = substantial threat, - # 2 = moderate threat, 3 = not much of a threat, 4 = not a threat at all - input_data$mh_financial_threat <- case_when( - is.na(input_data$Q36) ~ NA, - input_data$Q36 == 1 ~ TRUE, - TRUE ~ FALSE) - } else { - input_data$mh_financial_threat <- NA - } return(input_data) } From a6ede6b01ff5543b602a1ecb20a55b26fb1a25a3 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 15 Jun 2022 14:58:11 -0400 Subject: [PATCH 21/49] move new flu shot inds to contingency-only func --- .../delphiFacebook/R/contingency_variables.R | 21 +++++++++++++++++++ facebook/delphiFacebook/R/variables.R | 21 ------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 72d7860cf..75f035b9f 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -350,6 +350,27 @@ code_addl_vaccines <- function(input_data, wave) { input_data$t_reason_not_tested_none <- NA } +if ("C2" %in% names(input_data)) { + # Coded as 1 = "Yes", 2 = "No" + input_data$v_flu_vaccinated_1y <- input_data$C2 == 1 + } else { + input_data$v_flu_vaccinated_1y <- NA + } + + if ("C17" %in% names(input_data)) { + # Coded as 1 = "Yes", 4 = "No", 2 = "I don't know" + input_data$v_flu_vaccinated_june_2020 <- input_data$C17 == 1 + } else { + input_data$v_flu_vaccinated_june_2020 <- NA + } + + if ("C17a" %in% names(input_data)) { + # Coded as 1 = "Yes", 2 = "No", 3 = "I don't know" + input_data$v_flu_vaccinated_july_2020 <- input_data$C17a == 1 + } else { + input_data$v_flu_vaccinated_july_2020 <- NA + } + return(input_data) } diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 15a68a8a9..5695c6a45 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -992,27 +992,6 @@ code_vaccines <- function(input_data, wave) { input_data$v_vaccinated_booster_defno <- NA } - if ("C2" %in% names(input_data)) { - # Coded as 1 = "Yes", 2 = "No" - input_data$v_flu_vaccinated_1y <- input_data$C2 == 1 - } else { - input_data$v_flu_vaccinated_1y <- NA - } - - if ("C17" %in% names(input_data)) { - # Coded as 1 = "Yes", 4 = "No", 2 = "I don't know" - input_data$v_flu_vaccinated_june_2020 <- input_data$C17 == 1 - } else { - input_data$v_flu_vaccinated_june_2020 <- NA - } - - if ("C17a" %in% names(input_data)) { - # Coded as 1 = "Yes", 2 = "No", 3 = "I don't know" - input_data$v_flu_vaccinated_july_2020 <- input_data$C17a == 1 - } else { - input_data$v_flu_vaccinated_july_2020 <- NA - } - if ("C17b" %in% names(input_data)) { # Coded as 1 = "Yes", 2 = "No", 3 = "I don't know" input_data$v_flu_vaccinated_2021 <- input_data$C17b == 1 From fbb681b1d69b66fce4829f6997c534ea7d65a0c3 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:01:37 -0400 Subject: [PATCH 22/49] move vaccine incomplete reasons to contingency-only --- .../delphiFacebook/R/contingency_variables.R | 37 +++++++++++++++++++ facebook/delphiFacebook/R/variables.R | 37 ------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 75f035b9f..a71f57bc4 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -350,6 +350,43 @@ code_addl_vaccines <- function(input_data, wave) { input_data$t_reason_not_tested_none <- NA } +if ("V5d" %in% names(input_data)) { + # introduced in Wave 8, removed in Wave 11 + vaccine_incomplete_reasons <- split_options(input_data$V5d) + + input_data$v_vaccine_incomplete_sideeffect <- is_selected(vaccine_incomplete_reasons, "1") + input_data$v_vaccine_incomplete_allergic <- is_selected(vaccine_incomplete_reasons, "2") + input_data$v_vaccine_incomplete_wontwork <- is_selected(vaccine_incomplete_reasons, "3") + input_data$v_vaccine_incomplete_dontbelieve <- is_selected(vaccine_incomplete_reasons, "4") + input_data$v_vaccine_incomplete_dontlike <- is_selected(vaccine_incomplete_reasons, "5") + input_data$v_vaccine_incomplete_not_recommended <- is_selected(vaccine_incomplete_reasons, "6") + input_data$v_vaccine_incomplete_wait <- is_selected(vaccine_incomplete_reasons, "7") + input_data$v_vaccine_incomplete_otherpeople <- is_selected(vaccine_incomplete_reasons, "8") + input_data$v_vaccine_incomplete_cost <- is_selected(vaccine_incomplete_reasons, "9") + input_data$v_vaccine_incomplete_distrust_vaccine <- is_selected(vaccine_incomplete_reasons, "10") + input_data$v_vaccine_incomplete_distrust_gov <- is_selected(vaccine_incomplete_reasons, "11") + input_data$v_vaccine_incomplete_health <- is_selected(vaccine_incomplete_reasons, "12") + input_data$v_vaccine_incomplete_other <- is_selected(vaccine_incomplete_reasons, "13") + input_data$v_vaccine_incomplete_pregnant <- is_selected(vaccine_incomplete_reasons, "14") + input_data$v_vaccine_incomplete_religion <- is_selected(vaccine_incomplete_reasons, "15") + } else { + input_data$v_vaccine_incomplete_sideeffect <- NA_real_ + input_data$v_vaccine_incomplete_allergic <- NA_real_ + input_data$v_vaccine_incomplete_wontwork <- NA_real_ + input_data$v_vaccine_incomplete_dontbelieve <- NA_real_ + input_data$v_vaccine_incomplete_dontlike <- NA_real_ + input_data$v_vaccine_incomplete_not_recommended <- NA_real_ + input_data$v_vaccine_incomplete_wait <- NA_real_ + input_data$v_vaccine_incomplete_otherpeople <- NA_real_ + input_data$v_vaccine_incomplete_cost <- NA_real_ + input_data$v_vaccine_incomplete_distrust_vaccine <- NA_real_ + input_data$v_vaccine_incomplete_distrust_gov <- NA_real_ + input_data$v_vaccine_incomplete_health <- NA_real_ + input_data$v_vaccine_incomplete_other <- NA_real_ + input_data$v_vaccine_incomplete_pregnant <- NA_real_ + input_data$v_vaccine_incomplete_religion <- NA_real_ + } + if ("C2" %in% names(input_data)) { # Coded as 1 = "Yes", 2 = "No" input_data$v_flu_vaccinated_1y <- input_data$C2 == 1 diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 5695c6a45..ae4407b1d 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -653,43 +653,6 @@ code_vaccines <- function(input_data, wave) { input_data$v_hesitancy_reason_dislike_vaccines_generally <- NA_real_ } - if ("V5d" %in% names(input_data)) { - # introduced in Wave 8, removed in Wave 11 - vaccine_incomplete_reasons <- split_options(input_data$V5d) - - input_data$v_vaccine_incomplete_sideeffect <- is_selected(vaccine_incomplete_reasons, "1") - input_data$v_vaccine_incomplete_allergic <- is_selected(vaccine_incomplete_reasons, "2") - input_data$v_vaccine_incomplete_wontwork <- is_selected(vaccine_incomplete_reasons, "3") - input_data$v_vaccine_incomplete_dontbelieve <- is_selected(vaccine_incomplete_reasons, "4") - input_data$v_vaccine_incomplete_dontlike <- is_selected(vaccine_incomplete_reasons, "5") - input_data$v_vaccine_incomplete_not_recommended <- is_selected(vaccine_incomplete_reasons, "6") - input_data$v_vaccine_incomplete_wait <- is_selected(vaccine_incomplete_reasons, "7") - input_data$v_vaccine_incomplete_otherpeople <- is_selected(vaccine_incomplete_reasons, "8") - input_data$v_vaccine_incomplete_cost <- is_selected(vaccine_incomplete_reasons, "9") - input_data$v_vaccine_incomplete_distrust_vaccine <- is_selected(vaccine_incomplete_reasons, "10") - input_data$v_vaccine_incomplete_distrust_gov <- is_selected(vaccine_incomplete_reasons, "11") - input_data$v_vaccine_incomplete_health <- is_selected(vaccine_incomplete_reasons, "12") - input_data$v_vaccine_incomplete_other <- is_selected(vaccine_incomplete_reasons, "13") - input_data$v_vaccine_incomplete_pregnant <- is_selected(vaccine_incomplete_reasons, "14") - input_data$v_vaccine_incomplete_religion <- is_selected(vaccine_incomplete_reasons, "15") - } else { - input_data$v_vaccine_incomplete_sideeffect <- NA_real_ - input_data$v_vaccine_incomplete_allergic <- NA_real_ - input_data$v_vaccine_incomplete_wontwork <- NA_real_ - input_data$v_vaccine_incomplete_dontbelieve <- NA_real_ - input_data$v_vaccine_incomplete_dontlike <- NA_real_ - input_data$v_vaccine_incomplete_not_recommended <- NA_real_ - input_data$v_vaccine_incomplete_wait <- NA_real_ - input_data$v_vaccine_incomplete_otherpeople <- NA_real_ - input_data$v_vaccine_incomplete_cost <- NA_real_ - input_data$v_vaccine_incomplete_distrust_vaccine <- NA_real_ - input_data$v_vaccine_incomplete_distrust_gov <- NA_real_ - input_data$v_vaccine_incomplete_health <- NA_real_ - input_data$v_vaccine_incomplete_other <- NA_real_ - input_data$v_vaccine_incomplete_pregnant <- NA_real_ - input_data$v_vaccine_incomplete_religion <- NA_real_ - } - if ( "V6" %in% names(input_data) ) { # introduced in Wave 8 dontneed_reasons <- split_options(input_data$V6) From 4b6687e0fd236b3527dc3b1b990efc53ecaae321 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:29:21 -0400 Subject: [PATCH 23/49] test some alt masking inds --- .../delphiFacebook/R/contingency_indicators.R | 1 + facebook/delphiFacebook/R/variables.R | 11 +++++++--- .../delphiFacebook/man/code_mask_contact.Rd | 3 +-- .../unit-tests/testthat/test-variables.R | 20 +++++++++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 86af04c61..485cf28af 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -72,6 +72,7 @@ get_aggs <- function() { # behavior ## Mask wearing and distancing "pct_wearing_mask_5d", "c_mask_often", compute_binary, jeffreys_binary, + "pct_wearing_mask_5d_alt", "c_mask_some_often", compute_binary, jeffreys_binary, "pct_wearing_mask_7d", "c_mask_often_7d", compute_binary, jeffreys_binary, "pct_wearing_mask_7d_alt", "c_mask_some_often_7d", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index ae4407b1d..fb37e0d13 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -239,8 +239,7 @@ code_mental_health <- function(input_data, wave) { #' @param input_data input data frame of raw survey data #' @param wave integer indicating survey version #' -#' @return data frame augmented with `c_travel_state`, `c_work_outside_5d`, -#' `c_mask_often`, `c_others_masked` +#' @return augmented data frame code_mask_contact <- function(input_data, wave) { # private helper for both mask items, which are identically coded: 6 means the # respondent was not in public, 1 & 2 mean always/most, 3-5 mean some to none @@ -268,8 +267,15 @@ code_mask_contact <- function(input_data, wave) { # added in wave 4. wearing mask most or all of the time; exclude respondents # who have not been in public input_data$c_mask_often <- most_always(input_data$C14) + # Same indicator but include "sometimes" wear mask in public + input_data$c_mask_some_often <- case_when( + is.na(input_data$C14) ~ NA, + input_data$C14 == 6 ~ NA, + input_data$C14 == 1 | input_data$C14 == 2 | input_data$C14 == 3 ~ TRUE, + TRUE ~ FALSE) } else { input_data$c_mask_often <- NA + input_data$c_mask_some_often <- NA } if ("C14a" %in% names(input_data)) { @@ -282,7 +288,6 @@ code_mask_contact <- function(input_data, wave) { input_data$C14a == 6 ~ NA, input_data$C14a == 1 | input_data$C14a == 2 | input_data$C14a == 3 ~ TRUE, TRUE ~ FALSE) - } else { input_data$c_mask_often_7d <- NA input_data$c_mask_some_often_7d <- NA diff --git a/facebook/delphiFacebook/man/code_mask_contact.Rd b/facebook/delphiFacebook/man/code_mask_contact.Rd index ecb0b4a96..e376e328a 100644 --- a/facebook/delphiFacebook/man/code_mask_contact.Rd +++ b/facebook/delphiFacebook/man/code_mask_contact.Rd @@ -12,8 +12,7 @@ code_mask_contact(input_data, wave) \item{wave}{integer indicating survey version} } \value{ -data frame augmented with `c_travel_state`, `c_work_outside_5d`, - `c_mask_often`, `c_others_masked` +augmented data frame } \description{ Mask and contact variables diff --git a/facebook/delphiFacebook/unit-tests/testthat/test-variables.R b/facebook/delphiFacebook/unit-tests/testthat/test-variables.R index 741a109a6..43d6dc1d9 100644 --- a/facebook/delphiFacebook/unit-tests/testthat/test-variables.R +++ b/facebook/delphiFacebook/unit-tests/testthat/test-variables.R @@ -111,10 +111,15 @@ test_that("mask items correctly coded", { input_data$c_travel_state <- TRUE input_data$c_travel_state_7d <- NA input_data$c_mask_often <- c(NA, TRUE, FALSE, NA, TRUE, FALSE) + input_data$c_mask_some_often <- c(NA, TRUE, TRUE, NA, TRUE, FALSE) input_data$c_mask_often_7d <- NA + input_data$c_mask_some_often_7d <- NA input_data$c_others_masked <- c(TRUE, NA, NA, FALSE, TRUE, FALSE) + input_data$c_others_some_masked <- c(TRUE, NA, NA, TRUE, TRUE, FALSE) input_data$c_others_masked_public <- NA + input_data$c_others_masked_some_public <- NA input_data$c_others_distanced_public <- NA + input_data$c_others_distanced_some_public <- NA input_data$c_work_outside_5d <- NA expect_equal(out, input_data) @@ -131,10 +136,15 @@ test_that("mask items correctly coded", { input_data$c_travel_state <- TRUE input_data$c_travel_state_7d <- NA input_data$c_mask_often <- NA + input_data$c_mask_some_often <- NA input_data$c_mask_often_7d <- c(NA, TRUE, FALSE, NA, TRUE, FALSE) + input_data$c_mask_some_often_7d <- c(NA, TRUE, TRUE, NA, TRUE, FALSE) input_data$c_others_masked <- c(TRUE, NA, NA, FALSE, TRUE, FALSE) + input_data$c_others_some_masked <- c(TRUE, NA, NA, TRUE, TRUE, FALSE) input_data$c_others_masked_public <- NA + input_data$c_others_masked_some_public <- NA input_data$c_others_distanced_public <- NA + input_data$c_others_distanced_some_public <- NA input_data$c_work_outside_5d <- NA expect_equal(out, input_data) @@ -152,10 +162,15 @@ test_that("mask items correctly coded", { input_data$c_travel_state <- NA input_data$c_travel_state_7d <- TRUE input_data$c_mask_often <- c(NA, TRUE, FALSE, NA, TRUE, FALSE) + input_data$c_mask_some_often <- c(NA, TRUE, TRUE, NA, TRUE, FALSE) input_data$c_mask_often_7d <- NA + input_data$c_mask_some_often_7d <- NA input_data$c_others_masked <- c(TRUE, NA, NA, FALSE, TRUE, FALSE) + input_data$c_others_some_masked <- c(TRUE, NA, NA, TRUE, TRUE, FALSE) input_data$c_others_masked_public <- NA + input_data$c_others_masked_some_public <- NA input_data$c_others_distanced_public <- NA + input_data$c_others_distanced_some_public <- NA input_data$c_work_outside_5d <- NA expect_equal(out, input_data) @@ -174,10 +189,15 @@ test_that("mask items correctly coded", { input_data$c_travel_state <- NA input_data$c_travel_state_7d <- TRUE input_data$c_mask_often <- c(NA, TRUE, FALSE, NA, TRUE, FALSE) + input_data$c_mask_some_often <- c(NA, TRUE, TRUE, NA, TRUE, FALSE) input_data$c_mask_often_7d <- NA + input_data$c_mask_some_often_7d <- NA input_data$c_others_masked <- NA + input_data$c_others_some_masked <- NA input_data$c_others_masked_public <- c(FALSE, NA, NA, FALSE, FALSE, TRUE) + input_data$c_others_masked_some_public <- c(FALSE, NA, NA, TRUE, FALSE, TRUE) input_data$c_others_distanced_public <- c(FALSE, NA, NA, FALSE, FALSE, TRUE) + input_data$c_others_distanced_some_public <- c(FALSE, NA, NA, TRUE, FALSE, TRUE) input_data$c_work_outside_5d <- NA expect_equal(out, input_data) From ad23a3d27a9a346046c6e20eb2a76eb702878a7b Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:53:44 -0400 Subject: [PATCH 24/49] overall vaccine hesitancy --- facebook/delphiFacebook/R/contingency_indicators.R | 1 + facebook/delphiFacebook/R/contingency_variables.R | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 485cf28af..022b22cab 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -150,6 +150,7 @@ get_aggs <- function() { "pct_accept_vaccine_no_appointment", "v_accept_covid_vaccine_no_appointment", compute_binary, jeffreys_binary, "pct_appointment_or_accept_vaccine", "v_appointment_or_accept_covid_vaccine", compute_binary, jeffreys_binary, "pct_hesitant_vaccine", "v_hesitant_vaccine", compute_binary, jeffreys_binary, + "pct_overall_vaccine_hesitancy", "overall_vaccine_hesitancy", compute_binary, jeffreys_binary, "pct_vaccinated_or_accept", "v_covid_vaccinated_or_accept", compute_binary, jeffreys_binary, "pct_vaccinated_appointment_or_accept", "v_covid_vaccinated_appointment_or_accept", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index a71f57bc4..1eff641ab 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -238,6 +238,11 @@ code_addl_vaccines <- function(input_data, wave) { ) } + input_data$overall_vaccine_hesitancy <- coalesce( + !input_data$v_covid_vaccinated_or_accept, + !input_data$v_covid_vaccinated_appointment_or_accept + ) + # accept_vaccine_defyes # accept_vaccine_probyes # accept_vaccine_probno From 1b529a56ecc7829377ea4b63b30791853ccb59d2 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 17 Jun 2022 13:02:36 -0400 Subject: [PATCH 25/49] unusual symptom followup change meaning --- .../delphiFacebook/R/contingency_indicators.R | 10 +++++- .../delphiFacebook/R/contingency_variables.R | 35 +++++++++++++------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 022b22cab..8f60b06b9 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -403,8 +403,16 @@ get_aggs <- function() { "pct_ever_tested", "t_ever_tested", compute_binary, jeffreys_binary, "pct_unusual_symptom_tested", "t_unusual_symptom_tested", compute_binary, jeffreys_binary, + "pct_unusual_symptom_tested_positive", "t_unusual_symptom_tested_positive", compute_binary, jeffreys_binary, "pct_unusual_symptom_hospital", "t_unusual_symptom_hospital", compute_binary, jeffreys_binary, - "pct_unusual_symptom_medical_care", "t_unusual_symptom_medical_care", compute_binary, jeffreys_binary, + + "pct_unusual_symptom_medical_care_called_doctor", "unusual_symptom_medical_care_called_doctor", compute_binary, jeffreys_binary, + "pct_unusual_symptom_medical_care_telemedicine", "unusual_symptom_medical_care_telemedicine", compute_binary, jeffreys_binary, + "pct_unusual_symptom_medical_care_visited_doctor", "unusual_symptom_medical_care_visited_doctor", compute_binary, jeffreys_binary, + "pct_unusual_symptom_medical_care_urgent_care", "unusual_symptom_medical_care_urgent_care", compute_binary, jeffreys_binary, + "pct_unusual_symptom_medical_care_er", "unusual_symptom_medical_care_er", compute_binary, jeffreys_binary, + "pct_unusual_symptom_medical_care_hospital", "unusual_symptom_medical_care_hospital", compute_binary, jeffreys_binary, + "pct_unusual_symptom_medical_care_tried", "unusual_symptom_medical_care_tried", compute_binary, jeffreys_binary, "pct_reason_not_tested_tried", "t_reason_not_tested_tried", compute_binary, jeffreys_binary, "pct_reason_not_tested_appointment", "t_reason_not_tested_appointment", compute_binary, jeffreys_binary, diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 1eff641ab..c3bd1d1eb 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -302,21 +302,24 @@ code_addl_vaccines <- function(input_data, wave) { } if ("B5" %in% names(input_data)) { + # Coded as 1 = "tested and COVID+", 2 = "tested and COVID-", + # 3 = "tested, but no result yet", 4 = "tried to get tested but couldn't", + # 5 = "didn't try to get tested" + # Regardless of test result input_data$t_unusual_symptom_tested <- case_when( input_data$B5 %in% c(1, 2, 3) ~ 1, input_data$B5 %in% c(4, 5) ~ 0, TRUE ~ NA_real_ ) + # Tested with positive result + input_data$t_unusual_symptom_tested_positive <- input_data$B5 == 1 } else { input_data$t_unusual_symptom_tested <- NA + input_data$t_unusual_symptom_tested_positive <- NA } if ("B6" %in% names(input_data)) { - input_data$t_unusual_symptom_hospital <- case_when( - input_data$B6 %in% c(1, 3) ~ 1, - input_data$B6 %in% c(2) ~ 0, - TRUE ~ NA_real_ - ) + input_data$t_unusual_symptom_hospital <- input_data$B6 == 1 } else { input_data$t_unusual_symptom_hospital <- NA } @@ -324,13 +327,23 @@ code_addl_vaccines <- function(input_data, wave) { if ("B7" %in% names(input_data)) { # Coded as 8 = no medical care sought, 1-6 = various types of medical care sought, # 7 = care sought but not received - input_data$t_unusual_symptom_medical_care <- case_when( - input_data$B7 == "8" ~ 0, - !is.na(input_data$B7) ~ 1, - TRUE ~ NA_real_ - ) + unusual_symptoms_care <- split_options(input_data$B7) + + input_data$unusual_symptom_medical_care_called_doctor <- is_selected(unusual_symptoms_care, "1") + input_data$unusual_symptom_medical_care_telemedicine <- is_selected(unusual_symptoms_care, "2") + input_data$unusual_symptom_medical_care_visited_doctor <- is_selected(unusual_symptoms_care, "3") + input_data$unusual_symptom_medical_care_urgent_care <- is_selected(unusual_symptoms_care, "4") + input_data$unusual_symptom_medical_care_er <- is_selected(unusual_symptoms_care, "5") + input_data$unusual_symptom_medical_care_hospital <- is_selected(unusual_symptoms_care, "6") + input_data$unusual_symptom_medical_care_tried <- is_selected(unusual_symptoms_care, "7") } else { - input_data$t_unusual_symptom_medical_care <- NA + input_data$unusual_symptom_medical_care_called_doctor <- NA + input_data$unusual_symptom_medical_care_telemedicine <- NA + input_data$unusual_symptom_medical_care_visited_doctor <- NA + input_data$unusual_symptom_medical_care_urgent_care <- NA + input_data$unusual_symptom_medical_care_er <- NA + input_data$unusual_symptom_medical_care_hospital <- NA + input_data$unusual_symptom_medical_care_tried <- NA } if ( "B12a" %in% names(input_data) ) { From 5ef3105a3f6ec9b3e21f6b9cbc15b69ff521e46e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:13:09 -0400 Subject: [PATCH 26/49] calc more demographics make postprocessing multinomial --- .../delphiFacebook/R/contingency_indicators.R | 118 +++++++++- .../delphiFacebook/R/contingency_variables.R | 219 +++++++++++++++++- facebook/delphiFacebook/R/responses.R | 1 + .../man/code_addl_demographic.Rd | 19 ++ .../man/code_addl_mental_health.Rd | 19 ++ .../delphiFacebook/man/code_addl_symptoms.Rd | 2 +- .../delphiFacebook/man/code_addl_vaccines.Rd | 2 +- .../man/code_attempt_vaccine.Rd | 2 +- facebook/delphiFacebook/man/code_trust.Rd | 2 +- .../man/code_vaccine_barriers.Rd | 2 +- 10 files changed, 373 insertions(+), 13 deletions(-) create mode 100644 facebook/delphiFacebook/man/code_addl_demographic.Rd create mode 100644 facebook/delphiFacebook/man/code_addl_mental_health.Rd diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 8f60b06b9..5c7b936eb 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -626,9 +626,121 @@ get_aggs <- function() { ### Combine full set and additional original tables. aggs <- rbind(aggs, cut1_aggs, cut2_aggs, cut3_aggs, cut456_aggs, cut456_marginal_aggs) - - weekly_aggs <- aggs - monthly_aggs <- rbind(aggs, monthly_aggs) + + + ### Demographic variables. Include in "overall" cuts only. + demo_groups <- list(c()) + demo_indicators <- tribble( + ~name, ~metric, ~compute_fn, ~post_fn, + "pct_gender_male", "gender_male", compute_binary, jeffreys_multinomial_factory(3), + "pct_gender_female", "gender_female", compute_binary, jeffreys_multinomial_factory(3), + "pct_gender_nonbinary_other", "gender_nonbinary_other", compute_binary, jeffreys_multinomial_factory(3), + + "pct_age_18_24", "age_18_24", compute_binary, jeffreys_multinomial_factory(7), + "pct_age_25_34", "age_25_34", compute_binary, jeffreys_multinomial_factory(7), + "pct_age_35_44", "age_35_44", compute_binary, jeffreys_multinomial_factory(7), + "pct_age_45_54", "age_45_54", compute_binary, jeffreys_multinomial_factory(7), + "pct_age_55_64", "age_55_64", compute_binary, jeffreys_multinomial_factory(7), + "pct_age_65_74", "age_65_74", compute_binary, jeffreys_multinomial_factory(7), + "pct_age_75_older", "age_75_older", compute_binary, jeffreys_multinomial_factory(7), + + "pct_hispanic_latino", "hispanic", compute_binary, jeffreys_binary, + + "pct_race_american_indian_alaska_native", "race_american_indian_alaska_native", compute_binary, jeffreys_multinomial_factory(6), + "pct_race_asian", "race_asian", compute_binary, jeffreys_multinomial_factory(6), + "pct_race_black_african_american", "race_black_african_american", compute_binary, jeffreys_multinomial_factory(6), + "pct_race_native_hawaiian_pacific_islander", "race_native_hawaiian_pacific_islander", compute_binary, jeffreys_multinomial_factory(6), + "pct_race_white", "race_white", compute_binary, jeffreys_multinomial_factory(6), + "pct_race_multiple_other", "race_multiple_other", compute_binary, jeffreys_multinomial_factory(6), + + "pct_education_less_than_highschool", "education_less_than_highschool", compute_binary, jeffreys_multinomial_factory(9), + "pct_education_highschool_or_equivalent", "education_highschool_or_equivalent", compute_binary, jeffreys_multinomial_factory(9), + "pct_education_some_college", "education_some_college", compute_binary, jeffreys_multinomial_factory(9), + "pct_education_2yr_degree", "education_2yr_degree", compute_binary, jeffreys_multinomial_factory(9), + "pct_education_4yr_degree", "education_4yr_degree", compute_binary, jeffreys_multinomial_factory(9), + "pct_education_masters", "education_masters", compute_binary, jeffreys_multinomial_factory(9), + "pct_education_professional_degree", "education_professional_degree", compute_binary, jeffreys_multinomial_factory(9), + "pct_education_doctorate", "education_doctorate", compute_binary, jeffreys_multinomial_factory(9), + + "pct_language_home_english", "language_home_english", compute_binary, jeffreys_multinomial_factory(7), + "pct_language_home_spanish", "language_home_spanish", compute_binary, jeffreys_multinomial_factory(7), + "pct_language_home_chinese", "language_home_chinese", compute_binary, jeffreys_multinomial_factory(7), + "pct_language_home_vietnamese", "language_home_vietnamese", compute_binary, jeffreys_multinomial_factory(7), + "pct_language_home_french", "language_home_french", compute_binary, jeffreys_multinomial_factory(7), + "pct_language_home_portuguese", "language_home_portuguese", compute_binary, jeffreys_multinomial_factory(7), + "pct_language_home_other", "language_home_other", compute_binary, jeffreys_multinomial_factory(7), + + "pct_work_for_pay_4w", "a_work_for_pay_4w", compute_binary, jeffreys_binary, + + "pct_condition_asthma", "comorbid_asthma", compute_binary, jeffreys_binary, + "pct_condition_lung", "comorbidlungdisease", compute_binary, jeffreys_binary, + "pct_condition_cancer", "comorbidcancer", compute_binary, jeffreys_binary, + "pct_condition_diabetes", "comorbiddiabetes", compute_binary, jeffreys_binary, + "pct_condition_hbp", "comorbid_high_blood_pressure", compute_binary, jeffreys_binary, + "pct_condition_kidney", "comorbidkidneydisease", compute_binary, jeffreys_binary, + "pct_condition_immune", "comorbid_autoimmune", compute_binary, jeffreys_binary, + "pct_condition_cvd", "comorbidheartdisease", compute_binary, jeffreys_binary, + "pct_condition_obesity", "comorbidobese", compute_binary, jeffreys_binary, + "pct_condition_none", "comorbid_none", compute_binary, jeffreys_binary, + + "pct_pregnant", "pregnant", compute_binary, jeffreys_binary, + + "pct_smoke", "smoker", compute_binary, jeffreys_binary, + + "pct_children_prek", "children_prek", compute_binary, jeffreys_binary, + "pct_children_gr1_5", "children_gr1_5", compute_binary, jeffreys_binary, + "pct_children_gr6_8", "children_gr6_8", compute_binary, jeffreys_binary, + "pct_children_gr9_12", "children_gr9_12", compute_binary, jeffreys_binary, + + # Already in main grouping, including "overall". Just need to make sure to include in demo/parenting tables. + # "pct_inperson_school_fulltime", "s_inperson_school_fulltime", compute_binary, jeffreys_binary, + # "pct_inperson_school_parttime", "s_inperson_school_parttime", compute_binary, jeffreys_binary, + # "pct_inperson_school_fulltime_oldest", "s_inperson_school_fulltime_oldest", compute_binary, jeffreys_binary, + # "pct_remote_school_fulltime_oldest", "s_remote_school_fulltime_oldest", compute_binary, jeffreys_binary, + # "pct_inperson_school_parttime_oldest", "s_inperson_school_parttime_oldest", compute_binary, jeffreys_binary, + + "pct_children_school_measure_mask_students", "children_school_measure_mask_students", compute_binary, jeffreys_binary, + "pct_children_school_measure_mask_teachers", "children_school_measure_mask_teachers", compute_binary, jeffreys_binary, + "pct_children_school_measure_same_teacher", "children_school_measure_same_teacher", compute_binary, jeffreys_binary, + "pct_children_school_measure_same_students", "children_school_measure_same_students", compute_binary, jeffreys_binary, + "pct_children_school_measure_outdoor", "children_school_measure_outdoor", compute_binary, jeffreys_binary, + "pct_children_school_measure_entry", "children_school_measure_entry", compute_binary, jeffreys_binary, + "pct_children_school_measure_class_size", "children_school_measure_class_size", compute_binary, jeffreys_binary, + "pct_children_school_measure_cafeteria", "children_school_measure_cafeteria", compute_binary, jeffreys_binary, + "pct_children_school_measure_playground", "children_school_measure_playground", compute_binary, jeffreys_binary, + "pct_children_school_measure_desk_shield", "children_school_measure_desk_shield", compute_binary, jeffreys_binary, + "pct_children_school_measure_desk_space", "children_school_measure_desk_space", compute_binary, jeffreys_binary, + "pct_children_school_measure_extracurricular", "children_school_measure_extracurricular", compute_binary, jeffreys_binary, + "pct_children_school_measure_supplies", "children_school_measure_supplies", compute_binary, jeffreys_binary, + "pct_children_school_measure_screening", "children_school_measure_screening", compute_binary, jeffreys_binary, + + "pct_occ_4w_social", "occ_4w_social", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_education", "occ_4w_education", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_arts", "occ_4w_arts", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_health_prac", "occ_4w_health_prac", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_health_support", "occ_4w_health_support", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_protective", "occ_4w_protective", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_food", "occ_4w_food", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_building", "occ_4w_building", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_personal", "occ_4w_personal", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_sales", "occ_4w_sales", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_admin", "occ_4w_admin", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_construction", "occ_4w_construction", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_maintenance", "occ_4w_maintenance", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_production", "occ_4w_production", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_transportation", "occ_4w_transportation", compute_binary, jeffreys_multinomial_factory(16), + "pct_occ_4w_other", "occ_4w_other", compute_binary, jeffreys_multinomial_factory(16), + + "pct_", "", compute_binary, jeffreys_binary, + ) + demo_aggs <- create_aggs_product( + regsions, + demo_groups, + demo_indicators + ) + + weekly_aggs <- rbind(aggs, demo_aggs) + monthly_aggs <- rbind(aggs, monthly_aggs, demo_aggs) return(list("week"=weekly_aggs, "month"=monthly_aggs)) } diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index c3bd1d1eb..34af08468 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -39,8 +39,42 @@ code_occupation <- function(input_data, wave) { input_data$Q64 == 16 ~ "Other", TRUE ~ NA_character_ ) + + input_data$occ_4w_social <- input_data$Q64 == 1 + input_data$occ_4w_education <- input_data$Q64 == 2 + input_data$occ_4w_arts <- input_data$Q64 == 3 + input_data$occ_4w_health_prac <- input_data$Q64 == 4 + input_data$occ_4w_health_support <- input_data$Q64 == 5 + input_data$occ_4w_protective <- input_data$Q64 == 6 + input_data$occ_4w_food <- input_data$Q64 == 7 + input_data$occ_4w_building <- input_data$Q64 == 8 + input_data$occ_4w_personal <- input_data$Q64 == 9 + input_data$occ_4w_sales <- input_data$Q64 == 10 + input_data$occ_4w_admin <- input_data$Q64 == 11 + input_data$occ_4w_construction <- input_data$Q64 == 12 + input_data$occ_4w_maintenance <- input_data$Q64 == 13 + input_data$occ_4w_production <- input_data$Q64 == 14 + input_data$occ_4w_transportation <- input_data$Q64 == 15 + input_data$occ_4w_other <- input_data$Q64 == 16 } else { input_data$occupation <- NA_character_ + + input_data$occ_4w_social <- NA + input_data$occ_4w_education <- NA + input_data$occ_4w_arts <- NA + input_data$occ_4w_health_prac <- NA + input_data$occ_4w_health_support <- NA + input_data$occ_4w_protective <- NA + input_data$occ_4w_food <- NA + input_data$occ_4w_building <- NA + input_data$occ_4w_personal <- NA + input_data$occ_4w_sales <- NA + input_data$occ_4w_admin <- NA + input_data$occ_4w_construction <- NA + input_data$occ_4w_maintenance <- NA + input_data$occ_4w_production <- NA + input_data$occ_4w_transportation <- NA + input_data$occ_4w_other <- NA } return(input_data) @@ -117,6 +151,8 @@ code_health <- function(input_data, wave) { comorbidities <- split_options(input_data$C1) input_data$comorbidheartdisease <- is_selected(comorbidities, "3") + input_data$comorbid_high_blood_pressure <- is_selected(comorbidities, "5") + input_data$comorbid_asthma <- is_selected(comorbidities, "5") input_data$comorbidcancer <- is_selected(comorbidities, "2") input_data$comorbidkidneydisease <- is_selected(comorbidities, "7") input_data$comorbidlungdisease <- is_selected(comorbidities, "6") @@ -125,7 +161,9 @@ code_health <- function(input_data, wave) { is_selected(comorbidities, "12") | is_selected(comorbidities, "10") input_data$comorbidimmuno <- is_selected(comorbidities, "11") + input_data$comorbid_autoimmune <- is_selected(comorbidities, "8") input_data$comorbidobese <- is_selected(comorbidities, "13") + input_data$comorbid_none <- is_selected(comorbidities, "9") # Combo vaccine-eligibility input_data$eligible <- @@ -145,6 +183,10 @@ code_health <- function(input_data, wave) { input_data$comorbidimmuno <- NA input_data$comorbidobese <- NA input_data$eligible <- NA + input_data$comorbid_high_blood_pressure <- NA + input_data$comorbid_asthma <- NA + input_data$comorbid_none <- NA + input_data$comorbid_autoimmune <- NA } # Combo vaccine-eligibility updated to include smoking, pregnant, and obesity @@ -202,7 +244,7 @@ code_vaccinated_breakdown <- function(input_data, wave) { #' @param input_data input data frame of raw survey data #' @param wave integer indicating survey version #' -#' @return data frame augmented with demographic grouping variables +#' @return augmented data frame code_addl_vaccines <- function(input_data, wave) { ## Items V3 and V4 display logic was changed mid-wave 6 to be shown only to ## respondents indicated that they had not been vaccinated. For the purposes @@ -434,7 +476,7 @@ if ("C2" %in% names(input_data)) { #' @param input_data input data frame of raw survey data #' @param wave integer indicating survey version #' -#' @return data frame augmented with demographic grouping variables +#' @return augmented data frame code_trust <- function(input_data, wave) { # Drop values in vaccine_likely_ prior to item change date in Wave 6 # Percentage more likely to get vaccinated if recommended by @@ -606,7 +648,7 @@ code_trust <- function(input_data, wave) { #' @param input_data input data frame of raw survey data #' @param wave integer indicating survey version #' -#' @return data frame augmented with demographic grouping variables +#' @return augmented data frame code_vaccine_barriers <- function(input_data, wave) { # hesitant_worried_vaccine_sideeffects # Percentage very or moderately concerned about side effects among those who @@ -970,7 +1012,7 @@ code_vaccine_barriers <- function(input_data, wave) { #' @param input_data input data frame of raw survey data #' @param wave integer indicating survey version #' -#' @return data frame augmented with demographic grouping variables +#' @return augmented data frame code_attempt_vaccine <- function(input_data, wave) { # informed_access # Percentage of respondents who are very or moderately informed about how to @@ -1025,7 +1067,7 @@ code_attempt_vaccine <- function(input_data, wave) { #' @param input_data input data frame of raw survey data #' @param wave integer indicating survey version #' -#' @return data frame augmented with demographic grouping variables +#' @return augmented data frame code_addl_symptoms <- function(input_data, wave) { if ("B2b" %in% names(input_data)) { # How many days have you had one or more new or unusual symptom? @@ -1363,6 +1405,15 @@ code_addl_activities <- function(input_data, wave) { input_data$a_work_for_pay_outside_home_4w <- NA_real_ } + if ("D9" %in% names(input_data)) { + # D9: in the past 4 weeks, did you work + # Coded as 1 = Yes, 2 = No + input_data$a_work_for_pay_4w <- input_data$D9 == 1 + } else { + input_data$a_work_for_pay_4w <- NA_real_ + } + + calc_masking_given_activity <- function(activity, masked_during_activity) { case_when( activity & masked_during_activity ~ TRUE, @@ -1452,3 +1503,161 @@ code_addl_activities <- function(input_data, wave) { return(input_data) } +#' Demographics +#' +#' @param input_data input data frame of raw survey data +#' @param wave integer indicating survey version +#' +#' @return augmented data frame +code_addl_demographic <- function(input_data, wave) { + if ("D1" %in% names(input_data)) { + # Coded as 1 = male, 2 = female, 3 = non-binary, 4 = self-describe, 5 = no answer + input_data$gender_male <- case_when( + input_data$D1 == 1 ~ 1, + input_data$D1 %in% c(2, 3, 4) ~ 0, + input_data$D1 == 5 ~ NA_real_, + TRUE ~ NA_real_ + ) + input_data$gender_female <- case_when( + input_data$D1 == 2 ~ 1, + input_data$D1 %in% c(1, 3, 4) ~ 0, + input_data$D1 == 5 ~ NA_real_, + TRUE ~ NA_real_ + ) + input_data$gender_nonbinary_other <- case_when( + input_data$D1 %in% c(3, 4) ~ 1, + input_data$D1 %in% c(1, 2) ~ 0, + input_data$D1 == 5 ~ NA_real_, + TRUE ~ NA_real_ + ) + } else { + input_data$gender_male <- NA_real_ + input_data$gender_female <- NA_real_ + input_data$gender_nonbinary_other <- NA_real_ + } + + if ("D2" %in% names(input_data)) { + # Coded as 1 = 18-24, 2 = 25-34, 3 = 35-44, 4 = 45-54, + # 5 = 55-64, 6 = 65-74, 7 = 75+ + input_data$age_18_24 <- input_data$D2 == 1 + input_data$age_25_34 <- input_data$D2 == 2 + input_data$age_35_44 <- input_data$D2 == 3 + input_data$age_45_54 <- input_data$D2 == 4 + input_data$age_55_64 <- input_data$D2 == 5 + input_data$age_65_74 <- input_data$D2 == 6 + input_data$age_75_older <- input_data$D2 == 7 + } else { + input_data$age_18_24 <- NA + input_data$age_25_34 <- NA + input_data$age_35_44 <- NA + input_data$age_45_54 <- NA + input_data$age_55_64 <- NA + input_data$age_65_74 <- NA + input_data$age_75_older <- NA + } + + # race + if ("D7" %in% names(input_data)) { + input_data$race_american_indian_alaska_native <- input_data$D7 == 1 + input_data$race_asian <- input_data$D7 == 2 + input_data$race_black_african_american <- input_data$D7 == 3 + input_data$race_native_hawaiian_pacific_islander <- input_data$D7 == 4 + input_data$race_white <- input_data$D7 == 5 + input_data$race_multiple_other <- (input_data$D7 == 6 | grepl(",", input_data$D7)) + } else { + input_data$race_american_indian_alaska_native <- NA + input_data$race_asian <- NA + input_data$race_black_african_american <- NA + input_data$race_native_hawaiian_pacific_islander <- NA + input_data$race_white <- NA + input_data$race_multiple_other <- NA + } + + if ("D8" %in% names(input_data)) { + input_data$education_less_than_highschool <- input_data$D8 == 1 + input_data$education_highschool_or_equivalent <- input_data$D8 == 2 + input_data$education_some_college <- input_data$D8 == 3 + input_data$education_2yr_degree <- input_data$D8 == 4 + input_data$education_4yr_degree <- input_data$D8 == 5 + input_data$education_masters <- input_data$D8 == 8 + input_data$education_professional_degree <- input_data$D8 == 6 + input_data$education_doctorate <- input_data$D8 == 7 + } else { + input_data$education_less_than_highschool <- NA + input_data$education_highschool_or_equivalent <- NA + input_data$education_some_college <- NA + input_data$education_2yr_degree <- NA + input_data$education_4yr_degree <- NA + input_data$education_masters <- NA + input_data$education_professional_degree <- NA + input_data$education_doctorate <- NA + } + + if ("D12" %in% names(input_data)) { + input_data$language_home_english <- input_data$D12 == 1 + input_data$language_home_spanish <- input_data$D12 == 2 + input_data$language_home_chinese <- input_data$D12 == 3 + input_data$language_home_vietnamese <- input_data$D12 == 4 + input_data$language_home_french <- input_data$D12 == 5 + input_data$language_home_portugese <- input_data$D12 == 6 + input_data$language_home_other <- input_data$D12 == 7 + } else { + input_data$language_home_english <- NA + input_data$language_home_spanish <- NA + input_data$language_home_chinese <- NA + input_data$language_home_vietnamese <- NA + input_data$language_home_french <- NA + input_data$language_home_portugese <- NA + input_data$language_home_other <- NA + } + + # Children by age + if (all(c("E1_1", "E1_2", "E1_3", "E1_4") %in% names(input_data))) { + # All subquestions coded as 1 = Yes, 2 = No, 5 = don't know + input_data$children_prek <- input_data$E1_1 == 1 + input_data$children_gr1_5 <- input_data$E1_2 == 1 + input_data$children_gr6_8 <- input_data$E1_3 == 1 + input_data$children_gr9_12 <- input_data$E1_4 == 1 + } else { + input_data$children_prek <- NA + input_data$children_gr1_5 <- NA + input_data$children_gr6_8 <- NA + input_data$children_gr9_12 <- NA + } + + if ("E3" %in% names(input_data)) { + school_measures <- split_options(input_data$E3) + + input_data$children_school_measure_mask_students <- is_selected(school_measures, "1") + input_data$children_school_measure_mask_teachers <- is_selected(school_measures, "2") + input_data$children_school_measure_same_teacher <- is_selected(school_measures, "3") + input_data$children_school_measure_same_students <- is_selected(school_measures, "4") + input_data$children_school_measure_outdoor <- is_selected(school_measures, "5") + input_data$children_school_measure_entry <- is_selected(school_measures, "6") + input_data$children_school_measure_class_size <- is_selected(school_measures, "7") + input_data$children_school_measure_cafeteria <- is_selected(school_measures, "8") + input_data$children_school_measure_playground <- is_selected(school_measures, "9") + input_data$children_school_measure_desk_shield <- is_selected(school_measures, "10") + input_data$children_school_measure_desk_space <- is_selected(school_measures, "11") + input_data$children_school_measure_extracurricular <- is_selected(school_measures, "12") + input_data$children_school_measure_supplies <- is_selected(school_measures, "14") + input_data$children_school_measure_screening <- is_selected(school_measures, "15") + } else { + input_data$children_school_measure_mask_students <- NA + input_data$children_school_measure_mask_teachers <- NA + input_data$children_school_measure_same_teacher <- NA + input_data$children_school_measure_same_students <- NA + input_data$children_school_measure_outdoor <- NA + input_data$children_school_measure_entry <- NA + input_data$children_school_measure_class_size <- NA + input_data$children_school_measure_cafeteria <- NA + input_data$children_school_measure_playground <- NA + input_data$children_school_measure_desk_shield <- NA + input_data$children_school_measure_desk_space <- NA + input_data$children_school_measure_extracurricular <- NA + input_data$children_school_measure_supplies <- NA + input_data$children_school_measure_screening <- NA + } + + return(input_data) +} diff --git a/facebook/delphiFacebook/R/responses.R b/facebook/delphiFacebook/R/responses.R index c5f4a8032..17167c3ee 100644 --- a/facebook/delphiFacebook/R/responses.R +++ b/facebook/delphiFacebook/R/responses.R @@ -235,6 +235,7 @@ load_response_one <- function(input_filename, params, contingency_run) { input_data <- code_occupation(input_data, wave) input_data <- code_education(input_data, wave) input_data <- code_vaccinated_breakdown(input_data, wave) + input_data <- code_addl_demographic(input_data, wave) # Indicators input_data <- code_addl_vaccines(input_data, wave) diff --git a/facebook/delphiFacebook/man/code_addl_demographic.Rd b/facebook/delphiFacebook/man/code_addl_demographic.Rd new file mode 100644 index 000000000..1cef0f91c --- /dev/null +++ b/facebook/delphiFacebook/man/code_addl_demographic.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/contingency_variables.R +\name{code_addl_demographic} +\alias{code_addl_demographic} +\title{Demographics} +\usage{ +code_addl_demographic(input_data, wave) +} +\arguments{ +\item{input_data}{input data frame of raw survey data} + +\item{wave}{integer indicating survey version} +} +\value{ +augmented data frame +} +\description{ +Demographics +} diff --git a/facebook/delphiFacebook/man/code_addl_mental_health.Rd b/facebook/delphiFacebook/man/code_addl_mental_health.Rd new file mode 100644 index 000000000..59dabcf00 --- /dev/null +++ b/facebook/delphiFacebook/man/code_addl_mental_health.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/contingency_variables.R +\name{code_addl_mental_health} +\alias{code_addl_mental_health} +\title{Additional mental health indicators} +\usage{ +code_addl_mental_health(input_data, wave) +} +\arguments{ +\item{input_data}{input data frame of raw survey data} + +\item{wave}{integer indicating survey version} +} +\value{ +augmented data frame +} +\description{ +Additional mental health indicators +} diff --git a/facebook/delphiFacebook/man/code_addl_symptoms.Rd b/facebook/delphiFacebook/man/code_addl_symptoms.Rd index ac6d9abb5..0bb8fdf70 100644 --- a/facebook/delphiFacebook/man/code_addl_symptoms.Rd +++ b/facebook/delphiFacebook/man/code_addl_symptoms.Rd @@ -12,7 +12,7 @@ code_addl_symptoms(input_data, wave) \item{wave}{integer indicating survey version} } \value{ -data frame augmented with demographic grouping variables +augmented data frame } \description{ COVID symptoms with modifications for contingency tables diff --git a/facebook/delphiFacebook/man/code_addl_vaccines.Rd b/facebook/delphiFacebook/man/code_addl_vaccines.Rd index cfc498a30..429289f88 100644 --- a/facebook/delphiFacebook/man/code_addl_vaccines.Rd +++ b/facebook/delphiFacebook/man/code_addl_vaccines.Rd @@ -12,7 +12,7 @@ code_addl_vaccines(input_data, wave) \item{wave}{integer indicating survey version} } \value{ -data frame augmented with demographic grouping variables +augmented data frame } \description{ COVID vaccination variables with modifications for contingency tables diff --git a/facebook/delphiFacebook/man/code_attempt_vaccine.Rd b/facebook/delphiFacebook/man/code_attempt_vaccine.Rd index 985f3ef4f..92f35b877 100644 --- a/facebook/delphiFacebook/man/code_attempt_vaccine.Rd +++ b/facebook/delphiFacebook/man/code_attempt_vaccine.Rd @@ -12,7 +12,7 @@ code_attempt_vaccine(input_data, wave) \item{wave}{integer indicating survey version} } \value{ -data frame augmented with demographic grouping variables +augmented data frame } \description{ Attempts to get vaccinated diff --git a/facebook/delphiFacebook/man/code_trust.Rd b/facebook/delphiFacebook/man/code_trust.Rd index 016fff2af..6da5597bb 100644 --- a/facebook/delphiFacebook/man/code_trust.Rd +++ b/facebook/delphiFacebook/man/code_trust.Rd @@ -12,7 +12,7 @@ code_trust(input_data, wave) \item{wave}{integer indicating survey version} } \value{ -data frame augmented with demographic grouping variables +augmented data frame } \description{ Trust in various individuals and organizations for recommendations and info diff --git a/facebook/delphiFacebook/man/code_vaccine_barriers.Rd b/facebook/delphiFacebook/man/code_vaccine_barriers.Rd index 9a8838b72..5c45a8daa 100644 --- a/facebook/delphiFacebook/man/code_vaccine_barriers.Rd +++ b/facebook/delphiFacebook/man/code_vaccine_barriers.Rd @@ -12,7 +12,7 @@ code_vaccine_barriers(input_data, wave) \item{wave}{integer indicating survey version} } \value{ -data frame augmented with demographic grouping variables +augmented data frame } \description{ Vaccination barriers From e29eac711d768a5ee0bb01be3fe5730a11d53366 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:59:00 -0400 Subject: [PATCH 27/49] mean hh member by age from A5_123 --- .../delphiFacebook/R/contingency_indicators.R | 11 ++++++- .../delphiFacebook/R/contingency_variables.R | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 5c7b936eb..579c47f13 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -557,7 +557,16 @@ get_aggs <- function() { # Means. No post-processing required. "mean_days_symptoms", "symp_n_days", compute_numeric_mean, I, "mean_ppl_symptoms_household", "hh_number_sick", compute_numeric_mean, I, - "mean_ppl_symptoms_community", "community_number_sick", compute_numeric_mean, I + "mean_ppl_symptoms_community", "community_number_sick", compute_numeric_mean, I, + + "mean_hh_number_children", "hh_number_children", compute_numeric_mean, I, + "mean_hh_number_adults", "hh_number_adults", compute_numeric_mean, I, + "mean_hh_number_older", "hh_number_older", compute_numeric_mean, I, + "mean_hh_number_total", "hh_number_total", compute_numeric_mean, I, + + "mean_children_in_household", "children_in_household", compute_numeric_mean, I, + "mean_adults_in_household", "adults_in_household", compute_numeric_mean, I, + "mean_olderadults_in_household", "older_in_household", compute_numeric_mean, I ) aggs <- create_aggs_product(regions, groups, indicators) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 34af08468..2905ce5dc 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1659,5 +1659,36 @@ code_addl_demographic <- function(input_data, wave) { input_data$children_school_measure_screening <- NA } + if ("A5_1" %in% names(input_data)) { + # This is Wave 4, where item A2b was replaced with 3 items asking about + # separate ages. Many respondents leave blank the categories that do not + # apply to their household, rather than entering 0, so if at least one of + # the three items has a response, we impute 0 for the remaining items. + suppressWarnings({ + age18 <- as.integer(input_data$A5_1) + age1864 <- as.integer(input_data$A5_2) + age65 <- as.integer(input_data$A5_3) + }) + input_data$hh_number_children <- ifelse( + is.na(age18) + is.na(age1864) + is.na(age65) < 3, + ifelse(is.na(age18), 0, age18), + NA_integer_ + ) + input_data$hh_number_adults <- ifelse( + is.na(age18) + is.na(age1864) + is.na(age65) < 3, + ifelse(is.na(age1864), 0, age1864), + NA_integer_ + ) + input_data$hh_number_older <- ifelse( + is.na(age18) + is.na(age1864) + is.na(age65) < 3, + ifelse(is.na(age65), 0, age65), + NA_integer_ + ) + } else { + input_data$hh_number_children <- NA_integer_ + input_data$hh_number_adults <- NA_integer_ + input_data$hh_number_older <- NA_integer_ + } + return(input_data) } From 6aaec84877782e0bca7b8a3a39273b233cfa7e0f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 17 Jun 2022 14:01:46 -0400 Subject: [PATCH 28/49] mean number of hh members from D3-5 --- .../delphiFacebook/R/contingency_variables.R | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 2905ce5dc..e28f3efa2 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1669,25 +1669,67 @@ code_addl_demographic <- function(input_data, wave) { age1864 <- as.integer(input_data$A5_2) age65 <- as.integer(input_data$A5_3) }) - input_data$hh_number_children <- ifelse( + input_data$ppl_in_household_children <- ifelse( is.na(age18) + is.na(age1864) + is.na(age65) < 3, ifelse(is.na(age18), 0, age18), NA_integer_ ) - input_data$hh_number_adults <- ifelse( + input_data$ppl_in_household_adults <- ifelse( is.na(age18) + is.na(age1864) + is.na(age65) < 3, ifelse(is.na(age1864), 0, age1864), NA_integer_ ) - input_data$hh_number_older <- ifelse( + input_data$ppl_in_household_older <- ifelse( is.na(age18) + is.na(age1864) + is.na(age65) < 3, ifelse(is.na(age65), 0, age65), NA_integer_ ) } else { - input_data$hh_number_children <- NA_integer_ - input_data$hh_number_adults <- NA_integer_ - input_data$hh_number_older <- NA_integer_ + input_data$ppl_in_household_children <- NA_integer_ + input_data$ppl_in_household_adults <- NA_integer_ + input_data$ppl_in_household_older <- NA_integer_ + } + + if ("D3" %in% names(input_data)) { + # How many children younger than 18 currently stay in your household + # Free response + suppressWarnings({ D3_int <- as.integer(input_data$D3) }) + input_data$children_in_household <- case_when( + D3_int < 0 ~ NA_integer_, + D3_int > 20 ~ NA_integer_, + is.na(D3_int) ~ NA_integer_, + TRUE ~ D3_int + ) + } else { + input_data$children_in_household <- NA_integer_ + } + + if ("D4" %in% names(input_data)) { + # How many adults 18-65 currently stay in your household + # Free response + suppressWarnings({ D4_int <- as.integer(input_data$D4) }) + input_data$adults_in_household <- case_when( + D4_int < 0 ~ NA_integer_, + D4_int > 20 ~ NA_integer_, + is.na(D4_int) ~ NA_integer_, + TRUE ~ D4_int + ) + } else { + input_data$adults_in_household <- NA_integer_ + } + + if ("D5" %in% names(input_data)) { + # How many adults 65 or older currently stay in your household + # Free response + suppressWarnings({ D5_int <- as.integer(input_data$D5) }) + input_data$older_in_household <- case_when( + D5_int < 0 ~ NA_integer_, + D5_int > 20 ~ NA_integer_, + is.na(D5_int) ~ NA_integer_, + TRUE ~ D5_int + ) + } else { + input_data$older_in_household <- NA_integer_ } return(input_data) From 39b3400ec2aabbd1aa9ccc7a973bb1314f1082e3 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 16 Jun 2022 14:29:42 -0400 Subject: [PATCH 29/49] unknown gender; child age cuts --- .../delphiFacebook/R/contingency_indicators.R | 58 ++++++++++--------- .../delphiFacebook/R/contingency_variables.R | 31 +++++----- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index 579c47f13..bf00743fa 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -84,7 +84,7 @@ get_aggs <- function() { "pct_others_distanced_public", "c_others_distanced_public", compute_binary, jeffreys_binary, "pct_others_distanced_public_alt", "c_others_distanced_some_public", compute_binary, jeffreys_binary, - + "pct_cli", "hh_p_cli", compute_household_binary, jeffreys_count, "pct_ili", "hh_p_ili", compute_household_binary, jeffreys_count, "pct_hh_cmnty_cli", "hh_community_yes", compute_binary, jeffreys_binary, @@ -96,7 +96,7 @@ get_aggs <- function() { "pct_avoid_contact", "c_avoid_contact", compute_binary, jeffreys_binary, "pct_avoid_contact_7d", "c_avoid_contact_7d", compute_binary, jeffreys_binary, - + # symptoms "pct_taken_temp", "t_taken_temp", compute_binary, jeffreys_binary, @@ -122,7 +122,7 @@ get_aggs <- function() { "pct_symp_headache", "symp_headache", compute_binary, jeffreys_binary, "pct_symp_sleep_changes", "symp_sleep_changes", compute_binary, jeffreys_binary, "pct_symp_stuffy_nose", "symp_stuffy_nose", compute_binary, jeffreys_binary, - + # unusual symptoms "pct_symp_fever_unusual", "symp_fever_unusual", compute_binary, jeffreys_binary, "pct_symp_cough_unusual", "symp_cough_unusual", compute_binary, jeffreys_binary, @@ -142,7 +142,7 @@ get_aggs <- function() { "pct_symp_headache_unusual", "symp_headache_unusual", compute_binary, jeffreys_binary, "pct_symp_sleep_changes_unusual", "symp_sleep_changes_unusual", compute_binary, jeffreys_binary, "pct_symp_stuffy_nose_unusual", "symp_stuffy_nose_unusual", compute_binary, jeffreys_binary, - + # vaccines "pct_vaccinated", "v_covid_vaccinated", compute_binary, jeffreys_binary, "pct_received_2_vaccine_doses", "v_received_2_vaccine_doses", compute_binary, jeffreys_binary, @@ -156,10 +156,10 @@ get_aggs <- function() { "pct_covid_vaccinated_friends", "v_covid_vaccinated_friends", compute_binary, jeffreys_binary, "pct_covid_vaccinated_friends_alt", "v_covid_vaccinated_some_friends", compute_binary, jeffreys_binary, - + "pct_vaccinate_children", "v_vaccinate_children", compute_binary, jeffreys_binary, "pct_vaccinate_child_oldest", "v_vaccinate_child_oldest", compute_binary, jeffreys_binary, - + "pct_child_vaccine_already", "v_child_vaccine_already", compute_binary, jeffreys_multinomial_factory(5), "pct_child_vaccine_yes_def", "v_child_vaccine_yes_def", compute_binary, jeffreys_multinomial_factory(5), "pct_child_vaccine_yes_prob", "v_child_vaccine_yes_prob", compute_binary, jeffreys_multinomial_factory(5), @@ -174,19 +174,19 @@ get_aggs <- function() { "pct_accept_vaccine_no_appointment_probyes", "v_accept_vaccine_no_appointment_probyes", compute_binary, jeffreys_multinomial_factory(4), "pct_accept_vaccine_no_appointment_probno", "v_accept_vaccine_no_appointment_probno", compute_binary, jeffreys_multinomial_factory(4), "pct_accept_vaccine_no_appointment_defno", "v_accept_vaccine_no_appointment_defno", compute_binary, jeffreys_multinomial_factory(4), - + "pct_initial_dose_one_of_one", "v_initial_dose_one_of_one", compute_binary, jeffreys_multinomial_factory(4), "pct_initial_dose_one_of_two", "v_initial_dose_one_of_two", compute_binary, jeffreys_multinomial_factory(4), "pct_initial_dose_two_of_two", "v_initial_dose_two_of_two", compute_binary, jeffreys_multinomial_factory(4), - + "pct_vaccinated_one_booster", "v_vaccinated_one_booster", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_two_or_more_boosters", "v_vaccinated_two_or_more_boosters", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_no_booster", "v_vaccinated_no_booster", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_at_least_one_booster", "v_vaccinated_at_least_one_booster", compute_binary, jeffreys_binary, - + "pct_vaccinated_booster_accept", "v_vaccinated_booster_accept", compute_binary, jeffreys_binary, "pct_vaccinated_booster_hesitant", "v_vaccinated_booster_hesitant", compute_binary, jeffreys_binary, - + "pct_vaccinated_booster_defyes", "v_vaccinated_booster_defyes", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_booster_probyes", "v_vaccinated_booster_probyes", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_booster_probno", "v_vaccinated_booster_probno", compute_binary, jeffreys_multinomial_factory(4), @@ -198,8 +198,8 @@ get_aggs <- function() { "pct_flu_vaccine_june_2020", "v_flu_vaccinated_june_2020", compute_binary, jeffreys_binary, "pct_flu_vaccine_july_2020", "v_flu_vaccinated_july_2020", compute_binary, jeffreys_binary, "pct_flu_vaccinated_2021", "v_flu_vaccinated_2021", compute_binary, jeffreys_binary, - - + + # vaccine timing "pct_vaccine_timing_weeks", "v_vaccine_timing_weeks", compute_binary, jeffreys_multinomial_factory(7), "pct_vaccine_timing_onemonth", "v_vaccine_timing_onemonth", compute_binary, jeffreys_multinomial_factory(7), @@ -207,7 +207,7 @@ get_aggs <- function() { "pct_vaccine_timing_sixmonths", "v_vaccine_timing_sixmonths", compute_binary, jeffreys_multinomial_factory(7), "pct_vaccine_timing_morethansix", "v_vaccine_timing_morethansix", compute_binary, jeffreys_multinomial_factory(7), "pct_vaccine_timing_dontknow", "v_vaccine_timing_dontknow", compute_binary, jeffreys_multinomial_factory(7), - + # vaccine influences "pct_vaccine_likely_friends", "v_vaccine_likely_friends", compute_binary, jeffreys_binary, "pct_vaccine_likely_local_health", "v_vaccine_likely_local_health", compute_binary, jeffreys_binary, @@ -223,7 +223,7 @@ get_aggs <- function() { "pct_trust_covid_info_journalists", "i_trust_covid_info_journalists", compute_binary, jeffreys_binary, "pct_trust_covid_info_friends", "i_trust_covid_info_friends", compute_binary, jeffreys_binary, "pct_trust_covid_info_religious", "i_trust_covid_info_religious", compute_binary, jeffreys_binary, - + "pct_worried_vaccine_sideeffects", "v_worried_vaccine_side_effects", compute_binary, jeffreys_binary, "pct_hesitant_worried_vaccine_sideeffects", "v_hesitant_worried_vaccine_sideeffects", compute_binary, jeffreys_binary, @@ -241,7 +241,7 @@ get_aggs <- function() { "pct_hesitant_trust_covid_info_journalists", "i_hesitant_trust_covid_info_journalists", compute_binary, jeffreys_binary, "pct_hesitant_trust_covid_info_friends", "i_hesitant_trust_covid_info_friends", compute_binary, jeffreys_binary, "pct_hesitant_trust_covid_info_religious", "i_hesitant_trust_covid_info_religious", compute_binary, jeffreys_binary, - + # vaccine worries "pct_hesitant_barrier_sideeffects", "v_hesitant_barrier_sideeffects", compute_binary, jeffreys_binary, "pct_hesitant_barrier_allergic", "v_hesitant_barrier_allergic", compute_binary, jeffreys_binary, @@ -259,7 +259,7 @@ get_aggs <- function() { "pct_hesitant_barrier_pregnant", "v_hesitant_barrier_pregnant", compute_binary, jeffreys_binary, "pct_hesitant_barrier_other", "v_hesitant_barrier_other", compute_binary, jeffreys_binary, "pct_hesitant_barrier_dislike_vaccines_generally", "v_hesitant_barrier_dislike_vaccines_generally", compute_binary, jeffreys_binary, - + "pct_hesitant_dontneed_reason_had_covid", "v_hesitant_dontneed_reason_had_covid", compute_binary, jeffreys_binary, "pct_hesitant_dontneed_reason_dont_spend_time", "v_hesitant_dontneed_reason_dont_spend_time", compute_binary, jeffreys_binary, "pct_hesitant_dontneed_reason_not_high_risk", "v_hesitant_dontneed_reason_not_high_risk", compute_binary, jeffreys_binary, @@ -267,7 +267,7 @@ get_aggs <- function() { "pct_hesitant_dontneed_reason_not_serious", "v_hesitant_dontneed_reason_not_serious", compute_binary, jeffreys_binary, "pct_hesitant_dontneed_reason_not_beneficial", "v_hesitant_dontneed_reason_not_beneficial", compute_binary, jeffreys_binary, "pct_hesitant_dontneed_reason_other", "v_hesitant_dontneed_reason_other", compute_binary, jeffreys_binary, - + "pct_barrier_sideeffects", "v_hesitancy_reason_sideeffects", compute_binary, jeffreys_binary, "pct_barrier_allergic", "v_hesitancy_reason_allergic", compute_binary, jeffreys_binary, "pct_barrier_ineffective", "v_hesitancy_reason_ineffective", compute_binary, jeffreys_binary, @@ -284,7 +284,7 @@ get_aggs <- function() { "pct_barrier_pregnant", "v_hesitancy_reason_pregnant", compute_binary, jeffreys_binary, "pct_barrier_other", "v_hesitancy_reason_other", compute_binary, jeffreys_binary, "pct_barrier_dislike_vaccines_generally", "v_hesitancy_reason_dislike_vaccines_generally", compute_binary, jeffreys_binary, - + # vaccine incomplete reasons "pct_vaccine_incomplete_sideeffect", "v_vaccine_incomplete_sideeffect", compute_binary, jeffreys_binary, "pct_vaccine_incomplete_allergic", "v_vaccine_incomplete_allergic", compute_binary, jeffreys_binary, @@ -310,7 +310,7 @@ get_aggs <- function() { "pct_dontneed_reason_not_serious", "v_dontneed_reason_not_serious_5abc_6", compute_binary, jeffreys_binary, "pct_dontneed_reason_not_beneficial", "v_dontneed_reason_not_beneficial_5abc_6", compute_binary, jeffreys_binary, "pct_dontneed_reason_other", "v_dontneed_reason_other_5abc_6", compute_binary, jeffreys_binary, - + "pct_defno_barrier_sideeffects", "v_defno_barrier_sideeffects", compute_binary, jeffreys_binary, "pct_defno_barrier_allergic", "v_defno_barrier_allergic", compute_binary, jeffreys_binary, "pct_defno_barrier_ineffective", "v_defno_barrier_ineffective", compute_binary, jeffreys_binary, @@ -327,7 +327,7 @@ get_aggs <- function() { "pct_defno_barrier_pregnant", "v_defno_barrier_pregnant", compute_binary, jeffreys_binary, "pct_defno_barrier_other", "v_defno_barrier_other", compute_binary, jeffreys_binary, "pct_defno_barrier_dislike_vaccines_generally", "v_defno_barrier_dislike_vaccines_generally", compute_binary, jeffreys_binary, - + "pct_defno_dontneed_reason_had_covid", "v_defno_dontneed_reason_had_covid", compute_binary, jeffreys_binary, "pct_defno_dontneed_reason_dont_spend_time", "v_defno_dontneed_reason_dont_spend_time", compute_binary, jeffreys_binary, "pct_defno_dontneed_reason_not_high_risk", "v_defno_dontneed_reason_not_high_risk", compute_binary, jeffreys_binary, @@ -335,7 +335,7 @@ get_aggs <- function() { "pct_defno_dontneed_reason_not_serious", "v_defno_dontneed_reason_not_serious", compute_binary, jeffreys_binary, "pct_defno_dontneed_reason_not_beneficial", "v_defno_dontneed_reason_not_beneficial", compute_binary, jeffreys_binary, "pct_defno_dontneed_reason_other", "v_defno_dontneed_reason_other", compute_binary, jeffreys_binary, - + "pct_informed_access", "v_informed_access", compute_binary, jeffreys_binary, # appointments @@ -571,7 +571,6 @@ get_aggs <- function() { aggs <- create_aggs_product(regions, groups, indicators) - monthly_indicators <- tribble( ~name, ~metric, ~compute_fn, ~post_fn, "pct_child_school_public", "s_child_school_public", compute_binary, jeffreys_multinomial_factory(5), @@ -641,9 +640,10 @@ get_aggs <- function() { demo_groups <- list(c()) demo_indicators <- tribble( ~name, ~metric, ~compute_fn, ~post_fn, - "pct_gender_male", "gender_male", compute_binary, jeffreys_multinomial_factory(3), - "pct_gender_female", "gender_female", compute_binary, jeffreys_multinomial_factory(3), - "pct_gender_nonbinary_other", "gender_nonbinary_other", compute_binary, jeffreys_multinomial_factory(3), + "pct_gender_male", "gender_male", compute_binary, jeffreys_multinomial_factory(4), + "pct_gender_female", "gender_female", compute_binary, jeffreys_multinomial_factory(4), + "pct_gender_nonbinary_other", "gender_nonbinary_other", compute_binary, jeffreys_multinomial_factory(4), + "pct_gender_unknown", "gender_unknown", compute_binary, jeffreys_multinomial_factory(4), "pct_age_18_24", "age_18_24", compute_binary, jeffreys_multinomial_factory(7), "pct_age_25_34", "age_25_34", compute_binary, jeffreys_multinomial_factory(7), @@ -748,9 +748,15 @@ get_aggs <- function() { demo_indicators ) + + ## Parenting cuts + parent_groups <- list(c("child_age")) + parent_indicators <- tribble() + parent_aggs <- create_aggs_product(regions, parent_groups, parent_indicators) + weekly_aggs <- rbind(aggs, demo_aggs) monthly_aggs <- rbind(aggs, monthly_aggs, demo_aggs) - + return(list("week"=weekly_aggs, "month"=monthly_aggs)) } diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index e28f3efa2..4435d8266 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1512,28 +1512,19 @@ code_addl_activities <- function(input_data, wave) { code_addl_demographic <- function(input_data, wave) { if ("D1" %in% names(input_data)) { # Coded as 1 = male, 2 = female, 3 = non-binary, 4 = self-describe, 5 = no answer - input_data$gender_male <- case_when( - input_data$D1 == 1 ~ 1, - input_data$D1 %in% c(2, 3, 4) ~ 0, - input_data$D1 == 5 ~ NA_real_, - TRUE ~ NA_real_ - ) - input_data$gender_female <- case_when( - input_data$D1 == 2 ~ 1, - input_data$D1 %in% c(1, 3, 4) ~ 0, - input_data$D1 == 5 ~ NA_real_, - TRUE ~ NA_real_ - ) + input_data$gender_male <- input_data$D1 == 1 + input_data$gender_female <- input_data$D1 == 2 input_data$gender_nonbinary_other <- case_when( input_data$D1 %in% c(3, 4) ~ 1, - input_data$D1 %in% c(1, 2) ~ 0, - input_data$D1 == 5 ~ NA_real_, + input_data$D1 %in% c(1, 2, 5) ~ 0, TRUE ~ NA_real_ ) + input_data$gender_unknown <- input_data$D1 == 5 } else { input_data$gender_male <- NA_real_ input_data$gender_female <- NA_real_ input_data$gender_nonbinary_other <- NA_real_ + input_data$gender_unknown <- NA_real_ } if ("D2" %in% names(input_data)) { @@ -1659,6 +1650,18 @@ code_addl_demographic <- function(input_data, wave) { input_data$children_school_measure_screening <- NA } + if ("P2" %in% names(input_data)) { + input_data$child_age <- case_when( + input_data$P2 == 1 ~ "less than 5 years", + input_data$P2 == 2 ~ "5-11 years", + input_data$P2 == 3 ~ "12-15 years", + input_data$P2 == 4 ~ "16-17 years", + TRUE ~ NA_character_ + ) + } else { + input_data$child_age <- NA_character_ + } + if ("A5_1" %in% names(input_data)) { # This is Wave 4, where item A2b was replaced with 3 items asking about # separate ages. Many respondents leave blank the categories that do not From aecf0fd2e0aa534498659dbda3ae65e928b9deeb Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 21 Jun 2022 18:26:34 -0400 Subject: [PATCH 30/49] add overall county indicators; remove monthly-only --- .../delphiFacebook/R/contingency_indicators.R | 15 ++++----------- facebook/delphiFacebook/R/contingency_write.R | 11 ++++++----- .../man/write_contingency_tables.Rd | 2 +- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index bf00743fa..e0bfc0d8e 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -569,17 +569,10 @@ get_aggs <- function() { "mean_olderadults_in_household", "older_in_household", compute_numeric_mean, I ) - aggs <- create_aggs_product(regions, groups, indicators) - - monthly_indicators <- tribble( - ~name, ~metric, ~compute_fn, ~post_fn, - "pct_child_school_public", "s_child_school_public", compute_binary, jeffreys_multinomial_factory(5), - "pct_child_school_private", "s_child_school_private", compute_binary, jeffreys_multinomial_factory(5), - "pct_child_school_homeschool", "s_child_school_homeschool", compute_binary, jeffreys_multinomial_factory(5), - "pct_child_school_not", "s_child_school_not", compute_binary, jeffreys_multinomial_factory(5), - "pct_child_school_other", "s_child_school_other", compute_binary, jeffreys_multinomial_factory(5) + aggs <- rbind( + create_aggs_product(regions, groups, indicators), + create_aggs_product(list("county"), list(c()), indicators) ) - monthly_aggs <- create_aggs_product(regions, groups, monthly_indicators) ### Include handful of original public tables not already covered by set above common_group <- c("agefull", "gender", "race", "hispanic") @@ -755,7 +748,7 @@ get_aggs <- function() { parent_aggs <- create_aggs_product(regions, parent_groups, parent_indicators) weekly_aggs <- rbind(aggs, demo_aggs) - monthly_aggs <- rbind(aggs, monthly_aggs, demo_aggs) + monthly_aggs <- rbind(aggs, demo_aggs) return(list("week"=weekly_aggs, "month"=monthly_aggs)) } diff --git a/facebook/delphiFacebook/R/contingency_write.R b/facebook/delphiFacebook/R/contingency_write.R index 4ae4c4cf3..58aca8a92 100644 --- a/facebook/delphiFacebook/R/contingency_write.R +++ b/facebook/delphiFacebook/R/contingency_write.R @@ -21,8 +21,7 @@ #' @importFrom stringi stri_trim #' #' @export -write_contingency_tables <- function(data, params, geo_type, groupby_vars) -{ +write_contingency_tables <- function(data, params, geo_type, groupby_vars, theme = NULL) { if (!is.null(data) && nrow(data) != 0) { # Reorder the group-by columns and sort the dataset by them. @@ -43,7 +42,7 @@ write_contingency_tables <- function(data, params, geo_type, groupby_vars) create_dir_not_exist(params$export_dir) - file_name <- get_file_name(params, geo_type, groupby_vars) + file_name <- get_file_name(params, geo_type, groupby_vars, theme) msg_df(sprintf("saving contingency table data to %-35s", file_name), data) # Automatically uses gzip compression based on output file name. write_csv(data, file.path(params$export_dir, file_name)) @@ -109,6 +108,8 @@ add_geo_vars <- function(data, params, geo_type) { .data$county, .data$county_fips ) + } else if (geo_type == "county") { + warning("county metadata not supported") } geo_vars <- bind_cols(first, rest) @@ -154,8 +155,7 @@ add_metadata_vars <- function(data, params, geo_type, groupby_vars) { #' Get the file name for the given parameters, geography, and set of group-by variables. #' @noRd -get_file_name <- function(params, geo_type, groupby_vars) { - +get_file_name <- function(params, geo_type, groupby_vars, theme = NULL) { aggregation_type <- sort(setdiff(groupby_vars, "geo_id")) if (length(aggregation_type) == 0) aggregation_type <- "overall" @@ -164,6 +164,7 @@ get_file_name <- function(params, geo_type, groupby_vars) { format(params$end_date, "%Y%m%d"), get_period_type(params$aggregate_range), geo_type, + ifelse(is.null(theme), "all_indicators", paste("theme", theme, sep = "_")), paste(aggregation_type, collapse = "_"), sep = "_" ) diff --git a/facebook/delphiFacebook/man/write_contingency_tables.Rd b/facebook/delphiFacebook/man/write_contingency_tables.Rd index ce687becd..fcdd8bd6f 100644 --- a/facebook/delphiFacebook/man/write_contingency_tables.Rd +++ b/facebook/delphiFacebook/man/write_contingency_tables.Rd @@ -4,7 +4,7 @@ \alias{write_contingency_tables} \title{Write csv file for sharing with researchers.} \usage{ -write_contingency_tables(data, params, geo_type, groupby_vars) +write_contingency_tables(data, params, geo_type, groupby_vars, theme = NULL) } \arguments{ \item{data}{a data frame to save; must contain the columns in From 85564ccfd58d37e80e58e70f406763faf4009899 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 16 Jun 2022 12:35:27 -0400 Subject: [PATCH 31/49] make theme tables --- facebook/delphiFacebook/DESCRIPTION | 1 + facebook/delphiFacebook/NAMESPACE | 1 + .../delphiFacebook/R/contingency_aggregate.R | 12 + .../delphiFacebook/R/contingency_indicators.R | 692 ++++++++++++++++-- .../delphiFacebook/R/contingency_variables.R | 142 ++-- 5 files changed, 761 insertions(+), 87 deletions(-) diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index 51ad1e74b..c42da0224 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -15,6 +15,7 @@ Imports: rlang, readr, dplyr, + tidyr, stringi, jsonlite, lubridate, diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index 7846002a4..cfef1c937 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -127,5 +127,6 @@ importFrom(survey,svymean) importFrom(survey,svyvar) importFrom(tibble,add_column) importFrom(tibble,tribble) +importFrom(tidyr,drop_na) importFrom(utils,tail) useDynLib(delphiFacebook, .registration = TRUE) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index fb2b8fe98..054b980b0 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -26,6 +26,7 @@ #' @import data.table #' @importFrom dplyr full_join %>% select all_of #' @importFrom purrr reduce +#' @importFrom tidyr drop_na #' #' @export produce_aggregates <- function(df, aggregations, cw_list, params) { @@ -95,6 +96,17 @@ produce_aggregates <- function(df, aggregations, cw_list, params) { if ( length(dfs_out) != 0 ) { df_out <- dfs_out %>% reduce(full_join, by=agg_group, suff=c("", "")) write_contingency_tables(df_out, params, geo_level, agg_group) + + for (theme in names(THEME_GROUPS)) { + theme_out <- select(df_out, agg_group, contains(THEME_GROUPS[[theme]])) + # Drop any rows that are completely `NA`. Grouping variables are always + # defined, so need to ignore those. + theme_out <- drop_na(theme_out, !!setdiff(names(theme_out), agg_group)) + + if ( nrow(theme_out) != 0 && ncol(theme_out) != 0 ) { + write_contingency_tables(theme_out, params, geo_level, agg_group, theme) + } + } } } } diff --git a/facebook/delphiFacebook/R/contingency_indicators.R b/facebook/delphiFacebook/R/contingency_indicators.R index e0bfc0d8e..d00df791d 100644 --- a/facebook/delphiFacebook/R/contingency_indicators.R +++ b/facebook/delphiFacebook/R/contingency_indicators.R @@ -1,3 +1,559 @@ +THEME_GROUPS <- list( + "sociodemographics" = c( + "pct_age_18_24", + "pct_age_25_34", + "pct_age_35_44", + "pct_age_45_54", + "pct_age_55_64", + "pct_age_65_74", + "pct_age_75_older", + "pct_condition_asthma", + "pct_condition_cancer", + "pct_condition_cvd", + "pct_condition_diabetes", + "pct_condition_hbp", + "pct_condition_immune", + "pct_condition_kidney", + "pct_condition_lung", + "pct_condition_none", + "pct_condition_obesity", + "pct_education_2yr_degree", + "pct_education_4yr_degree", + "pct_education_doctorate", + "pct_education_highschool_or_equivalent", + "pct_education_less_than_highschool", + "pct_education_masters", + "pct_education_professional_degree", + "pct_education_some_college", + "pct_gender_female", + "pct_gender_male", + "pct_gender_nonbinary_other", + "pct_gender_unknown", + "pct_hispanic_latino", + "pct_language_home_chinese", + "pct_language_home_english", + "pct_language_home_french", + "pct_language_home_other", + "pct_language_home_portuguese", + "pct_language_home_spanish", + "pct_language_home_vietnamese", + "pct_occ_4w_admin", + "pct_occ_4w_arts", + "pct_occ_4w_building", + "pct_occ_4w_construction", + "pct_occ_4w_education", + "pct_occ_4w_food", + "pct_occ_4w_health_prac", + "pct_occ_4w_health_support", + "pct_occ_4w_maintenance", + "pct_occ_4w_other", + "pct_occ_4w_personal", + "pct_occ_4w_production", + "pct_occ_4w_protective", + "pct_occ_4w_sales", + "pct_occ_4w_social", + "pct_occ_4w_transportation", + "pct_pregnant", + "pct_race_american_indian_alaska_native", + "pct_race_asian", + "pct_race_black_african_american", + "pct_race_native_hawaiian_pacific_islander", + "pct_race_multiple_other", + "pct_race_white", + "pct_smoke", + "pct_work_for_pay_4w", + "pct_work_for_pay_outside_home_4w", + "mean_adults_in_household", + "mean_children_in_household", + "mean_olderadults_in_household", + "mean_ppl_in_household", + "mean_ppl_in_household_adults", + "mean_ppl_in_household_children", + "mean_ppl_in_household_olderadults" + ), + "vaccines" = c( + "pct_accept_vaccine", + "pct_accept_vaccine_no_appointment", + "pct_accept_vaccine_defno", + "pct_accept_vaccine_defyes", + "pct_accept_vaccine_no_appointment_defno", + "pct_accept_vaccine_no_appointment_defyes", + "pct_accept_vaccine_no_appointment_probno", + "pct_accept_vaccine_no_appointment_probyes", + "pct_accept_vaccine_probno", + "pct_accept_vaccine_probyes", + "pct_appointment_have", + "pct_appointment_not_vaccinated", + "pct_appointment_or_accept_vaccine", + "pct_appointment_tried", + "pct_barrier_allergic", + "pct_barrier_cost", + "pct_barrier_dislike_vaccines", + "pct_barrier_dislike_vaccines_generally", + "pct_barrier_distrust_govt", + "pct_barrier_distrust_vaccines", + "pct_barrier_dontneed", + "pct_barrier_health_condition", + "pct_barrier_ineffective", + "pct_barrier_low_priority", + "pct_barrier_not_recommended", + "pct_barrier_other", + "pct_barrier_pregnant", + "pct_barrier_reason_allergic", + "pct_barrier_reason_cost", + "pct_barrier_reason_not_recommended", + "pct_barrier_reason_dontbelieve", + "pct_barrier_reason_dontlike", + "pct_barrier_reason_distrust_gov", + "pct_barrier_reason_health", + "pct_barrier_reason_other", + "pct_barrier_reason_otherpeople", + "pct_barrier_reason_pregnant", + "pct_barrier_reason_religion", + "pct_barrier_reason_sideeffect", + "pct_barrier_reason_distrust_vaccine", + "pct_barrier_reason_wait", + "pct_barrier_reason_wontwork", + "pct_barrier_religious", + "pct_barrier_sideeffects", + "pct_barrier_wait_safety", + "pct_defno_barrier_allergic", + "pct_defno_barrier_cost", + "pct_defno_barrier_dislike_vaccines", + "pct_defno_barrier_dislike_vaccines_generally", + "pct_defno_barrier_distrust_govt", + "pct_defno_barrier_distrust_vaccines", + "pct_defno_barrier_dontneed", + "pct_defno_barrier_health_condition", + "pct_defno_barrier_ineffective", + "pct_defno_barrier_low_priority", + "pct_defno_barrier_not_recommended", + "pct_defno_barrier_other", + "pct_defno_barrier_pregnant", + "pct_defno_barrier_religious", + "pct_defno_barrier_sideeffects", + "pct_defno_barrier_wait_safety", + "pct_defno_dontneed_reason_dont_spend_time", + "pct_defno_dontneed_reason_had_covid", + "pct_defno_dontneed_reason_not_beneficial", + "pct_defno_dontneed_reason_not_high_risk", + "pct_defno_dontneed_reason_not_serious", + "pct_defno_dontneed_reason_other", + "pct_defno_dontneed_reason_precautions", + "pct_dontneed_reason_dont_spend_time", + "pct_dontneed_reason_had_covid", + "pct_dontneed_reason_not_beneficial", + "pct_dontneed_reason_not_high_risk", + "pct_dontneed_reason_not_serious", + "pct_dontneed_reason_other", + "pct_dontneed_reason_precautions", + "pct_hesitant_barrier_allergic", + "pct_hesitant_barrier_cost", + "pct_hesitant_barrier_dislike_vaccines", + "pct_hesitant_barrier_dislike_vaccines_generally", + "pct_hesitant_barrier_distrust_govt", + "pct_hesitant_barrier_distrust_vaccines", + "pct_hesitant_barrier_dontneed", + "pct_hesitant_barrier_health_condition", + "pct_hesitant_barrier_ineffective", + "pct_hesitant_barrier_low_priority", + "pct_hesitant_barrier_not_recommended", + "pct_hesitant_barrier_other", + "pct_hesitant_barrier_pregnant", + "pct_hesitant_barrier_religious", + "pct_hesitant_barrier_sideeffects", + "pct_hesitant_barrier_wait_safety", + "pct_hesitant_dontneed_reason_dont_spend_time", + "pct_hesitant_dontneed_reason_had_covid", + "pct_hesitant_dontneed_reason_not_beneficial", + "pct_hesitant_dontneed_reason_not_high_risk", + "pct_hesitant_dontneed_reason_not_serious", + "pct_hesitant_dontneed_reason_other", + "pct_hesitant_dontneed_reason_precautions", + "pct_hesitant_trust_covid_info_cdc", + "pct_hesitant_trust_covid_info_doctors", + "pct_hesitant_trust_covid_info_experts", + "pct_hesitant_trust_covid_info_friends", + "pct_hesitant_trust_covid_info_govt_health", + "pct_hesitant_trust_covid_info_journalists", + "pct_hesitant_trust_covid_info_politicians", + "pct_hesitant_trust_covid_info_religious", + "pct_hesitant_vaccine", + "pct_hesitant_vaccine_likely_doctors", + "pct_hesitant_vaccine_likely_friends", + "pct_hesitant_vaccine_likely_govt", + "pct_hesitant_vaccine_likely_local_health", + "pct_hesitant_vaccine_likely_politicians", + "pct_hesitant_vaccine_likely_who", + "pct_hesitant_worried_vaccine_sideeffects", + "pct_informed_access", + "pct_initial_dose_one_of_one", + "pct_initial_dose_one_of_two", + "pct_initial_dose_two_of_two", + "pct_receive_all_doses_noplan", + "pct_receive_all_doses_plan", + "pct_receive_all_doses_yes", + "pct_received_2_vaccine_doses", + "pct_trust_covid_info_cdc", + "pct_trust_covid_info_doctors", + "pct_trust_covid_info_experts", + "pct_trust_covid_info_friends", + "pct_trust_covid_info_govt_health", + "pct_trust_covid_info_journalists", + "pct_trust_covid_info_politicians", + "pct_trust_covid_info_religious", + "pct_vaccinate_children", + "pct_child_vaccine_vaccinated_or_accept", + "pct_vaccinated", + "pct_vaccinated_appointment_or_accept", + "pct_vaccinated_at_least_one_booster", + "pct_vaccinated_booster_accept", + "pct_vaccinated_booster_defno", + "pct_vaccinated_booster_defyes", + "pct_vaccinated_booster_hesitant", + "pct_vaccinated_booster_probno", + "pct_vaccinated_booster_probyes", + "pct_vaccinated_no_booster", + "pct_vaccinated_one_booster", + "pct_vaccinated_or_accept", + "pct_vaccinated_two_or_more_boosters", + "pct_vaccine_barrier_appointment_location", + "pct_vaccine_barrier_appointment_location_has", + "pct_vaccine_barrier_appointment_location_tried", + "pct_vaccine_barrier_appointment_time", + "pct_vaccine_barrier_appointment_time_has", + "pct_vaccine_barrier_appointment_time_tried", + "pct_vaccine_barrier_childcare", + "pct_vaccine_barrier_childcare_has", + "pct_vaccine_barrier_childcare_tried", + "pct_vaccine_barrier_document", + "pct_vaccine_barrier_document_has", + "pct_vaccine_barrier_document_tried", + "pct_vaccine_barrier_eligible", + "pct_vaccine_barrier_eligible_has", + "pct_vaccine_barrier_eligible_tried", + "pct_vaccine_barrier_language", + "pct_vaccine_barrier_language_has", + "pct_vaccine_barrier_language_tried", + "pct_vaccine_barrier_no_appointments", + "pct_vaccine_barrier_no_appointments_has", + "pct_vaccine_barrier_no_appointments_tried", + "pct_vaccine_barrier_none", + "pct_vaccine_barrier_none_has", + "pct_vaccine_barrier_none_tried", + "pct_vaccine_barrier_other", + "pct_vaccine_barrier_other_has", + "pct_vaccine_barrier_other_tried", + "pct_vaccine_barrier_technical_difficulties", + "pct_vaccine_barrier_technical_difficulties_has", + "pct_vaccine_barrier_technical_difficulties_tried", + "pct_vaccine_barrier_technology_access", + "pct_vaccine_barrier_technology_access_has", + "pct_vaccine_barrier_technology_access_tried", + "pct_vaccine_barrier_time", + "pct_vaccine_barrier_time_has", + "pct_vaccine_barrier_time_tried", + "pct_vaccine_barrier_travel", + "pct_vaccine_barrier_travel_has", + "pct_vaccine_barrier_travel_tried", + "pct_vaccine_barrier_type", + "pct_vaccine_barrier_type_has", + "pct_vaccine_barrier_type_tried", + "pct_vaccine_likely_doctors", + "pct_vaccine_likely_friends", + "pct_vaccine_likely_govt_health", + "pct_vaccine_likely_local_health", + "pct_vaccine_likely_politicians", + "pct_vaccine_likely_who", + "pct_vaccine_timing_dontknow", + "pct_vaccine_timing_morethansix", + "pct_vaccine_timing_onemonth", + "pct_vaccine_timing_sixmonths", + "pct_vaccine_timing_threemonths", + "pct_vaccine_timing_weeks", + "pct_vaccine_tried", + "pct_worried_vaccine_sideeffects", + "pct_flu_shot_1y", + "pct_flu_vaccine_july_2020", + "pct_flu_vaccine_june_2020", + "pct_flu_vaccinated_2021", + "pct_overall_vaccine_hesitancy", + "pct_overall_vaccine_hesitancy", + "pct_vaccine_incomplete_allergic", + "pct_vaccine_incomplete_cost", + "pct_vaccine_incomplete_distrust_gov", + "pct_vaccine_incomplete_distrust_vaccine", + "pct_vaccine_incomplete_dontbelieve", + "pct_vaccine_incomplete_dontlike", + "pct_vaccine_incomplete_health", + "pct_vaccine_incomplete_not_recommended", + "pct_vaccine_incomplete_other", + "pct_vaccine_incomplete_otherpeople", + "pct_vaccine_incomplete_pregnant", + "pct_vaccine_incomplete_religion", + "pct_vaccine_incomplete_sideeffect", + "pct_vaccine_incomplete_wait", + "pct_vaccine_incomplete_wontwork" + ), + "symptoms_and_testing" = c( + "pct_symp_anosmia", + "pct_had_covid_ever", + "pct_had_covid_ever", + "pct_symp_sore_throat", + "pct_cli", + "pct_ever_tested", + "pct_ever_tested_positive", + "pct_hh_cmnty_cli", + "pct_ili", + "pct_test_reason_contact", + "pct_test_reason_medical", + "pct_test_reason_none", + "pct_test_reason_required", + "pct_test_reason_sick", + "pct_test_reason_travel", + "pct_test_reason_visit", + "pct_test_reason_large_event", + "pct_test_reason_crowd", + "pct_tested_14d", + "pct_tested_positive_14d", + "pct_wanted_test_14d", + "pct_cough_mucus", + "mean_days_symptoms", + "pct_hh_cmnty_cli", + "pct_nohh_cmnty_cli", + "mean_ppl_symptoms_community", + "mean_ppl_symptoms_household", + "pct_reason_not_tested_appointment", + "pct_reason_not_tested_cost", + "pct_reason_not_tested_location", + "pct_reason_not_tested_stigma", + "pct_reason_not_tested_time", + "pct_reason_not_tested_travel", + "pct_reason_not_tested_tried", + "pct_reason_not_tested_none", + "pct_taken_temp", + "pct_symp_aches", + "pct_symp_chest_pain", + "pct_symp_chills", + "pct_symp_cough", + "pct_symp_diarrhea", + "pct_symp_diff_breathing", + "pct_symp_eye_pain", + "pct_symp_fatigue", + "pct_symp_fever", + "pct_symp_headache", + "pct_symp_nasal_congestion", + "pct_symp_nausea", + "pct_symp_none", + "pct_symp_other", + "pct_symp_runny_nose", + "pct_symp_shortness_breath", + "pct_symp_sleep_changes", + "pct_symp_stuffy_nose", + "pct_symp_unusual_given_fever", + "pct_symp_unusual_given_cough", + "pct_symp_unusual_given_shortness_breath", + "pct_symp_unusual_given_diff_breathing", + "pct_symp_unusual_given_fatigue", + "pct_symp_unusual_given_nasal_congestion", + "pct_symp_unusual_given_runny_nose", + "pct_symp_unusual_given_aches", + "pct_symp_unusual_given_sore_throat", + "pct_symp_unusual_given_chest_pain", + "pct_symp_unusual_given_nausea", + "pct_symp_unusual_given_diarrhea", + "pct_symp_unusual_given_anosmia", + "pct_symp_unusual_given_other", + "pct_symp_unusual_given_eye_pain", + "pct_symp_unusual_given_chills", + "pct_symp_unusual_given_headache", + "pct_symp_unusual_given_sleep_changes", + "pct_symp_unusual_given_stuffy_nose", + "pct_unusual_symptom_fever", + "pct_unusual_symptom_cough", + "pct_unusual_symptom_shortness_breath", + "pct_unusual_symptom_breathing", + "pct_unusual_symptom_tired", + "pct_unusual_symptom_congestion", + "pct_unusual_symptom_runnynose", + "pct_unusual_symptom_muscle", + "pct_unusual_symptom_sorethroat", + "pct_unusual_symptom_chestpain", + "pct_unusual_symptom_nausea", + "pct_unusual_symptom_diarrhea", + "pct_unusual_symptom_anosmia", + "pct_unusual_symptom_eyepain", + "pct_unusual_symptom_chills", + "pct_unusual_symptom_headache", + "pct_unusual_symptom_sleep_changes", + "pct_unusual_symptom_stuffy_nose", + "pct_unusual_symptom_other", + "pct_unusual_symptom_hospital", + "pct_unusual_symptom_hospital_tried", + "pct_unusual_symptom_medical_care_called_doctor", + "pct_unusual_symptom_medical_care_telemedicine", + "pct_unusual_symptom_medical_care_visited_doctor", + "pct_unusual_symptom_medical_care_urgent_care", + "pct_unusual_symptom_medical_care_er", + "pct_unusual_symptom_medical_care_hospital", + "pct_unusual_symptom_medical_care_tried", + "pct_unusual_symptom_tested", + "pct_unusual_symptom_tested_positive" + ), + "behavior_and_mental_health" = c( + "pct_large_event_1d", + "pct_mask_large_event_1d", + "pct_mask_public_transit_1d", + "pct_mask_restaurant_1d", + "pct_mask_shop_1d", + "pct_mask_spent_time_1d", + "pct_mask_shop_indoors_1d", + "pct_mask_restaurant_indoors_1d", + "pct_mask_spent_time_indoors_1d", + "pct_mask_large_event_indoors_1d", + "pct_mask_work_outside_home_1d", + "pct_mask_work_outside_home_indoors_1d", + "pct_public_transit_1d", + "pct_shop_1d", + "pct_spent_time_1d", + "pct_restaurant_1d", + "pct_shop_indoors_1d", + "pct_restaurant_indoors_1d", + "pct_spent_time_indoors_1d", + "pct_large_event_indoors_1d", + "pct_travel_outside_state_5d", + "pct_travel_outside_state_7d", + "pct_work_outside_home_1d", + "pct_work_outside_home_indoors_1d", + "pct_work_outside_home_5d", + "pct_anxious_5d", + "pct_anxious_5d_alt", + "pct_anxious_7d", + "pct_anxious_7d_alt", + "pct_depressed_5d", + "pct_depressed_5d_alt", + "pct_depressed_7d", + "pct_depressed_7d_alt", + "pct_felt_isolated_5d", + "pct_felt_isolated_5d_alt", + "pct_felt_isolated_7d", + "pct_felt_isolated_7d_alt", + "pct_delayed_care_cost", + "pct_race_treated_fairly_healthcare", + "pct_worried_become_ill", + "pct_direct_contact", + "pct_finance", + "pct_wearing_mask_5d", + "pct_wearing_mask_5d_alt", + "pct_wearing_mask_7d", + "pct_wearing_mask_7d_alt", + "pct_others_masked", + "pct_others_masked_alt", + "pct_avoid_contact", + "pct_avoid_contact_7d", + "pct_covid_vaccinated_friends_alt", + "pct_depressed_7d_alt", + "pct_direct_contact_covid", + "pct_direct_contact_covid_hh", + "pct_finance_alt", + "pct_financial_threat", + "pct_others_distanced_public_alt", + "pct_others_masked_public", + "pct_others_masked_public_alt", + "pct_wearing_mask_7d_alt", + "pct_work_healthcare_5d", + "pct_work_nursing_home_5d", + "pct_work_outside_home_4w", + "pct_work_outside_home_5d" + ), + "norms_information_beliefs" = c( + "pct_belief_children_immune", + "pct_belief_created_small_group", + "pct_belief_distancing_effective", + "pct_belief_govt_exploitation", + "pct_belief_masking_effective", + "pct_belief_vaccinated_mask_unnecessary", + "pct_covid_vaccinated_friends", + "pct_others_distanced_public", + "pct_others_masked_public", + "pct_received_news_experts", + "pct_received_news_friends", + "pct_received_news_govt_health", + "pct_received_news_journalists", + "pct_received_news_local_health", + "pct_received_news_none", + "pct_received_news_politicians", + "pct_received_news_religious", + "pct_received_news_cdc", + "pct_want_info_children_education", + "pct_want_info_covid_treatment", + "pct_want_info_covid_variants", + "pct_want_info_employment", + "pct_want_info_mental_health", + "pct_want_info_none", + "pct_want_info_relationships", + "pct_want_info_vaccine_access", + "pct_want_info_vaccine_types", + "pct_worried_catch_covid" + ), + "parenting" = c( + "pct_child_school_homeschool", + "pct_child_school_not", + "pct_child_school_other", + "pct_child_school_private", + "pct_child_school_public", + "pct_child_vaccine_already", + "pct_child_vaccine_no_def", + "pct_child_vaccine_no_prob", + "pct_child_vaccine_vaccinated_or_accept", + "pct_child_vaccine_yes_def", + "pct_child_vaccine_yes_prob", + "pct_has_child_under_18", + "pct_oldest_child_under_5", + "pct_oldest_child_12_to_15", + "pct_oldest_child_16_to_17", + "pct_oldest_child_5_to_11", + "pct_children_gr1_5", + "pct_children_gr6_8", + "pct_children_gr9_12", + "pct_children_prek", + "pct_children_school_measure_cafeteria", + "pct_children_school_measure_class_size", + "pct_children_school_measure_desk_shield", + "pct_children_school_measure_desk_space", + "pct_children_school_measure_entry", + "pct_children_school_measure_extracurricular", + "pct_children_school_measure_mask_students", + "pct_children_school_measure_mask_teachers", + "pct_children_school_measure_outdoor", + "pct_children_school_measure_playground", + "pct_children_school_measure_same_students", + "pct_children_school_measure_same_teacher", + "pct_children_school_measure_screening", + "pct_children_school_measure_supplies", + "pct_inperson_school_fulltime", + "pct_inperson_school_parttime", + "pct_school_safety_measures_mask_students", + "pct_school_safety_measures_mask_teachers", + "pct_school_safety_measures_restricted_entry", + "pct_school_safety_measures_separators", + "pct_school_safety_measures_extracurricular", + "pct_school_safety_measures_symptom_screen", + "pct_school_safety_measures_ventilation", + "pct_school_safety_measures_testing_staff", + "pct_school_safety_measures_testing_students", + "pct_school_safety_measures_vaccine_staff", + "pct_school_safety_measures_vaccine_students", + "pct_school_safety_measures_cafeteria", + "pct_school_safety_measures_dont_know", + "pct_remote_school_fulltime_oldest", + "pct_inperson_school_fulltime_oldest", + "pct_inperson_school_parttime_oldest", + "pct_vaccinate_children", + "pct_child_vaccine_vaccinated_or_accept" + ) +) + #' Make tables specifying aggregations to output #' #' Each row represents one aggregate to report. `name` is the aggregate's base @@ -114,7 +670,7 @@ get_aggs <- function() { "pct_symp_chest_pain", "symp_chest_pain", compute_binary, jeffreys_binary, "pct_symp_nausea", "symp_nausea", compute_binary, jeffreys_binary, "pct_symp_diarrhea", "symp_diarrhea", compute_binary, jeffreys_binary, - "pct_anosmia", "symp_loss_smell_taste", compute_binary, jeffreys_binary, + "pct_symp_anosmia", "symp_loss_smell_taste", compute_binary, jeffreys_binary, "pct_symp_other", "symp_other", compute_binary, jeffreys_binary, "pct_symp_none", "symp_none", compute_binary, jeffreys_binary, "pct_symp_eye_pain", "symp_eye_pain", compute_binary, jeffreys_binary, @@ -124,24 +680,45 @@ get_aggs <- function() { "pct_symp_stuffy_nose", "symp_stuffy_nose", compute_binary, jeffreys_binary, # unusual symptoms - "pct_symp_fever_unusual", "symp_fever_unusual", compute_binary, jeffreys_binary, - "pct_symp_cough_unusual", "symp_cough_unusual", compute_binary, jeffreys_binary, - "pct_symp_shortness_breath_unusual", "symp_shortness_breath_unusual", compute_binary, jeffreys_binary, - "pct_symp_diff_breathing_unusual", "symp_diff_breathing_unusual", compute_binary, jeffreys_binary, - "pct_symp_fatigue_unusual", "symp_fatigue_unusual", compute_binary, jeffreys_binary, - "pct_symp_nasal_congestion_unusual", "symp_nasal_congestion_unusual", compute_binary, jeffreys_binary, - "pct_symp_runny_nose_unusual", "symp_runny_nose_unusual", compute_binary, jeffreys_binary, - "pct_symp_aches_unusual", "symp_aches_unusual", compute_binary, jeffreys_binary, - "pct_symp_sore_throat_unusual", "symp_sore_throat_unusual", compute_binary, jeffreys_binary, - "pct_symp_chest_pain_unusual", "symp_chest_pain_unusual", compute_binary, jeffreys_binary, - "pct_symp_nausea_unusual", "symp_nausea_unusual", compute_binary, jeffreys_binary, - "pct_symp_diarrhea_unusual", "symp_diarrhea_unusual", compute_binary, jeffreys_binary, - "pct_anosmia_unusual", "symp_loss_smell_taste_unusual", compute_binary, jeffreys_binary, - "pct_symp_eye_pain_unusual", "symp_eye_pain_unusual", compute_binary, jeffreys_binary, - "pct_symp_chills_unusual", "symp_chills_unusual", compute_binary, jeffreys_binary, - "pct_symp_headache_unusual", "symp_headache_unusual", compute_binary, jeffreys_binary, - "pct_symp_sleep_changes_unusual", "symp_sleep_changes_unusual", compute_binary, jeffreys_binary, - "pct_symp_stuffy_nose_unusual", "symp_stuffy_nose_unusual", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_fever", "symp_unusual_given_fever", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_cough", "symp_unusual_given_cough", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_shortness_breath", "symp_unusual_given_shortness_breath", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_diff_breathing", "symp_unusual_given_diff_breathing", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_fatigue", "symp_unusual_given_fatigue", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_nasal_congestion", "symp_unusual_given_nasal_congestion", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_runny_nose", "symp_unusual_given_runny_nose", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_aches", "symp_unusual_given_aches", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_sore_throat", "symp_unusual_given_sore_throat", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_chest_pain", "symp_unusual_given_chest_pain", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_nausea", "symp_unusual_given_nausea", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_diarrhea", "symp_unusual_given_diarrhea", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_anosmia", "symp_unusual_given_loss_smell_taste", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_other", "symp_unusual_given_other", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_eye_pain", "symp_unusual_given_eye_pain", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_chills", "symp_unusual_given_chills", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_headache", "symp_unusual_given_headache", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_sleep_changes", "symp_unusual_given_sleep_changes", compute_binary, jeffreys_binary, + "pct_symp_unusual_given_stuffy_nose", "symp_unusual_given_stuffy_nose", compute_binary, jeffreys_binary, + + "pct_unusual_symptom_fever", "symp_fever_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_cough", "symp_cough_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_shortness_breath", "symp_shortness_breath_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_breathing", "symp_diff_breathing_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_tired", "symp_fatigue_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_congestion", "symp_nasal_congestion_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_runnynose", "symp_runny_nose_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_muscle", "symp_aches_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_sorethroat", "symp_sore_throat_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_chestpain", "symp_chest_pain_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_nausea", "symp_nausea_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_diarrhea", "symp_diarrhea_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_anosmia", "symp_loss_smell_taste_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_eyepain", "symp_eye_pain_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_chills", "symp_chills_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_headache", "symp_headache_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_sleep_changes", "symp_sleep_changes_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_stuffy_nose", "symp_stuffy_nose_unusual", compute_binary, jeffreys_binary, + "pct_unusual_symptom_other", "symp_other_unusual", compute_binary, jeffreys_binary, # vaccines "pct_vaccinated", "v_covid_vaccinated", compute_binary, jeffreys_binary, @@ -158,7 +735,7 @@ get_aggs <- function() { "pct_covid_vaccinated_friends_alt", "v_covid_vaccinated_some_friends", compute_binary, jeffreys_binary, "pct_vaccinate_children", "v_vaccinate_children", compute_binary, jeffreys_binary, - "pct_vaccinate_child_oldest", "v_vaccinate_child_oldest", compute_binary, jeffreys_binary, + "pct_child_vaccine_vaccinated_or_accept", "v_vaccinate_child_oldest", compute_binary, jeffreys_binary, "pct_child_vaccine_already", "v_child_vaccine_already", compute_binary, jeffreys_multinomial_factory(5), "pct_child_vaccine_yes_def", "v_child_vaccine_yes_def", compute_binary, jeffreys_multinomial_factory(5), @@ -192,7 +769,9 @@ get_aggs <- function() { "pct_vaccinated_booster_probno", "v_vaccinated_booster_probno", compute_binary, jeffreys_multinomial_factory(4), "pct_vaccinated_booster_defno", "v_vaccinated_booster_defno", compute_binary, jeffreys_multinomial_factory(4), - "pct_vaccine_all_doses", "v_received_all_doses", compute_binary, jeffreys_binary, + "pct_receive_all_doses_yes", "v_receive_all_doses_yes", compute_binary, jeffreys_multinomial_factory(3), + "pct_receive_all_doses_plan", "v_receive_all_doses_plan", compute_binary, jeffreys_multinomial_factory(3), + "pct_receive_all_doses_noplan", "v_receive_all_doses_noplan", compute_binary, jeffreys_multinomial_factory(3), "pct_flu_shot_1y", "v_flu_vaccinated_1y", compute_binary, jeffreys_binary, "pct_flu_vaccine_june_2020", "v_flu_vaccinated_june_2020", compute_binary, jeffreys_binary, @@ -336,6 +915,23 @@ get_aggs <- function() { "pct_defno_dontneed_reason_not_beneficial", "v_defno_dontneed_reason_not_beneficial", compute_binary, jeffreys_binary, "pct_defno_dontneed_reason_other", "v_defno_dontneed_reason_other", compute_binary, jeffreys_binary, + # Combined (V5abcd) barriers to vaccination + "pct_barrier_reason_sideeffect", "v_overall_barrier_reason_sideeffect", compute_binary, jeffreys_binary, + "pct_barrier_reason_allergic", "v_overall_barrier_reason_allergic", compute_binary, jeffreys_binary, + "pct_barrier_reason_wontwork", "v_overall_barrier_reason_wontwork", compute_binary, jeffreys_binary, + "pct_barrier_reason_dontbelieve", "v_overall_barrier_reason_dontbelieve", compute_binary, jeffreys_binary, + "pct_barrier_reason_dontlike", "v_overall_barrier_reason_dontlike", compute_binary, jeffreys_binary, + "pct_barrier_reason_not_recommended", "v_overall_barrier_reason_not_recommended", compute_binary, jeffreys_binary, + "pct_barrier_reason_wait", "v_overall_barrier_reason_wait", compute_binary, jeffreys_binary, + "pct_barrier_reason_otherpeople", "v_overall_barrier_reason_otherpeople", compute_binary, jeffreys_binary, + "pct_barrier_reason_cost", "v_overall_barrier_reason_cost", compute_binary, jeffreys_binary, + "pct_barrier_reason_distrust_vaccine", "v_overall_barrier_reason_distrust_vaccine", compute_binary, jeffreys_binary, + "pct_barrier_reason_distrust_gov", "v_overall_barrier_reason_distrust_gov", compute_binary, jeffreys_binary, + "pct_barrier_reason_health", "v_overall_barrier_reason_health", compute_binary, jeffreys_binary, + "pct_barrier_reason_other", "v_overall_barrier_reason_other", compute_binary, jeffreys_binary, + "pct_barrier_reason_pregnant", "v_overall_barrier_reason_pregnant", compute_binary, jeffreys_binary, + "pct_barrier_reason_religion", "v_overall_barrier_reason_religion", compute_binary, jeffreys_binary, + "pct_informed_access", "v_informed_access", compute_binary, jeffreys_binary, # appointments @@ -401,10 +997,12 @@ get_aggs <- function() { "pct_tested_positive_14d", "t_tested_positive_14d", compute_binary, jeffreys_binary, "pct_wanted_test_14d", "t_wanted_test_14d", compute_binary, jeffreys_binary, "pct_ever_tested", "t_ever_tested", compute_binary, jeffreys_binary, + "pct_ever_tested_positive", "t_ever_tested_positive", compute_binary, jeffreys_binary, "pct_unusual_symptom_tested", "t_unusual_symptom_tested", compute_binary, jeffreys_binary, "pct_unusual_symptom_tested_positive", "t_unusual_symptom_tested_positive", compute_binary, jeffreys_binary, "pct_unusual_symptom_hospital", "t_unusual_symptom_hospital", compute_binary, jeffreys_binary, + "pct_unusual_symptom_hospital_tried", "t_unusual_symptom_hospital_tried", compute_binary, jeffreys_binary, "pct_unusual_symptom_medical_care_called_doctor", "unusual_symptom_medical_care_called_doctor", compute_binary, jeffreys_binary, "pct_unusual_symptom_medical_care_telemedicine", "unusual_symptom_medical_care_telemedicine", compute_binary, jeffreys_binary, @@ -454,9 +1052,9 @@ get_aggs <- function() { "pct_depressed_7d_alt", "mh_some_depressed_7d", compute_binary, jeffreys_binary, "pct_felt_isolated_5d", "mh_isolated", compute_binary, jeffreys_binary, - "pct_isolated_5d_alt", "mh_some_isolated", compute_binary, jeffreys_binary, + "pct_felt_isolated_5d_alt", "mh_some_isolated", compute_binary, jeffreys_binary, "pct_felt_isolated_7d", "mh_isolated_7d", compute_binary, jeffreys_binary, - "pct_isolated_7d_alt", "mh_some_isolated_7d", compute_binary, jeffreys_binary, + "pct_felt_isolated_7d_alt", "mh_some_isolated_7d", compute_binary, jeffreys_binary, # travel outside state # pre-wave 10 @@ -554,15 +1152,30 @@ get_aggs <- function() { "pct_school_safety_measures_cafeteria", "s_school_safety_measures_cafeteria", compute_binary, jeffreys_binary, "pct_school_safety_measures_dont_know", "s_school_safety_measures_dont_know", compute_binary, jeffreys_binary, + # Schooling types + "pct_child_school_public", "s_child_school_public", compute_binary, jeffreys_multinomial_factory(5), + "pct_child_school_private", "s_child_school_private", compute_binary, jeffreys_multinomial_factory(5), + "pct_child_school_homeschool", "s_child_school_homeschool", compute_binary, jeffreys_multinomial_factory(5), + "pct_child_school_not", "s_child_school_not", compute_binary, jeffreys_multinomial_factory(5), + "pct_child_school_other", "s_child_school_other", compute_binary, jeffreys_multinomial_factory(5), + + # Children ages + "pct_oldest_child_under_5", "ch_oldest_child_under_5", compute_binary, jeffreys_multinomial_factory(4), + "pct_oldest_child_5_to_11", "ch_oldest_child_5_to_11", compute_binary, jeffreys_multinomial_factory(4), + "pct_oldest_child_12_to_15", "ch_oldest_child_12_to_15", compute_binary, jeffreys_multinomial_factory(4), + "pct_oldest_child_16_to_17", "ch_oldest_child_16_to_17", compute_binary, jeffreys_multinomial_factory(4), + + "pct_has_child_under_18", "ch_has_child_under_18", compute_binary, jeffreys_multinomial_factory(4), + # Means. No post-processing required. "mean_days_symptoms", "symp_n_days", compute_numeric_mean, I, "mean_ppl_symptoms_household", "hh_number_sick", compute_numeric_mean, I, "mean_ppl_symptoms_community", "community_number_sick", compute_numeric_mean, I, - "mean_hh_number_children", "hh_number_children", compute_numeric_mean, I, - "mean_hh_number_adults", "hh_number_adults", compute_numeric_mean, I, - "mean_hh_number_older", "hh_number_older", compute_numeric_mean, I, - "mean_hh_number_total", "hh_number_total", compute_numeric_mean, I, + "mean_ppl_in_household_children", "ppl_in_household_children", compute_numeric_mean, I, + "mean_ppl_in_household_adults", "ppl_in_household_adults", compute_numeric_mean, I, + "mean_ppl_in_household_olderadults", "ppl_in_household_older", compute_numeric_mean, I, + "mean_ppl_in_household", "hh_number_total", compute_numeric_mean, I, "mean_children_in_household", "children_in_household", compute_numeric_mean, I, "mean_adults_in_household", "adults_in_household", compute_numeric_mean, I, @@ -694,13 +1307,6 @@ get_aggs <- function() { "pct_children_gr6_8", "children_gr6_8", compute_binary, jeffreys_binary, "pct_children_gr9_12", "children_gr9_12", compute_binary, jeffreys_binary, - # Already in main grouping, including "overall". Just need to make sure to include in demo/parenting tables. - # "pct_inperson_school_fulltime", "s_inperson_school_fulltime", compute_binary, jeffreys_binary, - # "pct_inperson_school_parttime", "s_inperson_school_parttime", compute_binary, jeffreys_binary, - # "pct_inperson_school_fulltime_oldest", "s_inperson_school_fulltime_oldest", compute_binary, jeffreys_binary, - # "pct_remote_school_fulltime_oldest", "s_remote_school_fulltime_oldest", compute_binary, jeffreys_binary, - # "pct_inperson_school_parttime_oldest", "s_inperson_school_parttime_oldest", compute_binary, jeffreys_binary, - "pct_children_school_measure_mask_students", "children_school_measure_mask_students", compute_binary, jeffreys_binary, "pct_children_school_measure_mask_teachers", "children_school_measure_mask_teachers", compute_binary, jeffreys_binary, "pct_children_school_measure_same_teacher", "children_school_measure_same_teacher", compute_binary, jeffreys_binary, @@ -731,24 +1337,20 @@ get_aggs <- function() { "pct_occ_4w_maintenance", "occ_4w_maintenance", compute_binary, jeffreys_multinomial_factory(16), "pct_occ_4w_production", "occ_4w_production", compute_binary, jeffreys_multinomial_factory(16), "pct_occ_4w_transportation", "occ_4w_transportation", compute_binary, jeffreys_multinomial_factory(16), - "pct_occ_4w_other", "occ_4w_other", compute_binary, jeffreys_multinomial_factory(16), - - "pct_", "", compute_binary, jeffreys_binary, + "pct_occ_4w_other", "occ_4w_other", compute_binary, jeffreys_multinomial_factory(16) ) - demo_aggs <- create_aggs_product( - regsions, - demo_groups, - demo_indicators + demo_aggs <- rbind( + create_aggs_product(regions, demo_groups, demo_indicators), + create_aggs_product(list("county"), list(c()), demo_indicators) ) - ## Parenting cuts parent_groups <- list(c("child_age")) - parent_indicators <- tribble() + parent_indicators <- filter(indicators, name %in% THEME_GROUPS[["parenting"]]) parent_aggs <- create_aggs_product(regions, parent_groups, parent_indicators) - weekly_aggs <- rbind(aggs, demo_aggs) - monthly_aggs <- rbind(aggs, demo_aggs) + weekly_aggs <- rbind(aggs, demo_aggs, parent_aggs) + monthly_aggs <- rbind(aggs, demo_aggs, parent_aggs) return(list("week"=weekly_aggs, "month"=monthly_aggs)) } diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 4435d8266..99771ecc8 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -257,14 +257,13 @@ code_addl_vaccines <- function(input_data, wave) { if ("V2a" %in% names(input_data)) { # coded as 1 = Yes, received all recommended doses, 2 = Plan to receive all recommended doses, # 3 = Don't plan to receive all recommended doses. - input_data$v_received_all_doses <- case_when( - input_data$V2a == 1 ~ 1, - input_data$V2a == 2 ~ 0, - input_data$V2a == 3 ~ 0, - TRUE ~ NA_real_ - ) + input_data$v_receive_all_doses_yes <- input_data$V2a == 1 + input_data$v_receive_all_doses_plan <- input_data$V2a == 2 + input_data$v_receive_all_doses_noplan <- input_data$V2a == 3 } else { - input_data$v_received_all_doses <- NA_real_ + input_data$v_receive_all_doses_yes <- NA_real_ + input_data$v_receive_all_doses_plan <- NA_real_ + input_data$v_receive_all_doses_noplan <- NA_real_ } # hesitant_vaccine @@ -342,6 +341,13 @@ code_addl_vaccines <- function(input_data, wave) { } else { input_data$t_ever_tested <- NA } + + if ("B11" %in% names(input_data)) { + # Coded as 1 = Yes, 2 = No, 3 = don't know. + input_data$t_ever_tested_positive <- input_data$B11 == 1 + } else { + input_data$t_ever_tested_positive <- NA + } if ("B5" %in% names(input_data)) { # Coded as 1 = "tested and COVID+", 2 = "tested and COVID-", @@ -362,8 +368,10 @@ code_addl_vaccines <- function(input_data, wave) { if ("B6" %in% names(input_data)) { input_data$t_unusual_symptom_hospital <- input_data$B6 == 1 + input_data$t_unusual_symptom_hospital_tried <- input_data$B6 == 1 | input_data$B6 == 3 } else { input_data$t_unusual_symptom_hospital <- NA + input_data$t_unusual_symptom_hospital_tried <- NA } if ("B7" %in% names(input_data)) { @@ -447,7 +455,24 @@ if ("V5d" %in% names(input_data)) { input_data$v_vaccine_incomplete_religion <- NA_real_ } -if ("C2" %in% names(input_data)) { + # Overall barriers to vaccination from V5abcd. + input_data$v_overall_barrier_reason_sideeffect <- input_data$v_hesitancy_reason_sideeffects | input_data$v_vaccine_incomplete_sideeffect + input_data$v_overall_barrier_reason_allergic <- input_data$v_hesitancy_reason_allergic | input_data$v_vaccine_incomplete_allergic + input_data$v_overall_barrier_reason_wontwork <- input_data$v_hesitancy_reason_ineffective | input_data$v_vaccine_incomplete_wontwork + input_data$v_overall_barrier_reason_dontbelieve <- input_data$v_hesitancy_reason_unnecessary | input_data$v_vaccine_incomplete_dontbelieve + input_data$v_overall_barrier_reason_dontlike <- input_data$v_hesitancy_reason_dislike_vaccines | input_data$v_vaccine_incomplete_dontlike + input_data$v_overall_barrier_reason_not_recommended <- input_data$v_hesitancy_reason_not_recommended | input_data$v_vaccine_incomplete_not_recommended + input_data$v_overall_barrier_reason_wait <- input_data$v_hesitancy_reason_wait_safety | input_data$v_vaccine_incomplete_wait + input_data$v_overall_barrier_reason_otherpeople <- input_data$v_hesitancy_reason_low_priority | input_data$v_vaccine_incomplete_otherpeople + input_data$v_overall_barrier_reason_cost <- input_data$v_hesitancy_reason_cost | input_data$v_vaccine_incomplete_cost + input_data$v_overall_barrier_reason_distrust_vaccine <- input_data$v_hesitancy_reason_distrust_vaccines | input_data$v_vaccine_incomplete_distrust_vaccine + input_data$v_overall_barrier_reason_distrust_gov <- input_data$v_hesitancy_reason_distrust_gov | input_data$v_vaccine_incomplete_distrust_gov + input_data$v_overall_barrier_reason_health <- input_data$v_hesitancy_reason_health_condition | input_data$v_vaccine_incomplete_health + input_data$v_overall_barrier_reason_other <- input_data$v_hesitancy_reason_other | input_data$v_vaccine_incomplete_other + input_data$v_overall_barrier_reason_pregnant <- input_data$v_hesitancy_reason_pregnant | input_data$v_vaccine_incomplete_pregnant + input_data$v_overall_barrier_reason_religion <- input_data$v_hesitancy_reason_religious | input_data$v_vaccine_incomplete_religion + + if ("C2" %in% names(input_data)) { # Coded as 1 = "Yes", 2 = "No" input_data$v_flu_vaccinated_1y <- input_data$C2 == 1 } else { @@ -1156,62 +1181,105 @@ code_addl_symptoms <- function(input_data, wave) { if ("B2c" %in% names(input_data)) { symptoms <- split_options(input_data$B2c) + + input_data$symp_fever_unusual <- is_selected(symptoms, "1") + input_data$symp_cough_unusual <- is_selected(symptoms, "2") + input_data$symp_shortness_breath_unusual <- is_selected(symptoms, "3") + input_data$symp_diff_breathing_unusual <- is_selected(symptoms, "4") + input_data$symp_fatigue_unusual <- is_selected(symptoms, "5") + input_data$symp_nasal_congestion_unusual <- is_selected(symptoms, "6") + input_data$symp_runny_nose_unusual <- is_selected(symptoms, "7") + input_data$symp_aches_unusual <- is_selected(symptoms, "8") + input_data$symp_sore_throat_unusual <- is_selected(symptoms, "9") + input_data$symp_chest_pain_unusual <- is_selected(symptoms, "10") + input_data$symp_nausea_unusual <- is_selected(symptoms, "11") + input_data$symp_diarrhea_unusual <- is_selected(symptoms, "12") + input_data$symp_loss_smell_taste_unusual <- is_selected(symptoms, "13") + input_data$symp_loss_smell_taste_unusual <- is_selected(symptoms, "14") + input_data$symp_eye_pain_unusual <- is_selected(symptoms, "16") + input_data$symp_chills_unusual <- is_selected(symptoms, "17") + input_data$symp_headache_unusual <- is_selected(symptoms, "18") + input_data$symp_sleep_changes_unusual <- is_selected(symptoms, "19") + input_data$symp_stuffy_nose_unusual <- is_selected(symptoms, "20") - input_data$symp_fever_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_fever <- calc_unusual_given_symptom( input_data$symp_fever, is_selected(symptoms, "1") ) - input_data$symp_cough_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_cough <- calc_unusual_given_symptom( input_data$symp_cough, is_selected(symptoms, "2") ) - input_data$symp_shortness_breath_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_shortness_breath <- calc_unusual_given_symptom( input_data$symp_shortness_breath, is_selected(symptoms, "3") ) - input_data$symp_diff_breathing_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_diff_breathing <- calc_unusual_given_symptom( input_data$symp_diff_breathing, is_selected(symptoms, "4") ) - input_data$symp_fatigue_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_fatigue <- calc_unusual_given_symptom( input_data$symp_fatigue, is_selected(symptoms, "5") ) - input_data$symp_nasal_congestion_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_nasal_congestion <- calc_unusual_given_symptom( input_data$symp_nasal_congestion, is_selected(symptoms, "6") ) - input_data$symp_runny_nose_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_runny_nose <- calc_unusual_given_symptom( input_data$symp_runny_nose, is_selected(symptoms, "7") ) - input_data$symp_aches_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_aches <- calc_unusual_given_symptom( input_data$symp_aches, is_selected(symptoms, "8") ) - input_data$symp_sore_throat_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_sore_throat <- calc_unusual_given_symptom( input_data$symp_sore_throat, is_selected(symptoms, "9") ) - input_data$symp_chest_pain_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_chest_pain <- calc_unusual_given_symptom( input_data$symp_chest_pain, is_selected(symptoms, "10") ) - input_data$symp_nausea_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_nausea <- calc_unusual_given_symptom( input_data$symp_nausea, is_selected(symptoms, "11") ) - input_data$symp_diarrhea_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_diarrhea <- calc_unusual_given_symptom( input_data$symp_diarrhea, is_selected(symptoms, "12") ) - input_data$symp_loss_smell_taste_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_loss_smell_taste <- calc_unusual_given_symptom( input_data$symp_loss_smell_taste, is_selected(symptoms, "13") ) - input_data$symp_eye_pain_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_other <- calc_unusual_given_symptom( + input_data$symp_other, is_selected(symptoms, "14") + ) + input_data$symp_unusual_given_eye_pain <- calc_unusual_given_symptom( input_data$symp_eye_pain, is_selected(symptoms, "16") ) - input_data$symp_chills_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_chills <- calc_unusual_given_symptom( input_data$symp_chills, is_selected(symptoms, "17") ) - input_data$symp_headache_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_headache <- calc_unusual_given_symptom( input_data$symp_headache, is_selected(symptoms, "18") ) - input_data$symp_sleep_changes_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_sleep_changes <- calc_unusual_given_symptom( input_data$symp_sleep_changes, is_selected(symptoms, "19") ) - input_data$symp_stuffy_nose_unusual <- calc_unusual_given_symptom( + input_data$symp_unusual_given_stuffy_nose <- calc_unusual_given_symptom( input_data$symp_stuffy_nose, is_selected(symptoms, "20") ) } else { + input_data$symp_unusual_given_fever <- NA + input_data$symp_unusual_given_cough <- NA + input_data$symp_unusual_given_shortness_breath <- NA + input_data$symp_unusual_given_diff_breathing <- NA + input_data$symp_unusual_given_fatigue <- NA + input_data$symp_unusual_given_nasal_congestion <- NA + input_data$symp_unusual_given_runny_nose <- NA + input_data$symp_unusual_given_aches <- NA + input_data$symp_unusual_given_sore_throat <- NA + input_data$symp_unusual_given_chest_pain <- NA + input_data$symp_unusual_given_nausea <- NA + input_data$symp_unusual_given_diarrhea <- NA + input_data$symp_unusual_given_loss_smell_taste <- NA + input_data$symp_unusual_given_other <- NA + input_data$symp_unusual_given_eye_pain <- NA + input_data$symp_unusual_given_chills <- NA + input_data$symp_unusual_given_headache <- NA + input_data$symp_unusual_given_sleep_changes <- NA + input_data$symp_unusual_given_stuffy_nose <- NA + input_data$symp_fever_unusual <- NA input_data$symp_cough_unusual <- NA input_data$symp_shortness_breath_unusual <- NA @@ -1230,6 +1298,7 @@ code_addl_symptoms <- function(input_data, wave) { input_data$symp_headache_unusual <- NA input_data$symp_sleep_changes_unusual <- NA input_data$symp_stuffy_nose_unusual <- NA + input_data$symp_stuffy_nose_unusual <- NA } if ("B4" %in% names(input_data)) { @@ -1270,23 +1339,15 @@ code_behaviors <- function(input_data, wave) { if ("C11" %in% names(input_data)) { # Had "direct contact" with someone COVID-positive in the last 24 hours # Coded as 1 = Yes, 2 = No - input_data$c_direct_contact_covid <- case_when( - input_data$C11 == 1 ~ 1, - input_data$C11 == 2 ~ 0, - TRUE ~ NA_real_ - ) + input_data$c_direct_contact_covid <- input_data$C11 == 1 } else { input_data$c_direct_contact_covid <- NA_real_ } - if (all(c("C11", "C12") %in% names(input_data))) { + if ("C12" %in% names(input_data)) { # C12: was the person in C11 a member of your household # Coded as 1 = Yes, 2 = No - input_data$c_direct_contact_covid_hh <- case_when( - input_data$C11 == 1 & input_data$C12 == 1 ~ 1, - input_data$C11 == 2 | input_data$C12 == 2 ~ 0, - TRUE ~ NA_real_ - ) + input_data$c_direct_contact_covid_hh <- input_data$C12 == 1 } else { input_data$c_direct_contact_covid_hh <- NA_real_ } @@ -1364,10 +1425,7 @@ code_addl_mental_health <- function(input_data, wave) { if ("Q36" %in% names(input_data)) { # Included in waves 1, 2, 3. Coded as 1 = substantial threat, # 2 = moderate threat, 3 = not much of a threat, 4 = not a threat at all - input_data$mh_financial_threat <- case_when( - is.na(input_data$Q36) ~ NA, - input_data$Q36 == 1 ~ TRUE, - TRUE ~ FALSE) + input_data$mh_financial_threat <- input_data$Q36 == 1 } else { input_data$mh_financial_threat <- NA } @@ -1511,7 +1569,7 @@ code_addl_activities <- function(input_data, wave) { #' @return augmented data frame code_addl_demographic <- function(input_data, wave) { if ("D1" %in% names(input_data)) { - # Coded as 1 = male, 2 = female, 3 = non-binary, 4 = self-describe, 5 = no answer + # Coded as 1 = male, 2 = female, 3 = non-binary, 4 = self-describe, 5 = prefer not to answer input_data$gender_male <- input_data$D1 == 1 input_data$gender_female <- input_data$D1 == 2 input_data$gender_nonbinary_other <- case_when( From 0a981e52f072fca79e43439bef76843ff7c436dd Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 17 Jun 2022 12:34:14 -0400 Subject: [PATCH 32/49] county metadata --- facebook/delphiFacebook/DESCRIPTION | 2 +- facebook/delphiFacebook/NAMESPACE | 2 + facebook/delphiFacebook/R/contingency_write.R | 50 +++++++++++++++++-- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index c42da0224..beda72167 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -30,5 +30,5 @@ Suggests: testthat (>= 1.0.1), covr (>= 2.2.2) LinkingTo: Rcpp -RoxygenNote: 7.1.1 +RoxygenNote: 7.2.0 Encoding: UTF-8 diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index cfef1c937..4416f8e45 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -69,6 +69,7 @@ importFrom(dplyr,bind_rows) importFrom(dplyr,case_when) importFrom(dplyr,coalesce) importFrom(dplyr,desc) +importFrom(dplyr,distinct) importFrom(dplyr,everything) importFrom(dplyr,filter) importFrom(dplyr,full_join) @@ -121,6 +122,7 @@ importFrom(stringi,stri_split) importFrom(stringi,stri_sub) importFrom(stringi,stri_trans_tolower) importFrom(stringi,stri_trim) +importFrom(stringr,str_pad) importFrom(survey,oldsvyquantile) importFrom(survey,svydesign) importFrom(survey,svymean) diff --git a/facebook/delphiFacebook/R/contingency_write.R b/facebook/delphiFacebook/R/contingency_write.R index 58aca8a92..da2d33d1b 100644 --- a/facebook/delphiFacebook/R/contingency_write.R +++ b/facebook/delphiFacebook/R/contingency_write.R @@ -23,7 +23,6 @@ #' @export write_contingency_tables <- function(data, params, geo_type, groupby_vars, theme = NULL) { if (!is.null(data) && nrow(data) != 0) { - # Reorder the group-by columns and sort the dataset by them. groupby_vars <- c("geo_id", sort(setdiff(groupby_vars, "geo_id"))) data <- data %>% @@ -61,8 +60,9 @@ write_contingency_tables <- function(data, params, geo_type, groupby_vars, theme #' @param params A parameters object with the `static_dir` resources folder. #' @param geo_type "nation", "state". #' -#' @importFrom dplyr bind_cols left_join select +#' @importFrom dplyr bind_cols left_join select distinct mutate #' @importFrom readr read_csv cols +#' @importFrom stringr str_pad #' @noRd add_geo_vars <- function(data, params, geo_type) { @@ -75,7 +75,6 @@ add_geo_vars <- function(data, params, geo_type) { ) if (geo_type == "nation") { - rest <- data.frame( region = overall, GID_1 = NA_character_, @@ -86,7 +85,6 @@ add_geo_vars <- function(data, params, geo_type) { ) } else if (geo_type == "state") { - states <- read_csv( file.path(params$static_dir, "state_list.csv"), col_types = cols(.default = "c") @@ -109,7 +107,49 @@ add_geo_vars <- function(data, params, geo_type) { .data$county_fips ) } else if (geo_type == "county") { - warning("county metadata not supported") + counties <- read_csv( + file.path(params$static_dir, "02_20_uszips.csv"), + col_types = cols(.default = "c") + ) %>% + mutate( + fips = str_pad(.data$fips, 5, pad="0") + ) %>% + select(fips, county_name, state_id, state_name) %>% + distinct() + + rest <- data.frame( + county_fips = data$geo_id + ) + + rest <- left_join(rest, counties, by = c("county_fips" = "fips")) %>% + mutate( + region = .data$state_id, + state = .data$state_id, + county = .data$county_name, + county_fips = .data$county_fips + ) %>% + select( + .data$region, + .data$state, + .data$county, + .data$county_fips + ) + + # Fill in state fips and GID_1 + states <- read_csv( + file.path(params$static_dir, "state_list.csv"), + col_types = cols(.default = "c") + ) + + rest <- left_join(rest, states, by = "state") %>% + select( + .data$region, + .data$GID_1, + .data$state, + .data$state_fips, + .data$county, + .data$county_fips + ) } geo_vars <- bind_cols(first, rest) From dd384ffb6e0bcbe0a62052bde71b9a6996da2046 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 22 Jun 2022 17:01:12 -0400 Subject: [PATCH 33/49] swap stringr for stringi --- facebook/delphiFacebook/NAMESPACE | 2 +- facebook/delphiFacebook/R/contingency_write.R | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index 4416f8e45..1890f72ee 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -116,13 +116,13 @@ importFrom(stats,setNames) importFrom(stats,weighted.mean) importFrom(stringi,stri_extract) importFrom(stringi,stri_extract_first) +importFrom(stringi,stri_pad) importFrom(stringi,stri_replace) importFrom(stringi,stri_replace_all) importFrom(stringi,stri_split) importFrom(stringi,stri_sub) importFrom(stringi,stri_trans_tolower) importFrom(stringi,stri_trim) -importFrom(stringr,str_pad) importFrom(survey,oldsvyquantile) importFrom(survey,svydesign) importFrom(survey,svymean) diff --git a/facebook/delphiFacebook/R/contingency_write.R b/facebook/delphiFacebook/R/contingency_write.R index da2d33d1b..01f2346a2 100644 --- a/facebook/delphiFacebook/R/contingency_write.R +++ b/facebook/delphiFacebook/R/contingency_write.R @@ -62,7 +62,7 @@ write_contingency_tables <- function(data, params, geo_type, groupby_vars, theme #' #' @importFrom dplyr bind_cols left_join select distinct mutate #' @importFrom readr read_csv cols -#' @importFrom stringr str_pad +#' @importFrom stringi stri_pad #' @noRd add_geo_vars <- function(data, params, geo_type) { @@ -112,7 +112,7 @@ add_geo_vars <- function(data, params, geo_type) { col_types = cols(.default = "c") ) %>% mutate( - fips = str_pad(.data$fips, 5, pad="0") + fips = stri_pad(.data$fips, 5, pad="0") ) %>% select(fips, county_name, state_id, state_name) %>% distinct() From c653918e6155b435b964211a33d325e63a3d15e3 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 22 Jun 2022 17:08:52 -0400 Subject: [PATCH 34/49] tests --- facebook/delphiFacebook/DESCRIPTION | 2 +- facebook/delphiFacebook/R/contingency_write.R | 2 ++ facebook/delphiFacebook/man/write_contingency_tables.Rd | 2 ++ .../unit-tests/testthat/test-contingency-write.R | 8 ++++---- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index c42da0224..beda72167 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -30,5 +30,5 @@ Suggests: testthat (>= 1.0.1), covr (>= 2.2.2) LinkingTo: Rcpp -RoxygenNote: 7.1.1 +RoxygenNote: 7.2.0 Encoding: UTF-8 diff --git a/facebook/delphiFacebook/R/contingency_write.R b/facebook/delphiFacebook/R/contingency_write.R index 58aca8a92..9ccf0241b 100644 --- a/facebook/delphiFacebook/R/contingency_write.R +++ b/facebook/delphiFacebook/R/contingency_write.R @@ -15,6 +15,8 @@ #' @param geo_type name of the geographic level; used for naming the output file #' @param groupby_vars character vector of column names used for grouping to #' calculate aggregations; used for naming the output file +#' @param theme string indicating theme group (topic) indicators +# belong to according to THEME_GROUPS, or NULL #' #' @importFrom readr write_csv #' @importFrom dplyr arrange across everything diff --git a/facebook/delphiFacebook/man/write_contingency_tables.Rd b/facebook/delphiFacebook/man/write_contingency_tables.Rd index fcdd8bd6f..339c5ffd1 100644 --- a/facebook/delphiFacebook/man/write_contingency_tables.Rd +++ b/facebook/delphiFacebook/man/write_contingency_tables.Rd @@ -21,6 +21,8 @@ write_contingency_tables(data, params, geo_type, groupby_vars, theme = NULL) \item{groupby_vars}{character vector of column names used for grouping to calculate aggregations; used for naming the output file} + +\item{theme}{string indicating theme group (topic) indicators} } \description{ CSV name includes date specifying start of time period aggregated, geo level, diff --git a/facebook/delphiFacebook/unit-tests/testthat/test-contingency-write.R b/facebook/delphiFacebook/unit-tests/testthat/test-contingency-write.R index b479b8d95..2551f86c9 100644 --- a/facebook/delphiFacebook/unit-tests/testthat/test-contingency-write.R +++ b/facebook/delphiFacebook/unit-tests/testthat/test-contingency-write.R @@ -45,9 +45,9 @@ test_that("testing write_contingency_tables command", { aggregate_range = "week"), "state", c("geo_id", "tested")) - expect_setequal(!!dir(tdir), c("20200510_20200516_weekly_state_tested.csv.gz")) + expect_setequal(!!dir(tdir), c("20200510_20200516_weekly_state_all_indicators_tested.csv.gz")) - df <- read_csv(file.path(tdir, "20200510_20200516_weekly_state_tested.csv.gz")) + df <- read_csv(file.path(tdir, "20200510_20200516_weekly_state_all_indicators_tested.csv.gz")) expect_equivalent(df, test_data) }) @@ -59,13 +59,13 @@ test_that("testing command to create output filenames", { end_date=as.Date("2021-01-02") ) out <- get_file_name(params, "nation", c("gender")) - expected <- "DebugOn-DoNotShare_20210101_20210102_monthly_nation_gender.csv.gz" + expected <- "DebugOn-DoNotShare_20210101_20210102_monthly_nation_all_indicators_gender.csv.gz" expect_equal(out, expected) params$debug <- FALSE out <- get_file_name(params, "nation", c("gender", "race", "ethnicity")) - expected <- "20210101_20210102_monthly_nation_ethnicity_gender_race.csv.gz" + expected <- "20210101_20210102_monthly_nation_all_indicators_ethnicity_gender_race.csv.gz" expect_equal(out, expected) }) From 4785af5f2fc360f792b557d7933dfc7e330f0995 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 23 Jun 2022 11:47:19 -0400 Subject: [PATCH 35/49] lower overall sample size threshold --- facebook/delphiFacebook/R/contingency_utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_utils.R b/facebook/delphiFacebook/R/contingency_utils.R index b0f3368ec..5a5cfd5fe 100644 --- a/facebook/delphiFacebook/R/contingency_utils.R +++ b/facebook/delphiFacebook/R/contingency_utils.R @@ -36,7 +36,7 @@ read_contingency_params <- function(path = "params.json", template_path = "param } } - contingency_params$num_filter <- if_else(contingency_params$debug, 2L, 100L) + contingency_params$num_filter <- if_else(contingency_params$debug, 2L, 40L) contingency_params$s_weight <- if_else(contingency_params$debug, 1.00, 0.01) contingency_params$s_mix_coef <- if_else(contingency_params$debug, 0.05, 0.05) contingency_params$use_input_asis <- if_else( From 0ccfaa85e6009083ee2203412b4ac0596f4114b1 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 23 Jun 2022 12:01:03 -0400 Subject: [PATCH 36/49] raise n thres only for county --- facebook/delphiFacebook/R/contingency_aggregate.R | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index 054b980b0..1527fdfe8 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -66,6 +66,12 @@ produce_aggregates <- function(df, aggregations, cw_list, params) { geo_level <- agg_groups$geo_level[group_ind] geo_crosswalk <- cw_list[[geo_level]] + if (geo_level == "county") { + # Raise sample size threshold to 100. + old_thresh <- params$num_filter + params$num_filter <- 100L + } + # Subset aggregations to keep only those grouping by the current agg_group # and with the current geo_level. `setequal` ignores differences in # ordering and only looks at unique elements. @@ -108,6 +114,11 @@ produce_aggregates <- function(df, aggregations, cw_list, params) { } } } + + if (geo_level == "county") { + # Restore old sample size threshold + params$num_filter <- old_thresh + } } } From a51df29a9df0d89cc2afb4334e3ff0cabd056dc3 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 23 Jun 2022 12:14:27 -0400 Subject: [PATCH 37/49] round all sample sizes --- facebook/delphiFacebook/DESCRIPTION | 1 + facebook/delphiFacebook/NAMESPACE | 1 + .../delphiFacebook/R/contingency_aggregate.R | 6 +++++- .../delphiFacebook/R/contingency_privacy.R | 18 ++++++++++++++++-- .../man/apply_privacy_censoring.Rd | 4 ++-- facebook/delphiFacebook/man/round_n.Rd | 17 +++++++++++++++++ 6 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 facebook/delphiFacebook/man/round_n.Rd diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index beda72167..875d9dcde 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -15,6 +15,7 @@ Imports: rlang, readr, dplyr, + plyr, tidyr, stringi, jsonlite, diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index cfef1c937..b3ce270d7 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -98,6 +98,7 @@ importFrom(lubridate,ymd) importFrom(lubridate,ymd_hms) importFrom(parallel,detectCores) importFrom(parallel,mclapply) +importFrom(plyr,round_any) importFrom(purrr,reduce) importFrom(readr,col_character) importFrom(readr,col_integer) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index 1527fdfe8..beb25493a 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -318,10 +318,14 @@ summarize_aggs <- function(df, crosswalk_data, aggregations, geo_level, params) rowSums(is.na(dfs_out[[aggregation]][, c("val", "sample_size")])) == 0, ] + # Censor rows with low sample size dfs_out[[aggregation]] <- apply_privacy_censoring(dfs_out[[aggregation]], params) - ## Apply the post-function + # Apply the post-function dfs_out[[aggregation]] <- post_fn(dfs_out[[aggregation]]) + + # Round sample sizes + dfs_out[[aggregation]] <- round_n(dfs_out[[aggregation]], params) } return(dfs_out) diff --git a/facebook/delphiFacebook/R/contingency_privacy.R b/facebook/delphiFacebook/R/contingency_privacy.R index 81b764da9..3a122a751 100644 --- a/facebook/delphiFacebook/R/contingency_privacy.R +++ b/facebook/delphiFacebook/R/contingency_privacy.R @@ -1,7 +1,7 @@ #' Censor aggregates to ensure privacy. #' -#' Currently done in simple, static way: Rows with sample size less than 100 are -#' removed; no noise is added. +#' Currently done in simple, static way: Rows with sample size less than num_filter +#' are removed; no noise is added. #' #' @param df a data frame of summarized response data #' @param params a named list with entries "s_weight", "s_mix_coef", @@ -16,3 +16,17 @@ apply_privacy_censoring <- function(df, params) { .data$sample_size >= params$num_filter, .data$effective_sample_size >= params$num_filter)) } + +#' Round sample sizes to nearest 5. +#' +#' @param df a data frame of summarized response data +#' @param params a named list with entries "s_weight", "s_mix_coef", +#' "num_filter" +#' +#' @importFrom plyr round_any +round_n <- function(df, params) { + return(mutate(df, + sample_size = round_any(.data$sample_size, 5), + effective_sample_size = round_any(.data$effective_sample_size, 5) + )) +} diff --git a/facebook/delphiFacebook/man/apply_privacy_censoring.Rd b/facebook/delphiFacebook/man/apply_privacy_censoring.Rd index 0f83c7d4b..405e0ea13 100644 --- a/facebook/delphiFacebook/man/apply_privacy_censoring.Rd +++ b/facebook/delphiFacebook/man/apply_privacy_censoring.Rd @@ -13,6 +13,6 @@ apply_privacy_censoring(df, params) "num_filter"} } \description{ -Currently done in simple, static way: Rows with sample size less than 100 are -removed; no noise is added. +Currently done in simple, static way: Rows with sample size less than num_filter +are removed; no noise is added. } diff --git a/facebook/delphiFacebook/man/round_n.Rd b/facebook/delphiFacebook/man/round_n.Rd new file mode 100644 index 000000000..b310116f2 --- /dev/null +++ b/facebook/delphiFacebook/man/round_n.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/contingency_privacy.R +\name{round_n} +\alias{round_n} +\title{Round sample sizes to nearest 5.} +\usage{ +round_n(df, params) +} +\arguments{ +\item{df}{a data frame of summarized response data} + +\item{params}{a named list with entries "s_weight", "s_mix_coef", +"num_filter"} +} +\description{ +Round sample sizes to nearest 5. +} From 1d396fb3a2f6869da8c511b97625a2d86289745f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 23 Jun 2022 11:55:18 -0400 Subject: [PATCH 38/49] tests missing theme tables --- .../testthat/test-contingency-run.R | 34 ++++++++++++++++--- .../testthat/test-integration.R | 6 ++-- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/facebook/delphiFacebook/integration-tests/testthat/test-contingency-run.R b/facebook/delphiFacebook/integration-tests/testthat/test-contingency-run.R index e17b897bc..06955ae1e 100644 --- a/facebook/delphiFacebook/integration-tests/testthat/test-contingency-run.R +++ b/facebook/delphiFacebook/integration-tests/testthat/test-contingency-run.R @@ -67,11 +67,19 @@ test_that("small dataset produces no output", { ### This test relies on `setup-run.R` to run the full pipeline and tests basic ### properties of the output. test_that("full synthetic dataset produces expected output format", { - expected_files <- c("20200501_20200531_monthly_nation_gender.csv.gz") + expected_files <- c( + "20200501_20200531_monthly_nation_all_indicators_gender.csv.gz", + "20200501_20200531_monthly_nation_theme_behavior_and_mental_health_gender.csv.gz", + "20200501_20200531_monthly_nation_theme_norms_information_beliefs_gender.csv.gz", + "20200501_20200531_monthly_nation_theme_parenting_gender.csv.gz", + "20200501_20200531_monthly_nation_theme_sociodemographics_gender.csv.gz", + "20200501_20200531_monthly_nation_theme_symptoms_and_testing_gender.csv.gz", + "20200501_20200531_monthly_nation_theme_vaccines_gender.csv.gz" + ) actual_files <- dir(test_path("receiving_contingency_full")) - out <- read.csv(file.path(params$export_dir, "20200501_20200531_monthly_nation_gender.csv.gz")) - + out <- read.csv(file.path(params$export_dir, "20200501_20200531_monthly_nation_all_indicators_gender.csv.gz")) + expect_setequal(expected_files, actual_files) expect_equal(dir.exists(test_path("receiving_contingency_full")), TRUE) expect_equal(nrow(out) > 0, TRUE) @@ -98,6 +106,7 @@ test_that("simple equal-weight dataset produces correct percents", { local_mock("delphiFacebook::load_archive" = mock_load_archive) local_mock("delphiFacebook::add_geo_vars" = mock_geo_vars) local_mock("delphiFacebook::add_metadata_vars" = mock_metadata) + run_contingency_tables_many_periods(params, base_aggs[2,]) # Expected files @@ -228,7 +237,24 @@ test_that("production of historical CSVs for range of dates", { run_contingency_tables_many_periods(params, base_aggs[2,]) # Expected files - expect_equal(!!dir(params$export_dir), c("20200503_20200509_weekly_nation_gender.csv.gz", "20200510_20200516_weekly_nation_gender.csv.gz")) + expect_equal(!!dir(params$export_dir), + c( + "20200503_20200509_weekly_nation_all_indicators_gender.csv.gz", + "20200503_20200509_weekly_nation_theme_behavior_and_mental_health_gender.csv.gz", + "20200503_20200509_weekly_nation_theme_norms_information_beliefs_gender.csv.gz", + "20200503_20200509_weekly_nation_theme_parenting_gender.csv.gz", + "20200503_20200509_weekly_nation_theme_sociodemographics_gender.csv.gz", + "20200503_20200509_weekly_nation_theme_symptoms_and_testing_gender.csv.gz", + "20200503_20200509_weekly_nation_theme_vaccines_gender.csv.gz", + "20200510_20200516_weekly_nation_all_indicators_gender.csv.gz", + "20200510_20200516_weekly_nation_theme_behavior_and_mental_health_gender.csv.gz", + "20200510_20200516_weekly_nation_theme_norms_information_beliefs_gender.csv.gz", + "20200510_20200516_weekly_nation_theme_parenting_gender.csv.gz", + "20200510_20200516_weekly_nation_theme_sociodemographics_gender.csv.gz", + "20200510_20200516_weekly_nation_theme_symptoms_and_testing_gender.csv.gz", + "20200510_20200516_weekly_nation_theme_vaccines_gender.csv.gz" + ) + ) }) diff --git a/facebook/delphiFacebook/integration-tests/testthat/test-integration.R b/facebook/delphiFacebook/integration-tests/testthat/test-integration.R index f111175c0..64993c6b8 100644 --- a/facebook/delphiFacebook/integration-tests/testthat/test-integration.R +++ b/facebook/delphiFacebook/integration-tests/testthat/test-integration.R @@ -24,8 +24,8 @@ metrics <- c("raw_cli", "raw_ili", "raw_hh_cmnty_cli", "raw_nohh_cmnty_cli", # work outside home # pre-wave-4 - "wip_smoothed_work_outside_home_5d", - "wip_smoothed_wwork_outside_home_5d" + "smoothed_work_outside_home_5d", + "smoothed_wwork_outside_home_5d" ) test_that("testing existence of csv files", { @@ -70,7 +70,7 @@ test_that("testing geo files contain correct number of lines", { dt <- lapply(fnames, read_csv) dt_nrow <- sapply(dt, nrow) - + expect_true(all(dt_nrow[grid$dates == "20200510"] == 1L)) expect_true(all(dt_nrow[grid$dates == "20200511"] == 1L)) expect_true(all(dt_nrow[grid$dates == "20200512" & grid$geo_levels != "nation"] == 2L)) From a98d4bd0f0265b1d91f559c35bde2df6769f393e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 24 Jun 2022 10:51:03 -0400 Subject: [PATCH 39/49] filter out gender self-described responses --- facebook/delphiFacebook/DESCRIPTION | 2 +- facebook/delphiFacebook/R/contingency_run.R | 1 + facebook/delphiFacebook/R/responses.R | 16 ++++++++++++++++ .../man/code_addl_mental_health.Rd | 19 +++++++++++++++++++ .../man/filter_data_for_contingency.Rd | 14 ++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 facebook/delphiFacebook/man/code_addl_mental_health.Rd create mode 100644 facebook/delphiFacebook/man/filter_data_for_contingency.Rd diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index 51ad1e74b..a8be617fe 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -29,5 +29,5 @@ Suggests: testthat (>= 1.0.1), covr (>= 2.2.2) LinkingTo: Rcpp -RoxygenNote: 7.1.1 +RoxygenNote: 7.2.0 Encoding: UTF-8 diff --git a/facebook/delphiFacebook/R/contingency_run.R b/facebook/delphiFacebook/R/contingency_run.R index 9ea1edfba..e5defbd37 100644 --- a/facebook/delphiFacebook/R/contingency_run.R +++ b/facebook/delphiFacebook/R/contingency_run.R @@ -137,6 +137,7 @@ run_contingency_tables_one_period <- function(params, aggregations) data_agg <- create_data_for_aggregation(input_data) data_agg <- filter_data_for_aggregation(data_agg, params, lead_days = params$backfill_days) + data_agg <- filter_data_for_contingency(data_agg) if (nrow(data_agg) == 0) { msg_plain(sprintf("no data available in the desired date range %s- to %s", diff --git a/facebook/delphiFacebook/R/responses.R b/facebook/delphiFacebook/R/responses.R index c5f4a8032..e9d53936d 100644 --- a/facebook/delphiFacebook/R/responses.R +++ b/facebook/delphiFacebook/R/responses.R @@ -394,6 +394,22 @@ filter_data_for_aggregation <- function(df, params, lead_days = 12L) return(df) } +#' Filter out low-quality data for contingency tables +#' +#' @param df data frame of responses +#' +#' @importFrom dplyr filter +filter_data_for_contingency <- function(df) +{ + if ("D1" %in% names(df)) { + # What is your gender? + # Coded as 1 = male, 2 = female, 3 = non-binary, 4 = self-describe, 5 = prefer not to answer + # Self-describe responses are usually bad faith responses, so drop them. + df <- filter(df, .data$D1 != 4) + } + return(df) +} + #' Fix translation error in Wave 6. #' #' In Wave 6's first deployment, some of the translations swapped the order of diff --git a/facebook/delphiFacebook/man/code_addl_mental_health.Rd b/facebook/delphiFacebook/man/code_addl_mental_health.Rd new file mode 100644 index 000000000..59dabcf00 --- /dev/null +++ b/facebook/delphiFacebook/man/code_addl_mental_health.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/contingency_variables.R +\name{code_addl_mental_health} +\alias{code_addl_mental_health} +\title{Additional mental health indicators} +\usage{ +code_addl_mental_health(input_data, wave) +} +\arguments{ +\item{input_data}{input data frame of raw survey data} + +\item{wave}{integer indicating survey version} +} +\value{ +augmented data frame +} +\description{ +Additional mental health indicators +} diff --git a/facebook/delphiFacebook/man/filter_data_for_contingency.Rd b/facebook/delphiFacebook/man/filter_data_for_contingency.Rd new file mode 100644 index 000000000..7f961c5c3 --- /dev/null +++ b/facebook/delphiFacebook/man/filter_data_for_contingency.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/responses.R +\name{filter_data_for_contingency} +\alias{filter_data_for_contingency} +\title{Filter out low-quality data for contingency tables} +\usage{ +filter_data_for_contingency(df) +} +\arguments{ +\item{df}{data frame of responses} +} +\description{ +Filter out low-quality data for contingency tables +} From 7885d0bad1cc38c7ae091d8307ec299ede15a4ed Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 24 Jun 2022 17:31:05 -0400 Subject: [PATCH 40/49] return empty result if n=1 to avoid svydesign error --- .../delphiFacebook/R/contingency_calculate.R | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_calculate.R b/facebook/delphiFacebook/R/contingency_calculate.R index a5ff70676..d9e9dc208 100644 --- a/facebook/delphiFacebook/R/contingency_calculate.R +++ b/facebook/delphiFacebook/R/contingency_calculate.R @@ -125,15 +125,32 @@ post_convert_count_to_pct <- function(df) { compute_numeric_mean <- function(response, weight, sample_size, total_represented) { assert(length(response) == length(weight)) + if (length(response) == 1) { + # svydesign complains if given only one response, so return an empty df + # instead. This group will be dropped anyway. + return(list( + val = NA_real_, + se = NA_real_, + sd = NA_real_, + p25 = NA_real_, + p50 = NA_real_, + p75 = NA_real_, + sample_size = NA_real_, + effective_sample_size = NA_real_, + represented = NA_real_ + )) + } + design <- svydesign(id = ~1, weight = ~weight, data = data.frame(response, weight)) - return(list(val = as.data.frame(svymean(~response, na.rm = TRUE, design = design))[,"mean"], - se = NA_real_, - sd = as.data.frame(sqrt(svyvar(~response, na.rm = TRUE, design = design)))[,"variance"], - p25 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.25))[,"0.25"], - p50 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.5))[,"0.5"], - p75 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.75))[,"0.75"], - sample_size = sample_size, - effective_sample_size = sample_size, - represented = total_represented + return(list( + val = as.data.frame(svymean(~response, na.rm = TRUE, design = design))[,"mean"], + se = NA_real_, + sd = as.data.frame(sqrt(svyvar(~response, na.rm = TRUE, design = design)))[,"variance"], + p25 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.25))[,"0.25"], + p50 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.5))[,"0.5"], + p75 = as.data.frame(oldsvyquantile(~response, na.rm = TRUE, design = design, quantiles = 0.75))[,"0.75"], + sample_size = sample_size, + effective_sample_size = sample_size, + represented = total_represented )) } From c72d452898e2571ff37612a53781697e3b1a685f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 24 Jun 2022 17:31:23 -0400 Subject: [PATCH 41/49] respect parallel_max_cores --- facebook/delphiFacebook/R/contingency_run.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_run.R b/facebook/delphiFacebook/R/contingency_run.R index 9ea1edfba..104dbef22 100644 --- a/facebook/delphiFacebook/R/contingency_run.R +++ b/facebook/delphiFacebook/R/contingency_run.R @@ -23,7 +23,7 @@ run_contingency_tables <- function(params) { warning("Could not detect the number of CPU cores; parallel mode disabled") params$parallel <- FALSE } else { - options(mc.cores = cores) + options(mc.cores = min(params$parallel_max_cores, cores)) msg_plain(paste0("Running on ", cores, " cores")) } } From 6760ce3ec7f0917fcb20f054a806b0fe78aa4435 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 24 Jun 2022 18:43:36 -0400 Subject: [PATCH 42/49] retain field names when adding geo info --- facebook/delphiFacebook/R/contingency_write.R | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_write.R b/facebook/delphiFacebook/R/contingency_write.R index 01f2346a2..93ebe5d4a 100644 --- a/facebook/delphiFacebook/R/contingency_write.R +++ b/facebook/delphiFacebook/R/contingency_write.R @@ -157,7 +157,12 @@ add_geo_vars <- function(data, params, geo_type) { # Insert the geographic variables in place of the "geo_id" variable. index <- which(names(data) == "geo_id") before <- if (index > 1) data[, 1:(index-1)] else NULL - after <- data[, (index+1):ncol(data)] + + if (ncol(data) == 1) { + after <- NULL + } else { + after <- select(data, (index+1):ncol(data)) + } result <- bind_cols(before, geo_vars, after) return(result) From ebcb8a4116c2763c3f872813db22304f5193b232 Mon Sep 17 00:00:00 2001 From: nmdefries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 27 Jun 2022 16:02:42 -0400 Subject: [PATCH 43/49] Update facebook/delphiFacebook/R/responses.R Co-authored-by: Alex Reinhart --- facebook/delphiFacebook/R/responses.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/responses.R b/facebook/delphiFacebook/R/responses.R index e9d53936d..61919f76e 100644 --- a/facebook/delphiFacebook/R/responses.R +++ b/facebook/delphiFacebook/R/responses.R @@ -405,7 +405,7 @@ filter_data_for_contingency <- function(df) # What is your gender? # Coded as 1 = male, 2 = female, 3 = non-binary, 4 = self-describe, 5 = prefer not to answer # Self-describe responses are usually bad faith responses, so drop them. - df <- filter(df, .data$D1 != 4) + df <- filter(df, is.na(.data$D1) | .data$D1 != 4) } return(df) } From 78c8d4d78fd52709ec84fac82c30b47dea708e65 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 27 Jun 2022 16:13:27 -0400 Subject: [PATCH 44/49] combine select and mutate --- facebook/delphiFacebook/R/contingency_write.R | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_write.R b/facebook/delphiFacebook/R/contingency_write.R index 93ebe5d4a..eb6c2ec89 100644 --- a/facebook/delphiFacebook/R/contingency_write.R +++ b/facebook/delphiFacebook/R/contingency_write.R @@ -122,17 +122,11 @@ add_geo_vars <- function(data, params, geo_type) { ) rest <- left_join(rest, counties, by = c("county_fips" = "fips")) %>% - mutate( + select( region = .data$state_id, state = .data$state_id, county = .data$county_name, county_fips = .data$county_fips - ) %>% - select( - .data$region, - .data$state, - .data$county, - .data$county_fips ) # Fill in state fips and GID_1 From a558503f631c5a926927286c3bd98e0e6cf62c9c Mon Sep 17 00:00:00 2001 From: nmdefries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 11 Jul 2022 13:05:16 -0700 Subject: [PATCH 45/49] High blood pressure code Co-authored-by: Alex Reinhart --- facebook/delphiFacebook/R/contingency_variables.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 99771ecc8..0101e580b 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -151,7 +151,7 @@ code_health <- function(input_data, wave) { comorbidities <- split_options(input_data$C1) input_data$comorbidheartdisease <- is_selected(comorbidities, "3") - input_data$comorbid_high_blood_pressure <- is_selected(comorbidities, "5") + input_data$comorbid_high_blood_pressure <- is_selected(comorbidities, "4") input_data$comorbid_asthma <- is_selected(comorbidities, "5") input_data$comorbidcancer <- is_selected(comorbidities, "2") input_data$comorbidkidneydisease <- is_selected(comorbidities, "7") From 135efce2dffd090b113115a992f6a1bfa0310a53 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 11 Jul 2022 16:27:33 -0400 Subject: [PATCH 46/49] name symp_other_unusual --- facebook/delphiFacebook/R/contingency_variables.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 0101e580b..d4d59052a 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1195,7 +1195,7 @@ code_addl_symptoms <- function(input_data, wave) { input_data$symp_nausea_unusual <- is_selected(symptoms, "11") input_data$symp_diarrhea_unusual <- is_selected(symptoms, "12") input_data$symp_loss_smell_taste_unusual <- is_selected(symptoms, "13") - input_data$symp_loss_smell_taste_unusual <- is_selected(symptoms, "14") + input_data$symp_other_unusual <- is_selected(symptoms, "14") input_data$symp_eye_pain_unusual <- is_selected(symptoms, "16") input_data$symp_chills_unusual <- is_selected(symptoms, "17") input_data$symp_headache_unusual <- is_selected(symptoms, "18") @@ -1293,12 +1293,12 @@ code_addl_symptoms <- function(input_data, wave) { input_data$symp_nausea_unusual <- NA input_data$symp_diarrhea_unusual <- NA input_data$symp_loss_smell_taste_unusual <- NA + input_data$symp_other_unusual <- NA input_data$symp_eye_pain_unusual <- NA input_data$symp_chills_unusual <- NA input_data$symp_headache_unusual <- NA input_data$symp_sleep_changes_unusual <- NA input_data$symp_stuffy_nose_unusual <- NA - input_data$symp_stuffy_nose_unusual <- NA } if ("B4" %in% names(input_data)) { From e39c044eb65d146f2322c91dce8726a5f597d824 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 11 Jul 2022 18:52:28 -0400 Subject: [PATCH 47/49] make hh_direct_contact out of all respondents --- facebook/delphiFacebook/R/contingency_variables.R | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index d4d59052a..bf85322c8 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1344,10 +1344,14 @@ code_behaviors <- function(input_data, wave) { input_data$c_direct_contact_covid <- NA_real_ } - if ("C12" %in% names(input_data)) { + if (all(c("C11", "C12") %in% names(input_data))) { # C12: was the person in C11 a member of your household # Coded as 1 = Yes, 2 = No - input_data$c_direct_contact_covid_hh <- input_data$C12 == 1 + input_data$c_direct_contact_covid_hh <- case_when( + input_data$C11 == 1 & input_data$C12 == 1 ~ 1, + input_data$C11 == 2 | input_data$C12 == 2 ~ 0, + TRUE ~ NA_real_ + ) } else { input_data$c_direct_contact_covid_hh <- NA_real_ } From 5044a06466f03ee9011b808d218cccd59d042d85 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 11 Jul 2022 19:06:04 -0400 Subject: [PATCH 48/49] ignore idk from E3 school measures --- facebook/delphiFacebook/R/contingency_variables.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index bf85322c8..a00bdd7d9 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -1679,7 +1679,10 @@ code_addl_demographic <- function(input_data, wave) { } if ("E3" %in% names(input_data)) { - school_measures <- split_options(input_data$E3) + school_measures <- input_data$E3 + # Remove "I don't know" responses. + school_measures <- ifelse(school_measures == "16", NA_character_, school_measures) + school_measures <- split_options(school_measures) input_data$children_school_measure_mask_students <- is_selected(school_measures, "1") input_data$children_school_measure_mask_teachers <- is_selected(school_measures, "2") From 07eceff21c46b357c091eb1b6f4ddb6de6809463 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 13 Jul 2022 19:36:53 -0400 Subject: [PATCH 49/49] ignore B7 in wave 10 --- facebook/delphiFacebook/R/contingency_variables.R | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index c3bd1d1eb..01ce19117 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -324,7 +324,13 @@ code_addl_vaccines <- function(input_data, wave) { input_data$t_unusual_symptom_hospital <- NA } - if ("B7" %in% names(input_data)) { + if ("B7" %in% names(input_data) && wave != 10) { + # Before Wave 10, B7 was asked of respondents who selected > 0 items for B2c ("are + # any of your symptoms unusual?"). In Wave 10, the display logic changed so that B7 + # is only shown when exactly 0 items (not even "none of the above") are selected on + # B2 ("do you have any of these symptoms?"), meaning the respondent left the question + # entirely blank. Discard these responses. + # # Coded as 8 = no medical care sought, 1-6 = various types of medical care sought, # 7 = care sought but not received unusual_symptoms_care <- split_options(input_data$B7)