# Install any of these you don't have with install.packages("pkgname")
library(sf)
library(dplyr)
library(ggplot2)
library(spdep)
library(spatialreg)
library(gtsummary)
library(gt)
library(tmap)
library(knitr)

1 1. Load and Inspect Data

data <- st_read("https://drive.google.com/uc?export=download&id=1hxz7coJASXKz-yGC1Z7yVQPsqf8mIBzE")
## Reading layer `geog391_finalproj' from data source 
##   `https://drive.google.com/uc?export=download&id=1hxz7coJASXKz-yGC1Z7yVQPsqf8mIBzE' 
##   using driver `GeoJSON'
## Simple feature collection with 10168 features and 7 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -122.7772 ymin: 25.70759 xmax: -70.93769 ymax: 47.69787
## Geodetic CRS:  NAD83
glimpse(data)
## Rows: 10,168
## Columns: 8
## $ GEOID20                      <chr> "06073000400", "06073000500", "0607300060…
## $ redlining                    <dbl> 3.000000, 2.787630, 3.000000, 3.000000, 4…
## $ env_deprivation_index        <dbl> 0.3607128, 0.3600261, 0.3600261, 0.449214…
## $ index_concentration_extremes <dbl> 0.1550, 0.3380, 0.3000, 0.1870, -0.0687, …
## $ walkability                  <dbl> 13.80, 13.90, 13.90, 15.40, 11.80, 12.90,…
## $ METRO_NAME                   <chr> "San Diego-Carlsbad, CA", "San Diego-Carl…
## $ median_home_value            <dbl> 802500, 1031800, 723300, 1003200, 606200,…
## $ geometry                     <MULTIPOLYGON [°]> MULTIPOLYGON (((-117.1709 3.…
colnames(data)
## [1] "GEOID20"                      "redlining"                   
## [3] "env_deprivation_index"        "index_concentration_extremes"
## [5] "walkability"                  "METRO_NAME"                  
## [7] "median_home_value"            "geometry"

2 2. Select and Prepare Two Cities

data |>
  st_drop_geometry() |>
  distinct(METRO_NAME) |>
  filter(grepl("Chicago|Denver", METRO_NAME, ignore.case = TRUE))
chicago <- data |> filter(METRO_NAME == "Chicago-Naperville-Elgin, IL-I")
denver  <- data |> filter(METRO_NAME == "Denver-Aurora-Lakewood, CO")

nrow(chicago)
## [1] 993
nrow(denver)
## [1] 103

3 3. Describe and Visualize Social Segregation (ICE)

3.1 3.1 Descriptive Statistics Tables

chicago |>
  st_drop_geometry() |>
  summarise(
    Mean = mean(index_concentration_extremes, na.rm = TRUE),
    Median = median(index_concentration_extremes, na.rm = TRUE),
    SD = sd(index_concentration_extremes, na.rm = TRUE),
    Min = min(index_concentration_extremes, na.rm = TRUE),
    Max = max(index_concentration_extremes, na.rm = TRUE)
  ) |>
  gt() |>
  tab_header(title = "Descriptive Statistics: ICE in Chicago")
Descriptive Statistics: ICE in Chicago
Mean Median SD Min Max
0.0327382 -0.00282 0.3164939 -0.778 0.811
denver |>
  st_drop_geometry() |>
  summarise(
    Mean = mean(index_concentration_extremes, na.rm = TRUE),
    Median = median(index_concentration_extremes, na.rm = TRUE),
    SD = sd(index_concentration_extremes, na.rm = TRUE),
    Min = min(index_concentration_extremes, na.rm = TRUE),
    Max = max(index_concentration_extremes, na.rm = TRUE)
  ) |>
  gt() |>
  tab_header(title = "Descriptive Statistics: ICE in Denver")
Descriptive Statistics: ICE in Denver
Mean Median SD Min Max
0.3184392 0.328 0.1998287 -0.274 0.771

Interpretation: Chicago’s ICE distribution is nearly centered on zero (mean = 0.033, median = -0.003) but has a wide spread (SD = 0.316) and reaches both extremes of the index (min = -0.778, max = 0.811). This means Chicago has substantial numbers of both intensely low-ICE tracts (concentrated low-income communities of color) and intensely high-ICE tracts (concentrated high-income white communities), with the city split fairly evenly between the two. Denver’s distribution tells a different story: its mean (0.318) and median (0.328) sit well above zero, and its spread is considerably tighter (SD = 0.200, range -0.274 to 0.771) — Denver, on average, leans toward the affluent/white end of the index and has almost none of the deeply negative-ICE tracts found in Chicago. In short, Chicago is more polarized between two extremes of concentration, while Denver is more uniformly concentrated toward one end.

3.2 3.2 Maps of ICE

tm_shape(chicago) +
  tm_fill("index_concentration_extremes", palette = "RdBu", style = "cont", title = "ICE") +
  tm_borders(alpha = 0.3) +
  tm_layout(title = "Index of Concentration at the Extremes: Chicago",
            legend.outside = TRUE)

tm_shape(denver) +
  tm_fill("index_concentration_extremes", palette = "RdBu", style = "cont", title = "ICE") +
  tm_borders(alpha = 0.3) +
  tm_layout(title = "Index of Concentration at the Extremes: Denver",
            legend.outside = TRUE)

Interpretation: Chicago’s map shows a clear geographic split: high-ICE tracts (blue, affluent/white) form a long, contiguous band running along the North Side lakefront — communities like Lincoln Park, Lakeview, and Edgewater while low-ICE tracts (red/orange, low-income communities of color) dominate the central, west, and south sides of the city. This lakefront-versus-inland divide closely mirrors Chicago’s historical “Black Belt” geography and the legacy of HOLC-era redlining, which concentrated the lowest grades in the same South and West Side areas that still show the lowest ICE values today (Chicago History Museum, 2024; Chicago Reporter, 2023). Denver’s map shows a milder version of a similar west/central concentration of higher ICE, but the pattern is visually smoother, with fewer sharply bounded extremes and a couple of isolated lower-ICE patches on the city’s outer edges rather than one large contiguous low-ICE zone. This is consistent with Denver’s documented pattern of gentrification reshaping formerly redlined areas near downtown — such as Five Points — into some of the city’s higher-value neighborhoods rather than leaving a single, stable dividing line in place (Planetizen, 2018).

4 4. Global and Local Spatial Structure

4.1 4.1 Chicago: Moran’s I and LISA

chicago_clean <- chicago |> filter(!is.na(index_concentration_extremes))
nb_chi <- poly2nb(chicago_clean, queen = TRUE)
lw_chi <- nb2listw(nb_chi, style = "W", zero.policy = TRUE)
moran_chi <- moran.test(chicago_clean$index_concentration_extremes, lw_chi, zero.policy = TRUE)
moran_chi
## 
##  Moran I test under randomisation
## 
## data:  chicago_clean$index_concentration_extremes  
## weights: lw_chi  
## n reduced by no-neighbour observations  
## 
## Moran I statistic standard deviate = 40.777, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      0.8066942588     -0.0010152284      0.0003923523
lisa_chi <- localmoran(chicago_clean$index_concentration_extremes, lw_chi, zero.policy = TRUE)

chicago_clean <- chicago_clean |>
  mutate(
    lisa_I = lisa_chi[, "Ii"],
    lisa_p = lisa_chi[, "Pr(z != E(Ii))"],
    ice_scaled = scale(index_concentration_extremes)[, 1],
    ice_lag = lag.listw(lw_chi, index_concentration_extremes, zero.policy = TRUE),
    ice_lag_scaled = scale(ice_lag)[, 1],
    quadrant = case_when(
      lisa_p >= 0.05 ~ "Not Significant",
      ice_scaled > 0 & ice_lag_scaled > 0 ~ "High-High",
      ice_scaled < 0 & ice_lag_scaled < 0 ~ "Low-Low",
      ice_scaled > 0 & ice_lag_scaled < 0 ~ "High-Low",
      ice_scaled < 0 & ice_lag_scaled > 0 ~ "Low-High",
      TRUE ~ "Not Significant"
    )
  )

tm_shape(chicago_clean) +
  tm_fill("quadrant",
          palette = c("High-High" = "red", "Low-Low" = "blue",
                      "High-Low" = "pink", "Low-High" = "lightblue",
                      "Not Significant" = "grey90"),
          title = "LISA Cluster") +
  tm_borders(alpha = 0.3) +
  tm_layout(title = "LISA Clusters: ICE in Chicago", legend.outside = TRUE)

