Author

AWM

Code
library(tidyverse)
library(haven)
library(formatR)
library(lubridate)
library(smooth)
library(forecast)
library(scales)
library(kableExtra)
library(ggplot2)
library(readxl)
library(tidyverse)
library(data.table)
library(quantmod)
library(geofacet)
library(janitor)
library(cmapplot)

theme_set(theme_classic() )

knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE
                      )


exp_temp <- read_csv("./data/exp_temp.csv") # %>%
 # mutate(in_ff = if_else( fund %in% c("0278", "0378", "0121", "0380"), 0, in_ff))


rev_temp <- read_csv("./data/rev_temp.csv") # %>%  
 # mutate(in_ff = if_else( fund %in% c("0278", "0378", "0121", "0380"), 0, in_ff))
Code
#
exp_temp %>% 
  mutate(
    obj_type = str_sub(obj_seq_type, 1, 1),
    obj_2dig = str_sub(obj_seq_type, 1, 2),
    obj_of_exp = str_sub(obj_seq_type, 1, 3),
    obj_of_exp = str_pad(obj_of_exp, width = 4,  "right", pad = "0"),
    obj_expenditure_label = case_when(
      obj_of_exp == "9900" ~ "9900 - One-Time Rebates",
      obj_of_exp == "9910" ~ "9910 - Income Tax Refunds",
      obj_of_exp == "9920"~ "9920 - Other Tax Refunds",
      obj_of_exp == "9930" ~ "9930 - Other Refunds",
      obj_of_exp > 9930 ~ "9931 & Up - Other Refunds")
  )  %>%
  filter(#fy == 2023 & 
           object >= 9000 #& object <=9930
         # & agency == 492
  ) %>% summarize(Refunds = round(sum(expenditure)), .by = c(fy, obj_expenditure_label )) %>% 
  pivot_wider (names_from = "obj_expenditure_label", values_from = "Refunds") %>% arrange(fy) 
Code
# only income tax refund funds from Department of Revenue
rev_refundfund <- rev_temp %>% 
  filter(agency!= "799" & !rev_type %in% c("99", "98", "72") & fund == "0278" & agency == "492") %>% 
  reframe(Refund_Rev = sum(receipts), .by = fy)

rev_temp %>% 
  filter(agency!= "799" & fund == "0278" & !rev_type %in% c("99", "98", "72")) %>% 
  reframe(Refund_Rev = sum(receipts), .by = c(fy, source_name_AWM)) %>% 
  pivot_wider(names_from = source_name_AWM, values_from = Refund_Rev) %>% kable %>%  kable_classic()
fy INDIVIDUAL CORPORATE PPRT-PERSON PROP TAX REPLACE RETURNED DIRECT DEPOSIT FED MONIES - TANF GRANT INDIV. INCOME TAX AMNESTY CORP INCOME TAX AMNESTY HOUSELHOLD PAYROLL INDIV. INCOME TAX PASS-THROUGH
1998 421566027 266377476 169994427 NA NA NA NA NA NA
1999 552238121 263094990 172002247 NA NA NA NA NA NA
2000 587397800 290211287 194853400 NA NA NA NA NA NA
2001 611088673 243021127 176778590 NA NA NA NA NA NA
2002 614529506 239817087 173532249 NA NA NA NA NA NA
2003 638346245 273133862 205179347 NA NA NA NA NA NA
2004 958926988 369412260 268839236 NA 12824817 4698258 113020635 NA NA
2005 893705780 375940530 255571025 NA 14759942 NA NA NA NA
2006 932878308 356863108 243204046 NA 15433946 NA NA NA NA
2007 1016423894 371101867 251761976 NA 14050853 NA NA NA NA
2008 867011988 341138469 230362910 NA 17653951 NA NA NA NA
2009 996390877 362693366 221138923 NA 13680433 NA NA NA NA
2010 918797544 288563316 177207828 NA 16211543 NA NA 610739.8 NA
2011 1071615996 347098804 207941849 NA 17309670 3576057 78446483 1213294.6 NA
2012 1485894471 522019523 216585391 NA 8595178 NA NA 1587400.4 NA
2013 1783431807 502376164 206992824 NA 19932803 NA NA 1696879.9 NA
2014 1743908216 475720935 196671293 NA 42752461 NA NA 1599450.9 NA
2015 1766627219 438437395 221559526 NA 42660505 NA NA 1574581.2 NA
2016 1492960768 362373284 206726374 NA 51292449 NA NA 1409327.8 NA
2017 1670384828 278491517 294194456 NA 46034182 NA NA 1644437.1 51078078
2018 1984177136 456748940 275528937 139003 68876855 NA NA 1867117.0 50877306
2019 2120625068 469546139 262156518 16760499 89499452 NA NA 2184740.8 69758874
2020 1997744181 370365615 233987435 11859145 83549845 NA NA 2318111.1 57469314
2021 2300366675 625480081 352721841 16788643 100880597 NA NA 2447866.0 69069244
2022 2460503163 1026093146 745856683 18990273 90271974 NA NA 2858976.0 232365135
2023 2367855037 1061582212 716829413 46039351 88401628 NA NA 3029431.4 209430318
Code
exp_refundfund <- exp_temp %>% 
  filter(agency!= "799" & fund == "0278" & agency == "492") %>% 
  reframe(Refund_Exp = sum(expenditure), .by = fy)

