KeTuTu's picture
Upload 46 files
2999286 verified
#!/usr/bin/env python
# coding: utf-8
# # Different Expression Analysis with DEseq2
#
# An important task of bulk rna-seq analysis is the different expression , which we can perform with omicverse. For different expression analysis, ov change the `gene_id` to `gene_name` of matrix first.
#
# Now we can use `PyDEseq2` to perform DESeq2 analysis like R
#
# Paper: [PyDESeq2: a python package for bulk RNA-seq differential expression analysis](https://www.biorxiv.org/content/10.1101/2022.12.14.520412v1)
#
# Code: https://github.com/owkin/PyDESeq2
#
# Colab_Reproducibility:https://colab.research.google.com/drive/1fZS-v0zdIYkXrEoIAM1X5kPoZVfVvY5h?usp=sharing
# In[1]:
import omicverse as ov
ov.utils.ov_plot_set()
# Note that this dataset has not been processed in any way and is only exported by `featureCounts`, and Sequence alignment was performed from the genome file of CRCm39
# In[2]:
data=ov.utils.read('https://raw.githubusercontent.com/Starlitnightly/Pyomic/master/sample/counts.txt',index_col=0,header=1)
#replace the columns `.bam` to ``
data.columns=[i.split('/')[-1].replace('.bam','') for i in data.columns]
data.head()
# ## ID mapping
#
# We performed the gene_id mapping by the mapping pair file `GRCm39` downloaded before.
# In[ ]:
ov.utils.download_geneid_annotation_pair()
# In[3]:
data=ov.bulk.Matrix_ID_mapping(data,'genesets/pair_GRCm39.tsv')
data.head()
# ## Different expression analysis with ov
#
# We can do differential expression analysis very simply by ov, simply by providing an expression matrix. To run DEG, we simply need to:
#
# - Read the raw count by featureCount or any other qualify methods.
# - Create an ov DEseq object.
# In[4]:
dds=ov.bulk.pyDEG(data)
# We notes that the gene_name mapping before exist some duplicates, we will process the duplicate indexes to retain only the highest expressed genes
# In[5]:
dds.drop_duplicates_index()
print('... drop_duplicates_index success')
# Now we can calculate the different expression gene from matrix, we need to input the treatment and control groups
# In[6]:
treatment_groups=['4-3','4-4']
control_groups=['1--1','1--2']
result=dds.deg_analysis(treatment_groups,control_groups,method='DEseq2')
# One important thing is that we do not filter out low expression genes when processing DEGs, and in future versions I will consider building in the corresponding processing.
# In[7]:
print(result.shape)
result=result.loc[result['log2(BaseMean)']>1]
print(result.shape)
# We also need to set the threshold of Foldchange, we prepare a method named `foldchange_set` to finish. This function automatically calculates the appropriate threshold based on the log2FC distribution, but you can also enter it manually.
# In[8]:
# -1 means automatically calculates
dds.foldchange_set(fc_threshold=-1,
pval_threshold=0.05,
logp_max=10)
# ## Visualize the DEG result and specific genes
#
# To visualize the DEG result, we use `plot_volcano` to do it. This fuction can visualize the gene interested or high different expression genes. There are some parameters you need to input:
#
# - title: The title of volcano
# - figsize: The size of figure
# - plot_genes: The genes you interested
# - plot_genes_num: If you don't have interested genes, you can auto plot it.
# In[9]:
dds.plot_volcano(title='DEG Analysis',figsize=(4,4),
plot_genes_num=8,plot_genes_fontsize=12,)
# To visualize the specific genes, we only need to use the `dds.plot_boxplot` function to finish it.
# In[10]:
dds.plot_boxplot(genes=['Ckap2','Lef1'],treatment_groups=treatment_groups,
control_groups=control_groups,figsize=(2,3),fontsize=12,
legend_bbox=(2,0.55))
# In[11]:
dds.plot_boxplot(genes=['Ckap2'],treatment_groups=treatment_groups,
control_groups=control_groups,figsize=(2,3),fontsize=12,
legend_bbox=(2,0.55))
# ## Pathway enrichment analysis by Pyomic
#
# Here we use the `gseapy` package, which included the GSEA analysis and Enrichment. We have optimised the output of the package and given some better looking graph drawing functions
#
# Similarly, we need to download the pathway/genesets first. Five genesets we prepare previously, you can use `Pyomic.utils.download_pathway_database()` to download automatically. Besides, you can download the pathway you interested from enrichr: https://maayanlab.cloud/Enrichr/#libraries
# In[13]:
ov.utils.download_pathway_database()
# In[14]:
pathway_dict=ov.utils.geneset_prepare('genesets/WikiPathways_2019_Mouse.txt',organism='Mouse')
# To perform the GSEA analysis, we need to ranking the genes at first. Using `dds.ranking2gsea` can obtain a ranking gene's matrix sorted by -log10(padj).
#
# $Metric=\frac{-log_{10}(padj)}{sign(log2FC)}$
# In[15]:
rnk=dds.ranking2gsea()
# We used `ov.bulk.pyGSEA` to construst a GSEA object to perform enrichment.
# In[16]:
gsea_obj=ov.bulk.pyGSEA(rnk,pathway_dict)
# In[17]:
enrich_res=gsea_obj.enrichment()
# The results are stored in the `enrich_res` attribute.
# In[18]:
gsea_obj.enrich_res.head()
# To visualize the enrichment, we use `plot_enrichment` to do.
# - num: The number of enriched terms to plot. Default is 10.
# - node_size: A list of integers defining the size of nodes in the plot. Default is [5,10,15].
# - cax_loc: The location of the colorbar on the plot. Default is 2.
# - cax_fontsize: The fontsize of the colorbar label. Default is 12.
# - fig_title: The title of the plot. Default is an empty string.
# - fig_xlabel: The label of the x-axis. Default is 'Fractions of genes'.
# - figsize: The size of the plot. Default is (2,4).
# - cmap: The colormap to use for the plot. Default is 'YlGnBu'.
# In[19]:
gsea_obj.plot_enrichment(num=10,node_size=[10,20,30],
cax_fontsize=12,
fig_title='Wiki Pathway Enrichment',fig_xlabel='Fractions of genes',
figsize=(2,4),cmap='YlGnBu',
text_knock=2,text_maxsize=30,
cax_loc=[2.5, 0.45, 0.5, 0.02],
bbox_to_anchor_used=(-0.25, -13),node_diameter=10,)
# Not only the basic analysis, pyGSEA also help us to visualize the term with Ranked and Enrichment Score.
#
# We can select the number of term to plot, which stored in `gsea_obj.enrich_res.index`, the `0` is `Complement and Coagulation Cascades WP449` and the `1` is `Matrix Metalloproteinases WP441`
# In[20]:
gsea_obj.enrich_res.index[:5]
# We can set the `gene_set_title` to change the title of GSEA plot
# In[22]:
fig=gsea_obj.plot_gsea(term_num=1,
gene_set_title='Matrix Metalloproteinases',
figsize=(3,4),
cmap='RdBu_r',
title_fontsize=14,
title_y=0.95)
# In[ ]: