# K4 control: knuppel2020 (UK Biobank, IJE 2020)

Controller: K4 (independent). Date: 2026-10-30.
Full texts: `drive/post2015/knuppel2020.txt` and `knuppel2020_suppl.txt`. The supplementary figures S1–S5 hold their numbers only in the image layer. I checked them against `pdf_in/knuppel2020_supplement_publisert.pdf`, pp. 31–35, rendered as images.
Method:
- **Suppl Tables S3–S7:** I script-parsed the colorectal, colon and rectum blocks (cases per category, Model 0/1/2 HRs, per-increment HR, P trend, total n per category, WebQ category means). I compared them field by field with all 216 rows.
- **Suppl Table S8:** script-parsed and compared with all 30 rows.
- **Figures S1–S5:** all 30 rows compared visually with the rendered figures (cases, HR, CI, n in figure title).
- **Definitions, models and adjustment flags:** checked by reading.

## Summary
- Rows checked: 276 of 276.
- Numbers confirmed: 276 of 276. Every point estimate, CI, P trend, case count, n per category and category mean matches.
- Discrepancies: 0 critical, 0 major, 2 minor, plus 1 coding decision to flag.
- Missing estimates: 0.
- Verdict: fit for use. The is_calibrated/is_main_model consequence below must be understood before pooling.

## Which table is which (explicitly requested)

| Suppl table | Content in paper | exposure in db | increment | Correct? |
|---|---|---|---|---|
| S3 | total meat | total_meat | per 100 g | yes |
| S4 | red and processed meat | red_total | per 70 g | yes |
| **S5** | **red meat** (unprocessed beef, lamb, pork) | **red_unprocessed** | **per 50 g** | **yes** |
| S6 | processed meat | processed | per 20 g | yes |
| **S7** | **poultry** | **poultry** | **per 30 g** | **yes** |
| S8 | by sex, all five exposures | as above | as above | yes |

The red-meat and poultry tables are not swapped. The S5 colorectal Model 2 trend is 1.22 (1.05–1.42), colon 1.36 (1.13–1.64), rectum 0.99 (0.77–1.27). These are the main-text red-meat values (p. 3). The S7 colorectal trend is 1.02 (0.91–1.14).

## Discrepancies

| estimate_id | field | in database | in paper | severity |
|---|---|---|---|---|
| knuppel2020 red_total rows (S4, S8, Fig S2) | exposure | `red_total` | "Red and processed meat" = red meat + **all** processed meat. The processed question includes chicken nuggets (Suppl Methods p. 2), so the variable is not purely red-meat products | minor (note for analysts; no better vocabulary value exists) |
| all category rows | dose_low / dose_high | empty | category bounds are printed in times/week (e.g. 1–<2 times/wk); dose_unit is g_day (WebQ means) | minor (bounds kept only in category_label; acceptable given the unit mismatch) |

## Checks requested by the brief

- **Unprocessed red meat definition (hamburger).** Red meat = beef + lamb/mutton + pork, each question marked "Do not count processed meats". The processed-meat question explicitly lists burgers, kebabs, bacon, ham, sausages, meat pies and chicken nuggets (Suppl Methods p. 2). So **hamburger sits in processed, not in red meat**. `red_unprocessed` with `includes_processed = no` is correct, and so is study `includes_processed = no`.
- **Per-unit scaling.**
  - Units are per_100g, per_70g, per_50g, per_20g and per_30g, which match the S3–S8 headers and the Suppl Methods increments.
  - Category `dose_point` holds the WebQ mean g/day per category, e.g. red meat 6.5 / 32.6 / 45.1 / 55.1. These are correct.
  - `dose_conversions` holds the same means.
- **is_calibrated.**
  - **Per-increment trend rows (105) are `yes`. Category rows (171) are `no`.**
  - The trend assigns re-measured WebQ category means "to reduce measurement error including regression dilution" (Suppl Methods p. 2). The Discussion says intakes were calibrated "using repeat measurements" (p. 10).
  - So `yes` is defensible and consistent with the codebook's "målefeilkorrigert".
  - **Consequence (decision point for Fable):** under R5 no per-unit row is main. The paper's headline red-meat estimate, 1.22 per 50 g/day, is `is_main_model = no`. Main = Model 2 category rows only.
  - Any CUP-type per-unit pooling must therefore either take the calibrated trend row deliberately, or rebuild per-unit estimates from the categories with Greenland–Longnecker.
  - **There is no uncorrected per-unit estimate in this paper.**
- **is_main_model.** `yes` on the 57 Model 2 category rows (19 categories × 3 outcomes), `no` elsewhere. This is correct under R5.
  - Sex-specific (S8) and sensitivity (Fig S1–S5) rows have no main row. Correct: they are per-increment only.
- **Models and adjustments.**
  - m1 = Model 0, m2 = Model 1 and m3 = Model 2 match the S3–S7 footnote.
  - m4 = the S8 and Fig S1–S5 footnotes, which omit cheese, milk and fish. Coded as printed, which is correct; it is probably the same model, footnote abbreviated.
  - `adj_energy = no` is correct: total energy is not available (p. 10).
  - Region stratification → `adj_stratified_center = yes` is acceptable.
  - No mutual meat adjustment, so `is_mutually_adjusted_processed = no` is correct.

## Missing estimates
None.
- Main-text Figures 1–5 (Model 2 per increment, all cohort) duplicate the S3–S7 continuous Model 2 rows. The colorectal, colon and rectum values in the text (p. 3) match the coded rows.
- Main-text sex-specific values (pp. 4, 7) match S8.
- Other cancer sites are out of scope.

## Independent re-derivation
- Category case sums equal the printed totals for every exposure × outcome. For red meat: CRC 228 + 1184 + 1282 + 507 = 3201; colon 2114; rectum 1109.
- Total n per category sums to the printed totals.
- Reference rows are coded 1.00 with empty CI.
- All CIs contain their point estimate. Log-symmetry: no flags.
- Study row:
  - n = 474,996; mean follow-up 6.9 y; cases_colorectal / colon / rectum = 3201 / 2114 / 1109 (the red-meat analysis, S5), all correct.
  - The `cases_*` fields are exposure-specific because CRC cases range from 3194 to 3228 across exposures. This is documented in the notes.

## Paper internal inconsistencies
1. **Abstract vs text and Table S6 for processed meat and CRC.**
   - Abstract (p. 1): per 20 g/day "1.18, 1.03–1.31".
   - Results (p. 3) and S6: 1.18 (1.06–1.31).
   - The database follows S6, which is correct. The Abstract CI is a misprint.
2. Subsample size: 69,076 in the Methods vs n = 69,073 in the Table S1 header. Already noted in the study row.
3. Footnotes: the Figure 5 and S8 / Fig S1–S5 footnotes omit cheese, milk and fish, while Model 2 in the S3–S7 footnotes includes them. Already noted in m2/m4.

## Rows confirmed as correct
All 276 rows (`knuppel2020_001`–`_276`), with the minor notes above.
