# The blind checks of the described versions

Two agents, who saw neither the results nor the writers' notes, checked every `described` specification against the rules (`code/described_rules.md` as it then stood). Their reports follow as they wrote them, with file paths shortened to the bundle's. How their five disagreements were settled is in `code/described_rules.md`; the rules have changed since, as that file records, so a report's reading of a rule may be one the study no longer uses.

## Checker 1: row014, row028, row034, row050, row058, row062, row066, row068, row087, row096, row100, row101, row106, row121, row131, row189

Two files have disagreements: row062 (two points) and row096 (one, low confidence). I agree with the other 14. In every diff the only removed line is a reworded comment in row014; nothing existing was altered. Each file's `applies` and `not_applied` together name exactly its qualifying departures. I opened nothing under `results/` and ran no code.

**row014: agree.** Departure 1 uses `bmi3` (<25, 25–30, ≥30, closed on the left), as the text prints. Departure 2's `vitd_supplement_2` counts two or more distinct vitamin D products. A person with one known vitamin D product and one product of unknown content is missing, which correctly adapts the original rule for missing.

**row028: agree.** The education median is taken over the study population's codes (unweighted), the same way as the file's other medians. The new constants function keeps `row028_constants`.

**row034: agree.** All four are literal readings: `smoker_ever`, `drinker_past_year`, the lib `education3` groups (below high school, high school, above), and total folate. Keeping the printed quartile cutpoints is consistent: they are text constants, not the sample's own quartiles even in the paper version.

**row050: agree.** Age in three groups (<40, 40–59, ≥60) is the literal reading of "<40, ≥60". For activity, the median includes zeros and missing values drop out (2005-2006 entirely, since it has no GPAQ), as the text describes. Re-splitting energy at the new sample's median applies the file's recorded decision ("the analytic sample's median") to the new sample.

**row058: agree.** "Fasting subjects" plus "weights following NHANES recommendations" supports the fasting subsample with WTSAF2YR. The quartiles are recomputed on that sample through `analytic()`.

**row062: disagree.**
- **Departure 1, moderate confidence.** The spec reads the printed Cockcroft-Gault formula with creatinine literally in mmol/L, which makes eGFR about 1,000 times too large. In both the exclusion and the covariate, the spec uses the printed formula (`egfr_printed`, `in_population_printed`).
  - The Methods also name CKD-EPI, so two literal readings remain. The tie-break rule picks the one that changes the paper version least, which is CKD-EPI 2009: the computation the paper version already does.
  - Taken in mmol/L, the formula also turns the text's own exclusion ("eGFR < 60 mL/min/1.73 m²") into a step that removes almost no one, so it isn't a coherent reading of the text as a whole.
  - What the rules require: departure 1 stays in `applies` with no change. `build` and `in_population` stay as they are, and the formula keeps `egfr`.
- **Departure 2, moderate-low confidence.** The spec keeps the fixed cutpoints 0.79 and 2.60 for `dii_library_t`.
  - The text calls the groups tertiles and prints equal counts (10,594 / 10,593 / 10,594). The printed cutpoints are exactly the sample tertiles of the DII as the paper grouped it (0.786 and 2.599 here).
  - With the fatty acids regrouped, the means fall by about 0.4, so the fixed cutpoints no longer make thirds. The brief says cutpoints that depend on the coding are recomputed on the described version's data.
  - What the rules require: a `constants` function giving tertiles of `dii_library` over the described population, closed on the left, used in `derive`.
- Departure 3 (`diabetes_methods`: HbA1c > 6.5, no medicines) and departure 4's `not_applied` reason (the paper describes no method for keeping people missing a covariate) are fine.

**row066: agree.** Weighted with WTDR2D, the population is the top quartile of residual-adjusted caffeine. The per-milligram term stays, because departure 1 is a reporting departure. With energy in the model, raw and adjusted caffeine give the same coefficient.

**row068: agree.** The change matches the existing "recorded in both cycles" variant.

**row087: agree.** Departure 4's single hinge model (`log_mn + log_mn_above`, both segments) is the natural reading of "a piecewise linear regression model" with a turning point. Departures 2 and 3 correctly need no change.

