---
title: "PPRT"
format:
html:
code-fold: true
toc: true
toc-location: left
tbl-cap-location: margin
fig-cap-location: margin
df-print: paged
---
```{r include=FALSE}
library(tidyverse)
library(formatR)
library(lubridate)
library(scales)
library(kableExtra)
library(readxl)
library(data.table)
knitr::opts_chunk$set(warning = FALSE, message = FALSE)
alea_theme <- function() {
font <-"Whitney"
ggplot2::theme(
legend.position = "right",
legend.title = element_blank(),
panel.background = ggplot2::element_blank(),
panel.grid.minor.x = ggplot2::element_blank(),
panel.grid.major.y = element_line(color = "grey"),
panel.grid.minor.y = element_line(color = "grey",
linetype = "dashed"),
# panel.grid.major.x = ggplot2::element_blank(),
axis.ticks = element_line(color = "gray"),
axis.ticks.x = element_blank()
)
}
theme_set(alea_theme())
```
## Summary of UIC GFRC’s Research on the Illinois Personal Property Replacement Tax
The research team was asked to examine whether reform of the Personal Property Replacement Tax (PPRT) had the potential to significantly improve the Cook County property tax system.
### What is the PPRT?
In conjunction with ratification of the 1970 Illinois State Constitution, Illinois abolished the personal property tax (PPT), which levied a tax on business personal property such as equipment and machinery.
This PPT was replaced with a personal property replacement tax (PPRT), which substituted an income tax on businesses for a property tax on personal property. The tax rate is 2.5% on stand-alone businesses (e.g., Amazon, Inc.) and 1.5% on so-called “pass-through entities,” such as partnerships and S-corps for which the business’s income is imputed to the owners. This revenue is collected by the state and distributed to local governments.
### How Illinois splits PPRT revenue
Revenue distribution from the PPRT remains frozen in time from the statute’s passage: 51.65% of PPRT revenues flow to Cook County, a value based on its 1976 business tax base, while 48.35% goes to the rest of Illinois. Distribution among local governments is also based on the relative size of the tax base (in 1976 for Cook County and in 1977 for the remainder of the state). Approximately half of PPRT funds—in both Cook County and downstate Illinois—goes to school districts and one quarter goes to general purpose municipalities.

### Magnitude of PPRT revenue
In 2023, local governments in Cook County received approximately \$2.3 billion from the PPRT fund. By way of comparison, Cook County’s property tax revenues are approximately \$17.4 billion. Thus, while orders of magnitude smaller than property tax revenue, PPRT funding remains a material source of local transfers from the state.
### PPRT volatility
The PPRT is a corporate income tax and thus is equally volatile.