exp_temp %>% 
  filter(agency!= "799" & fund == "0278") %>% 
  reframe(Refund_Exp = sum(expenditure), .by = c(fy, sequence, object)) %>%
  pivot_wider(names_from = sequence, values_from = Refund_Exp) %>% kable %>%  kable_classic()
fy object 00 01 02
1998 9910 513005729 229098806.1 NA
1999 9910 616908650 277503590.9 NA
2000 9910 775422887 370281598.4 NA
2001 9910 840259580 239387492.6 NA
2002 9910 832755690 211480996.8 NA
2002 9914 23310 NA NA
2003 9910 1245098851 356982288.3 NA
2004 9910 1102106609 609058270.9 NA
2005 9910 1042809475 367468015.6 NA
2006 9910 1097661440 339088519.8 NA
2007 9910 1137658843 291751793.7 NA
2008 9910 1214885081 180814059.5 NA
2009 9910 1365083481 212704578.7 NA
2009 1993 73 NA NA
2010 9910 1336317406 8.8 NA
2011 9910 1530979396 21889877.7 NA
2012 9910 1367159183 774357376.3 NA
2013 9910 1734346078 524499829.8 NA
2014 9910 1927457499 528414832.8 NA
2015 9910 1919766890 515803476.1 NA
2016 9910 1856414695 276671666.8 NA
2017 9910 1923820315 358135955.2 NA
2018 9910 1916202732 589884877.1 139003
2019 9910 2113826707 318985893.5 16554474
2020 9910 1978586807 392025302.6 11721070
2021 9910 2791580132 509486255.6 16478729
2022 9910 2583749368 341933370.2 18830873
2023 9900 1093890247 NA NA
2023 9910 3158752297 381447728.4 45364248
Code
exp_temp %>% 
  filter(agency!= "799" & fund == "0278" & object >= 9000) %>% 
  reframe(Refund_Exp = sum(expenditure), .by = c(fy, obj_seq_type)) %>%
  pivot_wider(names_from = obj_seq_type, values_from = Refund_Exp) %>% kable %>%  kable_classic()
fy 99100008 99100108 99140008 99100208 99000008
1998 513005729 229098806.1 NA NA NA
1999 616908650 277503590.9 NA NA NA
2000 775422887 370281598.4 NA NA NA
2001 840259580 239387492.6 NA NA NA
2002 832755690 211480996.8 23310 NA NA
2003 1245098851 356982288.3 NA NA NA
2004 1102106609 609058270.9 NA NA NA
2005 1042809475 367468015.6 NA NA NA
2006 1097661440 339088519.8 NA NA NA
2007 1137658843 291751793.7 NA NA NA
2008 1214885081 180814059.5 NA NA NA
2009 1365083481 212704578.7 NA NA NA
2010 1336317406 8.8 NA NA NA
2011 1530979396 21889877.7 NA NA NA
2012 1367159183 774357376.3 NA NA NA
2013 1734346078 524499829.8 NA NA NA
2014 1927457499 528414832.8 NA NA NA
2015 1919766890 515803476.1 NA NA NA
2016 1856414695 276671666.8 NA NA NA
2017 1923820315 358135955.2 NA NA NA
2018 1916202732 589884877.1 NA 139003 NA
2019 2113826707 318985893.5 NA 16554474 NA
2020 1978586807 392025302.6 NA 11721070 NA
2021 2791580132 509486255.6 NA 16478729 NA
2022 2583749368 341933370.2 NA 18830873 NA
2023 3158752297 381447728.4 NA 45364248 1093890247
Code
exp_temp %>% 
  filter(agency!= "799" & fund == "0278" & object >= 9000) %>% 
  # mutate(wh_approp_name = ifelse(is.na(wh_approp_name), "INCOME TAX REFUNDS",
  #                                ifelse(wh_approp_name == "INCOME TAX REFUND (RETURN DD)", "INCOME TAX REFUNDS (RETURN DD)", wh_approp_name) )
