The discussion of pension budget items on this page is to document how pensions items were identified and used in the Fiscal Futures Report. It also is meant to be informative for other researchers trying to use the data. For those trying to look at the bigger fiscal health picture and include unfunded liabilities and in/out flows, then items like purchase of investments and POB spikes in trends that occurred from policy changes should be analyzed and discussed in a separate section.

Code
library(tidyverse)
library(scales)
library(ggplot2)
library(readxl)
library(ggrepel)
library(data.table)
library(janitor)

theme_set(theme_classic())

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

For Fiscal Gap yearly expenditure calculations, the state contributions to the pension funds (object = 4431) should be the expenditure included for pensions.

Pension expenditures referenced in the analysis are based on state payments to the following pension systems:

Employer contributions for pensions are excluded from analysis to avoid double counting the cost of pensions. Expenditures with object 4430 for pensions, benefits, and annuities appears in items from funds 0473, 0477, 0479, 0481, (TRS, JRS, SERS, GARS), 0755, 0786, 0787, 0788, 0789, 0799 (deferred compensation plan, GAR excess benefit, JRS excess benefit, SER excess benefit, TRS excess benefit, state university retirement system) are NOT included in the analysis. All are coded with in_ff=0 in the fund_ab_in.xlsx file of funds.

Most of these funds were found by either using CTRL-F with pension related words or scrolling through code options on the comptroller’s website.

Code
exp_temp <- read_csv("./data/exp_temp.csv") %>% filter(agency != "799")
rev_temp <- read_csv("./data/rev_temp.csv") %>% filter(agency!= "799")


# check what is being included in pensions

# funds related to pension contributions
pension_funds <- c("0472", "0473", "0477", "0479", "0481", "0755", "0786", "0787", "0788", "0789", "0799")

pension_check <- exp_temp %>% 
  
  mutate(pension = case_when( 
    # object == "4430" & fund == "0825" ~ "Object 4430 - Pension Buyout/Benefits Paid Early",
    (object=="4430") ~ "Object 4430 - Benefits Paid to \nEmployees; EXCLUDED", # pensions, annuities, benefits
    (object=="4431") ~ "Object 4431 - State Contributions; INCLUDED", # 4431 = state payments into pension fund
    (obj_seq_type > "11590000" & obj_seq_type < "11660000")  ~ "Object 1160-1165 Employer Contributions \nto Pension Fund; EXCLUDED",
    # objects 1159 to 1166 are all considered Retirement by Comptroller 
    
    TRUE ~ "0")) %>%  # All other observations coded as 0 for non-pension items
  
  # recodes specific instances of code anomalies from past years:
  mutate(pension = case_when(
    (object=="1298" & fund %in% pension_funds ) ~ "Object 1298 - Purchase of Investments; DROPPED", 
    # pension stabilization fund in 2022 
    # object == "1900" & fund == "0319" ~ "Fund 0319-Pension Stabilization", 
    object == "1900" & fund %in% pension_funds ~ "Fund 0319 - Pension Stabilization", 
    
    
    object == "4900" & fund %in% pension_funds ~ "Object 4900 - Awards/Grants; Weird 2010-2011 values",
    
    TRUE ~ as.character(pension)) ) %>% 
  filter(pension != "0" )

pension_check %>% 
  mutate(label = if_else(fy == max(fy), as.character(pension), NA_character_)) %>%
  group_by(fy, pension, label) %>% 
  
  summarize(expenditure = sum(expenditure, na.rm = TRUE)) %>%
  ggplot(aes(x=fy, y = expenditure/1000000000, color = pension)) + 
  geom_line() + 
  geom_text( aes(label = label),
             hjust = .2, 
             nudge_x = 0.1,
             nudge_y = 0.1) +
  labs (title = "Pension Fund Payments In and Retirement Benefits Out", 
  y= "Billions of Dollars",  x = "")+
   # theme(legend.position = "bottom")+
    theme(legend.position = "none",
                    plot.margin = margin(0, 6, 0, 0, "cm"))+
    scale_x_continuous(expand = c(0,0)) +
  coord_cartesian(clip = 'off', expand = TRUE)
Figure 7.1: Included and Excluded Items

Pension contributions from employees and employers are not included as revenue sources but are useful for understanding the money going into the funds and the money flowing out of the funds. Identifying and graphing employee and employer contributions, as well as benefits paid to retired employees and state contributions was important for checking the items that should and should not be included in the analysis.


Code
# rev_type = 51 is for retirement/pension contributions from both employers and employees.

# current year employee revenue source = 0573, contributions by employee == 572 (stops at 2011)

## revenue side: ##
retirement_contributions <- rev_temp %>% 
  filter(rev_type == "51") %>% group_by(fy) %>% summarize(contributions = sum(receipts))

employer_contributions <- rev_temp %>% 
  filter(rev_type == "51" & source == "0577") %>% group_by(fy) %>% summarize(contributions = sum(receipts))

employee_contributions <- rev_temp %>% 
  filter(rev_type == "51" & (source == "0572" | source == "0573") ) %>% 
  group_by(fy) %>% summarize(contributions = sum(receipts))


## expenditure side ### 
benefits_paid <- pension_check %>% filter(object == "4430") %>%
  group_by(fy) %>% 
  summarize(expenditure = sum(expenditure, na.rm = TRUE))

state_contrib <- pension_check %>% filter(object == "4431") %>%
  group_by(fy) %>% 
  summarize(expenditure = sum(expenditure, na.rm = TRUE))



