| name | education-data-source-meps |
| description | MEPS — Urban Institute modeled school-level poverty (% at 100% FPL) for public schools. MEPS 2.0 (released 2025-12-11) covers school years 2009-10 through 2022-23 and is planned for annual updates; Portal year 2022 returned rows while 2023 was empty on 2026-08-06 (re-probed). Use when FRPL is unreliable due to CEP and for consistent cross-state measurement. |
| metadata | {"audience":"any-agent","domain":"data-source","skill-authored":"2026-02-09","skill-last-updated":"2026-08-06"} |
MEPS Data Source Reference
Model Estimates of Poverty in Schools (MEPS) — Urban Institute modeled estimates of school-level poverty (% students at or below 100% FPL) for public schools. MEPS 2.0, released 2025-12-11, covers school years 2009-10 through 2022-23 and says updates will occur annually. In the Portal, year 2022 returned rows (count 94,941) while year 2023 returned an empty result (count 0), re-probed 2026-08-06. Use when analyzing school poverty rates, comparing poverty across states, or when FRPL data is unreliable due to CEP enrollment. Treat the present gap as a publication-vintage observation, not as a documented fixed methodological lag or as a proven consequence of CCD/SAIPE timing.
School-level poverty measure from the Urban Institute that is comparable across states and time, unlike Free/Reduced-Price Lunch (FRPL) data.
CRITICAL: Value Encoding
The Education Data Portal returns MEPS data with integer-encoded categorical and identifier columns. This differs from some external documentation:
| Column | Portal Type | Example Value | Notes |
|---|
fips | Int64 | 6 | State FIPS as integer (California = 6) |
ncessch | Int64 | 10000200277 | 12-digit NCES school ID as integer |
leaid | Int64 | 100002 | 7-digit district ID as integer |
gleaid | Int64 | 100013 | Geographic LEA ID as integer |
year | Int64 | 2018 | Academic year (fall semester) |
Missing values: Unlike CCD, MEPS uses native nulls rather than negative coded values (-1, -2, -3). While the codebook lists these codes, actual Portal data contains nulls for missing values.
See ./references/variable-definitions.md for complete encoding tables.
What is MEPS?
MEPS is a modeled estimate of the share of students from households with incomes at or below 100% of the Federal Poverty Level (FPL).
- Purpose: Provide consistent school poverty measurement across all US states
- Key advantage: Comparable across states (unlike FRPL which varies by state policy)
- Data level: School-level (individual schools)
- Coverage: MEPS 2.0 school years 2009-10 through 2022-23; Portal year values 2009-2022, with rows in 2022 and an empty 2023 response re-probed 2026-08-06
- Release cadence: MEPS 2.0 was released 2025-12-11 and states that updates will occur annually; no fixed methodological lag is documented
- Source: Urban Institute, using CCD, SAIPE, and MEPS 2.0 inputs documented in the methodology
- Primary identifier:
ncessch (12-digit NCES school ID)
- Public schools only: Does not cover private schools
Reference File Structure
| File | Purpose | When to Read |
|---|
methodology.md | How MEPS estimates are calculated | Understanding the model, research validation |
comparison-to-frpl.md | Detailed FRPL vs MEPS comparison | Deciding which measure to use |
data-sources.md | Input data (CCD, SAIPE, ISP) | Understanding data provenance |
variable-definitions.md | MEPS variables and codes | Building queries, interpreting results |
data-quality.md | Limitations, uncertainty, appropriate uses | Research design, caveats |
Decision Trees
Should I use MEPS or FRPL?
What is your research goal?
├─ Compare poverty across states → Use MEPS
│ └─ FRPL varies by state policy, MEPS is standardized
├─ Track poverty over time (post-2010) → Use MEPS
│ └─ CEP adoption makes FRPL inconsistent
├─ Study CEP/universal meals impact → Use both
│ └─ Compare MEPS (true poverty) vs FRPL (program participation)
├─ Match historical research (pre-2010) → Consider FRPL
│ └─ MEPS only available 2006+, but FRPL was more reliable then
├─ Need 185% FPL threshold → Use FRPL with caveats
│ └─ MEPS only measures 100% FPL
└─ Federal funding formulas → Check formula requirements
└─ Some formulas mandate FRPL; note limitations
Which MEPS variable should I use?
Which estimate type?
├─ Standard analysis → `meps_poverty_pct`
│ └─ Original modeled estimate
├─ High-poverty district adjustment → `meps_mod_poverty_pct`
│ └─ Modified MEPS for districts where model underestimates
├─ Need confidence bounds → `meps_poverty_se`
│ └─ Standard error for uncertainty analysis
└─ Categorical analysis → Derive from `meps_poverty_pct`
└─ Create quartiles/quintiles as needed
How do I access MEPS data?
Access method?
├─ Mirror download (recommended) → See "Data Access" section below
└─ Join with other data → Use `ncessch` as join key
Quick Reference: MEPS Variables
Data Access: MEPS data is fetched from mirrors (parquet/CSV). See datasets-reference.md for canonical paths, mirrors.yaml for mirror configuration, and fetch-patterns.md for fetch code patterns.
Portal Field Names
The Portal field names differ from some external MEPS documentation:
| External Documentation | Portal Field Name |
|---|
meps / school_poverty | meps_poverty_pct |
meps_mod | meps_mod_poverty_pct |
meps_se | meps_poverty_se |
Variable Reference
All ID and categorical columns use integer encoding in Portal data:
| Variable | Description | Type | Range/Notes |
|---|
ncessch | NCES school ID (12-digit) | Int64 | e.g., 10000200277 |
ncessch_num | NCES school ID (numeric duplicate) | Int64 | Same as ncessch |
year | School year (fall) | Int64 | 2009-2022 (actual data range) |
fips | State FIPS code | Int64 | 1-56 |
leaid | District ID (7-digit) | Int64 | e.g., 100002 |
gleaid | Geographic LEA ID | Int64 | e.g., 100013 |
meps_poverty_pct | Estimated share in poverty (100% FPL) | Float64 | 0.0-60.5% (actual range) |
meps_mod_poverty_pct | Modified MEPS estimate | Float64 | 0.0-100.0% |
meps_poverty_se | Standard error of estimate | Float64 | 0.5-3.8 (typical range) |
meps_poverty_ptl | National percentile (enrollment-weighted) | Int64 | 1-100 |
meps_mod_poverty_ptl | Modified percentile (enrollment-weighted) | Int64 | 1-100 |
Key Identifiers
| ID | Format | Level | Example | Notes |
|---|
ncessch | Int64 (12-digit) | School | 10000200277 | Primary join key for school-level joins |
leaid | Int64 (7-digit) | District | 100002 | Use for district-level joins (e.g., with SAIPE) |
gleaid | Int64 | Geographic LEA | 100013 | Geographic LEA ID |
fips | Int64 | State | 6 | State FIPS code |
Missing Data Codes
| Code | Meaning | When Used |
|---|
null | Missing / Not available | All missing values — MEPS uses native nulls, not negative coded values |
Important: Unlike CCD and most other Portal sources, MEPS does not use -1, -2, -3 coded values. Use null checks:
valid_data = df.filter(pl.col("meps_poverty_pct").is_not_null())
library(dplyr)
valid_data <- df |> filter(!is.na(meps_poverty_pct))
Data Access
Datasets for MEPS are available via the mirror system. See datasets-reference.md for canonical paths, mirrors.yaml for mirror configuration, and fetch-patterns.md for fetch code patterns.
| Dataset | Type | Years | Path | Codebook |
|---|
| School Poverty | Single | 2009-2022 | meps/schools_meps | meps/codebook_schools_meps |
Codebooks are .xls files co-located with data in all mirrors. Use get_codebook_url() from fetch-patterns.md to construct download URLs:
url = get_codebook_url("meps/codebook_schools_meps")
mirror <- yaml::read_yaml("mirrors.yaml")$mirrors[[1]]
url <- paste0(mirror$root_url, "/", "meps/codebook_schools_meps", ".xls")
Truth Hierarchy: When interpreting variable values, apply this priority:
- Actual data file (what you observe in the parquet/CSV) -- this IS the truth
- Live codebook (.xls in mirror) -- authoritative documentation, may lag
- This skill documentation -- convenient summary, may drift from codebook
If this documentation contradicts the codebook, trust the codebook. If the codebook contradicts observed data, trust the data and investigate.
Current Publication Vintage
- Urban MEPS 2.0 release (2025-12-11):
https://www.urban.org/research/publication/model-estimates-poverty-schools-20
- Portal 2022 probe:
https://educationdata.urban.org/api/v1/schools/meps/2022/ — returned rows (count 94,941) on 2026-08-06
- Portal 2023 probe:
https://educationdata.urban.org/api/v1/schools/meps/2023/ — returned an empty result (count 0) on 2026-08-06
MEPS 2.0 covers school years 2009-10 through 2022-23 and states that updates will occur annually. Describe any current-year gap as the observed publication vintage. Do not assert a fixed production lag or attribute it causally to CCD or SAIPE without separate evidence.
Filtering
df = df.filter(pl.col("meps_poverty_pct").is_not_null())
high_poverty = df.filter(pl.col("meps_poverty_ptl") >= 75)
df = df.with_columns(
pl.when(pl.col("meps_mod_poverty_pct").is_not_null())
.then(pl.col("meps_mod_poverty_pct"))
.otherwise(pl.col("meps_poverty_pct"))
.alias("poverty_pct_best")
)
library(dplyr)
df <- df |> filter(!is.na(meps_poverty_pct))
high_poverty <- df |> filter(meps_poverty_ptl >= 75)
df <- df |> mutate(
poverty_pct_best = coalesce(meps_mod_poverty_pct, meps_poverty_pct)
)
Common Pitfalls
| Pitfall | Issue | Solution |
|---|
| Using negative value filters | Filtering >= 0 to remove missing values; MEPS uses nulls, not -1/-2/-3 | Use .is_not_null() instead of >= 0 |
| Confusing MEPS with FRPL thresholds | MEPS measures 100% FPL; FRPL uses 130-185% FPL — rates are not comparable | State clearly which measure and threshold; never mix in same analysis |
| Using wrong field names | Documentation says meps but actual Portal field is meps_poverty_pct | Always use Portal field names: meps_poverty_pct, meps_mod_poverty_pct, meps_poverty_se |
| Ignoring standard errors | Treating MEPS as exact counts; they are modeled estimates with uncertainty | Use meps_poverty_se for close comparisons; flag when SE exceeds meaningful difference |
| Including private schools | MEPS only covers public schools; joining with datasets containing private schools inflates nulls | Filter to public schools before joining |
| Treating vintage as a fixed lag | The current terminal year is a publication-vintage observation, not a documented fixed methodological delay | Record the MEPS release date and covered school years; probe the Portal year needed before planning analysis |
Why MEPS Instead of FRPL?
| Issue | FRPL Problem | MEPS Solution |
|---|
| CEP schools | All students counted as "free lunch" regardless of income | Uses modeled estimates independent of meal programs |
| State variation | Different states use different eligibility criteria | Standardized 100% FPL threshold nationwide |
| Direct certification | Varies by state program participation | Calibrated to Census SAIPE data |
| Income threshold | 130-185% FPL (varies) | Consistent 100% FPL |
| Time consistency | Policy changes affect comparability over time | Methodology consistent across years |
Critical insight: As of 2020, ~60% of schools participate in CEP or other universal meal programs, making FRPL increasingly unreliable as a poverty proxy.
Key Methodological Points
- Model-based: MEPS uses a linear probability model, not direct counts
- Calibrated to SAIPE: District totals align with Census poverty estimates
- School-specific: Reflects enrolled students, not neighborhood demographics
- 100% FPL threshold: Lower than FRPL (185%) - captures deeper poverty
- Public schools only: Does not cover private schools
Common Use Cases
| Use Case | Recommended Approach |
|---|
| School poverty rankings | Use meps_poverty_pct, note meps_poverty_se for close comparisons |
| State-level aggregation | Sum weighted by enrollment |
| Poverty-achievement gaps | Join MEPS with EDFacts assessments on ncessch |
| Resource allocation analysis | Join MEPS with CCD finance on leaid |
| CEP impact research | Compare MEPS vs FRPL trends over time |
| Title I targeting analysis | Use meps_poverty_pct to identify high-poverty schools |
Joining MEPS with Other Data
| Source | Join Key | Use Case |
|---|
| CCD Directory | ncessch, year | Add school characteristics |
| CCD Enrollment | ncessch, year | Get enrollment for weighting |
| CRDC | ncessch, year | Discipline, AP courses + poverty |
| EDFacts | ncessch, year | Achievement + poverty analysis |
| SAIPE (district) | leaid, year | Validate against Census estimates |
Limitations
- Years available: 2009-2022 (actual Portal data range)
- Public schools only: No private school coverage
- Modeled estimates: Subject to estimation error (use
meps_poverty_se)
- 100% FPL only: Does not capture near-poverty (100-185% FPL)
- Publication vintage: MEPS 2.0 (released 2025-12-11) ends with school year 2022-23; check the latest release and Portal response rather than assuming a fixed lag
Related Data Sources
| Source | Relationship | When to Use |
|---|
education-data-source-saipe | District-level poverty (Census) | District-level analysis; MEPS calibration source |
education-data-source-ccd | School/district characteristics | Join for enrollment, demographics, finance |
education-data-source-crdc | Civil rights/discipline data | Join on ncessch for poverty + discipline analysis |
education-data-source-edfacts | State assessment data | Join on ncessch for poverty + achievement analysis |
education-data-explorer | Parent discovery skill | Routing questions to mirror dataset files |
education-data-query | Data fetching | Downloading MEPS parquet/CSV files |
Topic Index
| Topic | Reference File |
|---|
| Linear probability model | ./references/methodology.md |
| SAIPE calibration | ./references/methodology.md |
| Modified MEPS | ./references/methodology.md |
| Validation evidence | ./references/methodology.md |
| CEP impact on FRPL | ./references/comparison-to-frpl.md |
| Direct certification | ./references/comparison-to-frpl.md |
| State policy variation | ./references/comparison-to-frpl.md |
| CCD data inputs | ./references/data-sources.md |
| SAIPE data inputs | ./references/data-sources.md |
| ISP data (MEPS 2.0) | ./references/data-sources.md |
| Variable definitions | ./references/variable-definitions.md |
| Poverty thresholds | ./references/variable-definitions.md |
| Standard errors | ./references/data-quality.md |
| Appropriate uses | ./references/data-quality.md |
| Known limitations | ./references/data-quality.md |