Guided analysis
Cox proportional-hazards regression
Map time, status and covariates, and get the Table 3 a manuscript needs: unadjusted hazard ratios beside adjusted ones from the joint model, a forest plot of the adjusted estimates, and a proportional-hazards check reported without blocking the fit.
Adjust for what else is going on
Kaplan–Meier shows whether survival curves differ. Cox regression answers the next question: by how much, after accounting for the other things that differ between patients? Each covariate gets a hazard ratio — the relative event rate per unit (for a number) or versus a reference level (for a category).
Unadjusted hazard ratios come from one model per covariate. Adjusted hazard ratios come from a single joint model, so each is the effect of that variable holding the others fixed — the difference between the two columns is the confounding the adjustment removed.
Is Cox appropriate?
Use it when each row is one independent participant with a follow-up time, an event or censoring status, and the baseline covariates you want to adjust for. The model assumes proportional hazards: the hazard ratio for each covariate is roughly constant over follow-up.
This tool checks that assumption with scaled Schoenfeld residuals and warns when it looks violated, but it does not fit stratified, time-varying, or competing-risks models. If curves cross or the check flags a covariate, seek statistical review before interpreting the hazard ratios.
How to read the result
- HR < 1: lower event rate (protective). HR > 1: higher.
- A numeric covariate's HR is per one unit — scale the variable first if one unit is too small to be meaningful.
- A category's HR is versus its reference level, shown as "1 (reference)".
- A 95% CI that crosses 1 means the effect is not statistically resolved.
With fewer than about 10 events per model term, adjusted estimates become unstable — the tool warns you when that happens.
Example output
| Characteristic | Unadjusted HR (95% CI) | Adjusted HR (95% CI) |
|---|---|---|
| arm (reference: Standard care) | ||
| New treatment | 0.78 (0.57–1.06, p=0.115) | 0.58 (0.41–0.80, p=0.001) |
| age (per 1 unit) | 1.05 (1.03–1.06, p<0.001) | 1.06 (1.04–1.08, p<0.001) |
| stage (reference: I) | ||
| II | 1.58 (1.08–2.32, p=0.018) | 1.46 (1.00–2.14, p=0.052) |
| III | 2.08 (1.41–3.06, p<0.001) | 2.44 (1.65–3.60, p<0.001) |
The text Figura produced for this example, ready to paste into a methods section:
Characteristic Unadjusted HR (95% CI, p) Adjusted HR (95% CI, p) arm (reference: Standard care) New treatment 0.78 (0.57–1.06, p=0.115) 0.58 (0.41–0.80, p=0.001) age (per 1 unit) 1.05 (1.03–1.06, p<0.001) 1.06 (1.04–1.08, p<0.001) stage (reference: I) II 1.58 (1.08–2.32, p=0.018) 1.46 (1.00–2.14, p=0.052) III 2.08 (1.41–3.06, p<0.001) 2.44 (1.65–3.60, p<0.001) Multivariable Cox proportional-hazards regression (n = 220, 157 events) adjusted for arm, age, stage. Unadjusted hazard ratios are from single-covariate models; adjusted hazard ratios are from the joint model. The proportional-hazards assumption was assessed with scaled Schoenfeld residuals (global p=0.509). Analyses were performed with Figura (Saha, 2026; https://figurastats.org), which runs R with the survival and ggplot2 packages in the browser.
Sample data
Download sample.csv — 220 rows, columns arm, age, stage, followup_months, status. A frozen synthetic dataset generated by a script in the repository's data-raw/ folder; nothing in it is a real patient.
How to cite
Journals ask for a software statement. The methods text Figura generates already ends with one; this is the same attribution in reference form.
Saha S. Figura: clinical manuscript figures and statistics in the browser. 2026. https://figurastats.org
@misc{figura2026,
author = {Saha, Sandeep},
title = {Figura: clinical manuscript figures and statistics in the browser},
year = {2026},
url = {https://figurastats.org},
note = {Accessed <date>}
}