Research Hub · For quantitative researchers

Data and methods

Download everything behind the Research Hub, see exactly what each number means, and cite it. Every measure comes from a published, open dataset; this page says which.

4,247Facilities
1,865State & federal prisons
2,240Local jails
142ICE detention

Downloads

Get the data

Files open in Excel, Google Sheets, R, Stata, SPSS, Python or any GIS. Facility IDs match across files, so the yearly heat file joins to the facility file on id.

FileWhat's in itTypeSize
echobridge-research-data.zipEverything below in one fileStart here1.4 MB
facilities-all.csv4,247 facilities (1,865 prisons, 2,240 jails, 142 ICE), 45 columnsCSV842 KB
facilities-colorado.csv65 Colorado facilities, same columnsCSV15 KB
heat-days-by-year.csvHot days per year, 1982–2020, for 4,078 facilities (long format: one row per facility-year)CSV3.1 MB
facilities.geojsonMap points for GIS (QGIS, ArcGIS, R sf, Python geopandas)GeoJSON3.7 MB
data-dictionary.csvEvery column: meaning, unit, source, yearsCSV4 KB
facilities-all-noheader.csvSame as facilities-all.csv without the three comment lines at the topCSV842 KB

Cite

How to cite

Cite the original datasets. They did the measuring; this site combines them.

Mothes & Hunt (2023). Mapping environmental injustices within the U.S. prison system (v2023-1) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.8306856

Tuholske, C., et al. (2024). Nature Sustainability. https://doi.org/10.1038/s41893-024-01293-y

EchoBridge Initiative (2026). EchoBridge Research Hub: environmental hazards and heat at U.S. carceral facilities [Data compilation]. Accessed [date].

Data dictionary

What every column means

Also in data-dictionary.csv. Hazard measures cover the 1,865 prisons only; heat measures cover all facilities.

ColumnMeaningUnitSourceYears
idFacility ID. HIFLD facility ID for prisons and jails; UCLA ID with a prefix for ICE.HIFLD / UCLA COVID Behind Bars
nameFacility name as listed in the source.HIFLD / UCLA
kindprison (state or federal), jail (local), or ice (immigration detention).This site
cityCity.HIFLD / UCLA
stateTwo-letter state code.HIFLD / UCLA
countyCounty.HIFLD
typeOperator type in the source (State, Federal, Local, County, etc.).HIFLD / UCLA
securitySecurity level in the source (prisons only).HIFLD via Mothes & Hunt
populationPopulation reported in the source. Not current; check the state's own counts.peopleHIFLD2020–2022
capacityCapacity reported in the source.bedsHIFLD2020–2022
lonLongitude (WGS84).degreesHIFLD / Tuholske / UCLA
latLatitude (WGS84).degreesHIFLD / Tuholske / UCLA
location_exact1 = exact point from the source; 0 = recovered from a projected grid, typically about 5 km off, up to 10 km (some jails).This site
lst_avgAverage daytime land surface temperature, June–August.°CMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); NASA MODIS2013–2023
flood_riskShare of the facility and a 1 km buffer in a FEMA high-risk flood zone.%Mothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); FEMA NFHL2021
wildfire_riskAverage Wildfire Hazard Potential in the facility and a 1 km buffer.indexMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); USDA Forest Service2020
percent_tree_coverAverage tree canopy in the facility and a 1 km buffer.%Mothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); USGS NLCD2016
avg_pm25Average yearly fine particulate matter.µg/m³Mothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); NASA SEDAC2015–2016
mean_ozoneAverage yearly ozone.ppbMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); NASA SEDAC2015–2016
pesticidesPesticide applied nearby.kg/ha/yrMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); NASA SEDAC2015
trafficProxTraffic proximity: vehicle counts on major roads within 500 m divided by distance.scoreMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); FHWA2018
npl_proxSuperfund proximity: sites within 5 km divided by distance (km), summed. 0.2 or more = at least one site within 5 km.scoreMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); EPA2022
rmp_proxChemical accident risk (RMP) facility proximity, same method.scoreMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); EPA2023
haz_proxHazardous waste facility proximity, same method.scoreMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license); EPA FRS2023
climate_score / exposure_score / effects_scoreGroup averages of the percentiles above.0–100Mothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license)
risk_pOverall risk percentile (average of the three groups, ranked).percentileMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license)
*_pPercentile of the measure among the 1,865 prisons (risk-oriented: higher = worse).percentileMothes & Hunt 2023, doi:10.5281/zenodo.8306856 (MIT license)
h28Average days per year when the daily maximum wet-bulb globe temperature reached 28°C (about 82°F).days/yrTuholske et al. 2024, Nature Sustainability, doi:10.1038/s41893-024-01293-y2016–2020
d28Change in those days per year, from a straight-line trend.daysTuholske et al. 2024, Nature Sustainability, doi:10.1038/s41893-024-01293-y1982–2020
d26Same as d28, at 26°C.daysTuholske et al. 2024, Nature Sustainability, doi:10.1038/s41893-024-01293-y1982–2020
h28_p, d28_p, d26_pPercentile of the heat measure among all 4,247 facilities on this site.percentileThis site, from Tuholske et al. 2024, Nature Sustainability, doi:10.1038/s41893-024-01293-y

Start in code

Load it in R or Python

The CSVs start with three comment lines that name the sources; both snippets skip them.

R

library(readr)
f <- read_csv("facilities-all.csv", comment = "#")
co <- subset(f, state == "CO" & kind == "prison")
summary(co$lst_avg)          # summer ground temperature, °C
heat <- read_csv("heat-days-by-year.csv")
# join yearly heat to facilities
library(dplyr)
co_heat <- heat %>% inner_join(co, by = "id")

Python

import pandas as pd
f = pd.read_csv("facilities-all.csv", comment="#", dtype={"id": str})
co = f[(f.state == "CO") & (f.kind == "prison")]
print(co.lst_avg.describe())   # summer ground temperature, °C
heat = pd.read_csv("heat-days-by-year.csv", dtype={"id": str})
co_heat = heat.merge(co, on="id")

Before you analyze

Limits to know

Outdoor, not indoor

Every heat and air measure describes the place around the building, not the air inside a cell. No public dataset of indoor prison temperatures exists for Colorado.

Populations are old

Population and capacity come from 2020–2022 federal files. For current counts use the state's own reports; Colorado's are monthly.

CDOC statistics

Some jail locations are approximate

For jails where location_exact is 0, the point was recovered from a map grid: typically about 5 km off, sometimes up to 10 km. Don't use those for distance-to-hazard work without checking.

Percentiles are relative

A 90th percentile means worse than 90% of facilities in the file, not a health threshold. Report the raw value with it.

Heat years end in 2020

The yearly heat series runs 1982–2020. For recent summers, pull daily records for nearby weather stations (Colorado station IDs are in the Research Hub's climate topic).

Closed facilities

A few facilities in these files have closed since the source year (in Colorado: Cheyenne Mountain in 2020, Colorado Correctional Center in 2022). Check before counting.

Ideas

Questions this data can answer

  1. Are prisons built after 1980 more likely than older ones to sit near Superfund or hazardous waste sites? (Join opening years; the Colorado page lists them.)
  2. How has the number of hot humid days changed at prisons compared with the counties around them?
  3. Do states with more prisons in high-heat percentiles have cooling or temperature rules? (See State Heat Rules.)
  4. Which facilities face several hazards at once (heat, flood, fire, toxic sites)?