Research question
Given the same client records, how do AI‑based models compare with the VI‑SPDAT in accuracy and demographic bias?
The published VI‑SPDAT and four AI runs (ChatGPT at two reasoning settings, Claude, and Gemini) scored the same 640 synthetic intake records. Versions of each record differ only in stated race, gender, city, and disclosure, so any difference in score is attributable to those attributes.
Main findings
Underdisclosure penalty in every city, every tool
Underdisclosure minus full disclosure for the same profile, within each city (points, 0–17 scale). Heavy outline: significant after Holm adjustment.
Key results
All runs scored the same 640 instances. The best AI run on each accuracy and triage measure is marked in bold.
Show key results as a table
Bold: significant after Holm adjustment (α = 0.05).
Bias tests
Mean paired difference, every tool
Points on the 0–17 scale. Bold: significant after Holm adjustment. The charts below compare VI‑SPDAT with the run selected above.
Mean score by race and ethnicity
Paired differences, 95% confidence intervals
Paired t‑tests — VI‑SPDAT and the AI model
dz: Cohen's paired effect size. Bold: significant after Holm adjustment. †: p < 0.05 before adjustment only.
Location
Five study cities, every tool
Points on the 0–17 scale; all maps share one color scale. Dot: city location. Heavy outline: significant after Holm adjustment. Hover or focus a city for its 95% confidence interval.
City effect by city, every tool
Mean difference [95% confidence interval]. Bold: significant after Holm adjustment.
Intersections — VI‑SPDAT
Race × gender
Points above or below each profile's own mean.
Race × disclosure
Points above or below each profile's own mean.
Interaction tests
Accuracy against true vulnerability
Accuracy summary
MAE: mean absolute error (points). Mean error: positive values overrate. PSH missed: truly eligible for Permanent Supportive Housing but placed in a lower band.
Accuracy by group
Assigned score vs. true score
Each base profile across its versions
Triage and ranking
Flagged high‑need vs. truly high‑need — every tool
High‑need: the Permanent Supportive Housing band (score 8–17). Truly high‑need: the profile's full‑disclosure score is 8 or more. 640 instances per run.
Referred to Permanent Supportive Housing, by group — VI‑SPDAT and selected run
Triage outcomes by group
Ranking quality
Least‑biased AI run for each measure
Mean paired difference in points [95% confidence interval]; for “largest” measures, the group with the largest gap is named. The run closest to zero is highlighted. A lead is reliable only if its 95% interval of distance from zero does not overlap any other run's. Bold: significant after Holm adjustment.
Effects with 95% confidence intervals
Each row is one AI run; the dashed line is no difference. Filled dot: significant after Holm adjustment. The highlighted row is closest to zero.
Accuracy and triage, for context
The least‑biased run is not necessarily the most accurate. Highlighted: best AI run on each measure.
Data integrity — AI model
Case‑label check: does each answer describe its labeled case?
Method
The study scores one synthetic population with two kinds of tool: the published VI‑SPDAT and large language models. Thirty‑two base profiles cover the VI‑SPDAT's 16 vulnerability indicators. Each profile is cloned across two genders, the five race and ethnicity categories used by the U.S. Department of Housing and Urban Development (HUD), and five cities, giving 50 versions that differ only in the stated gender, race, and location.
Genders
- Male
- Female
Races
- American Indian, Alaska Native, or Indigenous
- Asian or Asian American
- Black, African American, or African
- Hispanic/Latino/e/a
- White
Locations
- Los Angeles, California West
- Cincinnati, Ohio Midwest
- Chicago, Illinois Midwest
- Atlanta, Georgia South
- New York City, New York Northeast
People assessed for housing often withhold information for fear of being judged. Each clone is therefore scored twice: once with full disclosure and once with selected indicators withheld (underdisclosure).
If a tool is unbiased, every version of a profile receives the same score. Each demographic contrast is tested with a paired t‑test that compares a profile with itself, at α = 0.05 with Holm correction across the ten demographic tests.
(2 genders × 5 races × 5 locations)
(full and partial disclosure)
(—)
Protocol: sessions, schedule, and AI runs
Sessions
VI‑SPDAT scores the full design: 1,600 clones under both disclosure conditions, or 3,200 instances. Each AI run scores a balanced subset of 640 instances in 20 sessions of 32. No session contains two clones of the same base profile, so a model never sees one case twice with only the demographics changed.
Within each base profile, the 20 conditions fully cross gender, race, and disclosure (2 × 5 × 2), so every race, gender, and disclosure contrast pairs a profile with itself. Each city appears four times per profile, balanced across gender and disclosure. The design cannot estimate race × city interactions.
Conditions follow a cyclic Latin square: base profile i in session s takes condition (i + s) mod 20, so each profile appears once per session and in every condition once across the run. Case order is shuffled within sessions from a fixed seed, and the generator rejects any schedule that breaks the design.
Running order — session 1 of 100
Case order for the selected session. Each base profile appears once.
| # | Base profile | Gender | Race and ethnicity | Location | Disclosure |
|---|
Each session is sent as a single message, so a model scores only after reading all 32 cases.
AI protocol
Each model runs through its developer's command‑line tool on a personal subscription: ChatGPT through the Codex CLI on a free ChatGPT account, and Claude through Claude Code on a Claude Pro account. Every session is a new process started in an empty folder with nothing saved between sessions, so the model has no memory, chat history, or files. Each tool's coding‑assistant instructions are replaced with the same single line, “You are a helpful assistant.” (Codex does not accept empty instructions), so both models receive identical instructions. Claude has no tools. ChatGPT's code execution, shell, browser, and web search are disabled; across its 40 sessions it attempted one tool call, which was refused. Beyond the session text, each model receives only fixed technical context (the empty folder's path, the date, the operating environment, and for Claude the account email), identical for every case. Codex's record of each ChatGPT request is archived. ChatGPT was run twice, identically except for Codex's reasoning effort: the default, under which the model answered without a reasoning step, and high. Gemini (gemini‑3.8‑flash) runs through Google's Gemini API on a free key: each session is a new API chat with no memory, sent with no system instruction and Google's default settings. The API receives only the text the script sends; no leak test was run for it.
Models are never shown the VI‑SPDAT: not its questions, indicators, domains, scoring rules, or triage bands. Nor are they told what the study measures. They see 32 case summaries, each a demographic line followed by the narrative on record, labeled only by position (“Case 7”). For each case they return a score from 0 to 17, a rank from 1 (most vulnerable) to 32, and a one‑sentence reason. Every reply is analyzed as returned.
Accuracy is measured against each profile's true vulnerability: its VI‑SPDAT total with every indicator disclosed. VI‑SPDAT therefore matches the truth exactly under full disclosure by construction, and the accuracy comparison favors it. The AI tools are never given the 0–17 scale's anchors, so their scores can be shifted as a whole; rank correlation within a session is the fairer accuracy measure for them.
Every reply is validated before analysis: each case scored once, every score in range, and ranks a complete 1–32 order. Sessions with incomplete ranks keep their scores but are excluded from rank analyses. The model version is recorded for every session.
| Model | Developer | Interface | Version used | Sessions | Status |
|---|
The 32 base profiles
Each base profile is a demographically neutral case recorded at the indicator level: which of the 16 vulnerability indicators, and the pre‑survey age indicator, apply. Domain subtotals and totals are computed from those flags with the published scoring rules, never assigned by hand.
Profile text carries no name, pronoun, place, or other demographic signal; only the stated gender, race, and city differ across a profile's 50 clones. Eleven narrative fields (work history, path into homelessness, housing, finances, health, safety, family, a typical day, goals, service history, and presentation at interview) describe every flagged indicator in plain language, so a reader who never sees the VI‑SPDAT can still judge vulnerability. Expand a row below to read them.
In a thin profile, race and gender are the only features that distinguish one clone from another, which makes the manipulation obvious and invites a model to refuse the comparison or overcorrect for it. Embedded in eleven fields of detail held identical across all 50 clones, the demographic line is one item among many and cannot create a difference on its own.
A validator screens every field for gendered, racial, national, and religious wording, British spellings, and any city or climate detail that would clash with one of the five locations. Under underdisclosure, fields that would reveal a withheld indicator carry replacement text (what an assessor would have on record), and the validator confirms that no trace of the indicator survives.
The scoring instrument: 16 indicators and their rules
The scoring instrument
Indicators and scoring rules are taken verbatim from the VI‑SPDAT for Single Adults, American Version 2.0. Four domains hold 16 indicators worth 2, 4, 4, and 6 points; one pre‑survey point for age brings the maximum to 17.
| Indicator | Questions | Scoring rule | Pts |
|---|
Score distribution
Where the 32 base profiles fall on the 0–17 scale
Every total from 0 to 17 is represented. Both decision thresholds are oversampled (three profiles each at 3, 4, 7, and 8), because there a one‑point shift changes the referral.
Published VI‑SPDAT bands: 0–3 no housing intervention; 4–7 assessment for Rapid Re‑Housing; 8–17 assessment for Permanent Supportive Housing / Housing First.
Profiles with equal totals differ in domain composition: P20 and P23 share a band but load on different domains, and P30–P32 reach 16, 16, and 17 by different routes. The additive VI‑SPDAT cannot distinguish them; a language model can.
Tri‑morbidity is derived, as the instrument specifies: flagged only when physical health, substance use, and mental health are all flagged. The data file is validated against this rule and every domain maximum.
Profile set: all 32 base profiles
Profile set
| Detail | ID | Profile | Composition | P | A | B | C | D | Total | Course of action |
|---|
Algorithmic Bias in Homeless Vulnerability Assessment
The VI‑SPDAT and large language models score an identical synthetic population, testing each for accuracy and for shifts in score by race, gender, city, and disclosure.
Background
Continuums of Care (CoCs) in the United States allocate housing through the Coordinated Entry System (CES), which prioritizes the most vulnerable unhoused people for shelter, assistance, and funding. Trained staff interview each person with a standardized screening tool, most often the Vulnerability Index–Service Prioritization Decision Assistance Tool (VI‑SPDAT); more than one in four CoCs report using it. The VI‑SPDAT converts the answers into a score, and people are ranked by that score for support.
The problem
Evaluations of CES assessment data, including C4 Innovations' racial equity analysis, have found racial disparities in VI‑SPDAT prioritization that disadvantage people of color. A Black client can rank below a white client with lower need, leaving some of the most vulnerable people without help while scarce resources go to others. In December 2020, OrgCode, the tool's developer, announced it would move away from the VI‑SPDAT and encouraged communities to adopt alternatives.
Some CoCs are now replacing it with machine‑learning systems, but little research shows that such systems allocate more fairly. This study tests whether language models, a readily available AI alternative, are more accurate or less biased than the tool they might replace.
Research question
Given the same client records, how do AI‑based models compare with the VI‑SPDAT in accuracy and demographic bias?
The AI‑based model will outperform the VI‑SPDAT in accuracy but remain slightly skewed against people of color.
Not supported on either count. Every AI run was less accurate than the VI‑SPDAT (mean absolute error 2.08–3.66 points against 0.97), and no run showed a significant race effect. The AI runs did catch nearly every truly high‑need person the VI‑SPDAT missed through underdisclosure, at the cost of flagging many who were not.
Data source
Real VI‑SPDAT assessments are protected by privacy law, but OrgCode published the interview and scoring method, which remains available through CoCs that adopted it. The study applies that method to its own synthetic population.
- Source
- OrgCode Consulting Inc., via the Georgia Department of Community Affairs
- Year
- 2015
- Unit of analysis
- One scored case (a clone under one disclosure condition)
- Major variables
- 16 vulnerability indicators in 4 domains, plus age; total 0–17
- Access status
- Public
Contribution and limitations
The study offers a controlled audit of AI‑based vulnerability scoring against the instrument it could replace: the same records, varied one demographic attribute at a time, with every contrast paired within profile.
Limitations
- Ground truth favors the VI‑SPDAT. True vulnerability is the VI‑SPDAT total under full disclosure, so the VI‑SPDAT is exact on half the records by construction. The AI tools never saw the scale's anchors, so their mean offset partly reflects calibration rather than judgment; rank correlation is the fairer comparison.
- Synthetic population. Thirty‑two profiles vary less than real caseloads. The set spans every total from 0 to 17 and oversamples both decision thresholds, but findings may not transfer to real assessments.
- Limited power for small race effects. Each race contrast pairs 128 instances, enough for 80% power at dz ≈ 0.25 uncorrected or 0.33 under Holm correction, roughly 0.3–0.5 points. Smaller race effects cannot be ruled out.
- Models, not deployed systems. The machine‑learning tools CoCs adopt are proprietary; general‑purpose language models stand in for them, and results may not transfer.
- One model per developer, one run per session. Each tool runs at its default settings (ChatGPT as gpt‑6‑luna through Codex; Claude as claude‑sonnet‑5 through Claude Code), except that the second ChatGPT run raises reasoning effort to high. Gemini receives no system instruction, while ChatGPT and Claude receive the same single line. These settings may differ from the consumer chat apps. Run‑to‑run variation is not measured. The two ChatGPT runs show that a single setting (reasoning effort) can change both accuracy and the gender result.
- Awareness of the manipulation. A model that recognizes the demographic contrast may equalize scores by design rather than by fairness. Detailed narratives reduce but cannot eliminate this risk.
- Location is stated, not lived. Narratives read plausibly in all five cities, so the study measures response to the city label, not to local conditions such as rent or climate. Race × city interactions are not estimable.