AgentSkillsCN

education-data-source-meps

School-Level 贫困衡量指标(MEPS)——Urban Institute 提出的学校级贫困衡量标准。适用于分析学校贫困率、比较各州之间的贫困水平,或在 FRPL 数据因 CEP/全民餐食计划而不可靠时使用。MEPS 以 100% FPL 为基准,提供跨州一致的贫困测量方法。

SKILL.md
--- frontmatter
name: education-data-source-meps
description: >-
  Model Estimates of Poverty in Schools (MEPS) - Urban Institute's school-level
  poverty measure. Use when analyzing school poverty rates, comparing poverty
  across states, or when FRPL data is unreliable due to CEP/universal meals
  programs. MEPS provides consistent cross-state poverty measurement at 100% FPL.
metadata:
  audience: data-analysts
  domain: education-data

MEPS Data Source Reference

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:

ColumnPortal TypeExample ValueNotes
fipsInt646State FIPS as integer (California = 6)
ncesschInt641000020027712-digit NCES school ID as integer
leaidInt641000027-digit district ID as integer
gleaidInt64100013Geographic LEA ID as integer
yearInt642018Academic 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: 2009-2022 (actual Portal data range)
  • Source: Urban Institute, derived from CCD and SAIPE data
  • Primary identifier: ncessch (12-digit NCES school ID)
  • Public schools only: Does not cover private schools

Reference File Structure

FilePurposeWhen to Read
methodology.mdHow MEPS estimates are calculatedUnderstanding the model, research validation
comparison-to-frpl.mdDetailed FRPL vs MEPS comparisonDeciding which measure to use
data-sources.mdInput data (CCD, SAIPE, ISP)Understanding data provenance
variable-definitions.mdMEPS variables and codesBuilding queries, interpreting results
data-quality.mdLimitations, uncertainty, appropriate usesResearch design, caveats

Decision Trees

Should I use MEPS or FRPL?

code
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?

code
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?

code
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 DocumentationPortal Field Name
meps / school_povertymeps_poverty_pct
meps_modmeps_mod_poverty_pct
meps_semeps_poverty_se

Variable Reference

All ID and categorical columns use integer encoding in Portal data:

VariableDescriptionTypeRange/Notes
ncesschNCES school ID (12-digit)Int64e.g., 10000200277
ncessch_numNCES school ID (numeric duplicate)Int64Same as ncessch
yearSchool year (fall)Int642009-2022 (actual data range)
fipsState FIPS codeInt641-56
leaidDistrict ID (7-digit)Int64e.g., 100002
gleaidGeographic LEA IDInt64e.g., 100013
meps_poverty_pctEstimated share in poverty (100% FPL)Float640.0-60.5% (actual range)
meps_mod_poverty_pctModified MEPS estimateFloat640.0-100.0%
meps_poverty_seStandard error of estimateFloat640.5-3.8 (typical range)
meps_poverty_ptlNational percentile (enrollment-weighted)Int641-100
meps_mod_poverty_ptlModified percentile (enrollment-weighted)Int641-100

Key Identifiers

IDFormatLevelExampleNotes
ncesschInt64 (12-digit)School10000200277Primary join key for school-level joins
leaidInt64 (7-digit)District100002Use for district-level joins (e.g., with SAIPE)
gleaidInt64Geographic LEA100013Geographic LEA ID
fipsInt64State6State FIPS code

Missing Data Codes

CodeMeaningWhen Used
nullMissing / Not availableAll 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:

python
# Correct
valid_data = df.filter(pl.col("meps_poverty_pct").is_not_null())

# Wrong (MEPS doesn't use -1, -2, -3 coded values)
# df.filter(pl.col("meps_poverty_pct") >= 0)  # Unnecessary

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.

DatasetTypeYearsPathCodebook
School PovertySingle2009-2022meps/schools_mepsmeps/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:

python
url = get_codebook_url("meps/codebook_schools_meps")

