ALL Metrics
-
Views
-
Downloads
Get PDF
Get XML
Cite
Export
Track
Software Tool Article
Revised

TCGA Workflow: Analyze cancer genomics and epigenomics data using Bioconductor packages

[version 2; peer review: 1 approved, 2 approved with reservations]
* Equal contributors
PUBLISHED 28 Dec 2016
Author details Author details
OPEN PEER REVIEW
REVIEWER STATUS

This article is included in the Bioinformatics gateway.

This article is included in the Bioconductor gateway.

Abstract

Biotechnological advances in sequencing have led to an explosion of publicly available data via large international consortia such as The Cancer Genome Atlas (TCGA), The Encyclopedia of DNA Elements (ENCODE), and The NIH Roadmap Epigenomics Mapping Consortium (Roadmap). These projects have provided unprecedented opportunities to interrogate the epigenome of cultured cancer cell lines as well as normal and tumor tissues with high genomic resolution. The Bioconductor project offers more than 1,000 open-source software and statistical packages to analyze high-throughput genomic data. However, most packages are designed for specific data types (e.g. expression, epigenetics, genomics) and there is no one comprehensive tool that provides a complete integrative analysis of the resources and data provided by all three public projects. A need to create an integration of these different analyses was recently proposed. In this workflow, we provide a series of biologically focused integrative analyses of different molecular data. We describe how to download, process and prepare TCGA data and by harnessing several key Bioconductor packages, we describe how to extract biologically meaningful genomic and epigenomic data. Using Roadmap and ENCODE data, we provide a work plan to identify biologically relevant functional epigenomic elements associated with cancer. To illustrate our workflow, we analyzed two types of brain tumors: low-grade glioma (LGG) versus high-grade glioma (glioblastoma multiform or GBM). This workflow introduces the following Bioconductor packages: AnnotationHub, ChIPSeeker, ComplexHeatmap, pathview, ELMER, GAIA, MINET, RTCGAToolboxTCGAbiolinks.

Keywords

Epigenomics, Genomics, Cancer, non-coding, TCGA, ENCODE, Roadmap, Bioinformatics

Revised Amendments from Version 1

