What is the distribution of rental housing cost burden across Texas counties?
I measure rental housing cost burden as the share of renter households that spend 30% or more of their household income on gross rent. I also examine median household income as a second measure of the socioeconomic conditions of each county.
1. Setup
# Packageslibrary(tidycensus)library(tigris)
To enable caching of data, set `options(tigris_use_cache = TRUE)`
in your R script or .Rprofile.
library(sf)
Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
# Explore variables vars <-load_variables(2024, "acs5")vars |>filter(name %in%c("B25070_001","B25070_007","B25070_008","B25070_009","B25070_010","B19013_001" ))
# A tibble: 6 × 4
name label concept geography
<chr> <chr> <chr> <chr>
1 B19013_001 Estimate!!Median household income in the past 12… Median… block gr…
2 B25070_001 Estimate!!Total: Gross … block gr…
3 B25070_007 Estimate!!Total:!!30.0 to 34.9 percent Gross … block gr…
4 B25070_008 Estimate!!Total:!!35.0 to 39.9 percent Gross … block gr…
5 B25070_009 Estimate!!Total:!!40.0 to 49.9 percent Gross … block gr…
6 B25070_010 Estimate!!Total:!!50.0 percent or more Gross … block gr…
vars |>filter(grepl("^B25070", name))
# A tibble: 11 × 4
name label concept geography
<chr> <chr> <chr> <chr>
1 B25070_001 Estimate!!Total: Gross Rent as … block gr…
2 B25070_002 Estimate!!Total:!!Less than 10.0 percent Gross Rent as … block gr…
3 B25070_003 Estimate!!Total:!!10.0 to 14.9 percent Gross Rent as … block gr…
4 B25070_004 Estimate!!Total:!!15.0 to 19.9 percent Gross Rent as … block gr…
5 B25070_005 Estimate!!Total:!!20.0 to 24.9 percent Gross Rent as … block gr…
6 B25070_006 Estimate!!Total:!!25.0 to 29.9 percent Gross Rent as … block gr…
7 B25070_007 Estimate!!Total:!!30.0 to 34.9 percent Gross Rent as … block gr…
8 B25070_008 Estimate!!Total:!!35.0 to 39.9 percent Gross Rent as … block gr…
9 B25070_009 Estimate!!Total:!!40.0 to 49.9 percent Gross Rent as … block gr…
10 B25070_010 Estimate!!Total:!!50.0 percent or more Gross Rent as … block gr…
11 B25070_011 Estimate!!Total:!!Not computed Gross Rent as … block gr…
vars |>filter(grepl("^B19013", name))
# A tibble: 10 × 4
name label concept geography
<chr> <chr> <chr> <chr>
1 B19013A_001 Estimate!!Median household income in the past … Median… tract
2 B19013B_001 Estimate!!Median household income in the past … Median… tract
3 B19013C_001 Estimate!!Median household income in the past … Median… tract
4 B19013D_001 Estimate!!Median household income in the past … Median… tract
5 B19013E_001 Estimate!!Median household income in the past … Median… county
6 B19013F_001 Estimate!!Median household income in the past … Median… tract
7 B19013G_001 Estimate!!Median household income in the past … Median… tract
8 B19013H_001 Estimate!!Median household income in the past … Median… tract
9 B19013I_001 Estimate!!Median household income in the past … Median… tract
10 B19013_001 Estimate!!Median household income in the past … Median… block gr…
2. Select Geography and Variables
I use Texas counties because county-level geography allows for a statewide comparison while keeping the map readable.
The ACS table B25070 provides the number of renter-occupied households by the percentage of income spent on gross rent. I combine the categories from 30% through 50% or more to create the numerator for the rent-burden rate.
I also use B19013, median household income, as a second variable.
vars <-load_variables(2024, "acs5")vars |>filter(name %in%c("B25070_001","B25070_007","B25070_008","B25070_009","B25070_010","B19013_001" ))
# A tibble: 6 × 4
name label concept geography
<chr> <chr> <chr> <chr>
1 B19013_001 Estimate!!Median household income in the past 12… Median… block gr…
2 B25070_001 Estimate!!Total: Gross … block gr…
3 B25070_007 Estimate!!Total:!!30.0 to 34.9 percent Gross … block gr…
4 B25070_008 Estimate!!Total:!!35.0 to 39.9 percent Gross … block gr…
5 B25070_009 Estimate!!Total:!!40.0 to 49.9 percent Gross … block gr…
6 B25070_010 Estimate!!Total:!!50.0 percent or more Gross … block gr…
4. Download the ACS Data
I use the 2024 ACS 5-year estimates and keep the geometry so that the county-level data can be mapped.
# Download, wide — one row per area, and the sf class survivesacs_wide <-get_acs(geography = geo_level,variables = my_vars,state = state_abbr,year = year_acs,survey = survey,geometry =TRUE,output ="wide")
Getting data from the 2020-2024 5-year ACS
5. Create the Rent-Burden Numerator
The rent-burden numerator is the number of renter households spending 30% or more mof their income on gross rent. I combine the four relevant ACS categories.
# Derive a rate, and carry its margin of error throughacs_wide <- acs_wide |>mutate(burden_30_plusE = burden_30_35E + burden_35_40E + burden_40_50E + burden_50_plusE )
6. Calculate the Rent-Burden Rate
The denominator is the total number of renter-occupied households. I divide the number of households spending 30% or more of income on rent by the total number of renter households.
Top and Bottom 10 Texas Counties by Median Household Income
Group
County
Median household income
Income MOE
Rent burden (%)
MOE (%)
Top 10
Rockwall County, Texas
$127,981
$ 4,257
50.7
6.4
Top 10
Collin County, Texas
$121,600
$ 1,883
45.8
1.5
Top 10
Kendall County, Texas
$114,962
$ 8,014
51.7
8.8
Top 10
Fort Bend County, Texas
$114,041
$ 1,899
50.2
2.8
Top 10
Denton County, Texas
$111,498
$ 1,485
49.5
1.6
Top 10
Williamson County, Texas
$111,340
$ 1,581
46.4
2.2
Top 10
Chambers County, Texas
$109,804
$10,467
37.0
10.2
Top 10
Parker County, Texas
$104,443
$ 3,349
47.9
5.8
Top 10
Comal County, Texas
$101,889
$ 2,995
48.5
5.0
Top 10
Glasscock County, Texas
$101,250
$53,302
4.1
11.5
Bottom 10
Swisher County, Texas
$ 36,165
$14,512
36.1
13.0
Bottom 10
Zavala County, Texas
$ 36,749
$ 5,834
33.0
13.1
Bottom 10
Starr County, Texas
$ 37,639
$ 4,431
40.5
5.6
Bottom 10
Dimmit County, Texas
$ 38,808
$ 8,956
38.3
16.2
Bottom 10
Kenedy County, Texas
$ 38,882
$ 4,589
26.9
69.6
Bottom 10
Zapata County, Texas
$ 39,239
$ 4,265
27.4
12.5
Bottom 10
Real County, Texas
$ 39,605
$34,535
32.4
18.7
Bottom 10
Edwards County, Texas
$ 40,313
$21,695
22.4
37.3
Bottom 10
Jim Hogg County, Texas
$ 42,211
$ 3,821
32.6
22.1
Bottom 10
Newton County, Texas
$ 42,618
$ 5,785
22.2
9.3
12. Uncertainty Check
To examine uncertainty, I calculate an interval around each rent-burden estimate using its ACS margin of error. I then check whether the intervals for adjacent counties in the table overlap.
The code identifies Rockwall County and Collin County as a pair whose intervals overlap.
Rockwall County has an estimated rent-burden rate of 50.7%, with an interval from approximately 44.2% to 57.1%. Collin County has an estimated rate of 45.8%, with an interval from approximately 44.3% to 47.4%.
Because these intervals overlap, the difference between the two estimated rent-burden rates should be interpreted cautiously. The overlap does not change the ranking by median household income, but it shows that the difference in the accompanying rent-burden estimates is not clearly distinguishable given sampling uncertainty.
# Save outputswrite_csv(st_drop_geometry(acs_wide),paste0("acs_", state_abbr, "_", year_acs, ".csv"))
13. Methods
This analysis uses 2024 ACS 5-year estimates to examine rental housing cost burden across Texas counties. County-level geography was selected because it provides a statewide comparison while remaining readable on a choropleth map. Rental housing cost burden is measured as the share of renter-occupied households spending 30% or more of household income on gross rent. The numerator combines households spending 30–34.9%, 35–39.9%, 40–49.9%, and 50% or more of income on rent, while total renter-occupied households provide the denominator. Median household income is included as a second socioeconomic measure. Because ACS estimates are based on samples, each estimate has a margin of error. I calculate and report the MOE for the rent-burden rate rather than treating the estimates as exact values. Overlapping confidence intervals indicate that small differences between counties should not automatically be interpreted as meaningful differences in the estimates.