4 Results

this_map = c(
    "yj_distance" = "log(Distance)",
    "yj_acres" = "log(Acres)",
    "playgroundTRUE" = "Playground",
    "trailTRUE" = "Trail",
    "pitchTRUE" = "Sport Field",
    "basketballTRUE" = "Basketball",
    "baseballTRUE" = "Baseball",
    "`football / soccer`TRUE" = "Football / Soccer",
    "tennisTRUE" = "Tennis",
    "volleyballTRUE" = "Volleyball",
    "other_pitchTRUE" = "Other Sport"
  )
f <- function(x) format(round(x, 1), big.mark=",")
gm <-  list(
  list("raw" = "nobs",  "clean" = "Num.Obs.", "fmt" = f),
  list("raw" = "AIC",   "clean" = "AIC",      "fmt" = f),
  list("raw" = "logLik","clean" = "Log Likelihood", "fmt" = f),
  list("raw" = "rho20", "clean" = "$\\rho^2_0$", "fmt" = 3)
)
this_crs <- 2227 # EPSG:2227 – NAD83 / California zone 3 (ftUS)

We estimated multinomial logit park activity location choice models on the datset described in the previous section. We applied a Yeo-Johnson transformation (Yeo and Johnson 2000) to both the walk distance (in meters) between the park and the block group centroid, and to the park acreage. The Yeo-Johnson transformation replicates the constant marginal elasticity of a logarithmic transformation while avoiding undefined values (e.g., \(YJ(0) = 0\)). For simplicity, we call this transformation \(\log()\) in the model results tables. Using a constant marginal elasticity is better reflective of how people perceive distances and sizes; a one-mile increase to a trip distance matters more to a two-mile trip than a ten-mile trip.

tar_load(base_models)

detail_lrt <- lrtest(base_models[[2]], base_models[[3]])$`Pr(>Chisq)`[2]
d_ratio_base <- -1 * coefficients(base_models$`Network Distance`)[1] / 
  coefficients(base_models$`Network Distance`)[2] 
d_ratio_sport <- -1 * coefficients(base_models$`Sport Detail`)[1] / 
  coefficients(base_models$`Sport Detail`)[2] 

Table 4.1 presents the model estimation results for each estimated model. The “Network Distance” model, which only considers the distance to the park and the size of the park. results in significant estimated coefficients of the expected sign. That is, individuals will travel further distances to reach larger parks. The ratio of the estimated coefficients implies that on average, people will travel twice as far to reach a park 3.47 times as large.

Table 4.1 also shows the results of the “Park Attributes” model, which represents the presence of any sport field with a single dummy variable, and the “Sport Detail” model, which disaggregates this variable into facilities for different sports. The value of the size and distance coefficients change modestly from the “Network Distance” model, with the implied size to distance trade-off rising to 4.12. Examining the two amenities models — independently and in comparison with each other — reveals a few surprising findings. First, it appears that playgrounds and sport fields in general contribute negatively to the choice utility equation. This is both unintuitive and contradictory to previous findings in this space (e.g., Kinnell et al. 2006). Considering different sports separately, there is a wide variety of observed response with tennis and volleyball facilities attracting more trips, and football and basketball facilities attracting fewer, all else equal. Trails and walking paths give substantive positive utility in both models. The difference in likelihood statistics between the three models is significant (likelihood ratio test between Sport Detail and Park Attributes model has \(p\)-value 8.16e-07), and so in spite of the curious aggregate findings, we move forward with this utility specification.

modelsummary(
  base_models, stars = TRUE, output = "kableExtra",
  coef_map = this_map, gof_map = gm,
  estimate = "{estimate} {stars}", 
  statistic = "({std.error})",
  title = "Estimated Model Coefficients",
  note = "Standard errors in parentheses."
) %>%
  scroll_box(width = "100%", box_css = "border: 0px;") 
