# K8 control – zouiouich2025 (NIH-AARP, subsites; Curr Dev Nutr 9 (2025) 107540)

Full text: /home/claude/drive/post2015/zouiouich2025.txt (PDF-derived; Figure 1 values on p. 5, Figure 2 values on p. 6). Rows: 237 (zouiouich2025_001–237).

## Method
- `zou_check.py` parsed every printed HR cell in Fig 1 (13 sites × red/white × substitution/addition = 52 cells), Fig 2 (13 × 4 meat subtypes × 2 models = 104), Table 2 (13 × fish/poultry × 2 models = 52) and Table 3 (9 exposures × 3 stages = 27). Each cell was matched to **exactly one** row on exposure, includes_processed, outcome, subgroup, adjustment set and contrast_type, then point, ci_low, ci_high and n_cases were compared.
- Result: 235 of 235 cells matched one unique row. **0 point/CI mismatches, no duplicates, no orphan cells.** The two remaining rows (081, 082, sex-specific, from the Results text) were checked by hand: 1.18 (1.09, 1.29) and 1.25 (1.12, 1.40). Correct.
- Model typing, flags and definitions were checked by reading.

## Addition vs substitution typing (checked specifically)
| Adjustment set | Paper model | contrast_type | Rows | Verdict |
|---|---|---|---|---|
| m1 | Fig 1/Table 3 substitution, red vs white (+ total meat) | substitution | 34 | correct |
| m2 | Fig 2/Table 3 substitution, red unprocessed + red processed (+ total meat) | substitution | 32 | correct |
| m3 | Fig 2/Table 3 substitution, white unprocessed + white processed (+ total meat) | substitution | 32 | correct |
| m4 | Table 2/Table 3 substitution, fish or poultry (+ total meat) | substitution | 32 | correct |
| m5 | Table 3 total processed meat (+ total meat) | substitution | 3 | correct (the Table 3 title says "in substitution models") |
| m6 | Fig 1 addition, red + white, no total meat | continuous | 26 | correct |
| m7 | Table 2 addition, + total red meat | continuous | 26 | correct |
| m8 | Fig 2 addition, 4 subtypes, no total meat | continuous | 52 | correct |

Labels state the direction ("replacing white meat" / "replacing red meat"). Every addition model is `continuous`, with no substitution leaking in either direction.

## Main-model flags (one main per exposure × outcome × sex)
The script confirms exactly **one** `is_main_model = yes` row for each of the 24 exposure × outcome combinations (sex = all): red_total, red_unprocessed/partial, processed, white_meat/yes, fish and poultry, each × colorectal/proximal/distal/rectum. All main rows are addition-model rows (m6 for red_total and white_meat, m8 for red_unprocessed and processed, m7 for fish and poultry). Substitution, subsite and stage rows are all `no`. No main row exists for men or women, because only substitution values are printed by sex. That is consistent with the rule.

The choice of addition over substitution as main is defensible: it is the per-unit HR comparable to other cohorts. It is not the paper's headline, though (the abstract leads with substitution), and **it conflicts with tammi2024, where substitution rows are flagged main = yes** (see the SUMMARY). I report this as a cross-study convention issue, not an error here.

## Discrepancies
| estimate_id | field | in database | in paper | severity |
|---|---|---|---|---|
| 080, 083–090 | n_cases | empty | Fig 1 prints site totals: 9461 (080 has it), proximal 4565, cecum 1851, transverse 689, distal 2437, sigmoid 1799, rectal 2208, rectosigmoid 618, rectum 1590. All other Fig 1 rows carry them | minor |
| 080–090 | source_table | "Fig 1 (values from Results text)" | the values are printed in Fig 1 of the txt (p. 5); only 081/082 are text-only (Suppl Table 1 not available) | minor |
| 005–052 | n_cases | empty | Table 2 has no case column, but the subsite totals are the same as in Fig 1. Fill-in is optional | minor |
| 001–079 | source_page | "page not marked in txt" | page footers are present: Table 2 on p. 7, Table 3 on p. 8, Results text p. 5–7 | minor |
| 140, 148, 156 … (white processed, m8/m3) | exposure | `white_meat` / yes, the same code as total white meat (091, 093 …) | "White processed meat" is a different variable from "White meat" | minor (only exposure_text and adjustment_set distinguish them; is_main_model protects the main filter) |
| 059–061 vs 077–079; 136 etc. | exposure | `processed` used for both **red processed** (Fig 2, m2/m8) and **total processed (red + white)** (Table 3, m5) | Methods: "Total processed meat comprised red and white processed meats" | minor (same remark; consider adding a note or a sub-code) |
| 001, 002, 005 … (m4) | category_label | "replacing red meat (total meat constant)" | Model = fish (or poultry) + total meat, which by leave-one-out replaces *all other meat*. The authors' text says "Substituting red meat intake for either fish or poultry" | minor (the label follows the authors; a note on the formal model would help) |
| studies.csv | notes / journal / fulltext_file | "Journal name not printed in txt"; path "Understudier WCRF/oppfolginger/zouiouich2025.txt" | Running headers print "Current Developments in Nutrition 9 (2025) 107540"; the file is at post2015/zouiouich2025.txt | minor |

