---
title: "MSstatsQC: longitudinal system suitability monitoring and quality control for proteomic experiments"
author: 
  - "Eralp DOGU <eralp.dogu@gmail.com>" 
  - "Sara TAHERI <srtaheri66@gmail.com>" 
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{MSstatsQC}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

# Introduction 

Targeted liquid chromatography coupled with mass spectrometry (LC-MS) is a powerful tool for detection and quantification of peptides in complex matrices. An important objective of targeted LC-MS is to obtain peptide quantifications that are (1) suitable for the purpose of the investigation, and (2) reproducible across laboratories and runs.  The first objective is achieved by system suitability tests (SST), which verify that mass spectrometric instrumentation performs as specified. The second objective is achieved by quality control (QC), which provides in-process quality assurance of the sample profile. A common aspect of SST and QC is the longitudinal nature of their data. Although SST and QC receive a lot of attention in the proteomic community, the currently used statistical methods are fairly limited. 
`MSstatsQC` improves upon the existing statistical methodology for SST and QC. It translates the modern methods of longitudinal statistical process control, such as simultaneous and time weighted control charts and change point analysis to the context of LC-MS experiments The methods are implemented in an open-source R-based software package and its web-based graphical user interface (www.msstats.org/msstatsqc), and are available for use stand-alone, or for integration with automated pipelines. Example dataset was generated during CPTAC Study 9.1 at Site 54. Although the example focus on targeted proteomics, the statistical methods more generally apply.

This vignette summarizes various aspects of all functionalities in `MSstatsQC` package and Shiny interface. 

# Installation
To install this package, start R and enter:
```{r,eval=TRUE}
source("https://bioconductor.org/biocLite.R")
biocLite("MSstatsQC")
```
Shiny users can access MSstatsQC via https://eralpdogu.shinyapps.io/msstatsqc/. 

# Input

In order to analyze QC/SST data in `MSstatsQC`, input data must be a .csv file in a "long" format with related columns. This is a common data format that can be generated from spectral processing tools such as Skyline.

This file can be also uploaded through Shiny interface. If the user prefers the web-interface then `Upload file` option should be used and a csv file which includes QC metrics and peptide level data should be uploaded. The recommended format includes `Acquired Time`, `Peptide name`, `Annotations` and data for any QC metrics such as `Retention Time`, `Total Peak Area` and `Mass Accuracy` etc. 

(a) `AcquiredTime`: This column shows the acquired time of the QC/SST sample in the format of MM/DD/YYYY HH:MM:SS AM/PM

(b) `Precursor`: This column shows information about Precursor id. Statistical analysis will be done separately for each unique label in this column. 

(c) `Annotations`: Annotations are free-text information given by the analyst about each run. They can be informative explanations of any special cause or any observations related to a particular run. Annotations are carried in the plots provided by `MSstatsQC` interactively.  

(d)-(f) `RetentionTime`, `TotalPeakArea`, `FWHM`, `MassAccuracy`, and `PeakAssymetry`, and other metrics: These columns define a *feature* of a peak for a specific peptide. 

The example dataset is shown below. Each row corresponds to a single time point. Additionally, other inputs such as predefined limits or guide sets are discussed in further steps.

### Example

```{r, eval=TRUE}
#A typical multi peptide and multi metric system suitability dataset
#This dataset was generated during CPTAC Study 9.1 at Site 54
library(MSstatsQC)
data <- MSstatsQC::S9Site54
```

### Tip for Shiny users: 

"Data import" tab is used to upload data.  User can also run with sample data and clear the outputs with the related buttons.

* `Run with sample data` : Click to run MSstatsQC with sample data from CPTAC Study 9.1.
* `Clear data and plots` : Click to clear all data and plots.

<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/1.input_example.png" width="500">

# `MSnbaseToMSstatsQC` functions

`MSnbaseToMSstatsQC` function converts `MSnbase` output to `MSstatQC` format using `QCmetrics` objects. 

### Arguments

* `msfile`: Mass spectrometry raw file that contains quality control measurements. 

### Example

```{r, eval=FALSE}
MSnbaseToMSstatsQC(msfile)
```

# Data processing

Data is checked with `DataProcess()` function to ensure data sanity and efficiently use core and summary `MSstatsQC` funtions. `MSstatsQC` uses a data validation method where slight variations in column names are compansated and converted to the standard `MSstatsQC` format. For example, our data validation function converts column names like `Best.RT`, `best retention time`, `retention time`, `rt` and `best ret` into `BestRetentionTime`. This conversion also deals with case-sensitive typing. 

### Arguments

* `data` : comma-separated (.csv), metric file. It should contain a "Precursor" column and the metrics columns. It should also include "Annotations" for each observation.

### Example

```{r, eval=TRUE}
data<-DataProcess(data)
```

### Tip for Shiny users: 