4.2 4.2 Denver: Moran’s I and LISA

denver_clean <- denver |> filter(!is.na(index_concentration_extremes))
nb_den <- poly2nb(denver_clean, queen = TRUE)
lw_den <- nb2listw(nb_den, style = "W", zero.policy = TRUE)
moran_den <- moran.test(denver_clean$index_concentration_extremes, lw_den, zero.policy = TRUE)
moran_den
## 
##  Moran I test under randomisation
## 
## data:  denver_clean$index_concentration_extremes  
## weights: lw_den    
## 
## Moran I statistic standard deviate = 7.2258, p-value = 2.491e-13
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       0.426892904      -0.009803922       0.003652469
lisa_den <- localmoran(denver_clean$index_concentration_extremes, lw_den, zero.policy = TRUE)

denver_clean <- denver_clean |>
  mutate(
    lisa_I = lisa_den[, "Ii"],
    lisa_p = lisa_den[, "Pr(z != E(Ii))"],
    ice_scaled = scale(index_concentration_extremes)[, 1],
    ice_lag = lag.listw(lw_den, index_concentration_extremes, zero.policy = TRUE),
    ice_lag_scaled = scale(ice_lag)[, 1],
    quadrant = case_when(
      lisa_p >= 0.05 ~ "Not Significant",
      ice_scaled > 0 & ice_lag_scaled > 0 ~ "High-High",
      ice_scaled < 0 & ice_lag_scaled < 0 ~ "Low-Low",
      ice_scaled > 0 & ice_lag_scaled < 0 ~ "High-Low",
      ice_scaled < 0 & ice_lag_scaled > 0 ~ "Low-High",
      TRUE ~ "Not Significant"
    )
  )

tm_shape(denver_clean) +
  tm_fill("quadrant",
          palette = c("High-High" = "red", "Low-Low" = "blue",
                      "High-Low" = "pink", "Low-High" = "lightblue",
                      "Not Significant" = "grey90"),
          title = "LISA Cluster") +
  tm_borders(alpha = 0.3) +
  tm_layout(title = "LISA Clusters: ICE in Denver", legend.outside = TRUE)

*Interpretation: Chicago’s ICE ranges from -0.778 to 0.811 with a mean near zero (0.033) and a standard deviation of 0.316 — a wide, evenly-spread distribution indicating the city has both intensely segregated majority-POC/low-income tracts and intensely segregated majority-white/affluent tracts, with relatively few tracts near the middle. Denver’s ICE is both higher on average (mean 0.318) and far less dispersed (SD 0.200, range -0.274 to 0.771) — Denver as a whole leans toward the affluent/white end of the index and has almost no tracts approaching Chicago’s most extreme low end. This alone suggests Chicago’s segregation is more polarized between two extremes, while Denver’s is better described as a milder, one-sided concentration of advantage.

The maps confirm this: Chicago shows a large, contiguous high-ICE band running along the North Side lakefront, a substantial contiguous low-ICE zone across the central and near-west/south areas, and a smaller high-ICE pocket further south — a pattern that maps closely onto the city’s well-documented lakefront/inland divide and its historical Black Belt geography (Chicago Reporter, 2023; Chicago History Museum, 2024). Denver’s map shows a comparable west/central concentration of higher ICE, but the pattern is visually smoother and less starkly bounded, consistent with a city where gentrification has been actively reshaping formerly disinvested areas near downtown (Planetizen, 2018) rather than leaving a single hardened divide in place.

Global Moran’s I confirms this difference numerically and dramatically: Chicago’s ICE shows extremely strong positive spatial autocorrelation (I = 0.807, p < 2.2e-16), while Denver’s is significant but roughly half as strong (I = 0.427, p = 2.49e-13). In substantive terms, both cities have segregation that is spatially clustered rather than randomly distributed across tracts — but Chicago’s clustering is close to the practical ceiling for this kind of index, indicating segregation operates at the scale of large, contiguous multi-tract regions, while Denver’s, though still highly significant, is more localized and patchier.

The LISA maps make this concrete. Chicago’s High-High cluster (red) is a long, unbroken band running the length of the North Side lakefront, and its Low-Low cluster (blue) forms one large connected zone through the central and near-south side — very few tracts fall outside a significant cluster. Denver’s High-High and Low-Low clusters are considerably smaller and more scattered, with a large share of the city (grey, “Not Significant”) showing no detectable local clustering at all. This reinforces the same conclusion as the global statistic: Chicago’s segregation is geographically “hardened” into a small number of large zones, while Denver’s is present but more fragmented and localized — a difference that becomes central to the discussion of spatial nonstationarity in Section 7.*

5 5. Hypotheses on Spatial Processes

Primary city: Chicago.

Chicago is a useful primary case because it was not just a site where redlining happened, but one of the places where the practice was invented — local realtors, appraisers, and university researchers helped originate the risk-rating methods that HOLC later used nationally (Digital Scholarship Lab, n.d.-a). Because those grading practices were built around and reinforced segregation that already existed in the city (Digital Scholarship Lab, n.d.-a), and because postwar disinvestment in downgraded areas compounded for decades afterward (Chicago History Museum, 2024; Chicago Reporter, 2023), I expect both the redlining–ICE and home value–ICE relationships to be comparatively strong in Chicago. Federal Reserve Bank of Chicago (n.d.) research estimates that redlining accounts for roughly 40–50% of the house-value gap between graded neighborhoods from 1950–1980, and finds that segregation in the lowest-graded areas continued rising until fair-housing-era legislation took effect. As a legacy industrial metro without the rapid, broad-based growth seen in Sunbelt cities, Chicago has had less market pressure to disrupt these long-settled patterns, so I expect the historical redlining signal to still show up clearly in present-day ICE, alongside a strong home-value relationship reflecting persistent, geographically concentrated disinvestment.

By contrast, in Denver, formerly redlined neighborhoods close to downtown (e.g., Five Points) have gentrified enough that several now have higher home values than the city average (Planetizen, 2018), even though racial disparities in mortgage lending persist — Denver Black applicants were more than twice as likely as white applicants to be denied a conventional mortgage as of 2015 (Collective Colorado, 2023). Because rapid growth and gentrification have partly decoupled historic HOLC grade from present-day home value in specific tracts, I expect the redlining–ICE relationship to be comparatively weaker or noisier in Denver relative to Chicago, while the home value–ICE relationship may still be strong but driven more by contemporary displacement pressure than by legacy disinvestment alone.

Third process (primary city): Environmental deprivation.

  • Expected direction: ambiguous/weak, and this is itself the interesting prediction. Unlike a Sunbelt metro built out mostly after 1960 in a car-dependent pattern, Chicago has high walkability in two very different kinds of neighborhoods at once: the wealthy, majority-white North Side lakefront communities that have benefited from “back-to-the-city” reinvestment, and the dense, pre-war grid-pattern South and West Side neighborhoods that were historically redlined and remain majority-Black and lower-income. Because dense urban form in Chicago cuts across both ends of the ICE spectrum rather than tracking cleanly with one end, I expect walkability to show a comparatively weak relationship with ICE once redlining and home value are already in the model.
  • Expected strength: weak.
  • Why it matters here: if walkability turns out to have little independent explanatory power in Chicago, that itself supports the idea that Chicago’s segregation is driven overwhelmingly by the historical redlining/disinvestment channel rather than by present-day urban form amenities. A contrast worth testing against Denver, where a fast-growing, more car-oriented development pattern might make walkability track more cleanly with wealth and, by extension, with ICE.

6 6. Model Spatial Processes

6.1 6.1 Standardize Predictors

standardized_chicago <- chicago_clean |>
  mutate(
    redlining_z = scale(redlining)[, 1],
    home_value_z = scale(median_home_value)[, 1],
    var3_z = scale(env_deprivation_index)[, 1]   # or scale(walkability)[, 1]
  )

standardized_denver <- denver_clean |>
  mutate(
    redlining_z = scale(redlining)[, 1],
    home_value_z = scale(median_home_value)[, 1],
    var3_z = scale(env_deprivation_index)[, 1]   # or scale(walkability)[, 1]
  )

6.2 6.2 Primary City OLS Model (Chicago)

