Interactively explore quantitative concepts of high-content screening.
Access a running instance of the web-app here.
The app illustrates quantitative concepts of high-content screening, such as z-score, z-factor, z-prime, normalised percentage inhibition, standardized mean difference.
The app generates synthetic data for a desired plate format (e.g. 96, 384, 1536-well). The data includes measurement samples, and negative and positive controls. The user can change the number of control wells, their sample mean and standard deviation. Additionally, "hits" with the mean and standard deviation corresponding to the positive control can be added to the dataset.
Plates can also be given systematic spatial artifacts: row and column gradients, and an edge effect that shifts the outer frame of wells and decays inwards. These apply to every well, controls included, and the control wells themselves can be placed in the first columns, on the edge columns, or interleaved across the plate. Together they show why a single quality index is not enough: an artifact inflates the spread of the sample wells, so genuine hits stop clearing the z-score threshold and sensitivity falls away, and this can happen while Z-prime still reads as excellent, because Z-prime is a difference of two control means and cancels any bias the two controls share equally.
Data generation is reproducible: a given random seed and a given set of parameters always produce the same plate. Changing a parameter re-uses the same random noise, so that the resulting change in the quality indices is the effect of that parameter alone. The Resample button draws a new plate from unchanged parameters, which shows how much the indices vary between runs.
Synthetic data can be plotted as distributions, box-plots or heatmaps with raw or normalized data. Normalisations include the z-score and Normalised Percentage Inhibition.
Hits can be called on the raw measurement, on the z-score, or on the NPI, with the threshold slider re-ranged to suit the chosen quantity. Note that NPI runs opposite to the raw signal — an active well sits near 100 in an antagonist screen and near 0 in an agonist screen — so an NPI threshold selects the wells above it while the other two select the wells below.
Because the app knows which wells were spiked with the "hit" distribution, the wells called by the threshold can be scored against that ground truth. On the Hits heatmap the cell colour is the well called by the threshold, while a circle marks the wells that were really spiked: a circle on a called well is a true positive, a circle on an uncalled well a miss, and a called well without a circle a false positive. The same comparison is reported below the plate as a confusion matrix with the sensitivity, false positive rate and precision, which shows the trade-off involved in choosing a threshold. Only sample wells are counted; the controls are excluded.
The generated plate can be downloaded as a CSV file in long format, one row per well, with the well identifier and position, the well type, the ground truth of which wells were spiked, the raw measurement, both normalisations and the current hit call. The file name records the seed and resample count that produced the plate, so an export can always be regenerated in the app.
The app calculates the following plate quality indices:
- Increasing the Content of High-Content Screening: An Overview (2014); DOI: 10.1177/1087057114528537.
- Data Analysis Approaches in High Throughput Screening (2013); DOI: 10.5772/52508.
- Statistical practice in high-throughput screening data analysis (2006); DOI: 10.1038/nbt1186.
- A Simple Statistical Parameter for Use in Evaluation and Validation of High Throughput Screening Assays (1999); DOI: 10.1177/108705719900400206.
The app can be run either locally or on a server. The installation process is detailed below.
The app works on all major OS (Windows, macOS, standard Linux distributions) and requires a recent R installation. The R installation guide can be found on the official website.
The app depends on several packages which should be automatically installed when the app is launched for the first time. Alternatively, the complete list of dependencies can be manually installed from the R console by typing:
install.packages(
c(
"shiny", "shinydashboard", "shinyBS",
"data.table",
"ggplot2", "plotly",
"ggthemes", "RColorBrewer")) For new R users, once you have installed R, we recommend to use R from Rstudio. It provides an excellent programming interface and makes it slightly easier to run shiny apps with a single click! Instructions for installation can be found on the Rstudio website.
First, download the latest version of the app directly from the GitHub repository(green button Clone or download, download as zip). Unzip the folder and place it in your favorite location.
If you have installed RStudio, launch it and go to File -> Open Project. Navigate to the location where you placed the app and open the file screenQC.Rproj. This will load the app in the current Rstudio session. To start the app, open the server.R or the ui.R file in the Rstudio session, then click the Run App button with a green triangle in the upper right corner of the window with code open.
If you have R but did not (or do not want to) install Rstudio, you can also start the app directly from your OS's command line with:
R -e "shiny::runApp('path-to-application-folder')"
Then, open your web browser and point to the address given by the output of that command.
If you already have an R installation with all the packages you can also run the following lines in your R console to start immediatly with a temporary copy of the app:
library(shiny)
runGitHub("dmattek/screenQC")
However, for performance reasons you might prefer to switch to an offline installation as outlined above!
To deploy the app on RStudio/Shiny server, follow the instructions here.