**row096: disagree (departure 4, low-to-moderate confidence).**
- The spec weights with WTMEC2YR, though the described version now uses fasting glucose and triglycerides, so it is an analysis of the fasting subsample.
- The file's own record of the text's version, `ROW096_TEXT` and its "as the text describes it, weighted (fasting subsample weight)" variant, uses WTSAF2YR. NCHS directs that weight for this subsample, and row058's spec chose it in the same situation.
- The spec's reading is the least-change one and the text names no weight, so this is arguable either way. My view is that WTSAF2YR is the decision the file records for the text's version.
- A side note, low confidence: `in_population` hard-codes deleting people missing the six categorical covariates. The text's rule switches to an "unclear" group when more than 10 are missing, and the described sample (five cycles, fasting subsample) is different. It probably doesn't bind, but I couldn't check it without the data.
- Everything else is right: the build reads fasting values and converts 2005-2008 ferritin, all five cycles are used, `ROW096_MODEL3_TEXT` adds METS-IR's components, and `race4_methods` puts other Hispanic among other races.

**row100: agree.** WTMEC2YR maps to WTMECPRP for 2017-2020, the weight the text names.

**row101: agree.** `race_methods` is the literal reading of Table 1's labels (White means non-Hispanic White).

**row106: agree.** The text says it followed CDC guidelines, which supports `subsample_weights` (WTSH2YR in 2013-2016). The weight scaling matches `pooled_weight`. `diabetes2` counts borderline as no, the least-change reading of "yes vs no".

**row121: agree.** `diabetes_text` and `hypertension_text` match the Methods. Departure 1's `not_applied` is valid: the text never says how participants outside the fasting subsample got an LDL-C value.

**row131: agree.** Current smoking is coded in every cycle. Departure 3 needs no change. The tertile sample is unchanged, because `current_smoker` is never missing.

**row189: agree.** `duration_all` (months converted to years, 0 for never-users) puts every woman in the model, and a never-user's duration of 0 is a real value, not an approximation. It gives 528 women, not the text's 548: the other 20 have no duration, and dropping them is the brief's default for the described model's sample.

## Checker 2: row191, row194, row218, row220, row221, row236, row249, row256, row284, row295, row296, row303, row306, row315, row319, row327

Of the 16 files, 14 agree and 2 disagree: row295 seriously, row315 on a small point. I didn't open `results/`, run any code, or edit anything. Every diff only adds; the only rewording is in comments (row194 education, row220 income).

**row191: agree.** Departure 1 is applied: all adults are kept, and the quartile cutpoints are recomputed on them by the existing constants function. Departure 2 is correctly `not_applied`: NHANES never asked "Do you drink alcohol now?", and past-12-month drinking would only stand in for it.

**row194: agree.** All five coding departures are applied through existing or new `_text` columns, and the text's drinking groups (`drinking`) are used. Some college (DMDEDUC2 4) goes with high school, which is the literal reading of "having completed ... high school / college graduate or above". `education_text` is built before `education` is overwritten, and its levels are added to `ROW194_CATEGORICAL` correctly.

