README

Pollution & Prejudice

NOTE: this is an update to the Redline Mapping project contained here: https://github.com/daltare/Redline-Mapping

Background

The purpose of this project is to analyze present-day environmental and socioeconomic conditions in neighborhoods in California cities that were assessed by the federal Home Owners’ Loan Corporation (HOLC) in the 1930s. As part of its assessment process, the HOLC produced maps that are today commonly known as “Redlining” maps, which divided up selected cities (generally those with a population greater than 40,000) into neighborhoods, and assigned each of those neighborhoods a grade that reflected its percieved credit worthiness, on a scale of A (Best) through D (Hazardous). Those assessments often included explicit references to both the racial makeup of a neighborhood’s population and the environmental conditions in and around that neighborhood as important factors in assigning each neighborhood’s grade.

Our goal is to analyze whether or not present-day pollution burdens, as well as vulnerability to the effects of pollution (due to socioeconomic conditions), tend to show any association with historical HOLC grade in neighborhoods assessed by the HOLC in the 1930s. In other words, we are exploring whether historical HOLC grade continues to be a possible predictor of present-day environmental and socioeconomic conditions. We also explore the present-day racial / ethnic makeup of those neighborhoods, to assess whether racial disparities by HOLC grade tend to persist today.


Data Sources

The primary data sources used in this analysis are:

  • Mapping Inequality: Redlining in New Deal America
    • provides the HOLC (or “Redlining”) maps, which are available to download in various formats
    • a version of the dataset processed for use in this analysis (including data for all 8 California urban areas assessed by the HOLC) is available to download at this link
  • CalEnviroScreen 4.0
    • assesses relative pollution burden and vulnerability for each census tract in California, providing an overall score as well as scores for 21 specific indicators of pollution burden or population characteristics for each tract, available to access/download in various formats
    • a version of the dataset processed for use in this analysis (with cleaned / expanded field names, missing values encoded as NA, and revised geographic representation of census tracts - to fix inconsistent boundaries between tracts - based on simplified 2010 TIGER data) is available to download at this link

Analytical Process and Results

For an overview of the analytical process and results, see the summary_report.md document.

The primary results are available in the 03-1_output_data folder, and are available in the following formats:

  • geopackage: HOLC_CES_scores_demographics.gpkg – available for download with this link

  • shapefile (zipped): HOLC_CES_scores_demographics_shp.zip – available for download with this link

These files include estimated CalEnviroScreen 4.0 scores (including overall scores and scores for each individual indicator) and estimated current population by racial / ethnic group for each neighborhood in the 1930s HOLC maps. Note that the CES scores and demographics in this dataset are estimates (based on weighted data from overlapping census tracts) that are intended to be used for relative comparisons across groups, and should be used with caution when looking at individual or small numbers of HOLC neighborhoods in isolation.

A data dictionary for these files – which briefly describes each variable – is also available in the 03-1_output_data/data_dictionary_outputs.csv file (available for download with this link).


Reproducibility

Workflow - {targets}

This project uses the targets package for workflow management. The entire workflow is defined and managed through the _targets.R file.

Run targets::tar_make() from the console to run the workflow and reproduce all results. For some more pointers on using the targets package, see the targets_notes.md file.

Targets workflow:

This figure provides a visualization of the workflow defined in the _targets.R file:

tar_source(): these files do not exist: R Warning messages: 1: package ‘targets’ was built under R version 4.3.3 2: package ‘tarchetypes’ was built under R version 4.3.2