"Data import" tab automatically checks data and validate it for further use. 

# `MSstatsQC` core functions: control charts

The fuction `XmRChart()` is used to generate individual (X) and moving range (mR), and the function `CUSUMChart()` is used to construct cumulative sum for mean (CUSUMm) and cumulative sum for variability (CUSUMv) control charts for each metric. As a follow up change point estimation procedure `ChangePointEstimator` can be used. 

Metrics (e.g. retention time and peak area) and peptides are chosen within all core functions with 'metric' and 'peptide' arguments. `MSstatsQC` can handle any metrics of interest. User needs to create data columns just after `Annotations` to import metrics into `MSstatsQC` successfully. 

Predefined limits are commonly used in system sutiability monitoring and quality control studies. If the mean and variability of a metric is well known, they can be defined using 'selectMean' and 'selectSD' arguments in core plot functions (e.g. XmRplots function). For example, if mean of retention time is 28.5 minutes, standard deviation is 1 minutes and X chart is used for peptide LVNELTEFAK, we use XmRplot function as follows.

The true values of mean and variability of a metric is typically unknown, and their estimates are obtained from a guide set of high quality runs. Generally, a data gathering and parameter estimation step is required. Within that phase, control limits are obtained to test the hypothesis of statistical control. These thresholds are selected to ensure a specified type I error probability (e.g. 0.0027). Constructing control charts and real time evaluation are considered after achieving this phase. Guide sets are defined with 'L' and 'U' arguments. For example, if retention time of a peptide is monitored and first 20 observations of the dataset are used as a guide set, a plot is constructed as follows. 

# `MSstatsQC` core functions: `XmRChart()`

### Arguments

* `data`: comma-separated (.csv), metric file. It should contain a "Precursor" column and the metrics columns. It should also include "Annotations" for each observation.
* `peptide`: the name of precursor of interest.
* `L`: lower bound of the guide set.
* `U`: upper bound of the guide set.
* `metric`: the name of metric of interest.
* `normalization`: TRUE if data is standardized.
* `ytitle`: the y-axis title of the plot. The x-axis title is by default "Time : name of peptide"
* `type`: the type of the control chart. Two values can be assigned, "mean" or "dispersion". Default is "mean"
* `selectMean`: the mean of a metric. It is used when mean is known. It is NULL when mean is not known.  The default is NULL.
* `selectSD`: the standard deviation of a metric. It is used when standard deviation is known. It is NULL when mean is not known. The default is NULL.

### Example

```{r, eval=TRUE}
#An X chart when a guide set (1-20 runs) is used to monitor the mean of retention time
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = FALSE, ytitle = "X Chart : retention time", type = "mean", selectMean = NULL ,selectSD = NULL )
#An X chart when a guide set (1-20 runs) is used to monitor the mean of total peak area
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = FALSE, ytitle = "X Chart : peak area", type = "mean", selectMean = NULL ,selectSD = NULL )
#An X chart when a guide set (1-20 runs) is used to monitor the variability of retention time
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = FALSE, ytitle = "mR Chart : retention time", type = "variability", selectMean = NULL ,selectSD = NULL )
#An X chart when a guide set (1-20 runs) is used to monitor the variability of total peak area
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = FALSE, ytitle = "mR Chart : peak area", type = "variability", selectMean = NULL, selectSD = NULL )
#An X chart when a guide set (1-20 runs) is used to monitor the mean of retention time
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = FALSE, ytitle = "X Chart : retention time", type = "mean", selectMean = NULL, selectSD = NULL )
#An X chart when a guide set (1-20 runs) is used to monitor the mean of total peak area
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = FALSE, ytitle = "X Chart : peak area", type = "mean", selectMean = NULL, selectSD = NULL )
#An X chart when a guide set (1-20 runs) is used to monitor the variability of retention time
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = FALSE, ytitle = "mR Chart : retention time", type = "variability", selectMean = NULL, selectSD = NULL )
#An X chart when a guide set (1-20 runs) is used to monitor the variability of total peak area
XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = FALSE, ytitle = "mR Chart : peak area", type = "variability", selectMean = NULL, selectSD = NULL )
#Mean and standard deviation of LVNELTEFAK is known
XmRChart( data, "LVNELTEFAK", metric = "BestRetentionTime", selectMean = 28.5, selectSD = 1 )
```

# `MSstatsQC` core functions: `CUSUMChart()`

### Arguments

