# K4 control: bernstein2015 (NHS + HPFS, PLoS ONE 2015)

Controller: K4 (independent). Date: 2026-10-30.
Full text: `drive/post2015/bernstein2015.txt` (main article, 16 pp.). S1–S5 Files (DOCX) are not in the text file or in `pdf_in/bernstein2015.pdf`.
Method: I parsed every cell of Tables 2 and 3 into a script and compared it with all 144 table rows (point, CI, P for trend, cases, person-years, model, timing subgroup, main flag, calibration flag, unit, table). I checked the 19 text-sourced rows (145–163) by hand against the Results text. Definitions, adjustment flags and the study row I checked by reading.

## Summary
- Rows checked: 163 of 163.
- Numbers confirmed: 163 of 163. Every point estimate, CI, P for trend and case count matches the print.
- Discrepancies: 0 critical, 0 major, 2 minor.
- Missing estimates: 0 from the main text. The S1–S5 Files (cohort-specific tables and gram-increment estimates) are unavailable.
- Verdict: fit for use. See the paper-level warning about the distal-colon CI below before using `bernstein2015_096`.

## Discrepancies

| estimate_id | field | in database | in paper | severity |
|---|---|---|---|---|
| bernstein2015_037–144 (108 Table 3 rows) | person_years | Table 2 cohort totals per timing model (e.g. 3452754) | Table 3 prints no person-years, only cases per subsite (p. 8–9) | minor (documented in notes, but this is an imputed denominator, not a printed one) |
| (study row) | diet_items | empty | 61-item FFQ for NHS in 1980; 131-item FFQ for HPFS (p. 2) | minor |

## Checks requested by the brief

- **Unprocessed red meat definition (hamburger).** The FFQ items are beef or lamb as main dish, pork as main dish, "hamburger", and beef/pork/lamb as a sandwich or mixed dish (p. 3). The database has `exposure = red_unprocessed` and `exposure_includes_processed = partial` on all unprocessed rows, and study `includes_processed = partial`. This is correct under R6, which gives "hamburger included, bacon excluded" as its own example of `partial`.
  - **Cross-study inconsistency:** `zouiouich2025` red_unprocessed also lists hamburger but is coded `no`. One of the two must change. The codebook needs one rule for hamburger: either R6 literally (`partial`), or the WCRF/IARC view that minced fresh meat is unprocessed (`no`). See the zouiouich2025 report.
- **Per-unit scaling.** All rows are `per_serving` (per 1 serving/day), which is correct (Methods p. 3; Table 2/3 headers). No gram weight per serving is printed. The gram-increment estimates (100 and 120 g unprocessed; 30 and 50 g processed) exist only in the S5 File, which is unavailable. `dose_conversions` correctly assigns no grams.
- **is_calibrated.** `no` on all rows, which is correct. Repeated FFQs are averaged (cumulative average); this is not calibration.
- **is_main_model.** `yes` only on the multivariable cumulative-average rows (sex = all, 12 rows), plus the two sex-specific cumulative-average rows 145/146. This is correct: the paper calls cumulative average "the primary model" (p. 4). Age-adjusted, other timing, sensitivity and stratified rows are `no`, which is correct.
- **Models and adjustments.**
  - m1 (age-adjusted) and m2 (multivariable) match the Table 2/3 footnote a: endoscopy → screening, aspirin/NSAID, menopause/HRT, total fibre quintiles, folate, calcium, vitamin D, energy quintiles.
  - m3–m8 correctly add fruit and vegetables, animal, vegetable or total protein, and mutual meat adjustment (p. 9).
  - `is_mutually_adjusted_processed = yes` only on 153/154 (adjusted for processed red meat, fish and poultry), which is correct.
- **Cohort and sex.**
  - Pooled rows: `nhs_hpfs` / `all`.
  - 145, 150, 151, 157, 162, 163: `nhs` / `women`.
  - 146, 148, 149, 158–161: `hpfs` / `men`.
  - All correct.

## Missing estimates
- None in the main article. Every HR with a CI in the Results text (pp. 5, 7, 9, 10) has a row.
- Not available (supplement):
  - S1–S4 Files: NHS-only and HPFS-only tables by timing and subsite.
  - S5 File: per 100/120 g unprocessed and per 30/50 g processed. **S5 is the most valuable missing piece for dose-response pooling.**

## Independent re-derivation
- **Case counts.**
  - Women: 1735 total, with 809 proximal + 514 distal + 373 rectal = 1696.
  - Men: 996 total, with 342 + 303 + 216 = 861.
  - Combined subsites: 1151 / 817 / 589, which match Table 3. The rest are unspecified sites.
  - Person-years: 2,439,732 + 1,013,022 = 3,452,754, which matches Table 2.
- No category estimates exist, so there is no reference category to check.
- All CIs contain their point estimate. Log-symmetry flags only the `_001` rounding: 1.10 (1.04–1.15).

## Paper internal inconsistencies and warnings
1. **Distal cases: 817 vs 816.**
   - Table 3 and the sum 514 + 303 give 817.
   - The Abstract (p. 1) says "816 distal colon".
   - This is already noted in the database.
2. **Implausibly narrow CI for unprocessed red meat and distal colon (`bernstein2015_096`).** The paper prints 0.75 (0.68–0.82), P trend <0.001, in the Abstract, Results and Table 3, so the extraction is faithful. But the CI cannot be right:
   - The implied SE(log HR) is 0.048. That is smaller than for all colorectal cancer, 0.067 with 2731 cases, although distal has only 817 cases.
   - All other subsite × exposure SEs are 0.07–0.15.
   - Comparable pooled sensitivity models for the same contrast give 0.72 (0.56–0.92) and 0.74 (0.57–0.96) (p. 9). The single-cohort estimates are about 0.5–1.1 wide.
   - A random-effects pool of two cohorts cannot give 0.68–0.82.
   - Likely cause: a misprinted CI, possibly from a fixed-effect or other model. **Do not give this row its printed weight in any pooling without a decision; flag as `disputed`.**
3. Table 3 footnote prints "total fiber. (quintiles)": a typo with no effect on the data.

## Rows confirmed as correct
All 163 rows (`bernstein2015_001`–`_163`) match the paper for exposure, outcome, sex, subgroup, unit, n_cases, point, CI, p_trend, model, adjustment set, main and calibration flags, and table and page. The only exceptions are the two minor items above.