#) %>% 
  reframe(Refund_Exp = sum(expenditure), .by = c(fy, wh_approp_name)) %>%
  pivot_wider(names_from = wh_approp_name, values_from = Refund_Exp) %>%
  mutate(TotalRefund = sum(`INCOME TAX REFUNDS` + `INCOME TAX REFUNDS (RETURN DD)` + `INCOME TAX REFUNDS (UNITARY)` + `INCOME TAX REFUNDS (NON-UNI)` + `ONE TIME TAX REBATES`, na.rm=TRUE ) ) %>% kable %>%  kable_classic()
fy NA INCOME TAX REFUNDS INCOME TAX REFUND (RETURN DD) INCOME TAX REFUNDS (UNITARY) INCOME TAX REFUNDS (NON-UNI) INCOME TAX REFUNDS (RETURN DD) ONE TIME TAX REBATES TotalRefund
1998 742104535 NA NA NA NA NA NA 0
1999 894412241 NA NA NA NA NA NA 0
2000 1145704485 NA NA NA NA NA NA 0
2001 1079647073 NA NA NA NA NA NA 0
2002 1044259996 NA NA NA NA NA NA 0
2003 1602081139 NA NA NA NA NA NA 0
2004 1711164879 NA NA NA NA NA NA 0
2005 1410277490 NA NA NA NA NA NA 0
2006 1436749960 NA NA NA NA NA NA 0
2007 1429410637 NA NA NA NA NA NA 0
2008 1395699141 NA NA NA NA NA NA 0
2009 NA 1577788060 NA NA NA NA NA 0
2010 NA 1336317415 NA NA NA NA NA 0
2011 NA 1552869274 NA NA NA NA NA 0
2012 NA 2141516559 NA NA NA NA NA 0
2013 NA 2258845908 NA NA NA NA NA 0
2014 NA 2455872332 NA NA NA NA NA 0
2015 NA 2435570366 NA NA NA NA NA 0
2016 NA 2133086362 NA NA NA NA NA 0
2017 NA 2281956270 NA NA NA NA NA 0
2018 NA 2506087609 139003 NA NA NA NA 0
2019 NA 2432812601 16554474 NA NA NA NA 0
2020 NA NA NA 1978586807 392025303 11721070 NA 0
2021 NA NA NA 2791580132 509486256 16478729 NA 0
2022 NA NA NA 2583749368 341933370 18830873 NA 0
2023 NA NA NA 3158752297 381447728 45364248 1093890247 0
Code
left_join(rev_refundfund, exp_refundfund) %>% mutate(Refund_diff = Refund_Rev - Refund_Exp) %>% kable %>%  kable_classic()
fy Refund_Rev Refund_Exp Refund_diff
1998 857937930 742104535 115833395
1999 987335358 894412241 92923117
2000 1072462487 1145704485 -73241998
2001 1030888390 1079647073 -48758683
2002 1027878841 1044259996 -16381155
2003 1116659453 1602081139 -485421686
2004 1714897377 1711164879 3732498
2005 1525217335 1410277490 114939845
2006 1532945462 1436749960 96195502
2007 1639287737 1429410637 209877101
2008 1438513368 1395699141 42814227
2009 1580223167 1577788060 2435107
2010 1385179429 1336317415 48862014
2011 1709892482 1552869274 157023209
2012 2226086785 2141516559 84570226
2013 2494497675 2258845908 235651767
2014 2417899895 2455872332 -37972437
2015 2428198721 2435570366 -7371645
2016 2063469754 2133086362 -69616609
2017 2295793316 2281956270 13837046
2018 2769199435 2506226612 262972823
2019 2924271340 2449367074 474904266
2020 2661884656 2382333180 279551476
2021 3350085708 3317545117 32540591
2022 4467677103 2944513611 1523163491
2023 4358726411 4679454521 -320728109
Code
# get all individual and corporate income tax revenue items 
income_rev <- rev_temp %>% 
  filter(!rev_type %in% c("99", "98", "72")) %>%
  filter(rev_type %in% c( "02", "03" ) )

