Fine-mapping with SuSiE-ash and SuSiE-inf
Alex McCreight
2025-12-05
Source:vignettes/susie_unmappable_effects.Rmd
susie_unmappable_effects.RmdThis vignette demonstrates how to use the SuSiE-ash and SuSiE-inf models. We use a simulated data set with n = 1000 individuals, p = 5000 variants, and 5 simulated non-zero effects (of equal magnitude).
Data
library(susieR)
data(unmappable_data)
X <- unmappable_data$X
y <- as.vector(unmappable_data$y)
b <- unmappable_data$beta
causal <- unmappable_data$causal
plot(b, ylab = "Effect Size")
causal
# [1] 4708 2477 754 3197 2544The causal signals are: 754, 2477, 2544, 3197, 4708.
Fitting the Three Models
SuSiE can model unmappable (polygenic) effects alongside sparse
causal effects via the unmappable_effects parameter.
- “none” (default): Standard SuSiE model
- “inf”: SuSiE-inf model, uses an infinitesimal component to model unmappable effects
- “ash”: SuSiE-ash model, uses adaptive shrinkage to model unmappable effects
Standard SuSiE
fit_susie <- susie(X, y, L = 10)SuSiE-inf
fit_inf <- susie(X, y, L = 10, unmappable_effects = "inf", convergence_method = "pip")
# WARNING: Individual-level data converted to sufficient statistics for unmappable effects methodsSuSiE-ash
fit_ash <- susie(X, y, L = 10, unmappable_effects = "ash", convergence_method = "pip")
# WARNING: Individual-level data converted to sufficient statistics for unmappable effects methods
# Mr.ASH terminated at iteration 293.
# Mr.ASH terminated at iteration 274.Comparing Results
Credible Sets
The three methods identify different numbers of credible sets:
cat("SuSiE (standard):", length(fit_susie$sets$cs), "credible sets\n")
# SuSiE (standard): 4 credible sets
cat("SuSiE-inf:", length(fit_inf$sets$cs), "credible sets\n")
# SuSiE-inf: 2 credible sets
cat("SuSiE-ash:", length(fit_ash$sets$cs), "credible sets\n")
# SuSiE-ash: 4 credible setsWe can check which credible sets contain true causal signals:
check_cs <- function(fit, name) {
cat(name, ":\n")
for (i in seq_along(fit$sets$cs)) {
cs <- fit$sets$cs[[i]]
in_causal <- any(cs %in% causal)
cat(" CS", i, ": size=", length(cs),
", contains causal=", in_causal, "\n")
}
}
check_cs(fit_susie, "SuSiE")
# SuSiE :
# CS 1 : size= 1 , contains causal= TRUE
# CS 2 : size= 1 , contains causal= TRUE
# CS 3 : size= 3 , contains causal= TRUE
# CS 4 : size= 36 , contains causal= FALSE
check_cs(fit_inf, "SuSiE-inf")
# SuSiE-inf :
# CS 1 : size= 3 , contains causal= TRUE
# CS 2 : size= 36 , contains causal= FALSE
check_cs(fit_ash, "SuSiE-ash")
# SuSiE-ash :
# CS 1 : size= 1 , contains causal= TRUE
# CS 2 : size= 1 , contains causal= TRUE
# CS 3 : size= 3 , contains causal= TRUE
# CS 4 : size= 36 , contains causal= TRUEPIP Comparison
Standard SuSiE identifies 4 credible sets, but one (light blue) does not contain the true causal variant. This is a false positive in a high-LD region where the causal signal is narrowly missed.
susie_plot(fit_susie, y = "PIP", b = b, main = "SuSiE (standard)")
SuSiE-inf is more conservative, finding only 2 credible sets. Both contain true causal variants, but it misses 3 of the 5 causal signals.
susie_plot(fit_inf, y = "PIP", b = b, main = "SuSiE-inf")
SuSiE-ash finds 4 credible sets, all containing true causal variants. It successfully retains the causal signal in the high-LD region that standard SuSiE missed.
susie_plot(fit_ash, y = "PIP", b = b, main = "SuSiE-ash")
Session Information
sessionInfo()
# R version 4.4.3 (2025-02-28)
# Platform: x86_64-conda-linux-gnu
# Running under: Ubuntu 24.04.3 LTS
#
# Matrix products: default
# BLAS/LAPACK: /home/runner/work/susieR/susieR/.pixi/envs/r44/lib/libopenblasp-r0.3.30.so; LAPACK version 3.12.0
#
# locale:
# [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
# [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
# [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
# [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
#
# time zone: Etc/UTC
# tzcode source: system (glibc)
#
# attached base packages:
# [1] stats graphics grDevices utils datasets methods base
#
# other attached packages:
# [1] susieR_0.14.51
#
# loaded via a namespace (and not attached):
# [1] Matrix_1.7-4 gtable_0.3.6 jsonlite_2.0.0
# [4] compiler_4.4.3 crayon_1.5.3 Rcpp_1.1.0
# [7] mr.ash.alpha_0.1-43 jquerylib_0.1.4 systemfonts_1.3.1
# [10] scales_1.4.0 textshaping_1.0.4 yaml_2.3.11
# [13] fastmap_1.2.0 lattice_0.22-7 plyr_1.8.9
# [16] ggplot2_4.0.1 R6_2.6.1 mixsqp_0.3-54
# [19] knitr_1.50 htmlwidgets_1.6.4 zigg_0.0.2
# [22] desc_1.4.3 bslib_0.9.0 RColorBrewer_1.1-3
# [25] rlang_1.1.6 cachem_1.1.0 reshape_0.8.10
# [28] xfun_0.54 fs_1.6.6 sass_0.4.10
# [31] S7_0.2.1 RcppParallel_5.1.11-1 cli_3.6.5
# [34] pkgdown_2.2.0 digest_0.6.39 grid_4.4.3
# [37] irlba_2.3.5.1 lifecycle_1.0.4 vctrs_0.6.5
# [40] Rfast_2.1.5.2 evaluate_1.0.5 glue_1.8.0
# [43] farver_2.1.2 ragg_1.5.0 rmarkdown_2.30
# [46] matrixStats_1.5.0 tools_4.4.3 htmltools_0.5.9