The split-rate or ‘two-way’ system of property taxation differs from conventional property tax in that it taxes a property’s land and building at different rates. The total property tax is the sum of the taxes levied on assessed value of land and building. Most often, municipalities will tax land at a higher rate than building, the theoretical effect of which is to encourage development of the land to a higher use, since improvements made will not be taxed at as high a rate.
Most literature on the topic looks to observe the development in an area after this split-rate tax (SRT) is implemented, with studies showing a higher relative tax on land value and lower relative tax on building value increases construction activity and business growth. However, research on the effect of such taxes on residential property values (in terms of either assessment value or sale price) in lacking.
The research question: How does split-rate taxation impact sale price and assessed value of a residential property? The theoretical impact is a higher value on land, lower value on buildings, but the impact on residential property sales and overall assessed value on property (land and building) is difficult to determine and often depends on factors within a given municipality’s real estate market.
Using a dataset containing land parcel data from Allegheny County, Pennsylvania (which hosts 3 current municipalities implementing SRT, and one former), we can examine the changes in sale price and assessed value for municipalities that implemented this tax and compare with other municipalities that use conventional property tax, in a difference in difference analysis approach.
Most literature on the topic of split-rate, or two-way taxation is focused on business development, housing supply, or construction, not necessarily real estate values for residential properties. This is where this project can add to the economic understanding of split-rate taxation.
Data comes from the Allegheny County properties database, accessed through the Western Pennsylvania Regional Data Center. Why Pennsylvania? PA is the only state in which allows some municipalities to adopt two-rate tax systems( i.e., the only state that allows second/third class cities or even boroughs to implement this type of policy).
This dataset is large- originally containing property and assessment data for 580,000 observations over 100 years, though most observations occur within the past few decades (median year is 2011. The dataset also contains property information for commercial and other types of property. The data will be filtered down to only include residential properties, and furthermore, residential properties with record of a ‘Valid Sale’, so Love and Affection (theoretical sale price =0) and other types of sales that did not occur in the form of a typical real estate market transaction are excluded. The reason for doing this is to give the best possible example of the housing market and assessment value for the municipalities in question.
Missing values within observations were simply omitted. After omitting null values, the dataset including residential properties that had valid sales contains 126,000 observations from 1971-2022. Of which, about half are from the City of Pittsburgh, which is of note as it had an SRT system which was repealed in 2000, and is thus one of the specific municipalities we will be observing.
After the data was reduced to include only residential and valid sales, we need to aggregate the data on two fronts:
Median Fair market Value follow a similar pattern over time, with some municipalities averaging much higher fair market value. We may opt to remove outlier municipalities with high fair market values, as the ‘test’ municipalities have rarely break $200,000 Fair Market Total assessment value.
This chart included all municipalities and the log value of Fair Market assessment value.
There appear to be different trends in Fair Market Value after policy change for the observed municipalities compared to the Control group. This makes sense as new tax methodology impacts assessment value of homes and taxes collected from properties.
The trends and differences between the control and ‘treatment’ will show the impacts of the policy change, if any. However, in order to evaluate any causal impact, we must confirm that the control and treatment groups follow the parallel trends assumption. In a staggered difference in difference approach, this analysis can be more difficult. Since different treatment groups changed policies in different years, the chart below becomes slightly less readable. However, some observations can be made.
It appears that the City of Pittsburgh, one of the treatment groups, adheres to parallel trends, as Pittsburgh actually repealed the split-rate tax policy in 2000. As seen, the trends for Pittsburgh and the control group are very similar after this change. That said, there does not appear to be major differences between Pittsburgh and the Control before the year 2000.
The grouped Treatment municipalities are a touch more difficult to analyze, as they had fewer combined observations than both Pittsburgh and the Control, which may show as more volatile changes across years. We can see some upward trend before policy changes, and a more dramatic upward trend in years long after. Trends before policy appear to be similar enough to accept results from a difference in difference analysis. For more accuracy, more municipalities in the Control group may be eliminated based on similarities with the Treatment. This will be discussed further in the Limitations section.
We want to observe adjusted sales prices and land/building values before and after policy implementation, and comparing with ‘control’ group and the expected theoretical effect (from Literature Review). The ‘control’ group is the other municipalities.
We will also want to account for the different ratios used by two-rate municipalities.
A potential formula for expressing estimated Sales Prices:
\[ FairMarket_{it} = \gamma_i + \lambda_t + \delta(SRT)_{it} + \epsilon_{it} \]
where,
\(\gamma_t\) represents unit (municipality) fixed effects,
\(\lambda_i\) represents year (time) fixed effects,
\(\delta(SRT)\) is a the estimator of interest, showing change for municipalities,
\(i\) represents municipality and \(t\) represents year.
Using this formula, we were able to derive a statistically significant coefficient, which is our estimator for impact of policy. According to our model, implementation of the split-rate tax (where land is taxed at a higher value than buildings) increases the log of Fair Market Value for residential properties by 0.199. This result is in line with the theoretical impact of split-rate taxation, which is an increase in overall property value due to higher value of land itself.
##
## ============================================================================================
## Dependent variable:
## ------------------------------------------------------------------------
## logfmv
## OLS panel
## linear
## (1) (2) (3)
## --------------------------------------------------------------------------------------------
## TaxPolicy -0.722*** -0.757*** 0.199**
## (0.080) (0.079) (0.092)
##
## Constant 11.202***
## (0.015)
##
## --------------------------------------------------------------------------------------------
## Fixed effects No Year Fixed Effects Year
## Observations 3,632 3,632 3,632
## R2 0.022 0.025 0.001
## Adjusted R2 0.022 0.011 -0.042
## Residual Std. Error 0.887 (df = 3630)
## F Statistic 82.489*** (df = 1; 3630) 91.600*** (df = 1; 3579) 4.676** (df = 1; 3481)
## ============================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
##
## =====================================
## Dependent variable:
## ---------------------------
##
## -------------------------------------
## TaxPolicy 0.199**
## (0.090)
##
## =====================================
## =====================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Since the dependent variable has been log-transformed, the interpretation of the coefficient is is easier understood by exponentiation of the coefficient of interest.
For each implementation of split-rate tax policy, Fair Market Value Assessment increases by about 22%.
In controlling for fixed effects of time and municipality in our model, we considered the differences in time and municipality that can be impacted Fair Value Assessments outside of the two-way tax implementation.
One major limitation is the variance in municipalities among the control group. Future versions of this study will have more rigorous standards for which municipalities to include in the the analysis. This could take the form of excluding municipalities based on population, density, or population loss over time, similar to the methodologies in Plassman & Tideman (2000).
In addition, future versions of this study will benefit from the inclusion of the exact ratio of the implemented split-tax. This will give a clearer picture of the impact of land-value taxation, which is the essential addition to the policy.
The DiD model applied in this study shows significant results on the impact of split-rate tax implementation on municipalities in Allegheny County. This finding is in line with literature (Yang & Hawley 2021) stating split rate taxation leads to increased market values in Pennsylvania. Our study complements this finding by observing a larger time period and the difference in differences within the state’s second most populous county, with the data coming from individual property assessment records.
We found a positive increase in fair market value of residential properties for municipalities implementing split-rate tax opposed to municipalities using a conventional property tax system. Given the common demographic characteristics of municipalities that have chosen to adopt this policy (lower initial property values, higher population density, concentrations of low-income households) this finding can have major implications. Higher assessed value can make these areas more attractive to development, which has been lacking in many of these areas. Literature states development does in fact increase in split-rate municipalities, and this can have an obvious benefit to the population, in the form of development of amenities, as well as the municipalities, in the form of greater tax revenue resulting from increase property values nd development of new properties.
However, an important consideration is the balance between higher property values and increased development with the potential for ‘pricing out’ of current lower income residents. A careful approach to policy implementation would be necessary to ensure the benefits to higher property values are equitably distributed.
rm(list = ls())
gc()
cat("\f")
packages <- c("psych", # quick summary stats for data exploration,
"stargazer", #summary stats for sharing,
"tidyverse", # data manipulation like selecting variables,
"corrplot", # correlation plots
"ggplot2", # graphing
"ggcorrplot", # correlation plot
"gridExtra", #overlay plots
"data.table", # reshape for graphing
"car", #vif
"prettydoc", # html output
"visdat", # visualize missing variables
"glmnet", # lasso/ridge
"caret", # confusion matrix
"MASS", #step AIC
"plm", # fixed effects demeaned regression
"lmtest" # test regression coefficients
)
for (i in 1:length(packages)) {
if (!packages[i] %in% rownames(installed.packages())) {
install.packages(packages[i]
, repos = "http://cran.rstudio.com/"
, dependencies = TRUE
)
}
library(packages[i], character.only = TRUE)
}
rm(packages)
library(readr)
setwd("/Users/matthewcolantonio/Desktop/srt_ac/")
ass <- read_csv("AlleghenyCountyAssessments.csv")
problems(ass)
# for DID
ass1 <- ass[,c(1, 5, 8, 18:19, 25, 27:28, 34:35, 37, 48:57)]
# removing hyphens from dates to easily subset before and after periods
ass.clean <- ass1 %>% mutate_if(is.character, function(c) str_replace_all(c, c("-"="")))
# limiting saledate to the last four digits (year)
ass.clean$SALEDATE <- substr(ass.clean$SALEDATE, start = nchar(ass.clean$SALEDATE) - 3, stop = nchar(ass.clean$SALEDATE))
# date as numerical not chracter
ass.clean$SALEDATE <- as.numeric(ass.clean$SALEDATE)
# dates after 1970
ass.clean <- ass.clean[ass.clean$SALEDATE > 1970,]
# character to numeric
ass.clean$COUNTYBUILDING <- as.numeric(ass.clean$COUNTYBUILDING)
ass.clean$COUNTYLAND <- as.numeric(ass.clean$COUNTYLAND)
ass.clean$LOCALTOTAL <- as.numeric(ass.clean$LOCALTOTAL)
ass.clean$FAIRMARKETBUILDING <- as.numeric(ass.clean$FAIRMARKETBUILDING)
ass.clean$FAIRMARKETTOTAL <- as.numeric(ass.clean$FAIRMARKETTOTAL)
# subsetting to include residential properties only
ass.res <-ass.clean[ass.clean$CLASSDESC == "RESIDENTIAL",]
ass.res %>%
summarise(across(everything(),~sum(is.na(.)))) %>%
glimpse()
ass.res <- na.omit(ass.res)
ass.res %>%
summarise(across(everything(),~sum(is.na(.)))) %>%
glimpse()
describe(ass.res$SALEDATE)
describe(ass.res, fast = T)
# City of Clairton
clairton <- ass.res[ass.res$PROPERTYCITY == "CLAIRTON",]
# City of Duquesne
duquesne <- ass.res[ass.res$PROPERTYCITY == "DUQUESNE",]
# City of McKeesport
mckeesport<- ass.res[ass.res$PROPERTYCITY == "MCKEESPORT",]
treatment <- ass.res[ass.res$PROPERTYCITY %in% c("MCKEESPORT", "DUQUESNE", "CLAIRTON"), ]
# City of Pittsburgh
pgh <- ass.res[ass.res$PROPERTYCITY == "PITTSBURGH",]
# creating our "control", which exlcudes all SRT munis
control <- ass.res[!(ass.res$PROPERTYCITY %in% c("PITTSBURGH", "MCKEESPORT", "CLAIRTON", "DUQUESNE")), ]
# aggregate data
agg.all <- aggregate(cbind(FAIRMARKETTOTAL) ~ SALEDATE + PROPERTYCITY,
data = ass.res,
FUN = median)
#create dummies
agg.all$TaxPolicy <- if_else(
(agg.all$PROPERTYCITY == "PITTSBURGH" & agg.all$SALEDATE < 2000) |
(agg.all$PROPERTYCITY == "CLAIRTON" & agg.all$SALEDATE > 1989) |
(agg.all$PROPERTYCITY == "DUQUESNE" & agg.all$SALEDATE > 1985) |
(agg.all$PROPERTYCITY == "MCKEESPORT" & agg.all$SALEDATE > 1980),
1, 0
)
agg.all$logfmv <- log(agg.all$FAIRMARKETTOTAL)
agg.all$logfmv <- ifelse(agg.all$FAIRMARKETTOTAL <= 0, NA, log(agg.all$FAIRMARKETTOTAL))
agg.control <- aggregate(cbind(FAIRMARKETTOTAL) ~ SALEDATE,
data = control,
FUN = median)
agg.treatment <- aggregate(cbind(FAIRMARKETTOTAL)~ SALEDATE,
data = treatment,
FUN = median)
agg.pgh <- aggregate(cbind(FAIRMARKETTOTAL) ~ SALEDATE,
data = pgh,
FUN = median)
agg.clairton <- aggregate(cbind(FAIRMARKETTOTAL) ~ SALEDATE,
data = clairton,
FUN = median)
agg.duquesne <- aggregate(cbind(FAIRMARKETTOTAL) ~ SALEDATE,
data = duquesne,
FUN = median)
agg.control2 <- aggregate(FAIRMARKETTOTAL ~ PROPERTYCITY + SALEDATE, data = control, FUN = median)
ggplot(agg.control2, aes(x = SALEDATE, y = FAIRMARKETTOTAL, color = PROPERTYCITY)) +
geom_line() +
labs(x = "Year", y = "Fair Market Value", color = "Property City") +
theme_minimal() +
theme(legend.position="bottom", legend.title=element_blank())
ggplot(agg.all, aes(x = SALEDATE, y = logfmv, color = PROPERTYCITY)) +
geom_line() +
labs(x = "Year", y = "Log Fair Market Value", color = "Property City") +
theme(legend.position="bottom", legend.title=element_blank())
ggplot(agg.all, aes(x = SALEDATE, y = logfmv, color = PROPERTYCITY)) +
geom_line() +
labs(x = "Year", y = "Log Fair Market Value", color = "Property City") +
theme(legend.position="bottom", legend.title=element_blank())
p1 <- ggplot(agg.control, aes(x = SALEDATE)) +
geom_line(aes(y = FAIRMARKETTOTAL, color = "Fair Market Control")) +
scale_color_manual(values = c("blue", "red")) +
labs(x = "Year", y = "Fair Market Val", color = "Variable") +
theme_minimal() +
geom_vline(xintercept = c(1985, 1989, 2000), linetype = "dashed")
p2 <- ggplot(agg.pgh, aes(x = SALEDATE)) +
geom_line(aes(y = FAIRMARKETTOTAL, color = "Fair Market PGH")) +
scale_color_manual(values = c("blue", "red")) +
labs(x = "Year", y = "Fair Market Val", color = "Variable") +
theme_minimal() +
geom_vline(xintercept = 2000, linetype = "dashed")
p3 <- ggplot(agg.clairton, aes(x = SALEDATE)) +
geom_line(aes(y = FAIRMARKETTOTAL, color = "Fair Market Clairton")) +
scale_color_manual(values = c("blue", "red")) +
labs(x = "Year", y = "Fair Market Val", color = "Variable") +
theme_minimal() +
geom_vline(xintercept = 1989, linetype = "dashed")
p4 <- ggplot(agg.duquesne, aes(x = SALEDATE)) +
geom_line(aes(y = FAIRMARKETTOTAL, color = "Fair Market Duquesne")) +
scale_color_manual(values = c("blue", "red")) +
labs(x = "Year", y = "Fair Market Val", color = "Variable") +
theme_minimal() +
geom_vline(xintercept = 1985, linetype = "dashed")
# arrange plots side by side
grid.arrange(p1, p2, p3, p4, ncol = 1)
merged_data <- merge(agg.control, agg.treatment, by = "SALEDATE", all = TRUE)
merged_data <- merge(merged_data, agg.pgh, by = "SALEDATE", all = TRUE)
# Rename columns
colnames(merged_data)[2:4] <- c("control_median", "treatment_median", "pgh_median")
ggplot(merged_data, aes(x = SALEDATE)) +
geom_line(aes(y = control_median, color = "Control Group")) +
geom_line(aes(y = treatment_median, color = "Treatment Group")) +
geom_line(aes(y = pgh_median, color = "Pittsburgh")) +
labs(x = "Year", y = "Median Fair Market Value", color = "Variable") +
theme_minimal() +
geom_vline(xintercept = c(1985, 1989, 2000), linetype = "dashed")
# Clairton
# before policy (1989)
clairton.before <- clairton[clairton$SALEDATE < 1989,]
# after policy
clairton.after <- clairton[clairton$SALEDATE > 1989,]
# less than 1921 observations
# Duquesne
# before policy (1985)
duquesne.before <- duquesne[duquesne$SALEDATE < 1985,]
# after policy
duquesne.after <- duquesne[duquesne$SALEDATE > 1985,]
# less than 493 observations
# Pittsburgh
# note: before for Pittsburgh = policy
# with policy (prior to 2000)
pgh.with <- pgh[pgh$SALEDATE < 2000,]
# after policy repeal
pgh.without <- pgh[pgh$SALEDATE > 2000,]
# almost 70,000 obsevaitons
modela <- lm(logfmv ~ TaxPolicy,
data = agg.all)
modelb <- plm(logfmv ~ TaxPolicy,
data = agg.all,
index = ("SALEDATE"),
model = "within")
modelc <- plm(logfmv ~ TaxPolicy,
data = agg.all,
index = c("PROPERTYCITY", "SALEDATE"),
model = "within",
effect = 'twoways')
stargazer(modela, modelb, modelc, type = 'text', digits =3,
add.lines=list(c('Fixed effects', 'No','Year Fixed Effects', 'Year & Muni Fixed Effects')))
stargazer(coeftest(modelc, vcov. = vcovHC, type = "HC1"), type = 'text', digits = 3)
(exp(0.199)-1)*100
#For each implementation of split-rate tax policy, Fair Market Value Assessment increases by about 22%.