From 8d34ba3f48d99dfcfa60de83f4b058657c890f61 Mon Sep 17 00:00:00 2001 From: sbeck Date: Wed, 16 May 2018 12:33:50 +0200 Subject: [PATCH] Edited roxygen comments, SilvermanOverP function, added vignettes Edited many roxygen comments (especially examples and descriptions) to fit the newest version and functions of bimodalR. Edited function SilvermanOverP in filter.R to erase a mistake. Added vignettes, one completed(bimodalR) and one not finished(UsingBimodalR). --- .gitignore | 1 + DESCRIPTION | 5 +- NAMESPACE | 18 +- R/algorithmSpecificFunctions.R | 48 +- R/evaluate.R | 18 +- R/filter.R | 11 +- R/params.R | 50 +- R/simulation.R | 109 +-- man/DipTestOverP.Rd | 6 +- man/Params.Rd | 35 - man/compareScenarios.Rd | 16 +- man/createValidationData.Rd | 41 +- man/evaluateAlgorithmOutput.Rd | 12 +- man/expandValidationData.Rd | 25 - man/getClassification.Rd | 14 +- man/getClassifications.Rd | 14 +- man/getParam.Rd | 2 +- man/getParams.Rd | 2 +- man/getStatistic.Rd | 8 +- man/getStatistics.Rd | 14 +- man/newParams.Rd | 9 +- man/rmse.Rd | 6 +- man/setParam.Rd | 2 +- man/setParams.Rd | 7 +- man/simulateExpression.Rd | 68 +- man/useFlexmix.Rd | 12 +- man/useHdbscan.Rd | 2 +- man/useMclust.Rd | 12 +- vignettes/PlottingExample.PNG | Bin 0 -> 50769 bytes vignettes/Using-BimodalR-on-real-data.Rmd | 121 ++++ vignettes/Workflow_small.png | Bin 0 -> 126246 bytes vignettes/bimodalR.Rmd | 775 ++++++++++++++++++++++ 32 files changed, 1134 insertions(+), 329 deletions(-) delete mode 100644 man/expandValidationData.Rd create mode 100644 vignettes/PlottingExample.PNG create mode 100644 vignettes/Using-BimodalR-on-real-data.Rmd create mode 100644 vignettes/Workflow_small.png create mode 100644 vignettes/bimodalR.Rmd diff --git a/.gitignore b/.gitignore index 5b6a065..c833a2c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .Rhistory .RData .Ruserdata +inst/doc diff --git a/DESCRIPTION b/DESCRIPTION index 7cfce80..3897b52 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -18,4 +18,7 @@ Imports: LaplacesDemon, plyr, mclust, diptest -Suggests: genefilter +Suggests: genefilter, + knitr, + rmarkdown +VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index e35a324..f85f09b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,7 +2,6 @@ export(DipTestOverP) export(SilvermanOverP) -export(createValidationData) export(evaluateAlgorithmOutput) export(getClassifications) export(getParam) @@ -16,9 +15,26 @@ export(useFlexmix) export(useHdbscan) export(useMclust) exportClasses(Params) +import(dbscan) +import(diptest) +import(flexmix) +import(mclust) +import(silvermantest) importFrom(LaplacesDemon,rinvgaussian) importFrom(checkmate,assertCharacter) importFrom(checkmate,assertClass) importFrom(checkmate,assertList) importFrom(checkmate,assertString) +importFrom(methods,"slot<-") +importFrom(methods,new) +importFrom(methods,rbind2) +importFrom(methods,slot) +importFrom(methods,slotNames) +importFrom(methods,validObject) +importFrom(plyr,compact) +importFrom(stats,dnorm) +importFrom(stats,rgamma) +importFrom(stats,rnorm) +importFrom(stats,runif) +importFrom(stats,sd) importFrom(utils,head) diff --git a/R/algorithmSpecificFunctions.R b/R/algorithmSpecificFunctions.R index 27880fc..3c4bc5d 100644 --- a/R/algorithmSpecificFunctions.R +++ b/R/algorithmSpecificFunctions.R @@ -3,31 +3,45 @@ #' Use the mclust algorithm for generating output to evaluate the #' classification (unimodal,bimodal or other) of genes. #' -#' -#' #' @param expression (Simulated) Gene Expression data frame which genes shall #' be classified as unimodal, bimodal or other +#' @param clusterNumbers span of the clusters to be calculated at maximum #' @param verbose logical. Whether to print progress messages #' @param parallel logical. Whether to calculate the mclust models in parallel #' @return The formatted output of the mclust algorithm #' #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' #with messages printed to console #' mclustOutput <- useMclust(expression = expression) -#' #without messages printed to console -#' mclustOutput <- useMclust(expression = expression, verbose = FALSE) +#' #without messages printed to console, at maximum 3 clusters +#' mclustOutput <- useMclust(expression = expression, clusterNumbers = c(1:3), +#' verbose = FALSE, parallel = FALSE) #' #' @import mclust #' @export -useMclust <- function(expression,verbose = TRUE,parallel = FALSE) { +#' +useMclust <- function(expression,clusterNumbers = NULL,verbose = TRUE,parallel = FALSE) { if (verbose) {message("mclust-models are calculated...")} - - if(parallel==FALSE){ + if(is.null(clusterNumbers)){ + if(parallel==FALSE){ + models <- lapply(1:nrow(expression), function(i) { + mclust::Mclust((expression[i,]),modelNames=c("V"),verbose = FALSE) }) + } + if(parallel==TRUE){ + n.cores = parallel::detectCores()-1 + cl = parallel::makeCluster(n.cores) + parallel::clusterExport(cl, "expression") + parallel::clusterEvalQ(cl, library(mclust)) + models <- parallel::parLapply(cl, 1:nrow(expression), function(i) { + mclust::Mclust((expression[i,]), modelNames=c("V")) }) + } + }else{ + if(parallel==FALSE){ models <- lapply(1:nrow(expression), function(i) { - mclust::Mclust((expression[i,]),modelNames=c("V"),verbose = FALSE) }) + mclust::Mclust((expression[i,]),modelNames=c("V"),verbose = FALSE,G = clusterNumbers) }) } if(parallel==TRUE){ n.cores = parallel::detectCores()-1 @@ -35,8 +49,10 @@ useMclust <- function(expression,verbose = TRUE,parallel = FALSE) { parallel::clusterExport(cl, "expression") parallel::clusterEvalQ(cl, library(mclust)) models <- parallel::parLapply(cl, 1:nrow(expression), function(i) { - mclust::Mclust((expression[i,]), modelNames=c("V")) }) + mclust::Mclust((expression[i,]), modelNames=c("V"),G = clusterNumbers) }) } + } + if(parallel==TRUE){parallel::stopCluster(cl)} names(models) = rownames(expression) patients <- names(expression) @@ -51,15 +67,12 @@ useMclust <- function(expression,verbose = TRUE,parallel = FALSE) { #' Using the output of the mclust algorithm for generating output in a unified #' format to evaluate the classification (unimodal,bimodal or other) of genes. #' -#' #' @param models Unformatted output of the Mclust function from the mclust #' package of the genes from the gene expression data frame #' @param patients List of the patients #' #' @return The formatted output of the mclust algorithm #' -#' -#' mclustClassification <- function(models,patients){ genes <- names(models) @@ -94,8 +107,6 @@ mclustClassification <- function(models,patients){ #' Use the HDBSCAN algorithm for generating output to evaluate the #' classification (unimodal,bimodal or other) of genes. #' -#' -#' #' @param expression (Simulated) Gene Expression data frame which genes shall #' be classified as unimodal, bimodal or other #' @param minPts Integer; Minimum size of clusters. See details of ?hdbscan @@ -104,7 +115,7 @@ mclustClassification <- function(models,patients){ #' @return hdbscanOutput The formatted output of the HDBSCAN clustering #' #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' #with messages printed to console @@ -116,6 +127,7 @@ mclustClassification <- function(models,patients){ #' #' @import dbscan #' @export +#' useHdbscan <- function(expression,minPts = 10,verbose = TRUE){ if(verbose){message("HDBSCAN-clusters are calculated...")} genes <- rownames(expression) @@ -187,7 +199,6 @@ useHdbscan <- function(expression,minPts = 10,verbose = TRUE){ #' @param error The difference of a value predicted by a model and an actually #' observed value #' -#' rmse <- function(error){ error <- unlist(error) error2 <- unlist(lapply(1:length(error),function(i){if(!is.na(error[[i]])){c(error[[i]])}})) @@ -208,7 +219,7 @@ rmse <- function(error){ #' @return flexmixOutput The formatted output of the best fitting models from flexmix #' #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=75,"2"=list("gauss"= 75,"gamma"= 75))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' #with messages printed to console @@ -219,6 +230,7 @@ rmse <- function(error){ #' @import flexmix #' @importFrom plyr compact #' @export +#' useFlexmix <- function(expression,maxModality, verbose = TRUE,parallel=FALSE){ modelGauss <- c() modelGamma <- c() diff --git a/R/evaluate.R b/R/evaluate.R index 2366b11..e56ca4b 100644 --- a/R/evaluate.R +++ b/R/evaluate.R @@ -66,7 +66,7 @@ isApproxSame<- function(validationVal,classVal,maxDistance){ #' value and the validation data value with which the estimated is classified #' as TRUE (correctly estimated) #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' validationData <- simulation$validationData @@ -137,7 +137,7 @@ evaluateAlgorithmOutput <- function(modality,algorithmOutput,validationData,maxD #' @param validationData The validationData behind the simulated gene #' expression data frame #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' validationData <- simulation$validationData @@ -187,7 +187,7 @@ getClassification <- function(modality,algorithmOutput,algorithmName="mclust",va #' @param algorithmName The name of the algorithm which created the output #' @return A data frame with the percentual proportion of as TRUE or FALSE evaluated values #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' validationData <- simulation$validationData @@ -213,24 +213,21 @@ getStatistic <- function(evaluation,algorithmName ="mclust"){ #' @param evaluations list of named evaluations #' @return A data frame with the percentual proportion of as TRUE or FALSE evaluated values #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' validationData <- simulation$validationData #' mclustOutput <- useMclust(expression = expression,verbose = FALSE) #' hdbscanOutput <- useHdbscan(expression = expression,verbose = FALSE) -#' flexmixOutput <- useFlexmix(expression = expression,maxModality = 2,verbose = FALSE) #' mclustEvaluation <- evaluateAlgorithmOutput(modality = 2,algorithmOutput = mclustOutput, #' validationData = validationData) #' hdbscanEvaluation <- evaluateAlgorithmOutput(modality = 2,algorithmOutput = hdbscanOutput, #' validationData = validationData) -#' flexmixEvaluation <- evaluateAlgorithmOutput(modality = 2,algorithmOutput = flexmixOutput, -#' validationData = validationData) #' #' #getStatistics of one algorithm -#' getStatistics(evaluations = list("mclust"=mclustEval)) +#' getStatistics(evaluations = list("mclust"=mclustEvaluation)) #' #getStatistics of two or more algorithms -#' getStatistics(evaluations = list("mclust"=mclustEval,"HDBSCAN"=hdbscanEval)) +#' getStatistics(evaluations = list("mclust"=mclustEvaluation,"HDBSCAN"=hdbscanEvaluation)) #' @export getStatistics <- function(evaluations) { numEvaluations <- length(evaluations) @@ -254,13 +251,12 @@ getStatistics <- function(evaluations) { #' @return a classification data frame that contains the number of #' FN, FP, TN and TP #' @examples -#' params <- newParams(nGenes = list("1"=100,"2"=list("gauss"= 100,"gamma"= 100))) +#' params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) #' simulation <- simulateExpression(params= params,verbose=FALSE) #' expression <- simulation$expressionData #' validationData <- simulation$validationData #' mclustOutput <- useMclust(expression = expression,verbose = FALSE) #' hdbscanOutput <- useHdbscan(expression = expression,verbose = FALSE) -#' flexmixOutput <- useFlexmix(expression = expression,maxModality = 2,verbose = FALSE) #' #' #getClassifications of one algorithm #' getClassifications(modality=2,validationData, diff --git a/R/filter.R b/R/filter.R index c50508f..48cbfca 100644 --- a/R/filter.R +++ b/R/filter.R @@ -6,13 +6,14 @@ #' @param na.rm Whether NAs should be removed. #' #' @return A function with bindings for p and R. +#' @import silvermantest #' #' @export SilvermanOverP <- function(p, R = 100, na.rm = T) { function(x) { if (na.rm) x <- x[!is.na(x)] - s1 <- silvermantest::silverman.test(x, k = 1, m = 1, R = R, adjust = T) + s1 <- silvermantest::silverman.test(x, k = 1, R = R, adjust = T) s1@p_value < p } } @@ -20,12 +21,12 @@ SilvermanOverP <- function(p, R = 100, na.rm = T) { #' DipTestOverP returns a filter function with bindings for P. #' This function evaluates to TRUE if the Hartigans Dip Test for unimodality can be rejected at the significance level P. #' -#' @param p -#' @param R -#' @param na.rm +#' @param p The P-value that is used to reject Hartigans Dip Test of unimodality ( +#' @param R The number of bootstrap replicates for each test. +#' @param na.rm Whether NAs should be removed. #' #' @return A function with bindings for p and R. -#' +#' @import diptest #' @export DipTestOverP <- function(p, R = 100, na.rm = T) { function(x) { diff --git a/R/params.R b/R/params.R index 91ba846..f68df39 100644 --- a/R/params.R +++ b/R/params.R @@ -47,34 +47,24 @@ setGeneric("setParam", #' The Params class defines the following parameters: #' #' \describe{ -#' \item{\code{nUniGenes}}{The number of genes to simulate with the -#' Unimodal scenario.} -#' \item{\code{nBiGenes}}{The number of genes to simulate with the -#' bimodal scenario.} -#' \item{\code{nGuGenes}}{The number of genes to simulate with the -#' gamma and unimodal scenario.} -#' \item{\code{nPatients}}{The number of patients to simulate.} +#' \item{\code{nGenes}}{A list containing the numbers of genes to simulate for +#' each scenario and modality.} +#' \item{\code{means}}{A list containing the parameter range for the mean for +#' each scenario and modality.} +#' \item{\code{foldChanges}}A list containing the parameter range for the log2 +#' foldChanges between distributions for multimodal genes. Has to contain one +#' entry less than the modality that is simulated.} +#' \item{\code{sd}}{The parameters mu and lambda for the generation of the +#' standard deviation of each distribution via an Inverse Gaussian distribution.} +#' \item{\code{gamma}}{The shape and rate parameter for generating the gamma +#' distributions.} +#' \item{\code{proportions}}{Parameters for the allowed proportions of +#' multimodal distributions.} +#' \item{\code{nPatients}}{The number of patients to simulate and how +#' many columns the simulated gene expression should have per gene.} #' \item{\code{seed}}{Seed to use for generating random numbers.} -#' \item{\code{sdParms}}{The parameters mu and lambda for the generation of the -#' distribution of the standard deviation for each szenario.} -#' \item{\code{uniMean}}{The mean span for the gaussian distribution of the -#' unimodal simulation scenario.} -#' \item{\code{biMean}}{The mean span for the gaussian distribution of the -#' bimodal simulation scenario.} -#' \item{\code{foldChange}}{The log2 foldChange between the modes in the -#' bimodal simuation scenario.} -#' \item{\code{proportions}}{The proporties of the different distributions of the -#' bimodal and gamma+unimodal simulation scenario.} -#' \item{\code{guMean}}{The mean span for the gaussian distribution of the -#' gamma+unimodal simulation scenario.} -#' \item{\code{gammaShape}}{The shape parameter for the mean gamma+unimodal -#' distribution.} -#' \item{\code{gammaRate}}{The rate parameter for the mean gamma+unimodal -#' distribution.} #' } #' -#' The parameters shown in brackets can be estimated from real data. -#' #' @name Params #' @rdname Params #' @aliases Params-class @@ -140,7 +130,8 @@ setMethod("show", "Params", function(object) { #' params <- newParams("nGenes"=list("1"=100,"2"=list("gauss"=100,"gamma"=100)), #' "proportions"=c(30,70)) #' params <- newParams( -#' nGenes=list("1"=c(700),"2"=list(gauss = 150, gamma = 150),"3"=list(gauss = 150, gamma = 150)), +#' nGenes=list("1"=c(700),"2"=list(gauss = 150, gamma = 150), +#' "3"=list(gauss = 150, gamma = 150)), #' means=list("1"= c(2, 4),"2"= c(2, 4),"3"= c(2, 4)), #' foldChanges = list("1"=NA,"2"= list(gauss = c(2, 4), gamma = c(2, 4)), #' "3"= list(gauss = list(c(2, 4), c(2, 4)), gamma = list(c(2, 4), c(2, 4))))) @@ -197,12 +188,13 @@ getParams <- function(params, names) { #' params <- newParams() #' params #' # Set individually -#' params <- params <- setParams(params,proportions = c(80,20),foldChanges = list("1"=c(2,4), -#' "2"= list("gauss"=c(2,5),"gamma"=c(3,5)))) +#' params <- params <- setParams(params,proportions = c(80,20), +#' foldChanges = list("1"=c(2,4),"2"= list("gauss"=c(2,5),"gamma"=c(3,5)))) #' params #' # Set via update list #' params <- setParams(params,update = list("nGenes"=list("1"=100, -#' "2"=list("gauss"=200,"gamma"=100)),"means"=list("1"=c(1,3),"2"=c(2,4)),"nPatients"=700)) +#' "2"=list("gauss"=200,"gamma"=100)),"means"=list("1"=c(1,3),"2"=c(2,4)), +#' "nPatients"=700)) #' params #' @export setParams <- function(params, update = NULL, ...) { diff --git a/R/simulation.R b/R/simulation.R index ef822e7..fdcbaa5 100644 --- a/R/simulation.R +++ b/R/simulation.R @@ -1,61 +1,38 @@ #' Simulation #' #' Simulate gene expression for the different simulation scenarios: Unimodal, -#' bimodal,gamma+unimodal +#' multimodal with gaussian distributions, multimodal starting with a gamma distribution and followed by gaussian distributions #' #' @param params Params object containing simulation parameters for all scenarios. #' @param verbose logical. Whether to print progress messages #' @param ... any additional parameter settings to override what is provided in \code{params}. #' #' @details -#' Scenario 1 - Unimodal gaussian distribution -#' Gene expression for the unimodal gaussian distribution (scenario 1) is +#' The "modus" is the number of occurring distributions within one gene. +#' Modus "1" - Unimodal gaussian distribution +#' Gene expression for the unimodal gaussian distribution (scenario "1") is #' simulated from the mean and the standard deviation taken from the validation data #' for this gene. The number of values that are simulated for each #' distribution equals the number of Patients {"nPatients"}: -#' \code{expression <- stats::rnorm(nPatients,as.numeric(valData[i,3]), as.numeric(valData[i,4]))} #' -#' Scenario 2 - Bimodal with two unimodal gaussian distributions -#' Gene expression for the bimodal scenario 2 (two gaussian distributions) is -#' simulated individually for each distribution. -#' The first distribution is simulated with the mean and the first standard -#' deviation taken from the validation data for this gene. The number of values that are -#' simulated ("nBi1") are calculated by multiplicating the number of Patients with the -#' first proportion and rounding this number off: -#' \code{data1 <- stats::rnorm(nBi1,as.numeric(valData[i,3]),as.numeric(valData[i,4]))} -#' The second distribution is simulated with the mean calculated by -#' multiplying the mean of the first distribution with the foldChange -#' from the validation data of this gene. The standard deviation is also taken from the validation data of this gene. The number of values that are -#' simulated ("nBi2") are calculated by multiplicating the number of Patients with the -#' second proportion and rounding this number up. -#' the mean and the standard deviation taken from the validation data for this gene. -#' The number of values that are simulated for each distribution equals the -#' number of Patients {"nPatients"}: -#' \code{data2 <- stats::rnorm(nBi2,foldBi,as.numeric(valData[i,5]))} -#' At the end both of the simulated distributions are put into one expression. -#' \code{expression <- c(data1,data2)} +#' All other modi consist of two different scenarios: +#' In the "gauss" scenario all occurring distributions are gaussian distributions. +#' In the "gamma" scenario the first occuring distribution is a gamma distribution. +#' All other distributions are gaussian distributions. #' -#' Scenario 3 - Bimodal with one Gamma Distribution and one unimodal gaussian -#' distribution -#' Gene expression for the bimodal scenario 3 (1 Gamma and 1 unimodal gaussian -#' distribution) is simulated individually for each distribution. -#' The first distribution, which is the Gamma distribution, is simulated with -#' the shape and rate parameter of the validation data for this gene. -#' The number of values that are simulated ("nGu1") are calculated by -#' multiplying the number of Patients with the first proportion and rounding -#' this number off. -#' \code{data1 <- stats::rgamma(n = nGu1,shape = as.numeric(valData[i,9]), -#' rate = as.numeric(valData[i,10]))} -#' The second distribution, which is the unimodal gaussian distribution is -#' simulated with the calculated mean, which is calculated by multiplying the -#' mean with the foldChange of the validation data of this gene. The standard -#' deviation is taken from the validation data of this gene. The number of values that -#' are simulated ("nGu2") are calculated by multiplying the number of Patients -#' with the second proportion and rounding this number up. -#' \code{data2 <- stats::rnorm(nGu2,foldGamma,as.numeric(valData[i,4]))} -#' At the end both of the simulated distributions are put into one expression. -#' \code{expression <- c(data1,data2)} +#' Modus "2" or higher - Bimodal distributions or higher modalities #' +#' Gene expressions of the multimodal genes are +#' simulated automatically for each distribution. +#' Scenario "gauss" +#' The different gaussian distributions are simulated with the corresponding mean +#' and a standard deviation and number of values taken from the validation data +#' for this gene. +#' +#' Scenario "gamma" +#' The gamma distribution is simulated with the gamma shape and rate values from +#' the params object. The other gaussian distributions are simulated with the values +#' from the validation data. #' #' @return A named list with two components: 'validationData' and 'expressionData' #' @@ -63,8 +40,8 @@ #' simulation <- simulateExpression(params = newParams()) #' # Override default parameters #' # Not recommended, better use setParams; See \code{\link{Params}} -#' simulation <- simulateExpression(nGenes = list("1"=100, -#' "2"=list("gauss"= 100,"gamma"= 100)), nPatients = 50) +#' simulation <- simulateExpression(nGenes = list("1"=10, +#' "2"=list("gauss"= 10,"gamma"= 10)), nPatients = 50) #' # without messages printed to the console #' params <- newParams() #' simulation <- simulateExpression(params = params,verbose = FALSE) @@ -140,9 +117,9 @@ simulateExpression <- function(params = newParams(), verbose = TRUE,...) { #' Creating the validation data for algorithms. #' -#' The validation data is generated by using the `Params` object and the parameters that -#' are stored in it. It is generated automatically as and saved as an Rdata -#' object when the simulate() function is executed +#' The validation data is generated by using the `Params` object and the parameters +#' that are stored in it. It is generated automatically when the +#' simulateExpression() function is executed #' @param params Params object containing simulation parameters for all scenarios. #' @param verbose logical. Whether to print progress messages #' @@ -156,34 +133,16 @@ simulateExpression <- function(params = newParams(), verbose = TRUE,...) { #' Default values describes the default values used to generate a `Params` #' object. #' -#' Parameter Type Usage Default values -#' -#' nUniGenes: numeric, Default value: 300 -#' -#' nBiGenes: numeric, Default value: 500 -#' -#' nGuGenes: numeric, Default value: 200 -#' -#' nPatients: numeric, Default value: 100 -#' -#' seed: numeric, Default value: sample(1:1e6,1) -#' -#' sdParms: vector, Default value:c(0.61,2.21), use values as c(µ,lambda) -#' -#' uniMean: vector, Default value: c(2,4), randomize from span of vector -#' -#' biMean: vector, Default value: c(2,5), randomize from span of vector -#' -#' foldChange: vector, Default value: c(2,4), randomize from span of vector -#' -#' proportions: vector, Default value: c(10,20,30,40,50,60,70,80,90), pick random value from vector -#' -#' guMean: vector, Default value: c(0.5,3), randomize from span of vector -#' -#' gammaShape: numeric, Default value: 2 -#' -#' gammaRate: numeric, Default value: 2 +#' Parameter Type Default values #' +#' nGenes: list, Default value: list("1"= 700, "2" = list("gauss"=150,"gamma"=150)), +#' means: list, Default value: list("1"=c(2,4),"2" = c(2,4)), +#' foldChanges: list, Default value: list("1" = c(2,4),"2" = list("gauss"= c(2,4),"gamma" = c(3,5))), +#' sd: list, Default value: list("mu"= 0.61,"lambda"=2.21), +#' gamma: list, Default value: list("shape" = 2, "rate" = 2), +#' proportions: vector, Default value: c(10,20,30,40,50,60,70,80,90), +#' nPatients: numeric, Default value: 200, +#' seed: numeric, Default value: sample(1:1e6, 1) #' #' @importFrom LaplacesDemon rinvgaussian #' diff --git a/man/DipTestOverP.Rd b/man/DipTestOverP.Rd index 0a5fa67..6c27416 100644 --- a/man/DipTestOverP.Rd +++ b/man/DipTestOverP.Rd @@ -8,7 +8,11 @@ This function evaluates to TRUE if the Hartigans Dip Test for unimodality can be DipTestOverP(p, R = 100, na.rm = T) } \arguments{ -\item{na.rm}{} +\item{p}{The P-value that is used to reject Hartigans Dip Test of unimodality (} + +\item{R}{The number of bootstrap replicates for each test.} + +\item{na.rm}{Whether NAs should be removed.} } \value{ A function with bindings for p and R. diff --git a/man/Params.Rd b/man/Params.Rd index f3d1569..0c9675f 100644 --- a/man/Params.Rd +++ b/man/Params.Rd @@ -8,38 +8,3 @@ \description{ Virtual S4 class that all other Params classes inherit from. } -\section{Parameters}{ - - -The Params class defines the following parameters: - -\describe{ - \item{\code{nUniGenes}}{The number of genes to simulate with the - Unimodal scenario.} - \item{\code{nBiGenes}}{The number of genes to simulate with the - bimodal scenario.} - \item{\code{nGuGenes}}{The number of genes to simulate with the - gamma and unimodal scenario.} - \item{\code{nPatients}}{The number of patients to simulate.} - \item{\code{seed}}{Seed to use for generating random numbers.} - \item{\code{sdParms}}{The parameters mu and lambda for the generation of the - distribution of the standard deviation for each szenario.} - \item{\code{uniMean}}{The mean span for the gaussian distribution of the - unimodal simulation scenario.} - \item{\code{biMean}}{The mean span for the gaussian distribution of the - bimodal simulation scenario.} - \item{\code{foldChange}}{The log2 foldChange between the modes in the - bimodal simuation scenario.} - \item{\code{proportions}}{The proporties of the different distributions of the - bimodal and gamma+unimodal simulation scenario.} - \item{\code{guMean}}{The mean span for the gaussian distribution of the - gamma+unimodal simulation scenario.} - \item{\code{gammaShape}}{The shape parameter for the mean gamma+unimodal - distribution.} - \item{\code{gammaRate}}{The rate parameter for the mean gamma+unimodal - distribution.} -} - -The parameters shown in brackets can be estimated from real data. -} - diff --git a/man/compareScenarios.Rd b/man/compareScenarios.Rd index 6479824..5a12280 100644 --- a/man/compareScenarios.Rd +++ b/man/compareScenarios.Rd @@ -4,9 +4,12 @@ \alias{compareScenarios} \title{compare Scenarios} \usage{ -compareScenarios(algorithmOutput, validationData) +compareScenarios(modality, algorithmOutput, validationData) } \arguments{ +\item{modality}{numerical, for which modality the scenarioComparing is calculated, 1 for unimodal, +2 for bimodal,...} + \item{algorithmOutput}{The output to be compared} \item{validationData}{The validationData behind the simulated gene expression data frame} @@ -20,14 +23,11 @@ Compare the scenario of each gene that was assigned by the algorithm with the scenario that is written in the validation Data. } \details{ -TN (TRUE Negative): validationData: unimodal, assigned scenario: unimodal +TN (TRUE Negative): validationData: not modality, assigned scenario: not modality -TP (TRUE Positive): validationData: bimodal, assigned scenario: bimodal +TP (TRUE Positive): validationData: modality, assigned scenario: modality -FN (FALSE Negative): validationData: bimodal, assigned scenario: unimodal -or -FN (FALSE Negative): validationData: unimodal/bimodal, - assigned scenario: more than bimodal +FN (FALSE Negative): validationData: modality, assigned scenario: not modality -FP (FALSE Positive): validationData: unimodal, assigned scenario: bimodal +FP (FALSE Positive): validationData: not modality, assigned scenario: modality } diff --git a/man/createValidationData.Rd b/man/createValidationData.Rd index c1482d0..0ecdff7 100644 --- a/man/createValidationData.Rd +++ b/man/createValidationData.Rd @@ -15,9 +15,9 @@ createValidationData(params = newParams(), verbose = TRUE) A data.frame with validation data, from which expression values will be simulated. } \description{ -The validation data is generated by using the `Params` object and the parameters that -are stored in it. It is generated automatically as and saved as an Rdata -object when the simulate() function is executed +The validation data is generated by using the `Params` object and the parameters +that are stored in it. It is generated automatically when the +simulateExpression() function is executed } \details{ For changing the parameters, please consider the following: @@ -27,31 +27,14 @@ Usage shows further information for the usage of the values, Default values describes the default values used to generate a `Params` object. -Parameter Type Usage Default values +Parameter Type Default values -nUniGenes: numeric, Default value: 300 - -nBiGenes: numeric, Default value: 500 - -nGuGenes: numeric, Default value: 200 - -nPatients: numeric, Default value: 100 - -seed: numeric, Default value: sample(1:1e6,1) - -sdParms: vector, Default value:c(0.61,2.21), use values as c(µ,lambda) - -uniMean: vector, Default value: c(2,4), randomize from span of vector - -biMean: vector, Default value: c(2,5), randomize from span of vector - -foldChange: vector, Default value: c(2,4), randomize from span of vector - -proportions: vector, Default value: c(10,20,30,40,50,60,70,80,90), pick random value from vector - -guMean: vector, Default value: c(0.5,3), randomize from span of vector - -gammaShape: numeric, Default value: 2 - -gammaRate: numeric, Default value: 2 +nGenes: list, Default value: list("1"= 700, "2" = list("gauss"=150,"gamma"=150)), +means: list, Default value: list("1"=c(2,4),"2" = c(2,4)), +foldChanges: list, Default value: list("1" = c(2,4),"2" = list("gauss"= c(2,4),"gamma" = c(3,5))), +sd: list, Default value: list("mu"= 0.61,"lambda"=2.21), +gamma: list, Default value: list("shape" = 2, "rate" = 2), +proportions: vector, Default value: c(10,20,30,40,50,60,70,80,90), +nPatients: numeric, Default value: 200, +seed: numeric, Default value: sample(1:1e6, 1) } diff --git a/man/evaluateAlgorithmOutput.Rd b/man/evaluateAlgorithmOutput.Rd index 0fe1bac..35d1918 100644 --- a/man/evaluateAlgorithmOutput.Rd +++ b/man/evaluateAlgorithmOutput.Rd @@ -4,9 +4,13 @@ \alias{evaluateAlgorithmOutput} \title{Evaluate AlgorithmOutput} \usage{ -evaluateAlgorithmOutput(algorithmOutput, validationData, maxDifference = 10) +evaluateAlgorithmOutput(modality, algorithmOutput, validationData, + maxDifference = 10) } \arguments{ +\item{modality}{numerical, for which modality output is evaluated, 1 for unimodal, +2 for bimodal,...} + \item{algorithmOutput}{The formatted output of the algorithm that is now evaluated} @@ -32,15 +36,15 @@ FALSE (not correctly estimated) for this value. If the difference is less or equal to 10%, the estimation is classified as TRUE (correctly estimated) } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData validationData <- simulation$validationData output <- useMclust(expression, verbose=FALSE) # TRUE if less than +- 10 \% difference to value of validationData -evaluation <- evaluateAlgorithmOutput(algorithmOutput = output, +evaluation <- evaluateAlgorithmOutput(modality = 2,algorithmOutput = output, validationData = validationData) # TRUE if less than +- 20 \% difference to value of validationData -evaluation <- evaluateAlgorithmOutput(algorithmOutput = output, +evaluation <- evaluateAlgorithmOutput(modality = 2,algorithmOutput = output, validationData = validationData,maxDifference = 20) } diff --git a/man/expandValidationData.Rd b/man/expandValidationData.Rd deleted file mode 100644 index d2b4d60..0000000 --- a/man/expandValidationData.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/evaluate.R -\name{expandValidationData} -\alias{expandValidationData} -\title{Expand the validationData} -\usage{ -expandValidationData(validationData) -} -\arguments{ -\item{validationData}{not expanded validationData data frame} -} -\value{ -returns validationData with the two added columns -} -\description{ -Adds two columns to the validationData: mean2 and sdGamma -} -\details{ -For scenario 1, no mean2 and no sdGamma is added (NA added) -For scenario 2 the mean2 (calculated out of mean1 and foldChange) is added, -but no sdGamma is added (NA added) -For scenario 3, the mean 2 is not added(NA added, foldChange was already -used), but sdGamma is calculated with sqrt(gammaShape*(gammaScale^2)) -gammaScale is 1/gammaRate -} diff --git a/man/getClassification.Rd b/man/getClassification.Rd index f2441ba..97bb04a 100644 --- a/man/getClassification.Rd +++ b/man/getClassification.Rd @@ -4,9 +4,13 @@ \alias{getClassification} \title{getClassification} \usage{ -getClassification(algorithmOutput, algorithmName = "mclust", validationData) +getClassification(modality, algorithmOutput, algorithmName = "mclust", + validationData) } \arguments{ +\item{modality}{numerical, for which modality the classification is calculated, 1 for unimodal, +2 for bimodal,...} + \item{algorithmOutput}{The formatted output of the algorithm} \item{algorithmName}{The name of the evaluated algorithm} @@ -36,13 +40,11 @@ FN (FALSE Negative): validationData: unimodal/bimodal, FP (FALSE Positive): validationData: unimodal, assigned scenario: bimodal } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData validationData <- simulation$validationData mclustOutput <- useMclust(expression, verbose=FALSE) -evaluation <- evaluateAlgorithmOutput(algorithmOutput = output, -validationData = validationData) -getClassification(algorithmOutput = mclustOutput,algorithmName = "mclust", -validationData = validationData) +getClassifications(modality = 2,validationData = validationData, +outputs = list("mclust" = mclustOutput)) } diff --git a/man/getClassifications.Rd b/man/getClassifications.Rd index 6191864..c761c84 100644 --- a/man/getClassifications.Rd +++ b/man/getClassifications.Rd @@ -4,9 +4,12 @@ \alias{getClassifications} \title{getClassifications} \usage{ -getClassifications(validationData, outputs) +getClassifications(modality, validationData, outputs) } \arguments{ +\item{modality}{numerical, for which modality the classification is calculated, 1 for unimodal, +2 for bimodal,...} + \item{validationData}{The validationData behind the simulated gene expression data frame} \item{outputs}{list of named outputs} @@ -33,17 +36,18 @@ FN (FALSE Negative): validationData: unimodal/bimodal, FP (FALSE Positive): validationData: unimodal, assigned scenario: bimodal } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData validationData <- simulation$validationData mclustOutput <- useMclust(expression = expression,verbose = FALSE) hdbscanOutput <- useHdbscan(expression = expression,verbose = FALSE) -flexmixOutput <- useFlexmix(expression = expression,verbose = FALSE) #getClassifications of one algorithm -getClassifications(validationData,outputs = list("mclust"=mclustOutput)) +getClassifications(modality=2,validationData, +outputs = list("mclust"=mclustOutput)) #getClassifications of two or more algorithms -getClassifications(validationData,outputs = list("mclust"=mclustOutput,"HDBSCAN"=hdbscanOutput)) +getClassifications(modality=2,validationData, +outputs = list("mclust"=mclustOutput,"HDBSCAN"=hdbscanOutput)) } diff --git a/man/getParam.Rd b/man/getParam.Rd index 92d9bda..a37f076 100644 --- a/man/getParam.Rd +++ b/man/getParam.Rd @@ -23,6 +23,6 @@ Accessor function for getting parameter values. } \examples{ params <- newParams() -getParam(params, "nUniGenes") +getParam(object = params,name = "nGenes") } diff --git a/man/getParams.Rd b/man/getParams.Rd index 7c6c3be..0c54fda 100644 --- a/man/getParams.Rd +++ b/man/getParams.Rd @@ -19,5 +19,5 @@ Get multiple parameter values from a Params object. } \examples{ params <- newParams() -getParams(params, c("nUniGenes", "nPatients", "uniMean")) +getParams(params = params,names = c("nGenes","foldChanges","proportions","means")) } diff --git a/man/getStatistic.Rd b/man/getStatistic.Rd index 7bd582f..36bdedd 100644 --- a/man/getStatistic.Rd +++ b/man/getStatistic.Rd @@ -20,12 +20,12 @@ algorithms. The result is a data frame where the percentage of as TRUE and as FALSE evaluated values of the genes } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData validationData <- simulation$validationData mclustOutput <- useMclust(expression, verbose=FALSE) -mclustEvaluation <- evaluateAlgorithmOutput(algorithmOutput = mclustOutput,validationData = validationData) -getStatistic(evaluation = mclustEvaluation,algorithmName = "mclust") - +mclustEvaluation <- evaluateAlgorithmOutput(modality = 2, algorithmOutput = mclustOutput, +validationData = validationData) +getStatistics(evaluations = list("mclust" = mclustEvaluation)) } diff --git a/man/getStatistics.Rd b/man/getStatistics.Rd index 150444e..6fccb48 100644 --- a/man/getStatistics.Rd +++ b/man/getStatistics.Rd @@ -18,23 +18,19 @@ algorithms. The result is a data frame where the percentage of as TRUE and as FALSE evaluated values of the genes } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData validationData <- simulation$validationData mclustOutput <- useMclust(expression = expression,verbose = FALSE) hdbscanOutput <- useHdbscan(expression = expression,verbose = FALSE) -flexmixOutput <- useFlexmix(expression = expression,verbose = FALSE) -mclustEvaluation <- evaluateAlgorithmOutput(algorithmOutput = mclustOutput, +mclustEvaluation <- evaluateAlgorithmOutput(modality = 2,algorithmOutput = mclustOutput, validationData = validationData) -hdbscanEvaluation <- evaluateAlgorithmOutput(algorithmOutput = hdbscanOutput, -validationData = validationData) -flexmixEvaluation <- evaluateAlgorithmOutput(algorithmOutput = flexmixOutput, +hdbscanEvaluation <- evaluateAlgorithmOutput(modality = 2,algorithmOutput = hdbscanOutput, validationData = validationData) #getStatistics of one algorithm -getStatistics(evaluations = list("mclust"=mclustEval)) +getStatistics(evaluations = list("mclust"=mclustEvaluation)) #getStatistics of two or more algorithms -getStatistics(evaluations = list("mclust"=mclustEval,"HDBSCAN"=hdbscanEval)) - +getStatistics(evaluations = list("mclust"=mclustEvaluation,"HDBSCAN"=hdbscanEvaluation)) } diff --git a/man/newParams.Rd b/man/newParams.Rd index 08250e6..ee485c9 100644 --- a/man/newParams.Rd +++ b/man/newParams.Rd @@ -18,6 +18,13 @@ Params subtypes. } \examples{ params <- newParams() -params <- newParams(nUniGenes = 200, nPatients = 10) +params <- newParams("nGenes"=list("1"=100,"2"=list("gauss"=100,"gamma"=100)), +"proportions"=c(30,70)) +params <- newParams( +nGenes=list("1"=c(700),"2"=list(gauss = 150, gamma = 150), +"3"=list(gauss = 150, gamma = 150)), +means=list("1"= c(2, 4),"2"= c(2, 4),"3"= c(2, 4)), +foldChanges = list("1"=NA,"2"= list(gauss = c(2, 4), gamma = c(2, 4)), +"3"= list(gauss = list(c(2, 4), c(2, 4)), gamma = list(c(2, 4), c(2, 4))))) } diff --git a/man/rmse.Rd b/man/rmse.Rd index 166f58d..3718ed0 100644 --- a/man/rmse.Rd +++ b/man/rmse.Rd @@ -7,10 +7,8 @@ rmse(error) } \arguments{ -\item{error}{The difference of a value predicted by a model and an actually observed value} -} -\value{ -The RMSE value +\item{error}{The difference of a value predicted by a model and an actually +observed value} } \description{ The RMSE is frquently used as a measure of the differences between values diff --git a/man/setParam.Rd b/man/setParam.Rd index 3129576..d79c5a1 100644 --- a/man/setParam.Rd +++ b/man/setParam.Rd @@ -25,6 +25,6 @@ Accessor function for setting parameter values. } \examples{ params <- newParams() -params = setParam(params, "nBiGenes", 100) +params <- setParam(object = params,name = "nPatients",value = 250) } diff --git a/man/setParams.Rd b/man/setParams.Rd index ec9be5b..6a69fb6 100644 --- a/man/setParams.Rd +++ b/man/setParams.Rd @@ -32,9 +32,12 @@ them manually), see examples. params <- newParams() params # Set individually -params <- setParams(params, nUniGenes = 1000, nPatients = 50) +params <- params <- setParams(params,proportions = c(80,20), +foldChanges = list("1"=c(2,4),"2"= list("gauss"=c(2,5),"gamma"=c(3,5)))) params # Set via update list -params <- setParams(params, list(nUniGenes = 1000, nPatients = 50)) +params <- setParams(params,update = list("nGenes"=list("1"=100, +"2"=list("gauss"=200,"gamma"=100)),"means"=list("1"=c(1,3),"2"=c(2,4)), +"nPatients"=700)) params } diff --git a/man/simulateExpression.Rd b/man/simulateExpression.Rd index c77b40f..0da292d 100644 --- a/man/simulateExpression.Rd +++ b/man/simulateExpression.Rd @@ -18,62 +18,42 @@ A named list with two components: 'validationData' and 'expressionData' } \description{ Simulate gene expression for the different simulation scenarios: Unimodal, -bimodal,gamma+unimodal +multimodal with gaussian distributions, multimodal starting with a gamma distribution and followed by gaussian distributions } \details{ -Scenario 1 - Unimodal gaussian distribution -Gene expression for the unimodal gaussian distribution (scenario 1) is +The "modus" is the number of occurring distributions within one gene. +Modus "1" - Unimodal gaussian distribution +Gene expression for the unimodal gaussian distribution (scenario "1") is simulated from the mean and the standard deviation taken from the validation data for this gene. The number of values that are simulated for each distribution equals the number of Patients {"nPatients"}: -\code{expression <- rnorm(nPatients,as.numeric(valData[i,3]), as.numeric(valData[i,4]))} -Scenario 2 - Bimodal with two unimodal gaussian distributions -Gene expression for the bimodal scenario 2 (two gaussian distributions) is -simulated individually for each distribution. -The first distribution is simulated with the mean and the first standard -deviation taken from the validation data for this gene. The number of values that are -simulated ("nBi1") are calculated by multiplicating the number of Patients with the -first proportion and rounding this number off: -\code{data1 <- rnorm(nBi1,as.numeric(valData[i,3]),as.numeric(valData[i,4]))} -The second distribution is simulated with the mean calculated by -multiplying the mean of the first distribution with the foldChange -from the validation data of this gene. The standard deviation is also taken from the validation data of this gene. The number of values that are -simulated ("nBi2") are calculated by multiplicating the number of Patients with the -second proportion and rounding this number up. -the mean and the standard deviation taken from the validation data for this gene. -The number of values that are simulated for each distribution equals the -number of Patients {"nPatients"}: -\code{data2 <- rnorm(nBi2,foldBi,as.numeric(valData[i,5]))} -At the end both of the simulated distributions are put into one expression. -\code{expression <- c(data1,data2)} +All other modi consist of two different scenarios: +In the "gauss" scenario all occurring distributions are gaussian distributions. +In the "gamma" scenario the first occuring distribution is a gamma distribution. +All other distributions are gaussian distributions. -Scenario 3 - Bimodal with one Gamma Distribution and one unimodal gaussian -distribution -Gene expression for the bimodal scenario 3 (1 Gamma and 1 unimodal gaussian -distribution) is simulated individually for each distribution. -The first distribution, which is the Gamma distribution, is simulated with -the shape and rate parameter of the validation data for this gene. -The number of values that are simulated ("nGu1") are calculated by -multiplying the number of Patients with the first proportion and rounding -this number off. -\code{data1 <- rgamma(n = nGu1,shape = as.numeric(valData[i,9]), -rate = as.numeric(valData[i,10]))} -The second distribution, which is the unimodal gaussian distribution is -simulated with the calculated mean, which is calculated by multiplying the -mean with the foldChange of the validation data of this gene. The standard -deviation is taken from the validation data of this gene. The number of values that -are simulated ("nGu2") are calculated by multiplying the number of Patients -with the second proportion and rounding this number up. -\code{data2 <- rnorm(nGu2,foldGamma,as.numeric(valData[i,4]))} -At the end both of the simulated distributions are put into one expression. -\code{expression <- c(data1,data2)} +Modus "2" or higher - Bimodal distributions or higher modalities + +Gene expressions of the multimodal genes are +simulated automatically for each distribution. +Scenario "gauss" +The different gaussian distributions are simulated with the corresponding mean +and a standard deviation and number of values taken from the validation data +for this gene. + +Scenario "gamma" +The gamma distribution is simulated with the gamma shape and rate values from +the params object. The other gaussian distributions are simulated with the values +from the validation data. } \examples{ simulation <- simulateExpression(params = newParams()) # Override default parameters # Not recommended, better use setParams; See \\code{\\link{Params}} -simulation <- simulateExpression(nUniGenes = 1000, nPatients = 50) +simulation <- simulateExpression(nGenes = list("1"=10, +"2"=list("gauss"= 10,"gamma"= 10)), nPatients = 50) # without messages printed to the console +params <- newParams() simulation <- simulateExpression(params = params,verbose = FALSE) } diff --git a/man/useFlexmix.Rd b/man/useFlexmix.Rd index af1d060..61a27ac 100644 --- a/man/useFlexmix.Rd +++ b/man/useFlexmix.Rd @@ -4,13 +4,17 @@ \alias{useFlexmix} \title{UseFlexmix} \usage{ -useFlexmix(expression, verbose = TRUE) +useFlexmix(expression, maxModality, verbose = TRUE, parallel = FALSE) } \arguments{ \item{expression}{(Simulated) Gene Expression data frame which genes shall be classified as unimodal, bimodal or other} +\item{maxModality}{numerical, maximum modality for that models will be calculated} + \item{verbose}{logical. Whether to print progress messages} + +\item{parallel}{logical. Whether to calculate the models in parallel} } \value{ flexmixOutput The formatted output of the best fitting models from flexmix @@ -20,12 +24,12 @@ Use the FlexMix algorithm for creating a model to find the best fitting model to evaluate the classification (unimodal,bimodal or other) of genes. } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=75,"2"=list("gauss"= 75,"gamma"= 75))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData #with messages printed to console -flexmixOutput <- useFlexmix(expression = expression) +flexmixOutput <- useFlexmix(expression = expression, maxModality = 2) #without messages printed to console -flexmixOutput <- useFlexmix(expression = expression, verbose = FALSE) +flexmixOutput <- useFlexmix(expression = expression, maxModality = 2, verbose = FALSE) } diff --git a/man/useHdbscan.Rd b/man/useHdbscan.Rd index ad5f28a..1ae762a 100644 --- a/man/useHdbscan.Rd +++ b/man/useHdbscan.Rd @@ -22,7 +22,7 @@ Use the HDBSCAN algorithm for generating output to evaluate the classification (unimodal,bimodal or other) of genes. } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData #with messages printed to console diff --git a/man/useMclust.Rd b/man/useMclust.Rd index 1f03c56..980e47a 100644 --- a/man/useMclust.Rd +++ b/man/useMclust.Rd @@ -4,12 +4,15 @@ \alias{useMclust} \title{UseMclust} \usage{ -useMclust(expression, verbose = TRUE, parallel = FALSE) +useMclust(expression, clusterNumbers = NULL, verbose = TRUE, + parallel = FALSE) } \arguments{ \item{expression}{(Simulated) Gene Expression data frame which genes shall be classified as unimodal, bimodal or other} +\item{clusterNumbers}{span of the clusters to be calculated at maximum} + \item{verbose}{logical. Whether to print progress messages} \item{parallel}{logical. Whether to calculate the mclust models in parallel} @@ -22,12 +25,13 @@ Use the mclust algorithm for generating output to evaluate the classification (unimodal,bimodal or other) of genes. } \examples{ -params <- newParams(nUniGenes = 100, nBiGenes = 100, nGuGenes = 100) +params <- newParams(nGenes = list("1"=10,"2"=list("gauss"= 10,"gamma"= 10))) simulation <- simulateExpression(params= params,verbose=FALSE) expression <- simulation$expressionData #with messages printed to console mclustOutput <- useMclust(expression = expression) -#without messages printed to console -mclustOutput <- useMclust(expression = expression, verbose = FALSE) +#without messages printed to console, at maximum 3 clusters +mclustOutput <- useMclust(expression = expression, clusterNumbers = c(1:3), +verbose = FALSE, parallel = FALSE) } diff --git a/vignettes/PlottingExample.PNG b/vignettes/PlottingExample.PNG new file mode 100644 index 0000000000000000000000000000000000000000..e2631de20dec692b3e012b575e177c068629d132 GIT binary patch literal 50769 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 LsRS(&*Z2A_nSMZl literal 0 HcmV?d00001 diff --git a/vignettes/Using-BimodalR-on-real-data.Rmd b/vignettes/Using-BimodalR-on-real-data.Rmd new file mode 100644 index 0000000..e7a6ca5 --- /dev/null +++ b/vignettes/Using-BimodalR-on-real-data.Rmd @@ -0,0 +1,121 @@ +--- +title: "Using BimodalR on real data" +author: "Svenja K. Beck" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Vignette Title} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +# Introduction +Welcome to bimodalR! bimodalR is an R package for the simulation of +multimodal gene expression data, for evaluating different algorithms +detecting multimodality and for detecting bimodality or multimodality +in data sets. +This vignette gives an overview to bimodalR's usage on real data. For an overview and introduction to bimodalR's functionalities, use the other vignette. +It was written in R Markdown, using the knitr package for production. +See help(package="bimodalR") for further details (and references provided by citation("bimodalR").) + +# Installation +To install the most recent development version from Github use: (not possible yet) + +```{r install-github, eval = FALSE} +# biocLite("loosolab/bimodalR", dependencies = TRUE,build_vignettes = TRUE) +``` + +# Quickstart + +1. Import your data +1. Clean up your data + 1. Log-transform your data + 1. Exclude 0-sum rows + 1. Sort into groups + +**Processing single groups:** + +1. Collect data as data.frame +1. Exlude 0-sum rows +1. Filter your genes (with Silverman Test's for unimodality) +1. Use algorithm on data to find potential multimodal genes + +## Import your data + +Import your data with +```{r loadData} +#load(file="") #add path to your Rdata object +``` +or create your own simulated data with 'bimodalR' + +## Clean up your data + +**Log-transform your data** + +**Exclude 0-sum rows** + +**Sort into groups** + +```{r loadData-2} +#load(file="") #add path to your Rdata object +``` + +## Processing single groups + +###Collect data as data.frame + +###Exlude 0-sum rows + +###Filter your genes (with Silverman Test's for unimodality) + +###Use algorithm on data to find potential multimodal genes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vignettes/Workflow_small.png b/vignettes/Workflow_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ca65b83ea352521cc49daa37b6786e52cdf9207e GIT binary patch literal 126246 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