* `data`: comma-separated (.csv), metric file. It should contain a "Precursor" column and the metrics columns. It should also include "Annotations" for each observation.
* `peptide`: the name of precursor of interest.
* `L`: lower bound of the guide set.
* `U`: upper bound of the guide set.
* `metric`: the name of metric of interest.
* `normalization`: TRUE if data is standardized.
* `ytitle`: the y-axis title of the plot. The x-axis title is by default "Time : name of peptide"
* `type`: the type of the control chart. Two values can be assigned, "mean" or "dispersion". Default is "mean"
* `referenceValue`: the value that is used to tune the control chart for a proper shift size. Recommended setting is 0.5 for standardized data.
* `decisionInterval`: the threshold to detect an out-of-control observation. Recommended setting is 5 for standardized data. 
* `selectMean`: the mean of a metric. It is used when mean is known. It is NULL when mean is not known.  The default is NULL.
* `selectSD`: the standard deviation of a metric. It is used when standard deviation is known. It is NULL when mean is not known. The default is NULL.

### Example

```{r, eval=TRUE, echo =FALSE, fig.height=3}
#A CUSUMm chart when a guide set (1-20 runs) is used to monitor the mean of retention time
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = TRUE, ytitle = "CUSUMm Chart : retention time", type = "mean", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL )
#A CUSUMm chart when a guide set (1-20 runs) is used to monitor the mean of total peak area
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = TRUE, ytitle = "CUSUMm Chart : peak area", type = "mean", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL  )
#A CUSUMv chart when a guide set (1-20 runs) is used to monitor the variability of retention time
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = TRUE, ytitle = "CUSUMv Chart : retention time", type = "variability", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL )
#A CUSUMv chart when a guide set (1-20 runs) is used to monitor the variability of total peak area
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = TRUE, ytitle = "CUSUMv Chart : peak area", type = "variability", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL )
#A CUSUMm chart when a guide set (1-20 runs) is used to monitor the mean of retention time
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = TRUE, ytitle = "CUSUMm Chart : retention time", type = "mean", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL  )
#A CUSUMm chart when a guide set (1-20 runs) is used to monitor the mean of total peak area
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = TRUE, ytitle = "CUSUMm Chart : peak area", type = "mean", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL  )
#A CUSUMv chart when a guide set (1-20 runs) is used to monitor the variability of retention time
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = TRUE, ytitle = "mR Chart : retention time", type = "variability", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL )
#A CUSUMv chart when a guide set (1-20 runs) is used to monitor the variability of total peak area
CUSUMChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "TotalArea", normalization = TRUE, ytitle = "CUSUMv Chart : peak area", type = "variability", referenceValue = 0.5, decisionInterval = 5, selectMean = NULL ,selectSD = NULL )
```

### Tip for Shiny users: 

"Options" tab is used to set metrics and peptides of interest. Guide set and known mean and standard deviation are also set within "Options" tab.Select a proper and representative guide set using `Options` tab. The lower bound of guide set indicates the index of the first time point to be included in the guide set. For example, if you choose "1" as a lower bound, it means that first time point will be the first element of the guide set. Similarly, upper bound of guide set shows the index for the last observation. It is possible to use different guide sets for different metrics and peptides.   

<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/2.options_example.png" width="500">

### Tip for Shiny users:

"Control charts" tab is used to construct X and mR and CUSUMm and CUSUMv control charts.

<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/3.XmRChartTAA.png" width="500">

<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/4.CUSUMforTAA.png" width="500">

# `MSstatsQC` core functions: `ChangePointEstimator()`

Follow-up change point analysis is helpful to identify the time of a change for each peptide and metric. `ChangePointEstimator()` function is used for the analysis. This function is one of the core functions and uses the same arguments. We recommend using this function after control charts generate an out-of-control observation. For example, retention time of TAAYVNAIEK increases over time as CUSUMm statistics increases steadily after the 20th time point. User can follow-up with `ChangePointEstimator()` function to find the exact time of retention time drift.

### Arguments

* `data`: comma-separated (.csv), metric file. It should contain a "Precursor" column and the metrics columns. It should also include "Annotations" for each observation.
* `peptide`: the name of precursor of interest.
* `L`: lower bound of the guide set.
* `U`: upper bound of the guide set.
* `metric`: the name of metric of interest.
* `normalization`: TRUE if data is standardized.
* `ytitle`: the y-axis title of the plot. The x-axis title is by default "Time : name of peptide"
* `type`: the type of the control chart. Two values can be assigned, "mean" or "dispersion". Default is "mean"
* `selectMean`: the mean of a metric. It is used when mean is known. It is NULL when mean is not known.  The default is NULL.
* `selectSD`: the standard deviation of a metric. It is used when standard deviation is known. It is NULL when mean is not known. The default is NULL.

### Example

```{r, eval=FALSE}
# Retention time >> first 20 observations are used as a guide set
XmRChart(data, "TAAYVNAIEK", metric = "BestRetentionTime", type="mean", L = 1, U = 20)
ChangePointEstimator(data, "TAAYVNAIEK", metric = "BestRetentionTime", type="mean", L = 1, U = 20)
```

We don't recommend using this function when all the observations are within control limits. In the case of retention time monitoring of LVNELTEFAK, there is no need to further analyse change point.

The time of a variability change can be analyzed with the same fucntion. For example, retention time of YSTDVSVDEVK experiences a drift in the mean of retention time and variability of retention time increases simultaneously. In this case, `ChangePointEstimator()` can be used to identify exact times of both changes.

### Example

```{r, eval=TRUE}
# Retention time >> first 20 observations are used as a guide set
XmRChart(data, "YSTDVSVDEVK", metric = "BestRetentionTime", type="mean", L = 1, U = 20)
ChangePointEstimator(data, "YSTDVSVDEVK", metric = "BestRetentionTime", type="variability", L = 1, U = 20)
```

### Tip for Shiny users:

<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/5.CPforTAA.png" width="500">

# `MSstatsQC` summary functions: river and radar plots

`RiverPlot()` and `RadarPlot()` functions are the summary functions used in `MSstatsQC`. They are used to aggregate results over all analytes for X and mR charts or CUSUMm and CUSUMv charts. `method` argument is used to define the method where the results for multiple peptides are aggregated. For example, if user would like to aggregate information gathered from the X charts of retention time for all analytes, upper panel of `RiverPlot()` show for the increases and decreases in retention time. Next, `RadarPlot()` are used to find out which peptides are affected by the problem. 

If the mean and standard deviation is known, summary functions uses `listMean` and `listSD` arguments. For example, if user monitors retention time and peak assymetry and mean and standard deviations of these metrics are known, arguments will require entering a vector for means and another vector for standard deviations. 

### Example

```{r, eval=TRUE}
# Retention time >> first 20 observations are used as a guide set
RiverPlot(data = S9Site54, L = 1, U = 20, method = "XmR")
RiverPlot(data = S9Site54, L = 1, U = 20, method = "CUSUM")
RadarPlot(data = S9Site54, L = 1, U = 20, method = "XmR")
RadarPlot(data = S9Site54, L = 1, U = 20, method = "CUSUM")
```

### Tip for Shiny users:

Summary plots are available in the `Metric summary` tab under `Detailed performance: plot summaries`.

<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/6.RiverRadar.png" width="500">

# `MSstatsQC` summary functions: decision map

`DecisionMap()` functions another summary function used in `MSstatsQC`. It is used to compare aggregated results over all analytes for a certain method such as XmR charts with the user defined criteria. Firstly, user defines the performance criteria and run `DecisionMap()` function to visualize overall performance. This function uses all the arguments of summary plots listed previously. Additionally, the following arguments are used

### Arguments

* `method`: the name of the method prefered. It is either "CUSUM" or "XmR"` interest.
* `peptideThresholdRed`: a threshold that marks percentage of out-of-control peptides. if the percentage is above this threshold, the color is red meaning fail. Default is 0.7.
* `peptideThresholdYellow`: a threshold that marks percentage of out-of-control peptides. if the percentage within this threshold and `peptideThresholdRed`, the color is yellow meaning warning. Default is 0.5.

### Example

```{r, eval=TRUE}
# A decision map for Site 54 can be generated using the following script
# Retention time >> first 20 observations are used as a guide set
DecisionMap(data,method="XmR",peptideThresholdRed = 0.25,peptideThresholdYellow = 0.10,
                         L = 1, U = 20,type = "mean",title = "Decision map",listMean = NULL,listSD = NULL)
```

### Tip for Shiny users:

Input for decision map can be selected using `Create decision rules` tab. After selection of thresholds decision maps are automatically created and  available in the `Metric summary` tab under `Detailed performance: plot summaries`.

<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/7.DecisionInput.png" width="500">
<img src="https://github.com/eralpdogu/MSstatsQC/blob/master/vignettes/8.Decisionmaps.png" width="500">


# Output

Plots created by the core plot functions are generate by `plotly` which is an R package for interactive plot generation. These interactive plots created by `MSstatsQC`, can be saved as an html file using the save widget function. If the user wants to save a static png file, then `export` function can be used. The outputs of other MSstatsQC functions are generated by `ggplot2` package and saving those outputs would require using `ggsave` function.

### Example

```{r, eval=FALSE}
#Saving plots generated by plotly
p<-XmRChart( data, peptide = "TAAYVNAIEK", L = 1, U = 20, metric = "BestRetentionTime", normalization = FALSE,
                      ytitle = "X Chart : retention time", type = "mean", selectMean = NULL, selectSD = NULL )
htmlwidgets::saveWidget(p, "Aplot.html")
export(p, file = "Aplot.png")

#Saving plots generated by ggplot2
p<-RiverPlot(data, L=1, U=20)
ggsave(filename="Summary.pdf", plot=p)
#or
ggsave(filename="Summary.png", plot=p)
```

### Tip for Shiny users: 

Each output generated by 'plotly' can be saved using the "plotly" toolset located in the corner of each plot.