Recent concerns about PPRT volatility do not reflect a long-run feature of the tax. This concern is discussed further below.
### PPRT controversies
PPRT is controversial for two reasons, one fleeting and one systemic:
1. The fleeting issue is that passage of the Tax Cuts and Jobs Act changed the deductibility of state and local taxes (SALT). The states responded to this development by allowing pass-through businesses to take their SALT deduction at the organization level to avoid the new cap. This complexity was exacerbated by record-keeping challenges that injected temporary uncertainty into PPRT distributions.
2. The systemic issue is that any change to the PPRT would create winners and losers because the current distribution formula reflects the economy of the 1970s, not 2025. On the one hand, if new PPRT calculations were based on commercial property values, Cook County would stand to gain hundreds of millions of dollars. However, if PPRT were distributed based on employment or population, Cook County’s local governments would lose PPRT revenue.
While the first challenge, volatility in PPRT distributions, was temporary and based on *ad hoc* nation-wide adjustments to federal tax policy, the second controversial aspect of the PPRT—fixed distribution percentages—is inherently political because any reform will create winners and losers among local governments.
### Possibility of PPRT reform
The research team advised that any attempt to reform the PPRT would be likely to face substantial obstacles. First, it would directly affect the state school aid formula. Second, there would be clear winners and losers. Between these two challenges, any successful attempt to reform the PPRT likely would need to be part of a broader overhaul of state transfers to local governments.
## Supporting Code
```{r warning=FALSE}
first_year = 1998
current_year = 2024
rev_temp <- read_csv(paste0("../../Fiscal Futures IGPA/Fiscal-Future-Topics/data/FY", current_year, " Files/rev_temp.csv"))
exp_temp <- read_csv(paste0("../../Fiscal Futures IGPA/Fiscal-Future-Topics/data/FY", current_year, " Files/exp_temp.csv"))
exp_temp <- exp_temp %>%
mutate(
agency = case_when(
fund=="0515" & object=="4470" & type=="08" ~ "971", # income tax to local governments
fund=="0515" & object=="4491" & type=="08" & sequence=="00" ~ "971", # object is shared revenue payments
fund=="0802" & object=="4491" ~ "972", #pprt transfer
fund=="0515" & object=="4491" & type=="08" & sequence=="01" ~ "976", #gst to local
fund=="0627" & object=="4472"~ "976" , # public transportation fund but no observations exist
fund=="0648" & object=="4472" ~ "976", # downstate public transportation, but doesn't exist
fund=="0515" & object=="4470" & type=="00" ~ "976", # object 4470 is grants to local governments
object=="4491" & (fund=="0188"|fund=="0189") ~ "976",
fund=="0187" & object=="4470" ~ "976",
fund=="0186" & object=="4470" ~ "976",
object=="4491" & (fund=="0413"|fund=="0414"|fund=="0415") ~ "975", #mft to local
fund == "0952"~ "975", # Added Sept 29 2022 AWM. Transportation Renewal MFT
TRUE ~ as.character(agency)),
agency_name = case_when(
agency == "971"~ "INCOME TAX 1/10 TO LOCAL",
agency == "972" ~ "PPRT TRANSFER TO LOCAL",
agency == "975" ~ "MFT TO LOCAL",
agency == "976" ~ "GST TO LOCAL",
TRUE~as.character(agency_name))) %>%
mutate(group = ifelse(agency>"970" & agency < "977", as.character(agency), ""))
```
```{r}
transfers_long <- exp_temp %>%
filter(group == "971" |group == "972" | group == "975" | group == "976")
transfers_long %>%
group_by(agency_name, group, fy) %>%
summarize(expenditure = sum(expenditure, na.rm=TRUE) )%>%
ggplot() +
geom_line(aes(x=fy, y = expenditure, color=agency_name)) +
alea_theme() +
scale_x_continuous(expand = c(0,0), limits = c(1998, current_year+.5), breaks = c(1998, 2005, 2010, 2015, 2020, current_year+1 )) +
labs(title = "Transfers to Local Governments", caption = "Data Source: Illinois Office of the Comptroller")
```
```{r}
# Custom billion format
label_billions <- function(digits = 1) {
function(x) {
number_format(accuracy = 10^-digits, suffix = "B")(
x / 1e9
)
}
}
scale_y_billions <- function(..., digits = 1) {
scale_y_continuous(labels = label_billions(digits), ...)
}
exp_temp |> filter(fund_name_ab == "PERSONAL PROPERTY TAX REPLACE") |> arrange(desc(fy))
exp_temp |>
filter(fund == "0802" & agency == "972") |> arrange(desc(fy)) |>
ggplot() +
geom_line(aes(x=fy, y = expenditure, color=agency_name)) +
geom_smooth(aes(x=fy, y = expenditure, color=agency_name), method = "lm", se=FALSE, lty = 2) +
alea_theme() +
scale_x_continuous(expand = c(0,0), limits = c(1998, current_year+.5), breaks = c(1998, 2005, 2010, 2015, 2020, current_year + 1)) +
scale_y_billions() +
labs(title = "Expenditures: PPRT to Local Governments", caption = "Data Source: Illinois Office of the Comptroller",
y = NULL, x= NULL)
```
```{r}
rev_temp |> distinct(rev_type, rev_type_name, rev_type_name_COMPTROLLER)
exp_temp |> distinct(group)
exp_temp |> filter(!is.na(group)) |> View()
```
```{r}
corp_tax <- rev_temp |> filter(rev_type_name_COMPTROLLER %in% c("CORPORATE INCOME TAXES") & in_ff == 1) |> arrange(desc(fy)) |>
summarise(receipts = sum(receipts),
.by = c(fy, rev_type_name_COMPTROLLER)) |>
ggplot(aes(x=fy, y = receipts, color = rev_type_name_COMPTROLLER)) +
geom_line()
# + scale_y_billions() +
# geom_vline(xintercept = 2022) +
# labs(title = "Corporate Income Tax Revenue")
pprt_rev <- rev_temp |> filter(source_name_AWM == "PPRT-PERSON PROP TAX REPLACE" & in_ff == 1) |> arrange(desc(fy)) |>
summarise(receipts = sum(receipts),
.by = c(fy, rev_type_name_COMPTROLLER)) |>
ggplot(aes(x=fy, y = receipts)) +
geom_line() # +
# scale_y_billions() +
# geom_vline(xintercept = 2022) +
# labs(title = "State Revenue dedicated to PPRT")
ggplot()+
geom_line(data =(rev_temp |> filter(rev_type_name_COMPTROLLER %in% c("CORPORATE INCOME TAXES") & in_ff == 1) |>
summarise(receipts = sum(receipts),
.by = c(fy, rev_type_name_COMPTROLLER))),
aes(x=fy, y = receipts)) +
geom_line(data=(rev_temp |> filter(source_name_AWM == "PPRT-PERSON PROP TAX REPLACE" & in_ff == 1) |> arrange(desc(fy)) |>
summarise(receipts = sum(receipts),
.by = c(fy, rev_type_name_COMPTROLLER))),
aes(x=fy, y = receipts), color = "blue", lty = 2) +
scale_y_billions(name = "Billions of Nominal Dollars") +
theme(legend.position = "bottom") + labs(title = "Corporate Income Tax and PPRT-Specific Revenue", x = NULL)
rev_temp |> filter(rev_type_name_COMPTROLLER %in% c("CORPORATE INCOME TAXES", "INDIVIDUAL INCOME TAXES") & in_ff == 1) |> arrange(desc(fy)) |>
summarise(receipts = sum(receipts),
.by = c(fy, rev_type_name_COMPTROLLER)) |>
ggplot(aes(x=fy, y = receipts, color = rev_type_name_COMPTROLLER)) +
geom_line() + scale_y_billions() +
geom_vline(xintercept = 2022) +
labs(title = "Corporate & Individual Income Tax Revenue")
rev_temp |> filter(rev_type_name_COMPTROLLER == "CORPORATE INCOME TAXES"& in_ff == 1) |> arrange(desc(fy)) |>
summarise(receipts = sum(receipts),
fund_name = first(fund_name_ab),
.by = c(fy, fund)) |>
ggplot(aes(x=fy, y = receipts, group = fund, color = fund_name)) +
geom_line() + scale_y_billions() + labs(title = "Funds that Receive Corporate Income Tax Revenue ")
```
```{r}
rev_temp |> filter(fund_name_ab == "PERSONAL PROPERTY TAX REPLACE")
rev_temp |> filter(source_name_AWM == "PPRT-PERSON PROP TAX REPLACE")
```
```{r}
rev_temp |> filter(source == "0149"| source == "2489")
```
```{r}
#| label: fig-pprtestimatesbyagency
#| fig-cap: "Data downloaded from Illinois' Department of Revenue - https://tax.illinois.gov/localgovernments/disbursements/pprt.html"
pprt_il <- readxl::read_xlsx("../Circulated Materials/pprt_agency_shares.xlsx")
pprt_il |>
filter(!is.na(Type)) |>
group_by(Type) |>
summarize(Share = sum(`Share of Cook`)) |>
mutate(Type = reorder(Type, Share)) |> # reorder factor by Share
ggplot() +
geom_col(aes(y=Type, x = Share), fill = "blue") +
scale_x_continuous(labels = scales::percent, limits = c(0, .50)) +
labs(title = "Share of Cook County PPRT by Type of Taxing Agency", y = NULL, x = NULL)
```