graph LR
  style Legend fill:#FFFFFF00,stroke:#000000;
  style Graph fill:#FFFFFF00,stroke:#000000;
  subgraph Legend
    direction LR
    x0a52b03877696646([""Outdated""]):::outdated --- x7420bd9270f8d27d([""Up to date""]):::uptodate
    x7420bd9270f8d27d([""Up to date""]):::uptodate --- xbf4603d6c2c2ad6b([""Stem""]):::none
    xbf4603d6c2c2ad6b([""Stem""]):::none --- xf0bce276fe2b9d3e>""Function""]:::none
    xf0bce276fe2b9d3e>""Function""]:::none --- x5bffbffeae195fc9{{""Object""}}:::none
  end
  subgraph Graph
    direction LR
    x723651d51c4d9039>"ggplot_box_legend"]:::uptodate --> x9fc5d9228e2f8c78>"f_plot_scores_box_departure_legend"]:::uptodate
    x9fc5d9228e2f8c78>"f_plot_scores_box_departure_legend"]:::uptodate --> xd261dc6bb4fd422e(["plot_scores_box_departure_legend"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> xd261dc6bb4fd422e(["plot_scores_box_departure_legend"]):::outdated
    x3566400abf0582d0>"f_process_holc_data"]:::uptodate --> xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated
    xc134b761ca90db6a(["holc_area_descriptions"]):::outdated --> xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated
    x7deb259c829fdb2e(["raw_holc_data_files"]):::outdated --> xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated
    xcda122252060630c>"f_compute_HOLC_CES_scores_centroids"]:::uptodate --> x03e01758e45bc154(["sf_holc_ces_scores_centroids"]):::outdated
    x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated --> x03e01758e45bc154(["sf_holc_ces_scores_centroids"]):::outdated
    xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated --> x03e01758e45bc154(["sf_holc_ces_scores_centroids"]):::outdated
    xb8f0b2810f342081(["ces_coverage_threshold"]):::outdated --> xf2cacda6c5be1d56(["df_holc_ces_scores_calculations"]):::outdated
    xb84eb9d541120890>"f_compute_HOLC_CES_scores"]:::uptodate --> xf2cacda6c5be1d56(["df_holc_ces_scores_calculations"]):::outdated
    x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated --> xf2cacda6c5be1d56(["df_holc_ces_scores_calculations"]):::outdated
    xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated --> xf2cacda6c5be1d56(["df_holc_ces_scores_calculations"]):::outdated
    xd22b3ef3698af9c3>"f_plot_race_bars_by_group"]:::uptodate --> xe2341aac6be6d5c3(["plot_race_bars_by_group"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> xe2341aac6be6d5c3(["plot_race_bars_by_group"]):::outdated
    x13ecd6c730196e92>"f_plot_scores_box_departure"]:::uptodate --> xc0917568d2ce3bee(["plot_scores_box_departure"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> xc0917568d2ce3bee(["plot_scores_box_departure"]):::outdated
    x716156bac81cd62e(["df_holc_ces_scores_comparison"]):::outdated --> xdf491333e4fb171a(["holc_ces_score_methods_correlation"]):::outdated
    x9f27f4335306e40c>"f_HOLC_CES_score_methods_correlation"]:::uptodate --> xdf491333e4fb171a(["holc_ces_score_methods_correlation"]):::outdated
    x4baab69ddc05606c>"f_compute_HOLC_demographics"]:::uptodate --> x0933fedf1eaed55e(["df_holc_demographics_calculations"]):::outdated
    x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated --> x0933fedf1eaed55e(["df_holc_demographics_calculations"]):::outdated
    xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated --> x0933fedf1eaed55e(["df_holc_demographics_calculations"]):::outdated
    xb8f0b2810f342081(["ces_coverage_threshold"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    xcdcbc8327c73002a(["ces_scores_missing_check"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    xe2341aac6be6d5c3(["plot_race_bars_by_group"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    xd261dc6bb4fd422e(["plot_scores_box_departure_legend"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    x30558efb09c7936d(["plot_scores_method_comparison_scatter"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    xe4dc7810b8261f38(["plot_scores_method_comparison_scatter_facet"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    x26888c3adf53b8ba(["plot_scores_points_average_by_grade"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    x85db2b90c235dab6(["plot_scores_points_departure"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    xd06bbe78c7eb9f6c(["plot_scores_points_raw"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated --> xe24c603975ef95ce(["summary_report"]):::outdated
    x28598aa74e36431d>"f_download_raw_holc_data"]:::uptodate --> x7deb259c829fdb2e(["raw_holc_data_files"]):::outdated
    xe7b24c87dabecd62>"f_parse_holc_descriptions"]:::uptodate --> xc134b761ca90db6a(["holc_area_descriptions"]):::outdated
    x7deb259c829fdb2e(["raw_holc_data_files"]):::outdated --> xc134b761ca90db6a(["holc_area_descriptions"]):::outdated
    xf2cacda6c5be1d56(["df_holc_ces_scores_calculations"]):::outdated --> x716156bac81cd62e(["df_holc_ces_scores_comparison"]):::outdated
    x1362e4f419a24a87>"f_combine_HOLC_CES_score_methods"]:::uptodate --> x716156bac81cd62e(["df_holc_ces_scores_comparison"]):::outdated
    x03e01758e45bc154(["sf_holc_ces_scores_centroids"]):::outdated --> x716156bac81cd62e(["df_holc_ces_scores_comparison"]):::outdated
    x661c36f456260220>"f_plot_scores_points_average_by_grade"]:::uptodate --> x26888c3adf53b8ba(["plot_scores_points_average_by_grade"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> x26888c3adf53b8ba(["plot_scores_points_average_by_grade"]):::outdated
    x0933fedf1eaed55e(["df_holc_demographics_calculations"]):::outdated --> x722c080414fdf571(["df_holc_demographics_summary"]):::outdated
    x2dfdf1b5ee4ba094>"f_summarize_HOLC_demographics"]:::uptodate --> x722c080414fdf571(["df_holc_demographics_summary"]):::outdated
    xf443f725966ed075{{"last_report_update"}}:::outdated --> x3b5990520b2e818d(["summary_report_html"]):::outdated
    x716156bac81cd62e(["df_holc_ces_scores_comparison"]):::outdated --> xe4dc7810b8261f38(["plot_scores_method_comparison_scatter_facet"]):::outdated
    x3b0727f79ff18b40>"f_plot_scores_method_comparison_scatter_facet"]:::uptodate --> xe4dc7810b8261f38(["plot_scores_method_comparison_scatter_facet"]):::outdated
    x716156bac81cd62e(["df_holc_ces_scores_comparison"]):::outdated --> x30558efb09c7936d(["plot_scores_method_comparison_scatter"]):::outdated
    xfded34a4d23e9e5d>"f_plot_scores_method_comparison_scatter"]:::uptodate --> x30558efb09c7936d(["plot_scores_method_comparison_scatter"]):::outdated
    x6a4e5ab768f76050>"f_plot_scores_points_raw"]:::uptodate --> xd06bbe78c7eb9f6c(["plot_scores_points_raw"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> xd06bbe78c7eb9f6c(["plot_scores_points_raw"]):::outdated
    x7ad41e3fd12f2676(["ces_names_file"]):::outdated --> x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated
    xdca65f7684d779f0>"f_process_ces_data"]:::uptodate --> x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated
    x6538bfb2bd8fa5af(["raw_ces_data_file"]):::outdated --> x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated
    x973757ac5e3621cd(["data_dictionary_file"]):::outdated --> xf040698982835e96(["write_shapefile"]):::outdated
    x9e5564aad7264f3e>"f_convert_to_shapefile"]:::uptodate --> xf040698982835e96(["write_shapefile"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> xf040698982835e96(["write_shapefile"]):::outdated
    xc504145cdabdd854>"f_download_raw_ces_data"]:::uptodate --> x6538bfb2bd8fa5af(["raw_ces_data_file"]):::outdated
    xbc38fdbb09f54cdc(["df_holc_ces_scores_summary"]):::outdated --> x7774e14ad1201765(["sf_combined_results"]):::outdated
    x722c080414fdf571(["df_holc_demographics_summary"]):::outdated --> x7774e14ad1201765(["sf_combined_results"]):::outdated
    xf90b49dd379c5312>"f_combine_computed_data"]:::uptodate --> x7774e14ad1201765(["sf_combined_results"]):::outdated
    xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated --> x7774e14ad1201765(["sf_combined_results"]):::outdated
    xf2cacda6c5be1d56(["df_holc_ces_scores_calculations"]):::outdated --> xcdcbc8327c73002a(["ces_scores_missing_check"]):::outdated
    x1909355c81c03a12>"f_check_missing_CES_scores"]:::uptodate --> xcdcbc8327c73002a(["ces_scores_missing_check"]):::outdated
    xf2cacda6c5be1d56(["df_holc_ces_scores_calculations"]):::outdated --> xbc38fdbb09f54cdc(["df_holc_ces_scores_summary"]):::outdated
    x24483bb6f5885403>"f_summarize_HOLC_CES_scores"]:::uptodate --> xbc38fdbb09f54cdc(["df_holc_ces_scores_summary"]):::outdated
    x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated --> xbc38fdbb09f54cdc(["df_holc_ces_scores_summary"]):::outdated
    xc11e093e8a0331b6>"f_plot_map_panels"]:::uptodate --> x52b2d35838d1c908(["plot_map_panels"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> x52b2d35838d1c908(["plot_map_panels"]):::outdated
    x66ea1e7e4088616e(["sf_formatted_ces_data"]):::outdated --> x52b2d35838d1c908(["plot_map_panels"]):::outdated
    xd358c84560a350ea(["sf_formatted_holc_data"]):::outdated --> x52b2d35838d1c908(["plot_map_panels"]):::outdated
    x05780902aff2e52e>"f_plot_scores_points_departure"]:::uptodate --> x85db2b90c235dab6(["plot_scores_points_departure"]):::outdated
    x7774e14ad1201765(["sf_combined_results"]):::outdated --> x85db2b90c235dab6(["plot_scores_points_departure"]):::outdated
    x118ccf0169559b01(["readme_file"]):::outdated --> x118ccf0169559b01(["readme_file"]):::outdated
    xd244e8c357cc9580(["targets_notes_file"]):::outdated --> xd244e8c357cc9580(["targets_notes_file"]):::outdated
  end
  classDef outdated stroke:#000000,color:#000000,fill:#78B7C5;
  classDef uptodate stroke:#000000,color:#ffffff,fill:#354823;
  classDef none stroke:#000000,color:#000000,fill:#94a4ac;
  linkStyle 0 stroke-width:0px;
  linkStyle 1 stroke-width:0px;
  linkStyle 2 stroke-width:0px;
  linkStyle 3 stroke-width:0px;
  linkStyle 76 stroke-width:0px;
  linkStyle 77 stroke-width:0px;
Loading

Package Management - {renv}

This project uses renv for package management (the renv package creates the renv.lock file, i.e. the lockfile). When opening this project as an RStudio Project for the first time, renv should automatically install itself and prompt you to run renv::restore() to install all package dependencies. In addition:

  • Call renv::status() to check the status and fix any issues that arise (using the commands below)
  • Developers can call renv::install() to add packages, renv::update() to update package versions, and renv::snapshot() after packages are added or updated (which will record the packages and their sources in the lockfile)
  • Collaborators can call renv::restore() (to get the specific package versions recorded in the lockfile).
  • The renv documentation notes that if you’re making major changes to a project that you haven’t worked on for a while, it’s often a good idea to start with an renv::update() before making any changes to the code.

For more information, see Introduction to renv.