A high-performance survival analysis library written in Rust with Python bindings
Project description
survival
A high-performance survival analysis library written in Rust, with a Python API powered by PyO3 and maturin.
Features
- Core survival analysis routines
- Cox proportional hazards models with frailty
- Kaplan-Meier and Aalen-Johansen (multi-state) survival curves
- Nelson-Aalen estimator
- Parametric accelerated failure time models
- Fine-Gray competing risks model
- Penalized splines (P-splines) for smooth covariate effects
- Concordance index calculations
- Person-years calculations
- Score calculations for survival models
- Residual analysis (martingale, Schoenfeld, score residuals)
- Bootstrap confidence intervals
- Cross-validation for model assessment
- Statistical tests (log-rank, likelihood ratio, Wald, score, proportional hazards)
- Sample size and power calculations
- RMST (Restricted Mean Survival Time) analysis
- Landmark analysis
- Calibration and risk stratification
- Time-dependent AUC
- Conditional logistic regression
- Time-splitting utilities
Installation
From PyPI (Recommended)
pip install survival
From Source
Prerequisites
Install maturin:
pip install maturin
Build and Install
Build the Python wheel:
maturin build --release
Install the wheel:
pip install target/wheels/survival-*.whl
For development:
maturin develop
Usage
Aalen's Additive Regression Model
from survival import AaregOptions, aareg
data = [
[1.0, 0.0, 0.5],
[2.0, 1.0, 1.5],
[3.0, 0.0, 2.5],
]
variable_names = ["time", "event", "covariate1"]
# Create options with required parameters (formula, data, variable_names)
options = AaregOptions(
formula="time + event ~ covariate1",
data=data,
variable_names=variable_names,
)
# Optional: modify default values via setters
# options.weights = [1.0, 1.0, 1.0]
# options.qrtol = 1e-8
# options.dfbeta = True
result = aareg(options)
print(result)
Penalized Splines (P-splines)
from survival import PSpline
x = [0.1 * i for i in range(100)]
pspline = PSpline(
x=x,
df=10,
theta=1.0,
eps=1e-6,
method="GCV",
boundary_knots=(0.0, 10.0),
intercept=True,
penalty=True,
)
pspline.fit()
Concordance Index
from survival import perform_concordance1_calculation
time_data = [1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0]
weights = [1.0, 1.0, 1.0, 1.0, 1.0]
indices = [0, 1, 2, 3, 4]
ntree = 5
result = perform_concordance1_calculation(time_data, weights, indices, ntree)
print(f"Concordance index: {result['concordance_index']}")
Cox Regression with Frailty
from survival import perform_cox_regression_frailty
result = perform_cox_regression_frailty(
time_data=[...],
status_data=[...],
covariates=[...],
# ... other parameters
)
Person-Years Calculation
from survival import perform_pyears_calculation
result = perform_pyears_calculation(
time_data=[...],
weights=[...],
# ... other parameters
)
Kaplan-Meier Survival Curves
from survival import survfitkm, SurvFitKMOutput
# Example survival data
time = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
status = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] # 1 = event, 0 = censored
weights = [1.0] * len(time) # Optional: equal weights
result = survfitkm(
time=time,
status=status,
weights=weights,
entry_times=None, # Optional: entry times for left-truncation
position=None, # Optional: position flags
reverse=False, # Optional: reverse time order
computation_type=0 # Optional: computation type
)
print(f"Time points: {result.time}")
print(f"Survival estimates: {result.estimate}")
print(f"Standard errors: {result.std_err}")
print(f"Number at risk: {result.n_risk}")
Fine-Gray Competing Risks Model
from survival import finegray, FineGrayOutput
# Example competing risks data
tstart = [0.0, 0.0, 0.0, 0.0]
tstop = [1.0, 2.0, 3.0, 4.0]
ctime = [0.5, 1.5, 2.5, 3.5] # Cut points
cprob = [0.1, 0.2, 0.3, 0.4] # Cumulative probabilities
extend = [True, True, False, False] # Whether to extend intervals
keep = [True, True, True, True] # Which cut points to keep
result = finegray(
tstart=tstart,
tstop=tstop,
ctime=ctime,
cprob=cprob,
extend=extend,
keep=keep
)
print(f"Row indices: {result.row}")
print(f"Start times: {result.start}")
print(f"End times: {result.end}")
print(f"Weights: {result.wt}")
Parametric Survival Regression (Accelerated Failure Time Models)
from survival import survreg, SurvivalFit, DistributionType
# Example survival data
time = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
status = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] # 1 = event, 0 = censored
covariates = [
[1.0, 2.0],
[1.5, 2.5],
[2.0, 3.0],
[2.5, 3.5],
[3.0, 4.0],
[3.5, 4.5],
[4.0, 5.0],
[4.5, 5.5],
]
# Fit parametric survival model
result = survreg(
time=time,
status=status,
covariates=covariates,
weights=None, # Optional: observation weights
offsets=None, # Optional: offset values
initial_beta=None, # Optional: initial coefficient values
strata=None, # Optional: stratification variable
distribution="weibull", # "extreme_value", "logistic", "gaussian", "weibull", or "lognormal"
max_iter=20, # Optional: maximum iterations
eps=1e-5, # Optional: convergence tolerance
tol_chol=1e-9, # Optional: Cholesky tolerance
)
print(f"Coefficients: {result.coefficients}")
print(f"Log-likelihood: {result.log_likelihood}")
print(f"Iterations: {result.iterations}")
print(f"Variance matrix: {result.variance_matrix}")
print(f"Convergence flag: {result.convergence_flag}")
Cox Proportional Hazards Model
from survival import CoxPHModel, Subject
# Create a Cox PH model
model = CoxPHModel()
# Or create with data
covariates = [[1.0, 2.0], [2.0, 3.0], [1.5, 2.5]]
event_times = [1.0, 2.0, 3.0]
censoring = [1, 1, 0] # 1 = event, 0 = censored
model = CoxPHModel.new_with_data(covariates, event_times, censoring)
# Fit the model
model.fit(n_iters=10)
# Get results
print(f"Baseline hazard: {model.baseline_hazard}")
print(f"Risk scores: {model.risk_scores}")
print(f"Coefficients: {model.get_coefficients()}")
# Predict on new data
new_covariates = [[1.0, 2.0], [2.0, 3.0]]
predictions = model.predict(new_covariates)
print(f"Predictions: {predictions}")
# Calculate Brier score
brier = model.brier_score()
print(f"Brier score: {brier}")
# Compute survival curves for new covariates
new_covariates = [[1.0, 2.0], [2.0, 3.0]]
time_points = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0] # Optional: specific time points
times, survival_curves = model.survival_curve(new_covariates, time_points)
print(f"Time points: {times}")
print(f"Survival curves: {survival_curves}") # One curve per covariate set
# Create and add subjects
subject = Subject(
id=1,
covariates=[1.0, 2.0],
is_case=True,
is_subcohort=True,
stratum=0
)
model.add_subject(subject)
Cox Martingale Residuals
from survival import coxmart
# Example survival data
time = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
status = [1, 1, 0, 1, 0, 1, 1, 0] # 1 = event, 0 = censored
score = [0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2] # Risk scores
# Calculate martingale residuals
residuals = coxmart(
time=time,
status=status,
score=score,
weights=None, # Optional: observation weights
strata=None, # Optional: stratification variable
method=0, # Optional: method (0 = Breslow, 1 = Efron)
)
print(f"Martingale residuals: {residuals}")
Survival Difference Tests (Log-Rank Test)
from survival import survdiff2, SurvDiffResult
# Example: Compare survival between two groups
time = [1.0, 2.0, 3.0, 4.0, 5.0, 1.5, 2.5, 3.5, 4.5, 5.5]
status = [1, 1, 0, 1, 0, 1, 1, 1, 0, 1]
group = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2] # Group 1 and Group 2
# Perform log-rank test (rho=0 for standard log-rank)
result = survdiff2(
time=time,
status=status,
group=group,
strata=None, # Optional: stratification variable
rho=0.0, # 0.0 = log-rank, 1.0 = Wilcoxon, other = generalized
)
print(f"Observed events: {result.observed}")
print(f"Expected events: {result.expected}")
print(f"Chi-squared statistic: {result.chi_squared}")
print(f"Degrees of freedom: {result.degrees_of_freedom}")
print(f"Variance matrix: {result.variance}")
Built-in Datasets
The library includes 30 classic survival analysis datasets:
from survival import load_lung, load_aml, load_veteran
# Load the lung cancer dataset
lung = load_lung()
print(f"Columns: {lung['columns']}")
print(f"Number of rows: {len(lung['data'])}")
# Load the acute myelogenous leukemia dataset
aml = load_aml()
# Load the veteran's lung cancer dataset
veteran = load_veteran()
Available datasets:
load_lung()- NCCTG Lung Cancer Dataload_aml()- Acute Myelogenous Leukemia Survival Dataload_veteran()- Veterans' Administration Lung Cancer Studyload_ovarian()- Ovarian Cancer Survival Dataload_colon()- Colon Cancer Dataload_pbc()- Primary Biliary Cholangitis Dataload_cgd()- Chronic Granulomatous Disease Dataload_bladder()- Bladder Cancer Recurrencesload_heart()- Stanford Heart Transplant Dataload_kidney()- Kidney Catheter Dataload_rats()- Rat Treatment Dataload_stanford2()- Stanford Heart Transplant Data (Extended)load_udca()- UDCA Clinical Trial Dataload_myeloid()- Acute Myeloid Leukemia Clinical Trialload_flchain()- Free Light Chain Dataload_transplant()- Liver Transplant Dataload_mgus()- Monoclonal Gammopathy Dataload_mgus2()- Monoclonal Gammopathy Data (Updated)load_diabetic()- Diabetic Retinopathy Dataload_retinopathy()- Retinopathy Dataload_gbsg()- German Breast Cancer Study Group Dataload_rotterdam()- Rotterdam Tumor Bank Dataload_logan()- Logan Unemployment Dataload_nwtco()- National Wilms Tumor Study Dataload_solder()- Solder Joint Dataload_tobin()- Tobin's Tobit Dataload_rats2()- Rat Tumorigenesis Dataload_nafld()- Non-Alcoholic Fatty Liver Disease Dataload_cgd0()- CGD Baseline Dataload_pbcseq()- PBC Sequential Data
API Reference
Classes
Core Models:
AaregOptions: Configuration options for Aalen's additive regression modelPSpline: Penalized spline class for smooth covariate effectsCoxPHModel: Cox proportional hazards model classSubject: Subject data structure for Cox PH modelsConditionalLogisticRegression: Conditional logistic regression modelClogitDataSet: Dataset for conditional logistic regression
Survival Curves:
SurvFitKMOutput: Output from Kaplan-Meier survival curve fittingSurvfitKMOptions: Options for Kaplan-Meier fittingKaplanMeierConfig: Configuration for Kaplan-MeierSurvFitAJ: Output from Aalen-Johansen survival curve fittingNelsonAalenResult: Output from Nelson-Aalen estimatorStratifiedKMResult: Output from stratified Kaplan-Meier
Parametric Models:
SurvivalFit: Output from parametric survival regressionSurvregConfig: Configuration for parametric survival regressionDistributionType: Distribution types for parametric models (extreme_value, logistic, gaussian, weibull, lognormal)FineGrayOutput: Output from Fine-Gray competing risks model
Statistical Tests:
SurvDiffResult: Output from survival difference testsLogRankResult: Output from log-rank testTrendTestResult: Output from trend testsTestResult: General test result outputProportionalityTest: Output from proportional hazards testSurvObrienResult: Output from O'Brien transformation
Validation:
BootstrapResult: Output from bootstrap confidence interval calculationsCVResult: Output from cross-validationCalibrationResult: Output from calibration analysisPredictionResult: Output from prediction functionsRiskStratificationResult: Output from risk stratificationTdAUCResult: Output from time-dependent AUC calculation
RMST and Survival Metrics:
RMSTResult: Output from RMST calculationRMSTComparisonResult: Output from RMST comparison between groupsMedianSurvivalResult: Output from median survival calculationCumulativeIncidenceResult: Output from cumulative incidence calculationNNTResult: Number needed to treat result
Landmark Analysis:
LandmarkResult: Output from landmark analysisConditionalSurvivalResult: Output from conditional survival calculationHazardRatioResult: Output from hazard ratio calculationSurvivalAtTimeResult: Output from survival at specific timesLifeTableResult: Output from life table calculation
Power and Sample Size:
SampleSizeResult: Output from sample size calculationsAccrualResult: Output from accrual calculations
Utilities:
CoxCountOutput: Output from Cox counting functionsSplitResult: Output from time-splittingCondenseResult: Output from data condensingSurv2DataResult: Output from survival-to-data conversionTimelineResult: Output from timeline conversionIntervalResult: Output from interval calculationsLinkFunctionParams: Link function parametersCchMethod: Case-cohort method specificationCohortData: Cohort data structure
Functions
Model Fitting:
aareg(options): Fit Aalen's additive regression modelsurvreg(...): Fit parametric accelerated failure time modelsperform_cox_regression_frailty(...): Fit Cox proportional hazards model with frailty
Survival Curves:
survfitkm(...): Fit Kaplan-Meier survival curvessurvfitkm_with_options(...): Fit Kaplan-Meier with configuration optionssurvfitaj(...): Fit Aalen-Johansen survival curves (multi-state)nelson_aalen_estimator(...): Calculate Nelson-Aalen estimatorstratified_kaplan_meier(...): Calculate stratified Kaplan-Meier curvesagsurv4(...): Anderson-Gill survival calculations (version 4)agsurv5(...): Anderson-Gill survival calculations (version 5)
Statistical Tests:
survdiff2(...): Perform survival difference tests (log-rank, Wilcoxon, etc.)logrank_test(...): Perform log-rank testfleming_harrington_test(...): Perform Fleming-Harrington weighted testlogrank_trend(...): Perform log-rank trend testlrt_test(...): Likelihood ratio testwald_test_py(...): Wald testscore_test_py(...): Score testph_test(...): Proportional hazards assumption testsurvobrien(...): O'Brien transformation for survival data
Residuals:
coxmart(...): Calculate Cox martingale residualsagmart(...): Calculate Anderson-Gill martingale residualsschoenfeld_residuals(...): Calculate Schoenfeld residualscox_score_residuals(...): Calculate Cox score residuals
Concordance:
perform_concordance1_calculation(...): Calculate concordance index (version 1)perform_concordance3_calculation(...): Calculate concordance index (version 3)perform_concordance_calculation(...): Calculate concordance index (version 5)compute_concordance(...): General concordance calculation
Validation:
bootstrap_cox_ci(...): Bootstrap confidence intervals for Cox modelsbootstrap_survreg_ci(...): Bootstrap confidence intervals for parametric modelscv_cox_concordance(...): Cross-validation for Cox model concordancecv_survreg_loglik(...): Cross-validation for parametric model log-likelihoodcalibration(...): Model calibration assessmentpredict_cox(...): Predictions from Cox modelsrisk_stratification(...): Risk group stratificationtd_auc(...): Time-dependent AUC calculationbrier(...): Calculate Brier scoreintegrated_brier(...): Calculate integrated Brier score
RMST and Survival Metrics:
rmst(...): Calculate restricted mean survival timermst_comparison(...): Compare RMST between groupssurvival_quantile(...): Calculate survival quantiles (median, etc.)cumulative_incidence(...): Calculate cumulative incidencenumber_needed_to_treat(...): Calculate NNT
Landmark Analysis:
landmark_analysis(...): Perform landmark analysislandmark_analysis_batch(...): Perform batch landmark analysis at multiple time pointsconditional_survival(...): Calculate conditional survivalhazard_ratio(...): Calculate hazard ratiossurvival_at_times(...): Calculate survival at specific time pointslife_table(...): Generate life table
Power and Sample Size:
sample_size_survival(...): Calculate required sample sizesample_size_survival_freedman(...): Sample size using Freedman's methodpower_survival(...): Calculate statistical powerexpected_events(...): Calculate expected number of events
Utilities:
finegray(...): Fine-Gray competing risks model data preparationperform_pyears_calculation(...): Calculate person-years of observationperform_pystep_calculation(...): Perform step calculationsperform_pystep_simple_calculation(...): Perform simple step calculationsperform_score_calculation(...): Calculate score statisticsperform_agscore3_calculation(...): Calculate score statistics (version 3)survsplit(...): Split survival data at specified timessurvcondense(...): Condense survival data by collapsing adjacent intervalssurv2data(...): Convert survival objects to data formatto_timeline(...): Convert data to timeline formatfrom_timeline(...): Convert from timeline format to intervalstmerge(...): Merge time-dependent covariatestmerge2(...): Merge time-dependent covariates (version 2)tmerge3(...): Merge time-dependent covariates (version 3)collapse(...): Collapse survival datacoxcount1(...): Cox counting process calculationscoxcount2(...): Cox counting process calculations (version 2)agexact(...): Exact Anderson-Gill calculationsnorisk(...): No-risk calculationscipoisson(...): Poisson confidence intervalscipoisson_exact(...): Exact Poisson confidence intervalscipoisson_anscombe(...): Anscombe Poisson confidence intervalscox_callback(...): Cox model callback for iterative fitting
PSpline Options
The PSpline class provides penalized spline smoothing:
Constructor Parameters:
x: Covariate vector (list of floats)df: Degrees of freedom (integer)theta: Roughness penalty (float)eps: Accuracy for degrees of freedom (float)method: Penalty method for tuning parameter selection. Supported methods:"GCV"- Generalized Cross-Validation"UBRE"- Unbiased Risk Estimator"REML"- Restricted Maximum Likelihood"AIC"- Akaike Information Criterion"BIC"- Bayesian Information Criterion
boundary_knots: Tuple of (min, max) for the spline basisintercept: Whether to include an intercept in the basispenalty: Whether or not to apply the penalty
Methods:
fit(): Fit the spline model, returns coefficientspredict(new_x): Predict values at new x points
Properties:
coefficients: Fitted coefficients (None if not fitted)fitted: Whether the model has been fitteddf: Degrees of freedomeps: Convergence tolerance
Development
Build the Rust library:
cargo build
Run tests:
cargo test
Format code:
cargo fmt
The codebase is organized with:
- Core routines in
src/ - Tests and examples in
test/ - Python bindings using PyO3
Dependencies
- PyO3 - Python bindings
- ndarray - N-dimensional arrays
- faer - Pure-Rust linear algebra
- itertools - Iterator utilities
- rayon - Parallel computation
Compatibility
- This build is for Python only. R/extendr bindings are currently disabled.
- macOS users: Ensure you are using the correct Python version and have Homebrew-installed Python if using Apple Silicon.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file survival-1.2.3.tar.gz.
File metadata
- Download URL: survival-1.2.3.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb8d2fd766be5a2b43c145d86edcb547f3f05115f51953192c93af9b9b73d71f
|
|
| MD5 |
43cdde84d26bc4fb99e1a361bbd2465f
|
|
| BLAKE2b-256 |
5e2e4756d18f00cb6f5bc6ad5fe046a1a945163010d80702d2f423a2c944be3b
|
File details
Details for the file survival-1.2.3-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: survival-1.2.3-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 5.3 MB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3036789fef82f00bdc41bb6735d03ec567a3eb0c24054a35e630302d24e46f0
|
|
| MD5 |
3fb841815841e2c114124ead4ecef3ba
|
|
| BLAKE2b-256 |
28433dd72001249d00678176cbdff30bbf92fc3e630487b547886a07d2149b04
|
File details
Details for the file survival-1.2.3-cp314-cp314-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: survival-1.2.3-cp314-cp314-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.14, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16898f6b99d647846714007c9948e8738fe027558177b43390684d4d53bcd43e
|
|
| MD5 |
7b526ece1c87c601ec5d8cc12e0e52b6
|
|
| BLAKE2b-256 |
2d308de18f30796af546076a8a7ed9d7f37f94cf9847547722003afbe9339ef9
|
File details
Details for the file survival-1.2.3-cp314-cp314-manylinux_2_39_aarch64.whl.
File metadata
- Download URL: survival-1.2.3-cp314-cp314-manylinux_2_39_aarch64.whl
- Upload date:
- Size: 4.8 MB
- Tags: CPython 3.14, manylinux: glibc 2.39+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
690a4d0e225a3425c5fdc7aeffe6296f48efb8264280fdfc06838b00a4b70e96
|
|
| MD5 |
ab9a82e3a8c9e4e9bb05f6496420b71f
|
|
| BLAKE2b-256 |
ffa540e30b416fb64ef17ef6e6f45c277808d469897ac95d64704dac8cadb94d
|
File details
Details for the file survival-1.2.3-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: survival-1.2.3-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.5 MB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf26bb29e6b6c26d6dbd0ac6e4a7482d2ae31e026c4f43fe20bb45f70dfa763b
|
|
| MD5 |
b736f82d635992b2b64cd848cbb7c56b
|
|
| BLAKE2b-256 |
8127b9b53989a59645fd87dd30bd76d94b1163789874f0eb9233a6b7df73c75e
|
File details
Details for the file survival-1.2.3-cp314-cp314-macosx_10_12_x86_64.whl.
File metadata
- Download URL: survival-1.2.3-cp314-cp314-macosx_10_12_x86_64.whl
- Upload date:
- Size: 5.1 MB
- Tags: CPython 3.14, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6885bc0792c2f7adcf7e364bf871f3f7c1dcc09d91972d3b4bc9cc99623f16d
|
|
| MD5 |
0cd50f5bb23f50a2931f81e889808b48
|
|
| BLAKE2b-256 |
1b178262f77e3bb2c78c48aad6e69068e40636ba5ac3c973edb4c6ffbfda3afb
|