Paper: Kueh MTW, Intaran MAU, Goh R, et al. Body weight categories and fat distribution in relation to all-cause mortality among adults with metabolic dysfunction-associated steatotic liver disease: a population-based analysis of NHANES, 2007–2018. BMJ Open 2026;16:e113719.
Data: NHANES 2007–2018 (6 cycles) + NCHS Public-Use Linked Mortality Files (2019 release), all public. Software: R 4.5.1.
Scope note. These materials document a teaching reproduction of published analyses using the specified public data and course implementation. Differences from published results are reproducibility findings, not allegations of research misconduct, and may reflect analytic, implementation, or data-version differences. The findings below stand as recorded; this note frames how to read them, not whether they hold.
Verdict: Table 1, Table 2 and Figure 1 reproduce closely, though not exactly, from the public data. The analytic cohort is 1.1% larger than the paper’s (6,371 against about 6,300; the gap is unresolved, §6), group sizes differ by at most 2.3% (Group III, 787 against 769), there is one extra death (586 against 585), Group IV’s numbers at risk are within about 1% (§4), and the hazard ratios compared in §3 agree to within a few percent. Figure 2 reproduces for BMI (panel a) but not for WHtR (panel b), where our curve turns down above WHtR ≈ 0.75 while the published curve keeps rising; the paper does not report the spline specification, so the difference cannot be resolved from what is published. Six reproducibility findings surfaced along the way (alcohol exclusion, BMI cut-point labelling, CV-death definition, FLI circularity, survey design, the WHtR spline) and are documented below — these are the pedagogically useful part.
Every step carries a type label. A funnel shows N falling; it does not show why, and the reasons are not interchangeable.
| Step | Criterion | N | Type | Dropped |
|---|---|---|---|---|
| 0 | NHANES 2007–2018 records | 59,842 | — | — |
| 1 | Age ≥ 18 | 36,580 | ELIGIBILITY | 23,262 |
| 2 | In fasting subsample | 14,962 | DESIGN | 21,618 |
| 3 | FLI computable (TG + GGT + BMI + waist) | 14,170 | MISSINGNESS | 792 |
| 4 | Steatosis (FLI ≥ 60) | 6,052 | TARGET POPULATION | 8,118 |
| 5 | MASLD (≥ 1 cardiometabolic criterion) | 6,050 | TARGET POPULATION | 2 |
| 6 | Phenotype group assignable | 6,050 | MISSINGNESS | 0 |
| 7 | Mortality-eligible and linked | 6,048 | OUTCOME ASCERTAINMENT | 2 |
After eligibility, the two largest drops are Step 2
(design) and Step 4 (target population), and
neither is missing data. Step 2 is the NHANES fasting
subsample: it was selected deliberately, and WTSAF2YR
exists to account for that selection stage and its nonresponse, so the
correct response is the right weight and a domain analysis (P4), not
imputation. Step 4 is people without hepatic steatosis, who are not
missing — they are not who the paper is about. Genuine missingness here
is 792 item-nonresponse losses at Step 3 and,
separately, 2 outcome-ascertainment losses at Step 7:
different problems, not added together, and not 30,532, which is what
reading every post-age-eligibility reduction as attrition would
give.
Two row sets, kept apart.
| Row set | N | What it is |
|---|---|---|
| Full analytic file | 6,371 | the funnel above with Step 2 removed: every adult with a computable
FLI, whether or not they carry a valid fasting weight. It is the row set
the paper itself analyses and the cohort
02_build_analytic.R saves, so every table and figure under
output/ is built on it. |
| Locked domain | 6,048 | the funnel above as written: the records carrying a valid
WTSAF2YR. It is the only row set on which a design-aware
estimate is possible, and it is what P1 locks and P2–P5 analyse. |
The two differ by 323 records and neither is an
error. Dropping Step 2 lets 819 adults through Step 3 who have all four
FLI inputs but no valid fasting weight — that is why the full analytic
file’s own FLI step is 14,989 rather than 14,170 — and
323 of those 819 survive to the end. The paper is unweighted, so
6,371 is what reproduces it; 6,048 is
a different (correct) denominator, not a correction to the first. Quote
6,371 when you mean what reproduces the paper, and 6,048 when
you mean what a design-aware estimate can be computed on.
logs/sample_funnel.csv logs both chains, typed, and closes
with the Alcohol exclusion applied = FALSE switch, which is
why the full analytic file stays at 6,371 rather than dropping
further.
Fatty Liver Index (Bedogni 2006):
FLI = e^L / (1+e^L) × 100,
L = 0.953·ln(TG) + 0.139·BMI + 0.718·ln(GGT) + 0.053·WC − 15.745,
steatosis if FLI ≥ 60.
Phenotype groups: obesity = BMI ≥ 30 (≥ 25 for Asians); high central adiposity = WHtR ≥ 0.6.
| Group | Definition | Reproduced N | Paper N |
|---|---|---|---|
| I | obese, low central | 391 | 386 |
| II | obese, high central | 4,585 | 4,541 |
| III | non-obese, low central | 787 | 769 |
| IV | non-obese, high central | 608 | 604 |
| Characteristic | Reproduced | Published | Match |
|---|---|---|---|
| N (full analytic file) | 6,371 | 6,300 | ~ |
| Age, year (mean SD) | 51.0 (16.6) | 51.0 (16.6) | ✓ exact |
| Female, n (%) | 2,997 (47.0) | 2,973 (47.2) | ✓ |
| Waist, cm (median IQR) | 110.5 (103.7–119.5) | 111.0 (104.0–120.0) | ✓ |
| BMI, kg/m² | 33.2 (30.1–37.4) | 33.2 (30.2–37.4) | ✓ exact median |
| Systolic BP | 124.0 (114.0–136.0) | 124.0 (114.0–135.0) | ✓ |
| Diastolic BP | 72.0 (64.0–79.0) | 72.0 (64.7–79.3) | ✓ |
| Current smoking | 1,238 (40.9) | 1,210 (40.6) | ✓ |
| Family history CHD | 911 (14.6) | 904 (15.0) | ✓ |
| Hypertension | 3,448 (54.1) | 3,238 (52.6) | ≈ (+1.5) |
| T2DM | 1,595 (25.0) | 1,645 (26.1) | ≈ (−1.1) |
| Dyslipidaemia | 3,839 (60.3) | 3,612 (57.7) | ≈ (+2.6) |
| CKD | 1,296 (20.3) | 1,142 (18.1) | ≈ (+2.2) |
| Stroke | 270 (4.3) | 269 (4.4) | ✓ |
| MI | 520 (8.2) | 518 (8.4) | ✓ |
| Heart failure | 283 (4.5) | 283 (4.6) | ✓ exact n |
| COPD | 157 (5.2) | 152 (5.2) | ✓ exact % |
| Cancer | 624 (10.0) | 624 (10.1) | ✓ exact n |
All group-stratified columns and p-values are in
output/tables/table1_reproduced.{csv,html}.
Comorbidity definitions (calibrated to the paper’s prevalences — the paper uses composites, not pure self-report): - Hypertension = self-report or measured BP ≥ 140/90 - T2DM = self-report or HbA1c ≥ 6.5% - Dyslipidaemia = self-report or lipid-lowering meds or LDL ≥ 130 - MI = prior heart attack or coronary heart disease (MCQ160E ∪ MCQ160C) - CKD = eGFR < 60 (CKD-EPI 2021) or ACR ≥ 30 - Current smoking is expressed as a % of ever-smokers (matches the paper’s 40.6%)
Every reproduced estimate in this section is unweighted and drawn
from the full analytic file (6,371 rows, §1), with each group compared
against Group I. The unadjusted fits use all 6,371 rows; the Model 1 and
Model 2 fits are complete case: they keep only the rows with every
covariate in that model, a little under 6,371
(04_table2_cox.R does not print the exact N).
All-cause mortality
| Group | Events (repro / paper) | Unadjusted (repro) | Unadjusted (paper) | Model 2 (repro) | Model 2 (paper) |
|---|---|---|---|---|---|
| I | 5 / 5 | Reference | Reference | Reference | Reference |
| II | 389 / 388 | 6.68 (2.76–16.14) | 6.66 (2.76–16.09) | 2.37 (0.97–5.77) | 2.30 (0.94–5.60) |
| III | 74 / 74 | 6.23 (2.52–15.41) | 6.25 (2.53–15.47) | 3.00 (1.21–7.45) | 3.03 (1.22–7.53) |
| IV | 118 / 118 | 15.14 (6.19–37.04) | 15.13 (6.18–37.02) | 2.91 (1.18–7.21) | 2.89 (1.17–7.17) |
Cardiovascular mortality (CV death = underlying cause = diseases of heart)
| Group | Events (repro / paper) | Unadjusted (repro) | Unadjusted (paper) |
|---|---|---|---|
| I | 1 / 1 | Reference | Reference |
| II | 112 / 112 | 9.64 (1.35–69.04) | 9.64 (1.35–69.05) |
| III | 19 / 19 | 8.08 (1.08–60.38) | 8.11 (1.09–60.61) |
| IV | 26 / 26 | 16.75 (2.27–123.5) | 16.75 (2.27–123.4) |
Event counts match exactly except all-cause Group II (389 against
388, so 586 deaths against 585); the cardiovascular counts match exactly
(158). The unadjusted HRs agree to the 2nd–3rd significant figure; the
Model 2 HRs differ by up to about 3% (Group II, 2.37 against 2.30). Full
three-model table in
output/tables/table2_reproduced.csv.
output/figures/figure1_km.png — Kaplan–Meier by group.
Group IV falls to ≈ 0.80 survival at ~7 y; Group I stays highest;
log-rank p < 0.0001. Number-at-risk matches (e.g. Group IV 608 / 549
/ 431 / 330 vs paper 604 / 546 / 433 / 334).output/figures/figure2_rcs.png — restricted cubic
splines (4 knots, unadjusted, probability scale, matching the published
caption). Panel (a) BMI reproduces: a steep fall from ≈
0.22 at BMI 22 to ≈ 0.08 by BMI 33, then a shallow tail — the paper’s
“J-shaped trend towards reduced all-cause mortality as BMI increased”
(nonlinear p = 0.003). Panel (b) WHtR does not
reproduce at the upper tail. The published curve rises and then
flattens, staying highest at WHtR 1.0 (≈ 0.045 → ≈ 0.12). Ours rises to
a peak of ≈ 0.11 near WHtR 0.75 and then declines to ≈ 0.086 by
1.0 — an inverted U, not a monotonic increase. The overall association
is significant (p = 0.004) but the non-linearity is not (p = 0.073), and
the confidence band above WHtR ≈ 0.85 is very wide. See finding #6.The Table 1/2 column headers and the Methods text state different BMI cut-points. The headers read “BMI ≥ 25 / < 25”, while the reported BMI medians in the non-obese groups are 27.6 and 28.8, which a 25 cut cannot produce. The Methods text gives obesity = BMI ≥ 30, and coding to 30 reproduces the published group sizes; coding to 25 does not. We therefore read the analysis as using 30 and the printed headers as a labelling inconsistency.
The stated alcohol exclusion does not match the reported
numbers. The paper says it excluded “significant alcohol” (>
2 drinks/day men, > 1/day women), yet its N = 6,300 and 585 deaths
match a cohort with no material alcohol exclusion (our
6,371, 586 deaths). A faithful average-daily exclusion removes ~430
people (N → 5,944). We keep the paper-matching cohort as primary and
expose the exclusion as a sensitivity switch
(APPLY_ALCOHOL_EXCL in 02_build_analytic.R).
We could not reconcile the stated exclusion with the reported N
under any coding of the public alcohol variables we implemented; a
different implementation of the same sentence may reconcile
them.
CV mortality = “diseases of heart” only. Using
heart + cerebrovascular gives 185 CV deaths; heart-only gives exactly
the paper’s 158. Table 2 uses the heart-only
definition, built inside 04_table2_cox.R. The
cv_death variable saved in masld_analytic.rds
is still the broader heart + cerebrovascular one (185), so it does not
reproduce Table 2 if used directly.
FLI circularity (Reviewer 1’s point). FLI uses BMI and waist circumference, which also define the BMI/WHtR exposure groups — exposure and steatosis ascertainment share inputs. The paper’s TyG-index sensitivity analysis addresses this; it is one of the main methodological threats to interrogate, and one of the candidates for the dominant threat discussed in §7.
Complex survey design not applied. The paper
(and this reproduction) treat NHANES as a simple cohort — no
svydesign, weights, strata, or PSUs. Defensible for
internal HR estimation but affects national representativeness of the
descriptives.
The WHtR spline does not reproduce, and the specification
needed to check it is not reported. The published Figure 2b
rises across the whole WHtR range and stays highest at the top; ours
peaks near WHtR 0.75 and turns down (see §4). The Methods say only that
“restricted cubic splines were constructed” — no knot count, no knot
placement, no statement of whether the model was adjusted, and no
trimming rule for the sparse upper tail. Those are exactly the choices
that determine the shape where the data run out. Our panels use
rcs(x, 4) with the rms default knot placement,
so a different knot count, knot placement or trimming rule is a
plausible explanation for the divergence where the data thin out. This
is the clearest case in the paper of a published result that
cannot be checked from what is reported, and it is a better
worked example of under-specification than anything above.
> 18 gives
6,301 with 585 deaths, close to the published totals though not to every
group cell, but the paper’s Table 1 mean age, 51.0 (16.6), matches our
≥ 18 cohort instead (§2). The evidence conflicts, and the
+71 cannot be attributed to either reading from what is published.This reproduction is a worked example of the term project spine — and at two of the five increments, a worked example of what the increment has to repair:
| Increment | Course task | Where it lives in this reproduction |
|---|---|---|
| P1 — Analytic cohort | rebuild the cohort and type every funnel step | 02_build_analytic.R +
logs/sample_funnel.csv; §1 above is the typed funnel, and
the alcohol-exclusion finding (#2) is the P1 eligibility judgment
call |
| P2 — Confounding diagnostic (Table 1) | Table 1, variable roles, crude vs adjusted | 03_table1.R and §2; the BMI cut-point labelling
discrepancy (#1) and the composite comorbidity definitions are the P2
interrogation targets |
| P3 — Effect modification | stratum-specific estimates plus a formal interaction test, on the locked contrast | not in this pipeline — no script here fits an interaction. P3 is where a group adds one |
| P4 — Design-aware main estimate | replicate the headline, then re-estimate the way the design demands | 04_table2_cox.R replicates the unweighted
headline; the survey-design omission (#5) is precisely what P4 repairs,
using WTSAF2YR on the locked domain (§1) |
| P5 — Missing-data sensitivity | analyse the genuine missingness, and scope the rest | the 792 FLI item-nonresponse losses (§1) and the complete-case covariate loss in Models 1–2 (§3). The fasting-subsample restriction is DESIGN, not missingness: it is answered by the P4 weight and by a sentence naming the population it leaves you with, never by imputation |
Naming the single dominant threat is not a weekly increment; it is the analytic-judgment core of M1. The candidates this reproduction surfaces are FLI circularity (#4), the survey-design omission (#5), and the under-specified WHtR spline (#6).
What this reproduction does and does not establish.
The pipeline reproduces the paper’s analysis, and the discrepancies
above are documented rather than tuned away. Read crudely, Group IV has
the poorest observed survival, and the paper reports exactly that —
that descriptive claim does follow. Read with the
paper’s Model 2 adjustment, the picture is different: the Model 2
estimates for Groups III and IV are near enough to each other to be
indistinguishable (repro 3.00 vs 2.91, §3; paper 3.03 vs 2.89; all
unweighted and against Group I), so the Model 2 results do not
provide clear evidence that Group IV has higher mortality than
Group III. Estimated directly as Group IV against Group III, that
contrast is compatible with no difference as well as with a meaningful
increase — 1.05 (0.77–1.45) unweighted and 1.29 (0.89–1.86)
design-weighted (WTSAF2YR/6, strata and PSU; course
increments P2 and P4). These two are adjusted for Model 1, not Model 2,
and both are fitted on the 5,939 locked-domain rows complete on the
Model 1 covariates, so they differ from each other only in the
weighting. They belong to the course’s paper replication (the paper’s
four groups and covariates); the Week 4–7 lectures adjust for a
different covariate set, so their estimates for related contrasts
differ.
So the replication succeeds, and the disagreement is not with the authors’ arithmetic but with which contrast supports the stated conclusion. Do not report this reproduction as confirming the stronger, comparative reading — that the Group IV phenotype carries higher mortality than Group III, and does so independently of overall body weight. Neither the published table nor this pipeline establishes that.