## Warning: In version 0.8.0 of the `modelsummary` package, the default significance markers produced by the `stars=TRUE` argument were changed to be consistent with R's defaults.
## This warning is displayed once per session.
Table 4.1: Estimated Model Coefficients
Network Distance Park Attributes Sport Detail
log(Distance) −1.358 *** −1.397 *** −1.389 ***
(0.010) (0.010) (0.010)
log(Acres) 0.391 *** 0.339 *** 0.337 ***
(0.005) (0.005) (0.005)
Playground −0.445 *** −0.554 ***
(0.022) (0.022)
Trail 0.551 *** 0.568 ***
(0.024) (0.024)
Sport Field −0.380 ***
(0.023)
Basketball −0.294 ***
(0.030)
Baseball 0.130 ***
(0.030)
Football / Soccer −0.465 ***
(0.042)
Tennis 0.207 ***
(0.030)
Volleyball 0.127 *
(0.061)
Other Sport −0.249 ***
(0.039)
Num.Obs. 20,000 20,000 20,000
AIC 58,736.3 57,069.6 57,043.2
Log Likelihood −29,366.1 −28,529.8 −28,511.6
\(\rho^2_0\) 0.388 0.405 0.405
Standard errors in parentheses.

It is worth investigating the heterogeneity in preferences that exist among populations. Though the income and ethnicity of the synthetic park visitors is not known, we can segment the estimation dataset based on the socioeconomic makeup of the visitors’ residence block group. The models presented in Table 4.2 were estimated on segments developed in this manner. Models under the “Race/Ethnicity” heading include a race- and ethnicity-based segmentation: simulated individuals living in block groups with more than thirty percent Black residents are included in the “>30% Black” model, an analogous segmentation for block groups with high Asian and Hispanic populations are in the “>30% Asian” and “>30% Hispanic” models respectively, and the “Other” model contains all other block groups. Another set of model segmentation relies on the share of the population in each block group with household incomes above or below certain thresholds, and a third relies on the share of households with children under 6 years old. Again, we use the threshold definitions largely informed by the distributions in Table 3.2.

tar_load(grouped_models)
grouped_models_clean <- list(
  "> 30% Asian" = grouped_models$asian,
  "> 30% Black" = grouped_models$black,
  "> 30% Hispanic" = grouped_models$hispanic,
  "Other Eth." = grouped_models$othermin,
  "> 30% Low income" = grouped_models$lowincome,
  "> 50% High income" = grouped_models$highincome,
  "Other Inc." = grouped_models$otherinc,
  "> 25% Children" = grouped_models$children,
  "< 5% Children" = grouped_models$`few children`,
  "Other Children" = grouped_models$otherch
)

modelsummary(
  grouped_models_clean, stars = TRUE, output = "kableExtra",
  coef_map = this_map, gof_map = gm,
  estimate = "{estimate} {stars}", 
  statistic = "({std.error})",
  title = "Estimated Model Coefficients with Block Group Segmentations",
  note = "Standard errors in parentheses."
) %>%
  add_footnote("Simulated individuals segmented based on the share of households meeting the segmentation threshold in the residence block group.") %>%
  add_header_above(c(" " = 1, "Race/Ethnicity" = 4, "Income" = 3, "Children" = 3)) %>%
  scroll_box(width = "100%", box_css = "border: 0px;") %>%
  landscape() %>%
  kable_styling(latex_options = c("striped", "scale_down")) 
