{
 "name": "Lives fitted to records reproduce how 31 African populations split, urban or rural by age, on Afrobarometer round 10 (2024-2025), given each country's national level",
 "registered": "plan-r10.json: 31 countries, 1556 country-question pairs: every pair of the eight harmonised families (trust in institutions, corruption, government handling, performance of officials, lived poverty, rejection of non-democratic rule, freedoms, unwanted neighbours) that round 9 asked, that has at least 300 valid training answers, and whose six round 10 cells each hold at least 60 valid answers. Countries span West Africa (Benin, Cabo Verde, Côte d'Ivoire, Gambia, Ghana, Guinea, Liberia, Mali, Nigeria, Senegal, Sierra Leone, Togo), North Africa and the Arab world (Mauritania, Morocco, Tunisia), Central (Cameroon, Congo-Brazzaville, São Tomé and Príncipe), East (Kenya, Madagascar, Mauritius, Tanzania, Uganda) and Southern Africa (Angola, Botswana, Lesotho, Mozambique, Namibia, South Africa, Zambia, Zimbabwe).",
 "why": "The population methods here were tested almost only in the US and Europe. This applies the two survey methods that met on the GSS (the records route, experiment/records-battery; the split against the survey's own sampling floor, experiment/split-gunlaw/protocol-floor.json) country by country to Afrobarometer round 10, released 2026, which no run here has read.",
 "honesty": "Round 10 answers sit in ab_r10_SEALED.parquet (chmod 600). Before this commit they were opened only by ab_plan.py to count valid answers per country, question and cell (the counts are in plan-r10.json); no distribution, share or cross-tab of a round 10 answer was computed or read. Round 10 facts (age, gender, location, schooling, employment, party closeness, region, weight) were read for the cell sizes. Development read rounds 5-9 only.",
 "data": {
  "source": "Afrobarometer merged data, rounds 5-10, free download from afrobarometer.org (data-use policy: acknowledge Afrobarometer and cite the data sets). Round 10: AB_R10.Merge-Dataset_25Feb26.38ctry.release.sav.zip, sha256 f32dfd5ea432bef427f01a2484a01adf3936f295a4a32dcc0abb8da2e7ae42a7, downloaded 2026-10-10. Rounds 5-9 sha256 in [path redacted] on [host name redacted] (round 9 3afcecd0..., round 8 e5ae40e9..., round 7 befcbc3d..., round 6 6441d619..., round 5 c9200ba3...).",
  "inputs": "ab_prepare.py at this commit; ab_dev.parquet e18cf47e51aa8552580eed6b4ad6be8243604ee5231abb0ca4745b8c2fab9557, ab_r10_facts.parquet edb92eb36c229847a37253b447635d5c9f49a323d4c74e349388e4c18196ec7a, ab_r10_SEALED.parquet 84ae16da3a4f1c79e5dec111e313f286722ff1af55fac9b16a63a98328275cab",
  "plan_file": "plan-r10.json",
  "weights": "withinwt_hh (rounds 9, 10), withinwt (rounds 5-8)",
  "train": "rounds 7, 8, 9 (weights 0.25, 0.5, 1)",
  "test": "round 10 only"
 },
 "cells": "per country: urban or rural (URBRUR_COND) x age 18-29 / 30-44 / 45+",
 "method": "ab_records.py at this commit with the settings below: per country and question, a weighted logistic regression of the answer (the share named per family in ab_records.py MEANING) on the person's facts, location x age-group terms, their round 10 answers to the other questions of the same family (never the question itself) and to the other families; L2 0.001; then every logit moved by one constant so the country's weighted predicted share equals its measured round 10 national share; averaged with the weights over the six cells.",
 "settings": {
  "aux": 1,
  "sibs": 1,
  "l2": 0.001,
  "party": 0,
  "ntrain": 3,
  "older": 0.5,
  "anchor": "own",
  "ages": 3,
  "min_cell": 60,
  "B": 400,
  "pool": 0.0,
  "null": 0
 },
 "comparisons": {
  "no_level": {
   "anchor": "none"
  },
  "no_split": {
   "null": 1
  },
  "facts_only": {
   "sibs": 0,
   "aux": 0
  }
 },
 "outcomes": {
  "per_pair": "six-cell mean absolute error in points; pass_floor when it is at or below that pair's floor, the 95th percentile of the six-cell error between the measured cells and 400 resamples drawn within each cell",
  "per_country": "meets when at least 80 percent of its registered pairs pass_floor (a registered pair that is not scored counts as a miss)",
  "primary": "met if at least 80 percent of the 31 countries meet (25 of 31), scored by ab_score.py",
  "secondary": "pairs passing the floor overall; the stricter records-battery rule per pair (error at most 3.0 and both age gaps inside their 95% intervals); and the three comparisons (no_level: the records model without the national level; no_split: the national level in every cell; facts_only: no answers to other questions), reported, never relabelled"
 },
 "development": "dev-summary.txt. Frozen code and settings: round 9 from rounds 6-8: 1339 of 1515 pairs pass (88%), 30 of 31 countries meet (below: Ethiopia 0.73); round 8 from rounds 5-7: 1132 of 1288 (88%), 26 of 28 countries (below: Gambia 0.70, Sudan 0.70). No split (national level in every cell): 57-58% of pairs, 0 and 1 country. Facts only: 71% of pairs, 7 and 9 countries. Without the national level (the GSS records route as registered there): 18-30% of pairs meet the 3.0 rule; the error is dominated by country-specific level changes between rounds (coups, changes of government), and pairs that met in round 8 met again in round 9 only 34-38% of the time, so that route is not registered here.",
 "limits": "The national level of each question comes from round 10 itself: the claim is the split inside a country given its level, not the level. Round 10 interviews ran 2024-2025. The siblings come from the same respondents, so a sample that leans one way leans the same way in its predictions; that is the use the method is for. Cell sizes are 60-600, so floors are 2-6 points.",
 "order": "after this commit: ab_records.py run on [host name redacted] as one capped unit (the registered setting, then the three comparisons), ab_score.py, results committed whatever they say",
 "seed": 20261010
}