# K8 control – tammi2024 (five pooled Finnish cohorts; Eur J Epidemiol 39:419–428)

Full text: /home/claude/drive/post2015/tammi2024.txt (PMC). Rows: 33 (tammi2024_001–033).

## Method
- Table 3 rows 005–020 were checked by script (`tammi_check.py`): point, ci_low, ci_high and p_value for Model 1 and Model 2. **0 mismatches.**
- The text-only rows (001–004 and 021–033) were checked by hand against Results paragraphs 1, 2, 4, 5 and 6. **0 numeric mismatches.**
- Units, model sets, flags and study fields were checked by reading.

## Per-week units (checked specifically)
- The paper works in g/WEEK throughout: "per consumption of 100 g/week (red meat…) or 50 g/week (processed meat)". The database uses dose_unit `per_100g_week` / `per_50g_week` / `per_200g_week` (codebook additions) and labels such as "Red meat -100 g/week". Correct, and nothing is silently converted to g/day.
- dose_conversions tammi2024_dc01/02 give 14.29 and 7.14 g/day. Correct arithmetic.
- **Warning for downstream use:** derived_per100g turns 1.03 (1.00–1.06) per 100 g/week into 1.03^7 = 1.23 (1.00–1.50) per 100 g/day. The printed HR has two decimals, so the true value of 1.025–1.035 gives 1.19–1.27 per 100 g/day. That is a 7th-power amplification of rounding error. Processed meat 1.01^14 = 1.15 has the same problem, worse (1.005–1.015 gives 1.07–1.23). These derived values should carry a rounding-uncertainty note or be excluded from per-100 g pooling.

## Substitution rows (checked specifically)
- 16 Table 3 rows (005–020), 4 excluding-ATBC rows (021–024), 5 doubled/quadrupled-amount rows (025–029) and 4 whole-grain-median strata rows (030–033). All values match.
- Direction: each HR is for *less* meat plus *more* plant food (leave-one-out with a sum variable). HR < 1 therefore means replacing meat lowers risk. This runs opposite to Zouiouich, whose substitution rows give the HR for *more* red meat replacing white meat. The labels make the direction explicit, but any script combining substitution rows across studies must invert one of them.
- Model 2 substitution = m4 (Model 2 covariates + sum variable). Correct.

## Discrepancies
| estimate_id | field | in database | in paper | severity |
|---|---|---|---|---|
| tammi2024_006, 008, 010, 012, 014, 016, 018, 020 | is_main_model | yes | Model 2 is the most-adjusted model, but this gives red_unprocessed × colorectal × all **five** main rows (001 hvl, 003 continuous, 4 substitution rows), and processed meat four (002 hvl + 3 substitution). Zouiouich2025 codes substitution rows as main = no. Inconsistent convention across studies | major (flag convention; a filter on is_main_model alone returns several rows per exposure × outcome) |
| adjustments tammi2024_m2 | adj_family_history / covariates_text | unclear; text includes "ATBC substitution analyses additionally family history" | Methods: family history was added only to the **substitution** analyses (in ATBC). m2 covers the single-food-group rows 001–004, so family history should be `no` and the clause belongs only in m4 | minor |
| adjustments tammi2024_m4 | adj_family_history | unclear | Methods say ATBC substitution analyses were adjusted. Results say the results stayed the same "after we adjusted … for family history (data not shown)", which implies Table 3 is without it. `unclear` is justified; note the contradiction (see below) | none (confirmed) |
| tammi2024_001, 002 | n_cases / n_in_category | 1124 / 43788 on a Q5-vs-Q1 row | totals for the whole population, not for Q5 (per-quintile counts are only in Online Resource 4) | minor (move to notes or blank) |
| tammi2024_002 | p_trend | 0.026 | printed as "P = 0.026", not "P-trend" (the red-meat clause says P-trend) | minor (notes already flag it) |
| all | source_page | "txt l.###" | journal pages 419–428 are not in the txt | minor |

## Flags and definitions
- red_unprocessed / no: confirmed ("Red meat included beef, pork and lamb"). Processed meat is separate: "sausages … and cold cuts …, including those made of beef, pork or lamb".
- weight_basis = raw: confirmed for red meat ("uncooked red meat" in decomposed dishes). Processed meat is weighed "as such".
- Model 1 = sex, age, energy. Model 2 = + education, smoking, height, BMI, physical activity, HRT (women), alcohol, dairy. adjustments m1–m4 flags confirmed. Energy = covariate. adj_stratified_center = yes is acceptable for the two-stage pooling.
- tammi2024_004 (processed per 50 g/week, Model 1, main = no): correct. Only the Model 1 value is printed, and Model 2 is "not statistically significant" without numbers.
- studies.csv: n = 43,788, 1,124 cases, median 28.8 y, 79% men, FFQ, Cancer Registry, ICD codes, design pooled_cohorts. All confirmed. ATBC contributes 949 of 1,124 cases (84%), and the cohort overlaps Pietinen 1999. This is correctly noted.

## Missing estimates
None codeable:
- Red meat per 100 g/week Model 1, processed per 50 g/week Model 2 and quintile Q2–Q4 HRs are only in Online Resource 4 (not available).
- Processed meat substitution at 100 g/week ("borderline 2% risk reductions") has no numbers.
- Sensitivity excluding low consumers prints only P values (0.06, 0.08).
- Excluding-ATBC processed substitutions: "remained essentially the same", no numbers.
- ATBC-only estimates: not printed.

## Confirmed
All 33 rows are numerically confirmed. Rows 001–005, 007, 009, 011, 013, 015, 017, 019 and 021–033 are confirmed in all fields, apart from the minor items above. Rows 006–020 (even numbers) are confirmed except for the is_main_model convention.

## Internal inconsistencies in the paper
- Family history: Methods say it was added to the ATBC substitution analyses, while Results describe that adjustment as a separate check ("data not shown").
- tammi2024_024: "0.97, 0.93 − 0.99" (excluding ATBC, combined substitution) is log-asymmetric (upper 0.020, lower 0.042). Possibly a misprint; it is recorded as printed. tammi2024_025 "0.94 (0.89–0.98)" is mildly asymmetric and within rounding.
- The doubled substitutions (025–029) print the same P values as the 100 g/week analyses. That is expected for a rescaled increment and confirms that the doubled rows are deterministic rescalings, not new information. Avoid double counting.

## Verdict
Fit for use, with two cautions. First, the is_main_model convention for substitution rows needs to be harmonised across studies. Second, the per-week → per-day rescaling of two-decimal HRs is too imprecise for per-100 g/day pooling without a stated uncertainty.