In this revised version of our workflow, we made the following major changes:
- The introduction now includes the GDC NCI data portal (https://gdc.nci.nih.gov/).
- The codes to acquire TCGA data were rewritten in order to use the new version of the TCGAbiolinks package. TCGAbiolinks was entirely redesigned to query, download and prepare data from the GDC NCI data portal (https://gdc.nci.nih.gov/) instead of the inactive DCC TCGA data portal (https://tcga-data.nci.nih.gov).

Minor changes includes improvements based on the referee's comments, such as:
- The inclusion of a paragraph to introduce GISTIC data
- The inclusion of a paragraph explaining the differences between the open (TCGA level 3 and 4 data) and controlled data (TCGA level 1 and 2 data) and pointing to sources that might help the user request access to controlled data.
- Hyperlinks and references were corrected.
- Improvements in the text by removing a few redundancies.
- We used data aligned to reference genome hg19 in all steps of the workflow.

See the authors' detailed response to the review by Charlotte Soneson
See the authors' detailed response to the review by Elena Papaleo
See the authors' detailed response to the review by Kyle Ellrott

Introduction

Cancer is a complex genetic disease spanning multiple molecular events such as point mutations, structural variations, translocations and activation of epigenetic and transcriptional signatures and networks. The effects of these events take place at different spatial and temporal scales with interlayer communications and feedback mechanisms creating a highly complex dynamic system. To gain insight into the biology of tumors most of the research in cancer genomics is aimed at the integration of the observations at multiple molecular scales and the analysis of their interplay. Even if many tumors share similar recurrent genomic events, their relationships with the observed phenotype are often not understood. For example, although we know that the majority of the most aggressive form of brain tumors such as glioma harbor the mutation of a single gene (IDH), the mechanistic explanation of the activation of its characteristic epigenetic and transcriptional signatures are still far to be well characterized. Moreover, network-based strategies have recently emerged as an effective framework for the discovery functional disease drivers that act as main regulators of cancer phenotypes.

Indeed, recent technological developments allowed the deposition of large amounts of genomic and epigenomic data, such as gene expression, DNA methylation, and genomic localization of transcription factors, into freely available public international consortia like The Cancer Genome Atlas (TCGA), The Encyclopedia of DNA Elements (ENCODE), and The NIH Roadmap Epigenomics Mapping Consortium (Roadmap)1. An overview of the three consortia is described below:

  • The Cancer Genome Atlas (TCGA): The TCGA consortium, which is a National Institute of Health (NIH) initiative, makes publicly available molecular and clinical information for more than 30 types of human cancers including exome (variant analysis), single nucleotide polymorphism (SNP), DNA methylation, transcriptome (mRNA), microRNA (miRNA) and proteome. Sample types available at TCGA are: primary solid tumors, recurrent solid tumors, blood derived normal and tumor, metastatic, and solid tissue normal2.

  • The Encyclopedia of DNA Elements (ENCODE): Found in 2003 by the National Human Genome Research Institute (NHGRI), the project aims to build a comprehensive list of functional elements that have an active role in the genome, including regulatory elements that govern gene expression. Biosamples includes immortalized cell lines, tissues, primary cells and stem cells3.

  • The NIH Roadmap Epigenomics Mapping Consortium: This was launched with the goal of producing a public resource of human epigenomic data in order to analyze biology and disease-oriented research. Roadmap maps DNA methylation, histone modifications, chromatin accessibility, and small RNA transcripts in stem cells and primary ex vivo tissues4,5.

Briefly, these three consortia provide large scale epigenomic data onto a variety of microarrays and next-generation sequencing (NGS) platforms. Each consortium encompasses specific types of biological information on specific type of tissue or cell and when analyzed together, it provides an invaluable opportunity for research laboratories to better understand the developmental progression of normal cells to cancer state at the molecular level and importantly, correlate these phenotypes with tissue of origins.

Although there exists a wealth of possibilities6 in accessing cancer associated data, Bioconductor represent the most comprehensive set of open source, updated and integrated professional tools for the statistical analysis of large scale genomic data. Thus, we propose our workflow within Bioconductor to describe how to download, process, analyze and integrate cancer data to understand specific cancer-related specific questions. However, there is no tool that solves the issue of integration in a comprehensive sequence and mutation information, epigenomic state and gene expression within the context of gene regulatory networks to identify oncogenic drivers and characterize altered pathways during cancer progression. Therefore, our workflow presents several Bioconductor packages to work with genomic and epigenomics data.

Methods

Access to the data

TCGA data is accessible via the the NCI Genomic Data Commons (GDC) data portal, GDC Legacy Archive and the Broad Institute’s GDAC Firehose. The GDC Data Portal provides access to the subset of TCGA data that has been harmonized against GRCh38 (hg38) using GDC Bioinformatics Pipelines which provides methods to the standardization of biospecimen and clinical data, the re-alignment of DNA and RNA sequence data against a common reference genome build GRCh38, and the generation of derived data. Whereas the GDC Legacy Archive provides access to an unmodified copy of data that was previously stored in CGHub7 and in the TCGA Data Portal hosted by the TCGA Data Coordinating Center (DCC), in which uses as references GRCh37 (hg19) and GRCh36 (hg18).

The previously stored data in CGHub, TCGA Data Portal and Broad Institute’s GDAC Firehose, were provided as different levels or tiers that were defined in terms of a specific combination of both processing level (raw, normalized, integrated) and access level (controlled or open access). Level 1 indicated raw and controlled data, level 2 indicated processed and controlled data, level 3 indicated Segmented or Interpreted Data and open access and level 4 indicated region of interest and open access data. While the TCGA data portal provided level 1 to 3 data, Firehose only provides level 3 and 4. An explanation of the different levels can be found at TCGA Wiki. However, the GDC data portal no longer uses this based classification model in levels. Instead a new data model was created, its documentation can be found in GDC documentation. In this new model, data can be open or controlled access. While the GDC open access data does not require authentication or authorization to access it and generally includes high level genomic data that is not individually identifiable, as well as most clinical and all biospecimen data elements, the GDC controlled access data requires dbGaP authorization and eRA Commons authentication and generally includes individually identifiable data such as low level genomic sequencing data, germline variants, SNP6 genotype data, and certain clinical data elements. The process to obtain access to controlled data is found in GDC web site.

Finally, the data provided by GDC data portal and GDC Legacy Archive can be accessed using Bioconductor package TCGAbiolinks, while the data provided by Firehose can be accessed by Bioconductor package RTCGAToolbox.

The next steps describes how one could use TCGAbiolinks & RTCGAToolbox to download clinical, genomics, transcriptomics, epigenomics data, as well as subtype information and GISTIC results (i.e., identified genes targeted by somatic copy-number alterations (SCNAs) that drive cancer growth). All the data used in this workflow has as reference the Genome Reference Consortium human genome (build 37 - hg19).

Downloading data from TCGA data portal. The Bioconductor package TCGAbiolinks8 has three main functions GDCquery, GDCdownload and GDCprepare that should sequentially be used to respectively search, download and load the data as an R object. GDCquery uses GDC API to search the data for a given project and data category and filters the results by samples, sample type, file type and others features if requested by the user. This function returns a object with a summary table with the results found (samples, files and other useful information) and the arguments used in the query. The most important GDCquery arguments are project which receives a GDC project (TCGA-USC, TCGA-LGG, TARGET-AML, etc), data.category which receives a data category (Transcriptome Profiling, Copy Number Variation, DNA methylation, Gene expression, etc), data.type which receives a data type (Gene expression quantification, Isoform Expression Quantification, miRNA Expression Quantification, Copy Number Segment, Masked Copy Number Segment, etc), workflow.type, which receives a GDC workflow type (HTSeq - Counts, HTSeq - FPKM-UQ, HTSeq - FPKM), legacy, which selects to use the legacy database or the harmonized database, file.type, which receives a file type for the searches in the legacy database (hg18.seg, hg19.seg, nocnv_,hg18.seg, nocnv_hg19.seg, rsem.genes.results, rsem.genes.normalized_results, etc) and platform, which receives a the platform for the searches in the legacy database (HumanMethylation27, Genome_Wide_SNP_6, IlluminaHiSeq_RNASeqV2, etc). A complete list of possible entries for arguments can be found in the TCGAbiolinks vignette. Listing 1 shows an example of this function.

After the search step, the user will be able to download the data using the GDCdownload function which can use either the GDC API to download the samples, or the gdc client tools. The downloaded data will be saved in a directory with the project name and a sub-folder with the data.category, for example “TCGA-GBM/DNA_methylation”.

Finally, GDCprepare transforms the downloaded data into a summarizedExperiment object9 or a data frame. If SummarizedExperiment is set to TRUE, TCGAbiolinks will add to the object sub-type information, which was defined by The Cancer Genome Atlas (TCGA) Research Network reports (the full list of papers can be seen in TCGAquery_subtype section in TCGAbiolinks vignette), and clinical information. Listing 1 shows how to use these functions to download DNA methylation and gene expression data from the GDC legacy database and 2 shows how to download copy number variation from harmonized data portal. Other examples, that access the harmonized data can be found in the TCGAbiolinks vignette.

 1 library(TCGAbiolinks)
 2
 3 # Obs: The data in the legacy database has been aligned to hg19
 4 query.met.gbm <– GDCquery(project = "TCGA–GBM",
 5                         legacy = TRUE,
 6                         data.category = "DNA methylation",
 7                         platform = "Illumina Human Methylation 450",
 8                         barcode = c("TCGA–76–4926–01B–01D–1481–05", "TCGA–28–5211–01C–11D–1844–05"))
 9 GDCdownload(query.met.gbm)
10
11 met.gbm.450 <– GDCprepare(query = query.met.gbm,
12                         save = TRUE,
13                         save.filename = "gbmDNAmet450k.rda" ,
14                         summarizedExperiment = TRUE)
15 query.met.lgg <– GDCquery(project = "TCGA–LGG",
16                              legacy = TRUE,
17                              data.category = "DNA methylation ",
18                              platform = "Illumina Human Methylation 450",
19                              barcode = c("TCGA–HT–7879–01A–11D–2399–05", "TCGA–HT–8113–01A–11D–2399–05" )
        )
20 GDCdownload(query.met.lgg)
21 met.lgg.450 <– GDCprepare(query = query.met.lgg,
22                              save = TRUE,
23                              save.filename = "lggDNAmet450k.rda",
24                              summarizedExperiment = TRUE)
25 met.gbm.lgg <– SummarizedExperiment::cbind(met.lgg.450, met.gbm.450)
26
27
28 query.exp.lgg <– GDCquery(project = "TCGA–LGG",
29                         legacy = TRUE,
30                         data.category = "Gene expression",
31                         data.type = "Gene expression quantification",
32                         platform = "Illumina HiSeq",
33                         file.type = "results",
34                         sample.type = "Primary solid Tumor")
35 GDCdownload(query.exp.lgg)
36 exp.lgg <– GDCprepare(query = query.exp.lgg, save = TRUE, save.filename = "lggExp.rda")
37
38 query.exp.gbm <– GDCquery(project = "TCGA–GBM",
39                         legacy = TRUE,
40                         data.category = "Gene expression",
41                         data.type = "Gene expression quantification",
42                         platform = "Illumina HiSeq",
43                         file.type = "results",
44                         sample.type = "Primary solid Tumor")
45 GDCdownload(query.exp.gbm)
46 exp.gbm <– GDCprepare(query = query.exp.gbm, save = TRUE, save.filename = "gbmExp.rda")
47 exp.gbm.lgg <– SummarizedExperiment::cbind(exp.lgg, exp.gbm)

Listing 1. Downloading TCGA DNA methylation and gene expression data from GDC legacy database with TCGAbiolinks

 1 library(TCGAbiolinks)
 2 #——————————————————————————————————————————————————————————————————————————
 3 #               Data.category: Copy number variation aligned to hg38
 4 #——————————————————————————————————————————————————————————————————————————
 5 query <– GDCquery(project = "TCGA–ACC",
 6                     data.category = "Copy Number Variation",
 7                     data.type = "Copy Number Segment",
 8                     barcode = c( "TCGA–OR–A5KU–01A–11D–A29H–01", "TCGA–OR–A5JK–01A–11D–A29H–01"))
 9 GDCDownload(query)
10 data <– GDCPrepare(query)
11
12 query <– GDCquery("TCGA–ACC",
13                     "Copy Number Variation",
14                     data.type = "Masked Copy Number Segment",
15                     sample.type = c("Primary solid Tumor")) # see the barcodes with query$results[[1]]$cases
16 GDCDownload(query)
17 data <– GDCPrepare(query)

Listing 2. Downloading TCGA copy number variation data from GDC harmonized database with TCGAbiolinks

If a summarizedExperiment object was chosen, the data can be accessed with three different accessors: assay for the data information, rowRanges to gets the range of values in each row and colData to get the sample information (patient, batch, sample type, etc)9,10. An example is shown in Listing 3.

1 library(summarizedExperiment)
2 # get expression matrix
3 data <– assay(exp.gbm.lgg)
4
5 # get genes information
6 genes.info <– rowRanges(exp.gbm.lgg)
7
8 # get sample information
9 sample.info <– colData(exp.gbm.lgg)

Listing 3. summarizedExperiment accessors

The clinical data can be obtained using TCGAbiolinks through two methods. The first one will download only the indexed GDC clinical data which includes diagnoses (vital status, days to death, age at diagnosis, days to last follow up, days to recurrence), treatments (days to treatment, treatment id, therapeutic agents, treatment intent type), demographic (gender, race, ethnicity) and exposures (cigarettes per day, weight, height, alcohol history) information. This indexed clinical data can be obtained using the function GDCquery_clinical which can be used as described in Listing 4. This function has two arguments project ("TCGA-GBM","TARGETAML", etc) and type ("Clinical" or "Biospecimen"). The second method will download the xml files with all clinical data for the patient and retrieve the desired information from it. This will give access to all clinical data available which includes patient (tumor tissue site, histological type, gender, vital status, days to birth, days to last follow up, etc), drug (days to drug therapy start, days to drug therapy end, therapy types, drug name), radiation (days to radiation therapy start, days to radiation therapy end, radiation type, radiation dosage), new tumor event (days to new tumor event after initial treatment, new neoplasm event type, additional pharmaceutical therapy), follow up (primary therapy outcome success, follow up treatment success, vital status, days to last follow up, date of form completion), stage event (pathologic stage, tnm categories), admin (batch number, project code, disease code, Biospecimen Core Resource).

 1 # get indexed clinical patient data for GBM samples
 2 gbm_clin <– GDCquery_clinic(project = "TCGA–GBM", type = "Clinical")
 3
 4 # get indexed clinical patient data for LGG samples
 5 lgg_clin <– GDCquery_clinic(project = "TCGA–LGG", type = "Clinical")
 6
 7 # Bind the results, as the columns might not be the same,
 8 # we will will plyr rbind.fill, to have all columns from both files
 9 clinical <– plyr::rbind.fill(gbm_clin,lgg_clin)
10
11 # if barcode is not set, it will consider all samples.
12 # We only set it to make the example faster
13 query.clin <– GDCquery(project = "TCGA–GBM",
14 			     data.category = "Clinical",
15 		          barcode = c("TCGA–08–0516","TCGA–02–0317"))
16 GDCDownload(query.clin)
17 clinical.patient <– GDCPrepare_clinic(query,"patient")
18 clinical.drug <– GDCPrepare_clinic(query,"drug")
19 clinical.radiation <– GDCPrepare_clinic(query,"radiation")
20 clinical.admin <– GDCPrepare_clinic(query,"admin")
21 clinical.followup <– GDCPrepare_clinic(query,"follow_up")
22 clinical.nte <– GDCPrepare_clinic(query, "new_tumor_event")
23 clinical.stage <– GDCPrepare_clinic(query,"stage_event")

Listing 4. Downloading clinical data with TCGAbiolinks

Mutation information is stored in two types of Mutation Annotation Format (MAF): Protected and Somatic (or Public) MAF files, which are derived from the GDC annotated VCF files. Annotated VCF files often have variants reported on multiple transcripts whereas the protected MAF (*protected.maf) only reports the most critically affected one and the Somatic MAFs (*somatic.maf) are further processed to remove low quality and potential germline variants. To download Somatic MAFs data using TCGAbiolinks, GDCquery_maf function is provided (see Listing 5).

 1 mutation <– GDCquery_Maf(tumor = "ACC", pipelines = "mutect2")

Listing 5. Downloading mutation data with TCGAbiolinks

Finally, the Cancer Genome Atlas (TCGA) Research Network has reported integrated genome-wide studies of various diseases (ACC11, BRCA12, COAD13, GBM14, HNSC15, KICH16, KIRC17, KIRP18, LGG14, LUAD19, LUSC20, PRAD21, READ13, SKCM22, STAD23, THCA24 and UCEC23) which classified them in different subtypes. This classification can be retrieved using the TCGAquery_subtype function or by accessing the samples information in the SummarizedExperiment object that created by the GDCprepare function.

 1 gbm.subtypes <– TCGAquery_subtype(tumor = "gbm")
 2 brca.subtypes <– TCGAquery_subtype(tumor = "brca")

Listing 6. Accessing subtype information retrieved from TCGA papers

Downloading data from Broad TCGA GDAC. The Bioconductor package RTCGAToolbox25 provides access to Firehose Level 3 and 4 data through the function getFirehoseData. The following arguments allows users to select the version and tumor type of interest:

  • dataset - Tumor to download. A complete list of possibilities can be viewed with getFirehoseDatasets function.

  • runDate - Stddata run dates. Dates can be viewed with getFirehoseRunningDates function.

  • gistic2_Date - Analyze run dates. Dates can viewed with getFirehoseAnalyzeDates function.

These arguments can be used to select the data type to download: RNAseq_Gene, Clinic, miRNASeq_Gene, ccRNAseq2_Gene_Norm, CNA_SNP, CNV_SNP, CNA_Seq, CNA_CGH, Methylation, Mutation, mRNA_Array, miRNA_Array, and RPPA.

By default, RTCGAToolbox allows users to download up to 500 MB worth of data. To increase the size of the download, users are encouraged to use fileSizeLimit argument. An example is found in Listing 7. The getData function allow users to access the downloaded data (see lines 22–24 of Listing 7) as a S4Vector object.

 1 library(RTCGAToolbox)
 2
 3 # Get the last run dates
 4 lastRunDate <- getFirehoseRunningDates()[1]
 5 lastAnalyseDate <- getFirehoseAnalyzeDates(1)
 6
 7 # get DNA methylation data, RNAseq2 and clinical data for LGG
 8 lgg.data <- getFirehoseData(dataset = "LGG",
 9			       gistic2_Date = getFirehoseAnalyzeDates(1), runDate = lastRunDate,
10			       Methylation = TRUE, RNAseq2_Gene_Norm = TRUE, Clinic = TRUE,
11			       Mutation = T,
12			       fileSizeLimit = 10000)
13
14 # get DNA methylation data, RNAseq2 and clinical data for GBM
15 gbm.data <- getFirehoseData(dataset = "GBM",
16			       runDate = lastDate, gistic2_Date = getFirehoseAnalyzeDates(1),
17			       Methylation = TRUE, Clinic = TRUE, RNAseq2_Gene_Norm = TRUE,
18			       fileSizeLimit = 10000)
19
20 # To access the data you should use the getData function
21 # or simply access with @ (for example gbm.data@Clinical)
22 gbm.mut <- getData(gbm.data,"Mutations")
23 gbm.clin <- getData(gbm.data,"Clinical")
24 gbm.gistic <- getData(gbm.data,"GISTIC")

Listing 7. Downloading TCGA data files with RTCGAToolbox

Finally, using RTCGAToolbox the user can retrieve CNV level 4 data, including the amplified or deleted genes identified by GISTIC which rates each segment based on the frequency of occurrence combined with the amplitude of aberration, using a permutation test to assess the statistical significance. Among GISTIC results there are two tables that can be accessed by RTCGAToolbox:

  • A gene-level table of copy number values for all samples. The copy number values in the table are in units of (copy number -2), so that no amplification or deletion is 0, genes with amplifications have positive values, and genes with deletions are negative values. The data are converted from marker level to gene level using the extreme method: a gene is assigned the greatest amplification or the least deletion value among the markers it covers.

  • A gene-level table of discrete amplification and deletion indicators for all samples. A table value of 0 means no amplification or deletion above the threshold (diploid normal copy). Amplifications are positive numbers: 1 means amplification above the amplification threshold (low-level gain, 1 extra copy); 2 means amplifications larger to the arm level amplifications observed for the sample (high-level amplification, 2 or more extra copies). Deletions are represented by negative table values: -1 represents deletion beyond the threshold (possibly a heterozygous deletion); -2 means deletions greater than the minimum arm-level deletion observed for the sample (possibly a homozygous deletion).

More details about the GISTIC algorithm and its use are described in 2628. (see Listing 8).

 1 # Download GISTIC results
 2 gistic <- getFirehoseData("GBM",gistic2_Date ="20141017" )
 3
 4 # get GISTIC results
 5 gistic.allbygene <- gistic@GISTIC@AllByGene
 6 gistic.thresholedbygene <- gistic@GISTIC@ThresholedByGene

Listing 8. Using RTCGAToolbox to get the GISTIC results

Genomic analysis

Copy number variations (CNVs) have a critical role in cancer development and progression. A chromosomal segment can be deleted or amplified as a result of genomic rearrangements, such as deletions, duplications, insertions and translocations. CNVs are genomic regions greater than 1 kb with an alteration of copy number between two conditions (e.g., Tumor versus Normal).

TCGA collects copy number data and allows the CNV profiling of cancer. Tumor and paired-normal DNA samples were analyzed for CNV detection using microarray and sequencing-based technologies. Level 3 processed data are the aberrant regions along the genome resulting from CNV segmentation, and they are available for all copy number technologies.

In this section, we will show how to analyze CNV level 3 data from TCGA to identify recurrent alterations in cancer genome. We analyzed GBM and LGG segmented CNV from SNP array (Affymetrix Genome-Wide Human SNP Array 6.0).

Pre-Processing data. The only CNV platform available for both LGG and GBM in TCGA is "Affymetrix Genome-Wide Human SNP Array 6.0". Using TCGAbiolinks, we queried for CNV SNP6 level 3 data for primary solid tumor samples in the legacy database. Data for selected samples were downloaded and prepared in two separate rse objects (RangedSummarizedExperiment).

 
 1 #############################
 2 ## CNV data pre–processing ##
 3 #############################
 4 library(TCGAbiolinks)
 5
 6 query.lgg.nocnv <– GDCquery(project = "TCGA–LGG",
 7                                data.category = "Copy number variation",
 8                                legacy = TRUE,
 9                                file.type = "nocnv_hg19.seg",
10                                sample.type = c(Primary solid Tumor"))
11 GDCdownload(query.lgg.nocnv)
12 lgg.nocnv <– GDCprepare(query.lgg.nocnv, save = TRUE, save.filename = "LGGnocnvhg19.rda")
13
14 query.gbm.nocnv <– GDCquery(project = "TCGA–GBM",
15                                data.category = "Copy number variation",
16                                legacy = TRUE,
17                                file.type = "nocnv_hg19.seg",
18                                sample.type = c("Primary solid Tumor"))
19 GDCdownload(query.gbm.nocnv)
20 gbm.nocnv <– GDCprepare (query.gbm.nocnv, save = TRUE, save.file name = "GBMnocnvhg19.rda")

Listing 9. Searching, downloading and preparing CNV data with TCGAbiolinks

Identification of recurrent CNV in cancer. Cancer related CNV have to be present in many of the analyzed genomes. The most significant recurrent CNV were identified using GAIA29, an iterative procedure where a statistical hypothesis framework is extended to take into account within-sample homogeneity. GAIA is based on a conservative permutation test allowing the estimation of the probability distribution of the contemporary mutations expected for non-driver markers. Segmented data retrieved from TCGA were used to generate a matrix including all needed information about the observed aberrant regions. Furthermore, GAIA requires genomic probes metadata (specific for each CNV technology), that can be downloaded from broadinstitute website.

  1 ###############################
  2 ## CNV  data  pre–processing ##
  3 ###############################
  4 library(TCGAbiolinks)
  5 library(downloader)
  6 library(readr)
  7 library(gaia)
  8
  9 gaiaCNVplot <–  function(calls, cancer=NULL, threshold=0.01)
 10 {
 11     Calls <– calls[order(calls[,"Region Start[bp]"]),]
 12     Calls <– Calls[order(Calls[,"Chromosome"]),]
 13      rownames(Calls) <– NULL
 14     Chromo <– Calls[,"Chromosome"]
 15     Gains <–  apply(Calls,1, function(x) ifelse(x["Aberration Kind"]==1, x["score"], 0))
 16     Losses <– apply(Calls,1,function(x) ifelse(x["Aberration Kind"]==0, x["score"], 0))
 17      plot(Gains, ylim = c(–max(Calls[,"score"]+2), max(Calls[,"score"]+2)), type  = "h",
 18           col  = "red", xlab = "Chromosome", ylab = "Score",
 19           #main = paste("Recurrent Copy Number Variations",cancer, sep =" – "),
 20	     xaxt = "n")
 21	 points(–(Losses), type = "h", col = "blue")
 22	 abline(h = 0, cex = 4)
 23	 abline(h = –log10(threshold), col = "orange", cex = 4, main="test")
 24	 abline(h = log10(threshold), col = "orange", cex = 4, main="test")
 25     uni.chr <– unique(Chromo)
 26     temp <– rep(0, length(uni.chr))
 27	 for (i in 1 :length(uni.chr)) {
 28         temp[i]   <– max(which(uni.chr[i] == Chromo)) 
 29     }
 30	 for (i in 1:length(temp)) {
 31	      abline(v = temp[i], col = "black", lty = "dashed", )
 32     }
 33     nChroms <– length(uni.chr)
 34     begin <– c()
 35	 for (d in 1: nChroms) {
 36	     chrom <– sum(Chromo == uni.chr[d])
 37          begin <– append(begin, chrom)
 38     }
 39     temp2 <– rep(0, nChroms)
 40	 for(i in 1:nChroms) {
 41         if (i == 1) {
 42	       temp2[1] <–(begin[1] * 0.5)
 43	   }
 44	     else  if(i > 1) {
 45	        temp2[i] <– temp[i – 1] + (begin[i] * 0.5)
 46	   }
 47	}
 48	uni.chr[uni.chr ==23] <– "X"
 49	uni.chr[uni.chr ==24] <– "Y"
 50	 for (i in 1:length(temp)) {
 51	      axis(1, at = temp2[i], labels = uni.chr[i], cex.axis = 1) 
 52     }
 53	 legend(x=1, y=max(Calls[,"score"]+2), y.intersp=0.8, c("Amp" ), pch=15, col=c("red"),  text.font=3)
 54	 legend(x=1,y=–max(Calls[,"score"]+0.5), y.intersp=0.8, c("Del"), pch=15, col=c("blue"), text.font=3)
 55 }
 56
 57
 58 for(cancer in c("LGG", "GBM")){
 59	message(paste0("Starting", cancer))
 60	 # Prepare CNV matrix
 61	cnvMatrix <– get(load(paste0 (cancer,"nocnvhg19.rda")))
 62
 63	 # Add label (0 for loss, 1 for gain)
 64	cnvMatrix <– cbind(cnvMatrix, Label=NA)
 65	cnvMatrix[cnvMatrix[,"Segment_Mean"] < –0.3, "Label" ] <– 0
 66	cnvMatrix[cnvMatrix[,"Segment_Mean"] > 0.3,"Label"] <– 1
 67	cnvMatrix <– cnvMatrix[!is.na(cnvMatrix$Label),]
 68
 69	 # Remove " Segment_Mean" and change col.names
 70	cnvMatrix <–cnvMatrix[,–6]
 71	 colnames(cnvMatrix) <– c( "Sample.Name", "Chromosome", "Start", "End", "Num.of.Markers", "Aberration")
 72
 73	 # Substitute Chromosomes "X" and "Y" with "23" and "24"
 74	xidx <– which(cnvMatrix$Chromosome=="X")
 75	yidx <– which(cnvMatrix$Chromosome=="Y")
 76     cnvMatrix[xidx,"Chromosome"] <– 23
 77     cnvMatrix[yidx,"Chromosome"] <- 24
 78     cnvMatrix$Chromosome <- sapply(cnvMatrix$Chromosome,as.integer)
 79
 80      # Recurrent CNV identification with GAIA
 81
 82      # Retrieve probes meta file from broadinstitute website
 83      # Recurrent CNV identification with GAIA
 84     gdac.root <- "ftp://ftp.broadinstitute.org/pub/GISTIC2.0/hg19_support/"
 85      file <- paste0(gdac.root, "genome.info.6.0_hg19.na31_minus_frequent_nan_probes_sorted_2.1.txt")
 86      # Retrieve probes meta file from broadinstitute website
 87      if(!file.exists(basename(file))) download(file, basename(file))
 88     markersMatrix <- readr::read_tsv(basename(file), col_names = FALSE, col_types = "ccn", progress = TRUE)
 89      colnames(markersMatrix) <- c("Probe.Name", "Chromosome", "Start")
 90      unique(markersMatrix$Chromosome)
 91     xidx <- which(markersMatrix$Chromosome=="X")
 92     yidx <- which(markersMatrix$Chromosome=="Y")
 93     markersMatrix[xidx,"Chromosome"] <- 23
 94     markersMatrix[yidx,"Chromosome"] <- 24
 95     markersMatrix$Chromosome <- sapply(markersMatrix$Chromosome,as.integer)
 96     markerID <- apply(markersMatrix,1,function(x) paste0(x[2],":",x[3]))
 97      print(table(duplicated(markerID)))
 98      ## FALSE    TRUE
 99      ## 1831041     186
100      # There are 186 duplicated markers
101      print(table(duplicated(markersMatrix$Probe.Name)))
102      ## FALSE
103      ## 1831227
104      #  ... with different names!
105      # Removed duplicates
106     markersMatrix <- markersMatrix[-which(duplicated(markerID)),]
107      # Filter markersMatrix for common CNV
108     markerID <- apply(markersMatrix,1,function(x) paste0(x[2],":",x[3]))
109
110      file <- paste0(gdac.root, "CNV.hg19.bypos.111213.txt")
111      if(!file.exists(basename(file))) download(file, basename(file))
112     commonCNV <- readr::read_tsv(basename(file), progress = TRUE)
113     commonID <- apply(commonCNV,1,function(x) paste0(x[2],":",x[3]))
114      print(table(commonID %in% markerID))
115      print(table(markerID %in% commonID))
116     markersMatrix_fil <- markersMatrix[!markerID %in% commonID,]
117
118     markers_obj <– load_markers(as.data.frame(markersMatrix_fil))
119     nbsamples <– length(get(paste0("query.",tolower(cancer),".nocnv"))$results[[1]]$cases)
120     cnv_obj <– load_cnv(cnvMatrix, markers_obj, nbsamples)
121     results <– runGAIA(cnv_obj,
122   			   markers_obj,
123   			   output_file_name=paste0("GAIA_",cancer,"_flt.txt"),
124   	        aberrations = –1,
125   			   chromosomes = –1,
126   	        num_iterations = 10,
127   	        threshold = 0.25)
128
129      # Set q–value threshold
130     threshold <– 0.0001
131
132      # Plot the results
133     RecCNV <– t(apply(results,1,as.numeric))
134      colnames(RecCNV) <– colnames(results)
135     RecCNV <– cbind(RecCNV, score=0)
136     minval <– format(min(RecCNV[RecCNV[,"q–value"]!=0,"q–value"]),scientific =FALSE)
137     minval <– substring(minval,1, nchar(minval)–1)
138     RecCNV[RecCNV[,"q–value"]==0,"q–value"] <– as.numeric(minval)
139     RecCNV[,"score"] <– sapply(RecCNV[,"q–value"],function(x) –log10(as.numeric(x)))
140     RecCNV[RecCNV[,"q–value"]==as.numeric(minval),]
141
142     gaiaCNVplot(RecCNV,cancer,threshold)
143      save(results, RecCNV, threshold, file = paste0(cancer,"_CNV_results.rda"))
144     message(paste0("Results saved as:", cancer,"_CNV_results.rda"))
145 }

Listing 10. Recurrent CNV identification in cancer with GAIA

Recurrent amplifications and deletions were identified for both LGG (Figure 1a) and GBM (Figure 1b), and represented in chromosomal overview plots by a statistical score (–log10 corrected p-value for amplifications and log10 corrected p-value for deletions). Genomic regions identified as significantly altered in copy number (corrected p-value < 10–4) were then annotated to report amplified and deleted genes potentially related with cancer.

777640db-df55-46f8-b787-fc3069f80ac8_figure1.gif

Figure 1. Recurrent CNV (|score threshold| = 4).

Gene annotation of recurrent CNV. The aberrant recurrent genomic regions in cancer, as identified by GAIA, have to be annotated to verify which genes are significantly amplified or deleted. Using biomaRt we retrieved the genomic ranges of all human genes and we compared them with significant aberrant regions to select full length genes. An example of the result is shown in Table 1.

Table 1. Chromosome 20 recurrent deleted genes in LGG.

GeneSymbolAberrationq-valueAberrantRegionGeneRegion
1EIF4E2P1Del5.74967741935484e-0520:20540891-2100524620:20659710-20659964
2LLPHP1Del5.74967741935484e-0520:20540891-2100524620:20721187-20721879
3RN7SL607PDel5.74967741935484e-0520:20540891-2100524620:20738433-20738731
4MRPS11P1Del5.74967741935484e-0520:20540891-2100524620:20854121-20854642
5RPL24P2Del5.74967741935484e-0520:21091497-2122021220:21114723-21115197

 1 ##############################
 2 ## Recurrent CNV annotation ##
 3 ##############################
 4 library(biomaRt)
 5 library(GenomicRanges)
 6
 7 mart <– useMart(biomart="ensembl", dataset="hsapiens_gene_ensembl")
 8 genes <– getBM(attributes = c("hgnc_symbol", "chromosome_name","start_position","end_position"),
 9	    mart=mart)
10 genes <– genes[genes[,1]!="" & genes[,2]%in%c(1:22,"X","Y"),]
11 xidx <– which(genes[,2]=="X")
12 yidx <– which(genes[,2]=="Y")
13 genes[xidx, 2] <– 23
14 genes[yidx, 2] <– 24
15 genes[,2] <– sapply(genes[,2],as.integer)
16 genes <– genes[order(genes[,3]),]
17 genes <– genes[order(genes[,2]),]
18 colnames(genes) <– c("GeneSymbol","Chr","Start","End")
19 genes_GR <– makeGRangesFromDataFrame(genes,keep.extra.columns = TRUE)
20
21 for(cancer in c("LGG","GBM")){
22      load(paste0(cancer,"_CNV_results.rda"))
23     sCNV <– RecCNV[RecCNV[,"q–value"]<=threshold,c(1:4,6)]
24     sCNV <– sCNV[order(sCNV[,3]),]
25     sCNV <– sCNV[order(sCNV[,1]),]
26      colnames(sCNV) <– c("Chr","Aberration","Start","End","q–value")
27     sCNV_GR <– makeGRangesFromDataFrame(sCNV,keep.extra.columns = TRUE)
28
29     hits <– findOverlaps(genes_GR, sCNV_GR, type="within")
30     sCNV_ann <– cbind(sCNV[subjectHits(hits),],genes[queryHits(hits),])
31     AberrantRegion <– paste0(sCNV_ann[,1],":",sCNV_ann[,3],"–",sCNV_ann[,4])
32     GeneRegion <– paste0(sCNV_ann[,7],":",sCNV_ann[,8],"–",sCNV_ann[,9])
33     AmpDel_genes <– cbind(sCNV_ann[,c(6,2,5)],AberrantRegion,GeneRegion)
34     AmpDel_genes[AmpDel_genes[,2]==0,2] <– "Del"
35     AmpDel_genes[AmpDel_genes[,2]==1,2] <– "Amp"
36      rownames(AmpDel_genes) <– NULL
37
38      save(RecCNV, AmpDel_genes, file = paste0(cancer,"_CNV_results.rda"))
39 }

Listing 11. Gene annotation of recurrent CNV

Visualizing multiple genomic alteration events. In order to visualize multiple genomic alteration events we recommend using OncoPrint plot which is provided by Bioconductor package complexHeatmap30. The Listing 12 shows how to download mutation data using GDCquery_maf (line 4), then we filtered the genes to obtain genes with mutations found among glioma specific pathways (lines 6 – 12). The following steps prepared the data into a matrix to fit oncoPrint function. We defined SNPs as blue, insertions as green and deletions as red. The upper barplot indicates the number of genetic mutation per patient, while the right barplot shows the number of genetic mutations per gene. Also, it is possible to add annotations to rows or columns. For the columns, an insertion made at the top will remove the barplot. The final result for adding the annotation to the bottom is highlighted in Figure 2.

 1 library(ComplexHeatmap)
 2 library(TCGAbiolinks)
 3
 4 LGGmut <– GDCquery_Maf(tumor = "LGG", pipelines = "mutect2")
 5 GBMmut <– GDCquery_Maf(tumor = "GBM", pipelines = "mutect2")
 6
 7 mut <– plyr::rbind.fill(LGGmut,GBMmut)
 8 
 9 # Filtering mutations in gliomas 
10 EA_pathways <– TCGAbiolinks:::listEA_pathways
11 Glioma_pathways <– EA_pathways[grep("glioma", tolower(EA_pathways$Pathway)),]
12 Glioma_signaling <– Glioma_pathways[Glioma_pathways$Pathway == "Glioma Signaling",]
13 Glioma_signaling_genes <– unlist(strsplit(as.character(Glioma_signaling$Molecules),","))
14
15 mut <– mut[mut$Hugo_Symbol %in% Glioma_signaling_genes,]
16
17 samples <– unique(mut$Tumor_Sample_Barcode)
18 genes <– unique(mut$Hugo_Symbol)
19 mat <– matrix(0,length(genes),length(samples))
20 colnames(mat) <– samples
21 rownames(mat) <– genes
22
23 pb <– txtProgressBar(min = 0, max = nrow(mat), style = 3)
24
25 for(i in 1:nrow(mat)) {
26     curGene <– rownames(mat)[i]
27     setTxtProgressBar(pb, i)
28      for(j in 1:ncol(mat)) {
29         curSample <– colnames(mat)[j]
30
31          if(length(intersect(mut$Tumor_Sample_Barcode, curSample))==1){
32             mat1 <– mut[mut$Tumor_Sample_Barcode == curSample,]
33               if(length(intersect(mat1$Hugo_Symbol, curGene))==1){
34                 mat3 <– mat1[mat1$Hugo_Symbol == curGene,]
35                   mat[curGene,curSample]<– as.character(mat3$Variant_Type)[1]
36             }
37         }
38    }
39 }
40 close(pb)
41
42 mat[mat==0] <– ""
43 colnames(mat) <– substr(colnames(mat),1,12)
44
45 mat[is.na(mat)] = ""
46 mat[1:3, 1:3]
47
48 alter_fun = list(
49     background = function(x, y, w, h) {
50          grid.rect(x, y, w–unit(0.5, "mm"), h–unit(0.5, "mm"), gp = gpar(fill = "#CCCCCC", col = NA))
51     },
52     SNP = function(x, y, w, h) {
53          grid.rect(x, y, w–unit(0.5, "mm"), h–unit(0.5, "mm"), gp = gpar(fill = "blue", col = NA))
54     },
55     DEL = function(x, y, w, h) {
56          grid.rect(x, y, w-unit(0.5, "mm"), h-unit(0.5, "mm"), gp = gpar(fill = "red", col = NA))
57     },
58     INS = function(x, y, w, h) {
59          grid.rect(x, y, w-unit(0.5, "mm"), h0.33, gp = gpar(fill = "#008000", col = NA))
60     }
61 )
62
63 col = c("INS" = "#008000", "DEL" = "red", "SNP" = "blue")
64
65 clin.gbm <– GDCquery_clinic("TCGA–GBM", "Clinical")
66 clin.lgg <– GDCquery_clinic("TCGA–LGG", "Clinical")
67 clinical <– plyr::rbind.fill(clin.lgg,clin.gbm)
68 annotation <– clinical[match(colnames(mat),clinical$bcr_patient_barcode),
69			    c("disease","vital_status","ethnicity")]
70 annotation <– HeatmapAnnotation(annotation_height = rep(unit(0.3, "cm"),ncol(annotation)),
71	                               df = annotation,
72      	                       col = list(disease = c("LGG"="green",
73				      "GBM"="orange"),
74                                     	      vital_status = c("alive"="blue",
75				     "dead"="red",
76				     "not reported"="grey"),
77 	       ethnicity = c("hispanic or latino"="purple",
78				"not hispanic or latino"="black",
79		   "not reported" = "grey")),
80       	                 annotation_legend_param = list(title_gp = gpar(fontsize = 16,
       fontface = "bold"),
81                                                                     labels_gp = gpar(fontsize = 16), #
        size labels
82                                                                     grid_height = unit(8, "mm")))
83
84 pdf("LGG_GBM_oncoprint.pdf",width = 20,height = 20)
85 p <– oncoPrint(mat, get_type = function(x) strsplit(x, ";")[[1]],
86            remove_empty_columns = FALSE,
87           column_order = NULL, # Do not sort the columns
88           alter_fun = alter_fun, col = col,
89            row_names_gp = gpar(fontsize = 16),  # set size for row names
90           pct_gp = gpar(fontsize = 16), # set size for percentage labels
91            axis_gp = gpar(fontsize = 16),# size of axis
92           column_title = "OncoPrint for TCGA LGG, genes in Glioma signaling",
93           column_title_gp = gpar(fontsize = 22),
94           pct_digits = 2,
95            row_barplot_width = unit(4, "cm"), #size barplot
96           bottom_annotation = annotation,
97           heatmap_legend_param = list(title = "Mutations", at = c("DEL", "INS", "SNP"),
98                                            labels = c("DEL", "INS", "SNP"),
99                                            title_gp = gpar(fontsize = 16, fontface = "bold"),
100                                           labels_gp = gpar(fontsize = 16), # size labels
101                                           grid_height = unit(8, "mm")
102          )
103 )
104 draw(p, annotation_legend_side = "bottom")
105 dev.off()

Listing 12. Oncoprint

777640db-df55-46f8-b787-fc3069f80ac8_figure2.gif

Figure 2. Oncoprint for LGG samples.

Blue defines SNP, green defines insertions and red defines deletions. The upper barplot shows the number of these genetic mutations for each patient, while the right barplot shows the number of genetic mutations for each gene. The bottom bar shows the group of each sample.

Overview of genomic alterations by circos plot

Genomic alterations in cancer, including CNV and mutations, can be represented in an effective overview plot named circos. We used circlize CRAN package to represent significant CNV (resulting from GAIA analysis) and recurrent mutations (selecting curated genetic variations retrieved from TCGA that are identified in at least two tumor samples) in LGG. Circos plot can illustrate molecular alterations genome-wide or only in one or more selected chromosomes. The Figure 3 shows the resulting circos plot for all chromosomes, while the Figure 4 shows the plot for only the chromosome 17.

  1 ###############################################
  2 ## Genomic aberration overview – Circos plot ##
  3 ###############################################
  4
  5 # Retrieve curated mutations for selected cancer (e.g. "LGG")
  6 library(TCGAbiolinks)
  7 mut <- GDCquery_Maf(tumor = "LGG")
  8 # Select only potentially damaging mutations
  9 mut <- mut[mut$Variant_ Classification %in% c("Missense_Mutation","Nonsense_Mutation","Nonstop_
          Mutation","Frame_Shift_Del","Frame_Shift_Ins"),]
 10 # Select recurrent mutations (identified in at least two samples)
 11 mut.id <- paste0(mut$Chromosome,":",mut$Start_position,"–",mut$End_position,"|",mut$Reference_Allele)
 12 mut <- cbind(mut.id, mut)
 13 numSamples <- table(mut.id)
 14 s.mut <- names(which(numSamples>=2))
 15 # Prepare selected mutations data for circos plot
 16 s.mut <- mut[mut$mut.id %in% s.mut,]
 17 s.mut <- s.mut[,c("Chromosome","Start_position","End_position","Variant_Classification","Hugo_Symbol"
          )]
 18 s.mut <- unique(s.mut)
 19 s.mut[,1] <- as.character(s.mut[,1])
 20 s.mut[,4] <- as.character(s.mut[,4])
 21 s.mut[,5] <- as.character(s.mut[,5])
 22 typeNames <- unique(s.mut[,4])
 23 type <- c(4:1)
 24 names(type) <- typeNames[1:4]
 25 Type <- type[s.mut[,4]]
 26 s.mut <- cbind(s.mut,Type)
 27 s.mut <- s.mut[,c(1:3,6,4,5)]
 28
 29 # Load recurrent CNV data for selected cancer (e.g. "LGG")
 30 load("LGG_CNV_results.rda")
 31 # Prepare selected sample CNV data for circos plot
 32 s.cnv <- as.data.frame(RecCNV[RecCNV[,"q—value"]<=10^—4,c(1:4,6)])
 33 s.cnv <- s.cnv[,c(1,3,4,2)]
 34 xidx <- which(s.cnv$Chromosome==23)
 35 yidx <- which(s.cnv$Chromosome==24)
 36 s.cnv[xidx,"Chromosome"] <- "X"
 37 s.cnv[yidx,"Chromosome"] <- "Y"
 38 Chromosome <- sapply(s.cnv[,1],function(x) paste0("chr",x))
 39 s.cnv <- cbind(Chromosome, s.cnv[,-1])
 40 s.cnv[,1] <- as.character(s.cnv[,1])
 41 s.cnv[,4] <- as.character(s.cnv[,4])
 42 s.cnv <- cbind(s.cnv,CNV=1)
 43 colnames(s.cnv) <- c("Chromosome","Start_position","End_position","Aberration_Kind","CNV")
 44
 45 # Draw genomic circos plot
 46 library(circlize)
 47 pdf("CircosPlot.pdf",width=15,height=15)
 48 par(mar=c(1,1,1,1), cex=1)
 49 circos.initializeWithIdeogram()
 50 # Add CNV results
 51 colors <- c("forestgreen","firebrick")
 52 names(colors)  <- c(0,1)
 53 circos.genomicTrackPlotRegion(s.cnv,  ylim = c(0,1.2),
 54                                   panel.fun = function(region, value, ...) {
 55				      circos.genomicRect(region, value, ytop.column = 2, ybottom = 0,
 56   								col = colors[value[[1]]],
 57						         border="white")
 58				      cell.xlim = get.cell.meta.data("cell.xlim")
 59				      circos.lines(cell.xlim, c(0, 0), lty = 2, col = "#00000040")
 60				  })
 61 # Add mutation results
 62 colors <- c("blue","green","red","gold")
 63 names(colors)  <- typeNames[1:4]
 64 circos.genomicTrackPlotRegion(s.mut, ylim = c(1.2,4.2),
 65				      panel.fun = function(region, value, ...) {
 66				      circos.genomicPoints(region, value, cex = 0.8, pch = 16, col = 
          colors[value[[2]]], ...)
 67				  })
 68
 69 circos.clear()
 70
 71 legend(−0.2, 0.2, bty="n", y.intersp=1, c("Amp","Del"), pch=15, col=c("firebrick","forestgreen"), 
          title="CNVs", text.font=3, cex=1.2, title.adj=0)
 72 legend(–0.2, 0, bty="n", y.intersp=1, names(colors), pch=16, col=colors, title="Mutations", text.font
         =3, cex=1.2, title.adj=0)
 73 dev.off()
 74
 75 # Draw single chromosome circos plot (e.g. "Chr 17")
 76 pdf("CircosPlotChr17.pdf",width=18,height=13)
 77 par(mar=c(1,1,1,1),cex=1.5)
 78 circos.par("start.degree" = 90, canvas.xlim = c(0, 1), canvas.ylim = c(0, 1),
 79            gap.degree = 270, cell.padding = c(0, 0, 0, 0), track.margin = c(0.005, 0.005))
 80 circos.initializeWithIdeogram(chromosome.index = "chr17")
 81 circos.par(cell.padding = c(0, 0, 0, 0))
 82 # Add CNV results
 83 colors <- c("forestgreen","firebrick")
 84 names(colors)  <- c(0,1)
 85 circos.genomicTrackPlotRegion(s.cnv,  ylim = c(0,1.2),
 86				      panel.fun = function(region, value, ...) {
 87                                   circos.genomicRect(region, value, ytop.column = 2, ybottom = 0,
 88							  	col = colors[value[[1]]],
 89						         border="white")
 90                                   cell.xlim = get.cell.meta.data("cell.xlim")
 91                                   circos.lines(cell.xlim, c(0, 0), lty = 2, col = "#00000040")
 92				  })
 93
 94 # Add mutation results representing single genes
 95 genes.mut <- paste0(s.mut$Hugo_Symbol,"–",s.mut$Type)
 96 s.mutt <- cbind(s.mut,genes.mut)
 97 n.mut <- table(genes.mut)
 98 idx <- !duplicated(s.mutt$genes.mut)
 99 s.mutt <- s.mutt[idx,]
100 s.mutt <- cbind(s.mutt,num=n.mut[s.mutt$genes.mut])
101 genes.num <- paste0(s.mutt$Hugo_Symbol," (",s.mutt$num.Freq,")")
102 s.mutt <- cbind(s.mutt[,–c(6:8)],genes.num)
103 s.mutt[,6] <- as.character(s.mutt[,6])
104 s.mutt[,4] <- s.mutt[,4]/2
105 s.mutt$num.Freq <- NULL
106 colors <- c("blue","green","red","gold")
107 names(colors)  <- typeNames[1:4]
108 circos.genomicTrackPlotRegion(s.mutt, ylim = c(0.3,2.2), track.height = 0.05,
109                                   panel.fun = function(region, value, ...) {
110                                   circos.genomicPoints(region, value, cex = 0.8, pch = 16, col = 
          colors[value[[2]]], ...)
111                               })
112
113 circos.genomicTrackPlotRegion(s.mutt, ylim = c(0, 1), track.height = 0.1, bg.border = NA)
114 i_track = get.cell.meta.data("track.index")
115
116 circos.genomicTrackPlotRegion(s.mutt, ylim = c(0,1),
117                                   panel.fun = function(region, value, ...) {
118                                   circos.genomicText(region, value,
119                                                      y = 1,
120                                                             labels.column = 3,
121                                                             col = colors[value[[2]]],
122                                                      facing = "clockwise", adj = c(1, 0.5),
123                                                      posTransform = posTransform.text, cex = 1.5,
         niceFacing = T)
124                               }, track.height = 0.1, bg.border = NA)
125
126 circos.genomicPosTransformLines(s.mutt,
127                                 posTransform = function(region, value)
128                                     posTransform.text(region,
129                                                       y = 1,
130                                                              labels = value[[3]],
131                                                       cex = 0.8, track.index = i_track+1),
132                                 direction = "inside", track.index = i_track)
133
134 circos.clear()
135
136 legend(0.25, 0.2, bty="n", y.intersp=1, c("Amp","Del"), pch=15, col=c("firebrick","forestgreen"),
          title="CNVs", text.font=3, cex=1.3, title.adj=0)
137 legend(0, 0.2, bty="n", y.intersp=1, names(colors), pch=16, col=colors, title="Mutations", text.font
         =3, cex=1.3, title.adj=0)
138 dev.off()

Listing 13. Genomic aberration overview by circos plot

Transcriptomic analysis

Pre-Processing Data. The LGG and GBM data used for following transcriptomic analysis were downloaded using TCGAbiolinks. We downloaded only primary solid tumor (TP) samples, which resulted in 516 LGG samples and 156 GBM samples, then prepared it in two separate rse objects (RangedSummarizedExperiment) saving them as an R object with a file name including both the name of the cancer and the name of the platform used for gene expression data (see Listing 14).

777640db-df55-46f8-b787-fc3069f80ac8_figure3.gif

Figure 3. Circos plot of recurrent CNVs and mutations in LGG.

777640db-df55-46f8-b787-fc3069f80ac8_figure4.gif

Figure 4. Circos plot of chromosome 17 recurrent CNVs and mutations in LGG.

 1 library(TCGAbiolinks)
 2
 3 query <- GDCquery(project = "TCGA-GBM",
 4                     data.category = "Gene expression",
 5                     data.type = "Gene expression quantification",
 6                   platform = "Illumina HiSeq",
 7                     file.type = "results",
 8                     sample.type = c("Primary solid Tumor"),
 9                   legacy = TRUE)
10 GDCdownload(query)
11 gbm.exp <- GDCprepare(query,
12                          save = TRUE,
13                       summarizedExperiment = TRUE,
14                          save.filename = "GBMIllumina_HiSeq.rda")
15
16 query <- GDCquery(project = "TCGA-LGG",
17                     data.category = "Gene expression",
18                     data.type = "Gene expression quantification",
19                   platform = "Illumina HiSeq",
20                     file.type = "results",
21                     sample.type = c("Primary solid Tumor"),
22                   legacy = TRUE)
23 GDCdownload(query)
24 lgg.exp <- GDCprepare(query, save = TRUE,
25                       summarizedExperiment = TRUE,
26                          save.filename = "LGGIllumina_HiSeq.rda")

Listing 14. Searching, downloading and preparing RNA-seq data with TCGAbiolinks

To pre-process the data, first, we searched for possible outliers using the TCGAanalyze_Preprocessing function, which performs an Array Array Intensity correlation AAIC (lines 14–17 and 26–29 of Listing 15). The Array-array intensity correlation plot (AAIC) is a re-adaptation of the function correlationPlot from the R/Bioconductor affyQCReport package31 that shows an heat map of the array-array Spearman/Pearson rank correlation coefficients. The arrays are ordered using the phenotypic data (if available) in order to place arrays with similar samples adjacent to each other. Self-self correlations are on the diagonal and by definition have a correlation coefficient of 1.0. Data from similar tissues or treatments will tend to have higher coefficients. This plot is useful for detecting outliers, failed hybridizations, or mistracked samples.

In our example, we defined a square symmetric matrix of Pearson correlation among all samples in each cancer type (LGG or GBM). This matrix found 0 samples with low correlation (cor.cut = 0.6) that can be identified as possible outliers.

Second, using the TCGAanalyze_Normalization function, which encompasses the functions of the EDASeq package, we normalized mRNA transcripts.

The TCGAanalyze_Normalization performs normalization using the following functions from EDASeq: newSeqExpressionSet, withinLaneNormalization, betweenLaneNormalization, counts. The within-lane normalization procedures to adjust for GC-content effect (or other gene-level effects) on read counts32. The between-lane normalization procedures to adjust for distributional differences between lanes (e.g., sequencing depth): global-scaling and full-quantile normalization33.

 1 library(TCGAbiolinks)
 2
 3 rse <- get(load("LGGIllumina_HiSeq.rda"))
 4 dataClin_LGG <- GDCquery_clinic("TCGA-LGG", "Clinical")
 5
 6 dataPrep_LGG <- TCGAanalyze_Preprocessing(object = rse,
 7                                            cor.cut = 0.6,
 8                                       datatype = "raw_count",
 9                                       filename = "LGG_IlluminaHiSeq_RNASeqV2.png")
10
11 rse <- get(load("GBMIllumina_HiSeq.rda"))
12 dataClin_GBM <- GDCquery_clinic("TCGA-GBM", "Clinical")
13
14 dataPrep_GBM <- TCGAanalyze_Preprocessing(object = rse,
15                                                cor.cut = 0.6,
16                                           datatype = "raw_count",
17                                           filename = "GBM_IlluminaHiSeq_RNASeqV2.png")
18
19 dataNorm <- TCGAanalyze_Normalization(tabDF = cbind(dataPrep_LGG, dataPrep_GBM),
20                                       geneInfo = geneInfo,
21                                       method = "gcContent")
22
23 dataFilt <- TCGAanalyze_Filtering(tabDF = dataNorm,
24                                   method = "quantile",
25                                   qnt.cut =  0.25)
26
27 save(dataFilt, file = paste0("LGG_GBM_Norm_IlluminaHiSeq.rda"))
28
29 dataFiltLGG <- subset(dataFilt, select = substr(colnames(dataFilt),1,12) %in% dataClin_LGG$bcr_
         patient_barcode)
30 dataFiltGBM <- subset(dataFilt, select = substr(colnames(dataFilt),1,12) %in% dataClin_GBM$bcr_
         patient_barcode)
31
32 dataDEGs <- TCGAanalyze_DEA(mat1 = dataFiltLGG,
33                             mat2 = dataFiltGBM,
34                             Cond1type = "LGG",
35                             Cond2type = "GBM",
36                             fdr.cut = 0.01 ,
37                             logFC.cut = 1,
38                             method = "glmLRT")

Listing 15. Normalizing mRNA transcripts and differential expression analysis with TCGAbiolinks

Using TCGAanalyze_DEA, we identified 2,901 differentially expressed genes (DEG) (log fold change >=1 and FDR < 1%) between 515 LGG and 155 GBM samples.

EA: enrichment analysis. In order to understand the underlying biological process of DEGs we performed an enrichment analysis using TCGAanalyze_EA_complete function (see Listing 16).

 1 ansEA <– TCGAanalyze_EAcomplete(TFname="DEA genes LGG Vs GBM", RegulonList = rownames(dataDEGs))
 2
 3 TCGAvisualize_EAbarplot(tf = rownames(ansEA$ResBP),
 4                         GOBPTab = ansEA$ResBP, GOCCTab = ansEA$ResCC,
 5                         GOMFTab = ansEA$ResMF, PathTab = ansEA$ResPat,
 6                         nRGTab = rownames(dataDEGs),
 7                         nBar = 20)

Listing 16. Enrichment analysis

TCGAanalyze_EAbarplot outputs a bar chart as shown in Figure 5 with the number of genes for the main categories of three ontologies (i.e., GO:biological process, GO:cellular component, and GO:molecular function).

777640db-df55-46f8-b787-fc3069f80ac8_figure5.gif

Figure 5. The plot shows canonical pathways significantly over-represented (enriched) by the DEGs (differentially expressed genes) with the number of genes for the main categories of three ontologies (GO:biological process, GO:cellular component, and GO:molecular function, respectively).

The most statistically significant canonical pathways identified in DEGs are listed according to their p-value corrected FDR (-Log10) (colored bars) and the ratio of listed genes found in each pathway over the total number of genes in that pathway (ratio, red line).

The Figure 5 shows canonical pathways significantly over-represented (enriched) by the DEGs. The most statistically significant canonical pathways identified in the DEGs are ranked according to their p-value corrected FDR (-Log10) (colored bars) and the ratio of list genes found in each pathway over the total number of genes in that pathway (ratio, red line).

PEA: Pathways enrichment analysis. To verify if the genes found have a specific role in a pathway, the Bioconductor package pathview34 can be used. Listing 17 shows an example how to use it. It can receive, for example, a named vector of gene with the expression level, the pathway.id which can be found in KEGG database, the species (’hsa’ for Homo sapiens) and the limits for the gene expression (see Figure 6).

777640db-df55-46f8-b787-fc3069f80ac8_figure6.gif

Figure 6. Pathways enrichment analysis : glioma pathway.

Red defines genes that are up-regulated and green defines genes that are down-regulated.

 1 GenelistComplete <– rownames(assay(rse,1))
 2
 3 # DEGs TopTable
 4 dataDEGsFiltLevel <– TCGAanalyze_LevelTab(dataDEGs,"LGG","GBM",
 5                                           dataFilt[,colnames(dataFiltLGG)],
 6                                           dataFilt[,colnames(dataFiltGBM)])
 7
 8 dataDEGsFiltLevel$GeneID <– 0
 9
10 # Converting Gene symbol to geneID
11 library(clusterProfiler)
12 eg = as.data.frame ( bitr(dataDEGsFiltLevel$mRNA,
13                         fromType="SYMBOL",
14                         toType="ENTREZID",
15                         OrgDb="org.Hs.eg.db"))
16 eg <– eg[!duplicated(eg$SYMBOL),]
17
18 dataDEGsFiltLevel <– dataDEGsFiltLevel[dataDEGsFiltLevel$mRNA %in% eg$SYMBOL,]
19
20 dataDEGsFiltLevel <– dataDEGsFiltLevel[order(dataDEGsFiltLevel$mRNA,decreasing=FALSE),]
21 eg <– eg[order(eg$SYMBOL,decreasing=FALSE),]
22
23 # table(eg$SYMBOL == dataDEGsFiltLevel$mRNA) should be TRUE
24 all(eg$SYMBOL == dataDEGsFiltLevel$mRNA)
25 dataDEGsFiltLevel$GeneID <– eg$ENTREZID
26
27 dataDEGsFiltLevel_sub <– subset(dataDEGsFiltLevel, select = c("GeneID", "logFC"))
28 genelistDEGs <– as.numeric(dataDEGsFiltLevel_sub$logFC)
29 names(genelistDEGs) <– dataDEGsFiltLevel_sub$GeneID
30
31 require("pathview")
32 # pathway.id: hsa05214 is the glioma pathway
33 # limit: sets the limit for gene expression legend and color
34 hsa05214 <–  pathview(gene.data  = genelistDEGs,
35                      pathway.id = "hsa05214",
36                      species    = "hsa",
37                      limit      = list(gene=as.integer(max(abs(genelistDEGs)))))

Listing 17. Pathways enrichment analysis with pathview package

The red genes are up-regulated and the green genes are down-regulated in the LGG samples compared to GBM.

Inference of gene regulatory networks. Starting with the set of differentially expressed genes, we infer gene regulatory networks using the following state-of-the art inference algorithms: ARACNE35, CLR36, MRNET37 and C3NET38. These methods are based on mutual inference and use different heuristics to infer the edges in the network. These methods have been made available via Bioconductor/CRAN packages (MINET39 and c3net38, respectively).

Many gene regulatory interactions have been experimentally validated and published. These ‘known’ interactions can be accessed using different tools and databases such as BioGrid40 or GeneMANIA41. However, this knowledge is far from complete and in most cases only contains a small subset of the real interactome. The quality assessment of the inferred networks can be carried out by comparing the inferred interactions to those that have been validated. This comparison results in a confusion matrix as presented in Table 2.

Table 2. Confusion matrix, comparing inferred network to network of validated interactions.

validatednot validated/non-existing
inferredTPFP
not inferredFNTN

Different quality measures can then be computed such as the false positive rate

fpr=FPFP+TN,
the true positive rate (also called recall)
tpr=TPTP+FN
and the precision
p=TPTP+FP.

The performance of an algorithm can then be summarized using ROC (false positive rate versus true positive rate) or PR (precision versus recall) curves.

A weakness of this type of comparison is that an edge that is not present in the set of known interactions can either mean that an experimental validation has been tried and did not show any regulatory mechanism or (more likely) has not yet been attempted.

In the following, we ran the nce on i) the 2,901 differentially expressed genes identified in Section “Transcriptomic analysis”.

Retrieving known interactions

As previously stated, different sources for protein-protein interactions are available (e.g. I2D, BioGrid database ). In this example, we obtained a set of known interactions from the BioGrid database, but the users can chose their preferred database.

 1 get.adjacency.biogrid <– function(tmp.biogrid, names.genes = NULL){
 2
 3   if(is.null(names.genes)){
 4      names.genes <– sort(union(unique(tmp.biogrid[,"Official.Symbol.Interactor.A"]),
 5      unique(tmp.biogrid[,"Official.Symbol.Interactor.B"])))
 6     ind <– seq(1,nrow(tmp.biogrid))
 7   }else{
 8     ind.A <– which(tmp.biogrid[,"Official.Symbol.Interactor.A"]%in%names.genes)
 9     ind.B <– which(tmp.biogrid[,"Official.Symbol.Interactor.B"]%in%names.genes)
10
11     ind <– intersect(ind.A, ind.B)
12   }
13
14    mat.biogrid <– matrix(0, nrow=length(names.genes), ncol=length(names.genes), dimnames=list(names.
         genes, names.genes))
15
16    for(i in ind){
17       mat.biogrid[tmp.biogrid[i,"Official.Symbol.Interactor.A"], tmp.biogrid[i,"Official.Symbol.
         Interactor.B"]] <– mat.biogrid[tmp.biogrid[i,"Official.Symbol.Interactor.B"], tmp.biogrid[i,"
         Official.Symbol.Interactor.A"]] <– 1
18   }
19    diag(mat.biogrid) <– 0
20
21    return(mat.biogrid)
22 }

There are 3,941 unique interactions between the 2,901 differentially expressed genes.

Using differentially expressed genes from TCGAbiolinks workflow

We start this analysis by inferring two gene regulatory networks (the corresponding number of edges are presented in Table 3) for the GBM data set and one gene set for the LGG data.

Table 3. Number of edges in the inferred gene regulatory networks; first two lines: networks inferred using 2,901 differentially expressed genes.

gene setinference algorithmaracnec3netclrmrnet
DEGBM5,9032,6781,718,3281,682,334
LGG4,4432,6841,939,1421,859,121

 1 ### plot details (colors & symbols)
 2 mycols<–c('#e41a1c','#377eb8','#4daf4a','#984ea3','#ff7f00','#ffff33','#a65628')
 3
 4 ### load network inference libraries
 5 library(minet)
 6 library(c3net)
 7
 8 ### deferentially identified genes using TCGAbiolinks
 9 names.genes.de <– rownames(dataDEGs)
10
11 ### read biogrid info
12 library(downloader)
13 file <– "http://thebiogrid.org/downloads/archives/Release%20Archive/BIOGRID–3.4.133/BIOGRID–ALL
        –3.4.133.tab2.zip"
14 download(file,basename(file))
15 unzip(basename(file),junkpaths =T)
16 tmp.biogrid <– read.csv(gsub("zip","txt",basename(file)), header=TRUE, sep="\t", stringsAsFactors=
        FALSE)
17 
18 net.biogrid.de <– get.adjacency.biogrid(tmp.biogrid, names.genes.de)
19
20 for(cancertype in c("LGG", "GBM")) {
21
22      if(cancertype == "GBM"){
23         mydata <– dataFiltGBM[names.genes.de, ]
24     }else if(cancertype == "LGG"){
25         mydata <– dataFiltLGG[names.genes.de, ]
26     }
27      ### infer networks
28     net.aracne <– minet(t(mydata), method = "aracne")
29     net.mrnet <– minet(t(mydata))
30     net.clr <– minet(t(mydata), method = "clr")
31     net.c3net <– c3net(mydata)
32
33      ### validate compared to biogrid network
34     tmp.val <– list(validate(net.aracne, net.biogrid.de), validate(net.mrnet, net.biogrid.de),
35                     validate(net.clr, net.biogrid.de), validate(net.c3net, net.biogrid.de))
36
37      ### plot roc and compute auc for the different networks
38     dev1 <– show.roc(tmp.val[[1]],cex=0.3,col=mycols[1],type="l")
39     res.auc <– auc.roc(tmp.val[[1]])
40	for(count in 2:length(tmp.val)){
41          show.roc(tmp.val[[count]],device=dev1,cex=0.3,col=mycols[count],type="l")
42         res.auc <– c(res.auc, auc.roc(tmp.val[[count]]))
43     }
44
45      legend("bottomright", legend=paste(c("aracne","mrnet","clr","c3net"), signif(res.auc,4), sep=": "),
46              col=mycols[1:length(tmp.val)],lty=1, bty="n" )
47      dev.copy2pdf(width=8,height=8,device = dev1, file = paste0("roc_biogrid_",cancertype,".pdf"))
48      save(net.aracne, net.mrnet, net.clr, net.c3net, file=paste0("nets_",cancertype,".RData"))
49
50 }

In Figure 7, the obtained ROC curve and the corresponding area under curve (AUC) are presented. It can be observed that CLR and MRNET perform best when comparing the inferred network with known interactions from the BioGrid database.

777640db-df55-46f8-b787-fc3069f80ac8_figure7.gif

Figure 7. ROC with corresponding AUC for inferred GBM networks compared to BioGrid interactions using 2901 genes.

Epigenetic analysis

The DNA methylation is an important component in numerous cellular processes, such as embryonic development, genomic imprinting, X-chromosome inactivation, and preservation of chromosome stability42.

In mammals DNA methylation is found sparsely but globally, distributed in definite CpG sequences throughout the entire genome; however, there is an exception. CpG islands (CGIs) which are short interspersed DNA sequences that are enriched for GC. These islands are normally found in sites of transcription initiation and their methylation can lead to gene silencing43.

Thus, the investigation of the DNA methylation is crucial to understanding regulatory gene networks in cancer as the DNA methylation represses transcription44. Therefore, the DMR (Differentially Methylation Region) detection can help us investigate regulatory gene networks.

This section describes the analysis of DNA methylation using the Bioconductor package TCGAbiolinks8. For this analysis, and due to the time required to perform it, we selected only 10 LGG samples and 10 GBM samples that have both DNA methylation data from Infinium HumanMethylation450 and gene expression from Illumina HiSeq 2000 RNA Sequencing Version 2 analysis (lines 1–56 of the Listing 18 describes how to make the data acquisition). We started by checking the mean DNA methylation of different groups of samples, then performed a DMR in which we search for regions of possible biological significance, (e.g., regions that are methylated in one group and unmethylated in the other). After finding these regions, they can be visualized using heatmaps.

Visualizing the mean DNA methylation of each patient. It should be highlighted that some pre-processing of the DNA methylation data was done. The DNA methylation data from the 450k platform has three types of probes cg (CpG loci), ch (non-CpG loci) and rs (SNP assay). The last type of probe can be used for sample identification and tracking and should be excluded for differential methylation analysis according to the ilumina manual. Therefore, the rs probes were removed (see Listing 18 lines 68). Also, probes in chromosomes X, Y were removed to eliminate potential artifacts originating from the presence of a different proportion of males and females45. The last pre-processing steps were to remove probes with at least one NA value (see Listing 18 lines 65).

After this pre-processing step and using the function TCGAvisualize_meanMethylation function, we can look at the mean DNA methylation of each patient in each group. It receives as argument a summarizedExperiment object with the DNA methylation data, and the arguments groupCol and subgroupCol which should be two columns from the sample information matrix of the summarizedExperiment object (accessed by the colData function) (see Listing 18 lines 70–74).

 1 #––––––––––––––––––––––––––––
 2 # Obtaining DNA methylation
 3 #––––––––––––––––––––––––––––
 4 library(TCGAbiolinks)
 5 library(stringr)
 6 # Samples
 7 matched_met_exp <– function(project, n = NULL){
 8      # get primary solid tumor samples: DNA methylation
 9     message("Download DNA methylation information")
10     met450k <- GDCquery(project = project,
11 			      data.category = "DNA methylation",
12			   platform = "Illumina Human Methylation 450",
13 			   legacy = TRUE,
14 			      sample.type = c("Primary solid Tumor"))
15     met450k.tp <-  met450k$results[[1]]$cases
16
17     # get primary solid tumor samples: RNAseq
18     message("Download gene expression information")
19     exp <- GDCquery(project = project,
20 			 data.category = "Gene expression",
21 			 data.type = "Gene expression quantification",
22                     platform = "Illumina HiSeq",
23 			 file.type =  "results",
24 			 sample.type = c("Primary solid Tumor"),
25 	               legacy = TRUE)
26     exp.tp <-  exp$results[[1]]$cases
27     print(exp.tp[1:10])
28     # Get patients with samples in both platforms
29     patients <– unique(substr(exp.tp,1,15)[substr(exp.tp,1,12) %in% substr(met450k.tp,1,12)])
30     if(!is.null(n)) patients <– patients[1:n] # get only n samples
31     return(patients)
32 }
33 lgg.samples <– matched_met_exp("TCGA–LGG", n = 10)
34 gbm.samples <– matched_met_exp("TCGA–GBM", n = 10)
35 samples <– c(lgg.samples,gbm.samples)
36
37
38 #–––––––––––––––––––––––––––––––––––
39 # 1 – Methylation
40 # ––––––––––––––––––––––––––––––––––
41 # For methylation it is quicker in this case to download the tar.gz file
42 # and get the samples we want instead of downloading files by files
43 query.lgg <- GDCquery(project = "TCGA-LGG",
44		            data.category = "DNA methylation",
45		         platform = "Illumina Human Methylation 450",
46 			 legacy = TRUE, barcode = lgg.samples)
47 GDCdownload(query.lgg)
48 met.lgg <-GDCprepare(query.lgg, save = FALSE)
49
50 query.gbm <- GDCquery(project = "TCGA-GBM",
51 			    data.category = "DNA methylation",
52			 platform = "Illumina Human Methylation 450",
53 			 legacy = TRUE, barcode = gbm.samples)
54 GDCdownload(query.gbm)
55 met.gbm <- GDCprepare(query.gbm, save = FALSE)
56 met <- SummarizedExperiment::cbind(met.lgg, met.gbm)
57
58 #––––––––––––––––––––––––––––
59 # Mean methylation
60 #––––––––––––––––––––––––––––
61 # Plot a barplot for the groups in the disease column in the
62 # summarizedExperiment object
63
64 # remove probes with NA (similar to na.omit)
65 met <– subset(met,subset = (rowSums(is.na(assay(met))) == 0))
66
67 # remove probes in chromossomes X, Y and NA
68 met <– subset(met,subset = !as.character(seqnames(met)) %in% c("chrNA","chrX","chrY"))
69
70 TCGAvisualize_meanMethylation(met,
71                               groupCol = "disease_type",
72                               group.legend  = "Groups",
73                               filename = "mean_lgg_gbm.png",
74                                   print.pvalue = TRUE)

Listing 18. Visualizing the DNA mean methylation of groups

Figure 8 illustrates a mean DNA methylation plot for each sample in the GBM group (140 samples) and a mean DNA methylation for each sample in the LGG group. Genome-wide view of the data highlights a difference between the groups of tumors (p-value = 6.1x10−06).

Searching for differentially methylated CpG sites. The next step is to define differentially methylated CpG sites between the two groups. This can be done using the TCGAanalyze_DMR function (see Listing 19). The DNA methylation data (level 3) is presented in the form of beta-values that uses a scale ranging from 0.0 (probes completely unmethylated) up to 1.0 (probes completely methylated).

To find these differentially methylated CpG sites, first, the function calculates the difference between the mean DNA methylation (mean of the beta-values) of each group for each probe. Second, it test for differential expression between two groups using the Wilcoxon test adjusting by the Benjamini-Hochberg method. Arguments of TCGAanalyze_DMR was set to require a minimum absolute beta-values difference of 0.25 and an adjusted p-value of less than 10−2.

777640db-df55-46f8-b787-fc3069f80ac8_figure8.gif

Figure 8. Boxplot of mean DNA methylation of each sample (black dots).

After these tests, a volcano plot (x-axis: difference of mean DNA methylation, y-axis: statistical significance) is created to help users identify the differentially methylated CpG sites and return the object with the results in the rowRanges. Figure 9 shows the volcano plot produced by Listing 19. This plot aids the user in selecting relevant thresholds, as we search for candidate biological DMRs.

 1 # Becareful! Depending on the number of probes and samples this function might take some days.
 2 # To make this example faster we used only the chromosome 9
 3 # This should take some minutes
 4 met.chr9 <– subset(met,subset = as.character(seqnames(met)) %in% c("chr9"))
 5
 6 met.chr9 <– TCGAanalyze_DMR(met.chr9,
 7                             groupCol = "disease_type", # a column in the colData matrix
 8                             group1 = "Glioblastoma Multiforme", # a type of the disease type column
 9                             group2= "Brain Lower Grade Glioma", # a type of the disease column
10                             p.cut = 10^–2,
11                             diffmean.cut = 0.25,
12                                legend = "State",
13                                plot.filename = "LGG_GBM_metvolcano.png",
14                             cores = 1 # if set to 1 there will be a progress bar
15 )

Listing 19. Finding differentially methylated CpG sites

777640db-df55-46f8-b787-fc3069f80ac8_figure9.gif

Figure 9. Volcano plot: searching for differentially methylated CpG sites (x-axis:difference of mean DNA methylation, y-axis: statistical significance).

To visualize the level of DNA methylation of these probes across all samples, we use heatmaps that can be generate by the bioconductor package complexHeatmap30. To create a heatmap using the complexHeatmap package, the user should provide at least one matrix with the DNA methylation levels. Also, annotation layers can be added and placed at the bottom, top, left side and right side of the heatmap to provide additional metadata description. The Listing 20 shows the code to produce the heatmap of a DNA methylation datum (Figure 10).

 1 #––––––––––––––––––––––––––
 2 # DNA methylation heatmap
 3 #–––––––––––––––––––––––––
 4 library(ComplexHeatmap)
 5
 6 clin.gbm <– GDCquery_clinic("TCGA-GBM", "Clinical")
 7 clin.lgg <– GDCquery_clinic("TCGA-LGG", "Clinical")
 8 clinical <– plyr::rbind.fill(clin.lgg, clin.gbm)
 9
10 # get the probes that are Hypermethylated or Hypomethylated
11 # met is the same object of the section 'DNA methylation analysis'
12 sig.met <– met.chr9[values(met.chr9)[,"status.Glioblastoma.Multiforme.Brain.Lower.Grade.Glioma"] %in%
	  c("Hypermethylated","Hypomethylated"),]
13
14 # To speed up the example, we will select no more than 100 probes
15 nb.probes <- ifelse(nrow(sig.met) > 100, 100, nrow(sig.met)) # If there is more than 100 get 100
16 sig.met.100 <– sig.met[1:nb.probes,]
17
18 # top annotation, which sampples are LGG and GBM
19 # We will add clinical data as annotation of the samples
20 # we will sort the clinical data to have the same order of the DNA methylation matrix
21 clinical.order <– clinical[match(substr(colnames(sig.met.100),1,12),clinical$bcr_patient_barcode),]
22 ta = HeatmapAnnotation(df = clinical.order[,c("disease","gender","vital_status","race")],
23                           col = list(disease = c("LGG" = "grey", "GBM" = "black"),
24                                   gender = c("male"="blue","female"="pink")))
25
26 # row annotation: add the status for LGG in relation to GBM
27 # For exmaple: status.gbm.lgg Hypomethyated means that the
28 # mean DNA methylation of probes for lgg are hypomethylated
29 # compared to GBM ones.
30 ra = rowAnnotation(df = values(sig.met.100)["status.Glioblastoma.Multiforme.Brain.Lower.Grade.Glioma"],
31                      col = list("status.Glioblastoma.Multiforme.Brain.Lower.Grade.Glioma" = 
         c("Hypomethylated" = "orange",
32                     					  "Hypermethylated" = "darkgreen")),
33                    width = unit(1, "cm"))
34
35 heatmap <– Heatmap(assay(sig.met.100),
36                    name = "DNA methylation",
37                       col = matlab::jet.colors(200),
38                       show_row_names = F,
39                    cluster_rows = T,
40                    cluster_columns = F,
41			 show_column_names = F,
42                    bottom_annotation = ta,
43                    column_ title = "DNA methylation") 
44 # Save to pdf
45 pdf("heatmap.pdf",width = 10, height = 8)
46 draw(heatmap, annotation_legend_side =  "bottom")
47 dev.off()

Listing 20. Creating heatmaps for DNA methylation using ComplexHeatmap

777640db-df55-46f8-b787-fc3069f80ac8_figure10.gif

Figure 10. Heatmap of DNA methylation in probes.

Rows are probes and columns are samples (patients). The DNA methylation values range from 0.0 (completely DNA unmethylated, blue) to 1.0 (completely DNA methylated, red). The groups of each sample were annotated in the top bar and the DNA methylation status for each probe was annotated in the right bar.

Motif analysis. Motif discovery is the attempt to extract small sequence signals hidden within largely non-functional intergenic sequences. These small sequence nucleotide signals (6–15 bp) might have a biological significance as they can be used to control the expression of genes. These sequences are called Regulatory motifs. The bioconductor package rGADEM46,47 provides an efficient de novo motif discovery algorithm for large-scale genomic sequence data.

The user may be interested in looking for unique signatures in the regions defined by ‘differentially methylated’ to identify candidate transcription factors that could bind to these elements affected by the accumulation or absence of DNA methylation. For this analysis we use a sequence of 100 bases before and after the probe location (See lines 6–8 in the Listing 21). An object will be returned which contains all relevant information about your motif analysis (i.e., sequence consensus, pwm, chromosome, p-value, etc).

Using bioconductor package motifStack48 it is possible to generate a graphic representation of multiple motifs with different similarity scores (see Figure 11).

 1 library(rGADEM)
 2 library(BSgenome.Hsapiens.UCSC.hg19)
 3 library(motifStack)
 4
 5 probes <– rowRanges(met.chr9)[values(met.chr9)[,"status.Glioblastoma.Multiforme.Brain.Lower.Grade.
        Glioma"]%in% c("Hypermethylated","Hypomethylated"),]
 6 # Get hypo/hyper methylated probes and make a 200bp window
 7 # surrounding each probe.
 8 sequence <– RangedData(space=as.character(probes@seqnames),
 9                        IRanges(start=probes@ranges@start – 100,
10                                   end=probes@ranges@start + 100), strand="")
11 #look for motifs
12 gadem <– GADEM(sequence, verbose=FALSE, genome=Hsapiens)
13
14 # How many motifs were found?
15 length(gadem@motifList)
16
17 # get the number of occurences
18 nOccurrences(gadem)
19
20 # view all sequences consensus
21 consensus(gadem)
22
23 # print motif
24 pwm <– getPWM(gadem)
25 pfm  <– new("pfm",mat=pwm[[1]],name="Novel Site 1")
26 plotMotifLogo(pfm)
27
28 # Number of instances of motif 1?
29 length(gadem@motifList[[1]]@alignList)

Listing 21. rGADEM: de novo motif discovery

777640db-df55-46f8-b787-fc3069f80ac8_figure11.gif

Figure 11. Motif logos found during de-novo motif analysis.

After rGADEM returns it’s results, the user can use MotIV package4952 to start the motif matching analysis (line 4 of Listing 22). The result is shown in Figure 12.

 1 library(MotIV)
 2
 3 analysis.jaspar <– motifMatch(pwm)
 4 summary(analysis.jaspar)
 5 plot(analysis.jaspar, ncol=1, top=5, rev=FALSE,
 6      main="", bysim=TRUE, cex=0.3)
 7
 8 # visualize the quality of the results around the alignments
 9 # E–value give an estimation of the match.
10 alignment <– viewAlignments(analysis.jaspar )
11 print(alignment[[1]])

Listing 22. MotIV: motifs matches analysis.

777640db-df55-46f8-b787-fc3069f80ac8_figure12.gif

Figure 12. Identified transcription factors: the sequence logo, the name of the motif match and the p-value of the alignment.

Integrative (Epigenomic & Transcriptomic) analysis

Recent studies have shown that providing a deep integrative analysis can aid researchers in identifying and extracting biological insight from high through put data42,53,54. In this section, we will introduce a Bioconductor package called ELMER to identify regulatory enhancers using gene expression + DNA methylation data + motif analysis. In addition, we show how to integrate the results from the previous sections with important epigenomic data derived from both the ENCODE and Roadmap.

Integration of DNA methylation & gene expression data. After finding differentially methylated CpG sites, one might ask whether nearby genes also undergo a change in expression either an increase or a decrease. DNA methylation at promoters of genes has been shown to be associated with silencing of the respective gene. The starburst plot is proposed to combine information from two volcano plots and is applicable for studies of DNA methylation and gene expression55. Even though, being desirable that both gene expression and DNA methylation data are from the same samples, the starburst plot can be applied as a meta-analysis tool, combining data from different samples56. We used the TCGAvisualize_starburst function to create a starburst plot. The log10 (FDR-corrected P value) for DNA methylation is plotted on the x axis, and for gene expression on the y axis, for each gene. The horizontal black dashed line shows the FDR-adjusted P value of 10–2 for the expression data and the vertical ones shows the FDR-adjusted P value of 10–2 for the DNA methylation data. The starburst plot for the Listing 23 is shown in Figure 13. While the argument met.p.cut and exp.p.cut controls the black dashed lines, the arguments diffmean.cut and logFC.cut will be used to highlight the genes that respects these parameters (circled genes in Figure 13). For the example below we set higher p.cuts trying to get the most significant list of pair gene/probes. But for the next sections we will use exp.p.cut = 0.01 and logFC.cut = 1 as the previous sections.

 1 #------------------- Starburst plot ------------------------------
 2 starburst <– TCGAvisualize_starburst(met.chr9,    # DNA methylation with results
 3                                      dataDEGs,    # DEG results
 4                                      group1 = "Glioblastoma Multiforme",
 5                                      group2 = "Brain Lower Grade Glioma",
 6                                      filename = "starburst.png",
 7                                      met.p.cut = 10^−2,
 8                                          exp.p.cut = 10^−2,
 9                                      diffmean.cut = 0.25,
10                                      logFC.cut = 1,width = 15,height = 10,
11                                          names = TRUE)

Listing 23. Starburst plot for comparison of DNA methylation and gene expression

777640db-df55-46f8-b787-fc3069f80ac8_figure13.gif

Figure 13. Starburst plot: x-axis is the log10 of the correct P-value for DNA methylation and the y-axis is the log10 of the correct P-value for the expression data.

The starburst plot highlights nine distinct quadrants. Highlighted genes might have the potential for activation due to epigenetic alterations.

ChIP-seq analysis. ChIP-seq is used primarily to determine how transcription factors and other chromatin-associated proteins influence phenotype-affecting mechanisms. Determining how proteins interact with DNA to regulate gene expression is essential for fully understanding many biological processes and disease states. The aim is to explore significant overlap datasets for inferring co-regulation or transcription factor complex for further investigation. A summary of the association of each histone mark is shown in Table 4. Besides, ChIP-seq data exists in the ROADMAP database and can be obtained through the AnnotationHub package57 or from Roadmap web portal. The Table 5 shows the description for all the Roadmap files that are available through AnnotationHub. After obtaining the ChIP-seq data, we can then identify overlapping regions with the regions identified in the starburst plot. The narrowPeak files are the ones selected for this step.

Table 4. Histone marks that define genomic elements.

Histone marksRole
Histone H3 lysine 4 trimethylation (H3K4me3)Promoter regions58,59
Histone H3 lysine 4 monomethylation (H3K4me1)Enhancer regions58
Histone H3 lysine 36 trimethylation (H3K36me3)Transcribed regions
Histone H3 lysine 27 trimethylation (H3K27me3)Polycomb repression60
Histone H3 lysine 9 trimethylation (H3K9me3)Heterochromatin regions61
Histone H3 acetylated at lysine 27 (H3K27ac)Increase activation of genomic
elements6264
Histone H3 lysine 9 acetylation (H3K9ac)Transcriptional activation65

Table 5. ChIP-seq data file types available in AnnotationHub.

FileDescription
fc.signal.bigwigBigwig File containing fold enrichment signal tracks
pval.signal.bigwigBigwig File containing -log10(p-value) signal tracks
hotspot.fdr0.01.broad.bed.gzBroad domains on enrichment for DNase-seq for
consolidated epigenomes
hotspot.broad.bed.gzBroad domains on enrichment for DNase-seq for
consolidated epigenomes
broadPeak.gzBroad ChIP-seq peaks for consolidated epigenomes
gappedPeak.gzGapped ChIP-seq peaks for consolidated epigenomes
narrowPeak.gzNarrow ChIP-seq peaks for consolidated epigenomes
hotspot.fdr0.01.peaks.bed.gzNarrow DNasePeaks for consolidated epigenomes
hotspot.all.peaks.bed.gzNarrow DNasePeaks for consolidated epigenomes
.macs2.narrowPeak.gzNarrow DNasePeaks for consolidated epigenomes
coreMarks_mnemonics.bed.gz15 state chromatin segmentations
mCRF_FractionalMethylation.bigwigMeDIP/MRE(mCRF) fractional methylation calls
RRBS_FractionalMethylation.bigwigRRBS fractional methylation calls
WGBS_FractionalMethylation.bigwigWhole genome bisulphite fractional methylation calls

For a complete pipeline with Chip-seq data, Bioconductor provides excellent tutorials to work with ChIP-seq and we encourage our readers to review the following article66.

The first step shown in Listing 24 is to download the chip-seq data. The function query received as argument the annotationHub database (ah) and a list of keywords to be used for searching the data, EpigenomeRoadmap is selecting the roadmap database, consolidated is selecting only the consolidate epigenomes, brain is selecting the brain samples, E068 is one of the epigenomes for brain (keywords can be seen in the summary table) and narrowPeak is selecting the type of file. The data downloaded is a processed data from an integrative Analysis of 111 reference human epigenomes67.

 1 library(AnnotationHub)
 2 library(pbapply)
 3 #–––––––––––––––––– Working with ChipSeq data –––––––––––––––
 4 # Step 1: download histone marks for a brain samples.
 5 #––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
 6 ah = AnnotationHub() # loading annotation hub database
 7
 8 # Searching for brain consolidated epigenomes in the roadmap database
 9 bpChipEpi_brain <– query(ah, c("EpigenomeRoadMap","narrowPeak","chip","consolidated","brain","E068"))
10
11 # Get chip–seq data
12 histone.marks <– pblapply(names(bpChipEpi_brain), function(x){ah[[x]]})
13 names(histone.marks) <– names(bpChipEpi_brain)

Listing 24. Download chip-seq data

The Chipseeker package68 implements functions that uses Chip-seq data to retrieve the nearest genes around the peak, to annotate genomic region of the peak, among others. Also, it provides several visualization functions to summarize the coverage of the peak, average profile and heatmap of peaks binding to TSS regions, genomic annotation, distance to TSS and overlap of peaks or genes.

After downloading the histone marks (see Listing 24), it is useful to verify the average profile of peaks binding to hypomethylated and hypermethylated regions, which will help the user understand better the regions found. Listing 25 shows an example of code to plot the average profile. Figure 14 shows the result.

To help the user better understand the regions found in the DMR analysis, we downloaded histone marks specific for brain tissue using the AnnotationHub package that can access the Roadmap database (Listing 24). Next, the Chipseeker was used to visualize how histone modifications are enriched onto hypomethylated and hypermethylated regions, (Listing 25). The enrichment heatmap and the average profile of peaks binding to those regions is shown in Figure 14 and Figure 15 respectively.

The hypomethylated and hypermethylated regions are enriched for H3K4me3, H3K9ac, H3K27ac and H3K4me1 which indicates regions of enhancers, promoters and increased activation of genomic elements. However, these regions are associated neither with transcribed regions nor Polycomb repression as the H3K36me3 and H3K27me3 heatmaps does not show an enrichment nearby the position 0, and the average profile also does not show a peak at position 0.

 1 library(ChIPseeker)
 2 library(pbapply)
 3 library(SummarizedExperiment)
 4 library(GenomeInfoDb)
 5 library(ggplot2)
 6 library(AnnotationHub)
 7
 8 # Create a GR object based on the hypo/hypermethylated probes.
 9 probes <– keepStandardChromosomes(rowRanges(met.chr9)[values(met.chr9)[,"status.Glioblastoma 
        Multiforme.Brain Lower Grade Glioma"] %in% c("Hypermethylated", "Hypomethylated"),])
10 # Defining a window of 3kbp – 3kbp_probe_3kbp
11 probes@ranges <– IRanges(start = c(probes@ranges@start – 3000), end = c(probes@ranges@start + 3000))
12
13 ### Profile of ChIP peaks binding to TSS regions
14 # First of all, for calculate the profile of ChIP peaks binding to TSS regions, we should
15 # prepare the TSS regions, which are defined as the flanking sequence of the TSS sites.
16 # Then align the peaks that are mapping to these regions, and generate the tagMatrix.
17 tagMatrixList <– pblapply(histone.marks, function(x) {
18     getTagMatrix(keepStandardChromosomes(x), windows = probes, weightCol = "score")
19 })
20 names(tagMatrixList) <– basename(bpChipEpi_brain$title)
21 names(tagMatrixList) <– gsub(".narrowPeak.gz","",names(tagMatrixList)) # remove file type from name
22 names(tagMatrixList) <– gsub("E068–","",names(tagMatrixList)) # remove file type from name
23
24 pdf("chip_heatmap.pdf", height = 5, width = 10)
25 tagHeatmap(tagMatrixList, xlim=c(–3000, 3000),color = NULL)
26 dev.off()
27
28 p <– plotAvgProf(tagMatrixList, xlim = c(–3000,3000), xlab = "Genomic Region (5'–>3', centered on CpG)")
29 # We are centreing in the CpG instead of the TSS. So we’ll change the labels manually
30 p <– p + scale_x_continuous(breaks=c(–3000,–1500,0,1500,3000),labels=c(–3000,–1500,"CpG",1500,3000))
31 library(ggthemes)
32 pdf("chip–seq.pdf", height = 5, width = 7)
33 p + theme_few() + scale_colour_few(name="Histone marks") +guides(colour = guide_legend(override.aes =
           list(size=4)))
34 dev.off()

Listing 25. Average profile plot

777640db-df55-46f8-b787-fc3069f80ac8_figure14.gif

Figure 14. Average profiles for histone markers H3K27ac, H3K27me3, H3K36me3, H3K4me1, H3K4me3, H3K9ac, and H3K9me3.

The figure indicates that the differentially methylated regions overlaps regions of enhancers, promoters and increased activation of genomic elements.

777640db-df55-46f8-b787-fc3069f80ac8_figure15.gif

Figure 15. Heatmap of histone marks H3K4me1, H3K4me3, H3K27ac, H3K9ac, H3K9me3, H3K27me3 and H3K36me3 for brain tissues.

The figure indicates that the most of the peaks that overlaps the probes are not brain specific.

To annotate the location of a given peak in terms of genomic features, annotatePeak assigns peaks to genomic annotation in “annotation” column of the output, which includes whether a peak is in the TSS, Exon, 5’ UTR, 3’ UTR, Intronic or Intergenic location.

 1 require(TxDb.Hsapiens.UCSC.hg19.knownGene)
 2 txdb <– TxDb.Hsapiens.UCSC.hg19.knownGene
 3 peakAnno <– annotatePeak(probes, tssRegion=c(−3000, 3000), TxDb=txdb, annoDb="org.Hs.eg.db")
 4 plotAnnoPie(peakAnno)

Listing 26. Annotate the location of a given peak in terms of genomic features

777640db-df55-46f8-b787-fc3069f80ac8_figure16.gif

Figure 16. Feature distribution: annotation the region of the probes.

Identification of Regulatory Enhancers. Recently, many studies suggest that enhancers play a major role as regulators of cell-specific phenotypes leading to alteration in transcriptomes realated to diseases6972. In order to investigate regulatory enhancers that can be located at long distances upstream or downstream of target genes Bioconductor offer the Enhancer Linking by Methylation/Expression Relationship (ELMER) package. This package is designed to combine DNA methylation and gene expression data from human tissues to infer multi-level cis-regulatory networks. It uses DNA methylation to identify enhancers and correlates their state with expression of nearby genes to identify one or more transcriptional targets. Transcription factor (TF) binding site analysis of enhancers is coupled with expression analysis of all TFs to infer upstream regulators. This package can be easily applied to TCGA public available cancer data sets and custom DNA methylation and gene expression data sets73.

ELMER analysis have 5 main steps:

  • 1. Identify distal enhancer probes on HM450K.

  • 2. Identify distal enhancer probes with significantly different DNA methylation level in control group and experiment group.

  • 3. Identify putative target genes for differentially methylated distal enhancer probes.

  • 4. Identify enriched motifs for the distal enhancer probes which are significantly differentially methylated and linked to putative target gene.

  • 5. Identify regulatory TFs whose expression associate with DNA methylation at motifs.

This section shows how to use ELMER to analyze TCGA data using as example LGG and GBM samples.

Preparing the data for ELMER package. After downloading the data with TCGAbiolinks package, some steps are still required to use TCGA data with ELMER. These steps can be done with the function TCGAprepare_elmer. This function for the DNA methylation data will remove probes with NA values in more than 20% samples and remove the annotation data, for RNA expression data it will take the log2(expression + 1) of the expression matrix in order to linearize the relation between DNA methylation and expression. Also, it will prepare the row names of the matrix as required by the package.

The Listing 27 shows how to use TCGAbiolinks8 to search, download and prepare the data for the ELMER package. Due to time and memory constraints, we will use in this example only data from 10 LGG patients and 10 GBM patients that have both DNA methylation and gene expression data. This samples are the same used in the previous steps.

 1 #----------- 8.3  Identification of Regulatory Enhancers -------
 2 library(TCGAbiolinks)
 3 library(stringr)
 4 # Samples: primary solid tumor w/ DNA methylation and gene expression
 5 matched_met_exp <- function(project, n = NULL){
 6      # get primary solid tumor samples: DNA methylation
 7      message("Download DNA methylation information")
 8      met450k <- GDCquery(project = project,
 9			      data.category = "DNA methylation",
10			      platform = "Illumina Human Methylation 450",
11			      legacy = TRUE,
12			      sample.type = c("Primary solid Tumor"))
13     met450k.tp <-  met450k$results[[1]]$cases
14
15      # get primary solid tumor samples: RNAseq
16      message("Download gene expression information")
17      exp <- GDCquery(project = project,
18			  data.category = "Gene expression",
19			  data.type = "Gene expression quantification",
20		        platform = "Illumina HiSeq",
21			  file.type =  "results",
22			  sample.type = c("Primary solid Tumor"),
23		       legacy = TRUE)
24      exp.tp <- exp$results[[1]]$cases
25      print(exp.tp[1:10])
26      # Get patients with samples in both platforms
27      patients <- unique(substr(exp.tp,1,15)[substr(exp.tp,1,12) %in% substr(met450k.tp,1,12)])
28      if(!is.null(n)) patients <- patients[1:n] # get only n samples
29      return(patients)
30 }
31 lgg.samples <- matched_met_exp("TCGA-LGG", n = 10)
32 gbm.samples <- matched_met_exp("TCGA-GBM", n = 10)
33 samples <- c(lgg.samples,gbm.samples)
34
35 #-----------------------------------
36 # 1 -  Methylation
37 #----------------------------------
38 query.lgg <- GDCquery(project = "TCGA-LGG",
39                         data.category = "DNA methylation",
40                       platform = "Illumina Human Methylation 450",
41                       legacy = TRUE,
42                       barcode = lgg.samples)
43 GDCdownload(query.lgg)
44 met.lgg  <-GDCprepare(query.lgg,   save = FALSE)
45
46 query.gbm <- GDCquery(project = "TCGA-GBM",
47                          data.category = "DNA methylation",
48                       platform = "Illumina Human Methylation 450",
49                       legacy = TRUE,
50                       barcode = gbm.samples)
51 GDCdownload(query.gbm)
52 met.gbm <- GDCprepare(query.gbm, save = FALSE)
53 met.elmer <- SummarizedExperiment::cbind(met.lgg, met.gbm)
54 met.elmer <- TCGAprepare_elmer(met.elmer,
55                               platform = "HumanMethylation450")
56
57 #-----------------------------------
58 # 2 - Expression
59 # ----------------------------------
60 query.exp.lgg <- GDCquery(project = "TCGA-LGG",
61                   data.category = "Gene expression",
62                   data.type = "Gene expression quantification",
63                 platform = "Illumina HiSeq",
64                   file.type = "results",
65                 legacy = TRUE, barcode = lgg.samples )
66 GDCdownload(query.exp.lgg)
67 exp.lgg <- GDCprepare(query.exp.lgg, save = FALSE)
68
69 query.exp.gbm <- GDCquery(project = "TCGA-GBM",
70                  data.category = "Gene expression",
71                  data.type = "Gene expression quantification",
72                 platform = "Illumina HiSeq",
73                  file.type = "results",
74                legacy = TRUE, barcode = gbm.samples)
75 GDCdownload(query.exp.gbm)
76 exp.gbm <-GDCprepare(query.exp.gbm, save = FALSE)
77 exp.elmer <- SummarizedExperiment::cbind(exp.lgg, exp.gbm)
78 exp.elmer <- TCGAprepare_elmer(exp.elmer, platform = "IlluminaHiSeq_RNASeqV2")

Listing 27. Preparing TCGA data for ELMER’s mee object

Finally, the ELMER input is a mee object that contains a DNA methylation matrix, an gene expression matrix, a probe information GRanges, the gene information GRanges and a data frame summarizing the data. It should be highlighted that samples without both the gene expression and DNA methylation data will be removed from the mee object.

By default the function fetch.mee that is used to create the mee object will separate the samples into two groups, the control group (normal samples) and the experiment group (tumor samples), but the user can relabel the samples to compare different groups. For the next sections, we will work with both the experimental group (LGG) and control group (GBM).

 1 library(ELMER)
 2 geneAnnot <– txs()
 3 geneAnnot$GENEID <– paste0("ID",geneAnnot$GENEID)
 4 geneInfo <– promoters(geneAnnot,upstream = 0, downstream = 0)
 5 probe <– get.feature.probe()
 6
 7 # create mee object, use @ to access the matrices inside the object
 8 mee <– fetch.mee(meth = met.elmer, exp = exp.elmer,
 9 		    TCGA = TRUE, probeInfo = probe, geneInfo = geneInfo)
10
11 # Relabel GBM samples in the mee object: GBM is control
12 mee@sample$TN[mee@sample$ID %in% lgg.samples] <– "Control"

Listing 28. Creating mee object with TCGA data to be used in ELMER

ELMER analysis. After preparing the data into a mee object, we executed the five ELMER steps for both the hypo (distal enhancer probes hypomethylated in the LGG group) and hyper (distal enhancer probes hypermethylated in the LGG group) direction. The code is shown below. A description of how these distal enhancer probes are identified is found in the ELMER.data vignette.

 1 library(parallel)
 2 # Available directions are hypo and hyper, we will use only hypo
 3 # due to speed constraint
 4 direction <– c("hyper")
 5
 6 for (j in direction){
 7     print(j)
 8     dir.out <– paste0("elmer/",j)
 9     dir.create(dir.out, recursive = TRUE)
10     #––––––––––––––––––––––––––––––––––––––
11     # STEP 3: Analysis                     |
12     #––––––––––––––––––––––––––––––––––––––
13     # Step 3.1: Get diff methylated probes |
14     #––––––––––––––––––––––––––––––––––––––
15    Sig.probes <– get.diff.meth(mee, cores=detectCores(),
16     				      dir.out =dir.out,
17     				      diff.dir=j,
18     				  pvalue = 0.01)
19
20     #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
21     # Step 3.2: Identify significant probe–gene pairs            |
22     #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
23     # Collect nearby 20 genes for Sig.probes
24     nearGenes <– GetNearGenes(TRange=getProbeInfo(mee, probe=Sig.probes$probe),
25    				 cores=detectCores(),
26    				 geneAnnot=getGeneInfo(mee))
27
28     pair <– get.pair(mee=mee,
29                      probes=na.omit(Sig.probes$probe),
30                      nearGenes=nearGenes,
31                      permu.dir=paste0(dir.out,"/permu"),
32                         dir.out=dir.out,
33                      cores=detectCores(),
34                      label= j,
35                      permu.size=100, # For significant results use 10000
36                      Pe = 0.01) # For significant results use 0.001
37
38     Sig.probes.paired <– fetch.pair(pair=pair,
39   		    		       probeInfo = getProbeInfo(mee),
40      			       geneInfo = getGeneInfo(mee))
41     Sig.probes.paired <–read.csv(paste0(dir.out,
42						"/getPair.",j,
43	       ".pairs.significant.csv"),
44     				    stringsAsFactors=FALSE)[,1]
45
46		
47     #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
48     # Step 3.3: Motif enrichment analysis on the selected probes |
49     #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
50     if(length(Sig.probes.paired) > 0){
51          #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
52          # Step 3.3: Motif enrichment analysis on the selected probes |
53          #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
54         enriched.motif <– get.enriched.motif(probes=Sig.probes.paired,
55     						      dir.out=dir.out, label=j,	
56     					        background.probes = probe$name)
57         motif.enrichment <– read.csv(paste0(dir.out,
58					     "/getMotif.",j,
59		  ".motif.enrichment.csv"),
60     				       stringsAsFactors=FALSE)
61          if(length(enriched.motif) > 0){
62               #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
63               # Step 3.4: Identifying regulatory TFs                        |
64               #–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
65               print("get.TFs")
66
67             TF <– get.TFs(mee = mee,
68     			     enriched.motif = enriched.motif,
69     			         dir.out = dir.out,
70     			     cores = detectCores(), label = j)
71             TF.meth.cor <– get(load(paste0(dir.out,
72					     "/getTF.",j,
73		  ".TFs.with.motif.pvalue.rda")))
74               save(TF, enriched.motif, Sig.probes.paired,
75                  pair, nearGenes, Sig.probes, 
76                  motif.enrichment, TF.meth.cor,
77                    file=paste0(dir.out,"/ELMER_results_",j,".rda"))
78         }
79     }
80 }

Listing 29. Running ELMER analysis

When ELMER Identifies the enriched motifs for the distal enhancer probes which are significantly differentially methylated and linked to putative target gene, it will plot the Odds Ratio (x axis) for the each motifs found. The list of motifs for the hyper direction (probes hypermethylated in LGG group compared to the GBM group) is found in the Figure 17. We selected motifs that had a minimum incidence of 10 in the given probes set and the smallest lower boundary of 95% confidence interval for Odds Ratio of 1.1. These both values are the default from the ELMER package.

777640db-df55-46f8-b787-fc3069f80ac8_figure17.gif

Figure 17. The plot shows the Odds Ratio (x axis) for the selected motifs.

The range shows the 95% confidence interval for each Odds Ratio.

The analysis found 16 enriched motifs for the hyper direction and no enriched motifs for the hypo direction. After finding the enriched motifs, ELMER identifies regulatory transcription factors (TFs) whose expression is associated with DNA methylation at motifs. ELMER automatically creates a TF ranking plot for each enriched motif. This plot shows the TF ranking plots based on the association score (−log(Pvalue)) between TF expression and DNA methylation of the motif. We can see in Figure 18 that the top three TFs that are associated with that FOX motif are FOXD3, HMGA2 and HIST1H2BH.

777640db-df55-46f8-b787-fc3069f80ac8_figure18.gif

Figure 18. TF ranking plots based on the score (-log(Pvalue)) of association between TF expression and DNA methylation of the FOX motif.

The dashed line indicates the boundary of the top 5% association scores and the TFs within this boundary were considered candidate upstream regulators. The top three associated TFs and the TF family members (dots in red) that are associated with that specific motif are labeled in the plot.

The output of this step is a data frame with the following columns:

  • 1. motif: the names of motif.

  • 2. top.potential.TF: the highest ranking upstream TFs which are known recognized the motif.

  • 3. potential.TFs: TFs which are within top 5% list and are known recognized the motif. top5percent: all TFs which are within top 5% list considered candidate upstream regulators

Also, for each motif we can take a look at the three most relevant TFs. For example, Figure 19 shows the average DNA methylation level of sites with the FOX motif plotted against the expression of the TFs FOXD3, HIST1H1D, HIST1H2BH and HMGA2. We can see that the experiment group (LGG samples) has a lower average methylation level of sites with the FOX motif plotted and a higher average expression of the TFs.

777640db-df55-46f8-b787-fc3069f80ac8_figure19.gif

Figure 19. Each scatter plot shows the average DNA methylation level of sites with the FOX motif plotted against the expression of the TFs FOXD3, HIST1H1D, HIST1H2BH, HMGA2 respectively.

 1 scatter.plot(mee, category="TN", save=T, lm_line=TRUE,
 2              byTF=list(TF=c("FOXD3","HIST1H1D","HIST1H2BH","HMGA2"),
 3              probe=enriched.motif[["FOX"]]))

Listing 30. Visualizing the average DNA methylation level of sites with a chosen motif vs TF expression

And for each relevant TF we will use the clinical data to analyze the survival curves for the 30% patients with higher expression of that TF versus the 30% with lower expression. The code below shows that analysis.

 1 TCGAsurvival_TFplot <– function(TF,mee, clinical, percentage = 0.3){
 2
 3    # For the transcription factor, gets it getGeneID
 4    gene <– getGeneID(mee,symbol=TF)
 5    # Get the expression values for the genes.
 6    # (getExp is a ELMER function)
 7    exp <– getExp(mee,geneID=gene)
 8
 9    # Get the names of the 30% patients with lower expression
10    g1 <– names(sort(exp)[1:ceiling(length(exp)  percentage)])
11
12    # Get the names of the 30% patients with higher expression
13    g2 <– names(sort(exp, decreasing = T)[1:ceiling(length(exp)  percentage)])
14
15    # get the data of only these patients
16    idx <– clinical$bcr_patient_barcode %in% substr(c(g1, g2),1,12)
17    clinical <– clinical[idx,]
18    # Create the labels for each sample
19    clinical$tf_groups <– "high"
20    low.idx <– clinical$bcr_patient_barcode %in%  substr(c(g1),1,12)
21    clinical[low.idx,]$tf_groups <– "low"
22
23    # Use TCGAbiolinks to create the survival curve
24    TCGAanalyze_survival(clinical,"tf_groups",
25                           legend=paste0(TF,"Exp level"),
26                         filename = paste0(TF,".pdf"))
27 }
28
29 # get clinical patient data for GBM samples
30 gbm_clin <– GDCquery_clinic("TCGA-GBM","Clinical")
31
32 # get clinical patient data for LGG samples
33 lgg_clin <– GDCquery_clinic("TCGA-LGG","Clinical")
34
35 # Bind the results, as the columns might not be the same,
36 # we will will plyr rbind.fill, to have all columns from both files
37 clinical <– plyr::rbind.fill(gbm_clin,lgg_clin)
38 # Call the function we created
39 TCGAsurvival_TFplot("ELF4",mee,clinical)
40 TCGAsurvival_TFplot("HMGA2",mee,clinical)
41 TCGAsurvival_TFplot("FOXD3",mee,clinical)

Listing 31. Survival analysis for samples with both lower and higher expression of regulatory TFs.

The Figure 20, shows that the samples with lower expression of some of these TFs have a better survival than those with higher expression.

777640db-df55-46f8-b787-fc3069f80ac8_figure20.gif

Figure 20.

A) Survival plot for the 30% patients with high expression and low expression of ELF4 TF. B) Survival plot for the 30% patients with high expression and low expression of HGMA2 TF.

Conclusion

This workflow outlines how one can use specific Bioconductor packages for the analysis of cancer genomics and epigenomics data derived from the TCGA. In addition, we highlight the importance of using ENCODE and Roadmap data to inform on the biology of the non-coding elements defined by functional roles in gene regulation. We introduced TCGAbiolinks and RTCGAToolbox Bioconductor packages in order to illustrate how one can acquire TCGA specific data, followed by key steps for genomics analysis using GAIA package, for transcriptomic analysis using TCGAbiolinks, dnet, pathview packages and for DNA methylation analysis using TCGAbiolinks package. An inference of gene regulatory networks was also introduced by MINET package. Finally, we introduced Bioconductor packages AnnotationHub, ChIPSeeker, ComplexHeatmap, and ELMER to illustrate how one can acquire ENCODE/Roadmap data and integrate these data with the results obtained from analyzing TCGA data to identify and characterize candidate regulatory enhancers associated with cancer.

Data and software availability

This workflow depends on various packages from version 3.2 of the Bioconductor project, running on R version 3.2.2 or higher. It requires a number of software packages, including AnnotationHub, ChIPSeeker, ELMER, ComplexHeatmap, GAIA, rGADEM, MotIV, MINET, RTCGAToolbox and TCGAbiolinks. Version numbers for all packages used are in section "Session Information". Listing 32 shows how to install all the required packages.

 1 source("https://bioconductor.org/biocLite.R")
 2 packages <– c("TCGAbiolinks","ELMER","gaia","ChIPseeker",
 3 		   "AnnotationHub", "ComplexHeatmap",
 4 		   "clusterProfiler", "RTCGAToolbox",
 5 		   "minet","biomaRt","pathview", "MotifDb",
 6 		   "MotIV","motifStack","rGADEM")
 7 new.packages <– packages[!(packages %in% installed.packages()[,"Package"])]
 8 if(length(new.packages)) biocLite(new.packages)
 9 if(!require("dnet")) install.packages("dnet")
10 if(!require("circlize")) install.packages("circlize")
11 if(!require("VennDiagram")) install.packages("VennDiagram")
12 if(!require("c3net")) install.packages("c3net")
13 if(!require("pbapply")) install.packages("pbapply")
14 if(!require("gplots")) install.packages("gplots")

Listing 32. Installing packages

All data used in this workflow is freely available and some of them can be accessed using a R/Bioconductor package. There are three main sources of data: The NCI Genomic Data Commons (GDC), a supplementary data repository with processed datasets from the Roadmap Epigenomics Project and from The Encyclopedia of DNA Elements (ENCODE)67 and the BioGRID database with physical and genetic interactions information. For the first, a summary of the data available can be seen in https://gdc-portal.nci.nih.gov/ and its data can be accessed using the R/Bioconductor TCGAbiolinks package. For the second, a summary of the data available can be found in this spread sheet and the data can be accessed using the R/Bioconductor AnnotationHub package. For the third, the data should be directly download from the data portal.

Session information

  1 R version 3.3.0 (2016–05–03)
  2 Platform: x86_64–pc–linux–gnu (64–bit )
  3 Running under: Ubuntu 16.04.1 LTS
  4
  5 locale:
  6  [1] LC_CTYPE=pt_BR.UTF–8       LC_NUMERIC=C
  7  [3] LC_TIME=pt_BR.UTF–8        LC_COLLATE=en_US.UTF–8
  8  [5] LC_MONETARY=pt_BR.UTF–8    LC_MESSAGES=en_US.UTF–8
  9  [7] LC_PAPER=pt_BR.UTF–8       LC_NAME=C
 10  [9] LC_ADDRESS=C                 LC_TELEPHONE=C
 11 [11] LC_MEASUREMENT=pt_BR.UTF–8 LC_IDENTIFICATION=C
 12
 13 attached base packages:
 14  [1] stats4    parallel   grid      stats      graphics  grDevices utils
 15  [8] datasets  methods    base
 16
 17 other attached packages:
 18  [1] rGADEM_2.20.0
 19  [2] seqLogo_1.38.0
 20  [3] BSgenome_1.40.1
 21  [4] rtracklayer_1.32.1
 22  [5] motifStack_1.16.2
 23  [6] ade4_1.7–4
 24  [7] grImport_0.9–0
 25  [8] XML_3.98–1.4
 26  [9] MotIV_1.28.0
 27 [10] pathview_1.12.0
 28 [11] biomaRt_2.28.0
 29 [12] minet_3.30.0
 30 [13] clusterProfiler_3.0.4
 31 [14] DOSE_2.10.7
 32 [15] AnnotationHub_2.4.2
 33 [16] ChIPseeker_1.8.7
 34 [17] ELMER_1.4.2
 35 [18] ELMER.data_1.2.2
 36 [19] Homo.sapiens_1.3.1
 37 [20] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2
 38 [21] org.Hs.eg.db_3.3.0
 39 [22] GO.db_3.3.0
 40 [23] OrganismDbi_1.14.1
 41 [24] GenomicFeatures_1.24.5
 42 [25] AnnotationDbi_1.34.4
 43 [26] IlluminaHumanMethylation450kanno.ilmn12.hg19_0.2.1
 44 [27] minfi_1.18.2
 45 [28] bumphunter_1.12.0
 46 [29] locfit_1.5–9.1
 47 [30] iterators_1.0.8
 48 [31] foreach_1.4.3
 49 [32] Biostrings_2.40.2
 50 [33] XVector_0.12.1
 51 [34] SummarizedExperiment_1.2.3
 52 [35] GenomicRanges_1.24.2
 53 [36] GenomeInfoDb_1.8.3
 54 [37] IRanges_2.6.1
 55 [38] S4Vectors_0.10.2
 56 [39] lattice_0.20–33
 57 [40] Biobase_2.32.0
 58 [41] BiocGenerics_0.18.0
 59 [42] ComplexHeatmap_1.10.2
 60 [43] dnet_1.0.9
 61 [44] supraHex_1.10.0
 62 [45] hexbin_1.27.1
 63 [46] igraph_1.0.1
 64 [47] circlize_0.3.7
 65 [48] pbapply_1.2–1
 66 [49] gplots_3.0.1
 67 [50] gaia_2.16.0
 68 [51] readr_0.2.2
 69 [52] downloader_0.4
 70 [53] TCGAbiolinks_2.1.0
 71
 72 loaded via a namespace (and not attached):
 73   [1] SparseM_1.7			ggthemes_3.2.0
 74   [3] prabclus_2.2–6		GGally_1.2.0
 75   [5] R.methodsS3_1.7.1		pkgmaker_0.22
 76   [7] tidyr_0.5.1			ggplot2_2.1.0
 77   [9] knitr_1.13			aroma.light_3.2.0
 78  [11] multcomp_1.4–6 		     R.utils_2.3.0
 79  [13] data.table_1.9.6		hwriter_1.3.2
 80  [15] KEGGREST_1.12.2		RCurl_1.95–4.8
 81  [17] GEOquery_2.38.4		doParallel_1.0.10
 82  [19] preprocessCore_1.34.0		cowplot_0.6.2
 83  [21] TH.data_1.0–7			RSQLite_1.0.0
 84  [23] chron_2.3–47			xml2_1.0.0
 85  [25] httpuv_1.3.3			assertthat_0.1
 86  [27] BiocInstaller_1.22.3		DEoptimR_1.0–6
 87  [29] caTools_1.17.1		dendextend_1.2.0
 88  [31] Rgraphviz_2.16.0		DBI_0.4–1
 89  [33] geneplotter_1.50.0		reshape_0.8.5
 90  [35] stringdist_0.9.4.1		EDASeq_2.6.2
 91  [37] matlab_1.0.2			dplyr_0.5.0
 92  [39] trimcluster_0.1–2		annotate_1.50.0
 93  [41] gridBase_0.4–7		robustbase_0.92–6
 94  [43] GenomicAlignments_1.8.4	mclust_5.2
 95  [45] mnormt_1.5–4			cluster_2.0.4
 96  [47] ape_3.5			genefilter_1.54.2
 97  [49] edgeR_3.14.0			nlme_3.1–128
 98  [51] nnet_7.3–12			diptest_0.75–7
 99  [53] sandwich_2.3–4		registry_0.3
100  [55] affyio_1.42.0			matrixStats_0.50.2
101  [57] graph_1.50.0			rngtools_1.2.4
102  [59] base64_2.0			Matrix_1.2–6
103  [61] boot_1.3–18			zoo_1.7–13
104  [63] whisker_0.3–2			GlobalOptions_0.0.10
105  [65] png_0.1–7			rjson_0.2.15
106  [67] bitops_1.0–6 		     R.oo_1.20.0
107  [69] ConsensusClusterPlus_1.36.0 	KernSmooth_2.23–15
108  [71] doRNG_1.6 			shape_1.4.2
109  [73] stringr_1.0.0			qvalue_2.4.2
110  [75] nor1mix_1.2–1			coin_1.1–2
111  [77] ShortRead_1.30.0		scales_0.4.0
112  [79] GSEABase_1.34.0		magrittr_1.5
113  [81] plyr_1.8.4			gdata_2.17.0
114  [83] zlibbioc_1.18.0		RColorBrewer_1.1–2
115  [85] illuminaio_0.14.0		plotrix_3.6–3
116  [87] KEGGgraph_1.30.0		lme4_1.1–12
117  [89] Rsamtools_1.24.0		affy_1.50.0
118  [91] MASS_7.3–45			stringi_1.1.1
119  [93] GOSemSim_1.30.3		latticeExtra_0.6–28
120  [95] ggrepel_0.5 			tools_3.3.0
121  [97] gridExtra_2.2.1		sjPlot_2.0.1
122  [99] digest_0.6.9			shiny_0.13.2
123 [101] quadprog_1.5–5		fpc_2.1–10
124 [103] Rcpp_0.12.6			siggenes_1.46.0
125 [105] httr_1.2.1			psych_1.6.6
126 [107] kernlab_0.9–24 		     effects_3.1–1
127 [109] sjstats_0.2.0			colorspace_1.2–6
128 [111] rvest_0.3.2			topGO_2.24.0
129 [113] splines_3.3.0			RBGL_1.48.1
130 [115] multtest_2.28.0		flexmix_2.3–13
131 [117] xtable_1.8–2			jsonlite_1.0
132 [119] nloptr_1.0.4			UpSetR_1.2.2
133 [121] modeltools_0.2–21		R6_2.1.2
134 [123] htmltools_0.3.5		mime_0.5
135 [125] minqa_1.2.4			BiocParallel_1.6.3
136 [127] DESeq_1.24.0 		     class_7.3–14
137 [129] interactiveDisplayBase_1.10.3	beanplot_1.2
138 [131] codetools_0.2–14		mvtnorm_1.0–5
139 [133] tibble_1.1			gtools_3.5.0
140 [135] openssl_0.9.4			survival_2.39–5
141 [137] limma_3.28.17			munsell_0.4.3
142 [139] DO.db_2.9			GetoptLong_0.1.3
143 [141] sjmisc_1.8			haven_0.2.1
144 [143] reshape2_1.4.1		gtable_0.2.0

Comments on this article Comments (1)

Version 2
VERSION 2 PUBLISHED 28 Dec 2016
Revised
  • Reader Comment 15 Aug 2019
    Vahid Ghafarpour, University of Tehran, Tehran, Iran
    15 Aug 2019
    Reader Comment
    in Circos plot part:
    GDCquery_MAF needs to set pipeline
    mut object has changed parameters Start_Position and End_Position (Capital P)
    Competing Interests: No competing interests were disclosed.
Author details Author details
Competing interests
Grant information
Copyright
Download
 
Export To
metrics
Views Downloads
F1000Research - -
PubMed Central
Data from PMC are received and updated monthly.
- -
Citations
CITE
how to cite this article
Silva TC, Colaprico A, Olsen C et al. TCGA Workflow: Analyze cancer genomics and epigenomics data using Bioconductor packages [version 2; peer review: 1 approved, 2 approved with reservations] F1000Research 2016, 5:1542 (https://doi.org/10.12688/f1000research.8923.2)
NOTE: it is important to ensure the information in square brackets after the title is included in all citations of this article.
track
receive updates on this article
Track an article to receive email alerts on any updates to this article.

Open Peer Review

Current Reviewer Status: ?
Key to Reviewer Statuses VIEW
ApprovedThe paper is scientifically sound in its current form and only minor, if any, improvements are suggested
Approved with reservations A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit.
Not approvedFundamental flaws in the paper seriously undermine the findings and conclusions
Version 2
VERSION 2
PUBLISHED 28 Dec 2016
Revised
Views
211
Cite
Reviewer Report 06 Feb 2017
Charlotte Soneson, Institute of Molecular Life Sciences, University of Zurich (UZH), Zürich, Switzerland 
Approved with Reservations
VIEWS 211
This article provides a comprehensive overview of how to query, download and analyze data from large cancer consortia using R and Bioconductor. Overall, I find it a useful contribution to the field, and it illustrates many of the use cases ... Continue reading
CITE
CITE
HOW TO CITE THIS REPORT
Soneson C. Reviewer Report For: TCGA Workflow: Analyze cancer genomics and epigenomics data using Bioconductor packages [version 2; peer review: 1 approved, 2 approved with reservations]. F1000Research 2016, 5:1542 (https://doi.org/10.5256/f1000research.11063.r19656)
NOTE: it is important to ensure the information in square brackets after the title is included in all citations of this article.
  • Author Response 07 Feb 2017
    Tiago Chedraoui Silva, Department of Biomedical Sciences, Cedars-Sinai, Los Angeles, USA
    07 Feb 2017
    Author Response
    Dear Charlotte Soneson,

    We are working on creating a reproducible workflow that will be available on Bioconductor.
    The developing version is currently available on GitHub.
    As soon as this is accepted ... Continue reading
COMMENTS ON THIS REPORT
  • Author Response 07 Feb 2017
    Tiago Chedraoui Silva, Department of Biomedical Sciences, Cedars-Sinai, Los Angeles, USA
    07 Feb 2017
    Author Response
    Dear Charlotte Soneson,

    We are working on creating a reproducible workflow that will be available on Bioconductor.
    The developing version is currently available on GitHub.
    As soon as this is accepted ... Continue reading
Version 1
VERSION 1
PUBLISHED 29 Jun 2016
Views
226
Cite
Reviewer Report 21 Sep 2016
Elena Papaleo, Computational Biology Laboratory, Unit of Statistics, Bioinformatics and Registry, Danish Cancer Society Research Center, Copenhagen, Denmark 
Approved
VIEWS 226
As it has been pointed out already by the first reviewer, it is important to verify that the pipeline is updated according to the data migration to the GCD server.

Apart from this, I find this manuscript ... Continue reading
CITE
CITE
HOW TO CITE THIS REPORT
Papaleo E. Reviewer Report For: TCGA Workflow: Analyze cancer genomics and epigenomics data using Bioconductor packages [version 2; peer review: 1 approved, 2 approved with reservations]. F1000Research 2016, 5:1542 (https://doi.org/10.5256/f1000research.9601.r15858)
NOTE: it is important to ensure the information in square brackets after the title is included in all citations of this article.
  • Author Response 29 Dec 2016
    Tiago Chedraoui Silva, Department of Genetics, Ribeirao Preto Medical School, University of Sao Paulo, Ribeirao Preto, Brazil
    29 Dec 2016
    Author Response
    Dear Elena Papaleo,  

    First, we would like to thank you for your review and for providing a detailed feedback for our workflow. We have made several changes in ... Continue reading
COMMENTS ON THIS REPORT
  • Author Response 29 Dec 2016
    Tiago Chedraoui Silva, Department of Genetics, Ribeirao Preto Medical School, University of Sao Paulo, Ribeirao Preto, Brazil
    29 Dec 2016
    Author Response
    Dear Elena Papaleo,  

    First, we would like to thank you for your review and for providing a detailed feedback for our workflow. We have made several changes in ... Continue reading
Views
288
Cite
Reviewer Report 18 Jul 2016
Kyle Ellrott, Oregon Health & Science University, Portland, OR, USA 
Approved with Reservations
VIEWS 288
This review comes at a very inopportune moment. The entire software pipeline is based on the TCGAbiolinks tool kit, which downloads files from the TCGA DCC service. Unfortunately, just as this paper was being sent for review, the NCI began ... Continue reading
CITE
CITE
HOW TO CITE THIS REPORT
Ellrott K. Reviewer Report For: TCGA Workflow: Analyze cancer genomics and epigenomics data using Bioconductor packages [version 2; peer review: 1 approved, 2 approved with reservations]. F1000Research 2016, 5:1542 (https://doi.org/10.5256/f1000research.9601.r14695)
NOTE: it is important to ensure the information in square brackets after the title is included in all citations of this article.
  • Author Response 29 Dec 2016
    Tiago Chedraoui Silva, Department of Genetics, Ribeirao Preto Medical School, University of Sao Paulo, Ribeirao Preto, Brazil
    29 Dec 2016
    Author Response
    Dear Kyle Ellrott,

    Thank you for your comments and suggestions. We made several changes in the version 2 of the workflow, some of the changes and answers to your ... Continue reading
COMMENTS ON THIS REPORT
  • Author Response 29 Dec 2016
    Tiago Chedraoui Silva, Department of Genetics, Ribeirao Preto Medical School, University of Sao Paulo, Ribeirao Preto, Brazil
    29 Dec 2016
    Author Response
    Dear Kyle Ellrott,

    Thank you for your comments and suggestions. We made several changes in the version 2 of the workflow, some of the changes and answers to your ... Continue reading

Comments on this article Comments (1)

Version 2
VERSION 2 PUBLISHED 28 Dec 2016
Revised
  • Reader Comment 15 Aug 2019
    Vahid Ghafarpour, University of Tehran, Tehran, Iran
    15 Aug 2019
    Reader Comment
    in Circos plot part:
    GDCquery_MAF needs to set pipeline
    mut object has changed parameters Start_Position and End_Position (Capital P)
    Competing Interests: No competing interests were disclosed.
Alongside their report, reviewers assign a status to the article:
Approved - the paper is scientifically sound in its current form and only minor, if any, improvements are suggested
Approved with reservations - A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit.
Not approved - fundamental flaws in the paper seriously undermine the findings and conclusions
Sign In
If you've forgotten your password, please enter your email address below and we'll send you instructions on how to reset your password.

The email address should be the one you originally registered with F1000.

Email address not valid, please try again

You registered with F1000 via Google, so we cannot reset your password.

To sign in, please click here.

If you still need help with your Google account password, please click here.

You registered with F1000 via Facebook, so we cannot reset your password.

To sign in, please click here.

If you still need help with your Facebook account password, please click here.

Code not correct, please try again
Email us for further assistance.
Server error, please try again.