# Protocol: Comparative re-analyses of the red meat – colorectal cancer meta-analyses, 2002–2016, and an updated 2026 analysis

Version 1.0, 30 October 2026. Written before the reported re-analysis runs, but after an exploratory round of scenario and multiverse runs on the same database earlier the same day (`kontroll/scenarios_report.md`, `kontroll/multiverse_report.md`). It fixes the rules for the reported runs; it is not a pre-registration. Any later change is logged at the end.

## 1. Aim
For each published synthesis (Norat 2002; Larsson & Wolk 2006; WCRF/AICR 2007; CUP 2010 / Chan 2011; IARC Monograph 114, 2015; CUP 2016/2017), (a) reproduce its pooled cohort estimate from the primary studies it cites, using its stated method; (b) list every deviation between what it extracted and what the primary papers print; (c) re-run it with each deviation corrected, one at a time and all together; (d) re-run it with the primary studies' later follow-ups substituted. Then (e) apply the CUP 2016 protocol to all cohort literature to October 2026, with a documented search.

## 2. Scope
- Prospective cohort and nested case-control / case-cohort studies only. Case-control studies are excluded (CUP has excluded them since 2010; Norat 2002 and WCRF 2007 pooled them, and for those two we reproduce the cohort stratum only and say so).
- Exposure: red meat (the synthesis's own definition; in corrected runs, unprocessed red meat where the paper separates it). Processed meat is not re-analysed here.
- Outcomes: colorectal, colon, rectum incidence. Mortality-only studies excluded (as CUP does).
- One estimate per cohort per analysis (cohorts.csv parent/overlap rules; pool.py refuses duplicates).

## 3. Data
The database `database/estimates.csv` (one row per published estimate, each verified against full text by an independent controller) and `database/derived_per100g.csv` (per-100 g/day conversions, with method and assumptions recorded). The synthesis's own extractions are in `database/cup_extraction.csv` (CUP 2016, CUP 2010 from Chan 2011 Table S1 and SLR 2010 Table 37) and will be added for Larsson 2006, Norat 2002 and WCRF 2007 from their printed tables/figures.

## 4. Reproduction rules (fixed before running)
R1. Use the synthesis's stated model (DerSimonian–Laird random effects unless it states fixed) and its stated increment (per 100 g/day for CUP; per 120 g/day for Norat 2002 and Larsson 2006; per 100 g/day and per time/week for WCRF 2007).
R2. Use exactly the studies the synthesis lists. If it lists a study we lack, run without it and report the gap and the published weight of the missing study.
R3. Use the synthesis's own per-study estimate when printed (forest plot or table). Reproduction succeeds when pooled point estimate and CI match to two decimals.
R4. Where the per-study estimate is not printed, derive it from the primary paper by Greenland–Longnecker using the synthesis's stated dose rules (portion size, midpoint rule, open-category rule). Report the derived value and its deviation from any value the synthesis implies.
R5. Deviations are classified: `exposure` (row includes processed meat / wrong variable), `dose` (wrong contrast or portion), `cases` (wrong count), `model` (observed vs calibrated; unadjusted vs adjusted for processed meat), `duplicate` (same cohort twice), `transcription` (number differs from paper), `inclusion` (study violates the synthesis's own inclusion rule).
R6. Corrected runs: one deviation class at a time; then all; then with later follow-ups of the same cohorts (`followups.csv`). Report leave-one-out for each run.
R7. Updated 2026 analysis: Europe PMC search with the CUP 2016 SLR search terms (recorded verbatim), restricted to 1 May 2015–31 Oct 2026, cohort designs, red meat, colorectal incidence; screening log kept; inclusion per SLR 2016 rules (prospective, incidence, red meat separable from processed where possible, most recent/complete publication per cohort). Pooled per 100 g/day DL random effects, HKSJ CI as sensitivity, nonlinear (restricted cubic spline) where ≥ 5 studies with ≥ 3 categories, subgroups by sex and region, leave-one-out, Egger, and the multiverse over extraction choices.

## 5. Reporting
Per synthesis: a table of published vs reproduced vs corrected vs follow-up estimates with k, I², weights; a deviation list with page references; a forest plot per run. All runs from one script (`scripts/reanalyses.py`) writing `kontroll/reanalyser/<synthesis>.md` and JSON for the HTML.

## 6. Independent control
Every synthesis's extraction table (what it included and the per-study values) is checked by a controller who did not build it, against the synthesis's printed pages. The pooled numbers are recomputed by a second script written independently of `pool.py` (`kontroll/meta_check.py`).

## 7. Known limits, stated in advance
- Case-control strata not reproduced (Norat 2002, WCRF 2007).
- The 2006 SLR document is not yet on disk; WCRF 2007 reproduction uses the 2010 SLR's description of it until it is.
- CUP's per-study dose assignments are inferred where Chan 2011 S1 / SLR tables do not print them; those rows are marked `inferred`.
- Several pre-2000 papers exist only as OCR; rows resting on OCR corrections are flagged and excluded from the main runs when unsupported by prose.
- All extraction and control was performed by AI agents (Opus) under the author's direction, with codebook, correction log and scripts published alongside.

## Change log
- 30.10.2026, after the runs: (1) `synthesis_extraction.csv` got an `analysis_set` column after control K11 showed the original columns mixed figure sets; no values changed. (2) Norat 2002: one value (Thun 1992, CPS-II) is not printed anywhere; the controller read it off Fig 2 (≈1.14, 0.93–1.39). It is kept in a separate, flagged row and shown as a separate run; R3 is reported as not met for Norat's cohort stratum without it. (3) R7 search: the MeSH block was translated to Europe PMC `MESH:`/`KW:` fields and the exposure block restricted to meat terms (documented in kontroll/sok2026/SEARCH_LOG.md); screening was two-stage because of 16,731 records. (4) Vulcan 2017 (Malmö), found by the search, overlaps EPIC and is a sensitivity analysis, not a main-pool row.
- 2026-10-30 (K19): R4 says "Greenland–Longnecker". Control K19 found that `gl_doseresponse.py` uses a variant: the between-category correlation from the GL pseudo-counts is rescaled to the published standard errors (not the textbook GL/Orsini covariance). The variant is kept, because it is what reproduced 21 of 26 CUP 2016 per-study values (Test 2) and always yields a positive-definite covariance; it is now documented in the module docstring and here. Textbook GL changes the 2026 main pool from 1.0967 (1.0447–1.1513) to 1.0955 (1.0433–1.1503) and the linear slope from 1.24 to 1.23; single-study slopes move by up to ±0.06 (Larsson 1.23 → 1.17). Reported as a sensitivity. Two small bugs fixed (case-control category totals; sex-specific case totals), no 2-dp change.
- 2026-11-01 (K26/R100–R102): (1) **One estimate per cohort** (§2) now also covers recorded participant overlap: `pool.py` enforces `cohorts.csv` `overlaps_with` (not only `parent_cohort_id`). The R7 main pool had ATBC twice (Pietinen 1999 and inside Tammi 2024); Pietinen 1999 is removed, following the CUP rule of keeping the later, larger publication. Main pool 1.0967 (1.0447–1.1513), k 20 → 1.0987 (1.0455–1.1546), k 19. The negative controls had Spencer 2010 (inside EPIC-Norfolk/Oxford) next to EPIC; removed. (2) **Calibrated rows.** R7 states no rule on calibration. In practice the R7 main pool uses observed rows, with one exception: Million Women enters with its calibrated row, the only red-meat row Papier 2025 prints (R22); removing it is a reported sensitivity (1.09 (1.04–1.14)). CUP's practice was observed rows where both were printed. (3) Hoang 2023 (UK Biobank) is added as a sensitivity analysis (frequency categories, CUP dose rules), not a multiverse option.
- 2026-11-02 (K27a/R105): WCRF 2007 Fig 4.3.3 (per 100 g/day) — two of the three rows (Pietinen 1999, Larsson 2005) are red meat including processed meat, reproduced within rounding from the papers' total-red-meat rows. Added as exposure deviations under R5 (with the papers' unprocessed rows as alternatives) and Norat 2005 calibrated vs observed as a model deviation; two new runs. No rule changed. This deviation was found after first publication by a control round, not by the original extraction.
- 2026-11-02 (K27a/R106): Larsson 2006 HvL — Järvinen 2001's 'red meat' is near-total meat (as already in CUP 2010/2016); added as exposure deviation (remove). Errors-only 1.21 (1.09–1.34), k 14 → 1.20 (1.09–1.33), k 13. Also R103 (derive_per100.py uses the SMC subsite totals; Test 2 again 21/26) and R104 (pool.py reports partial sub-cohort overlaps; duplicate epic_oxford row merged); no pooled estimate changes.
