Multi-trait colocalization with ColocBoost
pecotmr authors
2026-07-21
Source:vignettes/colocboost-pipeline.Rmd
colocboost-pipeline.RmdOverview
colocboostPipeline() runs the colocboost
multi-trait variable-selection model on QTL data — optionally with one
or more GWAS studies layered on top. It accepts inputs from the QTL
input classes:
| QTL input | What it is |
|---|---|
QtlDataset |
Single-study, individual-level: per-context residualized X/Y are extracted from the dataset |
QtlSumStats |
QTL summary statistics with a shared LD reference (must be QC’d) |
MultiStudyQtlDataset |
One or more individual-level studies + optional embedded
QtlSumStats
|
GWAS input (optional) is always a GwasSumStats, passed
as the separate gwasSumStats argument.
colocboostPipeline() does not accept a
FineMappingResult for either side — colocboost runs its own
variable selection.
Bundled inputs
data(qtl_dataset_example,
qtl_sumstats_example,
gwas_sumstats_s4_example,
multi_study_qtl_dataset_example)Three analysis variants
ColocBoost can run three different model flavours in one call.
| Flag | Default | What |
|---|---|---|
xqtlColoc |
TRUE | QTL-only colocboost across the QTL contexts. |
jointGwas |
FALSE | Single non-focal colocboost model that stacks all QTL contexts/studies with every supplied GWAS study. |
separateGwas |
FALSE | One focal colocboost model per GWAS study (the GWAS is the focal outcome). |
xQTL-only colocalization
The default call runs colocboost over the contexts in the QTL data with no GWAS layer.
res <- colocboostPipeline(qtl_dataset_example, xqtlColoc = TRUE)
str(res, max.level = 1L)## List of 4
## $ xqtl_coloc :List of 5
## ..- attr(*, "class")= chr "colocboost"
## $ joint_gwas : NULL
## $ separate_gwas : NULL
## $ computing_time:List of 1
The result is a named list with four entries:
-
xqtl_coloc— output of the QTL-only run (NULL whenxqtlColoc = FALSE) -
joint_gwas— output of the joint QTL+GWAS run (NULL whenjointGwas = FALSE) -
separate_gwas— list of per-GWAS focal runs (empty whenseparateGwas = FALSE) -
computing_time— per-variant timing record
QTL + GWAS (joint model)
res2 <- colocboostPipeline(
qtl_dataset_example,
gwasSumStats = gwas_sumstats_s4_example,
xqtlColoc = FALSE,
jointGwas = TRUE)
names(res2)## [1] "xqtl_coloc" "joint_gwas" "separate_gwas" "computing_time"
QTL + GWAS (per-GWAS focal models)
When you want one colocboost run per GWAS trait, with that trait as the focal outcome:
res3 <- colocboostPipeline(
qtl_dataset_example,
gwasSumStats = gwas_sumstats_s4_example,
xqtlColoc = FALSE,
separateGwas = TRUE)
names(res3$separate_gwas)## [1] "trait1"
Sumstats-only colocalization
A QtlSumStats input goes through the same dispatch with
no individual-level data needed; the LD comes from the
ldSketch GenotypeHandle carried on the
collection.
resSs <- colocboostPipeline(
qtl_sumstats_example,
gwasSumStats = gwas_sumstats_s4_example,
xqtlColoc = FALSE,
jointGwas = TRUE)Multi-study individual-level
resMs <- colocboostPipeline(
multi_study_qtl_dataset_example,
gwasSumStats = gwas_sumstats_s4_example,
xqtlColoc = TRUE,
jointGwas = TRUE)Focal trait
focalTrait makes the xQTL-only run treat one specific
trait as the focal outcome:
colocboostPipeline(
qtl_dataset_example,
xqtlColoc = TRUE,
focalTrait = "ENSG_example")Common parameters
colocboostPipeline(
qtlData = qtl_dataset_example,
gwasSumStats = gwas_sumstats_s4_example,
contexts = "brain",
traitId = "ENSG_example",
region = NULL, # alternative to traitId+cisWindow
cisWindow = 5e5, # required with traitId
focalTrait = NULL,
xqtlColoc = TRUE,
jointGwas = FALSE,
separateGwas = FALSE,
# Forward to colocboost::colocboost
M = 10,
L = 5,
output_level = 1L)Trait / context / region restrictions are pre-construction concerns
on the QtlDataset (keepSamples,
keepVariants, the per-context
SummarizedExperiment row selection); the pipeline
parameters above are the per-call refinements.
QC requirements
-
Individual-level (
QtlDataset/MultiStudyQtlDataset): QC (MAF / MAC / X-variance / per-sample missingness, sample / variant restrictions) lives on theQtlDatasetconstructor and is applied lazily insidegetGenotypes()/getResidualizedGenotypes(). The pipeline does not run a separate pass. -
Summary statistics (
QtlSumStats/GwasSumStats): all variant filters, panel harmonization, LD-mismatch detection, and RAISS imputation live insummaryStatsQc(). The pipeline rejects inputs whosegetQcInfo()is empty.