Discrete Time Survival Analysis¤
PyDTS is a Python package designed for discrete-time survival analysis with competing risks, offering tools for model fitting, evaluation, and simulation.
PyDTS offers:
- Discrete-time competing-risks regression models.
- Automated procedures for hyperparameter tuning.
- Sure Independence Screening methods for feature selection.
- Model evaluation metrics for predictive accuracy and calibration.
- Simulation tools for generating synthetic datasets for research and testing.
Additional simulations and illustrative examples are available in Meir and Gorfine (2025), Discrete-Time Competing-Risks Regression with or without Penalization, Biometrics (2025), and in the accompanying Github Repository
Installation¤
PyDTS can be installed using PyPI as follows:
Dependencies¤
PyDTS supports Python versions 3.9–3.13.
The package requires the following dependencies (with version constraints chosen for compatibility across Python and NumPy/SciPy releases):
-
NumPy
-- Python 3.9:>=1.26,<2.1
-- Python 3.10:>=1.26,<2.3
-- Python 3.11–3.13:>=1.26(including NumPy 2.x) -
SciPy
-- Python 3.9:>=1.13,<1.14
-- Python 3.10:>=1.14,<1.16
-- Python 3.11–3.13:>=1.15 -
pandas
>=2.2.2 - scikit-learn
>=1.6 - statsmodels
>=0.14.2 - lifelines
>=0.27 - tqdm
>=4.66 - psutil
>=5.9 - seaborn
>=0.13 - formulaic
>=1.0
Quick Start¤
The following example demonstrates how to generate synthetic data and fit a TwoStagesFitter model.
Detailed definitions and explanations are available in the methods section.
The function generate_quick_start_df simulates a dataset with the following defaults:
- Sample size:
n_patients=10000 - Covariates:
n_cov=5independent covariates, each drawn from Uniform(0,1) distribution - Competing events:
j_events=2event types - Time scale:
d_times=14discrete time intervals - Hazard coefficients (default values):
- \(\alpha_{1t}\) = −1 − 0.3 * log(t)
- \(\alpha_{2t}\) = −1.75 − 0.15 * log(t)
- \(\beta_1\) = −log([0.8, 3, 3, 2.5, 2])
- \(\beta_2\) = −log([1, 3, 4, 3, 2])
For each patient, a censoring time \(C\) is drawn from Uniform{1, ..., 14}. The observed time is defined as \(X = min(T, C)\), where \(T\) is the event time, sampled based on the covariates of each patient and the hazard coefficients. If censoring occurs before the event (\(C < T\)), the event type is set to \(J = 0\).
Once the dataset is generated, you can fit a TwoStagesFitter to the data (without columns \(C\) and \(T\) which are not observed in practice).
You can generate synthetic data and fit your first TwoStagesFitter model with the following code:
from pydts.fitters import TwoStagesFitter
from pydts.examples_utils.generate_simulations_data import generate_quick_start_df
# Generate a synthetic dataset with 10,000 patients,
# 5 covariates, 14 discrete time intervals, and 2 competing events
patients_df = generate_quick_start_df(n_patients=10000, n_cov=5, d_times=14, j_events=2, pid_col='pid', seed=0)
# Initialize and fit the discrete-time competing-risk model
fitter = TwoStagesFitter()
fitter.fit(df=patients_df.drop(['C', 'T'], axis=1))
# Display model summary
fitter.print_summary()
Citations¤
If you found PyDTS software useful to your research, please cite the papers:
@article{Meir_PyDTS_2022,
author = {Meir, Tomer and Gutman, Rom, and Gorfine, Malka},
doi = {10.48550/arXiv.2204.05731},
title = {{PyDTS: A Python Package for Discrete Time Survival Analysis with Competing Risks}},
url = {https://arxiv.org/abs/2204.05731},
year = {2022}
}
@article{Meir_Gorfine_DTSP_2025,
author = {Meir, Tomer and Gorfine, Malka},
doi = {10.1093/biomtc/ujaf040},
title = {{Discrete-Time Competing-Risks Regression with or without Penalization}},
year = {2025},
journal = {Biometrics},
volume = {81},
number = {2},
url = {https://academic.oup.com/biometrics/article/81/2/ujaf040/8120014},
}
and please consider starring the project on GitHub
How to Contribute¤
- Open Github issues to suggest new features or to report bugs\errors.
- Provide feedback on the documentation.
- Contact Tomer or Rom if you want to add a usage example to the documentation.
- If you want to become a developer (thank you, we appreciate it!) - please contact Tomer or Rom for developers' on-boarding.
Tomer Meir: tomer1812@gmail.com, Rom Gutman: rom.gutman1@gmail.com
Running Tests Locally¤
To run the test suite on your local machine, follow these steps:
- Clone the repository
-
Install the package in editable mode
-
Run the test suite with Poetry