IJ%sHt7PJ0`?cT5SwK6ZjsG4Lwf!rTC?=U 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 literal 0 HcmV?d00001 diff --git a/vignettes/bimodalR.Rmd b/vignettes/bimodalR.Rmd new file mode 100644 index 0000000..4814219 --- /dev/null +++ b/vignettes/bimodalR.Rmd @@ -0,0 +1,775 @@ +--- +title: "An introduction to the bimodalR package" +author: "Svenja Kristina Beck" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +#output: pdf_document +vignette: > + %\VignetteIndexEntry{An introduction to the bimodalR package} + %\VignetteEngine{knitr::rmarkdown} + \usepackage[utf8]{inputenc} +--- + + + + + + + + + + + + + + +# Introduction +Welcome to bimodalR! bimodalR is an R package for the simulation of +multimodal gene expression data, for evaluating different algorithms +detecting multimodality and for detecting bimodality or multimodality +in data sets. +This vignette gives an overview and introduction to bimodalR's functionalities. +It was written in R Markdown, using the knitr package for production. +See help(package="bimodalR") for further details (and references provided by citation("bimodalR").) + +# Installation +To install the most recent development version from Github use: (not possible yet) + +```{r install-github, eval = FALSE} +# biocLite("loosolab/bimodalR", dependencies = TRUE,build_vignettes = TRUE) +``` + +# Quickstart + +Assuming you want to simulate gene expression data from scratch +there are two simple steps to creating a simulated data set with bimodalR. +Here is an example: + +```{r quickstart} +# Load package +library(bimodalR) + +# Create parameter object +params <- newParams() + +# Simulate data and generating the validationData behind it +simulation <- simulateExpression(params = params) +validationData <- simulation$validationData +expression <- simulation$expressionData + +``` + +These steps will be explained in detail in the following sections but briefly +the first step generates a Params object containing the parameters for +the simulation. The second step takes those parameters and simulates a new data set +containing the simulated gene expressions. + +# Getting started + +## The general background +When observing gene expression data, mostly 3 different scenarios can be observed: + + 1. a unimodal distribution of the gene expression + 2. a multimodal (often bimodal) distribution of the gene expression, + where lesser and greater expression are observed + 3. a multimodal (often bimodal) distribution of the gene expression, + where a non-existent expression (0, or nearly 0) + and higher expressions are observed + +For our simulation the first scenario is generated with a Gaussian distribution. +The second scenario is generated with multiple Gaussian distributions. +The third scenario is generated with a Gamma distribution and multiple Gaussian distributions. + +Examples for bimodal gene expression: + +* The gene expression of Plexin-B1 is bimodal in ErbB-2 over-expressing cells + +## Parameters +The parameters required for the gene expression simulation are briefly described here: + +* **Global parameters** + * `nGenes` - A list containing the numbers of genes to simulate for each scenario and modality. + * `nPatients` - The number of patients to simulate and + how many columns the simulated gene expression should have per gene. + * `seed` - Seed to use for generating random numbers. +* **Distribution parameters** + * `means` - A list containing the parameter range for the mean for each scenario and modality. + * `foldChanges` - A list containing the parameter range for the foldChanges between distributions for multimodal genes. Has to be one less than the modality that is simulated. + * `sd` - Parameters for generating the standard deviations via an Inverse Gaussian distribution + * `gamma` - Shape and rate parameter for generating the gamma distributions. + * `proportions` - Parameters for the allowed proportions of multimodal distributions. + +# The `Params` Object +All the parameters for the simulation of gene expression data +are stored in a `Params` object. +Let's create a new one and see what it looks like. + +```{r Params} +params <- newParams() +params +``` + +As well as telling us what type of object we have ("An object of class +`Params`") and showing us the values of the parameters +this output gives us some extra information. +We can see which parameters have been changed from their +default values (those in ALL CAPS). + +## `Params` object explained & Template +The names "1","2","3",... stand for the modality of the scenario. If you want to simulate gene expression with a modality > 3, it is very helpful to use the following template: + +```{r params-Template} +#template for highest modality >= 3 +params <- newParams( + nGenes=list( + "1"=c(300), + "2"=list(gauss = 150, gamma = 150), + "3"=list(gauss = 150, gamma = 150)#add more rows + ), + means=list( + "1"= c(2, 4), + "2"= c(2, 4), + "3"= c(2, 4) + ), + foldChanges = list( + "1"=NA, + "2"= list(gauss = c(2, 4), gamma = c(2, 4)), + "3"= list(gauss = list(c(2, 4), c(2, 4)), gamma = list(c(2, 4), c(2, 4))) + ), + sd = list( + "mu" = 0.61, + "lambda" = 2.21 + ), + gamma = list( + shape =2, + rate = 2 + ), + proportions = c(10,20,30,40,50,60,70,80,90), + nPatients = c(200) + ) +``` +CAUTION: if you want to simulate only certain modalities (e.g. 2,4), you have to use blanks for the others: +```{r params-TemplateOnlyCertainModailities} +params <- newParams( + nGenes=list( + "1"=c(0), + "2"=list(gauss = 10, gamma = 10), + "3"=list(gauss = 0, gamma = 0), + "4"=list(gauss = 10, gamma = 10) + ), + means=list( + "1"= 0, + "2"= c(2, 4), + "3"= 0, + "4"=c(2,4) + ), + foldChanges = list( + "1"=NA, + "2"= list(gauss = c(2, 4), gamma = c(2, 4)), + "3"= NA, + "4"= list(gauss = list(c(2, 4),c(2,4),c(2,4)), gamma = list(c(2, 4),c(2,4),c(2,4))) + ), + sd = list( + "mu" = 0.61, + "lambda" = 2.21 + ), + gamma = list( + shape =2, + rate = 2 + ), + proportions = c(10,20,30,40,50,60,70,80,90), + nPatients = c(200) + ) +``` + +## Getting and setting +If we want to look at a particular parameter, for example the number of genes to +simulate, we can extract it using the `getParam` function: + +```{r getParam} +getParam(params, "nGenes") +``` + +Alternatively, to give a parameter a new value we can use the `setParam` +function: + +```{r setParam} +params <- setParam(params, "nGenes", list("1" = 100,"2"=list("gauss"=150,"gamma"=200))) +getParam(params, "nGenes") +``` + +If we want to extract multiple parameters (as a list) or set multiple parameters +we can use the `getParams` or `setParams` functions: + +```{r getParams-setParams} +# Set multiple parameters at once (using a list) +params <- setParams(params, update = list("nGenes" = list("1" = 100,"2"=list("gauss"=150,"gamma"=200)), "nPatients" = 300)) +# Extract multiple parameters as a list +getParams(params, c("nGenes", "gamma")) +# Set multiple parameters at once (using additional arguments) +params <- setParams(params, "nGenes" = list("1" = 100,"2"=list("gauss"=150,"gamma"=200)), "nPatients" = 300) +params +``` + +The parameters which have changed are now shown in ALL CAPS to indicate that they have +been changed from the default. + +We can also set parameters directly when we call `newParams`: + +```{r newParams-set} +# # A basic example for simulating unimodal, bimodal and trimodal distributions +params <- newParams( +nGenes=list("1"=c(300),"2"=list(gauss = 150, gamma = 150),"3"=list(gauss = 150, gamma = 150)), +means=list("1"= c(2, 4),"2"= c(2, 4),"3"= c(2, 4)), +foldChanges = list("1"=NA,"2"= list(gauss = c(2, 4), gamma = c(2, 4)), +"3"= list(gauss = list(c(2, 4), c(2, 4)), gamma = list(c(2, 4), c(2, 4))))) +params +``` + +For changing the parameters, please consider the following table. +*Type* shows with which type the slot has to be filled, +*Usage* shows further information for the usage of the values, +*Default values* describes the default values used to generate a `Params` +object. +```{r params-table, eval=FALSE} + Type Usage Default values +nGenes list values with unimodal,bimodal(gauss,gamma),... 700, list(gauss = 150, gamma = 150) +means list values with unimodal,bimodal(gauss),... c(2, 4), c(2, 4) +foldChanges list values with unimodal,bimodal(gauss,gamma),... c(2, 4), list(gauss = c(2, 4), gamma = c(3, 5)) +sd list use values as µ,lambda 0.61, 2.21 +gamma list use values as shape,rate 2, 2 +proportions vector pick random value from vector c(10,20,30,40,50,60,70,80,90) +nPatients numeric - 100 +seed numeric - sample(1:1e6,1) + +``` + + +# Workflow +![Workflow to simulate gene expression and evaluate which algorithm works best](workflow_small.png) + +# The gene expression simulation +Now that we looked at the Params Objects and saw which parameters it contains, +let's look at how bimodalR simulates gene expression data. + +The core of the simulation is the validationData, which is created in the simulation +process with the parameters from the created Params object. +As the result of the simulation process, the simulated gene expression matrix +is returned with the validationData in a list object. + +The simulation of a gene expression data set requires the parameters (which are +stored in the Params object) and the validationData behind the simulation (which was +not created yet). +The Params object was already created and if needed, default values were +changed. The validationData is automatically created when the simulate() command is +executed. + +## validationData +The structure of the validationData is the following: + + * each simulated gene has its own entry in the validationData and can be accessed with validationData$[GeneName] + * each entry contains the following informations: + * modus - modality of this gene shown as a number (1 = unimodal, 2 = bimodal, ...) + * scenario - scenario of this gene, either ("unimodal-gaussian","multimodal-gaussian" or "multimodal-gamma+gaussian") + * means - means of this gene + * foldChanges - foldChanges between the means (NA for unimodal genes) + * sds - standard deviation of each mean + * proportions - proportions of the different distributions + * sizes - sizes of the different groups + * groups - patientNames are listed in the corresponding group + +To generate the validationData, a `Params` object is needed. The parameters from this +object are used for generating the validationData by randomizing values starting with a +generated `seed`. This is done by drawing values from the `Params` object. +Mean values are generated from a span of values, standard +deviations are generated by using an inversed Gaussian distribution [LaplacesDemon].That is, +because over a large data set a inverseGaussian-like distribution of all +standard deviations was noticed. + +Because of those needed parameters the validationData looks for example like that: +```{r validationData-example,eval=FALSE} +validationData$Gene0001 +$modus +[1] 1 + +$scenario +[1] "unimodal-gaussian" + +$means +[1] 2.173944 + +$foldChanges +[1] NA + +$sds +[1] 0.4449741 + +$proportions +[1] 100 + +$sizes +[1] 200 + +$groups +$groups[[1]] + [1] "Patient1" "Patient2" "Patient3" "Patient4" "Patient5" "Patient6" + [7] "Patient7" "Patient8" "Patient9" "Patient10" "Patient11" "Patient12" + [13] "Patient13" "Patient14" "Patient15" "Patient16" "Patient17" "Patient18" + [19] "Patient19" "Patient20" "Patient21" "Patient22" "Patient23" "Patient24" + [25] "Patient25" "Patient26" "Patient27" "Patient28" "Patient29" "Patient30" + [31] "Patient31" "Patient32" "Patient33" "Patient34" "Patient35" "Patient36" + [37] "Patient37" "Patient38" "Patient39" "Patient40" "Patient41" "Patient42" + [43] "Patient43" "Patient44" "Patient45" "Patient46" "Patient47" "Patient48" + [49] "Patient49" "Patient50" "Patient51" "Patient52" "Patient53" "Patient54" + [55] "Patient55" "Patient56" "Patient57" "Patient58" "Patient59" "Patient60" + [61] "Patient61" "Patient62" "Patient63" "Patient64" "Patient65" "Patient66" + [67] "Patient67" "Patient68" "Patient69" "Patient70" "Patient71" "Patient72" + [73] "Patient73" "Patient74" "Patient75" "Patient76" "Patient77" "Patient78" + [79] "Patient79" "Patient80" "Patient81" "Patient82" "Patient83" "Patient84" + [85] "Patient85" "Patient86" "Patient87" "Patient88" "Patient89" "Patient90" + [91] "Patient91" "Patient92" "Patient93" "Patient94" "Patient95" "Patient96" + [97] "Patient97" "Patient98" "Patient99" "Patient100" "Patient101" "Patient102" +[103] "Patient103" "Patient104" "Patient105" "Patient106" "Patient107" "Patient108" +[109] "Patient109" "Patient110" "Patient111" "Patient112" "Patient113" "Patient114" +[115] "Patient115" "Patient116" "Patient117" "Patient118" "Patient119" "Patient120" +[121] "Patient121" "Patient122" "Patient123" "Patient124" "Patient125" "Patient126" +[127] "Patient127" "Patient128" "Patient129" "Patient130" "Patient131" "Patient132" +[133] "Patient133" "Patient134" "Patient135" "Patient136" "Patient137" "Patient138" +[139] "Patient139" "Patient140" "Patient141" "Patient142" "Patient143" "Patient144" +[145] "Patient145" "Patient146" "Patient147" "Patient148" "Patient149" "Patient150" +[151] "Patient151" "Patient152" "Patient153" "Patient154" "Patient155" "Patient156" +[157] "Patient157" "Patient158" "Patient159" "Patient160" "Patient161" "Patient162" +[163] "Patient163" "Patient164" "Patient165" "Patient166" "Patient167" "Patient168" +[169] "Patient169" "Patient170" "Patient171" "Patient172" "Patient173" "Patient174" +[175] "Patient175" "Patient176" "Patient177" "Patient178" "Patient179" "Patient180" +[181] "Patient181" "Patient182" "Patient183" "Patient184" "Patient185" "Patient186" +[187] "Patient187" "Patient188" "Patient189" "Patient190" "Patient191" "Patient192" +[193] "Patient193" "Patient194" "Patient195" "Patient196" "Patient197" "Patient198" +[199] "Patient199" "Patient200" +``` + +To understand why all those parameters are needed, it is essential to +understand how the validationData is used for the simulation of the gene expression. + +## Simulation +With the validationData the gene expression matrix is simulated. +For each gene (each entry of the validationData) the parameters in the validationData are used for +simulating the gene expression. +How many columns the gene expression matrix will have depends on the number of +patients. Per patient one gene expression is simulated. +If a negative value was simulated, it is changed to be 0 in the simulation process, +as normally no negative gene expressions can be observed. +How the gene expression is simulated depends on the modus. + +The "modus" is the number of occurring distributions within one gene. + +###Modus "1" - Unimodal gaussian distribution +Gene expression for the unimodal gaussian distribution (modus "1") is +simulated from the mean and the standard deviation taken from the +validation data for this gene. The Gaussian distribution is calculated +with [rnorm]. The number of values that are simulated for each distribution +equals the number of Patients {"nPatients"}. + +All other modi consist of two different scenarios: +In the "gauss" scenario all occurring distributions are Gaussian distributions +and calculated with [rnorm]. +In the "gamma" scenario the first occuring distribution is a Gamma distribution +and is calculated with [rgamma]. +All other distributions are gaussian distributions and are calculated with [rnorm]. + +###Modus "2" or higher - Bimodal distributions or higher modalities + +Gene expressions of the multimodal genes are simulated automatically for each +distribution. + +####Scenario "gauss" +The different gaussian distributions are simulated with the corresponding mean +and a standard deviation and number of values taken from the validation data +for this gene. + +####Scenario "gamma" +The gamma distribution is simulated with the gamma shape and rate values from +the params object. The other gaussian distributions are simulated with the values +from the validation data. + +###Exemplary Gene Expression Matrix +After using the `simulateExpression()` command, the gene expression matrix looks like +this: +```{r expression-sample, eval=FALSE} + Patient0001 Patient0002 Patient0003 Patient0004 Patient0005 Patient0006 Patient0007 +Gene0001 3.9674492 2.80396473 3.78980664 4.095237721 4.00587345 3.60867245 4.11567495 +Gene0002 4.1045561 2.26303081 3.75889335 3.522737760 3.02592372 4.57802545 3.12049260 +Gene0003 2.4582632 2.22295497 3.17911283 2.947560965 2.74938887 2.13212747 2.37177796 +Gene0004 5.9032577 5.95497476 4.75760279 5.161985499 3.70910216 4.11950180 3.58240309 +Gene0005 3.7431061 3.68041039 3.62509463 3.740929320 3.66194851 3.64731856 3.69041368 +Gene0006 3.0784338 1.79963109 2.16929818 1.160848158 3.49503635 2.82339493 3.28019391 +Gene0007 0.7993267 2.21868266 2.62367680 0.152856110 1.58145211 2.08062664 2.38610452 +Gene0008 2.0018416 2.22588333 2.90464907 3.049822819 2.28450055 3.04354666 3.61796463 +Gene0009 2.2986108 2.08720943 2.02138626 2.407369792 2.00220259 2.20031061 2.13336985 +Gene0010 2.1793609 2.85387502 2.23943177 2.423610586 2.35072765 2.31400934 2.58579871 + +``` + +## Executing the simulation +As the `Params`object can be generated before starting the +simulation, the `simulateExpression()` command can be used in two different ways: + 1. with a created params object (recommended) + 2. without a created params object (not recommended) + +The validationData is automatically generated when using the `simulateExpression()` command. +The `simulateExpression()` command returns a list object, which contains the created +validationData and the simulated expressionData. + +##Simulating the gene expression + +### 1. With a created params object(recommended) +It is recommended to create a `Params` object before using the `simulateExpression()` +command, because then you can change the parameters and have the params object +saved in your global environment. +```{r simulateExpression-with-params} +#with messages printed to console +params <- newParams() +simulation <- simulateExpression(params = params) + +#without messages printed to console +simulation <- simulateExpression(params = params,verbose = FALSE) + +#storing the validation data and the simulated gene expression data as +#separate data.frames + +validationData <- simulation$validationData +expression <- simulation$expressionData +``` + +### 2. Without a created params object (not recommended) +If the simulation should be executed with default parameters only (or with +only certain parameters changed) and you do not mind, having no separate +`Params`object in your global environment to be able to look up the different +parameters (especially in the case that you changed them), you can use this +commands, though it is not recommended, as it is useful to have a `Params` +object to look up the parameters behind the validationData. +In this case, without a created `Params`object the validationData is not saved as an +Rdata object, so there is no way of keeping track of changes to your params object. +```{r simulateExpression-without-params} +#with default parameters and messages printed to console +params <- newParams() +simulation <- simulateExpression(params = newParams()) + +#with one changed parameter and messages not printed to console +simulation <- simulateExpression(params = newParams("seed"=23),verbose = FALSE) + +#with some changed parameters and messages printed to console +simulation <- simulateExpression(params = newParams("seed"=23,"nPatients"=200)) + + +#storing the validation data and the simulated gene expression data as +#a list and a data.frame + +validationData <- simulation$validationData +expression <- simulation$expressionData + +``` + +# The unified output data format +The output data format is a unified data format, that is needed to work with +and use all of the evaluation functions. The output of all implemented +algorithms matches the unified data format. +The unified data format has the following structure: + +The data format is structured in three parts: + +* the Genes section, +* the Clinical Data section and +* expression matrix section + + +The different parts are accessible with: +```{r accessing-the-different-sections, eval=FALSE} +mclustOutput$Genes[1:10] #mclustOutput$Genes for all genes +mclustOutput$ClinicalData +mclustOutput$Expressionmatrix + + +``` + +The Genes section has many parts. For each gene a separate section is generated. +Each gene section contains the following informations, which were calculated +by using one of the algorithms: + +* $modus - the modus is the number that equals the found number of occurring distributions +within one gene (the modality) +* $means - the means section contains the calculated mean values for each modus +* $sds - the sds section contains the calculated standard deviation values for each modus +* $sizes - the sizes section contains the calculated size of each group +* $groups - the groups section contains the patients that are assigned to the different groups + +The Genes can be accessed by using: +```{r accessing-a-specific-gene-section, eval=FALSE} +mclustOutput$Genes$Gene0001 + +#Accessing a specific section within the genes is possible by using the $ tags + +mclustOutput$Genes$Gene0001$modus +mclustOutput$Genes$Gene0001$means +mclustOutput$Genes$Gene0001$sds +mclustOutput$Genes$Gene0001$sizes +mclustOutput$Genes$Gene0001$groups +``` + +If this package is used with an algorithm which was not implemented in this package, +the output has to be changed to match this unified data format. +Then, all the evaluation functions will work with the output of not implemented algorithms. + +# Usage of the algorithms +In this package three algorithms that can be used for detecting multimodality, +are implemented. + +## mclust +Mclust uses a finite Gaussian mixture modeling fitted via EM algorithm for +model-based clustering, classification, and density estimation, including +Bayesian regularization and dimension reduction. +For more information look at the vignette of mclust "A quick tour of mclust" +[mclust] + +### mclust References +C. Fraley, A. E. Raftery, T. B. Murphy and L. Scrucca (2012). +mclust Version 4 for R: Normal Mixture Modeling for Model-Based Clustering, +Classification, and Density Estimation. Technical Report No. 597, Department +of Statistics, University of Washington. + +C. Fraley and A. E. Raftery (2002). Model-based clustering, discriminant +analysis, and density estimation. Journal of the American Statistical +Association 97:611:631. + +## HDBSCAN +This is a fast reimplementation of the HDBSCAN (Hierarchical Density-based +spatial clustering of applications with noise) clustering algorithm using a +kd-tree and its related algorithms using Rcpp. +HDBSCAN computes the hierarchical cluster tree representing density estimates +along with the stability-based flat cluster extraction proposed by Campello et +al. (2013). HDBSCAN essentially computes the hierarchy of all DBSCAN* +clusterings, and then uses a stability-based extraction method to find optimal +cuts in the hierarchy, thus producing a flat solution. +For more information look at the vignette of HDBSCAN[hdbscan] or use +```{r dbscan-information} +library(dbscan) +?hdbscan +``` + +### HDBSCAN References +Martin Ester, Hans-Peter Kriegel, Joerg Sander, Xiaowei Xu (1996). +A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases +with Noise. Institute for Computer Science, University of Munich. +Proceedings of 2nd International Conference on Knowledge Discovery and Data +Mining (KDD-96). + +Campello, R. J. G. B.; Moulavi, D.; Sander, J. (2013). +Density-Based Clustering Based on Hierarchical Density Estimates. +Proceedings of the 17th Pacific-Asia Conference on Knowledge Discovery in +Databases, PAKDD 2013, Lecture Notes in Computer Science 7819, p. 160. + +Campello, Ricardo JGB, et al. "Hierarchical density estimates for data +clustering, visualization, and outlier detection." ACM Transactions on +Knowledge Discovery from Data (TKDD) 10.1 (2015): 5. + +## flexmix +FlexMix implements a general framework for finite mixtures of regression +models. Parameter estimation is performed using the EM algorithm: the E-step +is implemented by flexmix, while the user can specify the M-step. +For more information look at the vignette of flexmix "flexmix-intro"[flexmix] + +### flexmix References +Friedrich Leisch. FlexMix: A general framework for finite mixture models and +latent class regression in R. Journal of Statistical Software, 11(8), 2004. +doi:10.18637/jss.v011.i08 + +Bettina Gruen and Friedrich Leisch. Fitting finite mixtures of generalized +linear regressions in R. Computational Statistics & Data Analysis, 51(11), +5247-5252, 2007. doi:10.1016/j.csda.2006.08.014 + +Bettina Gruen and Friedrich Leisch. FlexMix Version 2: Finite mixtures with +concomitant variables and varying and constant parameters Journal of +Statistical Software, 28(4), 1-35, 2008. doi:10.18637/jss.v028.i04 + +## Using the different algorithms +To use the different algorithms, it is only needed to have created a simulated +expression data frame (which can be done with the `simulateExpression()` command). +Of course, it is also possible to use the different algorithms with a data-set +that was created elsewhere, if it has the same structure used in this package. +To use this package for detecting bimodality in your data set, we recommend +using the **not clear yet** command, because our tests with a stratified +data set (included as the test-data set (**not yet**)) have shown that this +algorithm is the most accurate. +The output of all implemented algorithms was unified and overall shows the +same structure. +In the following it is shown, how to use the different implemented algorithms +and how the output should roughly look like. + +###Using mclust +To use the mclust algorithm on your expression data frame (simulated or not) +and gain information which genes are bimodal use the useMclust() command: +```{r useMclust} +#use mclust with the expression data frame expression and messages printed to the console +mclustOutput <- useMclust(expression = expression) + +#use mclust with the expression data frame expression and messages not printed to the console +mclustOutput <- useMclust(expression = expression,verbose = FALSE) + +``` + +###Using HDBSCAN +To use the HDBSCAN algorithm on your expression data frame (simulated or not) +and gain information which genes are bimodal use the useHdbscan() command. +Using HDBSCAN also needs the component `minPts`, which not only acts as a +minimum cluster size to detect, but also as a "smoothing" factor of the +density estimates implicitly computed from HDBSCAN: +```{r useHdbscan} +#use HDBSCAN with the expression data frame expression +hdbscanOutput <- useHdbscan(expression = expression,minPts = 10) + +``` + +###Using FlexMix: +To use the FlexMix algorithm on your expression data frame (simulated or not) +and gain information which genes are bimodal use the useFlexmix() command: +```{r useFlexmix} +#use FlexMix with the expression data frame expression +flexmixOutput <- useFlexmix(expression = expression,maxModality = 2) + +``` + +# Evaluating the algorithms output +After using one or more of the implemented algorithms on the gene expression +matrix, the packages function for evaluating which genes are bimodal can be +used. All outputs can be used with the same evaluation functions, but when +using the `evaluateAlgorithmOutput()` command, a type component will be needed. +When using the recommended algorithm, the component is not needed, as it is +the default value. +```{r evaluateAlgorithmOutput} +#evaluating for bimodal genes after using useMclust() +mclustEvaluation <- evaluateAlgorithmOutput(modality= 2,algorithmOutput = mclustOutput,validationData = validationData, maxDifference = 10) + +#evaluating for bimodal genes after using useHdbscan() +hdbscanEvaluation <- evaluateAlgorithmOutput(modality= 2,algorithmOutput = hdbscanOutput,validationData = validationData, maxDifference = 10) + +#evaluating for bimodal genes after using useFlexmix() +flexmixEvaluation <- evaluateAlgorithmOutput(modality= 2,algorithmOutput = flexmixOutput,validationData = validationData, maxDifference = 10) + +#the evaluation output looks like this: +head(mclustEvaluation) +``` + +## Statistics and classifications +After using the algorithms and using the `evaluateAlgorithmOutput` command, all +requirements for creating statistics and classifications were met. + +### Statistics +The `getStatistics()` function calculates the percentage of values that were +correctly (*TRUE*) and not correctly (*FALSE*) estimated by one or more of the +algorithms. To get this statistic, execute the following code: +```{r getStatistic()} +#getStatistic of one evaluation +getStatistics(evaluations = list("mclust"=mclustEvaluation)) + +#getStatistic of two or more evaluations +getStatistics(evaluations = list("mclust"=mclustEvaluation,"HDBSCAN"=hdbscanEvaluation)) + +``` + + +### Classifications +To get the classification of correctly and not correctly estimated scenarios, +the `getClassifications()` function can be used. + +#### Reading the output + * FN (FALSE Negatives) - validationData: modality, estimated scenario: not bimodal + (unimodal or more than bimodal) + * FP (FALSE Positives) - validationData: unimodal, estimated scenario: bimodal + * TN (TRUE Negatives) - validationData: unimodal, estimated scenario: unimodal + * TP (TRUE Positives) - validationData: bimodal, estimated scenario: bimodal + +#### Using the `getClassifications()` command +```{r getClassifications()} +#get the classification of one algorithmOutput +getClassifications(modality = 2,validationData = validationData,outputs = list("mclust"=mclustOutput)) + +#get the classification of two or more algorithms +getClassifications(modality = 2,validationData = validationData, +outputs = list("mclust"=mclustOutput,"HDBSCAN"=hdbscanOutput)) + +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Session information {-} + +```{r sessionInfo} +sessionInfo() +``` + + + + +[rnorm]: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Normal.html +[rgamma]: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/GammaDist.html +[mclust]: http://127.0.0.1:40225/help/library/mclust/doc/mclust.html +[hdbscan]: https://cran.r-project.org/web/packages/dbscan/vignettes/hdbscan.html +[flexmix]: https://cran.r-project.org/web/packages/flexmix/vignettes/flexmix-intro.pdf +[LaplacesDemon]: https://www.rdocumentation.org/packages/LaplacesDemon/versions/16.0.1/topics/dist.Inverse.Gamma + + + + + +