# K12 – Independent check of vulcan2017 (Malmö Diet and Cancer Study)

Controller: independent Opus instance (K12), 2026-10-30.
Source: `/home/claude/drive/post2015/sok2026/vulcan2017.txt` (Europe PMC XML, tables inline). Food Nutr Res 2017;61:1341810, so there are no journal page numbers. `source_page` is therefore table-referenced throughout, which is acceptable.
Rows checked: all 633 `estimates.csv` rows with study_id = vulcan2017, plus 3 `adjustments.csv` rows, the `studies.csv` row, the `cohorts.csv` row (mdcs) and spot checks of `dose_conversions.csv`.
Method: I parsed Tables 2–4 cell by cell from the source text by script, independently of the database (630 cells plus 21 p-trend rows). I then compared them field by field with the database: n_cases, person_years, dose_point (quintile median), point, ci_low, ci_high, p_trend (rank 5 only), category_label, adjustment_set_id, is_main_model, exposure_includes_processed and category_set_id. The three text-only HvL rows were checked by hand. I ran CI symmetry and point-in-CI checks, and checked that case and person-year counts add up across sexes and quintiles. The extractor's NOTES.md was read only after this check was complete.

## Result in one line
**0 transcription errors.** Every printed number in all 633 rows matches the paper exactly. The weak points are in the paper itself: Tables 3 and 4 contain many apparent misprints. The extractor recorded them as printed and flagged nearly all of them. I found three small additional anomalies, listed below. `corrections.csv` contains only a header.

## Counts by type (633 rows)

| Type | Rows | Meaning |
|---|---|---|
| ok | 439 | Every field matches the paper, and the paper value looks plausible |
| transcription | **0** | Database differs from the printed paper |
| flag | 76 | Correct as printed, but rests on a coding judgement or has a plausibility concern (CI-width pattern, reference HR blank in print, assumptions in HvL text rows) |
| misprint-in-paper | 118 | Printed value(s) in the row look like a misprint in the paper; kept as printed |

The misprint count is high mainly because two whole rectal median columns look misprinted (Table 4 total red meat and pork: 60 rows). Only about 25 rows have a suspect HR or CI.

## Findings table