Table 4.2: Estimated Model Coefficients with Block Group Segmentations
Race/Ethnicity
Income
Children
> 30% Asian > 30% Black > 30% Hispanic Other Eth. > 30% Low income > 50% High income Other Inc.  > 25% Children < 5% Children Other Children
log(Distance) −1.277 *** −1.515 *** −1.267 *** −1.493 *** −1.419 *** −1.392 *** −1.360 *** −1.270 *** −1.562 *** −1.387 ***
(0.017) (0.030) (0.022) (0.019) (0.026) (0.020) (0.013) (0.029) (0.037) (0.011)
log(Acres) 0.371 *** 0.264 *** 0.325 *** 0.343 *** 0.312 *** 0.364 *** 0.331 *** 0.341 *** 0.369 *** 0.335 ***
(0.009) (0.015) (0.011) (0.010) (0.014) (0.010) (0.007) (0.014) (0.020) (0.006)
Playground −0.455 *** −0.635 *** −0.324 *** −0.777 *** −0.590 *** −0.617 *** −0.518 *** −0.342 *** −0.669 *** −0.576 ***
(0.038) (0.060) (0.047) (0.042) (0.055) (0.045) (0.029) (0.062) (0.078) (0.025)
Trail 0.509 *** 0.551 *** 0.259 *** 0.943 *** 0.550 *** 0.812 *** 0.506 *** 0.340 *** 0.720 *** 0.584 ***
(0.042) (0.061) (0.049) (0.049) (0.058) (0.054) (0.031) (0.064) (0.088) (0.027)
Basketball −0.170 *** −0.256 ** −0.504 *** −0.413 *** −0.232 ** −0.194 *** −0.392 *** −0.445 *** −0.362 *** −0.262 ***
(0.049) (0.085) (0.067) (0.060) (0.077) (0.058) (0.041) (0.083) (0.110) (0.034)
Baseball 0.097 * 0.198 * 0.147 * 0.163 ** 0.224 ** −0.022 0.187 *** 0.161 * 0.154 0.124 ***
(0.049) (0.080) (0.063) (0.058) (0.073) (0.060) (0.039) (0.080) (0.108) (0.033)
Football / Soccer −0.280 *** −0.726 *** −0.593 *** −0.627 *** −0.685 *** −0.175 * −0.586 *** −0.356 ** −0.513 *** −0.479 ***
(0.065) (0.125) (0.100) (0.084) (0.104) (0.080) (0.058) (0.116) (0.147) (0.048)
Tennis 0.422 *** −0.423 *** −0.062 0.310 *** −0.205 * 0.565 *** 0.126 ** 0.166 * 0.135 0.219 ***
(0.047) (0.096) (0.070) (0.056) (0.082) (0.055) (0.040) (0.084) (0.107) (0.033)
Volleyball 0.082 −0.223 0.125 0.245 * −0.184 0.288 ** 0.012 −0.112 0.120 0.165 *
(0.096) (0.225) (0.141) (0.106) (0.195) (0.100) (0.087) (0.173) (0.247) (0.068)
Other Sport −0.172 ** −0.298 * −0.417 *** −0.303 *** −0.523 *** −0.172 * −0.249 *** −0.219 * −0.353 * −0.244 ***
(0.061) (0.116) (0.095) (0.073) (0.107) (0.073) (0.052) (0.109) (0.139) (0.044)
Num.Obs. 6,861 2,600 3,790 6,749 2,982 5,759 11,259 2,365 1,769 15,866
AIC 20,530.5 7,682.8 12,391.7 15,964.7 9,078.8 14,458.8 33,312.1 7,650 4,528.8 44,834.7
Log Likelihood −10,255.3 −3,831.4 −6,185.8 −7,972.3 −4,529.4 −7,219.4 −16,646.1 −3,815 −2,254.4 −22,407.4
\(\rho^2_0\) 0.377 0.385 0.319 0.507 0.367 0.477 0.383 0.327 0.469 0.411
a Simulated individuals segmented based on the share of households meeting the segmentation threshold in the residence block group.
Standard errors in parentheses.

The model estimates in Table 4.2 reveal noticeable heterogeneity in the park location choices among visitors from different block group segments. Park visitors living in block groups with a high proportion of Black and low-income residents show less affinity for trails and other walkways, but appear considerably more sensitive to the distance to a park. Park visitors living in high-income neighborhoods are less sensitive to the distance to a park, but receive more utility from certain amenities, in particular trails and tennis courts. Block groups with a high proportion of Hispanic residents and residents with children under 6 show the least negative response to playgrounds of all the segments.

Seeing that there is a difference in the response in the model segmentation, it is also worth considering the role of our segmentation thresholds in these findings. Figure 4.1 shows the estimated coefficients and confidence intervals for these different amenities at different threshold levels of segmentation. The threshold level means that at least that percent of the block group’s population falls in that category. The confidence intervals widen as more observations are excluded from the model. The estimated coefficients for the different segmentations are identical when the share equals zero, and simply represent the “Sport Detail” model from Table 4.1.

Overall, increasing the segmentation threshold level reveals additional information about user preferences. First, it should be noted that there is some inconsistency: for instance, block groups with at least 30% of low income households show a lower importance of distance than block groups with either 20% or 40% low income households, though all three estimates are within the same confidence intervals. The increasing width of the confidence interval, however, means it is sometimes difficult to make robust statements. Residents of block groups with a higher share of Asian individuals or high income households both show relatively more affinity for tennis courts and trails relative to other groups. Residents of block groups with increasing shares of Hispanic individuals show the highest affinity for playgrounds, and park goers from neighborhoods with a greater share of Black individuals are most sensitive to distance and least sensitive to park size.

tar_load(split_dat)
tex_labels = c("Asian", "Black", "Children under 6", "Hispanic",  
               "Income $<$ \\$ 35k", "Income $>$ \\$ 125k" )

# make the plot
these_colors <- c(wesanderson::wes_palettes$Darjeeling1, "#046C9A")
split_plots <- ggplot(split_dat, aes(x = share, y = estimate, 
                               ymin = conf.low, ymax = conf.high, 
                color = Segmentation, fill = Segmentation)) + 
  theme_minimal() +
  geom_line() + 
  geom_ribbon(alpha = 0.05, size = 0.1, lty = "dotted") + 
  facet_wrap(~ fct_rev(term), scales = "free_y", ncol = 3)  + 
  xlab("Percent of Block Group Population") + 
  ylab("Estimated coefficient and 95\\% confidence interval")

if(knitr::is_latex_output()) {
  split_plots <- split_plots + 
    scale_color_manual(values = these_colors,labels = tex_labels) +
    scale_fill_manual(values = these_colors, labels = tex_labels) + 
    theme(text = element_text(size=8))
    
  lemon::reposition_legend(split_plots, position = 'top left', panel = "panel-3-4")
} else {
  plotly::ggplotly(split_plots +
                     scale_color_manual(values = these_colors) + 
                     scale_fill_manual(values = these_colors) )
}

Figure 4.1: Estimated utility coefficients and 95% confidence intervals for park amenities at different socioeconomic threshold levels.

4.1 Equity Analysis of COVID-19 Street Openings

In this section, we apply the models estimated above to evaluate the benefits of the street conversion policy in terms of aggregate value determined by the change in accessibility logsum, as well as the equity of the policy with respect to different income and ethnic groups. In this analysis, we apply the “Sport Detail” non-segmented model from Table 4.1, as it had the best fit of these models.

Figure 4.2 presents this monetary valuation spatially. Unsurprisingly, the benefits are concentrated in the block groups surrounding the opened streets. Most residents of central Oakland see a benefit of somewhere around $1, while some zones see an equivalent benefit of as much as $30. One property of logsum-based accessibility terms is that there is some benefit given for simply having more options, whether or not those options are attractive in any way. In this application, these benefits are small, on the order of 10 cents for most block groups away from where the street openings occurred.

bins <- c(0, 0.1, 0.25, 0.5, 1, 2, 10, 50)
mypal <- as.character(wesanderson::wes_palette("Zissou1", n = 7, type = "continuous"))
tar_load(logsums)
tar_load(street_parks)