**row218: agree.**
- Departures 1–5 are applied: weighted, mode/median imputation, `wwi_methods` = sqrt(waist)/weight (exactly the Methods' wording), and 12+ drinks in the past year for 2017-2018 with never drinkers as no.
- Departure 3 correctly takes no code change: the text's own exclusion of missing UUI already removes everyone aged 18–19.
- The new imputed column matches the existing pattern.
- Note: the described index is on a scale about 100 times smaller than the published WWI. The per-unit OR will therefore fall outside the published CI almost by construction. That follows the literal reading and doesn't break the rules.

**row220: agree.** All five are applied. The `pir3_methods` boundaries match the Methods' text (≤1, 1–3, ≥3). With the identity derive, 2017-2018 former drinkers come out as mild in `drinking_3` too.

**row221: agree.** Lifetime abstainers are kept, pregnant women are kept, and the complete-data step uses drinks a week. `drinks_week` is NA exactly when days are missing, or when there are drinking days but no drinks-per-day answer, which is the intent.

**row236: agree.** The paper's "UI data" reads as the two items its outcomes use, since the Methods say "focusing on two questionnaire items". Keeping the printed quartile cutpoints is consistent, because the coding didn't change, only the sample.

**row249: agree.** The two-day mean and the n-3/n-6 values in mg/kg/day are correct. Recomputing the quartiles on the two-day mean follows the brief's constants rule, and the constants' sample equals the fit's sample. Using the printed cutpoints would be a defensible alternative reading (low confidence it is better).

**row256: agree.** Departure 1 (followed = FALSE) correctly doesn't qualify. Departure 2 is applied by requiring two reliable recalls, with the CDAI restandardized over that population. Departure 3 uses `hyperlipidemia`, where criteria not measured count as not met; that is the literal reading, since the text's population keeps people outside the fasting subsample.

**row284: agree.** Departures 1 and 3 are applied: WTMEC2YR, and other Hispanic participants in "other". Departure 2 correctly doesn't qualify.

**row295: disagree, departure 1.** The spec switches to `mets_vf` (published formula, glucose in mg/dL, BMI outside the log). Two problems:
- **Units (moderate–high confidence).** The paper states no units for glucose, triglycerides or HDL; the extract says so explicitly. The mg/dL comes from the cited original paper, not this one. The followed computation uses glucose in mmol/L (LBDGLUSI). Under "unstated choices keep the file's decisions" and the least-change rule, the described version should keep glucose in mmol/L and only add the log.
- **Bracket placement (moderate–low confidence).** The Methods print `METS-IR = Ln [(2 × fasting glucose) + fasting triglycerides) × BMI] / [Ln (HDL-C)]`. The parentheses don't balance, but the square bracket after "Ln" closes after "× BMI". The departure's own detail renders it as `Ln[(... ) x BMI] / Ln(HDL-C)`. Read literally, that is ln((2G+TG)·BMI)/ln(HDL), not the ln(2G+TG)·BMI/ln(HDL) the spec uses. Both readings add one log, so the least-change rule doesn't decide, and the literal brackets favour logging the product.
- **Fix:** add a new column with the log restored and glucose kept in mmol/L (BMI inside the log if you accept the second point), with its own quartiles.

**row296: agree.** Groups by drinks a month. Moving past-year abstainers to "none" is the literal reading, since 0 drinks a month isn't "1–5", and the departure names that placement. Missing answers and the ALQ101 nondrinker rule keep the file's handling, and the sample is unchanged.

**row303: agree.** Departure 1 is applied (weighted with the examination weight). Departure 2 uses lymphocytes / platelets × neutrophils, per 100 as Table 3 enters SII; the per-100 point is a reporting departure and rightly stays. The same scale caveat as row218 applies.

**row306: agree.** Only departure 1 qualifies, and it is applied as `weighted = TRUE`. The weight is unstated, so the file's WTMEC2YR is kept.

**row315: disagree (minor, low impact).** Departures 1–3 are implemented correctly: Model 2 with age, `ckd_race_term`, and `hypertension_measured` read as told OR pressure 140/90 or more. The extract notes the printed "and", but "or" is the conventional reading. The problem is that `in_population` still requires `hypertension` (BPQ020 told) to be known. People who refused or didn't know BPQ020 but have measured pressure would be complete cases under the described model and are still dropped. The complete-data step should check `hypertension_measured` instead. This affects only a handful of people.

**row319: agree.**
- Departure 1 (followed = FALSE) correctly doesn't qualify.
- Departure 2: women 55 or older are added only when they gave no RHQ031 yes/no answer. That is the literal "no menstrual information", since anyone who answered the periods question has some.
- Departure 3: both recalls must be reliable, and the CDAI uses their mean.
- The CDAI's means, SDs and SD are recomputed over the described population, consistent with the file's convention.

**row327: agree.** Departures 1, 2, 4 and 5 are applied; 3 correctly doesn't qualify. The text defines MASLD as an outcome and its flow chart drops no one for the exclusions, so counting those excluded as non-MASLD is the literal reading. The USFLI insulin term is left unlogged as printed, `diabetes_ogtt` adds the 2-hour OGTT where the cycle gave it, and `active_printed` counts vigorous minutes once.

Outside the brief, so not counted as disagreements:
- Several papers state an imputation method the files don't use and don't record as a departure: multiple imputation in row236 and row256, random forest in row319, chained equations in row327. Each described version therefore stays complete-case.
- row315's text says it applied the NHANES III creatinine correction. The file records skipping it as a choice, not as a departure.