ols_chicago <- lm(index_concentration_extremes ~ redlining_z + home_value_z + var3_z, data = standardized_chicago)
summary(ols_chicago)
## 
## Call:
## lm(formula = index_concentration_extremes ~ redlining_z + home_value_z + 
##     var3_z, data = standardized_chicago)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.90667 -0.13629  0.00879  0.14169  0.63513 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   0.032738   0.006636   4.933 9.48e-07 ***
## redlining_z  -0.053765   0.006813  -7.891 7.89e-15 ***
## home_value_z  0.223688   0.006694  33.415  < 2e-16 ***
## var3_z       -0.015916   0.006759  -2.355   0.0187 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2091 on 989 degrees of freedom
## Multiple R-squared:  0.5647, Adjusted R-squared:  0.5634 
## F-statistic: 427.7 on 3 and 989 DF,  p-value: < 2.2e-16

Interpretation: In Chicago, all three predictors are statistically significant, but they differ enormously in size. Home value has by far the largest coefficient (0.224), meaning a one-standard-deviation increase in a tract’s median home value is associated with a 0.224-point increase in ICE by nearly 15 times the size of the walkability coefficient. Redlining is the second-strongest predictor (-0.054): more severely redlined tracts (closer to a D grade) have lower ICE, consistent with the expected direction. Walkability has a small but significant negative coefficient (-0.016), meaning slightly more walkable tracts are, on average, slightly more associated with lower ICE. The opposite of a “walkability = affluence” story, and consistent with my hypothesis that dense, walkable urban form in Chicago cuts across both the wealthy North Side and the historically disinvested South/West Sides rather than tracking cleanly with one end of the segregation spectrum. The model explains a substantial share of variation in ICE (R² = 0.565). Overall, this partially confirms my hypothesis: home value and redlining are both strong and significant as predicted, but home value — not redlining — turns out to be the dominant predictor, and walkability’s weak, negative effect matches the “cuts both ways” reasoning from Section 5 rather than showing no relationship at all.

6.3 6.3 Chicago Residual Spatial Autocorrelation

standardized_chicago$resid_ols <- residuals(ols_chicago)
nb_chi2 <- poly2nb(standardized_chicago, queen = TRUE)
lw_chi2 <- nb2listw(nb_chi2, style = "W", zero.policy = TRUE)
moran.test(standardized_chicago$resid_ols, lw_chi2, zero.policy = TRUE)
## 
##  Moran I test under randomisation
## 
## data:  standardized_chicago$resid_ols  
## weights: lw_chi2  
## n reduced by no-neighbour observations  
## 
## Moran I statistic standard deviate = 26.37, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      0.5210487093     -0.0010152284      0.0003919468
# Only needed if the residual Moran's I above is significant.
sem_chicago <- errorsarlm(
  index_concentration_extremes ~ redlining_z + home_value_z + var3_z,
  data = standardized_chicago,
  listw = lw_chi2,
  zero.policy = TRUE
)
summary(sem_chicago)
## 
## Call:errorsarlm(formula = index_concentration_extremes ~ redlining_z + 
##     home_value_z + var3_z, data = standardized_chicago, listw = lw_chi2, 
##     zero.policy = TRUE)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.5519193 -0.0925687 -0.0037431  0.0674095  0.6428268 
## 
## Type: error 
## Regions with no neighbours included:
##  542 732 787 877 883 907 934 
## Coefficients: (asymptotic standard errors) 
##                Estimate Std. Error z value  Pr(>|z|)
## (Intercept)   0.0999349  0.0240242  4.1597 3.186e-05
## redlining_z  -0.0304092  0.0073203 -4.1541 3.266e-05
## home_value_z  0.0963848  0.0095203 10.1241 < 2.2e-16
## var3_z       -0.0020746  0.0076819 -0.2701    0.7871
## 
## Lambda: 0.83907, LR test value: 634, p-value: < 2.22e-16
## Asymptotic standard error: 0.017285
##     z-value: 48.544, p-value: < 2.22e-16
## Wald statistic: 2356.5, p-value: < 2.22e-16
## 
## Log likelihood: 463.8908 for error model
## ML residual variance (sigma squared): 0.018732, (sigma: 0.13686)
## Number of observations: 993 
## Number of parameters estimated: 6 
## AIC: -915.78, (AIC for lm: -283.78)

