Voter Registration Rate Methodology
Overview
This report estimates the voter registration rate for election precincts — called Voting Tabulation Districts (VTDs) in Census terminology — and counties in Texas by comparing the number of registered voters to the estimated Citizen Voting Age Population (CVAP), which is the number of U.S. citizens aged 18 and older.
\[\text{Registration Rate} = \frac{\text{Registered Voters}}{\text{Estimated CVAP}}\]
The challenge is that CVAP is not published at the precinct level. The Census Bureau publishes CVAP at the county and block-group level via the American Community Survey (ACS). We bridge this gap using a block-group disaggregation approach with shrinkage weighted by the margin of error (MOE) of each estimate.
Data Sources
1. Voter Registration Counts by VTD
- Source: For election snapshots, the Texas Elections Division (TED) API via the Texas Legislative Council (TLC). For monthly updates, directly from the county Elections Administrator.
- Geography: VTD
- Update frequency: Election snapshots after each election; monthly data obtained directly from the county
2. VTD Population Data (2020 Census)
- Source: Texas Legislative Council
- Geography: VTD (statewide)
- Key fields: Total population, Voting Age Population (VAP — everyone aged 18+, regardless of citizenship), racial/ethnic breakdowns
- Notes: Population figures are from the 2020 Decennial Census, reaggregated to current VTD boundaries by TLC. VAP includes all adults; CVAP is the subset who are U.S. citizens.
3. VTD Shapefiles
- Source: Texas Legislative Council
- Notes: Updated each election cycle as precincts change. Current vintage: 2024 Primary & General (24PG).
4. Citizen Voting Age Population (CVAP) — Block Group Level
- Source: U.S. Census Bureau, CVAP Special Tabulation (derived from ACS 5-year estimates)
- Geography: Block group — a Census unit containing roughly 600-3,000 people, smaller than a tract but larger than a block. This is the finest level at which CVAP is published.
- Current vintage: 2020-2024 ACS 5-year, released January 30, 2026
- Update frequency: Annually (new ACS 5-year vintage each January)
- Key limitation: ACS estimates at the block-group level have large margins of error, especially in small or rural areas
5. Block-Level Voting Age Population (2020 Census)
- Source: Census Bureau, PL 94-171 Redistricting Data via Census API (variable
P3_001N) - Geography: Census block — the smallest Census unit, typically a city block or equivalent area. This is a full count from the decennial census, not a survey estimate.
- Notes: Used as weights for disaggregating block-group CVAP to individual blocks
6. Census Block Centroids
- Source: Census TIGERweb REST API
- Geography: Census block internal points (latitude/longitude)
- Notes: Used to spatially assign 2020 Census blocks to current (2024) VTD boundaries
How It Works
County-Level Reports
Straightforward: registered voters and CVAP are both available at the county level.
- Aggregate voter registration counts from VTDs to county
- Look up county CVAP from the CVAP Special Tabulation
- Divide:
Rate = Registered / CVAP
Precinct-Level Reports
CVAP is not published at the precinct (VTD) level. We estimate it through a multi-step process that disaggregates block-group CVAP down to census blocks, then reaggregates by current precinct boundaries.
Step 1: Load block-group CVAP
From the ACS CVAP Special Tabulation, extract the total CVAP estimate and margin of error (MOE) for each block group in the county. For Caldwell County, this yields 29 block groups.
Step 2: Fetch block-level VAP
From the 2020 Census (PL 94-171), get the Voting Age Population for every census block in the county via the Census API. Caldwell County has 1,609 blocks.
Step 3: Apply MOE-weighted shrinkage
Block-group CVAP estimates from the ACS have significant sampling error at small geographies. Some block groups show CVAP/VAP ratios above 1.0 — a statistical impossibility that reflects noisy ACS estimates, not reality.
Rather than using raw block-group ratios (which can produce absurd results) or a uniform county ratio (which ignores real geographic variation), we apply MOE-weighted shrinkage. For each block group, we blend its ACS-derived ratio with the county-level ratio, weighted by the reliability of the estimate:
\[w = \frac{1}{1 + \text{CV}^2}\]
where CV = MOE / CVAP estimate (the coefficient of variation). Then:
\[\text{Adjusted Ratio} = w \times \text{BG Ratio} + (1 - w) \times \text{County Ratio}\]
Effect: Block groups with tight estimates (low MOE, high \(w\)) retain their own CVAP/VAP ratio. Block groups with large margins of error (high CV, low \(w\)) are pulled toward the county average. This stabilizes estimates without arbitrarily capping them.
The adjusted CVAP for each block group is: Adjusted CVAP = BG VAP × Adjusted Ratio.
Step 4: Disaggregate to blocks
Within each block group, allocate the adjusted CVAP to individual census blocks proportional to each block’s share of the block group’s VAP:
\[\text{Block CVAP} = \text{BG Adjusted CVAP} \times \frac{\text{Block VAP}}{\text{BG Total VAP}}\]
This assumes a uniform citizenship rate within each block group — a much smaller area than a county.
Step 5: Assign blocks to current VTDs (spatial join)
Census blocks must be mapped to current (2024) election precincts. This is not trivial because:
- The Census Bureau’s Block Assignment File maps blocks to 2020 VTD boundaries
- Texas counties consolidated and redistricted precincts between 2020 and 2024 (e.g., Caldwell County went from 41 VTDs to 24)
- VTD names may look similar across vintages, but boundaries are different
We solve this with a spatial join: fetch each block’s centroid coordinates from the Census TIGERweb API, then point-in-polygon match them to the current TLC VTD shapefile. Blocks whose centroids fall on a VTD boundary are assigned to the nearest VTD.
Step 6: Aggregate to VTD
Sum the allocated block CVAP values by VTD assignment. This produces the estimated CVAP for each current precinct.
Step 7: Calculate registration rate
\[\text{Rate} = \frac{\text{Registered Voters}}{\text{Estimated CVAP}}\]
Why This Approach?
We evaluated several alternatives:
| Approach | Pros | Cons |
|---|---|---|
| Uniform county ratio | Simple, reproducible | Ignores real variation in citizenship rates across precincts |
| Raw block-group disaggregation | Uses local ACS data | ACS MOE at block-group level produces absurd ratios (>1.0) |
| Tract-level CVAP | Less noisy than block groups | Still coarse; fewer tracts than block groups |
| Arbitrary cap at 1.0 | Prevents impossible values | Statistically unjustified; hides uncertainty |
| MOE-weighted shrinkage (chosen) | Uses local data where reliable, falls back gracefully | More complex; still subject to ACS limitations |
The shrinkage approach is standard practice for small-area ACS estimates and is used by redistricting projects and academic researchers working with similar data.
Key Identifiers
The Texas Legislative Council uses a numbering system that differs from FIPS codes. The critical join key across datasets is VTDKEY — a numeric identifier present in both TLC and TED data.
| Field | Description | Example (Caldwell County) |
|---|---|---|
CountyFIPS |
3-digit county FIPS (Federal Information Processing Standards) code | 055 |
CNTY |
TLC county number | 55 |
VTDKEY |
Numeric join key (most reliable) | 1373 |
Limitations and Caveats
Rates over 100% still appear in some precincts. This is caused by:
- Population growth since the 2020 Census (the VAP denominator is stale)
- Voter roll bloat (people who moved away but remain on the rolls)
- Residual ACS sampling error even after shrinkage
ACS margins of error: Block-group CVAP estimates have large MOEs in small areas. The shrinkage mitigates but does not eliminate this. The shrinkage summary table in the script output shows each block group’s CV and weight for transparency.
2020 Census base: Block-level VAP comes from the 2020 Decennial Census. In fast-growing areas, the denominator is too low, inflating the apparent registration rate. This is the primary driver of >100% rates.
Uniform citizenship within block groups: The disaggregation assumes citizenship rates are uniform within each block group. Block groups are small (~1,000-2,000 people), so this is reasonable, but variation can still exist within them.
Spatial join accuracy: Assigning blocks to VTDs via centroid point-in-polygon works well for most blocks but may misassign blocks that span VTD boundaries. For Caldwell County, 35 of 1,609 blocks (2.2%) required nearest-neighbor fallback.
VTD ≠ exact precinct: VTDs are the Census Bureau’s approximation of election precincts, built from census block boundaries. Where a county’s actual precinct boundary doesn’t follow a block line, the VTD is the closest approximation.
Future Refinements
Population growth adjustment: Use county-level Population Estimates Program data to scale the 2020 Census VAP forward, reducing >100% rates in growing areas.
Time-series tracking: Archive monthly snapshots to show registration trends over time.
Statewide expansion: The methodology is parameterized by county FIPS and generalizes to all 254 Texas counties. The main scaling considerations are Census API rate limits for block-level data and TIGERweb queries for block centroids.