Problem
Phase 1 (#58) proved the survival-to-engine path with bespoke, Weibull-only helpers inside an example. They are not reusable and are tied to one distribution and one hand-rolled maximum-likelihood fit.
Goal
Promote the machinery into a public heormodel.survival module with a clean, functional, composition-first interface that ingests a model fit from lifelines (any of its parametric families) and supports the curve operations a health economist needs. Phase 2 changes no acceptance number; it re-expresses the passing replication through the extracted layer.
Acceptance criteria
SurvivalCurve is one composed value object (a cumulative-hazard function of time); the families, curve algebra, and adapter are functions returning curves, with no class hierarchy.
- Public surface:
SurvivalCurve; families exponential, weibull, gompertz; adapter from_lifelines, sample_params; curve algebra apply_hazard_ratio, apply_acceleration_factor, mix, splice; and to_transition_matrix.
- The adapter is duck-typed, so the module imports without
lifelines; the fitting package installs with a new survival extra.
- The two engines and the parameter recovery reproduce the item-18 acceptance values through the public interface: reference table (5.64394 / 4.92709 / 4.18803), both engines recover the discounted life expectancy, closed forms for a constant hazard and a hazard ratio hold, and the fitted-model and probabilistic discounted life expectancies converge to 4.92709 as the sample grows.
- Ship
examples/survival_models.py, a website tutorial, an API reference section, changelog and roadmap updates, and doctest, closed-form, and convergence tests.
Follows #58.
Problem
Phase 1 (#58) proved the survival-to-engine path with bespoke, Weibull-only helpers inside an example. They are not reusable and are tied to one distribution and one hand-rolled maximum-likelihood fit.
Goal
Promote the machinery into a public
heormodel.survivalmodule with a clean, functional, composition-first interface that ingests a model fit fromlifelines(any of its parametric families) and supports the curve operations a health economist needs. Phase 2 changes no acceptance number; it re-expresses the passing replication through the extracted layer.Acceptance criteria
SurvivalCurveis one composed value object (a cumulative-hazard function of time); the families, curve algebra, and adapter are functions returning curves, with no class hierarchy.SurvivalCurve; familiesexponential,weibull,gompertz; adapterfrom_lifelines,sample_params; curve algebraapply_hazard_ratio,apply_acceleration_factor,mix,splice; andto_transition_matrix.lifelines; the fitting package installs with a newsurvivalextra.examples/survival_models.py, a website tutorial, an API reference section, changelog and roadmap updates, and doctest, closed-form, and convergence tests.Follows #58.