///|
/// Survival Analysis module demo - Kaplan-Meier, log-rank, Cox PH model.
///
/// Run: moon run examples/survival_demo
fn main {
println("=== Survival Analysis Module Demo ===")
println(
"Kaplan-Meier estimation, log-rank test, Cox proportional hazards model",
)
println("Reference: Therneau T (2023) A Package for Survival Analysis")
println("")
// ------------------------------------------------------------------
// 1. Load sample survival data
// ------------------------------------------------------------------
println("=== 1. Load sample survival data ===")
let data = @bio.survival_sample_data()
println("n_samples: \{data.n_samples()}")
println("n_groups: \{data.n_groups()}")
let names = data.group_names()
let mut i = 0
while i < names.length() {
println(" group[\{i}]: \{names[i]}")
i = i + 1
}
println("")
// ------------------------------------------------------------------
// 2. Kaplan-Meier curve for the control group
// ------------------------------------------------------------------
println("=== 2. Kaplan-Meier curve for 'control' group ===")
let km_control = @bio.survival_kaplan_meier(data, "control")
println(@bio.survival_km_summary(km_control))
println(@bio.survival_km_to_string(km_control))
println("")
// ------------------------------------------------------------------
// 3. Kaplan-Meier curve for the treatment group
// ------------------------------------------------------------------
println("=== 3. Kaplan-Meier curve for 'treatment' group ===")
let km_treatment = @bio.survival_kaplan_meier(data, "treatment")
println(@bio.survival_km_summary(km_treatment))
println(@bio.survival_km_to_string(km_treatment))
println("")
// ------------------------------------------------------------------
// 4. Median survival for both groups
// ------------------------------------------------------------------
println("=== 4. Median survival ===")
match @bio.survival_median_survival(km_control) {
Some(t) => println("Median survival (control): \{t}")
None => println("Median survival (control): NA (curve did not cross 0.5)")
}
match @bio.survival_median_survival(km_treatment) {
Some(t) => println("Median survival (treatment): \{t}")
None => println("Median survival (treatment): NA (curve did not cross 0.5)")
}
println("")
// ------------------------------------------------------------------
// 5. Log-rank test comparing control vs treatment
// ------------------------------------------------------------------
println("=== 5. Log-rank test: control vs treatment ===")
let lr = @bio.survival_log_rank(data, "control", "treatment")
println(@bio.survival_logrank_summary(lr))
println("")
// ------------------------------------------------------------------
// 6. Fit Cox proportional hazards model
// ------------------------------------------------------------------
println("=== 6. Cox proportional hazards model ===")
let covariates = ["age", "treatment"]
let cox = @bio.survival_cox_fit(data, covariates)
println(@bio.survival_cox_summary(cox))
println("")
// ------------------------------------------------------------------
// 7. Hazard ratios and p-values for each covariate
// ------------------------------------------------------------------
println("=== 7. Hazard ratios and p-values ===")
println("Covariate\tHR\tPr(>|z|)")
let p = cox.covariate_names.length()
let mut k = 0
while k < p {
println(
"\{cox.covariate_names[k]}\t\{cox.hazard_ratios[k]}\t\{cox.p_values[k]}",
)
k = k + 1
}
println("=== Demo complete ===")
}