Truth Hierarchy: When interpreting variable values, apply this priority:

  1. Actual data file (what you observe in the parquet/CSV) -- this IS the truth
  2. Live codebook (.xls in mirror) -- authoritative documentation, may lag
  3. 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.

Filtering

python
# Filter to valid poverty estimates only (drop nulls)
df = df.filter(pl.col("meps_poverty_pct").is_not_null())

# High-poverty schools (top quartile nationally)
high_poverty = df.filter(pl.col("meps_poverty_ptl") >= 75)

# Use modified MEPS for high-poverty districts
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")
)

Common Pitfalls

PitfallIssueSolution
Using negative value filtersFiltering >= 0 to remove missing values; MEPS uses nulls, not -1/-2/-3Use .is_not_null() instead of >= 0
Confusing MEPS with FRPL thresholdsMEPS measures 100% FPL; FRPL uses 130-185% FPL — rates are not comparableState clearly which measure and threshold; never mix in same analysis
Using wrong field namesDocumentation says meps but actual Portal field is meps_poverty_pctAlways use Portal field names: meps_poverty_pct, meps_mod_poverty_pct, meps_poverty_se
Ignoring standard errorsTreating MEPS as exact counts; they are modeled estimates with uncertaintyUse meps_poverty_se for close comparisons; flag when SE exceeds meaningful difference
Including private schoolsMEPS only covers public schools; joining with datasets containing private schools inflates nullsFilter to public schools before joining
Expecting recent dataMEPS has 2-3 year data lag; latest available may be several years behindCheck actual year range (2009-2022) before planning analysis

Why MEPS Instead of FRPL?

IssueFRPL ProblemMEPS Solution
CEP schoolsAll students counted as "free lunch" regardless of incomeUses modeled estimates independent of meal programs
State variationDifferent states use different eligibility criteriaStandardized 100% FPL threshold nationwide
Direct certificationVaries by state program participationCalibrated to Census SAIPE data
Income threshold130-185% FPL (varies)Consistent 100% FPL
Time consistencyPolicy changes affect comparability over timeMethodology 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

  1. Model-based: MEPS uses a linear probability model, not direct counts
  2. Calibrated to SAIPE: District totals align with Census poverty estimates
  3. School-specific: Reflects enrolled students, not neighborhood demographics
  4. 100% FPL threshold: Lower than FRPL (185%) - captures deeper poverty
  5. Public schools only: Does not cover private schools

Common Use Cases

Use CaseRecommended Approach
School poverty rankingsUse meps_poverty_pct, note meps_poverty_se for close comparisons
State-level aggregationSum weighted by enrollment
Poverty-achievement gapsJoin MEPS with EDFacts assessments on ncessch
Resource allocation analysisJoin MEPS with CCD finance on leaid
CEP impact researchCompare MEPS vs FRPL trends over time
Title I targeting analysisUse meps_poverty_pct to identify high-poverty schools

Joining MEPS with Other Data

SourceJoin KeyUse Case
CCD Directoryncessch, yearAdd school characteristics
CCD Enrollmentncessch, yearGet enrollment for weighting
CRDCncessch, yearDiscipline, AP courses + poverty
EDFactsncessch, yearAchievement + poverty analysis
SAIPE (district)leaid, yearValidate 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)
  • Not real-time: 2-3 year data lag typical

Related Data Sources

SourceRelationshipWhen to Use
education-data-source-saipeDistrict-level poverty (Census)District-level analysis; MEPS calibration source
education-data-source-ccdSchool/district characteristicsJoin for enrollment, demographics, finance
education-data-source-crdcCivil rights/discipline dataJoin on ncessch for poverty + discipline analysis
education-data-source-edfactsState assessment dataJoin on ncessch for poverty + achievement analysis
education-data-explorerParent discovery skillFinding available endpoints
education-data-queryData fetchingDownloading MEPS parquet/CSV files

Topic Index

TopicReference 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