{
"cells": [
{
"cell_type": "markdown",
"id": "d3716dad",
"metadata": {},
"source": [
"# Meta Analysis\n",
"\n",
"\n",
"\n",
"Meta pathway analysis using multiple omics data is a rapidly emerging field in bioinformatics and systems biology that allows for the integration of diverse omics data from genomics, transcriptomics, proteomics, metabolomics, and other molecular biology disciplines. By integrating multiple omics data, meta pathway analysis aims to provide a comprehensive understanding of the cellular functions and molecular mechanisms underlying biological processes in a given organism. This approach offers a powerful means to investigate the complex interplay between genes, proteins, and metabolites in different biological contexts, such as disease states or environmental conditions. Moreover, meta pathway analysis can identify key regulatory pathways and molecular signatures that are critical for the development of targeted therapeutics and precision medicine. Overall, the integration of multiple omics data through meta pathway analysis has the potential to reveal new insights into the underlying biology of complex diseases and to guide the development of personalized treatments. In this submodule we will demonstrate the power of meta analysis to find the significant pathways for Alzheimer and Parkinson diseases.\n",
"\n",
"## Learning Objectives:\n",
"1. Downloading processed data\n",
"2. Performing enrichment analysis using FGSEA and plotting results\n",
"3. Performing meta-analysis and plotting results"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e3ab9386",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"
\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Run the following command to take the quiz\n",
"IRdisplay::display_html('
')"
]
},
{
"cell_type": "markdown",
"id": "c160f6a2",
"metadata": {},
"source": [
"## Loading Datasets\n",
"In this submodule 5 we will use datasets available from the Gene Expression Omnibus (GEO) repository. The datasets analyzed for Alzheimer disease is available under accession number `GSE5281`. This dataset contains genes that are preferentially expressed during the course of Alzheimer’s disease (AD) collected from 5 different brain regions: 1) entorhinal cortex (EC) 2) hippocampus (HIP) 3) medial temporal gyrus (MTG) 4) posterior cingulate 5) superior frontal gyrus and 6) primary visual cortex. In this submodule, we will perform analysis using data generated from EC, HIP, and MTG.\n",
"\n",
"The datasets analyzed for Parkinson disease is available under accession numbers `GSE99039` and `GSE20292`. The first dataset contains 558 blood-based gene signature characterizing Idiopathic Parkinson's disease while the second dataset has 29 transcriptional analysis of whole substantia nigra in Parkinson's disease. Users can follow instruction provided in submodule 1 and 2 to download and perform genes ID mapping. In this submodule, we will load the preprocessed data store in the course's NIGMS Google bucket to perform analysis. The code to load all datasets is presented as follows:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0738ddf5",
"metadata": {},
"outputs": [],
"source": [
"# A vector to store all data IDs\n",
"data.IDs <- c(\"GSE5281-EC\", \"GSE5281-HIP\", \"GSE5281-MTG\", \"GSE99039\", \"GSE20292\")\n",
"# A loop to read data information and store into a list\n",
"allData <- lapply(data.IDs, function(id){\n",
" f <- paste0( \"https://storage.googleapis.com/nigms-sandbox/nosi-unr/\", id, \".rds\")\n",
" if (!file.exists(f)) return(readRDS(url(f), \"rb\"))\n",
" return(NULL)\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "722ce8e2",
"metadata": {},
"source": [
"## Installing Required Libraries\n",
"In this submodule we will install several libraries to perform enrichment analysis, meta analysis and visualization. We will install package `fgsea` to perform enrichment analysis. For visualization purpose, we will use `ggpubr` and `cowplot`. `ggpubr` provides a range of functions that enable users to create publication-ready plots, including barplots, box-plots, scatter plots, histograms, and heatmaps. `cowplot` provides ability to create custom layouts for complex multi-panel figures. The package includes functions for arranging plots in a grid, as well as for adding margins, padding, and labels. The package also includes features for aligning plots, adjusting font sizes and colors, and exporting plots to different file formats. To perform meta analysis, we will use `meta` R package which provides functions for conducting fixed-effect and random-effects meta-analyses, as well as for conducting sensitivity analyses, subgroup analyses, and meta-regression analyses. The package also provides tools for assessing the heterogeneity of the studies included in the analysis and for creating forest plots to visualize the results. Lastly, packages include `stringr` and `matrixStats` provide utility function to manipulate input matrices. The package `fgsea` can be download from Bioconductor while other packages can be installed from CRAN. The code to install all packages are presented below:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "2df627ec",
"metadata": {},
"outputs": [],
"source": [
"suppressMessages({if (!require(\"BiocManager\", quietly = TRUE))\n",
" suppressWarnings(install.packages(\"BiocManager\"))\n",
" suppressWarnings(if (!require(\"fgsea\")) BiocManager::install(\"fgsea\", update = F))\n",
"})"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "acdb01c0",
"metadata": {},
"outputs": [],
"source": [
"suppressMessages({\n",
" # Installing all packages\n",
" suppressWarnings(if (!require(\"stringr\")) install.packages(\"stringr\"))\n",
" suppressWarnings(if (!require(\"meta\")) install.packages(\"meta\"))\n",
" suppressWarnings(if (!require(\"matrixStats\")) install.packages(\"matrixStats\"))\n",
" suppressWarnings(if (!require(\"cowplot\")) install.packages(\"cowplot\"))\n",
" suppressWarnings(if (!require(\"ggpubr\")) install.packages(\"ggpubr\"))\n",
" suppressWarnings(if (!require(\"dplyr\")) install.packages(\"dplyr\"))\n",
" suppressWarnings(if (!require(\"tidyr\")) install.packages(\"tidyr\"))\n",
"\n",
" # Loading all packages\n",
" suppressPackageStartupMessages({library(fgsea)})\n",
" suppressPackageStartupMessages({library(stringr)})\n",
" suppressPackageStartupMessages({library(meta)})\n",
" suppressPackageStartupMessages({library(matrixStats)})\n",
" suppressPackageStartupMessages({library(cowplot)})\n",
" suppressPackageStartupMessages({library(ggpubr)})\n",
" suppressPackageStartupMessages({library(dplyr)})\n",
" suppressPackageStartupMessages({library(tidyr)})\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "bf359ea8",
"metadata": {},
"source": [
"## Utility Function\n",
"To perform enrichment analysis we will need a helper function to obtain pathway information from KEGG database.\n",
"The `getKEGGGeneSet` shown below will access to KEGG database and download all the genesets for all the human pathways.\n",
"The result will be stored in a list.\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "73462f12",
"metadata": {},
"outputs": [],
"source": [
"getKEGGGeneSet <- function(org){\n",
" # Get data from KEGG database and save to a data frame\n",
" geneLink <- read.table(paste0(\"https://rest.kegg.jp/link/\", org, \"/pathway\"),\n",
" sep = \"\\t\", header = F,\n",
" stringsAsFactors = F);\n",
" # Name the data columns\n",
" colnames(geneLink) <- c(\"geneset\", \"gene\")\n",
"\n",
" # Get genes for each geneset and store result in a list\n",
" geneLink <- geneLink %>%\n",
" group_by(geneset) %>%\n",
" group_split() %>%\n",
" lapply(function(dat){\n",
" list(\n",
" name = dat$geneset[1] %>% as.character(),\n",
" genes = dat$gene %>% as.character()\n",
" )\n",
" })\n",
"\n",
" names(geneLink) <- geneLink %>% lapply(function(gl) gl$name)\n",
" geneLink <- geneLink %>% lapply(function(gl) gl$genes)\n",
"\n",
" keeps <- geneLink %>% lapply(length) %>% unlist() %>% `>=`(5) %>% which() %>% names()\n",
" geneLink <- geneLink[keeps]\n",
" return(geneLink)\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "d42cb6c7",
"metadata": {},
"source": [
"## Enrichment Analysis using FGSEA\n",
"In this section we will perform enrichment analysis using `fgsea` method for all methods.\n",
"FGSEA is an extension of the widely used Gene Set Enrichment Analysis (GSEA) method, which computes\n",
"an enrichment score for each gene set by comparing the distribution of genes in the set with the\n",
" distribution of all genes. FGSEA, on the other hand, uses a fast algorithm to estimate the p-value\n",
" for each gene set, based on the empirical distribution of the enrichment score obtained by permuting\n",
" the gene labels in the ranked list.\n",
"\n",
"The basic steps in performing FGSEA are as follows:\n",
"\n",
"1. Rank the genes according to a certain metric, such as gene expression or differential expression.\n",
"2. Define a set of genes of interest, such as a pathway or a gene ontology term.\n",
"3. Compute the enrichment score for each gene set based on the ranks of its member genes in the ranked list.\n",
"4. Generate a null distribution of enrichment scores by permuting the gene labels in the ranked list.\n",
"5. Compute the p-value for each gene set by comparing its observed enrichment score with the null distribution.\n",
"6. Correct for multiple testing, for example, by using the false discovery rate (FDR) or the Bonferroni method.\n",
"\n",
"To run the method `fgsea` we use permutation of 1,000 and signal-to-noise (SNR) is set to the ratio of differences\n",
"of mean and standard deviation between control and disease groups.\n",
"Now, we need to get the geneset and do parameter settings."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "06463118",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": "\r\n\r\n
\r\n
\r\n\r\n
Quiz_Submodule5-1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n\r\n
\r\n\r\n
\r\n\r\n\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Run the following command to take the quiz\n",
"IRdisplay::display_html('
')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "4e4ed793",
"metadata": {},
"outputs": [],
"source": [
"# Assign names to all datasets\n",
"names(allData) <- data.IDs\n",
"# Remove empty dataset\n",
"allData <- allData[!sapply(allData, is.null)]\n",
"# Get all human geneset\n",
"geneSet <- getKEGGGeneSet(\"hsa\")\n",
"# Get uniuqte geneset\n",
"genes <- unique(unlist(geneSet))\n",
"# Parameter to set number of permutation\n",
"perm <- 1000"
]
},
{
"cell_type": "markdown",
"source": [
"We can check the number of pathways for human using the following command:"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 13,
"id": "3d20512a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1] \"The number of pathways is: 346\"\n"
]
}
],
"source": [
"print(paste0(\"The number of pathways is: \", length(geneSet)))"
]
},
{
"cell_type": "markdown",
"id": "9bf83c88",
"metadata": {},
"source": [
"We can view the names of the first 10 pathways using the following command:\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "5225e057",
"metadata": {},
"outputs": [
{
"data": {
"text/html": "\n
- 'path:hsa00010'
- 'path:hsa00020'
- 'path:hsa00030'
- 'path:hsa00040'
- 'path:hsa00051'
- 'path:hsa00052'
- 'path:hsa00053'
- 'path:hsa00061'
- 'path:hsa00062'
- 'path:hsa00071'
\n",
"text/markdown": "1. 'path:hsa00010'\n2. 'path:hsa00020'\n3. 'path:hsa00030'\n4. 'path:hsa00040'\n5. 'path:hsa00051'\n6. 'path:hsa00052'\n7. 'path:hsa00053'\n8. 'path:hsa00061'\n9. 'path:hsa00062'\n10. 'path:hsa00071'\n\n\n",
"text/latex": "\\begin{enumerate*}\n\\item 'path:hsa00010'\n\\item 'path:hsa00020'\n\\item 'path:hsa00030'\n\\item 'path:hsa00040'\n\\item 'path:hsa00051'\n\\item 'path:hsa00052'\n\\item 'path:hsa00053'\n\\item 'path:hsa00061'\n\\item 'path:hsa00062'\n\\item 'path:hsa00071'\n\\end{enumerate*}\n",
"text/plain": " [1] \"path:hsa00010\" \"path:hsa00020\" \"path:hsa00030\" \"path:hsa00040\"\n [5] \"path:hsa00051\" \"path:hsa00052\" \"path:hsa00053\" \"path:hsa00061\"\n [9] \"path:hsa00062\" \"path:hsa00071\""
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"names(geneSet)[1:10]"
]
},
{
"cell_type": "markdown",
"id": "b6fee7cb",
"metadata": {},
"source": [
"We can view the name of first 10 genes of the first pathway using the following command:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "b4840a79",
"metadata": {},
"outputs": [
{
"data": {
"text/html": "\n
- 'hsa:10327'
- 'hsa:124'
- 'hsa:125'
- 'hsa:126'
- 'hsa:127'
- 'hsa:128'
- 'hsa:130'
- 'hsa:130589'
- 'hsa:131'
- 'hsa:160287'
\n",
"text/markdown": "1. 'hsa:10327'\n2. 'hsa:124'\n3. 'hsa:125'\n4. 'hsa:126'\n5. 'hsa:127'\n6. 'hsa:128'\n7. 'hsa:130'\n8. 'hsa:130589'\n9. 'hsa:131'\n10. 'hsa:160287'\n\n\n",
"text/latex": "\\begin{enumerate*}\n\\item 'hsa:10327'\n\\item 'hsa:124'\n\\item 'hsa:125'\n\\item 'hsa:126'\n\\item 'hsa:127'\n\\item 'hsa:128'\n\\item 'hsa:130'\n\\item 'hsa:130589'\n\\item 'hsa:131'\n\\item 'hsa:160287'\n\\end{enumerate*}\n",
"text/plain": " [1] \"hsa:10327\" \"hsa:124\" \"hsa:125\" \"hsa:126\" \"hsa:127\" \n [6] \"hsa:128\" \"hsa:130\" \"hsa:130589\" \"hsa:131\" \"hsa:160287\""
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"geneSet$`path:hsa00010`[1:10]"
]
},
{
"cell_type": "markdown",
"id": "e3dbc1f6",
"metadata": {},
"source": [
"Now, we can perform enrichment analysis for all datasets using the following script"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "8b0b34ee",
"metadata": {},
"outputs": [],
"source": [
"allEnrichmentResult <- lapply(1:length(allData), function(iteration){\n",
" # Set seed for reproducibilty\n",
" set.seed(iteration)\n",
" # Get the data\n",
" data <- allData[[iteration]]\n",
" data <- data[[1]]\n",
" # Get expression matrix\n",
" exprs <- data$expression\n",
" # Get group information (control vs disease)\n",
" group <- data$group\n",
" annotation <- data$annotation\n",
" exprs <- exprs[intersect(genes, rownames(exprs)), ]\n",
" control.samples <- names(group[group == \"c\"])\n",
" disease.samples <- names(group[group == \"d\"])\n",
" exprs <- as.matrix(exprs)\n",
" # Calculate signal to noise\n",
" snr <- (rowMeans(exprs[, disease.samples]) -\n",
" rowMeans(exprs[, control.samples]))/(rowSds(exprs[, disease.samples]) +\n",
" rowSds(exprs[, control.samples]))\n",
" # Perform enrichment analysis\n",
" res <- suppressWarnings(fgsea(pathways = geneSet,\n",
" stats = snr,\n",
" nperm=perm))\n",
"\n",
" res$pvals$sample.size <- ncol(exprs)\n",
" # Store result in a list\n",
" list(\n",
" id = names(allData)[iteration],\n",
" data = data,\n",
" res = res\n",
" )\n",
"})\n",
"# Assign names using dataset ID for to the results\n",
"names(allEnrichmentResult) <- names(allData)"
]
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"id": "3b482aaf",
"metadata": {},
"source": [
"We can view the enrichment analysis result for the first dataset using the following command. The result is saved in a data frame in which the\n",
"first three columns contain pathway names, p-value, and adjusted p-value. The next column has Enrichment Score is calculated by walking down the ranked list of genes, and at each step, adding the running sum of the enrichment score for the gene set. The enrichment score is defined as the difference between the proportion of genes in the gene set that are up-regulated and the proportion of genes in the gene set that are down-regulated, multiplied by the degree of differential expression. The next column has Normalized Enrichment Score (NES) that takes into account both the enrichment of the gene set and its size, and it is normalized to correct for the multiple hypothesis testing performed in the analysis.\n",
"\n",
"In the nex column, the NES score is calculated as the maximum deviation of the enrichment score from the expected null distribution, divided by the standard deviation of the scores of all possible permutations of the gene set labels. nMoreExtreme is a statistical metric to estimate the significance of the enrichment score of a gene set in a ranked list of genes. The \"size\" column of a gene set is an important factor that can affect the interpretation of the enrichment analysis results. The \"leadingEdge\" column is a subset of genes within a gene set that contribute most to the enrichment signal of the gene set in a ranked list of genes."
]
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 17,
"id": "dc77ac2c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": "
\nA data.table: 10 × 9\n\n\tpathway | pval | padj | ES | NES | nMoreExtreme | size | leadingEdge | pvals |
\n\t<chr> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <int> | <list> | <int> |
\n\n\n\tpath:hsa00010 | 0.25818182 | 0.44865145 | -0.2413602 | -1.1392367 | 141 | 65 | hsa:2597 , hsa:226 , hsa:5315 , hsa:92579, hsa:10327, hsa:7167 , hsa:3939 , hsa:2821 , hsa:5211 , hsa:3098 , hsa:5106 , hsa:5213 , hsa:5230 , hsa:8789 , hsa:2023 , hsa:2203 , hsa:2026 , hsa:219 , hsa:230 , hsa:55902, hsa:229 , hsa:2027 , hsa:5232 , hsa:26330, hsa:5236 , hsa:3101 , hsa:131 , hsa:218 , hsa:80201, hsa:124 , hsa:130 , hsa:83440, hsa:5160 , hsa:222 | 100 |
\n\tpath:hsa00020 | 0.47609943 | 0.63848993 | -0.2533863 | -0.9572276 | 248 | 29 | hsa:3421, hsa:47 , hsa:1431 | 100 |
\n\tpath:hsa00030 | 0.16826004 | 0.34287602 | -0.3365079 | -1.2712396 | 87 | 29 | hsa:2539 , hsa:226 , hsa:25796 , hsa:2821 , hsa:5211 , hsa:5213 , hsa:8277 , hsa:8789 , hsa:414328, hsa:2203 , hsa:230 , hsa:229 , hsa:7086 | 100 |
\n\tpath:hsa00040 | 0.34960938 | 0.54735223 | -0.2968775 | -1.0635063 | 178 | 25 | hsa:6652 , hsa:27294, hsa:10327, hsa:54576, hsa:54658, hsa:55277, hsa:54578, hsa:54659, hsa:9942 , hsa:54600, hsa:54490, hsa:57016 | 100 |
\n\tpath:hsa00051 | 0.01506591 | 0.06516008 | -0.4205478 | -1.6467445 | 7 | 33 | hsa:7264 , hsa:6652 , hsa:226 , hsa:5373 , hsa:7167 , hsa:29925, hsa:5211 , hsa:3098 , hsa:29926, hsa:5213 , hsa:5207 , hsa:5372 , hsa:3795 , hsa:8789 , hsa:55556, hsa:2203 , hsa:230 , hsa:229 , hsa:26007 | 100 |
\n\tpath:hsa00052 | 0.64352720 | 0.77853291 | -0.2252493 | -0.8679854 | 342 | 31 | hsa:92579, hsa:5211 , hsa:3098 , hsa:2582 , hsa:2592 , hsa:5213 | 100 |
\n\tpath:hsa00053 | 0.95744681 | 0.99106522 | -0.1709827 | -0.5931413 | 494 | 22 | hsa:10327, hsa:54576, hsa:54658, hsa:54578, hsa:54659, hsa:219 , hsa:54600, hsa:54490 | 100 |
\n\tpath:hsa00061 | 0.54979253 | 0.70454895 | 0.2776840 | 0.9350247 | 264 | 17 | hsa:32 , hsa:84869, hsa:2180 , hsa:23305, hsa:51703, hsa:2181 , hsa:23205 | 100 |
\n\tpath:hsa00062 | 0.12428298 | 0.27923320 | -0.3722541 | -1.3592691 | 64 | 26 | hsa:9524 , hsa:11332 , hsa:3033 , hsa:401494, hsa:117145, hsa:51495 , hsa:9200 , hsa:51144 , hsa:9374 , hsa:79071 , hsa:51102 , hsa:3030 | 100 |
\n\tpath:hsa00071 | 0.05183585 | 0.15329235 | 0.3365501 | 1.4381879 | 23 | 43 | hsa:1375 , hsa:51 , hsa:2180 , hsa:34 , hsa:10449 , hsa:30 , hsa:217 , hsa:38 , hsa:3032 , hsa:224 , hsa:125 , hsa:23305 , hsa:51703 , hsa:1962 , hsa:36 , hsa:1376 , hsa:127 , hsa:2181 , hsa:10455 , hsa:113612, hsa:23205 , hsa:501 , hsa:223 | 100 |
\n\n
\n",
"text/markdown": "\nA data.table: 10 × 9\n\n| pathway <chr> | pval <dbl> | padj <dbl> | ES <dbl> | NES <dbl> | nMoreExtreme <dbl> | size <int> | leadingEdge <list> | pvals <int> |\n|---|---|---|---|---|---|---|---|---|\n| path:hsa00010 | 0.25818182 | 0.44865145 | -0.2413602 | -1.1392367 | 141 | 65 | hsa:2597 , hsa:226 , hsa:5315 , hsa:92579, hsa:10327, hsa:7167 , hsa:3939 , hsa:2821 , hsa:5211 , hsa:3098 , hsa:5106 , hsa:5213 , hsa:5230 , hsa:8789 , hsa:2023 , hsa:2203 , hsa:2026 , hsa:219 , hsa:230 , hsa:55902, hsa:229 , hsa:2027 , hsa:5232 , hsa:26330, hsa:5236 , hsa:3101 , hsa:131 , hsa:218 , hsa:80201, hsa:124 , hsa:130 , hsa:83440, hsa:5160 , hsa:222 | 100 |\n| path:hsa00020 | 0.47609943 | 0.63848993 | -0.2533863 | -0.9572276 | 248 | 29 | hsa:3421, hsa:47 , hsa:1431 | 100 |\n| path:hsa00030 | 0.16826004 | 0.34287602 | -0.3365079 | -1.2712396 | 87 | 29 | hsa:2539 , hsa:226 , hsa:25796 , hsa:2821 , hsa:5211 , hsa:5213 , hsa:8277 , hsa:8789 , hsa:414328, hsa:2203 , hsa:230 , hsa:229 , hsa:7086 | 100 |\n| path:hsa00040 | 0.34960938 | 0.54735223 | -0.2968775 | -1.0635063 | 178 | 25 | hsa:6652 , hsa:27294, hsa:10327, hsa:54576, hsa:54658, hsa:55277, hsa:54578, hsa:54659, hsa:9942 , hsa:54600, hsa:54490, hsa:57016 | 100 |\n| path:hsa00051 | 0.01506591 | 0.06516008 | -0.4205478 | -1.6467445 | 7 | 33 | hsa:7264 , hsa:6652 , hsa:226 , hsa:5373 , hsa:7167 , hsa:29925, hsa:5211 , hsa:3098 , hsa:29926, hsa:5213 , hsa:5207 , hsa:5372 , hsa:3795 , hsa:8789 , hsa:55556, hsa:2203 , hsa:230 , hsa:229 , hsa:26007 | 100 |\n| path:hsa00052 | 0.64352720 | 0.77853291 | -0.2252493 | -0.8679854 | 342 | 31 | hsa:92579, hsa:5211 , hsa:3098 , hsa:2582 , hsa:2592 , hsa:5213 | 100 |\n| path:hsa00053 | 0.95744681 | 0.99106522 | -0.1709827 | -0.5931413 | 494 | 22 | hsa:10327, hsa:54576, hsa:54658, hsa:54578, hsa:54659, hsa:219 , hsa:54600, hsa:54490 | 100 |\n| path:hsa00061 | 0.54979253 | 0.70454895 | 0.2776840 | 0.9350247 | 264 | 17 | hsa:32 , hsa:84869, hsa:2180 , hsa:23305, hsa:51703, hsa:2181 , hsa:23205 | 100 |\n| path:hsa00062 | 0.12428298 | 0.27923320 | -0.3722541 | -1.3592691 | 64 | 26 | hsa:9524 , hsa:11332 , hsa:3033 , hsa:401494, hsa:117145, hsa:51495 , hsa:9200 , hsa:51144 , hsa:9374 , hsa:79071 , hsa:51102 , hsa:3030 | 100 |\n| path:hsa00071 | 0.05183585 | 0.15329235 | 0.3365501 | 1.4381879 | 23 | 43 | hsa:1375 , hsa:51 , hsa:2180 , hsa:34 , hsa:10449 , hsa:30 , hsa:217 , hsa:38 , hsa:3032 , hsa:224 , hsa:125 , hsa:23305 , hsa:51703 , hsa:1962 , hsa:36 , hsa:1376 , hsa:127 , hsa:2181 , hsa:10455 , hsa:113612, hsa:23205 , hsa:501 , hsa:223 | 100 |\n\n",
"text/latex": "A data.table: 10 × 9\n\\begin{tabular}{lllllllll}\n pathway & pval & padj & ES & NES & nMoreExtreme & size & leadingEdge & pvals\\\\\n
& & & & & & & & \\\\\n\\hline\n\t path:hsa00010 & 0.25818182 & 0.44865145 & -0.2413602 & -1.1392367 & 141 & 65 & hsa:2597 , hsa:226 , hsa:5315 , hsa:92579, hsa:10327, hsa:7167 , hsa:3939 , hsa:2821 , hsa:5211 , hsa:3098 , hsa:5106 , hsa:5213 , hsa:5230 , hsa:8789 , hsa:2023 , hsa:2203 , hsa:2026 , hsa:219 , hsa:230 , hsa:55902, hsa:229 , hsa:2027 , hsa:5232 , hsa:26330, hsa:5236 , hsa:3101 , hsa:131 , hsa:218 , hsa:80201, hsa:124 , hsa:130 , hsa:83440, hsa:5160 , hsa:222 & 100\\\\\n\t path:hsa00020 & 0.47609943 & 0.63848993 & -0.2533863 & -0.9572276 & 248 & 29 & hsa:3421, hsa:47 , hsa:1431 & 100\\\\\n\t path:hsa00030 & 0.16826004 & 0.34287602 & -0.3365079 & -1.2712396 & 87 & 29 & hsa:2539 , hsa:226 , hsa:25796 , hsa:2821 , hsa:5211 , hsa:5213 , hsa:8277 , hsa:8789 , hsa:414328, hsa:2203 , hsa:230 , hsa:229 , hsa:7086 & 100\\\\\n\t path:hsa00040 & 0.34960938 & 0.54735223 & -0.2968775 & -1.0635063 & 178 & 25 & hsa:6652 , hsa:27294, hsa:10327, hsa:54576, hsa:54658, hsa:55277, hsa:54578, hsa:54659, hsa:9942 , hsa:54600, hsa:54490, hsa:57016 & 100\\\\\n\t path:hsa00051 & 0.01506591 & 0.06516008 & -0.4205478 & -1.6467445 & 7 & 33 & hsa:7264 , hsa:6652 , hsa:226 , hsa:5373 , hsa:7167 , hsa:29925, hsa:5211 , hsa:3098 , hsa:29926, hsa:5213 , hsa:5207 , hsa:5372 , hsa:3795 , hsa:8789 , hsa:55556, hsa:2203 , hsa:230 , hsa:229 , hsa:26007 & 100\\\\\n\t path:hsa00052 & 0.64352720 & 0.77853291 & -0.2252493 & -0.8679854 & 342 & 31 & hsa:92579, hsa:5211 , hsa:3098 , hsa:2582 , hsa:2592 , hsa:5213 & 100\\\\\n\t path:hsa00053 & 0.95744681 & 0.99106522 & -0.1709827 & -0.5931413 & 494 & 22 & hsa:10327, hsa:54576, hsa:54658, hsa:54578, hsa:54659, hsa:219 , hsa:54600, hsa:54490 & 100\\\\\n\t path:hsa00061 & 0.54979253 & 0.70454895 & 0.2776840 & 0.9350247 & 264 & 17 & hsa:32 , hsa:84869, hsa:2180 , hsa:23305, hsa:51703, hsa:2181 , hsa:23205 & 100\\\\\n\t path:hsa00062 & 0.12428298 & 0.27923320 & -0.3722541 & -1.3592691 & 64 & 26 & hsa:9524 , hsa:11332 , hsa:3033 , hsa:401494, hsa:117145, hsa:51495 , hsa:9200 , hsa:51144 , hsa:9374 , hsa:79071 , hsa:51102 , hsa:3030 & 100\\\\\n\t path:hsa00071 & 0.05183585 & 0.15329235 & 0.3365501 & 1.4381879 & 23 & 43 & hsa:1375 , hsa:51 , hsa:2180 , hsa:34 , hsa:10449 , hsa:30 , hsa:217 , hsa:38 , hsa:3032 , hsa:224 , hsa:125 , hsa:23305 , hsa:51703 , hsa:1962 , hsa:36 , hsa:1376 , hsa:127 , hsa:2181 , hsa:10455 , hsa:113612, hsa:23205 , hsa:501 , hsa:223 & 100\\\\\n\\end{tabular}\n",
"text/plain": " pathway pval padj ES NES nMoreExtreme size\n1 path:hsa00010 0.25818182 0.44865145 -0.2413602 -1.1392367 141 65 \n2 path:hsa00020 0.47609943 0.63848993 -0.2533863 -0.9572276 248 29 \n3 path:hsa00030 0.16826004 0.34287602 -0.3365079 -1.2712396 87 29 \n4 path:hsa00040 0.34960938 0.54735223 -0.2968775 -1.0635063 178 25 \n5 path:hsa00051 0.01506591 0.06516008 -0.4205478 -1.6467445 7 33 \n6 path:hsa00052 0.64352720 0.77853291 -0.2252493 -0.8679854 342 31 \n7 path:hsa00053 0.95744681 0.99106522 -0.1709827 -0.5931413 494 22 \n8 path:hsa00061 0.54979253 0.70454895 0.2776840 0.9350247 264 17 \n9 path:hsa00062 0.12428298 0.27923320 -0.3722541 -1.3592691 64 26 \n10 path:hsa00071 0.05183585 0.15329235 0.3365501 1.4381879 23 43 \n leadingEdge \n1 hsa:2597 , hsa:226 , hsa:5315 , hsa:92579, hsa:10327, hsa:7167 , hsa:3939 , hsa:2821 , hsa:5211 , hsa:3098 , hsa:5106 , hsa:5213 , hsa:5230 , hsa:8789 , hsa:2023 , hsa:2203 , hsa:2026 , hsa:219 , hsa:230 , hsa:55902, hsa:229 , hsa:2027 , hsa:5232 , hsa:26330, hsa:5236 , hsa:3101 , hsa:131 , hsa:218 , hsa:80201, hsa:124 , hsa:130 , hsa:83440, hsa:5160 , hsa:222 \n2 hsa:3421, hsa:47 , hsa:1431 \n3 hsa:2539 , hsa:226 , hsa:25796 , hsa:2821 , hsa:5211 , hsa:5213 , hsa:8277 , hsa:8789 , hsa:414328, hsa:2203 , hsa:230 , hsa:229 , hsa:7086 \n4 hsa:6652 , hsa:27294, hsa:10327, hsa:54576, hsa:54658, hsa:55277, hsa:54578, hsa:54659, hsa:9942 , hsa:54600, hsa:54490, hsa:57016 \n5 hsa:7264 , hsa:6652 , hsa:226 , hsa:5373 , hsa:7167 , hsa:29925, hsa:5211 , hsa:3098 , hsa:29926, hsa:5213 , hsa:5207 , hsa:5372 , hsa:3795 , hsa:8789 , hsa:55556, hsa:2203 , hsa:230 , hsa:229 , hsa:26007 \n6 hsa:92579, hsa:5211 , hsa:3098 , hsa:2582 , hsa:2592 , hsa:5213 \n7 hsa:10327, hsa:54576, hsa:54658, hsa:54578, hsa:54659, hsa:219 , hsa:54600, hsa:54490 \n8 hsa:32 , hsa:84869, hsa:2180 , hsa:23305, hsa:51703, hsa:2181 , hsa:23205 \n9 hsa:9524 , hsa:11332 , hsa:3033 , hsa:401494, hsa:117145, hsa:51495 , hsa:9200 , hsa:51144 , hsa:9374 , hsa:79071 , hsa:51102 , hsa:3030 \n10 hsa:1375 , hsa:51 , hsa:2180 , hsa:34 , hsa:10449 , hsa:30 , hsa:217 , hsa:38 , hsa:3032 , hsa:224 , hsa:125 , hsa:23305 , hsa:51703 , hsa:1962 , hsa:36 , hsa:1376 , hsa:127 , hsa:2181 , hsa:10455 , hsa:113612, hsa:23205 , hsa:501 , hsa:223 \n pvals\n1 100 \n2 100 \n3 100 \n4 100 \n5 100 \n6 100 \n7 100 \n8 100 \n9 100 \n10 100 "
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"allEnrichmentResult$`GSE5281-EC`$res[1:10,]"
]
},
{
"cell_type": "markdown",
"source": [
"We can select the significant pathways and calculate the statistics of NES scores. The result is stored in a list which contains the name of datasets (IDs), results of emrichment analysis generated from FGSEA method and statistics of NES score."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 18,
"id": "b120457e",
"metadata": {},
"outputs": [],
"source": [
"plots.enrichment.data <- allEnrichmentResult %>% lapply(function(data){\n",
" plot.data <- data$res\n",
" rownames(plot.data) <- plot.data$pathway\n",
" plot.data$dataset <- data$id\n",
" plot.data$NES.sd = abs((plot.data$NES - ifelse(plot.data$NES > 0, 1, -1))/qnorm(plot.data$pval))\n",
" sd <- plot.data$NES.sd\n",
" sd[sd > 0.5] <- 0.5\n",
"\n",
" plot.data$min <- plot.data$NES - sd*2\n",
" plot.data$max <- plot.data$NES + sd*2\n",
"\n",
" plot.data$min[plot.data$min < -2.5] <- -2.5\n",
" plot.data$max[plot.data$max > 2.5] <- 2.5\n",
"\n",
" # ES.df <- as.data.frame(do.call(cbind, data$res$NEs))\n",
" ES.df <- as.data.frame(data$res$ES)\n",
" rownames(ES.df) <- names(geneSet)\n",
"\n",
" list(\n",
" id = data$id,\n",
" res = plot.data,\n",
" ES = ES.df\n",
" )\n",
"})"
]
},
{
"cell_type": "markdown",
"source": [
"To view the summary of NES scores for the first ten pathways in the first dataset, we can use the following command:"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 19,
"outputs": [
{
"data": {
"text/html": "\nA data.table: 10 × 4\n\n\tpathway | NES.sd | min | max |
\n\t<chr> | <dbl> | <dbl> | <dbl> |
\n\n\n\tpath:hsa00010 | 0.2145533 | -1.56834325 | -0.71013014 |
\n\tpath:hsa00020 | 0.7135188 | -1.95722759 | 0.04277241 |
\n\tpath:hsa00030 | 0.2822285 | -1.83569653 | -0.70678263 |
\n\tpath:hsa00040 | 0.1643642 | -1.39223459 | -0.73477792 |
\n\tpath:hsa00051 | 0.2982653 | -2.24327510 | -1.05021390 |
\n\tpath:hsa00052 | 0.3588299 | -1.58564519 | -0.15032566 |
\n\tpath:hsa00053 | 0.2362989 | -1.06573918 | -0.12054346 |
\n\tpath:hsa00061 | 0.5192326 | -0.06497531 | 1.93502469 |
\n\tpath:hsa00062 | 0.3113684 | -1.98200588 | -0.73653239 |
\n\tpath:hsa00071 | 0.2692717 | 0.89964460 | 1.97673126 |
\n\n
\n",
"text/markdown": "\nA data.table: 10 × 4\n\n| pathway <chr> | NES.sd <dbl> | min <dbl> | max <dbl> |\n|---|---|---|---|\n| path:hsa00010 | 0.2145533 | -1.56834325 | -0.71013014 |\n| path:hsa00020 | 0.7135188 | -1.95722759 | 0.04277241 |\n| path:hsa00030 | 0.2822285 | -1.83569653 | -0.70678263 |\n| path:hsa00040 | 0.1643642 | -1.39223459 | -0.73477792 |\n| path:hsa00051 | 0.2982653 | -2.24327510 | -1.05021390 |\n| path:hsa00052 | 0.3588299 | -1.58564519 | -0.15032566 |\n| path:hsa00053 | 0.2362989 | -1.06573918 | -0.12054346 |\n| path:hsa00061 | 0.5192326 | -0.06497531 | 1.93502469 |\n| path:hsa00062 | 0.3113684 | -1.98200588 | -0.73653239 |\n| path:hsa00071 | 0.2692717 | 0.89964460 | 1.97673126 |\n\n",
"text/latex": "A data.table: 10 × 4\n\\begin{tabular}{llll}\n pathway & NES.sd & min & max\\\\\n & & & \\\\\n\\hline\n\t path:hsa00010 & 0.2145533 & -1.56834325 & -0.71013014\\\\\n\t path:hsa00020 & 0.7135188 & -1.95722759 & 0.04277241\\\\\n\t path:hsa00030 & 0.2822285 & -1.83569653 & -0.70678263\\\\\n\t path:hsa00040 & 0.1643642 & -1.39223459 & -0.73477792\\\\\n\t path:hsa00051 & 0.2982653 & -2.24327510 & -1.05021390\\\\\n\t path:hsa00052 & 0.3588299 & -1.58564519 & -0.15032566\\\\\n\t path:hsa00053 & 0.2362989 & -1.06573918 & -0.12054346\\\\\n\t path:hsa00061 & 0.5192326 & -0.06497531 & 1.93502469\\\\\n\t path:hsa00062 & 0.3113684 & -1.98200588 & -0.73653239\\\\\n\t path:hsa00071 & 0.2692717 & 0.89964460 & 1.97673126\\\\\n\\end{tabular}\n",
"text/plain": " pathway NES.sd min max \n1 path:hsa00010 0.2145533 -1.56834325 -0.71013014\n2 path:hsa00020 0.7135188 -1.95722759 0.04277241\n3 path:hsa00030 0.2822285 -1.83569653 -0.70678263\n4 path:hsa00040 0.1643642 -1.39223459 -0.73477792\n5 path:hsa00051 0.2982653 -2.24327510 -1.05021390\n6 path:hsa00052 0.3588299 -1.58564519 -0.15032566\n7 path:hsa00053 0.2362989 -1.06573918 -0.12054346\n8 path:hsa00061 0.5192326 -0.06497531 1.93502469\n9 path:hsa00062 0.3113684 -1.98200588 -0.73653239\n10 path:hsa00071 0.2692717 0.89964460 1.97673126"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plots.enrichment.data$`GSE5281-EC`$res[1:10,c(1,11:13)]"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Next we can use `ggplot` library to visualize the NES scores of each pathway across all datasets."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 20,
"id": "cea63877",
"metadata": {},
"outputs": [],
"source": [
"# We will pick ten pathways for visualization\n",
"picked.pathways.names <- names(geneSet)[1:10]\n",
"# This is the main script to plot the enrichment score for each pathway. The scruipt\n",
"# will generate the plot for each dataset and store in a list\n",
"plts <- plots.enrichment.data %>% lapply(function(data){\n",
" # Set the title of each plot by the dataset name\n",
" name_plot <- data$id\n",
" # Get the data for ploting\n",
" plot.data <- data$res\n",
" # Get the data for picked pathways\n",
" plot.data <- plot.data %>%\n",
" filter(pathway %in% picked.pathways.names)\n",
" # Plot the for each dataset\n",
" ggplot(plot.data, aes(y = pathway, x = NES, xmin = min, xmax = max)) + theme_minimal() +\n",
" geom_vline(xintercept = c(-1,1), colour=\"#FA8072\", linetype = \"longdash\") +\n",
" geom_vline(xintercept = c(0), colour=\"black\", linetype = \"longdash\") +\n",
" geom_errorbarh(height=.1) + theme_bw() +\n",
" geom_point(size = 1, color = \"red\") +\n",
" theme(axis.title.y=element_blank(),\n",
" axis.text.y=element_blank(),\n",
" axis.ticks.y=element_blank(),\n",
" plot.margin = unit(c(5,5,5,5), \"pt\"),\n",
" panel.grid.major = element_blank(),\n",
" panel.grid.minor = element_blank(),\n",
" plot.title = element_text(hjust = 0.5, face = \"bold\", size = 12),\n",
" axis.text.x = element_text(face = \"bold\", size = 12),\n",
" axis.title.x = element_text(face = \"bold\", size = 12)) +\n",
" labs(x = \"NES\", title = name_plot) +\n",
" xlim(-2.5, 2.5)\n",
"})"
]
},