{
 "study": "Population-denominator sensitivity of coverage-adjusted PISA trend inference, 2018-2022",
 "generated_utc": "2026-08-14T17:39:05.983261+00:00",
 "environment": {
  "platform": "macOS-26.5.2-arm64-arm-64bit-Mach-O",
  "python": "3.14.3",
  "cpu_count": 8,
  "numpy": "2.4.4",
  "scipy": "1.17.1",
  "pandas": "3.0.2",
  "pyreadstat": "1.3.6",
  "openpyxl": "3.1.5",
  "matplotlib": "3.11.1",
  "git_commit": "not a git repository"
 },
 "raw_inputs": {
  "CY07_MSU_STU_QQQ.sav": {
   "description": "PISA 2018 student questionnaire microdata, SPSS",
   "url": "https://webfs.oecd.org/pisa2018/SPSS_STU_QQQ.zip",
   "container_bytes": 500959458,
   "container_sha256": "df39c2b4c27649fd86866c0f7d23f9544ffc071634387d4ee52d1b433de70ea6",
   "member": "STU/CY07_MSU_STU_QQQ.sav",
   "rows": 612004,
   "cols": 1119,
   "licence": "OECD terms and conditions, https://www.oecd.org/termsandconditions/",
   "local_path": "data/raw/CY07_MSU_STU_QQQ.sav",
   "bytes_on_disk": 1876727810,
   "sha256_on_disk": "7ac6da12feb3d00961ad7fe3bf69adb9461988036c2d84d95de5fe99ee899280",
   "present": true
  },
  "CY08MSP_STU_QQQ.SAV": {
   "description": "PISA 2022 student questionnaire microdata, SPSS",
   "url": "https://webfs.oecd.org/pisa2022/STU_QQQ_SPSS.zip",
   "container_bytes": 682364259,
   "container_sha256": "24ee020cd6315d8aca52e07fd9aaef21cbf4f9e5b21601734b4ee6d0928a0905",
   "member": "CY08MSP_STU_QQQ.SAV",
   "rows": 613744,
   "cols": 1278,
   "licence": "OECD terms and conditions",
   "local_path": "data/raw/CY08MSP_STU_QQQ.SAV",
   "bytes_on_disk": 2096666903,
   "sha256_on_disk": "9e4eddacd25e10c145f7bfe817fc99a5b8df544536e5ea1dfd7230c988916a8c",
   "present": true
  },
  "pisa2022_volII_annexA2.xlsx": {
   "description": "PISA 2022 Results Volume I Annex A2 tables I.A2.1-I.A2.7: target populations, samples, exclusions, response rates, and Table I.A2.2 POP15, enrolled population, weighted participants and Coverage Index 3 for cycles 2003-2022",
   "url": "https://stat.link/hpg9nd",
   "licence": "OECD terms and conditions",
   "local_path": "data/raw/pisa2022_volII_annexA2.xlsx",
   "bytes_on_disk": 111305,
   "sha256_on_disk": "99c3b50ede11fd8cab07ea728522cff5ceabcf0c0a066ee2279e2b0ae177141c",
   "present": true
  },
  "pisa2022_volI_tableIA71_linkerrors.xlsx": {
   "description": "PISA 2022 Results Volume I Table I.A7.1, link errors",
   "url": "https://stat.link/48f0zo",
   "local_path": "data/raw/pisa2022_volI_tableIA71_linkerrors.xlsx",
   "bytes_on_disk": 32350,
   "sha256_on_disk": "e9eed015be7c5a6bd790d7b6bbb18af89b261705a45146d2f33a102d63d38db8",
   "present": true
  },
  "pisa2022_volI_means.xlsx": {
   "description": "PISA 2022 Results Volume I, 2022 mean performance tables",
   "url": "https://stat.link/xluqor",
   "local_path": "data/raw/pisa2022_volI_means.xlsx",
   "bytes_on_disk": 463331,
   "sha256_on_disk": "bd330583db01f643add0031557eb1742987e56a60af11ddc09ba40502027db43",
   "present": true
  },
  "pisa2022_volI_fig151_changes.xlsx": {
   "description": "PISA 2022 Results Volume I Figure I.5.1 performance changes",
   "url": "https://stat.link/muorhc",
   "local_path": "data/raw/pisa2022_volI_fig151_changes.xlsx",
   "bytes_on_disk": 460386,
   "sha256_on_disk": "fa94958092fca0a1c63363cbdbfa2858586427cd30a05b8cbe6f79788964e448",
   "present": true
  },
  "WPP2024_PopulationBySingleAgeSex_Medium_1950-2023.csv.gz": {
   "description": "UN World Population Prospects 2024, population by single age and sex, medium variant, 1950-2023",
   "url": "https://population.un.org/wpp/assets/Excel%20Files/1_Indicator%20(Standard)/CSV_FILES/WPP2024_PopulationBySingleAgeSex_Medium_1950-2023.csv.gz",
   "licence": "CC BY 3.0 IGO",
   "local_path": "data/raw/WPP2024_PopulationBySingleAgeSex_Medium_1950-2023.csv.gz",
   "bytes_on_disk": 62082217,
   "sha256_on_disk": "f84c75789ccbd385122ad19bac70026d6306878442afbaa24e8e50a23b4bee2f",
   "present": true
  },
  "oecd_docs/pisa2018_volI.pdf": {
   "description": "PISA 2018 Results (Volume I): What Students Know and Can Do. Annex A7 documents the adjusted-trend procedure implemented here; note 11 states that the adjusted percentile estimates are lower bounds and that reported changes may over-estimate true changes.",
   "url": "https://doi.org/10.1787/5f07c754-en",
   "licence": "OECD terms and conditions",
   "verification_script": "scripts/26_verify_oecd_primary_sources.py",
   "local_path": "data/raw/oecd_docs/pisa2018_volI.pdf",
   "bytes_on_disk": 6529490,
   "sha256_on_disk": "d943dd7fc65b2a784f55c1be0e576ffd1ad59786e65918217a2da3b56c99caa1",
   "present": true
  },
  "oecd_docs/pisa2022_technical_report.pdf": {
   "description": "PISA 2022 Technical Report. Chapter 6 defines the age-eligible population as a 12-month date-of-birth window and records that the data source and year for the population count are collected on Sampling Task 7a; Chapter 13 defines Coverage Index 3 as P/ST7a_1.",
   "url": "https://doi.org/10.1787/01820d6d-en",
   "licence": "OECD terms and conditions",
   "verification_script": "scripts/26_verify_oecd_primary_sources.py",
   "local_path": "data/raw/oecd_docs/pisa2022_technical_report.pdf",
   "bytes_on_disk": 9185880,
   "sha256_on_disk": "6f6ccf26beb01372b79bdea74bf8e49b417404f2ee81fb031c4cf7d917a89fdc",
   "present": true
  },
  "oecd_docs/pisa_data_analysis_manual_spss_2e.pdf": {
   "description": "PISA Data Analysis Manual: SPSS, Second Edition. Box 17.3 gives the percentile macro MCR_SE_PERCENTILES_PV, which fixes the per-plausible-value combination rule but delegates the percentile itself to the host statistical package and states no interpolation rule.",
   "url": "https://doi.org/10.1787/9789264056275-en",
   "licence": "OECD terms and conditions",
   "verification_script": "scripts/26_verify_oecd_primary_sources.py",
   "local_path": "data/raw/oecd_docs/pisa_data_analysis_manual_spss_2e.pdf",
   "bytes_on_disk": 6615395,
   "sha256_on_disk": "c6b6ddeebd99797f3d3c294f37bfab54efd8af243720ffb47658dc34265caeed",
   "present": true
  },
  "oecd_docs/pisa2018_volI_annexA7_tables.xlsx": {
   "description": "PISA 2018 Results Volume I, Annex A7 StatLink tables (link errors for comparisons with PISA 2018). Retained for completeness; the manuscript uses the PISA 2022 Volume I Table I.A7.1 link errors for 2018-to-2022 comparisons.",
   "url": "https://doi.org/10.1787/888934028957",
   "licence": "OECD terms and conditions",
   "local_path": "data/raw/oecd_docs/pisa2018_volI_annexA7_tables.xlsx",
   "bytes_on_disk": 110434,
   "sha256_on_disk": "122fabc8c19fdeb2dcf778433080187a36a706996728dbdd8600c9c5723d679b",
   "present": true
  },
  "WPP2024_Population1JanuaryBySingleAgeSex_Medium_1950-2023.csv.gz": {
   "description": "UN World Population Prospects 2024, population as of 1 January by single age and sex, medium variant, 1950-2023. Used to place WPP and Eurostat on a common 1 January reference date. The WPP 2024 methodology states that the published 1 July series is the arithmetic mean of the 1 January values.",
   "url": "https://population.un.org/wpp/assets/Excel%20Files/1_Indicator%20(Standard)/CSV_FILES/WPP2024_Population1JanuaryBySingleAgeSex_Medium_1950-2023.csv.gz",
   "licence": "CC BY 3.0 IGO",
   "local_path": "data/raw/WPP2024_Population1JanuaryBySingleAgeSex_Medium_1950-2023.csv.gz",
   "bytes_on_disk": 62107912,
   "sha256_on_disk": "b9a2c95d1608e7ae2c506c1516f1dab60535513c143c49b3e55087515b7ebe91",
   "present": true
  },
  "eurostat_demo_pjan_age14_16.json": {
   "description": "Eurostat demo_pjan extraction for completed ages 14, 15 and 16, population on 1 January by age and sex; unit=number, sex=total. Required to blend single-age counts to the observed PISA age-eligibility window.",
   "url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/demo_pjan?format=JSON&lang=EN&sex=T&age=Y14&age=Y15&age=Y16&time=2018&time=2019&time=2022&time=2023",
   "source_table": "demo_pjan",
   "local_path": "data/raw/eurostat_demo_pjan_age14_16.json",
   "bytes_on_disk": 12522,
   "sha256_on_disk": "6e3c976e4f816a192b752d1f7ef26a9a6645a97abb34ef990c93651b84eba8ea",
   "present": true
  },
  "eurostat_age15.csv": {
   "description": "Age-15 extraction from Eurostat demo_pjan, population on 1 January by age and sex; unit=number, sex=total, age=Y15",
   "url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/demo_pjan",
   "source_table": "demo_pjan",
   "note": "Retained query extraction; the full API response is not redistributed.",
   "local_path": "data/interim/eurostat_age15.csv",
   "bytes_on_disk": 5553,
   "sha256_on_disk": "0e4d5f91a494636df077ef43f108bdc864dd3505540e9285d9889d8b27ae23bc",
   "present": true
  },
  "OxCGRT_compact_national_v1.csv": {
   "description": "Oxford COVID-19 Government Response Tracker, compact national daily file v1; C1M_School closing and C1M_Flag",
   "url": "https://raw.githubusercontent.com/OxCGRT/covid-policy-dataset/main/data/OxCGRT_compact_national_v1.csv",
   "reference_doi": "10.1038/s41562-021-01079-8",
   "licence": "CC BY 4.0",
   "local_path": "data/raw/OxCGRT_compact_national_v1.csv",
   "bytes_on_disk": 43837034,
   "sha256_on_disk": "fa5c95fa8f5e386517698cdc17581f7e3333348907c57ad8459c877580d0fe79",
   "present": true
  },
  "UNESCO_SDG_duration_school_closures.xlsx": {
   "description": "UNESCO Institute for Statistics, duration of full and partial school closures by country, 2020-02-16 to 2022-04-30",
   "url": "https://covid19.uis.unesco.org/wp-content/uploads/sites/11/2022/09/SDG-duration-of-school-closures-by-country.xlsx",
   "local_path": "data/raw/UNESCO_SDG_duration_school_closures.xlsx",
   "bytes_on_disk": 30221,
   "sha256_on_disk": "d24d57474d3be7e1746546f58cc756a05ceecebb4f40a145919bc0bb994bd7cb",
   "present": true
  }
 },
 "scripts": [
  "00_inspect_annexA2.py",
  "01_extract_coverage_panel.py",
  "02_validate_panel.py",
  "03_notes_and_footnotes.py",
  "04_build_exposure.py",
  "05_gate_test_dci3_vs_closure.py",
  "06_decompose_dci3.py",
  "07_validate_pop15_vs_wpp.py",
  "08_microdata_columns.py",
  "09_run_estimators.py",
  "10_trend_sensitivity.py",
  "11_provenance.py",
  "12_openalex_novelty_sweep.py",
  "13_read_threats.py",
  "14_oecd_negative_weight_audit.py",
  "15_annexA7_replication.py",
  "16_figures.py",
  "17_three_way_denominator.py",
  "18_build_submission.sh",
  "19_audit_manuscript_numbers.py",
  "20_verify_references.py",
  "21_audit_submission_artifacts.py",
  "22_quantile_definition_calibration.py",
  "23_denominator_alignment_audit.py",
  "24_recompute_conventions_and_denominators.py",
  "25_revised_sensitivity_tables.py",
  "26_verify_oecd_primary_sources.py"
 ],
 "derived_outputs": {
  "data/interim": [
   "annexA2_1_targetpop_2022.csv",
   "annexA2_4_exclusions_2022.csv",
   "annexA2_6_responserates_2022.csv",
   "annexA2_headers_verbatim.json",
   "ci3_alt_denominator.csv",
   "ci3_three_denominators.csv",
   "ci3_wide_all_entities.csv",
   "ci3_wide_by_cycle.csv",
   "coverage_panel_long.csv",
   "dci3_decomposition.csv",
   "denominators_aligned.csv",
   "eurostat_age15.csv",
   "gate_merged.csv",
   "microdata_columns.json",
   "oxcgrt_closure_measures.csv",
   "pisa_age_window.csv",
   "pop15_vs_wpp_growth.csv",
   "pop15_vs_wpp_levels.csv",
   "unesco_duration_raw.csv",
   "unesco_header_verbatim.json",
   "wpp2024_age15.csv"
  ],
  "results": [
   "annexA7_variants.csv",
   "contrasts_by_entity_variant.csv",
   "denominator_comparability_audit.csv",
   "denominator_gap_summary.csv",
   "estimates_by_country_cycle_domain.csv",
   "estimates_conventions_denominators.csv",
   "gate_dci3_vs_closure.csv",
   "gate_placebo_prepandemic.csv",
   "oecd_adjusted_trend_weight_audit.csv",
   "oecd_primary_source_verification.json",
   "openalex",
   "pop15_growth_agreement.csv",
   "pop15_volatility.csv",
   "quantile_convention_contrast.csv",
   "quantile_convention_levels.csv",
   "quantile_definition_calibration.csv",
   "quantile_definition_deviations.csv",
   "quantile_definition_summary.csv",
   "quantile_definition_verdict.json",
   "reference_verification.json",
   "table3_variants.csv",
   "three_way_denominator.csv",
   "trend_sensitivity_by_entity_domain.csv"
  ],
  "tables": [
   "table_adjustment_switched_off.csv",
   "table_dci3_decomposition_large.csv",
   "table_denominator_sensitivity_math.csv",
   "table_negative_weight_countries.csv",
   "table_quantile_convention_contrast.csv",
   "table_quantile_convention_levels.csv",
   "table_reduced_mismatch_contrast.csv",
   "table_three_way_comparison.csv",
   "table_zero_replacement_effect.csv"
  ]
 }
}