Abstract
CRISPR (clustered regularly interspaced short palindrome repeats) coupled with nuclease Cas9 (CRISPR/Cas9) screens represent a promising technology to systematically evaluate gene functions. Data analysis for CRISPR/Cas9 screens is a critical process that includes identifying screen hits and exploring biological functions for these hits in downstream analysis. We have previously developed two algorithms, MAGeCK and MAGeCK-VISPR, to analyze CRISPR/Cas9 screen data in various scenarios. These two algorithms allow users to perform quality control, read count generation and normalization, and calculate beta score to evaluate gene selection performance. In downstream analysis, the biological functional analysis is required for understanding biological functions of these identified genes with different screening purposes. Here, We developed MAGeCKFlute for supporting downstream analysis. MAGeCKFlute provides several strategies to remove potential biases within sgRNA-level read counts and gene-level beta scores. The downstream analysis with the package includes identifying essential, non-essential, and target-associated genes, and performing biological functional category analysis, pathway enrichment analysis and protein complex enrichment analysis of these genes. The package also visualizes genes in multiple ways to benefit users exploring screening data. Collectively, MAGeCKFlute enables accurate identification of essential, non-essential, and targeted genes, as well as their related biological functions. This vignette explains the use of the package and demonstrates typical workflows.Note: if you use MAGeCKFlute in published research, please cite: Binbin Wang, Mei Wang, Wubing Zhang. “Integrative analysis of pooled CRISPR genetic screens using MAGeCKFlute.” Nature Protocols (2019), doi: 10.1038/s41596-018-0113-7.
MAGeCK (Wei Li and Liu. 2014) and MAGeCK-VISPR (Wei Li and Liu. 2015) are developed by our lab previously, to analyze CRISPR/Cas9 screen data in different scenarios(Tim Wang 2014, Hiroko Koike-Yusa (2014), Ophir Shalem1 (2014), Luke A.Gilbert (2014), Silvana Konermann (2015)). Both algorithms use negative binomial models to model the variances of sgRNAs, and use Robust Rank Aggregation (for MAGeCK) or maximum likelihood framework (for MAGeCK-VISPR) for a robust identification of selected genes.
The command mageck mle
computes beta scores and the associated statistics for all genes in multiple conditions. The beta score describes how the gene is selected: a positive beta score indicates a positive selection, and a negative beta score indicates a negative selection.
The command mageck test
uses Robust Rank Aggregation (RRA) for robust identification of CRISPR-screen hits, and outputs the summary results at both sgRNA and gene level.
Here we show the most basic steps for integrative analysis pipeline. MAGeCKFlute package includes the MAGeCK results from one intrinsic dataset, including countsummary
, rra.gene_summary
, rra.sgrna_summary
, and mle.gene_summary
. We will work with them in this document.
Downstream analysis pipeline for MAGeCK RRA
##Load gene summary data in MAGeCK RRA results
data("rra.gene_summary")
data("rra.sgrna_summary")
##Run the downstream analysis pipeline for MAGeCK RRA
FluteRRA(rra.gene_summary, rra.sgrna_summary, proj="PLX", organism="hsa")
All pipeline results are written into local directory “./MAGeCKFlute_PLX/”, and all figures are integrated into file “PLX_Flute.rra_summary.pdf”.
Downstream analysis pipeline for MAGeCK MLE CRISPR screens can be conducted using three different cell populations: the day 0 population, a drug-treated population (treatment) and a control population (mockdrug control, typically treated with a vehicle such as DMSO). The CRISPR screens are required to analyze with MAGeCK MLE, which generates a gene summary file like mle.gene_summary
below. FluteMLE is useful in this scenario to perform downstream analysis.
data("mle.gene_summary")
## Run the downstream analysis pipeline for MAGeCK MLE
FluteMLE(mle.gene_summary, treatname="plx", ctrlname="dmso", proj="PLX", organism="hsa")
If CRISPR screens don’t include a control cell population, FluteMLE supports users to use Depmap screens as control.
## Take Depmap screen as control
FluteMLE(mle.gene_summary, treatname="plx", ctrlname="Depmap", proj="PLX", organism="hsa", incorporateDepmap = TRUE)
## If a specific cell line is preferred, you can look at the similarity of your screen with Depmap screens by using function ResembleDepmap.
depmap_similarity = ResembleDepmap(mle.gene_summary, symbol = "Gene", score = "plx.beta")
FluteMLE(mle.gene_summary, treatname="plx", ctrlname="Depmap", proj="PLX", organism="hsa", incorporateDepmap = TRUE, cell_lines = rownames(depmap_similarity)[1], lineages = "All")
All pipeline results are written into local directory “./MAGeCKFlute_PLX/”, and all figures are integrated into file “PLX_Flute.mle_summary.pdf”.
** Count summary ** MAGeCK Count
in MAGeCK/MAGeCK-VISPR generates a count summary file, which summarizes some basic QC scores at raw count level, including map ratio, Gini index, and NegSelQC. Use function ‘data’ to load the dataset, and have a look at the file with a text editor to see how it is formatted.
## File Label Reads Mapped Percentage
## 1 ../data/GSC_0131_Day23_Rep1.fastq.gz day23_r1 62818064 39992777 0.6366
## 2 ../data/GSC_0131_Day0_Rep2.fastq.gz day0_r2 47289074 31709075 0.6705
## 3 ../data/GSC_0131_Day0_Rep1.fastq.gz day0_r1 51190401 34729858 0.6784
## 4 ../data/GSC_0131_Day23_Rep2.fastq.gz day23_r2 58686580 37836392 0.6447
## TotalsgRNAs Zerocounts GiniIndex NegSelQC NegSelQCPval
## 1 64076 57 0.08510 0 1
## 2 64076 17 0.07496 0 1
## 3 64076 14 0.07335 0 1
## 4 64076 51 0.08587 0 1
## NegSelQCPvalPermutation NegSelQCPvalPermutationFDR NegSelQCGene
## 1 1 1 0
## 2 1 1 0
## 3 1 1 0
## 4 1 1 0
# Gini index
BarView(countsummary, x = "Label", y = "GiniIndex",
ylab = "Gini index", main = "Evenness of sgRNA reads")
# Missed sgRNAs
countsummary$Missed = log10(countsummary$Zerocounts)
BarView(countsummary, x = "Label", y = "Missed", fill = "#394E80",
ylab = "Log10 missed gRNAs", main = "Missed sgRNAs")
# Or
countsummary$Unmapped = countsummary$Reads - countsummary$Mapped
gg = data.table::melt(countsummary[, c("Label", "Mapped", "Unmapped")], id.vars = "Label")
## Warning in data.table::melt(countsummary[, c("Label", "Mapped", "Unmapped")], :
## The melt generic in data.table has been passed a data.frame and will attempt
## to redirect to the relevant reshape2 method; please note that reshape2 is
## deprecated, and this redirection is now deprecated as well. To continue using
## melt methods from reshape2 while both libraries are attached, e.g. melt.list,
## you can prepend the namespace like reshape2::melt(countsummary[, c("Label",
## "Mapped", "Unmapped")]). In the next version, this warning will become an error.
For experiments with two experimental conditions, we recommend MAGeCK-RRA for identification of essential genes from CRISPR/Cas9 knockout screens. Gene summary file in MAGeCK-RRA results summarizes the statistical significance of positive selections and negative selections.
## id num neg.score neg.p.value neg.fdr neg.rank neg.goodsgrna neg.lfc
## 1 NF2 4 4.1770e-12 2.9738e-07 0.000275 1 4 -1.3580
## 2 SRSF10 4 4.4530e-11 2.9738e-07 0.000275 2 4 -1.8544
## 3 EIF2B4 8 2.8994e-10 2.9738e-07 0.000275 3 8 -1.5325
## 4 LAS1L 6 1.4561e-09 2.9738e-07 0.000275 4 6 -2.2402
## 5 RPL3 15 2.3072e-09 2.9738e-07 0.000275 5 12 -1.0663
## 6 ATP6V0 7 3.8195e-09 2.9738e-07 0.000275 6 7 -1.6380
## pos.score pos.p.value pos.fdr pos.rank pos.goodsgrna pos.lfc
## 1 1.00000 1.00000 1 16645 0 -1.3580
## 2 1.00000 1.00000 1 16647 0 -1.8544
## 3 1.00000 1.00000 1 16646 0 -1.5325
## 4 0.99999 0.99999 1 16570 0 -2.2402
## 5 0.95519 0.99205 1 15359 2 -1.0663
## 6 1.00000 1.00000 1 16644 0 -1.6380
## sgrna Gene control_count treatment_count control_mean treat_mean LFC
## 1 s_10963 CDKN2 1175.4/1156.7 4110.7/4046 1166.00 4078.30 1.8055
## 2 s_10959 CDKN2 651.49/647.25 2188.3/3020.6 649.37 2604.40 2.0022
## 3 s_36798 NF2 8917/21204 5020.7/5127.9 15061.00 5074.30 -1.5693
## 4 s_45763 RAB6A 3375.8/3667.7 372.88/357.79 3521.80 365.33 -3.2655
## 5 s_23611 GPN1 4043.8/4064.2 767.53/853.7 4054.00 810.61 -2.3208
## 6 s_50164 SF1 3657.8/3352.6 453.62/628.28 3505.20 540.95 -2.6937
## control_var adj_var score p.low p.high p.twosided FDR
## 1 1.7417e+02 4531.0 43.266 1.0000e+00 0 0.0000e+00 0.0000e+00
## 2 8.9814e+00 2365.7 40.195 1.0000e+00 0 0.0000e+00 0.0000e+00
## 3 7.5491e+07 78871.0 35.559 2.9804e-277 1 5.9609e-277 1.2732e-272
## 4 4.2617e+04 15519.0 25.338 6.1638e-142 1 1.2328e-141 1.9748e-137
## 5 2.0966e+02 18159.0 24.069 2.6711e-128 1 5.3423e-128 6.8462e-124
## 6 4.6575e+04 15438.0 23.857 4.2365e-126 1 8.4731e-126 9.0487e-122
## high_in_treatment
## 1 True
## 2 True
## 3 False
## 4 False
## 5 False
## 6 False
Two type of scores are optional, lfc (logrithm fold change) and rra (Robust Rank Aggregation score).
## id Score FDR
## 1 NF2 -1.3580 0.000275
## 2 SRSF10 -1.8544 0.000275
## 3 EIF2B4 -1.5325 0.000275
## 4 LAS1L -2.2402 0.000275
## 5 RPL3 -1.0663 0.000275
## 6 ATP6V0 -1.6380 0.000275
## sgrna Gene LFC FDR
## 1 s_10963 CDKN2 1.8055 0.0000e+00
## 2 s_10959 CDKN2 2.0022 0.0000e+00
## 3 s_36798 NF2 -1.5693 1.2732e-272
## 4 s_45763 RAB6A -3.2655 1.9748e-137
## 5 s_23611 GPN1 -2.3208 6.8462e-124
## 6 s_50164 SF1 -2.6937 9.0487e-122
depmap_similarity = ResembleDepmap(dd.rra, symbol = "id", score = "Score", lineages = "All", method = "pearson")
head(depmap_similarity)
## estimate p.value
## A2780 0.5791483 0
## OVCAR8 0.5789564 0
## R262 0.5755967 0
## HS578T 0.5754257 0
## SF295 0.5751215 0
## KYSE180 0.5749847 0
dd.rra = OmitCommonEssential(dd.rra)
dd.sgrna = OmitCommonEssential(dd.sgrna, symbol = "Gene")
# Compute the similarity with Depmap screens based on subset genes
depmap_similarity = ResembleDepmap(dd.rra, symbol = "id", score = "Score", lineages = "All", method = "pearson")
head(depmap_similarity)
## estimate p.value
## TE11 0.2394741 5.392597e-149
## OVCAR8 0.2390556 6.636024e-154
## YH13 0.2386189 2.470833e-153
## HUPT3 0.2380013 3.869874e-147
## NCIH661 0.2379885 1.640237e-152
## LXF289 0.2360406 5.494129e-150
Rank all the genes based on their scores and label genes in the rank plot.
dd.rra$Rank = rank(dd.rra$Score)
p1 = ScatterView(dd.rra, x = "Rank", y = "Score", label = "id",
top = 5, auto_cut_y = TRUE, groups = c("top", "bottom"))
print(p1)
# Label interested hits using parameter `toplabels` (in ScatterView) and `genelist` (in RankView).
ScatterView(dd.rra, x = "Rank", y = "Score", label = "id", auto_cut_y = TRUE,
groups = c("top", "bottom"), toplabels = c("EP300", "NF2"))
Visualize negative and positive selected genes separately.
For more information about functional enrichment analysis in MAGeCKFlute, please read the [MAGeCKFlute_enrichment document] (https://www.bioconductor.org/packages/3.9/bioc/vignettes/MAGeCKFlute/inst/doc/MAGeCKFlute_enrichment.html), in which we introduce all the available options and methods.
** Gene summary ** The gene summary file in MAGeCK-MLE results includes beta scores of all genes in multiple condition samples.
## Gene dmso plx
## 1 FEZ1 -0.045088 -0.036721
## 2 TNN 0.094325 0.065533
## 3 NAT8L 0.026362 0.044979
## 4 OAS2 -0.271210 -0.289010
## 5 OR10H3 -0.098324 -0.365730
## 6 CCL16 -0.309750 -0.148830
Is there batch effects? This is a commonly asked question before perform later analysis. In our package, we provide HeatmapView
to ensure whether the batch effect exists in data and use BatchRemove
to remove easily if same batch samples cluster together.
##Before batch removal
edata = matrix(c(rnorm(2000, 5), rnorm(2000, 8)), 1000)
colnames(edata) = paste0("s", 1:4)
HeatmapView(cor(edata))
## After batch removal
batchMat = data.frame(sample = colnames(edata), batch = rep(1:2, each = 2))
edata1 = BatchRemove(edata, batchMat)
## Standardizing Data across genes
## s1 s2 s3 s4
## [1,] 7.895476 7.192883 8.157212 6.857776
## [2,] 6.718039 6.444331 6.944247 6.141009
## [3,] 6.564053 6.172562 6.908892 5.861501
## [4,] 6.862948 6.922975 7.152316 6.749370
## [5,] 6.504449 7.882967 7.878177 6.350106
## [6,] 6.418311 7.446548 7.404662 6.404747
It is difficult to control all samples with a consistent cell cycle in a CRISPR screen experiment with multi conditions. Besides, beta score among different states with an inconsistent cell cycle is incomparable. So it is necessary to do the normalization when comparing the beta scores in different conditions. Essential genes are those genes that are indispensable for its survival. The effect generated by knocking out these genes in different cell types is consistent. Based on this, we developed the cell cycle normalization method to shorten the gap of the cell cycle in different conditions. Besides, a previous normalization method called loess normalization is available in this package.(Laurent Gautier 2004)
ctrlname = "dmso"
treatname = "plx"
dd_essential = NormalizeBeta(dd, samples=c(ctrlname, treatname), method="cell_cycle")
head(dd_essential)
## Gene dmso plx
## 1 FEZ1 -0.05884165 -0.05661055
## 2 TNN 0.12309790 0.10102827
## 3 NAT8L 0.03440347 0.06934141
## 4 OAS2 -0.35393992 -0.44554929
## 5 OR10H3 -0.12831676 -0.56382388
## 6 CCL16 -0.40423616 -0.22944223
## Gene dmso plx
## 1 FEZ1 -0.04217224 -0.03963676
## 2 TNN 0.10206498 0.05779302
## 3 NAT8L 0.03219711 0.03914389
## 4 OAS2 -0.27186628 -0.28835372
## 5 OR10H3 -0.09914657 -0.36490743
## 6 CCL16 -0.31057071 -0.14800929
After normalization, the distribution of beta scores in different conditions should be similar. We can evaluate the distribution of beta scores using the function ‘DensityView’, and ‘ConsistencyView’.
## Warning in data.table::melt(beta, id = NULL): The melt generic in data.table
## has been passed a data.frame and will attempt to redirect to the relevant
## reshape2 method; please note that reshape2 is deprecated, and this redirection
## is now deprecated as well. To continue using melt methods from reshape2 while
## both libraries are attached, e.g. melt.list, you can prepend the namespace like
## reshape2::melt(beta). In the next version, this warning will become an error.
dd_essential$Control = rowMeans(dd_essential[,ctrlname, drop = FALSE])
dd_essential$Treatment = rowMeans(dd_essential[,treatname, drop = FALSE])
p1 = ScatterView(dd_essential, "Control", "Treatment", groups = c("top", "bottom"), auto_cut_diag = TRUE, display_cut = TRUE, toplabels = c("NF1", "NF2", "EP300"))
print(p1)
# 9-square groups
Square9 = p1$data
idx=Square9$group=="topcenter"
geneList = Square9$Diff
names(geneList) = Square9$Gene[idx]
universe = Square9$Gene
# Enrichment analysis
kegg1 = EnrichAnalyzer(geneList = geneList, universe = universe)
EnrichedView(kegg1, top = 6, bottom = 0)
Also, pathway visualization can be done using function KeggPathwayView
, the same as the section above.
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.4 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.10-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.10-bioc/R/lib/libRlapack.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] ggplot2_3.3.0 MAGeCKFlute_1.6.5
##
## loaded via a namespace (and not attached):
## [1] fgsea_1.12.0 colorspace_1.4-1 ggsignif_0.6.0
## [4] ellipsis_0.3.0 ggridges_0.5.2 qvalue_2.18.0
## [7] XVector_0.26.0 ggpubr_0.2.5 farver_2.0.3
## [10] urltools_1.7.3 graphlayouts_0.6.0 ggrepel_0.8.2
## [13] bit64_0.9-7 AnnotationDbi_1.48.0 fansi_0.4.1
## [16] xml2_1.3.1 codetools_0.2-16 splines_3.6.3
## [19] GOSemSim_2.12.1 knitr_1.28 pathview_1.26.0
## [22] polyclip_1.10-0 jsonlite_1.6.1 annotate_1.64.0
## [25] GO.db_3.10.0 dbplyr_1.4.2 png_0.1-7
## [28] pheatmap_1.0.12 graph_1.64.0 ggforce_0.3.1
## [31] msigdbr_7.0.1 BiocManager_1.30.10 compiler_3.6.3
## [34] httr_1.4.1 rvcheck_0.1.8 assertthat_0.2.1
## [37] Matrix_1.2-18 limma_3.42.2 cli_2.0.2
## [40] tweenr_1.0.1 htmltools_0.4.0 prettyunits_1.1.1
## [43] tools_3.6.3 igraph_1.2.5 gtable_0.3.0
## [46] glue_1.4.0 reshape2_1.4.4 DO.db_2.9
## [49] dplyr_0.8.5 rappdirs_0.3.1 fastmatch_1.1-0
## [52] Rcpp_1.0.4.6 enrichplot_1.6.1 Biobase_2.46.0
## [55] vctrs_0.2.4 Biostrings_2.54.0 nlme_3.1-145
## [58] ggraph_2.0.2 xfun_0.12 stringr_1.4.0
## [61] lifecycle_0.2.0 clusterProfiler_3.14.3 dendextend_1.13.4
## [64] XML_3.99-0.3 DOSE_3.12.0 europepmc_0.3
## [67] zlibbioc_1.32.0 MASS_7.3-51.5 scales_1.1.0
## [70] tidygraph_1.1.2 hms_0.5.3 parallel_3.6.3
## [73] KEGGgraph_1.46.0 RColorBrewer_1.1-2 yaml_2.2.1
## [76] curl_4.3 memoise_1.1.0 gridExtra_2.3
## [79] biomaRt_2.42.1 triebeard_0.3.0 stringi_1.4.6
## [82] RSQLite_2.2.0 genefilter_1.68.0 S4Vectors_0.24.4
## [85] BiocGenerics_0.32.0 BiocParallel_1.20.1 matrixStats_0.56.0
## [88] rlang_0.4.5 pkgconfig_2.0.3 bitops_1.0-6
## [91] evaluate_0.14 lattice_0.20-41 purrr_0.3.3
## [94] labeling_0.3 cowplot_1.0.0 bit_1.1-15.2
## [97] tidyselect_1.0.0 ggsci_2.9 plyr_1.8.6
## [100] magrittr_1.5 R6_2.4.1 IRanges_2.20.2
## [103] DBI_1.1.0 withr_2.1.2 mgcv_1.8-31
## [106] pillar_1.4.3 survival_3.1-11 KEGGREST_1.26.1
## [109] RCurl_1.98-1.1 tibble_3.0.0 crayon_1.3.4
## [112] BiocFileCache_1.10.2 rmarkdown_2.1 viridis_0.5.1
## [115] progress_1.2.2 grid_3.6.3 sva_3.34.0
## [118] data.table_1.12.8 blob_1.2.1 Rgraphviz_2.30.0
## [121] digest_0.6.25 xtable_1.8-4 tidyr_1.0.2
## [124] gridGraphics_0.5-0 openssl_1.4.1 stats4_3.6.3
## [127] munsell_0.5.0 viridisLite_0.3.0 ggplotify_0.0.5
## [130] askpass_1.1
Hiroko Koike-Yusa, E-Pien Tan, Yilong Li. 2014. “Genome-wide recessive genetic screening in mammalian cells with a lentiviral CRISPR-guide RNA library.” http://science.sciencemag.org/content/343/6166/80.long.
Laurent Gautier, Benjamin M. Bolstad, Leslie Cope. 2004. “affy—analysis of Affymetrix GeneChip data at the probe level.” https://academic.oup.com/bioinformatics/article/20/3/307/185980.
Luke A.Gilbert, BrittAdamson, Max A.Horlbeck. 2014. “Genome-Scale CRISPR-Mediated Control of Gene Repression and Activation.” https://linkinghub.elsevier.com/retrieve/pii/S0092-8674(14)01178-7.
Ophir Shalem1, *, 2. 2014. “Genome-scale CRISPR-Cas9 knockout screening in human cells.” http://science.sciencemag.org/content/343/6166/84.long.
Silvana Konermann, Alexandro E. Trevino, Mark D. Brigham. 2015. “Genome-scale transcriptional activation by an engineered CRISPR-Cas9 complex.” https://www.nature.com/nature/journal/vnfv/ncurrent/full/nature14136.html.
Tim Wang, David M. Sabatini, Jenny J. Wei1. 2014. “Genetic Screens in Human Cells Using the CRISPR-Cas9 System.” http://science.sciencemag.org/content/343/6166/80.long.
Wei Li, Han Xu, Johannes Köster, and X. Shirley Liu. 2015. “Quality control, modeling, and visualization of CRISPR screens with MAGeCK-VISPR.” https://genomebiology.biomedcentral.com/articles/10.1186/s13059-015-0843-6.
Wei Li, Tengfei Xiao, Han Xu, and X Shirley Liu. 2014. “MAGeCK enables robust identification of essential genes from genome-scale CRISPR/Cas9 knockout screens.” https://genomebiology.biomedcentral.com/articles/10.1186/s13059-014-0554-4.