diff --git a/DESCRIPTION b/DESCRIPTION index 973d0e207a9432f9afe2f21915c97817f3f7bd1b..f65f9dcf6072e31f39245743b0749bd9443e0f80 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: splatter Type: Package Title: Simple Simulation of Single-cell RNA Sequencing Data -Version: 0.4.0 +Version: 0.5.0 Date: 2016-10-12 Author: Luke Zappia Authors@R: as.person(c( diff --git a/NAMESPACE b/NAMESPACE index dab88fd2704d2b80f55691bcdde8c410e9e9c436..282ee47e95ec7074a8d83ee5bc61a686979eaa67 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -9,6 +9,7 @@ export(estimateParams) export(getParams) export(mergeParams) export(setParams) +export(simSimple) export(splat) export(splatGroups) export(splatParams) @@ -29,6 +30,7 @@ importFrom(stats,rbinom) importFrom(stats,rchisq) importFrom(stats,rgamma) importFrom(stats,rlnorm) +importFrom(stats,rnbinom) importFrom(stats,rnorm) importFrom(stats,rpois) importFrom(stats,runif) diff --git a/NEWS.md b/NEWS.md index 27f84e5282ea88715ea880b32e02cafaae7632bf..95a377e70f3e80f02eeb9ebb0d7eae4a256deb1c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +# splatter 0.5.0 + +* Add simple simulation + # splatter 0.4.0 * Add splatter simulations diff --git a/R/simulate-simple.R b/R/simulate-simple.R new file mode 100644 index 0000000000000000000000000000000000000000..0ab0704df4814a1a6c4df7b1be9a01a5f5e0c67e --- /dev/null +++ b/R/simulate-simple.R @@ -0,0 +1,68 @@ +#' Simple simulation +#' +#' Simulate counts from a simple negative binomial distribution without +#' simulated library sizes, differential expression etc. +#' +#' @param params splatParams object containing simulation parameters. +#' @param verbose logical. Whether to print progress messages +#' @param ... any additional parameter settings to override what is provided in +#' \code{params}. +#' +#' @details +#' Uses the following parameters: \code{nCells}, \code{nGenes}, +#' \code{mean.shape}, \code{mean.rate}, \code{bcv.common}. +#' +#' Gene means are simulated from a gamma distribution with +#' \code{shape = mean.shape} and \code{rate = mean.rate}. Counts are then +#' simulated from a negative binomial distribution with \code{mu = means} and +#' \code{size = 1 / bcv.common}. +#' +#' Parameters are set in the tiered manner described in \code{\link{splat}}. +#' +#' @return SCESet containing simulated counts +#' @examples +#' sim <- simSimple() +#' @export +#' @importFrom stats rgamma rnbinom +simSimple <- function(params = defaultParams(), verbose = TRUE, ...) { + + if (verbose) {message("Getting parameters...")} + params <- setParams(params, ...) + params <- mergeParams(params, defaultParams()) + params <- expandParams(params) + + # Set random seed + seed <- getParams(params, "seed") + set.seed(seed) + + # Get the parameters we are going to use + nCells <- getParams(params, "nCells") + nGenes <- getParams(params, "nGenes") + mean.shape <- getParams(params, "mean.shape") + mean.rate <- getParams(params, "mean.rate") + bcv.common <- getParams(params, "bcv.common") + + if (verbose) {message("Simulating means...")} + means <- rgamma(nGenes, shape = mean.shape, rate = mean.rate) + + if (verbose) {message("Simulating counts...")} + counts <- matrix(rnbinom(nGenes * nCells, mu = means, + size = 1 / bcv.common), + nrow = nGenes, ncol = nCells) + + if (verbose) {message("Creating final SCESet...")} + cell.names <- paste0("Cell", 1:nCells) + gene.names <- paste0("Gene", 1:nGenes) + + rownames(counts) <- gene.names + colnames(counts) <- cell.names + phenos <- new("AnnotatedDataFrame", data = data.frame(Cell = cell.names)) + rownames(phenos) <- cell.names + features <- new("AnnotatedDataFrame", + data = data.frame(Gene = gene.names, GeneMean = means)) + rownames(features) <- gene.names + sim <- newSCESet(countData = counts, phenoData = phenos, + featureData = features) + + return(sim) +} \ No newline at end of file diff --git a/R/simulate.R b/R/simulate-splat.R similarity index 95% rename from R/simulate.R rename to R/simulate-splat.R index 2b963040197ac80492f4e45aaee09946263e8aad..40b42c6c87a13631288a9a340ff0b7cf7e1b707f 100644 --- a/R/simulate.R +++ b/R/simulate-splat.R @@ -92,6 +92,14 @@ #' \code{underscore_naming}. #' #' @return SCESet object containing the simulated counts and intermediate values +#' +#' @seealso +#' \code{\link{addLibSizes}}, \code{\link{addGeneMeans}}, +#' \code{\link{addSingleCellMeans}}, \code{\link{addGroupDE}}, +#' \code{\link{addGroupCellMeans}}, \code{\link{addPathDE}}, +#' \code{\link{addPathCellMeans}}, \code{\link{addBCVMeans}}, +#' \code{\link{addTrueCounts}}, \code{\link{addDropout}} +#' #' @examples #' # Simulation with default parameters #' sim <- splat() @@ -164,28 +172,28 @@ splat <- function(params = defaultParams(), } if (verbose) {message("Simulating library sizes...")} - sim <- simLibSizes(sim, params) + sim <- addLibSizes(sim, params) if (verbose) {message("Simulating gene means...")} - sim <- simGeneMeans(sim, params) + sim <- addGeneMeans(sim, params) if (method == "single") { - sim <- simSingleCellMeans(sim, params) + sim <- addSingleCellMeans(sim, params) } else if (method == "groups") { if (verbose) {message("Simulating group DE...")} - sim <- simGroupDE(sim, params) + sim <- addGroupDE(sim, params) if (verbose) {message("Simulating cell means...")} - sim <- simGroupCellMeans(sim, params) + sim <- addGroupCellMeans(sim, params) } else { if (verbose) {message("Simulating path endpoints...")} - sim <- simPathDE(sim, params) + sim <- addPathDE(sim, params) if (verbose) {message("Simulating path steps...")} - sim <- simPathCellMeans(sim, params) + sim <- addPathCellMeans(sim, params) } if (verbose) {message("Simulating BCV...")} - sim <- simBCVMeans(sim, params) + sim <- addBCVMeans(sim, params) if (verbose) {message("Simulating counts..")} - sim <- simTrueCounts(sim, params) + sim <- addTrueCounts(sim, params) if (verbose) {message("Simulating dropout...")} - sim <- simDropout(sim, params) + sim <- addDropout(sim, params) if (verbose) {message("Creating final SCESet...")} # Create new SCESet to make sure values are calculated correctly @@ -236,7 +244,7 @@ splatPaths <- function(params = defaultParams(), verbose = TRUE, ...) { #' #' @importFrom Biobase pData pData<- #' @importFrom stats rlnorm -simLibSizes <- function(sim, params) { +addLibSizes <- function(sim, params) { nCells <- getParams(params, "nCells") lib.loc <- getParams(params, "lib.loc") @@ -261,7 +269,7 @@ simLibSizes <- function(sim, params) { #' #' @importFrom Biobase fData fData<- #' @importFrom stats rgamma median -simGeneMeans <- function(sim, params) { +addGeneMeans <- function(sim, params) { nGenes <- getParams(params, "nGenes") mean.shape <- getParams(params, "mean.shape") @@ -302,7 +310,7 @@ simGeneMeans <- function(sim, params) { #' @return SCESet with added differential expression. #' #' @importFrom Biobase fData -simGroupDE <- function(sim, params) { +addGroupDE <- function(sim, params) { nGenes <- getParams(params, "nGenes") nGroups <- getParams(params, "nGroups") @@ -326,7 +334,7 @@ simGroupDE <- function(sim, params) { #' Simulate path differential expression #' #' Simulate differential expression for path. Similar to -#' \code{\link{simGroupDE}} but care has to be taken to make sure paths are +#' \code{\link{addGroupDE}} but care has to be taken to make sure paths are #' processed in the correct order. #' #' @param sim SCESet to add differential expression to. @@ -335,7 +343,7 @@ simGroupDE <- function(sim, params) { #' @return SCESet with added differential expression. #' #' @importFrom Biobase fData -simPathDE <- function(sim, params) { +addPathDE <- function(sim, params) { nGenes <- getParams(params, "nGenes") de.prob <- getParams(params, "de.prob") @@ -373,7 +381,7 @@ simPathDE <- function(sim, params) { #' @return SCESet with added cell means. #' #' @importFrom Biobase fData pData assayData assayData<- -simSingleCellMeans <- function(sim, params) { +addSingleCellMeans <- function(sim, params) { nCells <- getParams(params, "nCells") cell.names <- pData(sim)$Cell @@ -403,7 +411,7 @@ simSingleCellMeans <- function(sim, params) { #' @return SCESet with added cell means. #' #' @importFrom Biobase fData pData assayData assayData<- -simGroupCellMeans <- function(sim, params) { +addGroupCellMeans <- function(sim, params) { nGroups <- getParams(params, "nGroups") cell.names <- pData(sim)$Cell @@ -438,7 +446,7 @@ simGroupCellMeans <- function(sim, params) { #' #' @importFrom Biobase fData pData assayData #' @importFrom stats rbinom -simPathCellMeans <- function(sim, params) { +addPathCellMeans <- function(sim, params) { nGenes <- getParams(params, "nGenes") nGroups <- getParams(params, "nGroups") @@ -523,7 +531,7 @@ simPathCellMeans <- function(sim, params) { #' #' @importFrom Biobase fData pData assayData assayData<- #' @importFrom stats rchisq rgamma -simBCVMeans <- function(sim, params) { +addBCVMeans <- function(sim, params) { nGenes <- getParams(params, "nGenes") nCells <- getParams(params, "nCells") @@ -564,7 +572,7 @@ simBCVMeans <- function(sim, params) { #' #' @importFrom Biobase fData pData assayData #' @importFrom stats rpois -simTrueCounts <- function(sim, params) { +addTrueCounts <- function(sim, params) { nGenes <- getParams(params, "nGenes") nCells <- getParams(params, "nCells") @@ -597,7 +605,7 @@ simTrueCounts <- function(sim, params) { #' #' @importFrom Biobase fData pData assayData assayData<- #' @importFrom stats rbinom -simDropout <- function(sim, params) { +addDropout <- function(sim, params) { dropout.present <- getParams(params, "dropout.present") true.counts <- assayData(sim)$TrueCounts diff --git a/man/simBCVMeans.Rd b/man/addBCVMeans.Rd similarity index 79% rename from man/simBCVMeans.Rd rename to man/addBCVMeans.Rd index 805c6310087ef20dbb89cc51229bb28f2deade4a..c0415b1c8de1d7f769fe598f051907ccf6f02dce 100644 --- a/man/simBCVMeans.Rd +++ b/man/addBCVMeans.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simBCVMeans} -\alias{simBCVMeans} +% Please edit documentation in R/simulate-splat.R +\name{addBCVMeans} +\alias{addBCVMeans} \title{Simulate BCV means} \usage{ -simBCVMeans(sim, params) +addBCVMeans(sim, params) } \arguments{ \item{sim}{SCESet to add BCV means to.} diff --git a/man/simDropout.Rd b/man/addDropout.Rd similarity index 82% rename from man/simDropout.Rd rename to man/addDropout.Rd index fa424797af3e71e77312ea854fb31d721337e133..f8f95410d0919a17d732f0bba63adc4c86085eb1 100644 --- a/man/simDropout.Rd +++ b/man/addDropout.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simDropout} -\alias{simDropout} +% Please edit documentation in R/simulate-splat.R +\name{addDropout} +\alias{addDropout} \title{Simulate dropout} \usage{ -simDropout(sim, params) +addDropout(sim, params) } \arguments{ \item{sim}{SCESet to add dropout to.} diff --git a/man/simGeneMeans.Rd b/man/addGeneMeans.Rd similarity index 80% rename from man/simGeneMeans.Rd rename to man/addGeneMeans.Rd index 6d6736e1352c0724035a663c7e5e9e8826375c8c..2419b716476d4088c81e774ac6c80d432ed64c56 100644 --- a/man/simGeneMeans.Rd +++ b/man/addGeneMeans.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simGeneMeans} -\alias{simGeneMeans} +% Please edit documentation in R/simulate-splat.R +\name{addGeneMeans} +\alias{addGeneMeans} \title{Simulate gene means} \usage{ -simGeneMeans(sim, params) +addGeneMeans(sim, params) } \arguments{ \item{sim}{SCESet to add gene means to.} diff --git a/man/simGroupCellMeans.Rd b/man/addGroupCellMeans.Rd similarity index 78% rename from man/simGroupCellMeans.Rd rename to man/addGroupCellMeans.Rd index 8bc7c65718cbce8d109461982a22d7be779fc418..9c147dfc117805dc29fd57129eb7863f123233fa 100644 --- a/man/simGroupCellMeans.Rd +++ b/man/addGroupCellMeans.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simGroupCellMeans} -\alias{simGroupCellMeans} +% Please edit documentation in R/simulate-splat.R +\name{addGroupCellMeans} +\alias{addGroupCellMeans} \title{Simulate group cell means} \usage{ -simGroupCellMeans(sim, params) +addGroupCellMeans(sim, params) } \arguments{ \item{sim}{SCESet to add cell means to.} diff --git a/man/simGroupDE.Rd b/man/addGroupDE.Rd similarity index 81% rename from man/simGroupDE.Rd rename to man/addGroupDE.Rd index 6a0c7c710086b6cdc6790eed4d11917b9eaadd36..c941b7268772b8672c0dcc3b66245390aec56ad5 100644 --- a/man/simGroupDE.Rd +++ b/man/addGroupDE.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simGroupDE} -\alias{simGroupDE} +% Please edit documentation in R/simulate-splat.R +\name{addGroupDE} +\alias{addGroupDE} \title{Simulate group differential expression} \usage{ -simGroupDE(sim, params) +addGroupDE(sim, params) } \arguments{ \item{sim}{SCESet to add differential expression to.} diff --git a/man/simLibSizes.Rd b/man/addLibSizes.Rd similarity index 74% rename from man/simLibSizes.Rd rename to man/addLibSizes.Rd index 33b1babbe58597e1b97bb87719f7368fa588405c..bec92dfb96a221a0ccf1a089ef151edc4bf5d8ff 100644 --- a/man/simLibSizes.Rd +++ b/man/addLibSizes.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simLibSizes} -\alias{simLibSizes} +% Please edit documentation in R/simulate-splat.R +\name{addLibSizes} +\alias{addLibSizes} \title{Simulate library sizes} \usage{ -simLibSizes(sim, params) +addLibSizes(sim, params) } \arguments{ \item{sim}{SCESet to add library size to.} diff --git a/man/simPathCellMeans.Rd b/man/addPathCellMeans.Rd similarity index 79% rename from man/simPathCellMeans.Rd rename to man/addPathCellMeans.Rd index 2f932198f21dde760fe5180621cb63a3c512905b..a382283cda37fbe38f3b1f4d3c1619aca3297109 100644 --- a/man/simPathCellMeans.Rd +++ b/man/addPathCellMeans.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simPathCellMeans} -\alias{simPathCellMeans} +% Please edit documentation in R/simulate-splat.R +\name{addPathCellMeans} +\alias{addPathCellMeans} \title{Simulate path cell means} \usage{ -simPathCellMeans(sim, params) +addPathCellMeans(sim, params) } \arguments{ \item{sim}{SCESet to add cell means to.} diff --git a/man/simPathDE.Rd b/man/addPathDE.Rd similarity index 69% rename from man/simPathDE.Rd rename to man/addPathDE.Rd index 724ce32e67f725c125f96d11d6f042dc74f18877..2846ab15b4b1f0663a3d5d5fcf4895ef607eb6a5 100644 --- a/man/simPathDE.Rd +++ b/man/addPathDE.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simPathDE} -\alias{simPathDE} +% Please edit documentation in R/simulate-splat.R +\name{addPathDE} +\alias{addPathDE} \title{Simulate path differential expression} \usage{ -simPathDE(sim, params) +addPathDE(sim, params) } \arguments{ \item{sim}{SCESet to add differential expression to.} @@ -16,7 +16,7 @@ SCESet with added differential expression. } \description{ Simulate differential expression for path. Similar to -\code{\link{simGroupDE}} but care has to be taken to make sure paths are +\code{\link{addGroupDE}} but care has to be taken to make sure paths are processed in the correct order. } diff --git a/man/simSingleCellMeans.Rd b/man/addSingleCellMeans.Rd similarity index 72% rename from man/simSingleCellMeans.Rd rename to man/addSingleCellMeans.Rd index 30559e63092a4509c3d7093d160853b530550823..2b410c75091796e0245ca877e28b4ef0366068d8 100644 --- a/man/simSingleCellMeans.Rd +++ b/man/addSingleCellMeans.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simSingleCellMeans} -\alias{simSingleCellMeans} +% Please edit documentation in R/simulate-splat.R +\name{addSingleCellMeans} +\alias{addSingleCellMeans} \title{Simulate single population cell means} \usage{ -simSingleCellMeans(sim, params) +addSingleCellMeans(sim, params) } \arguments{ \item{sim}{SCESet to add cell means to.} diff --git a/man/simTrueCounts.Rd b/man/addTrueCounts.Rd similarity index 79% rename from man/simTrueCounts.Rd rename to man/addTrueCounts.Rd index 2b537aa8b296dda4f9a325f938dcad17f9a737a8..5bc3034b24f1d78dffe31637176a74aafd01ef8c 100644 --- a/man/simTrueCounts.Rd +++ b/man/addTrueCounts.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R -\name{simTrueCounts} -\alias{simTrueCounts} +% Please edit documentation in R/simulate-splat.R +\name{addTrueCounts} +\alias{addTrueCounts} \title{Simulate true counts} \usage{ -simTrueCounts(sim, params) +addTrueCounts(sim, params) } \arguments{ \item{sim}{SCESet to add true counts to.} diff --git a/man/bridge.Rd b/man/bridge.Rd index 4b7b8e9ee8ec3d614f542bc187df357b6ae900c9..ec1ac3c257c1a2cc8d8c579902f1505c4443fdb6 100644 --- a/man/bridge.Rd +++ b/man/bridge.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R +% Please edit documentation in R/simulate-splat.R \name{bridge} \alias{bridge} \title{Brownian bridge} diff --git a/man/getLNormFactors.Rd b/man/getLNormFactors.Rd index 9634fa29250fea9930932f4e531a14171c47d259..43f35f8d2d95d42630238f17bcfb9567ad922bae 100644 --- a/man/getLNormFactors.Rd +++ b/man/getLNormFactors.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R +% Please edit documentation in R/simulate-splat.R \name{getLNormFactors} \alias{getLNormFactors} \title{Get log-normal factors} diff --git a/man/getPathOrder.Rd b/man/getPathOrder.Rd index f7f7bd1ab2ed6c7d70046d2f2d9dc2af288cea2d..e57b4af5f861747a0eb7ec20a98d4d3c7d9457a0 100644 --- a/man/getPathOrder.Rd +++ b/man/getPathOrder.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R +% Please edit documentation in R/simulate-splat.R \name{getPathOrder} \alias{getPathOrder} \title{Get path order} diff --git a/man/simSimple.Rd b/man/simSimple.Rd new file mode 100644 index 0000000000000000000000000000000000000000..1a566122895d44fc5e7ee61ae4c4210c68210d82 --- /dev/null +++ b/man/simSimple.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/simulate-simple.R +\name{simSimple} +\alias{simSimple} +\title{Simple simulation} +\usage{ +simSimple(params = defaultParams(), verbose = TRUE, ...) +} +\arguments{ +\item{params}{splatParams object containing simulation parameters.} + +\item{verbose}{logical. Whether to print progress messages} + +\item{...}{any additional parameter settings to override what is provided in +\code{params}.} +} +\value{ +SCESet containing simulated counts +} +\description{ +Simulate counts from a simple negative binomial distribution without +simulated library sizes, differential expression etc. +} +\details{ +Uses the following parameters: \code{nCells}, \code{nGenes}, +\code{mean.shape}, \code{mean.rate}, \code{bcv.common}. + +Gene means are simulated from a gamma distribution with +\code{shape = mean.shape} and \code{rate = mean.rate}. Counts are then +simulated from a negative binomial distribution with \code{mu = means} and +\code{size = 1 / bcv.common}. + +Parameters are set in the tiered manner described in \code{\link{splat}}. +} +\examples{ +sim <- simSimple() +} + diff --git a/man/splat.Rd b/man/splat.Rd index f59b99add683d9a5cb28f29c09a37a63328e8e38..461e52e9a019d5ede95693c7c0d34b6317fef992 100644 --- a/man/splat.Rd +++ b/man/splat.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/simulate.R +% Please edit documentation in R/simulate-splat.R \name{splat} \alias{splat} \alias{splatGroups} @@ -117,4 +117,11 @@ sim <- splat(params, mean.rate = 0.6, out.prob = 0.2) # Simulate paths instead of groups sim <- splat(method = "paths") } +\seealso{ +\code{\link{addLibSizes}}, \code{\link{addGeneMeans}}, +\code{\link{addSingleCellMeans}}, \code{\link{addGroupDE}}, +\code{\link{addGroupCellMeans}}, \code{\link{addPathDE}}, +\code{\link{addPathCellMeans}}, \code{\link{addBCVMeans}}, +\code{\link{addTrueCounts}}, \code{\link{addDropout}} +} diff --git a/tests/testthat/test-simulate-simple.R b/tests/testthat/test-simulate-simple.R new file mode 100644 index 0000000000000000000000000000000000000000..832c34d91f771e0b6fe3a8adcde5305ca2bde9fe --- /dev/null +++ b/tests/testthat/test-simulate-simple.R @@ -0,0 +1,5 @@ +context("simple simulation") + +test_that("simple simulation output is valid", { + expect_true(validObject(simSimple())) +}) diff --git a/tests/testthat/test-simulate.R b/tests/testthat/test-simulate-splat.R similarity index 100% rename from tests/testthat/test-simulate.R rename to tests/testthat/test-simulate-splat.R