<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Research | ISSUES | The Ohio State University</title><link>https://issues-osu.github.io/ISSUESlab/category/research/</link><atom:link href="https://issues-osu.github.io/ISSUESlab/category/research/index.xml" rel="self" type="application/rss+xml"/><description>Research</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Fri, 10 Jul 2026 00:00:00 +0000</lastBuildDate><image><url>https://issues-osu.github.io/ISSUESlab/media/logo_hu2fedd529b9d9d7008e9f6968cd645fa1_199187_300x300_fit_lanczos_3.png</url><title>Research</title><link>https://issues-osu.github.io/ISSUESlab/category/research/</link></image><item><title>What 25 Years of Jury Selection Data Reveal About the Questions Raised by the Karmelo Anthony Trial</title><link>https://issues-osu.github.io/ISSUESlab/post/jury-selection-data/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://issues-osu.github.io/ISSUESlab/post/jury-selection-data/</guid><description>&lt;p>In &lt;em>Batson v. Kentucky&lt;/em> (1986), the Supreme Court held that prosecutors may not exclude potential jurors solely because of their race. Nearly four decades later, questions about racial disparities in jury selection continue to arise. They resurfaced during the 2026 murder trial of Karmelo Anthony, where the defense raised a Batson challenge after all eligible Black jurors were removed from the pool and an all-White jury was ultimately seated.&lt;/p>
&lt;p>The Anthony case cannot be evaluated using the Mississippi data analyzed here. It occurred in a different state, a different county, and under different circumstances, and nothing below should be read as a claim about it. However, the case does bring up an important question that the criminal legal system should confront: if race-based juror exclusion is unconstitutional, do measurable racial disparities in jury selection still persist? To examine that question, I reanalyzed a publicly available dataset assembled by APM Reports containing jury selection records from 305 criminal trials in Mississippi&amp;rsquo;s Fifth Circuit Court District spanning roughly 1991–2017.&lt;/p>
&lt;h2 id="five-key-findings">Five Key Findings&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Racial disparity in prosecution strikes persisted after Batson.&lt;/strong> Black jurors remained roughly 37–38 percentage points more likely than non-Black jurors to be struck by prosecutors, even as overall strike rates declined.&lt;/li>
&lt;li>&lt;strong>All-White juries occurred far more often than a race-neutral process would predict.&lt;/strong> Across 218 trials with complete jury-composition data, 14 juries contained no Black members. Under race-neutral selection, the model predicts roughly 1.3.&lt;/li>
&lt;li>&lt;strong>The disparity was robust across statistical approaches.&lt;/strong> The odds of a Black eligible juror being struck are nearly eight times those of non-Black jurors, and the gap persisted after adjusting for county, defendant race, and trial-level clustering.&lt;/li>
&lt;li>&lt;strong>The disparity persisted even when defendants were White.&lt;/strong> The pattern cannot be explained solely as an effort to match juror demographics to defendant demographics.&lt;/li>
&lt;li>&lt;strong>Every county examined showed a statistically significant disparity.&lt;/strong> The magnitude varied; no county showed the gap disappearing.&lt;/li>
&lt;/ol>
&lt;p>&lt;em>These are descriptions of patterns in a particular, non-random sample of trials. They are not, and should not be read as, determinations of intent in any individual decision, nor as population estimates for trials in general.&lt;/em>&lt;/p>
&lt;hr>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>In 2018, reporters working on the podcast &lt;em>In the Dark&lt;/em> published a detailed statistical investigation of jury selection in Mississippi&amp;rsquo;s Fifth Circuit Court District. Their analysis documented that, across hundreds of criminal trials in seven counties, prosecutors used their discretionary &amp;ldquo;peremptory&amp;rdquo; challenges to remove Black prospective jurors at rates far exceeding those for white jurors. That investigation is available at: &lt;a href="https://features.apmreports.org/in-the-dark/mississippi-district-attorney-striking-black-jurors/" target="_blank" rel="noopener">features.apmreports.org/in-the-dark/mississippi-district-attorney-striking-black-jurors/&lt;/a>&lt;/p>
&lt;p>This article independently replicates the findings reported by APM Reports using publicly available jury selection data and extends the analysis through multilevel modeling, county-level decomposition, time-trend analyses, and probability-based estimates of how often the observed outcomes would be expected under race-neutral jury selection. The article concludes by placing the 2026 murder trial of Karmelo Anthony in a broader historical context. While the Mississippi data cannot determine what occurred in that specific case, the questions it raised about Batson challenges, race-neutral explanations for juror strikes, and the seating of an all-White jury are consistent with these historical patterns.&lt;/p>
&lt;p>Throughout, the analysis is descriptive and statistical. Racial disparities in aggregate data are documented as patterns; they are not, and should not, be read as determinations of intent in any individual decision.&lt;/p>
&lt;hr>
&lt;h2 id="about-the-dataset">About the Dataset&lt;/h2>
&lt;p>The APM Reports jury dataset and analysis are available at &lt;a href="https://github.com/APM-Reports/jury-data" target="_blank" rel="noopener">github.com/APM-Reports/jury-data&lt;/a>. It covers 305 criminal trials across seven Mississippi counties that are within the Fifth Circuit Court District. The trial coverage is roughly 1991 to 2017, although not all data are complete. All cases were ultimately appealed, creating selection bias that makes the sample non-random and may have analytic implications. Nevertheless, anyone can easily replicate the analysis below using the code shown in each code block.&lt;/p>
&lt;p>For each trial, the dataset records the defendant&amp;rsquo;s race, charges, judge, and prosecuting attorneys. For each of the 14,874 individual prospective jurors, it records race, gender, what happened during selection (struck for cause, struck by state, struck by defense, or seated), and a &lt;code>strike_eligibility&lt;/code> field indicating which side retained peremptory power at that juror&amp;rsquo;s position in the process.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">jurors_clean&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">jurors&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">race_clean&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">str_to_lower&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">str_trim&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">race&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">struck_by_clean&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">str_to_lower&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">str_trim&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">race_group&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">case_when&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span> &lt;span class="o">~&lt;/span> &lt;span class="s">&amp;#34;Black&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">race_clean&lt;/span> &lt;span class="o">%in%&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;white&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;asian&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;latino&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">~&lt;/span> &lt;span class="s">&amp;#34;Non-Black&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kc">TRUE&lt;/span> &lt;span class="o">~&lt;/span> &lt;span class="kc">NA_character_&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state_struck&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">if_else&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;struck by the state&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1L&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0L&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jury_df&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">jurors_clean&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">left_join&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">trials&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">county&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">defendant_race&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">judge&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prosecutor_1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">prosecutor_2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">prosecutor_3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">verdict&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cause_number&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batson_claim_by_defense&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">by&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;trial_id&amp;#34;&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">article_universe&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">jurors_clean&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">race_clean&lt;/span> &lt;span class="o">%in%&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;white&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">!&lt;/span>&lt;span class="n">struck_by&lt;/span> &lt;span class="o">%in%&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Juror not struck&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Struck without notation&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;Juror excused/absent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Unknown&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">eligible_df&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">jury_df&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">!&lt;/span>&lt;span class="nf">is.na&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">race_group&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">strike_eligibility&lt;/span> &lt;span class="o">%in%&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Both State and Defense&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;State&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">race_group&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">race_group&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">levels&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Non-Black&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Black&amp;#34;&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defendant_race&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">as.factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">defendant_race&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">county&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">as.factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">county&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Below, &amp;ldquo;Non-Black&amp;rdquo; combines white, Asian, and Latino jurors, who together are overwhelmingly white in these counties; I use &amp;ldquo;non-Black&amp;rdquo; when the comparison is the analytic contrast, and &amp;ldquo;white&amp;rdquo; only when the underlying group is effectively all White (for example, when describing all-White juries).&lt;/p>
&lt;hr>
&lt;h2 id="replication-of-headline-statistics">Replication of Headline Statistics&lt;/h2>
&lt;p>APM Reports described a pool of 6,763 prospective jurors. I identify the equivalent group as all jurors recorded as Black or White who received a definitive outcome, excluding ambiguous categories (&amp;ldquo;Juror not struck,&amp;rdquo; &amp;ldquo;Struck without notation,&amp;rdquo; and similar).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">sfc&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">article_universe&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;Struck for cause&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">after_cause&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">article_universe&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="s">&amp;#34;Struck for cause&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">prose_str&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">article_universe&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;Struck by the state&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">def_str&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">article_universe&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;Struck by the defense&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">served&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">article_universe&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by&lt;/span> &lt;span class="o">%in%&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Juror chosen to serve on jury&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Juror chosen as alternate&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">after_pros&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">article_universe&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">struck_by&lt;/span> &lt;span class="o">%in%&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Struck by the defense&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;Juror chosen to serve on jury&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;Juror chosen as alternate&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">tibble&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Stage&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Total prospective pool&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Struck for cause&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;Pool entering peremptory&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Prosecution strikes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;Pool after prosecution&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Defense strikes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;Seated (jurors + alternates)&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">`My N`&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">article_universe&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sfc&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">after_cause&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">prose_str&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">after_pros&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">def_str&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">served&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">`Article N`&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;6,763&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;1,342&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;~5,421&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;1,275&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;-&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;1,458&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;2,688&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">`My % Black`&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">percent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">article_universe&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0.1&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">percent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sfc&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0.1&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">percent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">after_cause&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0.1&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">percent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">prose_str&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0.1&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">percent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">after_pros&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0.1&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">percent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">def_str&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0.1&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">percent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">served&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">race_clean&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="m">0.1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">`Article % Black`&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;39%&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;57%&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;35%&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;71%&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;21%&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;9%&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;32%&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># A tibble: 7 × 5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Stage `My N` `Article N` `My % Black` `Article % Black`
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;chr&amp;gt; &amp;lt;int&amp;gt; &amp;lt;chr&amp;gt; &amp;lt;chr&amp;gt; &amp;lt;chr&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1 Total prospective pool 6795 6,763 39.1% 39%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2 Struck for cause 1342 1,342 56.6% 57%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3 Pool entering peremptory 5453 ~5,421 34.8% 35%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4 Prosecution strikes 1285 1,275 70.9% 71%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5 Pool after prosecution 4168 - 23.7% 21%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">6 Defense strikes 1466 1,458 8.7% 9%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">7 Seated (jurors + alternates) 2702 2,688 31.9% 32%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>All percentage figures replicate to within rounding error. The point of reproducing the previous analysis is to verify before building on it.&lt;/p>
&lt;h3 id="the-flow-of-jurors">The Flow of Jurors&lt;/h3>
&lt;p>The prosecution strike flow shows that 70.9% of state strikes removed Black jurors. The defense flow runs the other way, 91.3% white, but only because, by that stage, the pool was already heavily white. Together, they show how Black jurors entered the process at roughly their expected share (39.1%) yet were &amp;ldquo;funneled&amp;rdquo; away from selection at specific stages of voir dire.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Flow of prospective jurors through Mississippi jury selection" srcset="
/ISSUESlab/post/jury-selection-data/fig1_hua1d6dbd7aa128deda383d122e6504849_288066_93205a830c179fcc7aaf0b45255728be.webp 400w,
/ISSUESlab/post/jury-selection-data/fig1_hua1d6dbd7aa128deda383d122e6504849_288066_2e4f6032761548748b60b435fba67c79.webp 760w,
/ISSUESlab/post/jury-selection-data/fig1_hua1d6dbd7aa128deda383d122e6504849_288066_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig1_hua1d6dbd7aa128deda383d122e6504849_288066_93205a830c179fcc7aaf0b45255728be.webp"
width="760"
height="548"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="statistical-analysis">Statistical Analysis&lt;/h2>
&lt;h3 id="overall-strike-rates">Overall Strike Rates&lt;/h3>
&lt;p>Among jurors eligible for peremptory challenges, 49.8% of Black jurors were struck by the prosecution, compared with 11.2% of non-Black jurors. The unadjusted odds ratio is 7.84 (95% CI: 6.81–9.04). Adjusting for defendant race and county yields an OR of 8.25, indicating that the disparity persists after accounting for these factors.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># A tibble: 2 × 5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> race_group n struck_n strike_rate pct
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;fct&amp;gt; &amp;lt;int&amp;gt; &amp;lt;int&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;chr&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1 Non-Black 3320 373 0.112 11.2%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2 Black 1811 902 0.498 49.8%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="State peremptory strike rate by juror race" srcset="
/ISSUESlab/post/jury-selection-data/fig2_hu2bb67a7c15d497d3650d3112511783b7_82320_7f3a8f88a15c7a7ddeb23a396bee880e.webp 400w,
/ISSUESlab/post/jury-selection-data/fig2_hu2bb67a7c15d497d3650d3112511783b7_82320_b6a1bd4552eaae2bee646f0d5b2c484b.webp 760w,
/ISSUESlab/post/jury-selection-data/fig2_hu2bb67a7c15d497d3650d3112511783b7_82320_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig2_hu2bb67a7c15d497d3650d3112511783b7_82320_7f3a8f88a15c7a7ddeb23a396bee880e.webp"
width="760"
height="464"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="county-level-variation">County-level Variation&lt;/h3>
&lt;p>The disparity appears across all counties, with odds ratios ranging from 4.6 (Choctaw) to 17.3 (Carroll). In Carroll County, an eligible Black juror was struck at roughly 17 times the odds of a non-Black juror. All county-level estimates are statistically significant (p &amp;lt; 0.001).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># A tibble: 7 × 5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Groups: county [7]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> county OR lower upper p.value
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;fct&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1 Carroll 17.3 8.09 40.8 3.19e-12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2 Montgomery 12.6 8.62 18.7 9.82e-38
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3 Webster 9.97 3.94 26.9 2.21e- 6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4 Grenada 9.21 7.10 12.0 5.93e-61
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5 Winston 8.14 5.35 12.6 7.18e-22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">6 Attala 6.14 4.64 8.17 2.94e-36
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">7 Choctaw 4.60 2.92 7.26 4.40e-11
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="County-specific odds ratios for prosecution strikes of Black jurors" srcset="
/ISSUESlab/post/jury-selection-data/fig3_hud880e1b58177138551867b54448a2f66_111865_9ec64eeeaa56598c266ff569f9c536bb.webp 400w,
/ISSUESlab/post/jury-selection-data/fig3_hud880e1b58177138551867b54448a2f66_111865_25fbb29f760b52e0ffa15b1ed6d5beb9.webp 760w,
/ISSUESlab/post/jury-selection-data/fig3_hud880e1b58177138551867b54448a2f66_111865_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig3_hud880e1b58177138551867b54448a2f66_111865_9ec64eeeaa56598c266ff569f9c536bb.webp"
width="760"
height="464"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Odds ratios by analyzed counties within Mississippi" srcset="
/ISSUESlab/post/jury-selection-data/fig4_hucd77c3107e5a6ae77be75d805d7132a2_138928_4886ba7e6d0f70b5133d2522ca01c0f9.webp 400w,
/ISSUESlab/post/jury-selection-data/fig4_hucd77c3107e5a6ae77be75d805d7132a2_138928_bdd74874533a0423f9f669aff090725d.webp 760w,
/ISSUESlab/post/jury-selection-data/fig4_hucd77c3107e5a6ae77be75d805d7132a2_138928_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig4_hucd77c3107e5a6ae77be75d805d7132a2_138928_4886ba7e6d0f70b5133d2522ca01c0f9.webp"
width="760"
height="464"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="does-defendants-race-matter">Does Defendant&amp;rsquo;s Race Matter?&lt;/h3>
&lt;p>When the defendant is Black, 52.6% of Black jurors are struck versus 9.7% of non-Black jurors. In White-defendant cases, the absolute rates differ (Black: 40.0%, non-Black: 16.2%), but the gap persists. The interaction term (OR = 0.34, p &amp;lt; 0.001) indicates that the disparity is statistically smaller in White-defendant cases but not eliminated.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># A tibble: 4 × 5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> term estimate conf.low conf.high p.value
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;chr&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1 (Intercept) 0.108 0.0946 0.123 4.59e-244
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2 race_groupBlack 10.3 8.69 12.2 4.63e-162
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3 defendant_raceWhite 1.79 1.40 2.27 2.10e- 6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4 race_groupBlack:defendant_raceWhite 0.336 0.242 0.468 9.48e- 11
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Prosecution strike rate by juror race, stratified by defendant race" srcset="
/ISSUESlab/post/jury-selection-data/fig5_hu302c24fbf67c1e7ae4f8bc6a12169e31_114460_1363a78717c40ea2c5c34e925bfad998.webp 400w,
/ISSUESlab/post/jury-selection-data/fig5_hu302c24fbf67c1e7ae4f8bc6a12169e31_114460_bae49c4f2c6048fc8788f80ad283a83c.webp 760w,
/ISSUESlab/post/jury-selection-data/fig5_hu302c24fbf67c1e7ae4f8bc6a12169e31_114460_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig5_hu302c24fbf67c1e7ae4f8bc6a12169e31_114460_1363a78717c40ea2c5c34e925bfad998.webp"
width="760"
height="464"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="time-trend-19922012">Time Trend, 1992–2012&lt;/h3>
&lt;p>Over the span with reasonably complete data, both strike rates drifted downward together, and the gap between them barely moved. As shown by the smoothed (LOESS) trends, the Black-juror strike rate declined modestly while the non-Black rate stayed roughly flat, leaving a gap that began near 38 percentage points and ended near 32, averaging about 37 points across the period. The stability of the gap is the primary takeaway.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Prosecution strike rates by juror race, 1993-2012" srcset="
/ISSUESlab/post/jury-selection-data/fig6_hu1118486cca3fb69df0420005d0d1b16e_335769_81380432fb541a98defb50801194334b.webp 400w,
/ISSUESlab/post/jury-selection-data/fig6_hu1118486cca3fb69df0420005d0d1b16e_335769_e912db63e77b577c621dc0acda93bac8.webp 760w,
/ISSUESlab/post/jury-selection-data/fig6_hu1118486cca3fb69df0420005d0d1b16e_335769_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig6_hu1118486cca3fb69df0420005d0d1b16e_335769_81380432fb541a98defb50801194334b.webp"
width="760"
height="506"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="county-level-poverty">County-level Poverty&lt;/h3>
&lt;p>Six of the seven counties have poverty rates between roughly 22% and 26%, near the Mississippi median (~23%). Carroll County has the lowest poverty rate (~14%) yet the highest odds ratio (17.3). With only seven counties, this cannot support an inferential claim, but there is no visible tendency for poorer counties to show larger disparities, so local economic conditions are not an obvious explanation for the pattern.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="County poverty rates across Mississippi" srcset="
/ISSUESlab/post/jury-selection-data/fig7_hu0325fc86a917d51ed15a114c93d36b4f_237250_114b4ebbc02949099ee3227f9e5a230b.webp 400w,
/ISSUESlab/post/jury-selection-data/fig7_hu0325fc86a917d51ed15a114c93d36b4f_237250_0e1a4a34483718c28871c1c70093688f.webp 760w,
/ISSUESlab/post/jury-selection-data/fig7_hu0325fc86a917d51ed15a114c93d36b4f_237250_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig7_hu0325fc86a917d51ed15a114c93d36b4f_237250_114b4ebbc02949099ee3227f9e5a230b.webp"
width="760"
height="464"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="multilevel-model-accounting-for-clustering">Multilevel Model: Accounting for Clustering&lt;/h3>
&lt;p>Standard logistic regression treats each juror as independent. In reality, jurors in the same trial share a common local context, such as the same prosecutor, judge, defendant, and case facts, creating within-trial correlation. Ignoring this correlation produces artificially narrow confidence intervals. A mixed-effects (multilevel) logistic model accounts for this by estimating a random intercept for each trial.&lt;/p>
&lt;p>The multilevel model yields an OR of 8.55 (95% CI: 7.34–9.95), compared with 7.84 from the simple logistic model. The ICC of 4.5% indicates that approximately 4.5% of the variation in strike decisions reflects between-trial differences, although the majority of the variation is within trials.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># A tibble: 3 × 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Model OR `95% CI` Notes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;lt;chr&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;chr&amp;gt; &amp;lt;chr&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1 Simple logistic (no clustering) 7.84 6.81–9.04 Assumes jurors …
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2 Multilevel logistic (jurors nested in trials) 8.55 7.34–9.95 ICC = 4.5%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3 Multilevel logistic (+ defendant race) 8.54 7.33–9.95 Adjusts for def…
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="the-mathematics-of-exclusion">The Mathematics of Exclusion&lt;/h2>
&lt;h3 id="how-likely-are-all-white-juries">How Likely are All-White Juries?&lt;/h3>
&lt;p>After strikes for cause, 34.8% of the eligible pool in this district was Black. The question is how often an all-White twelve-person jury should appear under race-neutral selection, and how it changes after prosecution strikes are applied.&lt;/p>
&lt;p>Under a reasonable approximation, the chance of seating a twelve-person jury with no Black members from a pool that is 34.8% Black is about 0.6%, roughly 1 in 170. After applying the observed prosecution strike rates, the effective share of Black jurors available at seating falls to about 23.7%, and the probability of an all-White jury rises to about 3.9%, roughly 1 in 26.&lt;/p>
&lt;p>All else equal, the observed strike behavior is associated with an all-White jury becoming about 6.6 times more likely than the race-neutral benchmark.&lt;/p>
&lt;h3 id="across-many-trials">Across Many Trials&lt;/h3>
&lt;p>Small per-trial differences compound across many trials. The table below shows the probability of observing at least one all-White jury under the race-neutral benchmark and under the observed strike rates.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Number of Trials&lt;/th>
&lt;th style="text-align:center">Race-Neutral Selection&lt;/th>
&lt;th style="text-align:center">Observed Strike Rates&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">10&lt;/td>
&lt;td style="text-align:center">5.7%&lt;/td>
&lt;td style="text-align:center">32.7%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">25&lt;/td>
&lt;td style="text-align:center">13.7%&lt;/td>
&lt;td style="text-align:center">62.8%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">50&lt;/td>
&lt;td style="text-align:center">25.4%&lt;/td>
&lt;td style="text-align:center">86.1%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">100&lt;/td>
&lt;td style="text-align:center">44.4%&lt;/td>
&lt;td style="text-align:center">98.1%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">500&lt;/td>
&lt;td style="text-align:center">94.7%&lt;/td>
&lt;td style="text-align:center">100.0%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">1,000&lt;/td>
&lt;td style="text-align:center">99.7%&lt;/td>
&lt;td style="text-align:center">100.0%&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="observed-versus-expected">Observed Versus Expected&lt;/h3>
&lt;p>Across 218 trials with complete jury-composition data, 14 juries contained no Black members. Under the race-neutral benchmark, the expected count is about 1.3. Therefore, the observed number is roughly 11 times the benchmark. An exact binomial test rejects a race-neutral process at p &amp;lt; .001.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Observed all-white juries versus the expectation under random selection" srcset="
/ISSUESlab/post/jury-selection-data/fig8_hub552ecd67a6574adfdb81be00c7901c3_118647_fc44b1182167f062e230d2bd6cb14615.webp 400w,
/ISSUESlab/post/jury-selection-data/fig8_hub552ecd67a6574adfdb81be00c7901c3_118647_1e2e4a173240f3840692f9288c7f3b6d.webp 760w,
/ISSUESlab/post/jury-selection-data/fig8_hub552ecd67a6574adfdb81be00c7901c3_118647_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/jury-selection-data/fig8_hub552ecd67a6574adfdb81be00c7901c3_118647_fc44b1182167f062e230d2bd6cb14615.webp"
width="760"
height="464"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="what-these-data-canand-cannottell-us">What These Data Can—and Cannot—Tell Us&lt;/h2>
&lt;p>Every trial here was appealed, and appeal is not random, so the rates (the 49.8% strike rate, the &amp;ldquo;1 in 26&amp;rdquo; probability, the per-trial figures) describe this non-random set of trials, not jury selection in the district at large or elsewhere. But selection bias cannot easily explain the disparity&amp;rsquo;s direction, consistency, and magnitude: an eightfold odds ratio that survives adjustment for county and defendant race, appears in every county at p &amp;lt; 0.001, and holds even when the defendant is White is not what a selection artifact looks like.&lt;/p>
&lt;p>The data still cannot establish intent by any prosecutor or why any particular juror was struck; those turn on voir dire responses and case-specific reasons absent here. What it shows is an aggregate disparity: prosecutors struck Black eligible jurors at far higher rates than non-Black jurors, and 14 of 218 trials produced all-White juries, where a binomial model based on each county&amp;rsquo;s Black share predicts only about 1.3. That does not prove discrimination, but it sharpens the question the Anthony trial revived: if race-based exclusion is unconstitutional, why do disparities this large persist decades after &lt;em>Batson&lt;/em>?&lt;/p>
&lt;hr>
&lt;h2 id="transparency-data-and-the-future-of-jury-selection-analysis">Transparency, Data, and the Future of Jury Selection Analysis&lt;/h2>
&lt;p>Debates about jury selection tend to run on speculation and competing narratives precisely because the underlying records are rarely available for independent evaluation. When data do exist, analyzing them is not straightforward, and the results must be read within an appropriate legal and statistical frame, including an unbiased account of how the data were chosen, cleaned, and analyzed.&lt;/p>
&lt;p>Expanding access to court records, voir dire transcripts, and structured jury-selection datasets would let researchers, journalists, attorneys, and the public assess claims with evidence rather than assumption, and would let the kind of selection problem flagged above be measured rather than merely conceded.&lt;/p></description></item><item><title>How to Analyze Caselaw Using CourtListener's API in R</title><link>https://issues-osu.github.io/ISSUESlab/post/courtlistener-icwa-r/</link><pubDate>Fri, 01 Aug 2025 00:00:00 +0000</pubDate><guid>https://issues-osu.github.io/ISSUESlab/post/courtlistener-icwa-r/</guid><description>&lt;p>I previously showed how to pull Indian Child Welfare Act (ICWA) cases using the Caselaw Access Project (Harvard Law). That API has since changed. This post updates the workflow using the Free Law Project&amp;rsquo;s &lt;a href="https://www.courtlistener.com/" target="_blank" rel="noopener">CourtListener&lt;/a>, which now partners with Harvard to make this data freely available.&lt;/p>
&lt;hr>
&lt;h2 id="finding-the-cases">Finding the Cases&lt;/h2>
&lt;p>Start at the &lt;a href="https://www.courtlistener.com/" target="_blank" rel="noopener">CourtListener website&lt;/a> and search for &lt;strong>&amp;ldquo;Indian Child Welfare Act&amp;rdquo;&lt;/strong> (or &lt;code>&amp;quot;icwa&amp;quot;&lt;/code>). You&amp;rsquo;ll see a page of opinion results.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="CourtListener website search results for ICWA" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig1_hufedd63f6ad123f7c354dd78648837004_144176_858ec2311db5cf01cf179ac1ae6254fc.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig1_hufedd63f6ad123f7c354dd78648837004_144176_8deecacb87864cc5f171956ae3f4fdc8.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig1_hufedd63f6ad123f7c354dd78648837004_144176_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig1_hufedd63f6ad123f7c354dd78648837004_144176_858ec2311db5cf01cf179ac1ae6254fc.webp"
width="760"
height="229"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Click &lt;strong>Select Jurisdiction → State&lt;/strong>. Clear all, then select &lt;strong>Ohio Supreme Court&lt;/strong>, &lt;strong>Ohio Court of Appeals&lt;/strong>, and &lt;strong>Ohio Court of Claims&lt;/strong>. This gives you a quick check on the expected volume to validate the code&amp;rsquo;s output below.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Subsetting the search results to Ohio courts" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig2_hu122e30f40a4ef7585c2df1ce9f5ce1f7_199812_fdd8726a5d6cf47b82e146e15dc74d97.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig2_hu122e30f40a4ef7585c2df1ce9f5ce1f7_199812_8e57278d18ae611a8873ca58375d7e82.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig2_hu122e30f40a4ef7585c2df1ce9f5ce1f7_199812_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig2_hu122e30f40a4ef7585c2df1ce9f5ce1f7_199812_fdd8726a5d6cf47b82e146e15dc74d97.webp"
width="760"
height="224"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>The site reported &lt;strong>36 cases&lt;/strong> from Ohio. Note that the exact number may change over time as new opinions are added or metadata is corrected.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Ohio search results showing 36 opinions" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig3_hu5e88e226ba997a0358e9da868c72015b_200058_a549f31bec1e2feee89caa69dd78e31d.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig3_hu5e88e226ba997a0358e9da868c72015b_200058_a7534a55a8ff289dbf65610b866d76bf.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig3_hu5e88e226ba997a0358e9da868c72015b_200058_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig3_hu5e88e226ba997a0358e9da868c72015b_200058_a549f31bec1e2feee89caa69dd78e31d.webp"
width="760"
height="266"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="getting-the-data-into-r">Getting the Data into R&lt;/h2>
&lt;p>The Search API returns clean JSON results by querying for opinions that contain the exact phrase &lt;code>&amp;quot;indian child welfare act&amp;quot;&lt;/code>, restricting to published opinions, ordering by relevance, and (optionally) limiting results to three Ohio courts.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">httr2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">purrr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dplyr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tibble&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tidyr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stringr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SEARCH_BASE&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#34;https://www.courtlistener.com/api/rest/v4/search/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">UA&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#34;R/httr2 (your-email-address) – ICWA metadata collection&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">query_params&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#39;&amp;#34;indian child welfare act&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;o&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">order_by&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;score desc&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">stat_Published&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;on&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">court&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;ohio ohioctapp ohioctcl&amp;#34;&lt;/span> &lt;span class="c1"># optional: specify court&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A few helper functions keep the parsing tidy:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">pull_chr&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">purrr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">pluck&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">...&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.default&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">is.null&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">NA_character_&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">as.character&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pull_num&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">...&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">purrr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">pluck&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">...&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.default&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA_real_&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">suppressWarnings&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">as.numeric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">get_json&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">request&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_user_agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UA&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_url_query&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_perform&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">resp_check_status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">resp_body_json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">simplifyVector&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This function handles pagination automatically, following the &lt;code>next&lt;/code> cursor until all pages are exhausted:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">fetch_search_pages&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">req&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">request&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SEARCH_BASE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">req_user_agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UA&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">req_url_query&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">!!!&lt;/span>&lt;span class="n">query_params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dat&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">req&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_perform&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nf">\&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">){&lt;/span> &lt;span class="nf">resp_check_status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="nf">resp_body_json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">simplifyVector&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">})()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pages&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dat&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nf">is.null&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dat&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">`next`&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dat&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">request&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dat&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">`next`&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_user_agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UA&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_perform&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nf">\&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">){&lt;/span> &lt;span class="nf">resp_check_status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="nf">resp_body_json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">simplifyVector&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">})()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pages&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pages&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dat&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pages&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pages&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">fetch_search_pages&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">results&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">pages&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;results&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">flatten&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>results&lt;/code> is a list of per-case records from the API. Each element includes the case name, filing date, court identifiers, citation strings, a public URL where the caselaw text is available, and other metadata.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="R dataframe showing key case fields: case_name, date_filed, court_name, absolute_url" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig4_hudc5134a08a65892976a37d19c679cab2_374030_2e88eef7a45bc40fa02fdff57d84c434.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig4_hudc5134a08a65892976a37d19c679cab2_374030_a9387f449e4d6d53fc71f30cd65bfe11.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig4_hudc5134a08a65892976a37d19c679cab2_374030_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig4_hudc5134a08a65892976a37d19c679cab2_374030_2e88eef7a45bc40fa02fdff57d84c434.webp"
width="760"
height="188"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>For Ohio, this produced ~35 unique case names versus 36 displayed on the site. Minor discrepancies happen because search hits can include multiple opinions or sibling opinions per matter, and because the index is updated over time.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Unique case names returned by the API" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig5_hu3c29cd48dcbcfd9382d962e9753aa742_147152_ba89c03f91ed10def567895987722d74.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig5_hu3c29cd48dcbcfd9382d962e9753aa742_147152_2c0693c596b1513aa7b5080a8a1775e5.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig5_hu3c29cd48dcbcfd9382d962e9753aa742_147152_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig5_hu3c29cd48dcbcfd9382d962e9753aa742_147152_ba89c03f91ed10def567895987722d74.webp"
width="760"
height="387"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="downloading-the-full-text">Downloading the Full Text&lt;/h2>
&lt;p>Each opinion has an API endpoint with plain-text and HTML fields. A small loop can request the text for each case URL, with a short pause and retry between requests, and save one &lt;code>.txt&lt;/code> file per opinion:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">download_opinion_text&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">out_dir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;opinions&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">dir.create&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">showWarnings&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">slug&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">basename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">path&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">file.path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">slug&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;.txt&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">request&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_user_agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UA&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span> &lt;span class="nf">req_perform&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">resp_check_status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">body&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">resp_body_json&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">simplifyVector&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">text&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">body&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">plain_text&lt;/span> &lt;span class="o">%||%&lt;/span> &lt;span class="n">body&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">html_with_citations&lt;/span> &lt;span class="o">%||%&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">writeLines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">Sys.sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0.5&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># be considerate of rate limits&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">invisible&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">walk&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">map_chr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">results&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;absolute_url&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">download_opinion_text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here are the Ohio ICWA cases downloaded to a local folder:&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Downloaded ICWA case text files on local computer" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig6_huaad99f694e56ccd893d73b61055c332d_261998_44210b1d46e71791a593d3384554425f.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig6_huaad99f694e56ccd893d73b61055c332d_261998_a230df0781107c333ffc62a4f068cdd4.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig6_huaad99f694e56ccd893d73b61055c332d_261998_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig6_huaad99f694e56ccd893d73b61055c332d_261998_44210b1d46e71791a593d3384554425f.webp"
width="760"
height="342"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="visualizing-the-results">Visualizing the Results&lt;/h2>
&lt;p>You can use &lt;code>ggplot2&lt;/code> to visualize the results. Below are two examples: filings by year and volume by court.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="ICWA cases filed by year, 1980–2025" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig7_hu00119959f92dd6f2ce884fccc8491311_95527_a84503cc07b50634a0a5d2d5518fdaa0.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig7_hu00119959f92dd6f2ce884fccc8491311_95527_51ef58d3c973c6fcc36abd3df2c07f7d.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig7_hu00119959f92dd6f2ce884fccc8491311_95527_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig7_hu00119959f92dd6f2ce884fccc8491311_95527_a84503cc07b50634a0a5d2d5518fdaa0.webp"
width="760"
height="436"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Top 25 jurisdictions by number of ICWA opinions" srcset="
/ISSUESlab/post/courtlistener-icwa-r/fig8_hu4b954f7c70532a5f2c37f702acdb9a57_335292_e7e200fd88be81aed8f9efba5ac6ad7d.webp 400w,
/ISSUESlab/post/courtlistener-icwa-r/fig8_hu4b954f7c70532a5f2c37f702acdb9a57_335292_ac1f9785b21242d986d64feee6b6db6e.webp 760w,
/ISSUESlab/post/courtlistener-icwa-r/fig8_hu4b954f7c70532a5f2c37f702acdb9a57_335292_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/courtlistener-icwa-r/fig8_hu4b954f7c70532a5f2c37f702acdb9a57_335292_e7e200fd88be81aed8f9efba5ac6ad7d.webp"
width="760"
height="394"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="what-you-can-do-next">What You Can Do Next&lt;/h2>
&lt;p>After downloading all data — including caselaw text and metadata — you can:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Natural Language Processing&lt;/strong> — examine sentiment or common words across opinions&lt;/li>
&lt;li>&lt;strong>Topic Modeling&lt;/strong> — explore latent themes in ICWA cases using LDA or STM&lt;/li>
&lt;li>&lt;strong>Map filings by jurisdiction&lt;/strong> — visualize geographic patterns of ICWA litigation&lt;/li>
&lt;li>&lt;strong>Integrate with other sources&lt;/strong> — link to child welfare administrative data or Census indicators&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Remember to be considerate of rate limits and to include a &lt;strong>User Agent string&lt;/strong> with your contact information in every request.&lt;/p>
&lt;/blockquote>
&lt;p>The complete workflow is available on my &lt;a href="https://github.com/" target="_blank" rel="noopener">GitHub&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Happy Coding!&lt;/strong>&lt;/p></description></item><item><title>A PostgreSQL Tutorial for Analyzing Racial and Geographic Disparities in HMDA Applications</title><link>https://issues-osu.github.io/ISSUESlab/post/hmda-postgresql-tutorial/</link><pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate><guid>https://issues-osu.github.io/ISSUESlab/post/hmda-postgresql-tutorial/</guid><description>&lt;p>My lab recently published a paper examining the association between redlining, reinvestment, racial segregation, and firearm-related injury in Chicago, Illinois. You can read the paper here: &lt;a href="https://doi.org/10.1007/s11524-023-00770-7" target="_blank" rel="noopener">Redlining, reinvestment, and racial segregation: a Bayesian spatial analysis of mortgage lending trajectories and firearm-related violence&lt;/a>.&lt;/p>
&lt;p>To develop reverse redlining measures, we relied on data from the &lt;strong>Home Mortgage Disclosure Act (HMDA)&lt;/strong>.&lt;/p>
&lt;p>If you&amp;rsquo;re interested in patterns of lending discrimination, the HMDA dataset is an invaluable resource. It contains millions of individual loan application records submitted annually by financial institutions, making it one of the most extensive and detailed public data sources on mortgage lending in the United States. The 2024 nationwide Modified Loan/Application Register (LAR) alone contains over &lt;strong>12 million records&lt;/strong> and &lt;strong>85 fields&lt;/strong> that detail applicant and co-applicant demographics, loan terms, and property characteristics — including race, income, loan amount, interest rate, property value, and loan outcomes.&lt;/p>
&lt;p>Each record includes the &lt;strong>census tract&lt;/strong> of the loan origination, which allows researchers to situate applicants within their geographic context. This spatial identifier can be linked to other data sources (e.g., Census or ACS data), enabling robust analyses of racial disparities in lending, neighborhood-level disinvestment, and broader patterns of residential inequality.&lt;/p>
&lt;blockquote>
&lt;p>I highly recommend &lt;em>The Color of Law&lt;/em> by Richard Rothstein for anyone interested in the deep-rooted history of discriminatory housing practices in the United States. The book compellingly explains how federal, state, and local policies intentionally created and reinforced de jure segregation. Chicago, one of the most highly segregated urban areas in the country, is prominently featured.&lt;/p>
&lt;/blockquote>
&lt;p>Due to its sheer volume, the HMDA data is not well-suited for analysis using spreadsheets like Excel — particularly when analyzing multiple years or conducting joins. Instead, its relational structure lends itself to &lt;strong>PostgreSQL&lt;/strong>, an open-source relational database management system (RDBMS) that enables efficient querying, filtering, and aggregation of large datasets. PostgreSQL also supports the &lt;strong>PostGIS&lt;/strong> geospatial extension, enabling direct spatial querying and linking to geographic units such as census tracts or ZIP codes. &lt;a href="https://www.postgresql.org/download/" target="_blank" rel="noopener">Download PostgreSQL&lt;/a> if you don&amp;rsquo;t already have it.&lt;/p>
&lt;hr>
&lt;h2 id="step-1-download-the-dataset">Step 1: Download the Dataset&lt;/h2>
&lt;p>The dataset is freely available to the public.&lt;/p>
&lt;ol>
&lt;li>Navigate to &lt;a href="https://ffiec.cfpb.gov/data-publication/modified-lar/2024" target="_blank" rel="noopener">https://ffiec.cfpb.gov/data-publication/modified-lar/2024&lt;/a>&lt;/li>
&lt;li>Choose &lt;strong>Year: 2024&lt;/strong> → &lt;strong>Nationwide: Combined file&lt;/strong>&lt;/li>
&lt;li>Check &lt;strong>Include File Header&lt;/strong>, then click &lt;strong>Download Combined Modified LAR with Header&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="FFIEC download page showing the 2024 Combined Modified LAR download option" srcset="
/ISSUESlab/post/hmda-postgresql-tutorial/fig1_huf3acc55358793b6942a53fb016483371_303975_74d31daffd39a7781127872bbf9d4e22.webp 400w,
/ISSUESlab/post/hmda-postgresql-tutorial/fig1_huf3acc55358793b6942a53fb016483371_303975_d7986527b5c4185ac72c97f7337f11c1.webp 760w,
/ISSUESlab/post/hmda-postgresql-tutorial/fig1_huf3acc55358793b6942a53fb016483371_303975_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/hmda-postgresql-tutorial/fig1_huf3acc55358793b6942a53fb016483371_303975_74d31daffd39a7781127872bbf9d4e22.webp"
width="760"
height="714"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;ol start="4">
&lt;li>Save or extract the file to: &lt;code>C:\Users\YOUR_USER_NAME\Downloads\2024_combined_mlar_header\&lt;/code>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="step-2-confirm-the-file-structure-in-powershell">Step 2: Confirm the File Structure in PowerShell&lt;/h2>
&lt;p>The file is a &lt;strong>pipe-delimited &lt;code>.txt&lt;/code> file&lt;/strong> — it can be tricky to read in spreadsheet tools. Use Windows PowerShell to inspect the structure first:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd &lt;/span>&lt;span class="s2">&amp;#34;C:\Users\YOUR_USER_NAME\Downloads\2024_combined_mlar_header&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># View the header (column names)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-Content&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">2024_combined_mlar_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">txt&lt;/span> &lt;span class="n">-TotalCount&lt;/span> &lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Count the number of columns (should be 85)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">((&lt;/span>&lt;span class="nb">Get-Content&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">2024_combined_mlar_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">txt&lt;/span> &lt;span class="n">-TotalCount&lt;/span> &lt;span class="mf">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">-split&lt;/span> &lt;span class="s1">&amp;#39;\|&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">Count&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="step-3-create-the-postgresql-table">Step 3: Create the PostgreSQL Table&lt;/h2>
&lt;p>Launch your SQL interface (pgAdmin Query Tool or &lt;code>psql&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">psql -U your_username -d your_database_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then define the 85-column table structure:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">lar2024&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">lar2024&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">activity_year&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">lei&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">loan_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">loan_purpose&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">preapproval&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">construction_method&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">occupancy_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">loan_amount&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">BIGINT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">action_taken&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">state_code&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">county_code&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">census_tract&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_ethnicity_1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_ethnicity_2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_ethnicity_3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_ethnicity_4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_ethnicity_5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_ethnicity_1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_ethnicity_2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_ethnicity_3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_ethnicity_4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_ethnicity_5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_ethnicity_observed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_ethnicity_observed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_race_1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_race_2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_race_3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_race_4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_race_5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_race_1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_race_2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_race_3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_race_4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_race_5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_race_observed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_race_observed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_sex&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_sex&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_sex_observed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_sex_observed&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_age&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_age_above_62&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_age&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_age_above_62&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">income&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">purchaser_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">rate_spread&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">hoepa_status&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">lien_status&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">applicant_credit_scoring_model&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">co_applicant_credit_scoring_model&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">denial_reason_1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">denial_reason_2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">denial_reason_3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">denial_reason_4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">total_loan_costs&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">total_points_and_fees&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">origination_charges&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">discount_points&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">lender_credits&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">interest_rate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">prepayment_penalty_term&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">debt_to_income_ratio&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">combined_loan_to_value_ratio&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">loan_term&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">intro_rate_period&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">balloon_payment&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">interest_only_payment&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">negative_amortization&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">other_non_amortizing_features&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">property_value&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">manufactured_home_secured_property_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">manufactured_home_land_property_interest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">total_units&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">multifamily_affordable_units&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">submission_of_application&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">initially_payable_to_institution&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">aus_1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">aus_2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">aus_3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">aus_4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">aus_5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">reverse_mortgage&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">open_end_line_of_credit&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">business_or_commercial_purpose&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INTEGER&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="step-4-import-the-data">Step 4: Import the Data&lt;/h2>
&lt;p>In &lt;code>psql&lt;/code>, use the following single-line import command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="err">\&lt;/span>&lt;span class="k">copy&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">lar2024&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;C:/Users/YOUR-USER-NAME/Downloads/2024_combined_mlar_header/2024_combined_mlar_header.txt&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FORMAT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">csv&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DELIMITER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;|&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">HEADER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This tells PostgreSQL to:&lt;/p>
&lt;ul>
&lt;li>Read a pipe-delimited file&lt;/li>
&lt;li>Use the header row to match columns&lt;/li>
&lt;li>Treat empty strings as &lt;code>NULL&lt;/code>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong> This must be entered as a &lt;strong>single line&lt;/strong>. You will get a confirmation message when the data import succeeds.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="step-5-verify-the-import">Step 5: Verify the Import&lt;/h2>
&lt;p>The official CFPB download page indicates that the 2024 nationwide file contains approximately &lt;strong>12 million rows&lt;/strong>. After importing, verify with:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">COUNT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">lar2024&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">lar2024&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If the row count is substantially less than 12 million, the import did not complete successfully.&lt;/p>
&lt;hr>
&lt;h2 id="create-the-chicago-illinois-subset">Create the Chicago, Illinois Subset&lt;/h2>
&lt;p>With the full dataset loaded, you can create a focused subset with a &lt;code>CREATE TABLE AS SELECT&lt;/code> statement. The query below selects &lt;strong>conventional, owner-occupied, site-built single-family loans&lt;/strong> in Cook County (FIPS &lt;code>17031&lt;/code>), excluding missing or exempt values:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">DROP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IF&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">EXISTS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">public&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">il2024f1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">public&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">il2024f1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">activity_year&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">state_code&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">county_code&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">census_tract&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">debt_to_income_ratio&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">combined_loan_to_value_ratio&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">income&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">property_value&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">loan_amount&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">interest_rate&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">applicant_ethnicity_1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">applicant_race_1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">denial_reason_1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">rate_spread&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hoepa_status&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">lien_status&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">public&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">lar2024&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">loan_purpose&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- Home purchase
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">action_taken&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- Loan originated
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">loan_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- Conventional
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">occupancy_type&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- Owner-occupied
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">state_code&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;IL&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">county_code&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;17031&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- Cook County
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">property_value&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;^[0-9]+$&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">income&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">~&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;^[0-9]+$&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">loan_amount&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">loan_amount&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;lt;&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">99999&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">construction_method&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- Site-built
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">l&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">total_units&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;2&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;4&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="prepare-for-additional-analysis">Prepare for Additional Analysis&lt;/h2>
&lt;p>Once exported to CSV, I divided the number of Black applicants in each census tract by the total number of applicants in that tract to get the &lt;strong>share of Black applicants&lt;/strong>. I also downloaded Median Household Income data using the &lt;code>tidycensus&lt;/code> package in R (ACS 5-year estimates 2018–2023).&lt;/p>
&lt;p>The maps below compare neighborhood income levels with the geographic concentration of Black mortgage applicants receiving loans in 2024. Do you observe any patterns?&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Comparison of Median Household Income (ACS 5-year estimates 2018–2023) and share of Black applicants receiving loans aggregated to Chicago census tracts (2024 HMDA)" srcset="
/ISSUESlab/post/hmda-postgresql-tutorial/fig2_hueacb9092e582450de0791f901579b1cb_422480_98fef7106e574f4a2810c82538006229.webp 400w,
/ISSUESlab/post/hmda-postgresql-tutorial/fig2_hueacb9092e582450de0791f901579b1cb_422480_f1c10eb3047fc7afbdbf18a3f3997f9e.webp 760w,
/ISSUESlab/post/hmda-postgresql-tutorial/fig2_hueacb9092e582450de0791f901579b1cb_422480_1200x1200_fit_q80_h2_lanczos_3.webp 1200w"
src="https://issues-osu.github.io/ISSUESlab/ISSUESlab/post/hmda-postgresql-tutorial/fig2_hueacb9092e582450de0791f901579b1cb_422480_98fef7106e574f4a2810c82538006229.webp"
width="760"
height="295"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>The spatial overlap — or rather, the striking lack of it — between high-income areas and Black loan recipients is consistent with decades of research documenting structural barriers to homeownership for Black families in Chicago.&lt;/p>
&lt;hr>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>The HMDA dataset offers an unparalleled opportunity to examine lending patterns, racial disparities, and neighborhood-level investment across the United States. By importing the 2024 Modified LAR into PostgreSQL, researchers can efficiently manage, filter, and analyze millions of records while linking them to geographic and demographic data.&lt;/p>
&lt;p>&lt;strong>Next steps may include:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Join with Census shapefiles to visualize patterns by tract&lt;/li>
&lt;li>Summarize by loan purpose, race, or geography&lt;/li>
&lt;li>Export to PostGIS for spatial queries&lt;/li>
&lt;li>Link to neighborhood typologies or redlining indices&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Happy Coding!&lt;/strong>&lt;/p></description></item></channel></rss>