## Loading required package: knitr
Package: BASiCS
Authors: Catalina Vallejos ([email protected]) and Nils Eling ([email protected])
Compilation date: 2018-03-18
Single-cell mRNA sequencing can uncover novel cell-to-cell heterogeneity in gene expression levels within seemingly homogeneous populations of cells. However, these experiments are prone to high levels of technical noise, creating new challenges for identifying genes that show genuine heterogeneous expression within the group of cells under study.
BASiCS (Bayesian Analysis of Single-Cell Sequencing data) is an integrated Bayesian hierarchical model that propagates statistical uncertainty by simultaneously performing data normalisation (global scaling), technical noise quantification and two types of supervised downstream analyses:
For a single group of cells [1]: BASiCS provides a criterion to identify highly (and lowly) variable genes within the group.
For two (or more) groups of cells [2]: BASiCS allows the identification of differentially expressed genes between the groups. As in traditional differential expression tools, BASiCS can uncover changes in mean expression between the groups. Besides this, BASiCS can also uncover changes in over-dispersion — a measure for the residual cell-to-cell variation that is observed after accounting for technical noise. This feature has led, for example, to novel insights in the context of immune cells across aging [3].
In both cases, a probabilistic output is provided, with posterior probability thresholds calibrated through the expected false discovery rate (EFDR) [4].
Currently, BASiCS relies on the use of spike-in genes — that are artificially introduced to each cell's lysate — to perform these analyses.
A brief description for the statistical model implemented in BASiCS is provided in the “Methodology” section of this document.
Important: BASiCS has been designed in the context of supervised experiments where the groups of cells (e.g. experimental conditions, cell types) under study are known a priori (e.g. case-control studies). Therefore, we DO NOT advise the use of BASiCS in unsupervised settings where the aim is to uncover sub-populations of cells through clustering.
The input dataset for BASiCS must be stored as an SingleCellExperiment
object (see SingleCellExperiment package).
The newBASiCS_Data
function can be used to create the input data object based
on the following information:
Counts
: a matrix of raw expression counts with dimensions \(q\) times \(n\).
Within this matrix, \(q_0\) rows must correspond to biological genes and \(q-q_0\)
rows must correspond to technical spike-in genes. Gene names must be stored as rownames(Counts)
.
Tech
: a vector of TRUE
/FALSE
elements with length \(q\).
If Tech[i] = FALSE
the gene i
is biological; otherwise the gene is spike-in.
This vector must be specified in the same order of genes as in the
Counts
matrix.
SpikeInfo
: a data.frame
with \(q-q_0\) rows. First column must contain the
names associated to the spike-in genes (as in rownames(Counts)
). Second column
must contain the input number of molecules for the spike-in genes
(amount per cell).
BatchInfo
(optional): vector of length \(n\) to indicate batch structure
(whenever cells have been processed using multiple batches).
For example, the following code simulates a dataset with 50 genes (40 biological and 10 spike-in) and 40 cells.
set.seed(1)
Counts = Counts = matrix(rpois(50*40, 2), ncol = 40)
rownames(Counts) <- c(paste0("Gene", 1:40), paste0("Spike", 1:10))
Tech = c(rep(FALSE,40),rep(TRUE,10))
set.seed(2)
SpikeInput = rgamma(10,1,1)
SpikeInfo <- data.frame("SpikeID" = paste0("Spike", 1:10),
"SpikeInput" = SpikeInput)
# No batch structure
DataExample = newBASiCS_Data(Counts, Tech, SpikeInfo)
# With batch structure
DataExample = newBASiCS_Data(Counts, Tech, SpikeInfo,
BatchInfo = rep(c(1,2), each = 20))
Note: scRNA-seq datasets typically require quality control filtering before
performing the analysis. This is in order to remove cells and/or transcripts
with very low expression counts. The function BASiCS_Filter
can be used to
perform this task. For examples, refer to help(BASiCS_Filter)
.
Note: the scater package provides enhanced functionality for the pre-processing of scRNA-seq datasets.
To convert an existing SingleCellExperiment
object (Data
) into one that can
be used within BASiCS, meta-information must be stored in the object.
isSpike(Data, "ERCC")=Tech
: the logical vector indicating
biological/technical genes (see above) must be stored in the int_metadata
slot via the isSpike
function.
metadata(Data)
: the SpikeInfo
and BatchInfo
objects are stored in the
metadata
slot of the SingleCellExperiment
object:
metadata(Data)=list(SpikeInput = SpikeInfo[,2], BatchInfo = BatchInfo)
.
Once the additional information is included,
the object can be used within BASiCS.
Parameter estimation is performed using the BASiCS_MCMC
function.
Essential parameters for running this algorithm are:
N
: total number of iterationsThin
: length of the thining period (i.e. only every Thin
iterations will be stored in the output of the BASiCS_MCMC
)Burn
: length of burn-in period (i.e. the initial Burn
iterations that will be discarded from the output of the BASiCS_MCMC
)If the optional parameter PrintProgress
is set to TRUE
, the R
console will display the progress of the MCMC algorithm.
For other optional parameters refer to help(BASiCS_MCMC)
.
Here, we illustrate the usage of BASiCS_MCMC
using a built-in
synthetic dataset.
Data <- makeExampleBASiCS_Data()
Chain <- BASiCS_MCMC(Data = Data, N = 1000, Thin = 10, Burn = 500,
PrintProgress = FALSE)
## -------------------------------------------------------------
## MCMC sampler has been started: 1000 iterations to go.
## -------------------------------------------------------------
## -------------------------------------------------------------
## End of Burn-in period.
## -------------------------------------------------------------
##
## -------------------------------------------------------------
## -------------------------------------------------------------
## All 1000 MCMC iterations have been completed.
## -------------------------------------------------------------
## -------------------------------------------------------------
##
## -------------------------------------------------------------
## Please see below a summary of the overall acceptance rates.
## -------------------------------------------------------------
##
## Minimum acceptance rate among mu[i]'s: 0.476
## Average acceptance rate among mu[i]'s: 0.70152
## Maximum acceptance rate among mu[i]'s: 0.896
##
## Minimum acceptance rate among delta[i]'s: 0.506
## Average acceptance rate among delta[i]'s: 0.58424
## Maximum acceptance rate among delta[i]'s: 0.706
##
## Acceptance rate for phi (joint): 0.924
##
## Minimum acceptance rate among nu[j]'s: 0.462
## Average acceptance rate among nu[j]'s: 0.5504
## Maximum acceptance rate among nu[j]'s: 0.71
##
## Minimum acceptance rate among theta[k]'s: 0.792
## Average acceptance rate among theta[k]'s: 0.792
## Maximum acceptance rate among theta[k]'s: 0.792
##
## -------------------------------------------------------------
##
Important remarks:
Please ensure the acceptance rates displayed in the console output of
BASiCS_MCMC
are around 0.44. If they are too far from this value, you
should increase N
and Burn
.
It is essential to assess the convergence of the MCMC algorithm before performing downstream analyses. For guidance regarding this step, refer to the 'Convergence assessment' section of this vignette
Typically, setting N=20000
, Thin=20
and Burn=10000
leads to
stable results.
We illustrate this analysis using a small extract from the MCMC chain obtained
in [2] when analysing the single cell samples provided in [5]. This is included
within BASiCS
as the ChainSC
dataset.
data(ChainSC)
The following code is used to identify highly variable genes (HVG) and
lowly variable genes (LVG) within these cells. The VarThreshold
parameter
sets a lower threshold for the proportion of variability that is assigned to
the biological component (Sigma
). In the examples below:
For each gene, these functions return posterior probabilities as a measure of
HVG/LVG evidence. A cut-off value for these posterior probabilities is set by
controlling EFDR (defaul option: EviThreshold
defined such that EFDR = 0.10).
par(mfrow = c(2,2))
HVG <- BASiCS_DetectHVG(ChainSC, VarThreshold = 0.6, Plot = TRUE)
LVG <- BASiCS_DetectLVG(ChainSC, VarThreshold = 0.2, Plot = TRUE)
To access the results of these tests, please use.
head(HVG$Table)
## GeneIndex GeneName Mu Delta Sigma Prob HVG
## 21 21 Map3k11 10.044337 2.344024 0.7599326 1.00 TRUE
## 71 71 Lefty1 3.574049 2.972835 0.7657068 0.96 TRUE
## 48 48 Ctgf 4.296390 2.455164 0.7370870 0.91 TRUE
## 88 88 Naa11 4.997926 2.503697 0.7438627 0.91 TRUE
## 166 166 Pnma2 2.773063 2.781834 0.7270004 0.89 TRUE
## 185 185 Alg8 3.931154 2.489690 0.7379904 0.88 TRUE
head(LVG$Table)
## GeneIndex GeneName Mu Delta Sigma Prob LVG
## 16 16 Gm10653 1165.3430 0.04023528 0.05845448 1 TRUE
## 63 63 Luc7l2 1942.1656 0.07219708 0.10128552 1 TRUE
## 65 65 Atp5g2 338.0637 0.06562415 0.09368431 1 TRUE
## 89 89 Rpl14 1348.3208 0.02466278 0.03720835 1 TRUE
## 90 90 Rpl11 1256.5145 0.02305986 0.03439021 1 TRUE
## 92 92 Rcc2 294.2660 0.06411164 0.09191962 1 TRUE
SummarySC <- Summary(ChainSC)
plot(SummarySC, Param = "mu", Param2 = "delta", log = "xy")
with(HVG$Table[HVG$Table$HVG == TRUE,], points(Mu, Delta))
with(LVG$Table[LVG$Table$LVG == TRUE,], points(Mu, Delta))
Note: this criteria for threshold has changed with respect to the original
release of BASiCS (where EviThreshold
was defined such that EFDR = EFNR).
However, the new choice is more stable (sometimes, it was not posible to
find a threshold such that EFDR = EFNR).
To illustrate the use of the differential mean expression and differential
over-dispersion tests between two cell populations, we use extracts from the
MCMC chains obtained in [2] when analysing the [5] dataset (single cells vs
pool-and-split samples). These were obtained by independently running the
BASiCS_MCMC
function for each group of cells.
data(ChainSC)
data(ChainRNA)
Test <- BASiCS_TestDE(Chain1 = ChainSC, Chain2 = ChainRNA,
GroupLabel1 = "SC", GroupLabel2 = "PaS",
EpsilonM = log2(1.5), EpsilonD = log2(1.5),
EFDR_M = 0.10, EFDR_D = 0.10,
Offset = TRUE, OffsetPlot = TRUE, Plot = TRUE)
In BASiCS_TestDE
, EpsilonM
sets the log2 fold change (log2FC) in expression
(\(\mu\)) and EpsilonD
the log2FC in over-dispersion (\(\delta\)). As a default
option: EpsilonM = EpsilonD = log2(1.5)
(i.e.
50\% increase). To adjust for differences in overall RNA content, an internal
offset correction is performed when OffSet=TRUE
.
This is the recommended default.
The resulting output list can be displayed using
head(Test$TableMean)
## GeneName MeanOverall Mean1 Mean2 MeanFC MeanLog2FC ProbDiffMean
## 47 BC018473 1502.198 2948.429 94.024 31.251 4.966 1
## 71 Lefty1 10.756 5.170 16.195 0.328 -1.607 1
## 329 Erh 488.756 354.929 619.062 0.573 -0.802 1
## 418 Zfp937 149.071 221.552 78.498 2.808 1.490 1
## 437 Snora33 6.428 1.943 10.795 0.176 -2.510 1
## 445 Zfp71-rs1 126.059 62.323 188.118 0.329 -1.605 1
## ResultDiffMean
## 47 SC+
## 71 PaS+
## 329 PaS+
## 418 SC+
## 437 PaS+
## 445 PaS+
head(Test$TableDisp)
## GeneName MeanOverall DispOverall Disp1 Disp2 DispFC DispLog2FC
## 49 Gm5643 1821.217 0.062 0.105 0.020 5.171 2.370
## 58 Luc7l2 2809.375 0.045 0.072 0.018 4.076 2.027
## 87 Hist2h2ab 70.985 0.346 0.591 0.107 5.626 2.492
## 94 Gm16287 658.777 0.081 0.141 0.022 6.669 2.737
## 102 Zyg11b 1657.344 0.063 0.108 0.019 5.772 2.529
## 117 Stxbp2 615.573 0.064 0.105 0.024 4.349 2.121
## ProbDiffDisp ResultDiffDisp
## 49 1 SC+
## 58 1 SC+
## 87 1 SC+
## 94 1 SC+
## 102 1 SC+
## 117 1 SC+
Note: due to the confounding between mean and over-dispersion that is
typically observed in scRNA-seq datasets, we only assess changes in
over-dispersion for those genes in which the mean does not change
between the groups. Use EpsilonM = 0
as a conservative option:
Test <- BASiCS_TestDE(Chain1 = ChainSC, Chain2 = ChainRNA,
GroupLabel1 = "SC", GroupLabel2 = "PaS",
EpsilonM = 0, EpsilonD = log2(1.5),
EFDR_M = 0.10, EFDR_D = 0.10,
Offset = TRUE, OffsetPlot = TRUE, Plot = TRUE)
To externally store the output of BASiCS_MCMC
(recommended), additional
parameters StoreChains
, StoreDir
and RunName
are required. For example:
Data <- makeExampleBASiCS_Data()
Chain <- BASiCS_MCMC(Data, N = 1000, Thin = 10, Burn = 500,
PrintProgress = FALSE, StoreChains = TRUE,
StoreDir = tempdir(), RunName = "Example")
## -------------------------------------------------------------
## MCMC sampler has been started: 1000 iterations to go.
## -------------------------------------------------------------
## -------------------------------------------------------------
## End of Burn-in period.
## -------------------------------------------------------------
##
## -------------------------------------------------------------
## -------------------------------------------------------------
## All 1000 MCMC iterations have been completed.
## -------------------------------------------------------------
## -------------------------------------------------------------
##
## -------------------------------------------------------------
## Please see below a summary of the overall acceptance rates.
## -------------------------------------------------------------
##
## Minimum acceptance rate among mu[i]'s: 0.476
## Average acceptance rate among mu[i]'s: 0.70152
## Maximum acceptance rate among mu[i]'s: 0.896
##
## Minimum acceptance rate among delta[i]'s: 0.506
## Average acceptance rate among delta[i]'s: 0.58424
## Maximum acceptance rate among delta[i]'s: 0.706
##
## Acceptance rate for phi (joint): 0.924
##
## Minimum acceptance rate among nu[j]'s: 0.462
## Average acceptance rate among nu[j]'s: 0.5504
## Maximum acceptance rate among nu[j]'s: 0.71
##
## Minimum acceptance rate among theta[k]'s: 0.792
## Average acceptance rate among theta[k]'s: 0.792
## Maximum acceptance rate among theta[k]'s: 0.792
##
## -------------------------------------------------------------
##
In this example, the output of BASiCS_MCMC
will be stored as a BASiCS_Chain
object in the file “chain_Example.Rds”, within the tempdir()
directory.
To load pre-computed MCMC chains,
Chain <- BASiCS_LoadChain("Example", StoreDir = tempdir())
To assess convergence of the chain, the convergence diagnostics provided by the
package coda
can be used. Additionally, the chains can be visually inspected.
For example:
plot(Chain, Param = "mu", Gene = 1, log = "y")
plot(Chain, Param = "phi", Cell = 1)
In the figures above:
?acf
)To access the MCMC chains associated to individual parameter use the function displayChainBASiCS
. For example,
displayChainBASiCS(Chain, Param = "mu")[1:5,1:5]
## Gene1 Gene2 Gene3 Gene4 Gene5
## [1,] 8.516936 4.502855 3.826309 5.657261 19.23518
## [2,] 5.548291 3.961501 2.843601 3.589559 19.51600
## [3,] 10.131468 5.688056 5.369110 4.545069 19.64434
## [4,] 5.664402 5.120068 4.006658 6.431824 22.93474
## [5,] 7.068831 4.759326 3.862751 7.077321 26.41031
As a summary of the posterior distribution, the function Summary
calculates
posterior medians and the High Posterior Density (HPD) intervals for each model
parameter. As a default option, HPD intervals contain 0.95 probability.
ChainSummary <- Summary(Chain)
The function displaySummaryBASiCS
extract posterior summaries for individual
parameters. For example
head(displaySummaryBASiCS(ChainSummary, Param = "mu"))
## Mu lower upper
## Gene1 7.694477 4.331570 10.680111
## Gene2 4.977089 2.588200 7.964820
## Gene3 4.109454 2.509790 6.490364
## Gene4 4.843340 2.742174 8.544155
## Gene5 18.517451 10.747134 23.065117
## Gene6 8.766424 5.511452 13.280344
The following figures display posterior medians and the corresponding HPD 95% intervals for gene-specific parameters \(\mu_i\) (mean) and \(\delta_i\) (over-dispersion)
par(mfrow = c(2,2))
plot(ChainSummary, Param = "mu", main = "All genes", log = "y")
plot(ChainSummary, Param = "mu", Genes = 1:10, main = "First 10 genes")
plot(ChainSummary, Param = "delta", main = "All genes")
plot(ChainSummary, Param = "delta", Genes = c(2,5,10,50), main = "5 customized genes")
It is also possible to obtain similar summaries for the normalising constants \(\phi_j\) and \(s_j\).
par(mfrow = c(1,2))
plot(ChainSummary, Param = "phi")
plot(ChainSummary, Param = "s", Cells = 1:5)
Finally, it is also possible to create a scatterplot of posterior estimates for gene-specific parameters. Typically, this plot will exhibit the confounding effect that is observed between mean and over-dispersion.
par(mfrow = c(1,2))
plot(ChainSummary, Param = "mu", Param2 = "delta", log = "x", SmoothPlot = FALSE)
plot(ChainSummary, Param = "mu", Param2 = "delta", log = "x", SmoothPlot = TRUE)
The option SmoothPlot = TRUE
is generally recommended as this plot will
contain thousands of genes when analysing real datasets.
It is also possible to produce a matrix of normalised and denoised expression
counts for which the effect of technical variation is removed. For this purpose,
we implemented the function BASiCS_DenoisedCounts
. For each gene \(i\) and
cell \(j\) this function returns
\[ x^*_{ij} = \frac{ x_{ij} } {\hat{\phi}_j \hat{\nu}_j}, \]
where \(x_{ij}\) is the observed expression count of gene \(i\) in cell \(j\), \(\hat{\phi}_j\) denotes the posterior median of \(\phi_j\) and \(\hat{\nu}_j\) is the posterior median of \(\nu_j\).
DenoisedCounts = BASiCS_DenoisedCounts(Data = Data, Chain = Chain)
DenoisedCounts[1:5, 1:5]
## [,1] [,2] [,3] [,4] [,5]
## Gene1 0.000000 34.355728 47.81306 6.127459 35.141310
## Gene2 0.000000 0.000000 0.00000 12.254919 0.000000
## Gene3 0.000000 4.580764 0.00000 6.127459 0.000000
## Gene4 4.915316 2.290382 23.90653 0.000000 25.770294
## Gene5 4.915316 6.871146 0.00000 55.147134 9.371016
Alternativelly, the user can compute the normalised and denoised expression
rates underlying the expression of all genes across cells using
BASiCS_DenoisedRates
. The output of this function is given by
\[ \Lambda_{ij} = \hat{\mu_i} \hat{\rho}_{ij}, \]
where \(\hat{\mu_i}\) represents the posterior median of \(\mu_j\) and \(\hat{\rho}_{ij}\) is given by its posterior mean (Monte Carlo estimate based on the MCMC sample of all model parameters).
DenoisedRates <- BASiCS_DenoisedRates(Data = Data, Chain = Chain,
Propensities = FALSE)
DenoisedRates[1:5, 1:5]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 3.069806 30.5252453 18.407656 7.091326 30.9276224
## [2,] 1.656280 0.9535089 3.420656 9.734775 0.9691411
## [3,] 2.481371 4.4320480 3.584329 4.830411 1.7525373
## [4,] 4.864397 2.9188147 9.113103 2.222938 20.4012677
## [5,] 9.262084 9.1816807 12.283785 43.926025 11.3747969
Alternative, denoised expression propensities \(\hat{\rho}_{ij}\) can also be extracted
DenoisedProp = BASiCS_DenoisedRates(Data = Data, Chain = Chain,
Propensities = TRUE)
DenoisedProp[1:5, 1:5]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.3989623 3.9671630 2.3923205 0.9216124 4.0194573
## [2,] 0.3327809 0.1915797 0.6872806 1.9559176 0.1947205
## [3,] 0.6038202 1.0785005 0.8722154 1.1754387 0.4264648
## [4,] 1.0043476 0.6026450 1.8815741 0.4589680 4.2122313
## [5,] 0.5001814 0.4958393 0.6633626 2.3721421 0.6142744
We first describe the model introduced in [1], which relates to a single group of cells.
Throughout, we consider the expression counts of \(q\) genes, where \(q_0\) are expressed in the population of cells under study (biological genes) and the remaining \(q-q_0\) are extrinsic spike-in (technical) genes. Let \(X_{ij}\) be a random variable representing the expression count of a gene \(i\) in cell \(j\) (\(i=1,\ldots,q\); \(j=1,\ldots,n\)). BASiCS is based on the following hierarchical model: \[X_{ij} \big| \mu_i, \phi_j, \nu_j, \rho_{ij} \sim \left\{ \begin{array}{ll} \mbox{Poisson}(\phi_j \nu_j \mu_i \rho_{ij}), \mbox{ for }i=1,\ldots,q_0, j=1,\ldots,n \ \mbox{Poisson}(\nu_j \mu_i), \mbox{ for }i=q_0+1,\ldots,q, j=1,\ldots,n, \end{array} \right.\]
where \(\nu_j\) and \(\rho_{ij}\) are mutually independent random effects such that \(\nu_j|s_j,\theta \sim \mbox{Gamma}(1/\theta,1/ (s_j \theta))\) and \(\rho_{ij} | \delta_i \sim \mbox{Gamma} (1/\delta_i,1/\delta_i)\)[footnoteGamma].
A graphical representation of this model is displayed below. This is based on the expression counts of 2 genes (\(i\): biological and \(i'\): technical) at 2 cells (\(j\) and \(j'\)). Squared and circular nodes denote known observed quantities (observed expression counts and added number of spike-in mRNA molecules) and unknown elements, respectively. Whereas black circular nodes represent the random effects that play an intermediate role in our hierarchical structure, red circular nodes relate to unknown model parameters in the top layer of hierarchy in our model. Blue, green and grey areas highlight elements that are shared within a biological gene, technical gene or cell, respectively.
\centerline{\includegraphics[height=4in]{./BASiCS_DAG.jpg}}
In this setting, the key parameters to be used for downstream analyses are:
\(\mu_i\): mean expression parameter for gene \(i\) in the group of cells under study. In case of the spike-in technical genes, \(\mu_i\) is assumed to be known and equal to the input number of molecules of the corresponding spike-in gene).
\(\delta_i\): over-dispersion parameter for gene \(i\), a measure for the excess of variation that is observed after accounting for technical noise (with respect to Poisson sampling)
Additional (nuisance) parameters are interpreted as follows:
\(\phi_j\): cell-specific normalizing parameters related to differences in mRNA content (identifiability constrain: \(\sum_{j=1}^n \phi_j = n\)).
\(s_j\): cell-specific normalizing parameters related to technical cell-specific biases (for more details regarding this interpretation see [6]).
\(\theta\): technical over-dispersion parameter, controlling the strenght of cell-to-cell technical variability.
When cells from the same group are processed in multiple sequencing batches, this model is extended so that the technical over-dispersion parameter \(\theta\) is batch-specific. This extension allows a different strenght of technical noise to be inferred for each batch of cells.
[footnoteGamma]: We parametrize the Gamma distribution such that if \(X \sim \mbox{Gamma}(a,b)\), then \(\mbox{E}(X)=a/b\) and \(\mbox{var}(X)=a/b^2\).
In [2], this model has been extended to cases where multiple groups of cells are under study. This is achieved by assuming gene-specific parameters to be also group-specific. Based on this setup, evidence of differential expression is quantified through log2-fold changes of gene-specific parameters (mean and over-dispersion) between the groups.
More details regarding the model setup, prior specification and implementation are described in [1] and [2].
We thank several members of the Marioni laboratory (EMBL-EBI; CRUK-CI) for support and discussions throughout the development of this R library. In particular, we are grateful to Aaron Lun (@LTLA, CRUK-CI) for advise and support during the preparation the Bioconductor submission.
We also acknowledge feedback and contributions from (Github aliases provided within parenthesis): Ben Dulken (@bdulken), Chang Xu (@xuchang116), Danilo Horta (@Horta), Dmitriy Zhukov (@dvzhukov), Jens Preußner (@jenzopr), Joanna Dreux (@Joannacodes), Kevin Rue-Albrecht (@kevinrue), Luke Zappia (@lazappi), Simon Anders (@s-andrews), Yongchao Ge and Yuan Cao (@yuancao90), among others.
This work has been funded by the MRC Biostatistics Unit (MRC grant no. MRC_MC_UP_0801/1; Catalina Vallejos and Sylvia Richardson), EMBL European Bioinformatics Institute (core European Molecular Biology Laboratory funding; Catalina Vallejos, Nils Eling and John Marioni), CRUK Cambridge Institute (core CRUK funding; John Marioni) and The Alan Turing Institute (EPSRC grant no. EP/N510129/1; Catalina Vallejos).
[1] Vallejos CA, Marioni JCM and Richardson S (2015) BASiCS: Bayesian analysis of single-cell sequencing data. PLoS Computational Biology 11 (6), e1004333.
[2] Vallejos CA, Richardson S and Marioni JCM (2016) Beyond comparisons of means: understanding changes in gene expression at the single-cell level. Genome Biology 17 (1), 1-14.
[3] Martinez-Jimenez CP, Eling N, Chen H, Vallejos CA, Kolodziejczyk AA, Connor F, Stojic L, Rayner TF, Stubbington MJT, Teichmann SA, de la Roche M, Marioni JC and Odom DT (2017) Aging increases cell-to-cell transcriptional variability upon immune stimulation. Science 355 (6332), 1433-1436.
[4] Newton MA, Noueiry A, Sarkar D, Ahlquist P (2004) Detecting differential gene expression with a semiparametric hierarchical mixture method. Biostatistics 5 (2), 155-76.
[5] Grün D, Kester L, van Oudenaarden A (2014) Validation of noise models for single-cell transcriptomics. Nature Methods 11 (6), 637-40.
[6] Vallejos CA, Risso D, Scialdone A, Dudoit S and Marioni JCM (2017) Normalizing single-cell RNA-sequencing data: challenges and opportunities. Nature Methods 14, 565-571.
[7] Roberts GO and Rosenthal JS (2009). Examples of adaptive MCMC. Journal of Computational and Graphical Statistics 18: 349-367.
sessionInfo()
## R version 3.4.3 (2017-11-30)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.4 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.6-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.6-bioc/R/lib/libRlapack.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] parallel stats4 stats graphics grDevices utils datasets
## [8] methods base
##
## other attached packages:
## [1] BASiCS_1.0.1 SingleCellExperiment_1.0.0
## [3] SummarizedExperiment_1.8.1 DelayedArray_0.4.1
## [5] matrixStats_0.53.1 Biobase_2.38.0
## [7] GenomicRanges_1.30.3 GenomeInfoDb_1.14.0
## [9] IRanges_2.12.0 S4Vectors_0.16.0
## [11] BiocGenerics_0.24.0 BiocStyle_2.6.1
## [13] knitr_1.20
##
## loaded via a namespace (and not attached):
## [1] bitops_1.0-6 bit64_0.9-7 progress_1.1.2
## [4] httr_1.3.1 rprojroot_1.3-2 dynamicTreeCut_1.63-1
## [7] tools_3.4.3 backports_1.1.2 DT_0.4
## [10] R6_2.2.2 KernSmooth_2.23-15 vipor_0.4.5
## [13] DBI_0.8 lazyeval_0.2.1 colorspace_1.3-2
## [16] gridExtra_2.3 prettyunits_1.0.2 bit_1.1-12
## [19] compiler_3.4.3 scales_0.5.0 stringr_1.3.0
## [22] digest_0.6.15 rmarkdown_1.9 XVector_0.18.0
## [25] scater_1.6.3 pkgconfig_2.0.1 htmltools_0.3.6
## [28] highr_0.6 limma_3.34.9 htmlwidgets_1.0
## [31] rlang_0.2.0 RSQLite_2.0 FNN_1.1
## [34] shiny_1.0.5 bindr_0.1.1 zoo_1.8-1
## [37] BiocParallel_1.12.0 dplyr_0.7.4 RCurl_1.95-4.10
## [40] magrittr_1.5 GenomeInfoDbData_1.0.0 Matrix_1.2-12
## [43] Rcpp_0.12.16 ggbeeswarm_0.6.0 munsell_0.4.3
## [46] viridis_0.5.0 stringi_1.1.7 yaml_2.1.18
## [49] edgeR_3.20.9 zlibbioc_1.24.0 rhdf5_2.22.0
## [52] plyr_1.8.4 grid_3.4.3 blob_1.1.0
## [55] shinydashboard_0.6.1 lattice_0.20-35 locfit_1.5-9.1
## [58] pillar_1.2.1 igraph_1.2.1 rjson_0.2.15
## [61] reshape2_1.4.3 biomaRt_2.34.2 XML_3.98-1.10
## [64] glue_1.2.0 evaluate_0.10.1 scran_1.6.9
## [67] data.table_1.10.4-3 httpuv_1.3.6.2 testthat_2.0.0
## [70] gtable_0.2.0 assertthat_0.2.0 ggplot2_2.2.1
## [73] mime_0.5 xtable_1.8-2 coda_0.19-1
## [76] viridisLite_0.3.0 tibble_1.4.2 AnnotationDbi_1.40.0
## [79] beeswarm_0.2.3 memoise_1.1.0 tximport_1.6.0
## [82] bindrcpp_0.2 statmod_1.4.30