# Setup -------------------------------------------------------------------
Sys.setenv(TZ = 'UTC')
librarian::shelf(
"tidyverse",
"zoo",
"TTR",
"tsibble",
"lubridate",
"glue",
"fim",
"dplyover",
gt
)
options(digits = 4)
options(scipen = 20)
devtools::load_all()
# Set dates for current and previous months
month_year <- glue('{format.Date(today(), "%m")}-{year(today())}')
last_month_year <- glue('{format.Date(today()-months(1), "%m")}-{year(today())}')
if(!dir.exists(glue('results/{month_year}'))) {
dir.create(glue('results/{month_year}'))
}
# Wrangle data ------------------------------------------------------------
# Since BEA put all CARES act grants to S&L in Q2 2020 we need to
# override the historical data and spread it out based on our best guess
# for when the money was spent.
overrides <- readxl::read_xlsx('data/forecast.xlsx',
sheet = 'historical overrides') %>%
select(-name) %>%
pivot_longer(-variable) %>%
pivot_wider(names_from = 'variable',
values_from = 'value') %>%
rename(date = name) %>%
mutate(date = yearquarter(date))
# Load national accounts data from BEA
usna <-
read_data() %>%
# Rename Haver codes for clarity
define_variables() %>%
# Specify time series structure:
# Key is historical or forecast period
# Indexed by date
as_tsibble(key = id, index = date) %>%
# Calculate GDP growth for data but take CBO for projection
mutate_where(id == 'historical',
#Lag changed here: I created a q_g_fourthlag function that just is q_g but with four lags rather than one
#question for Manu-- where do we get the deflators
real_potential_gdp_growth = q_g(real_potential_gdp),
real_potential_gdp_growth_fourthlag = q_g_fourthlag(real_potential_gdp)) %>%
# Net out unemployment insurance, rebate checks, and Medicare to apply different MPC's
mutate(
federal_social_benefits = federal_social_benefits - ui - rebate_checks - medicare,
state_social_benefits = state_social_benefits - medicaid,
social_benefits = federal_social_benefits + state_social_benefits,
consumption_grants = gross_consumption_grants - medicaid_grants,
) %>%
mutate(rebate_checks_arp = if_else(date == yearquarter("2021 Q1"),
1348.1,
0)) %>%
mutate_where(id == 'projection',
rebate_checks_arp = NA,
federal_ui = NA,
state_ui = NA) %>%
mutate_where(date == yearquarter('2021 Q1'),
rebate_checks = rebate_checks - rebate_checks_arp,
federal_social_benefits = federal_social_benefits + 203
) %>%
mutate(consumption_grants = gross_consumption_grants - medicaid_grants,
# Aggregate taxes
corporate_taxes = federal_corporate_taxes + state_corporate_taxes,
non_corporate_taxes = federal_non_corporate_taxes + state_non_corporate_taxes) %>%
mutate_where(id == 'projection',
consumption_grants_deflator_growth = state_purchases_deflator_growth,
investment_grants_deflator_growth = state_purchases_deflator_growth,
consumption_grants_deflator_growth = state_purchases_deflator_growth_fourthlag,
investment_grants_deflator_growth = state_purchases_deflator_growth) %>%
mutate_where(date >= yearquarter('2020 Q2') & date <= yearquarter('2021 Q2'), consumption_grants = overrides$consumption_grants_override)
# Forecast ----------------------------------------------------------------
forecast <-
readxl::read_xlsx('data/forecast.xlsx',
sheet = 'forecast') %>%
select(-15:-17, -name) %>%
pivot_longer(-variable) %>%
pivot_wider(names_from = 'variable',
values_from = 'value') %>%
rename(date = name) %>%
mutate(date = yearquarter(date))
projections <- coalesce_join(usna, forecast, by = 'date') %>%
mutate(# Coalesce NA's to 0
across(where(is.numeric),
~ coalesce(.x, 0))) %>%
mutate(
health_outlays = medicare + medicaid,
federal_health_outlays = medicare + medicaid_grants,
state_health_outlays = medicaid - medicaid_grants
)
# Consumption -------------------------------------------------------------
consumption <-
projections %>%
taxes_transfers_minus_neutral_fourthlag() %>%
calculate_mpc("social_benefits") %>%
mutate(rebate_checks_post_mpc = mpc_rebate_checks(rebate_checks_minus_neutral)) %>%
calculate_mpc("subsidies") %>%
calculate_mpc("health_outlays") %>%
calculate_mpc("corporate_taxes") %>%
calculate_mpc("non_corporate_taxes") %>%
mutate(across(c(federal_ui_minus_neutral, state_ui_minus_neutral),
.fns = ~ if_else(date < yearquarter("2021 Q2"),
mpc_ui(.x),
mpc_ui_arp(.x)),
.names = '{.col}_post_mpc')) %>%
# taxes_transfers_minus_neutral -------------------------------------------
mutate(across(
.cols = all_of(
c(
"rebate_checks_arp",
"federal_other_direct_aid_arp",
"federal_other_vulnerable_arp",
# "federal_ui_arp",
#"state_ui_arp",
"federal_aid_to_small_businesses_arp"
)
),
.fns = ~ .x - dplyr::lag(.x, default = 0) * (1 + real_potential_gdp_growth_fourthlag + q_g_fourthlag(consumption_deflator)),
.names = "{.col}_minus_neutral"
)) %>%
mutate(
across(
.cols = any_of(
c("federal_ui_arp", "state_ui_arp", "federal_other_vulnerable_arp") %>% paste0("_minus_neutral")
),
.fns = ~ mpc_vulnerable_arp(.x),
.names = "{.col}_post_mpc"
),
across(
.cols = all_of(
c("rebate_checks_arp", "federal_other_direct_aid_arp") %>% paste0("_minus_neutral")
),
.fns = ~ mpc_direct_aid_arp(.),
.names = "{.col}_post_mpc"
),
federal_aid_to_small_businesses_arp_minus_neutral_post_mpc = mpc_small_businesses_arp((federal_aid_to_small_businesses_arp_minus_neutral))
)
# Contribution ------------------------------------------------------------
contributions <-
consumption %>%
#CHANGE LAG HERE
#purchases_contributions() %>% replaced here with an edited version of the function to get the fourth lag. Check annualizing and deflators with manu
mutate(federal_purchases_contribution = (federal_purchases - lag(federal_purchases, n = 4) * (1 + q_g_fourthlag(federal_purchases_deflator) + real_potential_gdp_growth_fourthlag)) / lag(gdp, 4),
state_purchases_contribution = (state_purchases - lag(state_purchases, n = 4) * (1 + q_g_fourthlag(state_purchases_deflator) + real_potential_gdp_growth_fourthlag)) / lag(gdp, 4),
consumption_grants_contribution = (state_purchases - lag(consumption_grants, 4) * (1 + q_g_fourthlag(consumption_grants_deflator) + real_potential_gdp_growth_fourthlag)) / lag(gdp, 4),
investment_grants_contribution = (investment_grants - lag(investment_grants,4) * (1 + q_g_fourthlag(investment_grants_deflator) + real_potential_gdp_growth_fourthlag)) / lag(gdp,4)) %>%
mutate(grants_contribution = consumption_grants_contribution + investment_grants_contribution,
federal_contribution = federal_purchases_contribution + grants_contribution,
state_contribution = state_purchases_contribution - grants_contribution) %>%
mutate(across(ends_with("post_mpc"),
#Lag changed here-- do we need to deannualize?
.x / lag(gdp, n = 4),
.names = "{.col}_contribution"
)) %>%
rename_with(~ str_replace(.x, "_minus_neutral_post_mpc_contribution", "_contribution")) %>%
rename_with(~ str_replace(.x, "minus_neutral_post_mpc", "post_mpc")) %>%
rename_with(~ str_replace(.x, "post_mpc_contribution", "contribution")) %>%
sum_transfers_contributions() %>%
mutate(
grants_contribution = consumption_grants_contribution + investment_grants_contribution,
federal_contribution = federal_purchases_contribution + grants_contribution,
state_contribution = state_purchases_contribution - grants_contribution
) %>%
mutate(social_benefits_contribution = federal_social_benefits_contribution + state_social_benefits_contribution) %>%
mutate(non_corporate_taxes_contribution = federal_non_corporate_taxes_contribution + state_non_corporate_taxes_contribution) %>%
mutate(taxes_contribution = non_corporate_taxes_contribution + corporate_taxes_contribution) %>%
mutate(
transfers_contribution = federal_social_benefits_contribution + state_social_benefits_contribution +
rebate_checks_contribution + rebate_checks_arp_contribution + federal_ui_contribution + state_ui_contribution +
federal_subsidies_contribution + federal_aid_to_small_businesses_arp_contribution + state_subsidies_contribution + federal_health_outlays_contribution +
state_health_outlays_contribution + federal_other_direct_aid_arp_contribution + federal_other_vulnerable_arp_contribution,
taxes_contribution = federal_non_corporate_taxes_contribution + state_non_corporate_taxes_contribution +
federal_corporate_taxes_contribution + state_corporate_taxes_contribution
) %>%
#sum_taxes_contributions() %>%
get_fiscal_impact()
openxlsx::write.xlsx(contributions, file = glue('results/{month_year}/fim-annual-{month_year}.xlsx'),
overwrite = TRUE)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.