rev_temp %>%  
  # no transfers, bond proceeds, prior year refunds
  filter(!rev_type %in% c("99", "98", "72")) %>%
  filter(rev_type %in% c( "02") ) %>% group_by(fy) %>% 
  summarize("Ind. Inc. Receipts, gross refunds & PPRT" = sum(receipts))
rev_temp %>%  filter(!rev_type %in% c("99", "98", "72") &
                       fund != "0278" &
                       rev_type %in% c( "02") ) %>% 
  group_by(fy) %>% summarize(" Ind. Inc. Receipts, gross PPRT, net Refunds" = sum(receipts))
Code
tax_refunds_rev <- rev_temp %>% 
  filter(!rev_type %in% c("99", "98", "72")) %>%
  filter(str_detect(fund_name_ab, "REFUND") |                   # search string for refund, just in case
           fund %in% c("0121", "0278", "0378") #|             # refund funds
         #  source %in% c("1905", "1906", "1923", "2138")     # amnesty rev sources
         )

tax_refunds_rev %>% 
  #filter(rev_type_name == )
  group_by(fy, rev_type, source, source_name_AWM ) %>% 
  arrange(fy) %>%
  summarize(refunds_rev = round(sum(receipts)) ) %>% 
  pivot_wider(id_cols = c(rev_type, source, source_name_AWM), names_from = fy, values_from = refunds_rev) %>%
  arrange(rev_type)
tax_refunds_rev %>% 
  group_by(fy, rev_type, source, source_name_AWM, fund ) %>% 
  arrange(fy) %>%
  summarize(refunds_rev = round(sum(receipts)) ) %>% 
  pivot_wider(id_cols = c(rev_type, source, source_name_AWM, fund), names_from = fy, values_from = refunds_rev)
# expenditure Objects related to refunds 
refund_expenses <- exp_temp %>% filter( #agency == 492 | 
                                         (object >= 9900 & object <=9941) & expenditure > 0) 


refund_expenses %>% 
  group_by(object, fy) %>% 
  summarize(exp = round(sum(expenditure))) %>% 
  pivot_wider(names_from = "fy", values_from = "exp")
# excellist <- list(income_rev, tax_refunds_exp, tax_refunds_rev)
# writexl::write_xlsx(excellist,  "taxrefunds_check.xlsx")
Table 9.1
Code
exp_temp <- exp_temp %>% 
  mutate(
    wh_approp_name = if_else(obj_seq_type == "99100008", "INCOME TAX REFUNDS (UNITARY)", 
                             if_else(obj_seq_type == "99100108", "INCOME TAX REFUNDS (NON-UNI)", 
                                    if_else(obj_seq_type == "99100208", "INCOME TAX REFUNDS (RETURN DD)", as.character(wh_approp_name)), as.character(wh_approp_name))))

tax_refunds_exp <- exp_temp %>% 
  filter(agency != 799) %>%
  filter(str_detect(fund_name_ab, "REFUND")
           | fund %in% c(#"0121", 
                         "0278" 
                        # "0378", "0380", "0671"
                        )
                        )

tax_refunds_exp %>% group_by(fy, fund, fund_name_ab) %>% summarize(refunds_exp = sum(expenditure)) %>% pivot_wider(id_cols = c(fund, fund_name_ab), names_from = fy, values_from = refunds_exp)
# Matches IOC
# Includes the $1 billion one-time abatement in FY 2023

tax_refunds_exp %>% 
  group_by(fy, obj_seq_type, wh_approp_name) %>% 
  summarize(refunds_exp = sum(expenditure)) %>% 
  pivot_wider(names_from = fy, values_from = refunds_exp)
Table 9.2

After exporting the expenditures and revenues that were related to Refund funds (identified by searching for string containing “refund” and then also identifying the fund number because, in early years, data requested did not have fund labels associated with fund numbers. Yes, you could do just the fund numbers in the command, but if anything changes, looking for strings that contain “refund” would hopefully alert the coder that something new existed which would otherwise be more difficult if only using fund numbers).