The relationship between new housing supply and home prices lies at the core of debates in urban economics and housing policy. According to neoliberal economic theory, an increase in housing supply would put downlward pressure on the housing prices. However, some scholars find that such price effect vary in mangnitude due to a series of confounding factors like population growth, economic cycle, existing housing stock, etc.

For my senior economics thesis, I examined the effect of zoning reform on housing affordability, using the Minneapolis 2040 Plan as a case study. As part of that analysis, I constructed a monthly panel dataset by aggregating new residential building permits reported by the U.S. Census Bureau, using permit activity as a proxy for new housing supply. However, these building permit counts are highly volatile and noisy, making them poorly suited for the synthetic control method I employed in my main thesis model. As an extension of that work, this project aims to smooth the building permit data and estimate the relationship between housing supply and home prices using a Generalized Additive Model (GAM). The GAM framework allows for a flexible, data-driven approach to modeling nonlinear relationships between variables, offering a more nuanced understanding of how new construction affects home prices over time.

Data

This analysis draws on three primary data sources to examine the relationship between new housing supply and home prices at the city level: the Zillow Home Value Index (ZHVI), U.S. Census Bureau Building Permits Survey (BPS), and American Community Survey (ACS) 5-year estimates.

Zillow ZHVI (Zillow Home Value Index) provides a seasonally adjusted, smoothed measure of typical home values for a given geographic area. I use the All Homes ZHVI series reported monthly at the city level to track changes in the housing market over time. ZHVI is particularly suitable for measuring home price trends because it reflects the value of the entire housing stock—not just recent sales—and is designed to account for changes in the composition of homes sold.

To capture new housing supply, I use the Building Permits Survey (BPS), conducted by the U.S. Census Bureau. This dataset reports the number of new privately owned housing units authorized by building permits, disaggregated by place, structure type, and month. I aggregate the monthly counts of 1-unit, 2–4 unit, and 5+ unit structures at the city level to proxy new residential construction activity. While this measure provides timely and detailed insight into supply-side changes, the BPS data is inherently noisy. Permitting activity tends to be lumpy and subject to reporting delays or administrative batching, which introduces significant short-term volatility. For instance, the monthly trend in building permits issued in Minneapolis, MN is highly irregular, with sharp spikes followed by sudden drops that do not necessarily reflect underlying shifts in housing production. This volatility motivates the use of a smoothing model to extract a more stable, interpretable signal from the raw permit data.

Finally, to control for local socioeconomic conditions, I merge in American Community Survey (ACS) 5-year estimates at the place level. These covariates include population size, racial composition, median household income, poverty rate, housing tenure (e.g., homeownership rate), and housing stock characteristics (e.g., number of housing units, share of single-family homes). These variables help account for city-level heterogeneity that may influence both housing prices and construction patterns.

Generalized Additive Model(GAM)

I use a Generalized Additive Model (GAM) to estimate the relationship between new housing supply and home prices. The GAM is a flexible type of regression model that allows the relationship between your variables to be nonlinear and smooth, rather than forcing it to be a straight line. In a standard linear model, \(\beta_1\) represents the change in home price associated with a one-unit increase in new housing supply, holding other factors constant. This assumes that, every unit of new housing unit has the uniform effect on home prices, holding all other control consistent. However, this is an oversimplification of the relationship between housing supply and price.

\[ \text{Home Price} = \beta_0 + \beta_1 \cdot \text{New Housing Supply} + \varepsilon \]

The GAM relaxes this assumption by following the data. Here, \(\f()\) is a smooth curve that fits the building permits data. More specifically, GAM smoothens the building permits data by fitting spline functions - a smooth, bendy curve that’s used to connect a series of points. Instead of a rigid line from point to point, a spline function is more of a flexible line that bends smoothly through the data. The spline doesn’t try to hit every single data point, especially if there’s noise or random fluctuations. Instead, it “averages out” the ups and downs to reveal the broader pattern in the data. This is especially useful for variables like monthly building permits, which can spike or dip unpredictably from month to month. A spline smooths over those short-term jumps and gives a clearer view of the long-term trend.

\[ \text{Home Price} = \beta_0 + f(\text{New Housing Supply}) + \varepsilon \]

Model Setup

I first estimate an simple model that regress the home price(zhvi index) against the number of building permits issued per 1000 residents. The spline term is statistically significant, with an effective degrees of freedom(edf) at 8.31, indicating a flexible and nonlinear relationship. The smoothed curve shows that home prices tend to rise as new permits increase, especially at very low and very high levels of permitting. In the mid-range (around 2–4 permits per 1,000), the effect flattens somewhat. However, this model has limited explanatory power: it explains only about 8.6% of the variance in home prices (adjusted R-squared = 0.085).

I then incorporate a series of socioeconomic controls in the second model specification. The spline for building permits remains highly significant (p < 0.001), with an edf of 7.81 — still flexible, but now capturing the independent effect of permit activity after accounting for other variables. The shape of the curve remains generally upward sloping but appears smoother, suggesting that some of the nonlinearities in the first model were confounded by other city-level traits. All control variables are statistically significant and make intuitive sense. For example, higher poverty, larger Black and White populations, and higher housing inventory are all associated with lower home values, while older median age is associated with higher values. The adjusted R-squared jumps to 0.625, meaning this model explains over 62% of the variation in home prices — a huge improvement over the first model.

