{
 "name": "Births from a voice tuned on women's life records, with the level set once, on NSFG 2013-2015, a survey wave never opened here",
 "registered": "2026-10-11",
 "why": "The earlier births test (protocol-births.json, engine 031d479, result 63499d2) stands as published: the voice ranked women far better than age alone (AUC 0.728 against 0.620) but its carried level, 0.155, fell below the observed 0.178 (0.167-0.190). The level was moved twice for the same change: once by the voice itself, whose facts (age, children, years since the last birth) already carry the shift in who is in the sample, and again by the ratio of crude national general fertility rates, whose fall partly reflects the same shift (births_score.py: carried = voice mean x GFR_RATIO). Here the level is set once (births_level.py): age through age alone, and the period through national birth rates at the woman's own age, so no shift is counted twice; the voice moves each woman above or below that level and keeps its order. Tested on a survey wave nobody here has opened.",
 "fresh": "NSFG 2013-2015 female respondent and pregnancy public-use files (CDC NCHS; files dated 12 October 2016, user's guide October 2016; interviews September 2013 to September 2015, 5,699 women 15-44). Not used in training, development or any holdout: the earlier births study used NSFG 2017-2019 (training and development), 2011-2013 (development) and 2022-2023 (its holdout); the engine repository has no reference to the 2013-2015 wave before this commit; no file of it was found by name in the working folders of server3, spark, the desktop or the working machine before 2026-10-11, and the data files were downloaded from the CDC on 2026-10-11 and not opened before this commit. Only the two data dictionaries and the value labels were read, to confirm the variable names and codes (HIEDUC 5-15 as in 2011-2013; HISPRACE2 1-4; RELIGION 1-4; METRO 1-3; DATEND in century months). A newer wave would be the natural test, but none is released: the CDC lists 2022-2023 as the latest public files.",
 "truth": "NSFG 2013-2015 female respondent and pregnancy public-use files: women 18-44 at the start of a three-year window ending the year before interview (window start = interview year - 3, so 2010-2012; ages at interview are 15-44, so 18-41 at the start), outcome a live birth (OUTCOME 1) ending in the window; facts at the window start as in births_prep.py (age, children born before it, years since the last birth, education on one scale, HISPRACE2, RELIGION, METRO) and the window's first year. Built by births_prep.py 2013 from 2013_2015_FemRespData.dat and 2013_2015_FemPregData.dat with their Stata dictionaries. Unweighted.",
 "voice": "The voice tuned on all NSFG 2011-2013 women in development (4,380 women, ages 18-42 at the window start; births_voice.py, Qwen/Qwen3-4B-Base revision 906bfd4b4dc7f14ee4320094d8b41684abff8539 in 4 bits, low-rank adapter r 8, alpha 32, q and v projections, 2 epochs, learning rate 1e-4, micro-batch 8, accumulation 8, seed 0), frozen as its saved adapter (copies on the desktop at C:\\lw-births\\adapter-2011 and on server3) and scored without further training by births_voice_score.py with GPU memory capped at fraction 0.42. Rescoring NSFG 2017-2019 with the frozen adapter reproduced the development scores exactly (4,757 of 4,757, largest difference 0). It reads a copy of the 2013-2015 facts with the outcome set to 0 (births_facts.py).",
 "level": "Set once (births_level.py): age alone (logistic in age and its square, fitted on 2011-2013) gives each 2013-2015 woman a probability; each is multiplied by her period ratio, the mean national birth rate at her own ages over her three window years divided by the same for her starting age averaged over the 2011-2013 women's window years (NCHS age-specific birth rates, NVSR 66(1) table 4 and NVSR 70(2) table 2, fixed in births_level.py); the level is their mean. The voice's probabilities are shifted by one constant on the log-odds scale so that their mean equals the level; their order is unchanged.",
 "baselines": "age alone: logistic regression on age and its square; the regression on all facts (births_dev.py design); both fitted on NSFG 2011-2013 and scored on 2013-2015",
 "development": "Waves already read only; the 2022-2023 holdout was not used. Across waves (voice tuned on 2011-2013, scored on all 2017-2019, 4,757 women): voice AUC 0.734, age 0.652, regression 0.719; voice minus age +0.069 to +0.095, voice minus regression +0.007 to +0.022; observed 0.195 (0.184-0.207); level set once 0.199 (age alone 0.212, period ratio at fixed age 0.988), inside; the earlier rule 0.194 (voice mean 0.204 x GFR ratio 0.951). The same with 2017-2019 women inside the training ages (18-42, 4,437): observed 0.209 (0.197-0.222), level set once 0.212, inside. 2017-2019 halves (2,379 scored): voice AUC 0.735, age 0.656, regression 0.723; voice minus age +0.059 to +0.102, voice minus regression +0.001 to +0.022; observed 0.202 (0.187-0.218), level set once 0.190, inside. Where the level came from in development: the facts other than age moved the voice's mean by 0.961 against age alone, and the crude national rate fell by 0.951 while the rate at fixed age fell by 0.988; the earlier rule applied both.",
 "primary": "both: (1) the bootstrap 95% interval (2,000 resamples, seed 20261011) of AUC(voice) - AUC(age alone) lies above zero; (2) the level set once (the mean of the shifted voice) lies inside the bootstrap 95% interval of the observed birth share",
 "secondary": "voice against the regression on all facts (interval of the AUC difference); age alone's mean and the mean period ratio; the voice's own mean before the shift; the earlier rule (voice's own mean x the general fertility rate ratio of the window years, 0.975) for comparison",
 "scorer": "experiment/births/births_fresh_score.py at this commit, run from experiment/births: births_fresh_score.py w2011.csv w2013.csv voice-2013.jsonl > results-births-2013.json",
 "files": {
  "adapter_model.safetensors": "de0d5ef964d669a12f687e414dc29d32efd22bd26af8093c75f4ffc175a0987b",
  "adapter_config.json": "a60b65f25341cb37ff5e78d7fb4d25405299377487baa0b62e6282566cd60f6a",
  "births_voice.py": "f29d6eba549eef1216bd90c2ae3fdd95098a1dccf459911cc897ac796a9bfebe",
  "births_voice_score.py": "23b2972cb1dfa14362652fa662c171799f2951d77754e3525c1a042bfe88d218",
  "births_level.py": "d6c1b40253d98cc7d6afa944b310decce0d63a5c5f17cb3965cbb565383e2785",
  "births_prep.py": "0a17085c2d6c9e60f44720674881990faeec2568a833d6c55e9d632da3cdbaf2",
  "births_dev.py": "27445e88c203975e180f624fb271f3d68b3babbea3b50a98b1ee9bda94c272f2",
  "births_fresh_score.py": "6a34261314768c919f6e8d498bcb3d5c84dc401fd299ea7f1ce54261f1ed4525",
  "w2011.csv (training table, births_prep.py 2011, with the window start)": "e2738e613028193a42ed248c833b12141ad7aabe1e304b2ba4af0aec29c0411a",
  "2013_2015_FemRespSetup.dct": "6b21a07beab268d79e6aafe2dbd87a8b64daacc0b8a1f66530ea7df96329087f",
  "2013_2015_FemPregSetup.dct": "aecf35055db8be854b524ac6664ef49532757dc4b13776a7b6e6e11c50623815",
  "2013_2015_FemRespData.dat (unopened; 28,979,415 bytes from the CDC, its download was paused at registration, its sha256 is committed in docs/research/births.md before the table is built)": "pending",
  "2013_2015_FemPregData.dat (unopened, 4,473,124 bytes)": "97ed5f5549ff421c918e431ddf20f018ce50db774d1ee2129afd9ab0565a343a"
 },
 "order": "births_prep.py builds the 2013-2015 table only after this commit; the voice's scores are committed as voice-2013.jsonl before births_fresh_score.py reads the outcome; scored once",
 "publish": "results-births-2013.json whatever the outcome"
}