*Interpretation: A Moran’s I test on the OLS residuals confirms substantial unmodeled spatial structure remains: I = 0.521 (p < 2.2e-16) smaller than the raw ICE autocorrelation from Section 4 (0.807), meaning the three predictors do absorb some of Chicago’s spatial structure, but a large amount is still left over in what the model can’t explain. The subsequent spatial error model’s Lambda (0.839) is extremely large and highly significant (LR test p < 2.22e-16), consistent with this segregation in one tract’s unexplained “leftover” ICE is strongly predicted by its neighbors’ leftover ICE, exactly what the near-ceiling global Moran’s I and the still-substantial residual Moran’s I would suggest.

Accounting for this changes the story meaningfully. The home value coefficient shrinks by more than half, from 0.224 in the OLS model to 0.096 in the SEM meaning a large share of what looked like a strong home-value effect in the naive OLS model was actually just reflecting the fact that home values and ICE are both organized into the same large contiguous spatial zones (the North Side vs. the central/south side), not a purely local, tract-by-tract relationship. Redlining also shrinks (-0.054 to -0.030) but remains statistically significant, suggesting its effect is partly — but not entirely — a story about broad regional zones rather than fine-grained tract effects. Walkability, which was weakly significant in OLS, becomes fully non-significant in the SEM (p = 0.787), indicating its apparent OLS effect was essentially spatial noise rather than a real local relationship.

The practical conclusion for Chicago: once spatial structure is properly accounted for, home value remains the strongest predictor of segregation, but its true independent effect is much smaller than OLS implied, and walkability drops out entirely as a meaningful predictor.*

6.4 6.4 Second City OLS Model (Denver)

ols_denver <- lm(index_concentration_extremes ~ redlining_z + home_value_z + var3_z, data = standardized_denver)
summary(ols_denver)
## 
## Call:
## lm(formula = index_concentration_extremes ~ redlining_z + home_value_z + 
##     var3_z, data = standardized_denver)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.33892 -0.07604  0.01329  0.08488  0.26815 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   0.31844    0.01343  23.717  < 2e-16 ***
## redlining_z  -0.05630    0.01921  -2.930  0.00421 ** 
## home_value_z  0.11428    0.01632   7.001 3.08e-10 ***
## var3_z        0.01540    0.01644   0.936  0.35134    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1363 on 99 degrees of freedom
## Multiple R-squared:  0.5487, Adjusted R-squared:  0.535 
## F-statistic: 40.12 on 3 and 99 DF,  p-value: < 2.2e-16
standardized_denver$resid_ols <- residuals(ols_denver)
nb_den2 <- poly2nb(standardized_denver, queen = TRUE)
lw_den2 <- nb2listw(nb_den2, style = "W", zero.policy = TRUE)
moran.test(standardized_denver$resid_ols, lw_den2, zero.policy = TRUE)
## 
##  Moran I test under randomisation
## 
## data:  standardized_denver$resid_ols  
## weights: lw_den2    
## 
## Moran I statistic standard deviate = 2.8006, p-value = 0.00255
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       0.159707324      -0.009803922       0.003663479
# Only needed if the residual Moran's I above is significant.
sem_denver <- errorsarlm(
  index_concentration_extremes ~ redlining_z + home_value_z + var3_z,
  data = standardized_denver,
  listw = lw_den2,
  zero.policy = TRUE
)
summary(sem_denver)
## 
## Call:errorsarlm(formula = index_concentration_extremes ~ redlining_z + 
##     home_value_z + var3_z, data = standardized_denver, listw = lw_den2, 
##     zero.policy = TRUE)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.3086663 -0.0634185  0.0099658  0.0855281  0.2624182 
## 
## Type: error 
## Coefficients: (asymptotic standard errors) 
##                Estimate Std. Error z value  Pr(>|z|)
## (Intercept)   0.3181926  0.0208757 15.2422 < 2.2e-16
## redlining_z  -0.0472313  0.0207161 -2.2799   0.02261
## home_value_z  0.1071216  0.0159681  6.7085 1.967e-11
## var3_z        0.0027593  0.0195466  0.1412   0.88774
## 
## Lambda: 0.40072, LR test value: 7.0465, p-value: 0.0079421
## Asymptotic standard error: 0.1228
##     z-value: 3.2633, p-value: 0.0011014
## Wald statistic: 10.649, p-value: 0.0011014
## 
## Log likelihood: 64.70715 for error model
## ML residual variance (sigma squared): 0.016109, (sigma: 0.12692)
## Number of observations: 103 
## Number of parameters estimated: 6 
## AIC: -117.41, (AIC for lm: -112.37)