However, according to my dignoastic test, the spline term for building permits per 1,000 people may be underfitting the data. The effective degrees of freedom (edf = 7.81) are close to the upper bound (k’ = 9), and the k-index is below 1 (0.96) with a highly significant p-value (< 0.001), indicating that the spline may be too constrained. To address this, I fit a third model which allows the algorithm to automatically select the optimal degree of smoothness. This approach reduces the risk of underfitting and provides a more flexible, data-driven estimate of how new housing supply affects home prices.

## Loading required package: nlme
## 
## Attaching package: 'nlme'
## The following object is masked from 'package:dplyr':
## 
##     collapse
## This is mgcv 1.9-1. For overview type 'help("mgcv-package")'.
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## zhvi_index ~ s(bps_per_1000)
## 
## Parametric coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   204267        848   240.9   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                   edf Ref.df     F p-value    
## s(bps_per_1000) 8.314  8.867 122.1  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.085   Deviance explained = 8.57%
## GCV = 8.3368e+09  Scale est. = 8.3301e+09  n = 11583

## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## zhvi_index ~ s(bps_per_1000) + popE + white + black + home_ownership + 
##     housing_inventory + poverty + median_ageE + single_family_housing
## 
## Parametric coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            6.142e+05  8.709e+03  70.523   <2e-16 ***
## popE                  -4.423e-03  2.154e-03  -2.053   0.0401 *  
## white                 -3.132e+03  7.147e+01 -43.829   <2e-16 ***
## black                 -2.377e+03  7.219e+01 -32.924   <2e-16 ***
## home_ownership        -3.191e+03  1.301e+02 -24.538   <2e-16 ***
## housing_inventory     -1.153e+04  3.345e+02 -34.479   <2e-16 ***
## poverty               -8.567e+03  1.723e+02 -49.716   <2e-16 ***
## median_ageE            7.942e+03  1.767e+02  44.955   <2e-16 ***
## single_family_housing -1.062e+03  6.934e+01 -15.319   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                   edf Ref.df     F p-value    
## s(bps_per_1000) 7.814  8.633 112.5  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.625   Deviance explained = 62.5%
## GCV = 3.4198e+09  Scale est. = 3.4148e+09  n = 11583

## 
## Method: GCV   Optimizer: magic
## Smoothing parameter selection converged after 6 iterations.
## The RMS GCV score gradient at convergence was 13561.79 .
## The Hessian was positive definite.
## Model rank =  18 / 18 
## 
## Basis dimension (k) checking results. Low p-value (k-index<1) may
## indicate that k is too low, especially if edf is close to k'.
## 
##                   k'  edf k-index p-value  
## s(bps_per_1000) 9.00 7.81    0.97   0.025 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The third model tells a consistent story about how new housing supply relates to home values once we let the model choose its own smoothness and control for city‐level characteristics. As permit activity rises from very low levels, home values climb sharply, then plateau around 2–4 permits before resuming a gentler upward trend at higher permitting rates. The very wide confidence band past about 6 permits per 1,000 reflects the relative scarcity of data in that range. By fitting via REML, the curve is allowed just enough wiggle to capture these nonlinearities without chasing noise. I then compare the observed and the predicted value of home price. Most points cluster close to that line, indicating the model explains a large share of price variation. Scatter at the upper end of the price scale shows some under-estimation of very high‐value observations, but overall the points form a tight cloud along the diagonal.

## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## zhvi_index ~ s(bps_per_1000) + popE + white + black + home_ownership + 
##     housing_inventory + poverty + median_ageE + single_family_housing
## 
## Parametric coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            6.142e+05  8.708e+03  70.532   <2e-16 ***
## popE                  -4.400e-03  2.153e-03  -2.043   0.0411 *  
## white                 -3.132e+03  7.145e+01 -43.829   <2e-16 ***
## black                 -2.376e+03  7.216e+01 -32.930   <2e-16 ***
## home_ownership        -3.192e+03  1.299e+02 -24.574   <2e-16 ***
## housing_inventory     -1.153e+04  3.344e+02 -34.494   <2e-16 ***
## poverty               -8.568e+03  1.721e+02 -49.782   <2e-16 ***
## median_ageE            7.941e+03  1.766e+02  44.955   <2e-16 ***
## single_family_housing -1.062e+03  6.920e+01 -15.345   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                   edf Ref.df     F p-value    
## s(bps_per_1000) 7.303    8.3 116.6  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.625   Deviance explained = 62.5%
## -REML = 1.4352e+05  Scale est. = 3.415e+09  n = 11583

prediction <- predict(gam3)
full_data <-full_data %>% 
  na.omit()%>%
  mutate(preds = prediction)

full_data%>% 
  ggplot(aes(x=preds, y = zhvi_index))+
   geom_point(alpha = 0.3) +
  geom_abline(intercept = 0, slope = 1, linetype = "dashed") +
  labs(title = "Observed vs. Predicted Home Prices",
       x = "Predicted ZHVI", y = "Observed ZHVI") +
  theme_minimal()

Conclusion

By moving from a simple spline-only model to a fully specified Generalized Additive Model (GAM) with demographic and housing controls and REML-based smoothness selection, this analysis captures both the nonlinear effect of building permits and the strong explanatory power of city-level characteristics. The final model explains over 60% of the cross-city, monthly variation in home values and reveals that the impact of new housing supply on prices varies across levels of permitting intensity. These results suggest that the relationship between supply and price is not uniform and may depend on local demand conditions, policy environments, or market maturity. This could motivate future research to explore clusters of cities with similar permitting volumes but divergent housing outcomes, to better understand what conditions shape the price responsiveness of new construction.