cox_hazards/lib.rs
1//! # cox hazards regression
2//!
3//! cox proportional hazards w/ elastic net regularization - survival analysis made easy
4//!
5//! ## what you get
6//!
7//! - standard cox regression
8//! - elastic net (ridge + lasso) for regularization
9//! - multiple solvers that actually work
10//! - all the survival metrics you need
11//! - parallel processing when you want it
12//!
13//! ## quick start
14//!
15//! ```rust
16//! use cox_hazards::{CoxModel, SurvivalData};
17//! use ndarray::Array2;
18//!
19//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
20//! // setup some survival data
21//! let times = vec![1.0, 2.5, 3.2, 4.1];
22//! let events = vec![true, false, true, true]; // true = died, false = censored
23//! let covariates = Array2::from_shape_vec((4, 2), vec![
24//! 1.0, 0.5, // patient features
25//! 2.0, 1.0,
26//! 1.5, 0.0,
27//! 3.0, 1.5,
28//! ])?;
29//! let data = SurvivalData::new(times, events, covariates)?;
30//!
31//! // fit w/ some regularization
32//! let mut model = CoxModel::new()
33//! .with_l1_penalty(0.1) // lasso
34//! .with_l2_penalty(0.1); // ridge
35//!
36//! model.fit(&data)?;
37//!
38//! // get risk scores
39//! let risk_scores = model.predict(data.covariates())?;
40//! # Ok(())
41//! # }
42//! ```
43
44pub mod data;
45pub mod model;
46pub mod optimization;
47pub mod metrics;
48pub mod error;
49
50pub use data::SurvivalData;
51pub use model::CoxModel;
52pub use error::{CoxError, Result};
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57 use ndarray::Array2;
58
59 #[test]
60 fn test_basic_functionality() {
61 let n_samples = 100;
62 let n_features = 5;
63
64 let times = vec![1.0; n_samples];
65 let events = vec![true; n_samples];
66 let covariates = Array2::zeros((n_samples, n_features));
67
68 let data = SurvivalData::new(times, events, covariates).unwrap();
69 assert_eq!(data.n_samples(), n_samples);
70 assert_eq!(data.n_features(), n_features);
71 }
72}