Colocalization across SuSiE-suite fits
Gao Wang, Anjing Liu and William Denault
Source:vignettes/fsusie_colocalization.Rmd
fsusie_colocalization.RmdThis vignette runs a formal colocalization analysis on a pair of
SuSiE-suite fine-mapping fits using coloc::coloc.susie().
The recipe applies to any pair of susie-class fits —
susieR::susie(), mfsusieR::fsusie(),
mfsusieR::mfsusie(), mvsusieR::mvsusie(), and
susieR::susie_rss() — because each returns the
(class = "susie", $sets$cs_index, $lbf_variable) triple
that coloc.susie() reads. susie_rss() is
particularly useful for GWAS summary-statistics fine-mapping fits.
For pre-fit covariate adjustment, see the covariates vignette.
For illustration we use fsusie() (single-outcome
functional fine-mapping); mfsusie() works the same way and
is the natural choice when both fits cover multiple outcomes.
Data
data(N3finemapping)
X <- N3finemapping$X[, seq_len(150)]
n <- nrow(X); p <- ncol(X); T_m <- 64
colnames(X) <- paste0("SNP", seq_len(p))
positions <- seq_len(T_m)
shape <- exp(-((positions - T_m / 2)^2) / (2 * (T_m / 6)^2))
beta1 <- matrix(0, p, T_m); beta1[42, ] <- 1.2 * shape
beta2 <- matrix(0, p, T_m); beta2[42, ] <- 0.9 * shape # shared causal
beta3 <- matrix(0, p, T_m); beta3[88, ] <- 0.9 * shape # distinct
Y1 <- X %*% beta1 + matrix(rnorm(n * T_m, sd = 0.4), n)
Y2 <- X %*% beta2 + matrix(rnorm(n * T_m, sd = 0.4), n)
Y3 <- X %*% beta3 + matrix(rnorm(n * T_m, sd = 0.4), n)Colocalization
coloc::coloc.susie() reads the credible-set indices from
fit$sets$cs_index and the per-effect log-Bayes-factor
matrix from fit$lbf_variable. Both are populated by
fsusie() / mfsusie() on the standard fit path,
so the call is a one- liner per pair. The returned $summary
table reports the posterior probabilities of five hypotheses for each
pair of credible sets:
| meaning | |
|---|---|
PP.H0.abf |
no causal in either trait |
PP.H1.abf |
causal in trait 1 only |
PP.H2.abf |
causal in trait 2 only |
PP.H3.abf |
causal in both, but at distinct variants |
PP.H4.abf |
shared causal variant |
hit1 and hit2 name the lead variant in each
fit; idx1 and idx2 are the credible-set
indices being compared.
Shared causal signals
fit1 and fit2 were simulated with the same
causal SNP at SNP42. The coloc summary should put nearly
all posterior mass on PP.H4 (shared causal):
res_shared <- tryCatch(coloc::coloc.susie(fit1, fit2), error = function(e) list())
res_shared$summaryPP.H4.abf is essentially 1 and
hit1 == hit2 == SNP42, matching the simulation.
Distinct causal signals
fit1 carries a signal at SNP42; fit3
carries one at SNP88. The coloc summary should put posterior mass on
PP.H3 (both have a causal, but at different variants):
res_distinct <- tryCatch(coloc::coloc.susie(fit1, fit3), error = function(e) list())
res_distinct$summaryPP.H3.abf is essentially 1, with
hit1 = SNP42 and hit2 = SNP88.
Notes
- This vignette assumes the user already has a pair of fine-mapping
fits, possibly from different SuSiE Suite packages, and wants to test
for colocalization between them. The natural alternative when
subject-level data is available for all outcomes is to run
mfsusie()jointly across them; the multi-outcome fit shares signal across modalities and identifies per-outcome and shared credible sets in one pass without a post-hoc combination step.coloc.susie()becomes essential when one or more inputs are summary-statistics fits (e.g., a GWASsusie_rss()fit colocalized against a molecular-QTLfsusie()fit), where the underlying individual-level data is not available. - Joint
mfsusie()fine-mapping that takes summary statistics from a GWAS as one of its outcomes is future work. - For multi-outcome colocalization across more than two outcomes, see the multi-outcome intro, which fits all outcomes jointly and avoids the post-hoc combine. The disadvantage is that it would subject to mfSuSiE modeling assumptions and not as modular as integrating SuSiE Suite fits.
Session info
This is the version of R and the packages that were used to generate these results.
## R version 4.4.3 (2025-02-28)
## Platform: x86_64-conda-linux-gnu
## Running under: Ubuntu 24.04.4 LTS
##
## Matrix products: default
## BLAS/LAPACK: /home/runner/work/mfsusieR/mfsusieR/.pixi/envs/r44/lib/libopenblasp-r0.3.32.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.16.1 mfsusieR_0.0.2
##
## loaded via a namespace (and not attached):
## [1] viridis_0.6.5 sass_0.4.10 generics_0.1.4
## [4] ashr_2.2-63 lattice_0.22-9 magrittr_2.0.5
## [7] digest_0.6.39 evaluate_1.0.5 grid_4.4.3
## [10] RColorBrewer_1.1-3 fastmap_1.2.0 plyr_1.8.9
## [13] jsonlite_2.0.0 Matrix_1.7-5 reshape_0.8.10
## [16] gridExtra_2.3 mixsqp_0.3-54 viridisLite_0.4.3
## [19] scales_1.4.0 truncnorm_1.0-9 invgamma_1.2
## [22] textshaping_1.0.5 jquerylib_0.1.4 cli_3.6.6
## [25] rlang_1.2.0 zigg_0.0.2 crayon_1.5.3
## [28] LaplacesDemon_16.1.8 cachem_1.1.0 yaml_2.3.12
## [31] otel_0.2.0 coloc_5.2.3 tools_4.4.3
## [34] SQUAREM_2026.1 parallel_4.4.3 dplyr_1.2.1
## [37] wavethresh_4.7.3 ggplot2_4.0.3 Rfast_2.1.5.2
## [40] vctrs_0.7.3 R6_2.6.1 matrixStats_1.5.0
## [43] lifecycle_1.0.5 fs_2.1.0 htmlwidgets_1.6.4
## [46] MASS_7.3-65 ragg_1.5.2 irlba_2.3.7
## [49] pkgconfig_2.0.3 desc_1.4.3 pillar_1.11.1
## [52] pkgdown_2.2.0 RcppParallel_5.1.11-2 bslib_0.10.0
## [55] gtable_0.3.6 data.table_1.17.8 glue_1.8.1
## [58] Rcpp_1.1.1-1.1 systemfonts_1.3.2 tidyselect_1.2.1
## [61] tibble_3.3.1 xfun_0.57 knitr_1.51
## [64] dichromat_2.0-0.1 farver_2.1.2 htmltools_0.5.9
## [67] rmarkdown_2.31 compiler_4.4.3 S7_0.2.2