if(knitr::is_latex_output()) {
  ggplot() +
    annotation_map_tile("cartolight", zoom = 11) +
    coord_sf(crs = st_crs(3857), 
             xlim = c(-122.29674 , -122.16358), 
             ylim = c( 37.74098, 37.87028), expand = FALSE) + 
    geom_sf(data = logsums %>% st_transform(3857), inherit.aes = FALSE,
            aes(fill = cut(diff_ls, breaks = bins)), lwd = 0) + 
    scale_fill_manual("Monetary Benefit (\\$)", values = mypal) +
    geom_sf(data = street_parks,  color = "black", inherit.aes = FALSE) + 
    theme(axis.line = element_line(color = NA),
          axis.title.x=element_blank(),
          axis.text.x=element_blank(),
          axis.ticks.x=element_blank(),
          axis.title.y=element_blank(),
          axis.text.y=element_blank(),
          axis.ticks.y=element_blank(),
          text = element_text(size=8))
    
} else {
  diff_pal <- colorBin(palette = mypal, domain = logsums$diff_ls, bins = bins )
  
  leaflet(logsums %>% st_transform(4326)) %>%
    addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
    addPolygons(fillColor = ~diff_pal(diff_ls), 
                stroke = FALSE, fillOpacity = 1) %>%
    addPolylines(data = street_parks %>% st_transform(4326), color = "grey") %>%
    addLegend("bottomleft", pal = diff_pal, values = ~diff_ls, title = "Value of Street Opening")
}

Figure 4.2: Monetary value of street opening to residents based on utility change. Streets converted to pedestrian plazas are shown in black.

More interesting than the total benefit or even its spatial distribution, however, is the social equity of its distribution among different population segments. If we assign the block-group level monetary benefit to each household in the block group, we can begin to allocate the distribution of benefits proportionally to households of different sociodemographic classifications. Specifically, if a block group with \(N\) total households has a measured consumer surplus \(\delta CS\), then the share of the total benefits going to a particular population segment \(k\) is

\[\begin{equation} S_k = N * P_k * \delta CS \tag{4.1} \end{equation}\]

where \(P_k\) is the proportion of the block group’s population in segment \(k\). There is some opportunity for confusion when some demographic variables we use (share of households with children, household income) are defined at the household level and others (specifically ethnicity) are defined at the person level. It is similarly not clear whether the benefits of improved park access should be assigned at the person level, the household level, or the number of total park trip makers in each block group. For consistency and simplicity, we assert that the benefit is assigned to each household, and that persons receive a proportional share of the household benefit. For example, a block group with 30% Black individuals will receive 30% of the benefits assigned to all the households in the block group.

Table 4.3 shows the total benefit assigned to households in this way as well as the share of all monetary benefits in the region. In some cases, the policy of opening streets as public spaces had a pro-social benefit, as 18.7% of benefits went to Black individuals, even though only 11.4% of the population of Alameda County is Black. Similarly, roughly one-quarter of total benefits went to households making less than $35,000 per year even though only one-fifth of the households are in this category. On the other hand, a smaller than expected share of benefits is allocated to Asian individuals and households making more than $125,000 per year.

tar_load(benefits)
benefits %>%
  kbl(caption = "Equity Distribution of Street Opening Benefits", booktabs = TRUE, 
      col.names = c("Group", "Benefit", "Percent* of Benefits", "Households**", 
                    "Percent of Households"),
      digits = c(0, 0, 2, 0, 2),
      align = c('l', rep('c', 4))) %>%
  kable_styling(latex_options = c("scale_down")) %>%
  column_spec(1, width = "1.8in") %>%
  column_spec(2:5, width = "1in") %>%
  footnote(symbol = c(
    "As individuals and households will belong in multiple groups, the percents do not sum to 100.",
    "Race and ethnicity are person-level attributes; households are assumed to follow the same distribution."))
Table 4.3: Equity Distribution of Street Opening Benefits
Group Benefit Percent* of Benefits Households** Percent of Households
Households with Children under 6 $144,477 14.11 83,868 14.53
Income < $35k $222,130 21.69 90,762 15.73
Income > $125k $326,618 31.90 229,963 39.84
Black $186,064 18.17 61,971 10.74
Asian $197,307 19.27 167,135 28.96
Hispanic $228,810 22.35 119,013 20.62
White $348,834 34.07 194,263 33.66
All Households $1,023,915 100.00 577,177 100.00
* As individuals and households will belong in multiple groups, the percents do not sum to 100.
Race and ethnicity are person-level attributes; households are assumed to follow the same distribution.