
{
"cell_type": "markdown",
"source": [
"After running the above script, we will get a list that contains the plots of five datasets. Now we can arrange the lot in one row using the `gridExtra` function available in the `cowplot` package."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 21,
"outputs": [
{
"data": {
"text/plain": "plot without title",
"image/png": "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\nyBgakE4MXODCcSFjaEA6MXCBC8eFjKGBQWIMtVUiMdS2V+8kUiB4454HTMrl2P8JD16Tdult\nq3IfJWeWZlohJeBsm5n23JkMevls41xRSDfnikKaiJn8lsp9VGqCq5lWSB8fH1Q3ue1l0547\nj0EHc14+25Uuw09fSuXOhdT7YCba8JK8oJDOGGKjjw+6kqhtL5z23GlSc14+23UuxKcvpXLf\nQup/MBNveUFe1BTS0r1Ya/v9RNeAzczONiPNw6qy1eqQMjyZEviUUW8QGtdflyTnHJuAUrmR\nC/XpRyco45Jj6jXSyG6d7JI+Klgu6U3paVMx+mwrXy6XFdLKOlbJ5r7yzapXSdeckYrebEie\nke5+s2HkjPQZC+m8abkzknAhdeVyUSHtrV3WS2v3qWbzuqnfuvoiDEdNEys7atub3SlLHb33\nv2uXXsF87kIqd430iQtpbe2u3lm7TjUXM+sDVQnDUVPc/qZn++SFNL6tyn0Ux2jqYr88nhx2\nTcvOt77XF4x7WVd29t5tWve6tovm1+UuGlsvuu0WqeZp5oThKJ/wgIHLQ7rEMdy1iiuaedPe\ntvVjt2EhzX3zrQ4K6dT1dhoQjK0rezrh0E3PezsnZTjKc+wkuOh3iWO4ujjUc18Xs6445uHS\nrnl30x7z50I6dlXukqcpoRkx9nRGGzY9M2vfE4ajPMdOgot+lzjG6XwSL7nOhbSr41VY2GXd\nXYNetImFtPDlRxvelyt20s2BC41KFxN1x3cVDpvlvFdIwY/BgIVfFHYnlt7Y8UJatQVMG94X\nlTsp21keuNBMKaSFDe8y9N8lBmxmx+urwVh/NUQ324ur3sJOPjHZzvLAhUali4m6w7poThPz\ntwOnkOp6v678sjAYm79rt+9uXyQMR3mO9Tdc9LvEMcJrpMFCbEIhtVURjc0+R3I3GnoPYyPD\nUZ5jJ8FFv0scI7xrV7miWiULKbrK8T9mbsDO3zYIxu7O32Ggm+9kHYknBi5w4bjEMZpD/3Sd\ns/YXOf6etnu6uswW0u788CgY6wd3tUI2l/Z0PUUajvIcOwku+l3iGO5wXtqqPUNsKjvbHFwJ\n7RfBYi9ZSPV+WR2/2XAeW/tvPnT3xalmhUKCy+d3iWMMDmc5pBMDF7hwXOIYKCSVOwku+l3i\nGJ+ukO4zLVzgkgCFxJkWLnBJkCgkRUgnJttZHrjQqHQxMvPnkV7zwgUuHBcyhgakEwMXuHBc\n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\nBIy0AACPwP8BoQCN8/rf364AAAAASUVORK5CYII="
},
"metadata": {
"image/png": {
"width": 420,
"height": 420
}
},
"output_type": "display_data"
}
],
"source": [
"gridExtra::grid.arrange(grobs = c(\n",
" list(\n",
" ggplot(plts[[1]]$data, aes(y = pathway, x = \"\")) +\n",
" labs(y = \"Pathway\", title = \"\", x = \"\") +\n",
" theme_minimal() +\n",
" theme(panel.grid.major.x = element_blank(),\n",
" plot.margin = unit(c(2,0,2,5), \"pt\"),\n",
" axis.text = element_text(face = \"bold\", size = 12),\n",
" axis.title.y = element_text(face = \"bold\", size = 12))\n",
" ),\n",
" plts\n",
"), nrow = 1, widths = c(1, rep(1, length(plts))))"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"id": "a092a6a2",
"metadata": {},
"source": [
"The previous plot only shows the pathway score for each dataset. It does not provide us the overview for each disease. Therefore, we can plot overlay of enrichment plots for all datasets with the same disease (group) using the following script."
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "23b4daea",
"metadata": {},
"outputs": [],
"source": [
"# Get the list of datasets that belong to one certain disease\n",
"groups <- list(\n",
" \"ALZHEIMER\" = c(\"GSE5281-EC\", \"GSE5281-HIP\", \"GSE5281-MTG\"),\n",
" \"PARKINSON\" = c(\"GSE99039\", \"GSE20292\")\n",
")\n",
"\n",
"# Combine the data\n",
"allCombinedData <- lapply(plots.enrichment.data, function(data) data$res)\n",
"allCombinedData <- as.data.frame(do.call(rbind, allCombinedData))\n",
"allCombinedData$disease <- \"NA\"\n",
"# Get the combine data for each group of disease\n",
"for (cat in names(groups)){\n",
" allCombinedData$disease[allCombinedData$dataset %in% groups[[cat]]] <- cat\n",
"}\n",
"\n",
"allCombinedData <- allCombinedData %>% filter(pathway %in% picked.pathways.names)\n",
"\n",
"# Plot the boxplot for each pathway using the combined data, the plot for\n",
"# each disease will be stored in a list. Here, we want to plot the NES scores for\n",
"# two diseases. Therefore, the result list will have two elements.\n",
"\n",
"plts <- allCombinedData %>% group_by(disease) %>% group_split() %>% lapply(function(data){\n",
" data$pathway <- factor(data$pathway,\n",
" levels = picked.pathways.names[length(picked.pathways.names):1])\n",
"\n",
" ggplot(data, aes(x=NES, y=pathway, group=dataset, col=dataset, fill=dataset)) +\n",
" theme_minimal() +\n",
" geom_point(position = position_dodge(0.7)) +\n",
" geom_rect(\n",
" aes(\n",
" xmin=-Inf, xmax=Inf, ymin=as.numeric(pathway)-0.5, ymax=as.numeric(pathway)+0.5\n",
" ),\n",
" fill = ifelse((as.numeric(data$pathway)%%2 == 0), \"white\", \"#eeeeee\"),\n",
" color = \"white\"\n",
" ) +\n",
" geom_point(position = position_dodge(0.7)) +\n",
" geom_vline(xintercept = c(-1,1), colour=\"#FA8072\", linetype = \"longdash\") +\n",
" geom_vline(xintercept = c(0), colour=\"grey\", linetype = \"solid\") +\n",
" geom_errorbarh(height=.3, aes(xmin = min, xmax = max), position = position_dodge(0.7)) +\n",
" theme_bw() +\n",
" xlim(-2.5, 2.5) +\n",
" theme(axis.title.y=element_blank(),\n",
" axis.text.y=element_blank(),\n",
" axis.ticks.y=element_blank(),\n",
" plot.margin = unit(c(5,5,5,5), \"pt\"),\n",
" panel.grid.major = element_blank(),\n",
" panel.grid.minor = element_blank(),\n",
" plot.title = element_text(hjust = 0.5, face = \"bold\", size = 12),\n",
" axis.text.x = element_text(face = \"bold\", size = 12),\n",
" axis.title.x = element_text(face = \"bold\", size = 12),\n",
" legend.position=\"top\",\n",
" legend.title = element_blank(),\n",
" legend.text = element_text(face = \"bold\", size = 10)) +\n",
" guides(color=guide_legend(ncol=1)) +\n",
" labs(title = data$disease[1])\n",
"})\n",
"\n",
"plotsAllLegends <- list()\n",
"plotsAllTitles <- list()\n",
"\n",
"for(j in 1:length(plts)){\n",
" p <- plts[[j]]\n",
" legendP <- get_legend(p)\n",
" titleP <- get_title(p)\n",
"\n",
" plotsAllLegends[[j]] <- legendP\n",
" plotsAllTitles[[j]] <- titleP\n",
"}\n",
"\n",
"\n",
"plotsWithoutLegend <- lapply(plts, function(plt){\n",
" plt <- plt + theme(legend.position = \"none\",\n",
" title = element_blank(),\n",
" plot.title = element_blank())\n",
"})\n",
"\n",
"gs_titles <- lapply(plotsAllTitles, function(p)\n",
" as_ggplot(p) + theme(\n",
" legend.margin=margin(c(0,0,0,0))))\n",
"\n",
"gs_legends <- lapply(plotsAllLegends, function(p)\n",
" as_ggplot(p) + theme(\n",
" legend.margin=margin(c(0,0,0,0))))\n",
"\n",
"listAll <- c(gs_titles, gs_legends, c(\n",
" list(\n",
" ggplot(plts[[1]]$data, aes(y = pathway, x = \"\")) +\n",
" labs(y = \"Pathway\", title = \"\", x = \"\") + theme_minimal() +\n",
" theme(panel.grid.major.x = element_blank(),\n",
" plot.margin = unit(c(2,0,2,5), \"pt\"),\n",
" axis.text = element_text(face = \"bold\", size = 12),\n",
" axis.title.y = element_text(face = \"bold\", size = 12))\n",
" ),\n",
" plotsWithoutLegend\n",
"))"
]
},
{
"cell_type": "markdown",
"source": [
"After getting the plot for each disease, we can arrange the plots in one row using the `gridExtra` function available in the `cowplot` package."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 23,
"outputs": [
{
"data": {
"text/plain": "plot without title",
"image/png": "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\nAAAAAElFTkSuQmCC"
},
"metadata": {
"image/png": {
"width": 420,
"height": 420
}
},
"output_type": "display_data"
}
],
"source": [
"gridExtra::grid.arrange(\n",
" grobs = listAll,\n",
" widths = c(5, rep(8,2)),\n",
" heights = c(0.4, 1.1, 8),\n",
" layout_matrix = rbind(c(NA, rep(1:2)),\n",
" c(NA, rep(3:4)),\n",
" c(rep(5:7)))\n",
")"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"From the figure above, we see that the same pathway in different datasets has different enrichment scores. The score might be significant in one dataset but it is not significant in other datasets. Therefore, it is necessary to perform meta-analysis to increase the statistical power of each pathway."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"id": "d1762f83",
"metadata": {},
"source": [
"## Meta Analysis\n",
"In this section we will perform generic inverse variance meta-analysis using `metagen` function available in the `meta` package. `metagen` is a statistical method used in meta-analysis to combine the results of multiple studies that have measured the same effect size, typically using different sample sizes and study designs. This method involves pooling the effect sizes from each study, weighted by the inverse of their variance, in order to obtain an overall estimate of the effect size and its confidence interval.\n",
"\n",
"The basic idea behind the generic inverse variance meta-analysis is that studies with larger sample sizes, which tend to have smaller variance, should be given more weight in the meta-analysis than studies with smaller sample sizes, which tend to have larger variance. This is achieved by weighting each study's effect size estimate by the inverse of its variance, which is a measure of the precision of the estimate.\n",
"\n",
"The generic inverse variance meta-analysis is often used in meta-analyses of randomized controlled trials or observational studies, where the effect size is typically reported as a mean difference or a standardized mean difference between two groups, or as a hazard ratio or odds ratio for a binary outcome. This method assumes that the effect size estimates from each study are independent and normally distributed around the true effect size, and that there is no systematic bias or heterogeneity in the effect size estimates across studies."
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "be40d873",
"metadata": {},
"outputs": [],
"source": [
"# Get combined data\n",
"allCombinedData <- lapply(plots.enrichment.data, function(data) data$res)\n",
"allCombinedData <- as.data.frame(do.call(rbind, allCombinedData))\n",
"allCombinedData$disease <- \"NA\"\n",
"\n",
"for (cat in names(groups)){\n",
" allCombinedData$disease[allCombinedData$dataset %in%\n",
" groups[[cat]]] <- cat\n",
"}\n",
"\n",
"#Performing meta analysis on groups of datasets with the same disease\n",
"metaESRes <- allCombinedData %>%\n",
" group_by(disease, pathway) %>%\n",
" group_split() %>%\n",
" lapply(function(data){\n",
" data <- drop_na(data)\n",
"\n",
" res <- suppressWarnings(meta::metagen(data = data,\n",
" studlab = pathway,\n",
" TE = NES ,\n",
" seTE =NES.sd,\n",
" sm = \"SMD\",\n",
" n.e = NULL,\n",
" #n.e = sample.size,\n",
" method.tau = \"REML\",\n",
" hakn = TRUE))\n",
"\n",
" NES.combined <- res$TE.fixed\n",
" NES.combined.sd <- res$seTE.fixed\n",
"\n",
" pval <- pnorm((ifelse(NES.combined > 0, 1, -1) - NES.combined)/NES.combined.sd)\n",
" if (NES.combined < 0) pval <- 1 - pval\n",
"\n",
" data.frame(\n",
" disease = data$disease[1],\n",
" pathway = data$pathway[1],\n",
" NES.combined = NES.combined,\n",
" NES.combined.sd = NES.combined.sd,\n",
" pval.combined = pval,\n",
" count = nrow(data),\n",
" stringsAsFactors = F\n",
" )\n",
"}) %>% do.call(what = rbind) %>% as.data.frame()"
]
},