### A. Fields verified (no discrepancy)
| Field | Result |
|---|---|
| point / ci_low / ci_high | 630/630 table rows identical to print. There are 3 reference rows (_031 T2 beef all basic; _543 T4 processed women basic; _573 T4 poultry women basic) where the paper leaves the HR cell blank. The database codes them 1.00 and notes this, which is consistent with KODEBOK check 3. Status: flag, not error. |
| n_cases, person_years | 630/630 identical (spaces, commas and NBSP in "84 ,071", "50 ,640" and "50,907" correctly normalised) |
| dose_point / category_label | 630/630 = printed whole-cohort quintile medians. The labels are "Qn (median x g/day)". Sex-specific rows use the whole-cohort medians, which matches the header "Quintiles for all", and this is noted. |
| p_trend | 126/126 Q5 rows match. Q1–Q4 rows are empty, as the codebook requires. |
| model / adjustment_set_id | Basic → m1 (315). Full → m2 (245): all-sex and men in Tables 2–4, plus women in Table 2, where the header has no footnote c. Women full in Tables 3–4 → m3, which adds HRT (70). All correct. |
| is_main_model | yes = the full model (315 rows); no = basic and the 3 sensitivity rows. Correct under §4.2: the paper calls it the "full multivariate model". |
| is_calibrated / is_mutually_adjusted_processed | no / no. Correct: the paper says mutual-adjustment models are "data not shown". |
| exposure_includes_processed | red_total yes; processed yes; beef and pork partial ("mainly based on non-processed meat"); red_unprocessed no; poultry unclear (not defined); fish yes (the paper's fish variable includes processed fish). All defensible. |
| HvL text rows _631–_633 | 1.15 (0.86, 1.52), p 0.074; 0.56 (0.36, 0.88), p 0.035; 1.05 (0.71, 1.56), p 0.155. All match the Sensitivity analyses text. _631: the text does not state sex, and the database assumes all. _631–_633: the model is assumed to be the full model, with the assumption noted. Status: flag (assumptions), numbers ok. |
| Text vs tables | All 11 HvL figures quoted in the Results text match the table cells. |

### B. adjustments.csv
- m1 (basic): sex, age, method version, season, total energy. Flags are correct.
- m2 and m3: `adj_bmi = unclear` is correct and important. The Methods say the full model "was also adjusted for … BMI", and the authors say excluding BMI made no difference. But every table footnote b omits BMI. `adj_hrt = unclear` in m2 is defensible, because the Methods say "when appropriate" while the Table 2 header carries no footnote c for women. m3 has `adj_hrt = yes`, which is correct.
- `energy_method = residual` is correct, and total energy is also a covariate. Diabetes and dietary covariates are all coded no. Correct: those models are "data not shown".

### C. studies.csv / cohorts.csv
These all match the paper: n = 27 931 (16 944 W + 10 987 M); 428 924 person-years; mean follow-up 15.4 years; baseline 1991–1996; diet_history with 168 questionnaire items; registry outcomes; cases CRC 728 (372/356), colon 463 (247/216), rectum 265 (125/140). I re-derived the sex splits from the table columns and they agree. The cohorts.csv row codes mdcs as a child of epic, with an overlap warning. This is correct and important for pooling. No issues.

### D. Printed anomalies in the paper (misprint-in-paper; kept as printed)
**Already flagged by the extractor in row notes (I confirm each):**

| Rows | Table / cell | Problem |
|---|---|---|
| _098, _104, _116 | T2 unprocessed, all, full Q2/Q3/Q5 | Q5 1.08 (1.06, 1.09) is impossibly narrow for 144 cases. Q3 0.88 sits against basic 1.07. The Q2 CI is narrower than basic. |
| _140, _146 | T2 processed, all, full Q4 = Q5 | Both print 1.20 (0.94, 1.53) |
| _084, _090 | T2 pork, men, full Q4 = Q5 | Both print 1.26 (0.87, 1.82) |
| _151–_176 (poultry, T2) | T2 poultry | All-sex cases (141/147/150/146/144) are identical to the unprocessed column, and women + men do not add up per quintile (Q5: 68 + 105 ≠ 144). Men's Q3 person-years repeat 19 125, against an expected ≈28 670 from all − women. |
| _241–_266, _279–_298, _337–_390 (selection) | T3 | Beef all-sex cases sum to 460, not 463 (Q3: 94, but women + men = 97). Beef basic Q3 0.78 (0.66, 1.14) has its point off-centre. Women's pork HRs nearly duplicate the Table 2 women's CRC pork HRs. Men's pork basic Q3 = Q4. Processed all-sex basic CIs are garbled: 1.32 (1.32, 1.20), 1.07 (1.07, 1.14), 1.17 (0.42, 1.00), 1.16 (0.35, 1.22). Men's poultry cases sum to 186, not 216. Poultry all-sex basic Q2 1.33 against full 0.98. |
| _421–_450 | T4 total red meat | Medians 12.0–69.2, against 43.6–146.2 in Tables 2–3 |
| _481–_510 | T4 pork | The medians equal the unprocessed medians (21.3–95.3). Person-years repeat across Q2/Q3 (all-sex 84 758; men 32 355). Men's cases sum to 138. The all-sex full CIs (0.92–2.25, 0.69–1.91, 0.57–1.86, 0.47–2.44) are inconsistent with the basic CIs. |
| _461, _470 | T4 beef | Men basic Q2 1.37 (0.74, 3.53), probably 2.53. All-sex full Q4 1.18 (0.75, 1.75) is asymmetric. |
| _621 | T4 fish, women, basic Q4 | 0.86 (0.42, 1.52) is asymmetric, against full 0.78 |

**New, not noted in the database (minor; no correction needed, suggest adding notes):**

| Rows | Table / cell | Problem | Suggested action |
|---|---|---|---|
| _439, _440 | T4 total red meat, all-sex Q4 | Printed person-years 84 644, but women 48 445 + men 35 799 = 84 244. The 400 gap is probably a typo; in every other quintile the sexes sum to the all-sex figure within ±2. | Add to the notes; keep as printed |
| _110 | T2 unprocessed, all, full Q4 | 0.98 (0.80, 1.20) is narrower than basic 1.07 (0.85, 1.35). This is the same pattern as Q2 (_098), and it means the whole all-sex full column for unprocessed meat is suspect, not just Q2, Q3 and Q5. | Add to the notes. The all-sex full unprocessed set (_092–_116) should not be used for dose-response; women and men separately are fine. |
| _103, _109 | T2 unprocessed, all, basic Q3 = Q4 | Both print 1.07 (0.85, 1.35), with different person-years. A coincidence is possible. | Flag only |

**Flag group (76 rows):** These are the rows with only a "CI width n× what case counts imply" note: unprocessed, processed, poultry and fish in Tables 3–4, all sexes. In these sets the CIs widen steadily from Q2 to Q5. For example, colon women unprocessed Q5 is 0.53 (0.17, 1.65) with 39 cases. This pattern is typical of an analysis where the log-transformed continuous variable, or some other non-categorical specification, leaked into the quintile table. I agree with the extractor that these rows should be treated as possibly misreported. The group also includes the 3 blank-reference rows, _103/_109, the 0.0/0.0 poultry median rows, and the 3 text HvL rows.

## Missing estimates
- None in the available text. Every meat, poultry and fish × CRC/colon/rectum cell in Tables 2–4 has exactly one row (630 = 3 outcomes × 7 exposures × 3 sexes × 2 models × 5 quintiles), and all three sensitivity HvL figures in the text are coded.
- **Supplementary Table 2** (meat × BMI-status interaction, Suppl-Meat_processed.docx) is not in the source file. It probably holds BMI-stratified HRs, which would be subgroup rows. It is listed in the studies notes as not retrieved. Suppl. Table 1 holds only correlations.
- There are no continuous (per-gram) estimates in the paper.

## Paper internal inconsistencies (text vs table / methods vs footnotes)
1. The Methods put BMI in the full model, but footnote b in Tables 2–4 omits it. This explains `adj_bmi = unclear`.
2. The Methods say HRT is used "when appropriate", but Table 2 has no footnote c for women, while Tables 3–4 do.
3. The rectal-table medians conflict with the colorectal and colon tables (D above). The dose_conversions notes already give the Table 2/3 medians as an alternative for sensitivity analysis. I recommend using **them** as the primary doses for the rectal total red meat and pork sets, because the printed medians are almost certainly wrong. This is a choice for the analysis, not a coding error.

## Verdict
The extraction is fit for use and transcribed exactly. The paper itself is the problem. For pooling or dose-response:
- (a) Use colorectal (Table 2) rows first.
- (b) Exclude, or run only as a sensitivity, the all-sex full unprocessed set (_092–_116), the Table 3 processed basic set, and the Table 4 pork all-sex full set.
- (c) Use the Table 2/3 medians for the rectal red meat and pork doses.
- (d) Remember that mdcs is part of EPIC, so it must never be pooled with EPIC rows that include Malmö.

corrections.csv: no rows (header only).