rev_temp %>% 
  filter(rev_type == "51") %>% # all retirement contributions
  mutate(label = if_else(fy == max(fy), as.character(source), NA_character_)) %>%
  group_by(fy, source, label) %>% 
  summarise(sum = sum(receipts, na.rm = TRUE)) %>%
  ggplot(aes(x=fy, y = sum, color=source)) +
  geom_line() + 
  theme(legend.position = "none")+
  geom_label_repel(aes(label = label),
                  nudge_x = 1,
                  na.rm = TRUE) +
  labs(title="Retirement Contribution Sources, ALL rev_source == 51") 
Figure 7.2: Source 0573, 0572 is for employee contributions. 0577 is Contributions by employer.

Additional pension info:
For the $10 billion in 2004, they borrowed money and invested it in pension portfolio and hoped that the returns would be greater than the interest on the debt. If returns>interest, then they increased the pension funds and it was a good idea. Otherwise a short term band-aid causes even more problems later. This added a significant amount to the unfunded pension liabilities. In 2010 and 2011, POBs served as a type of general borrowing for the state by borrowing against what was owed to the pension systems and using that revenue that should have funded pensions to instead subsidize the cost of providing core services. Illinois borrowed money (POBs) and used it to pay for government services. A temporary way to fill a budget gap for that 2010 that then costs more in the long run due to increased unfunded liabilities and interest on the borrowed money.1

In 2019 lawmakers offered a pension buyout plan where members could opt-out of their future benefits for a lump sum. However, few people participated in the buyout plan and very little savings have occurred so far. The buyout plan has been extended to 2026 in hopes that more people participate in it. Description of Pension Obligation Acceleration Bond at this link. Proceeds of bonds go into pension obligation acceleration fund (which are not included as a revenue source) and the fund is only used to make accelerated pension benefit payments. The pension stabilization fund (0319) is money put into the pension funds to help pay for unfunded liabilities from past poor budgeting decisions.

7.0.1 Data coding details

  • State pension contributions are largely captured with object=4431. (These are the State expenditures included in analysis)
    • includes 8 billion payment in 2004 that creates large peak in expenditure graph
    • Object 4431 does not capture recent pension stabilization fund which is fund = 0319, object = 1900 and has $300 million investment in FY2022.
  • Fund=0475 is the Municipal Retirement Fund - Not included because state just helps collect and disperse local pension funds. Fund ends in 2015. All were considered purchase of investments.
  • IOC objects 1160-1165 are for all retirement expenditures for employers. These are not included in the analysis as pension costs.
    • object = 1167 and 1168 is also for Employer pension contributions but is not used by IOC yet as of FY2022
  • Some expenditures with object=4430 (benefits paid to retirees) were paid for with Pension obligation bond funds (fund == 0825).
  • In past years, some POB funded expenditures were moved to revenue side. Code logic was unclear. We are no longer doing this as of FY2021.
  • Other types of pension expenditures to consider when looking at pension funds: Pension obligation acceleration bond, state pension obligation bond reimbursements, pension pickup, accelerated pension buy-out (bond financed funds)
  • object = 1298 is for Purchase of Investments and is excluded from analysis. In past analyses, there were a couple of exceptions during 2010 and 2011.
    • Purchase of Investments captures the pension obligation bonds issued in 2010-2011.
  • object = 1900 for pension stabilization is under lump sums
  • object = 4900 is awards and grants lump sum

7.0.2 About Pension System Funding

“Each year, the state is required to make contributions to its statutory pension systems: State Employees’ Retirement System (SERS), State Universities Retirement System (SURS), Judges’ Retirement System (JRS), General Assembly Retirement System (GARS) and Teachers’ Retirement System (TRS). The state’s contributions to SERS come from payment requests directly from SERS and from state agency payrolls. Contributions to GARS, JRS, SURS and TRS are vouchered directly by those pension systems. Additionally, the Chicago Teachers’ Pension Fund (CTPF) receives some state appropriations, though the system is primarily funded by Chicago residents.” - Illinois Comptroller’s Office

7.0.3 Difference in Pension Totals

“Fiscal Futures is designed to track government spending by function.  In our view, pensions are a form of compensation and therefore are part of the cost of the functions to which the worker is assigned.  Thus, the employer cost for the pension contribution for workers in the department of Labor is a cost of the function of providing government services for labor (e.g administering regulations related to safe workplaces, training for workers, etc.)  The pension expenditures for these workers should be (and are in Fiscal Futures accounting) assigned to the”labor” function.

Ideally, we would not have a “pension” category of expenditures at all.  In fact, when we first set up Fiscal Futures we discussed trying to allocate state pension contributions that were not attributable to any specific service across state functions.  After spending a considerable amount of time looking into this we decided it was not feasible to do this and compromised by including state pension payments as a category although it cannot be clearly linked to any function,  This is similar to debt service which also cannot be directly linked to a function”

Pension sources:

  • Ralph Matire & Drazzel Feliu. 2019. Center for Tax and Budget Accountability. “The Impact of Flawed Tax Policy & Pension Debt Repayment Plans on Illinois’ Structural Deficit”

  • Brown, Jeffrey R. & Richard F. Dye. 2015. “Illinois Pensions in a Fiscal Context: A (Basket) Case Study” NBER Working Paper Series. http://www.nber.org/papers/w21293.

  • CGFA 2014


  1. Brown, Jeffrey R. & Richard F. Dye. 2015. “Illinois Pensions in a Fiscal Context: A (Basket) Case Study” NBER Working Paper Series. http://www.nber.org/papers/w21293.↩︎