
{
"cell_type": "markdown",
"source": [
"After we perform meta-analysis we can calculate the adjust p-value me meta enrichment scores. We will use function `p.adjust` to calcuate adjust P-values for multiple comparisons. The result is save into a data frame."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 26,
"outputs": [],
"source": [
"#Computing adjusted meta p-values\n",
"metaESRes <- metaESRes %>%\n",
" group_by(disease) %>%\n",
" group_split() %>%\n",
" lapply(function(r){\n",
" r$p.fdr <- p.adjust(r$pval.combined, method = \"fdr\")\n",
" r\n",
"}) %>% do.call(what = rbind)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"We can plot meta analysis result using the script that we have developed previously."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 27,
"id": "2c00e117",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": "plot without title",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAMAAADKOT/pAAAAZlBMVEUAAAAzMzNNTU1oaGh8\nfHyDg4OMjIyVlZWampqjo6Onp6evr6+ysrK5ubm9vb3BwcHHx8fJycnQ0NDR0dHY2NjZ2dne\n3t7h4eHk5OTp6enq6urr6+vv7+/w8PD19fX6gHL/AAD///9lmioCAAAACXBIWXMAABJ0AAAS\ndAHeZh94AAAgAElEQVR4nO2dbWPauhKEWTUupZRSSpqmHMKN//+fvLZsgd/Eas06gfU8H5LN\nYBl72MGSoecscgDAzSw++wAAsACCBIACCBIACiBIACiAIAGgAIIEgAIIEgAKIEgAKIAgAaAA\ngsTxbbFYfPVVUZzVxZmL7ItF45GL4vwGbjG4id/g27/mk/5ZPBU/3767hfv+VlRPiz8fcrLq\n1Kf3xZ9F3nGzceLBxC+F8u/s28+88djPp3Ls73rHf79/KXf7N2zR2rTiQ01EkDjqhs9vCtKi\n7JZ/7ex0/nDNJH1Z/CpawJ0f+LX48nFnrMnl9N4uf3ce+ZefvX2q/gzOuLBl9ZDnu9d+hNE/\n6i2am9Z4E/+589NPaiKCxPDHvw7+reyWIBUvafFCXgvS4tvlSX8vFm/+3ftnOah44G2x+J0/\nIpfT8wFou9k48crE781YlQ/9zMNfv86bl0b8vIz+mXc3rWmb+H1iExEkhuK1/Vp3QevtzvNU\nPtIL0uXx8zurb5avCxfZpOqTi/jFT0q+f3X55f34MS9Jl9Pzl4y+m/WJ+5+/W29Zi3Cd8X89\nVVkoRj/5SCy+Flv+Lf4s09LetKYy8euXavflw1OaiCAxFDPxt4FXyfPdz/cTgvS1bpav0SC1\nxH/1jKV+oHzyH9Xs8OHonN6Am5cg/V2ES8bFt59529c3//tHWGgVb06lVe1NKzomlvqUJiJI\n1/lXvmRfqxegG6Sf/t0xJUjFln/LPvl57Yr0pbnjMAcp34LLDvkdltMPRvuKNOBmfeLllcVV\nfuYX3/4tztfkp+oaVPG0CPcN/vgx7U0rGiaW7j3l05qIIF3nZ7m8+bXovt2V/L5M6AfXPPml\nIf6U75c/i04Y3KQx2a/4WuYuVJX+9/we/FhcTq+cz3XcbK9y/N2E81246sf3cpj/q1pdff31\ndn48j21acTHRXwjLUE1pIoJ0nafy7fOtc+nx/Asve0KQ/v4odvC0+PH3SpCeLrv+cn6ioqpv\n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\n7eIs1wmHFAAAAABJRU5ErkJggg=="
},
"metadata": {
"image/png": {
"width": 420,
"height": 420
}
},
"output_type": "display_data"
}
],
"source": [
"plts <- metaESRes %>% group_by(disease) %>% group_split() %>% lapply(function(plotDat){\n",
" plotDat <- data.frame(plotDat)\n",
" rownames(plotDat) <- plotDat$pathway\n",
" plotDat <- plotDat[picked.pathways.names, ]\n",
" plotDat$pathway <- factor(plotDat$pathway,\n",
" levels = picked.pathways.names[length(picked.pathways.names):1])\n",
"\n",
" sd <- plotDat$NES.combined.sd\n",
" sd[sd > 0.5] <- 0.5\n",
"\n",
" plotDat$min <- plotDat$NES.combined - sd*2\n",
" plotDat$max <- plotDat$NES.combined + sd*2\n",
"\n",
" plotDat$min[plotDat$min < -2.5] <- -2.5\n",
" plotDat$max[plotDat$max > 2.5] <- 2.5\n",
"\n",
" ggplot(plotDat, aes(y = pathway, x = NES.combined, xmin=min, xmax = max)) +\n",
" theme_minimal() +\n",
" geom_vline(xintercept = c(-1,1), colour=\"#FA8072\", linetype = \"longdash\") +\n",
" geom_vline(xintercept = c(0), colour=\"black\", linetype = \"longdash\") +\n",
" geom_errorbarh(height=.1) + theme_bw() +\n",
" geom_point(size = 1, color = \"red\") +\n",
" theme(axis.title.y=element_blank(),\n",
" axis.text.y=element_blank(),\n",
" axis.ticks.y=element_blank(),\n",
" plot.margin = unit(c(5,5,5,5), \"pt\"),\n",
" panel.grid.major = element_blank(),\n",
" panel.grid.minor = element_blank(),\n",
" plot.title = element_text(hjust = 0.5, face = \"bold\", size = 12),\n",
" axis.text.x = element_text(face = \"bold\", size = 12),\n",
" axis.title.x = element_text(face = \"bold\", size = 12)) +\n",
" labs(x = \"NES\", title = paste0(plotDat$disease[1], \" (\",plotDat$count[1],\")\")) +\n",
" xlim(-2.5, 2.5)\n",
"})\n",
"\n",
"gridExtra::grid.arrange(grobs = c(\n",
" list(\n",
" ggplot(plts[[1]]$data, aes(y = pathway, x = \"\")) +\n",
" labs(y = \"Pathway\", title = \"\", x = \"\") +\n",
" theme_minimal() +\n",
" theme(panel.grid.major.x = element_blank(),\n",
" plot.margin = unit(c(2,0,2,5), \"pt\"),\n",
" axis.text = element_text(face = \"bold\",\n",
" size = 12),\n",
" axis.title.y = element_text(face = \"bold\", size = 12))\n",
" ),\n",
" plts\n",
"), nrow = 1, widths = c(0.6, rep(1, length(plts))))\n"
]
},
{
"cell_type": "markdown",
"source": [
"From the above figure we see that the enrichment scores produced from meta-analysis using multiple datasets are more significant compared with the ones calculated them from a single dataset.\n"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"## Conclusion\n",
"In this course, we have successfully completed pathway analysis using omics data using five sub-modules that cover different aspects of bioinformatics analysis. The first sub-module, Data Processing, teaches the fundamental concepts of preprocessing and quality control of microarray data obtained from Gene Expression Omnibus. The second sub-module, Differential Expression Analysis, focuses how to analyze gene expression data to identify genes that are differentially expressed between two or more conditions. The third sub-module, Gene Set and Pathway shows us how to use different R library to obtain pathways and GO terms with associated gene list. The fourth sub-module, Enrichment Analysis, focuses on the identification of enriched biological pathways or functional categories within a set of genes of interest. Finally, the fifth sub-module, Meta Analysis, teaches the techniques of meta-analysis which is a statistical approach to combine the results of multiple independent studies. Overall, the cloud learning module provides a comprehensive and practical guide for researchers to analyze and interpret their genomic data using various bioinformatics tools and techniques.\n"
],
"metadata": {
"collapsed": false
}
}
],
"metadata": {
"celltoolbar": "Tags",
"environment": {
"kernel": "ir",
"name": "r-cpu.4-1.m93",
"type": "gcloud",
"uri": "gcr.io/deeplearning-platform-release/r-cpu.4-1:m93"
},
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "4.2.2"
},
"toc-showcode": true,
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}