No critical or major discrepancies.

## Flags and definitions
- red_total / yes: "sum of intakes of unprocessed red meats … and processed red meats". Confirmed.
- red_unprocessed / partial: the list includes hamburger and liver plus the meat of mixed dishes. `partial` per the project's R6 convention (hamburger). Acceptable.
- poultry / yes: includes "poultry cold cuts, low-fat sausages, and low-fat hotdogs". Confirmed. fish / no: confirmed.
- is_mutually_adjusted_processed = yes on red_unprocessed m2/m8 rows (red processed is a term in the model). Confirmed.
- adjustments m1–m8: covariates match the Fig 1/Fig 2/Table 2/Table 3 footnotes. Whole grains rather than fibre (adj_fiber = no). Energy by nutrient density plus a total-energy covariate. Flags confirmed. m5 is inferred, since no exact terms are printed; that is correctly stated.
- studies.csv: n = 454,505, 9,461 cases, 6,896,619 person-years, median 18.42 y, 1995–96, age 50–71, 124-item FFQ, validation r 0.62/0.70, registry linkage, adenocarcinoma only, cases_rectum 2208. All confirmed. Subsite sums: 4565 + 2437 + 2208 = 9210, and 251 overlapping/NOS cases appear only in overall CRC. Consistent with Methods.

## Missing estimates
None with a printed CI:
- Total unprocessed → processed substitution (overall 15%, proximal 18%, cecum 33%) and total processed addition (16%, 18%, 30%) are given as percentages only, with Suppl Tables 1 and 3 not available.
- 25 g/1000 kcal, quintile, lag, BMI/race strata and E-values are in Suppl Tables 2 and 4–10, not available.

## Confirmed
All 237 rows are numerically confirmed. All rows are confirmed for exposure, outcome, subgroup, contrast type, model set, is_main_model and calibration flag, subject to the minor label, page and n_cases items above.

## Internal inconsistencies in the paper
- Results: "25 g/1000 kg intervals", a typo for kcal.
- Results: "unprocessed with meat (P = 0.04)", a garbled heterogeneity sentence.
- Fig 2: the red processed **substitution** value for the descending colon, 1.32 (0.61–2.85) (row 201), is identical to the splenic-flexure value (row 193), although the two subsites have 400 vs 238 cases. The addition values differ (1.31 (0.75–2.27) vs 1.34 (0.64–2.80)), and for the descending colon the substitution CI is much wider than the addition CI. This is probably a copy error in the figure. Row 201 is recorded as printed; check it against the PDF figure image before use.
- Abstract versus Fig 1: the abstract says red meat is "independently associated with … rectum (19%)", but the Results text says red meat "was not independently associated with the rectum" (meaning the C20 subsite, 1.10 (0.97–1.26), whereas "Rectal" overall is 1.19). The wording is ambiguous, but the numbers are consistent.

## Verdict
Fit for use. Every number matches, addition and substitution are typed correctly, and there is one main row per exposure × outcome. Outstanding items are cosmetic (n_cases on 080–090, page numbers), plus the cross-study main-flag convention. The per-50 g/1000 kcal (energy-density) unit is not convertible to g/day without assumptions, so it is correctly excluded from derived_per100g.
