This table contains a set of factors to apportion Census tract-level data among the CMAP travel modeling subzones. Separate factors are provided for apportioning housing unit, household, and population attributes. All factors were determined by calculating the percentage of a tract's housing units, households and population that were located in each of its component blocks, according to the 2020 Decennial Census, and then assigning each block to a subzone (based on the location of the block's centroid point). Subzones that do not contain the centroid of any blocks with at least one housing unit, household, person or job are not present in this table. Use xwalk_tract2subzone for data from the 2020 decennial census or the American Community Survey (ACS) from 2020 onward. For data from the 2010 decennial census or ACS from 2010 through 2019, use xwalk_tract2subzone_2010.

xwalk_tract2subzone

xwalk_tract2subzone_2010

Format

xwalk_tract2subzone is a tibble with 16877 rows and 6 variables:

geoid_tract

Unique 11-digit tract ID, assigned by the Census Bureau. Corresponds to tract_sf (although that only includes the tracts in the 7-county CMAP region). Character.

subzone17

Numeric subzone ID. Corresponds to subzone_sf. Integer.

hu_pct

Proportion of the tract's housing units (occupied or vacant) located in the specified subzone. Multiply this by a tract-level measure of a housing attribute (e.g. vacant homes) to estimate the subzone's portion. Double.

hh_pct

Proportion of the tract's households (i.e. occupied housing units) living in the specified subzone. Multiply this by a tract-level measure of a household attribute (e.g. car-free households) to estimate the subzone's portion. Double.

pop_pct

Proportion of the tract's total population (including group quarters) living in the specified subzone. Multiply this by a tract-level measure of a population attribute (e.g. race/ethnicity) to estimate the subzone's portion. Double.

emp_pct

Proportion of the tract's total jobs located in the specified subzone. Multiply this by a tract-level measure of an employment attribute (e.g. retail jobs) to estimate the subzone's portion. Not available in xwalk_tract2subzone_2010. Double.

xwalk_tract2subzone_2010 is a tibble with 15713 rows and 5 variables (no emp_pct).

Details

Other than in certain areas of Chicago, tracts tend to be significantly larger than subzones and have highly irregular boundaries, so in most cases the jobs, population, households and/or housing units in a tract are split across multiple subzones. For that reason, it is not appropriate to use a one-to-one tract-to-subzone assignment to apportion Census data among subzones, and this crosswalk should be used instead.

To use this crosswalk effectively, Census data should be joined to it (not vice versa, since tract IDs appear multiple times in this table). Once the data is joined, it should be multiplied by the appropriate factor (depending whether the data of interest is measured at the housing unit, household, person or job level), and then the result should be summed by subzone ID. If calculating rates, this should only be done after the counts have been summed to subzone. The resulting table can then be joined to subzone_sf for mapping, if desired.

If your data is also available at the block group level, it is recommended that you use that with xwalk_blockgroup2subzone instead of the tract-level allocation. If the subzone geography is too granular for your needs, you can use zones instead with xwalk_tract2zone or xwalk_blockgroup2zone.

Examples

# View the tract allocations for subzone17 == 1
dplyr::filter(xwalk_tract2subzone, subzone17 == 1)
#> # A tibble: 2 × 6
#>   geoid_tract subzone17 hu_pct hh_pct pop_pct emp_pct
#>   <chr>           <int>  <dbl>  <dbl>   <dbl>   <dbl>
#> 1 17031081600         1  0.482  0.482   0.498  0.186 
#> 2 17031081700         1  0.374  0.385   0.390  0.0721

# Map the subzones missing from xwalk_tract2subzone (i.e. no HU/HH/pop/emp)
library(ggplot2)
ggplot(dplyr::anti_join(subzone_sf, xwalk_tract2subzone)) +
  geom_sf(fill = "red", lwd = 0.1) +
  geom_sf(data = subzone_sf, fill = NA, lwd = 0.1) +
  theme_void()
#> Joining with `by = join_by(subzone17)`