multiBlockVar {scran} | R Documentation |
Fit a mean-dependent trend to the per-gene variances for each blocking level, and decompose them to biological and technical components.
multiBlockVar(x, block, trend.args=list(), dec.args=list(), ...)
x |
A SingleCellExperiment object containing log-normalized expression values,
computed from size factors centred in each block - see |
block |
A factor specifying the blocking level for each cell. |
trend.args |
A list of named arguments to pass to |
dec.args |
A list of named arguments to pass to |
... |
Additional arguments to pass to |
This function models the variance of expression in each level of block
separately.
Each subset of cells is passed to trendVar
to fit a block-specific trend,
and then passed to decomposeVar
to obtain block-specific biological and technical components.
Results are consolidated across blocks using the combineVar
function.
The aim is to enable users to handle differences in the mean-variance relationship across, e.g., different experimental batches.
We assume that the size factors are centred within each block when computing log-normalized expression values.
This preserves the scale of the counts within each block, and ensures that the spike-in normalized values are comparable to those of the endogenous genes.
Centring can be performed by setting the size_factor_grouping
argument in normalize
.
Otherwise, a warning will be raised about non-centred size factors.
A DataFrame is returned containing all components returned by combineVar
, in addition to a per.block
column.
This additional column is a DataFrame containing nested DataFrames, each containing a result of decomposeVar
for the corresponding level of block
.
The trend function from trendVar
is also stored as trend
in the metadata of the per-block nested DataFrames.
Aaron Lun
Lun ATL, McCarthy DJ and Marioni JC (2016). A step-by-step workflow for low-level analysis of single-cell RNA-seq data with Bioconductor. F1000Res. 5:2122
trendVar
,
decomposeVar
,
combineVar
,
normalize
example(computeSpikeFactors) # Using the mocked-up data 'y' from this example. # Normalizing (gene-based factors for genes, spike-in factors for spike-ins) y <- computeSumFactors(y) y <- computeSpikeFactors(y, general.use=FALSE) # Setting up the blocking levels. block <- sample(3, ncol(y), replace=TRUE) y <- normalize(y, size_factor_grouping=block) out <- multiBlockVar(y, block=block) # Creating block-level plots. par(mfrow=c(1,3)) is.spike <- isSpike(y) for (x in as.character(1:3)) { current <- out$per.block[[x]] plot(current$mean, current$total, col="black", pch=16) points(current$mean[is.spike], current$total[is.spike], col="red", pch=16) curve(metadata(current)$trend(x), col="dodgerblue", lwd=2, add=TRUE) }