*Interpretation: Denver’s OLS model also finds all three predictors in the expected direction, though the pattern of significance differs from Chicago. Redlining (-0.056) and home value (0.114) are both significant, while walkability (0.015) is not (p = 0.351) — matching the Chicago finding that walkability adds little once redlining and home value are already in the model, though for a different substantive reason: Denver’s rapid, largely post-industrial growth means walkable neighborhoods aren’t concentrated in one particular part of the segregation spectrum the way Chicago’s historically dense grid is. The model explains a similar share of variance to Chicago’s (R² = 0.549).

Denver’s residual spatial autocorrelation is weaker than Chicago’s but still present: a Moran’s I test on the OLS residuals is small but statistically significant (I = 0.160, p = 0.0026) — far smaller than the raw ICE autocorrelation from Section 4 (0.427), meaning the three predictors already absorb most of Denver’s spatial structure, but not quite all of it. The subsequent SEM’s Lambda (0.401) is significant (LR test p = 0.0079), confirming that a small but real amount of spatial dependence remains. After correcting for it, home value barely moves (0.114 to 0.107), redlining weakens somewhat (-0.056 to -0.047) but stays significant, and walkability remains non-significant. The key contrast with Chicago: in Denver, home value’s relationship with ICE holds up almost unchanged once spatial structure is accounted for, while in Chicago it was cut by more than half. This suggests Denver’s home-value/segregation relationship is a more genuinely local, tract-level dynamic, while Chicago’s is substantially a story about broad contiguous regions.*

6.5 6.5 Side-by-Side Model Comparison Table

library(broom)

chi_tidy <- tidy(ols_chicago) |> mutate(city = "Chicago", model = "OLS")
den_tidy <- tidy(ols_denver) |> mutate(city = "Denver", model = "OLS")

# If you ran SEMs above, add them too:
# chi_sem_tidy <- tidy(sem_chicago) |> mutate(city = "Chicago", model = "SEM")
# den_sem_tidy <- tidy(sem_denver) |> mutate(city = "Denver", model = "SEM")

comparison <- bind_rows(chi_tidy, den_tidy) |>
  select(city, model, term, estimate, std.error, p.value)

comparison |>
  gt() |>
  tab_header(title = "OLS Coefficient Comparison: Chicago vs. Denver") |>
  fmt_number(columns = c(estimate, std.error, p.value), decimals = 3)
OLS Coefficient Comparison: Chicago vs. Denver
city model term estimate std.error p.value
Chicago OLS (Intercept) 0.033 0.007 0.000
Chicago OLS redlining_z −0.054 0.007 0.000
Chicago OLS home_value_z 0.224 0.007 0.000
Chicago OLS var3_z −0.016 0.007 0.019
Denver OLS (Intercept) 0.318 0.013 0.000
Denver OLS redlining_z −0.056 0.019 0.004
Denver OLS home_value_z 0.114 0.016 0.000
Denver OLS var3_z 0.015 0.016 0.351

7 7. Cross-City Comparison and Spatial Nonstationarity

Comparing Chicago and Denver reveals both similarities and differences that speak directly to spatial nonstationarity — the idea that the same underlying processes can operate with different strength, and even different character, depending on where they unfold.

What’s similar across both cities: redlining and home value are both statistically significant, correctly-signed predictors of present-day ICE in Chicago and Denver alike, and walkability is a weak-to-negligible predictor in both. Global Moran’s I is significant in both cities, and residual spatial autocorrelation is present in both OLS models, requiring a spatial error model in each case. In that sense, this comparison confirms the premise laid out in the assignment: redlining and housing markets are consistently related to segregation across different urban contexts, even where their strength differs.

Where the cities diverge, and why:

Strength and character of spatial clustering. Chicago’s global Moran’s I (0.807) is nearly double Denver’s (0.427), and the LISA maps show Chicago’s clusters as large, contiguous regions while Denver’s are smaller and more scattered. This matches the background research: Chicago is one of the cities where redlining practices were literally developed, and decades of subsequent disinvestment in downgraded areas hardened a segregation pattern that has changed relatively little (Chicago Reporter, 2023; Federal Reserve Bank of Chicago, n.d.). Denver, by contrast, has seen substantial gentrification in formerly redlined neighborhoods like Five Points, where home values in some tracts now exceed the citywide average despite the area’s redlined history (Planetizen, 2018). This gentrification actively disrupts the tight spatial correspondence between historical grade and present-day outcome that persists more cleanly in Chicago, which is consistent with Denver’s weaker, patchier spatial clustering.

How much of the home-value relationship is really “local.” This is the most striking difference in the regression results. In Chicago, correcting for spatial autocorrelation cut the home-value coefficient by more than half (0.224 to 0.096) — meaning much of the apparent relationship was really a story about broad regional zones (the North Side vs. the center/south side) rather than a tract-by-tract dynamic. In Denver, the home-value coefficient barely moved (0.114 to 0.107) after the same correction. Substantively, this suggests that in Chicago, home value’s association with segregation is largely inherited from the same large-scale historical geography that produced the redlining pattern in the first place, while in Denver, home value operates more as a genuinely local, tract-level sorting mechanism — plausibly reflecting Denver’s more piecemeal, block-by-block gentrification process rather than a single citywide divide.

Redlining’s relative strength. My hypothesis in Section 5 predicted a comparatively stronger redlining-ICE relationship in Chicago than in Denver, based on Chicago’s status as the origin point of HOLC-style grading and its longer, more uninterrupted disinvestment trajectory. The results only partly support this: in the raw OLS models the two cities’ redlining coefficients are nearly identical (Chicago -0.054, Denver -0.056), and after correcting for spatial autocorrelation, Denver’s redlining effect (-0.047) is actually slightly larger than Chicago’s (-0.030). This is a meaningful revision to my hypothesis — it suggests that even in a rapidly gentrifying city like Denver, the historical redlining signal has not been fully erased by contemporary housing-market change, and may in fact be more “locally” detectable there once the broader spatial structure is accounted for, rather than being diluted the way I initially expected.

Why walkability underperforms in both cities. Walkability was a weak, largely non-significant predictor in both cities, but for related reasons. In Chicago, dense walkable urban form exists in both the wealthiest lakefront communities and the historically disinvested South and West Side neighborhoods, so it doesn’t track cleanly with one end of the ICE spectrum — exactly the “cuts both ways” pattern hypothesized in Section 5. Denver’s rapid growth has produced a less spatially concentrated pattern of walkable development, so walkability doesn’t map onto segregation there either, though for a more structural reason (newer, more dispersed urban form) rather than Chicago’s specific double-sided history.

Spatial nonstationarity, summarized: the same two “known” processes — redlining and housing markets — are present and significant in both cities, exactly as the literature would predict, but the mechanism through which they operate differs. In Chicago, segregation is best understood as a large-scale, historically hardened regional divide where local nuance from home value gets substantially absorbed by that broader spatial structure. In Denver, segregation is more genuinely local and patchwork, consistent with a city undergoing active, uneven gentrification rather than one where a single historical dividing line still dominates. This is a clear demonstration that the same spatial processes can produce meaningfully different outcomes depending on a city’s growth trajectory and history — the core idea of spatial nonstationarity that this assignment set out to test.

8 References

Chicago History Museum. (2024, June 19). A brief history of redlining. https://www.chicagohistory.org/redlining/

Chicago Reporter. (2023, August 30). Chicago’s 250 year history of segregation. https://www.chicagoreporter.com/chicagos-250-year-history-of-segregation/

Collective Colorado. (2023, April 5). The thread that ties segregation to gentrification. https://collective.coloradotrust.org/stories/the-thread-that-ties-segregation-to-gentrification/

Digital Scholarship Lab. (n.d.-a). Chicago, IL: Mapping inequality. University of Richmond. https://dsl.richmond.edu/panorama/redlining/map/IL/Chicago/context

Digital Scholarship Lab. (n.d.-b). Denver, CO: Mapping inequality. University of Richmond. https://dsl.richmond.edu/panorama/redlining/map/CO/Denver/context

Federal Reserve Bank of Chicago. (n.d.). New data on thousands of U.S. neighborhoods shows direct impact of redlining from 1930 to today. https://www.chicagofed.org/research/content-areas/mobility/policy-brief-redlining

Planetizen. (2018, May 11). Formerly redlined Denver neighborhoods are now gentrification hotspots. https://www.planetizen.com/news/2018/05/98619-formerly-redlined-denver-neighborhoods-are-now-gentrification-hotspots