---
title: "selectKSigs: a package for selecting the number of mutational signatures"
author: 
- name: Zhi Yang
  affiliation: Department of Preventive Medicine, 
    University of Southern California, Los Angeles, USA 
  email: zyang895@gmail.com
date: "`r Sys.Date()`"
vignette: |
  %\VignetteIndexEntry{An introduction to HiLDA}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
output:
  BiocStyle::html_document:
    toc_float: true
  BiocStyle::pdf_document: default
abstract: | 
  Instructions on using _selectKSigs_ on selecting the number of mutational 
  signatures using a perplexity-based measure and cross-validation

---

```{r style, echo = FALSE, results = 'asis'}
library(BiocStyle)
```

# Introduction

The R package **HiLDA** is developed under the Bayesian framework to select the 
number of mutational signatures based on perplexity and cross-validation. The 
mutation signature is defined based on the independent model proposed by 
Shiraishi's et al. 

## Paper

- Shiraishi et al. A simple model-based approach to inferring and visualizing 
cancer mutation signatures, bioRxiv, doi: 
[http://dx.doi.org/10.1101/019901](http://dx.doi.org/10.1101/019901).

- **Zhi Yang**, Paul Marjoram, Kimberly D. Siegmund. Selecting the number of 
mutational signatures using a perplexity-based measure and cross-validation.

# Installing and loading the package {#installation}

## Installation

### Bioconductor

**selectKSigs** requires several CRAN and Bioconductor R packages to be
installed. Dependencies are usually handled automatically, when installing the
package using the following commands:

```
install.packages("BiocManager")
BiocManager::install("selectKSigs")
```

[NOTE: Ignore the first line if you already have installed the
`r CRANpkg("BiocManager")`.]

You can also download the newest version from the GitHub using *devtools*:

```
devtools::install_github("USCbiostats/selectKSigs")
```

# Input data

`selectKSigs` is a package built on some basic functions from `pmsignature` 
including how to read the input data. Here is an example from `pmsignature` on 
the input data, *mutation features* are elements used for categorizing mutations 
such as: 
  
* 6 substitutions (C>A, C>G, C>T, T>A, T>C and T>G)
* 2 flanking bases (A, C, G and T)
* transcription direction.

## Mutation Position Format

    sample1 chr1  100	A	C	
    sample1	chr1	200	A	T	
    sample1	chr2	100	G	T	
    sample2	chr1	300	T	C	
    sample3	chr3	400	T	C	
  
* The 1st column shows the name of samples 
* The 2nd column shows the name of chromosome 
* The 3rd column shows the coordinate in the chromosome
* The 4th column shows the reference base (A, C, G, or T).
* The 5th colum shows the alternate base (A, C, G, or T).


# Workflow 
## Get input data
Here, *inputFile* is the path for the input file. *numBases* is the number of 
flanking bases to consider including the central base (if you want to consider 
two 5' and 3' bases, then set 5). Also, you can add transcription direction 
information using *trDir*. *numSig* sets the number of mutation signatures 
estimated from the input data. You will see a warning message on some mutations
are being removed. 

```{r}
library(HiLDA)
library(tidyr)
library(ggplot2)
library(dplyr)
inputFile <- system.file("extdata/esophageal.mp.txt.gz", package="HiLDA")
G <- hildaReadMPFile(inputFile, numBases=5, trDir=TRUE)
```

Also, we also provided a small simulated dataset which contains 10 mutational 
catalogs and used it for demonstrating the key functions in selectKSigs. We start 
with loading the sample dataset G stored as extdata/sample.rdata.
```{r}
library(selectKSigs)
load(system.file("extdata/sample.rdata", package = "selectKSigs"))
```


### Perform the selecting process
After we read in the sample data G, we can run the process from selectKSigs. 
Here, we specify the *inputG* as *G*, the number of cross-validation folds, 
*kfold* to be 3, the number of replications, *nRep*, to be 3, and the upper 
limit of the K values for exploration to be 7. 
```{r include=FALSE}
set.seed(5)
results <- cv_PMSignature(G, Kfold = 3, nRep = 3, Klimit = 7)
print(results)
```

### Visualizing the results
After we obtained the results, we can plot each measure by the range of K values
that were refitted during the calculation. The optimal value of K is achieved at 
its minimum value highlighted in grey. 

```{r}
results$Kvalue <- seq_len(nrow(results)) + 1
results_df <- gather(results, Method, value, -Kvalue) %>% 
  group_by(Method) %>%
  mutate(xmin = which.min(value) + 1 - 0.1,
         xmax = which.min(value) + 1 + 0.1)

ggplot(results_df) +
  geom_point(aes(x = Kvalue, y = value, color = Method), size = 2) +
  facet_wrap(~ Method, scales = "free") + 
  geom_rect(mapping = aes(xmin = xmin, xmax = xmax, 
                          ymin = -Inf, ymax = Inf),
            fill = 'grey', alpha = 0.05) +
  theme_bw()+
  xlab("Number of signatures")
```


## Session info
Here is the output of `sessionInfo()` for reproducibility in the future. 

```{r}
sessionInfo()
```



