///|
/// ashr demo - Adaptive shrinkage of noisy effect sizes.
/// Inspired by Bioconductor {ashr}.
fn main {
println("=== ashr Demo: Adaptive Shrinkage (Empirical Bayes) ===")
println("")
let (estimates, ses) = @src.ashr_example_data()
// Step 1: the raw estimates
println("--- Step 1: Raw Effect Estimates ---")
let mut i = 0
while i < estimates.length() {
println(
" effect " +
i.to_string() +
": beta_hat = " +
estimates[i].to_string() +
" (se = " +
ses[i].to_string() +
")",
)
i = i + 1
}
println("")
// Step 2: fit the unimodal prior by EM
println("--- Step 2: Fit Unimodal Prior (EM) ---")
let fit = @src.ashr_shrink(estimates, ses)
println(" iterations: " + fit.iterations.to_string())
println(" log-likelihood: " + fit.log_likelihood.to_string())
let mode = @src.ashr_mode_component(fit)
println(
" dominant prior component: sd = " +
fit.prior_grid[mode].to_string() +
" (weight " +
fit.prior_weights[mode].to_string() +
")",
)
println("")
// Step 3: shrinkage results
println("--- Step 3: Shrunk Estimates vs Raw ---")
i = 0
while i < fit.n {
println(
" effect " +
i.to_string() +
": " +
estimates[i].to_string() +
" -> " +
fit.posterior_mean[i].to_string() +
" [post.sd = " +
fit.posterior_sd[i].to_string() +
", lfsr = " +
fit.lfsr[i].to_string() +
"]",
)
i = i + 1
}
println("")
// Step 4: significance by local false sign rate
println("--- Step 4: Significant Hits (lfsr < 0.05) ---")
println(
" " +
@src.ashr_count_significant(fit, 0.05).to_string() +
" of " +
fit.n.to_string(),
)
println("")
// Step 5: shrinkage factors
println("--- Step 5: Shrinkage Factors ---")
let factors = @src.ashr_shrinkage_factor(fit, estimates)
i = 0
while i < factors.length() {
println(
" effect " + i.to_string() + ": factor = " + factors[i].to_string(),
)
i = i + 1
}
println("")
// Step 6: z-score convenience wrapper
println("--- Step 6: Z-score Shrinkage ---")
let zfit = @src.ashr_shrink_z([3.0, -2.5, 0.4, -0.2])
println(
" significant z (lfsr < 0.05): " +
@src.ashr_count_significant(zfit, 0.05).to_string(),
)
println(@src.ashr_summary(zfit))
println("")
println("=== ashr Demo Complete ===")
}