Python版RNA-seq分析教程:DEseq2差異表達基因分析

Bulk RNA-seq 分析的一個重要任務(wù)是分析差異表達基因党饮,我們可以用 omicverse
來完成這個任務(wù)局雄。在omicverse中评甜,除了最簡單的ttest外,在這里隶校,我們介紹一種類似R語言中的Deseq2等包的模型來計算差異表達基因漏益。

環(huán)境的下載

在這里我們只需要安裝omicverse環(huán)境即可,有兩個方法:

  • 一個是使用conda:conda install omicverse -c conda-forge
  • 另一個是使用pip:pip install omicverse -i https://pypi.tuna.tsinghua.edu.cn/simple/惠况。-i的意思是指定清華鏡像源遭庶,在國內(nèi)可能會下載地快一些。

詳細的安裝教程見omicverse官網(wǎng)稠屠。

導(dǎo)入包

我們首先導(dǎo)入分析需要用到的所有包峦睡,包括omicverse, pandas, numpy, scanpy matplotlibseaborn.

import omicverse as ov
import pandas as pd
import numpy as np
import scanpy as sc
import matplotlib.pyplot as plt
import seaborn as sns

#設(shè)定繪圖格式,分辨率300dpi等
ov.utils.ov_plot_set()

下載基因集

當我們需要轉(zhuǎn)換基因 id 時权埠,我們需要準備一個映射對文件榨了。在這里,我們預(yù)處理了6個基因組 gtf 文件和生成的映射對攘蔽,包括 T2T-CHM13龙屉,GRCh38,GRCh37满俗,GRCm39转捕,danRer7和 danRer11。如果需要轉(zhuǎn)換其他 id唆垃,可以使用 gtf 將文件放在 genesets 目錄中生成自己的映射五芝。

ov.utils.download_geneid_annotation_pair()

讀取數(shù)據(jù)

data=pd.read_csv('https://raw.githubusercontent.com/Starlitnightly/ov/master/sample/counts.txt',index_col=0,sep='\t',header=1)
#replace the columns `.bam` to `` 
data.columns=[i.split('/')[-1].replace('.bam','') for i in data.columns]
data.head()

值得注意的是,我們的數(shù)據(jù)集并沒有經(jīng)過任何處理辕万,featurecounts比對時用的gtf為GRCm39枢步,所以我們這里用GRCm39來做基因id映射

基因id轉(zhuǎn)換

data=ov.bulk.Matrix_ID_mapping(data,'genesets/pair_GRCm39.tsv')
data.head()

差異表達分析

我們可以非常簡單地通過omicverse進行差異表達基因分析,只需要提供一個表達式矩陣渐尿。我們首先創(chuàng)建一個 pyDEG 對象醉途,并使用drop_duplicates_index去除重復(fù)的基因。由于部分基因名相同砖茸,我們的去除保留了表達量最大的基因名隘擎。

dds=ov.bulk.pyDEG(data)
dds.drop_duplicates_index()
print('... drop_duplicates_index success')

現(xiàn)在我們可以從表達矩陣中計算差異表達基因,在計算前我們需要輸入實驗組和對照組凉夯。在這里嵌屎,我們指定 4-34-4為實驗組推正,1--1, 1--2為對照組恍涂,我們設(shè)定methodDEseq2也是支持的宝惰,不過流程可能會有一些區(qū)別,我們放到下一期講再沧。

treatment_groups=['4-3','4-4']
control_groups=['1--1','1--2']
result=dds.deg_analysis(treatment_groups,control_groups,
            method='DEseq2')
result.head()
Fitting size factors...
... done in 0.00 seconds.

Fitting dispersions...
... done in 1.59 seconds.

Fitting dispersion trend curve...
... done in 2.82 seconds.

logres_prior=1.1538905878789707, sigma_prior=0.25
Fitting MAP dispersions...
... done in 1.57 seconds.

Fitting LFCs...
... done in 1.27 seconds.

Refitting 0 outliers.

Running Wald tests...
... done in 1.33 seconds.

Log2 fold change & Wald test p-value: condition Treatment vs Control

在計算完差異表達基因后尼夺,我們會發(fā)現(xiàn)一個重要的事情,就是低表達基因有很多炒瘸,如果我們不對其進行過濾淤堵,會影響后續(xù)火山圖的繪制,我們設(shè)定基因的平均表達量大于1作為閾值顷扩,將平均表達量低于1的基因全部過濾掉拐邪。

print(result.shape)
result=result.loc[result['log2(BaseMean)']>1]
print(result.shape)

我們還需要設(shè)置 Foldchange 的閾值,我們準備了一個名為 foldchange_set 的方法函數(shù)來完成隘截。此函數(shù)根據(jù) log2FC 分布自動計算適當?shù)拈撝翟祝部梢允謩虞斎腴撝怠T摵瘮?shù)有三個參數(shù):

  • fc_threshold: 差異表達倍數(shù)的閾值婶芭,-1為自動計算
  • pval_threshold: 差異表達基因的p-value過濾值东臀,默認為0.05,在有些情況下可以設(shè)定為0.1犀农,意味著統(tǒng)計學差異不顯著惰赋。
  • logp_max: p值的最大值,由于部分p值過小呵哨,甚至為0赁濒,取對數(shù)后火山圖繪制較為困難,我們可以設(shè)定一個上限孟害,高于這個上限的p值全部統(tǒng)一拒炎。
# -1 means automatically calculates
dds.foldchange_set(fc_threshold=-1,
                   pval_threshold=0.05,
                   logp_max=6)

差異表達的結(jié)果可視化

omicverse除了有較為完善的分析能力外,還有極強的可視化能力纹坐。首先是火山圖枝冀,我們使用 plot_volcano函數(shù)來實現(xiàn)。該函數(shù)可以繪制你感興趣的基因或高表達的基因耘子。您需要輸入一些參數(shù):

  • title: 火山圖的標題
  • figsize: 圖像大小
  • plot_genes: 需要繪制的基因果漾,格式為list。如['Gm8925','Snorc']
  • plot_genes_num: 需要繪制的基因數(shù)谷誓,該參數(shù)與plot_genes互斥绒障,如果我們沒有指定需要繪制的基因,可以自動繪制前n個高差異表達倍數(shù)的基因捍歪。

此外户辱,我們還可以指定繪制的顏色等鸵钝,具體的參數(shù)可以使用help(dds.plot_volcano)來查看

dds.plot_volcano(title='DEG Analysis',figsize=(4,4),
                 plot_genes_num=8,plot_genes_fontsize=12,)
差異表達火山圖

如果我們想繪制特定的基因的箱線圖,我們也可以使用 plot_boxplot 函數(shù)來完成該任務(wù)庐镐。

dds.plot_boxplot(genes=['Ckap2','Lef1'],treatment_groups=treatment_groups,
                control_groups=control_groups,figsize=(2,3),fontsize=12,
                 legend_bbox=(2,0.55))
差異表達箱線圖

通路富集分析

在差異表達基因計算出來后恩商,我們需要直接進行的下一步分析往往是看差異表達的基因與哪些通路相關(guān),這里我們常用的方法是富集分析必逆。omicverse可以一鍵完成富集分析并且可視化怠堪。

我們封裝了gseapy 包進入omicverse,其中包括 GSEA 富集分析的相關(guān)功能名眉。我們優(yōu)化了包的輸出粟矿,并給出了一些更好看的圖形繪制功能

類似地,我們首先需要下載通路數(shù)據(jù)庫损拢。我們已經(jīng)準備好了五個基因集陌粹,可以使用 ov.utils.download_pathway_database()進行自動下載。除此之外福压,你還可以在以下網(wǎng)站找到你感興趣的基因集: https://maayanlab.cloud/enrichr/#libraries

ov.utils.download_pathway_database()
#讀取通路基因集掏秩,我們讀取Wiki通路數(shù)據(jù)庫
pathway_dict=ov.utils.geneset_prepare('genesets/WikiPathways_2019_Mouse.txt',organism='Mouse')

與此前選取差異表達的基因進行通路富集分析不同,在這里隧膏,我們使用基因的差異倍數(shù)和p值進行排序哗讥,進行GSEA分析。我們使用以下公式計算基因的順序胞枕。

Metric=\frac{-log_{10}(padj)}{sign(log2FC)}

rnk=dds.ranking2gsea()

們使用 ov.bulk.pyGSEA 構(gòu)造一個 GSEA 對象來執(zhí)行通路富集分析杆煞。

gsea_obj=ov.bulk.pyGSEA(rnk,pathway_dict)
enrich_res=gsea_obj.enrichment()

通路富集分析的結(jié)果被存放在enrich_res變量中,我們使用.head()函數(shù)來查看

gsea_obj.enrich_res.head()
通路富集結(jié)果

為了可視化通路富集的結(jié)果腐泻,我們使用.plot_enrichment函數(shù)來完成該目的.

  • num: 需要展示的通路富集結(jié)果决乎,默認是前10條.
  • node_size: 點的大小標注值. 默認是[5,10,15].
  • cax_loc: 圖注的橫坐標. 默認值 2.
  • cax_fontsize: 圖注的字體大小,默認值 12.
  • fig_title: 富集結(jié)果的標題.
  • fig_xlabel: 富集結(jié)果的橫坐標標題派桩,默認值是'Fractions of genes'.
  • figsize: 圖像大小构诚,默認值是(2,4).
  • cmap: 圖像顏色條,默認值是'YlGnBu'.
gsea_obj.plot_enrichment(num=10,node_size=[10,20,30],
                        cax_loc=2.5,cax_fontsize=12,
                        fig_title='Wiki Pathway Enrichment',fig_xlabel='Fractions of genes',
                        figsize=(2,4),cmap='YlGnBu',
                        text_knock=2,text_maxsize=30)
通路富集結(jié)果

不僅僅是基本的富集分析铆惑,pyGSEA 還可以幫助我們用繪制GSEA的排序圖范嘱,我們需要選擇想繪制的通路,給定通路的Term位置员魏,例如0Complement and Coagulation Cascades WP449 丑蛤,1Matrix Metalloproteinases WP441

gsea_obj.enrich_res.index[:5]
Index(['Complement and Coagulation Cascades WP449',
       'Matrix Metalloproteinases WP441', 'TYROBP Causal Network WP3625',
       'PPAR signaling pathway WP2316',
       'Metapathway biotransformation WP1251'],
      dtype='object', name='Term')

我們可以使用.plot_gsea完成繪制。

  • term_num: 需要繪制的通路在index的位置
  • gene_set_title: 通路標題撕阎,可自定義受裹,如果原index中的太長
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)
GSEA富集可視化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棉饶,更是在濱河造成了極大的恐慌厦章,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件照藻,死亡現(xiàn)場離奇詭異袜啃,居然都是意外死亡,警方通過查閱死者的電腦和手機岩梳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門囊骤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冀值,你說我怎么就攤上這事」溃” “怎么了列疗?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浪蹂。 經(jīng)常有香客問我抵栈,道長,這世上最難降的妖魔是什么坤次? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任古劲,我火速辦了婚禮,結(jié)果婚禮上缰猴,老公的妹妹穿的比我還像新娘产艾。我一直安慰自己,他們只是感情好滑绒,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布闷堡。 她就那樣靜靜地躺著,像睡著了一般疑故。 火紅的嫁衣襯著肌膚如雪杠览。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天纵势,我揣著相機與錄音踱阿,去河邊找鬼。 笑死钦铁,一個胖子當著我的面吹牛软舌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播育瓜,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼葫隙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躏仇?” 一聲冷哼從身側(cè)響起恋脚,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤腺办,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糟描,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀喉,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年船响,在試婚紗的時候發(fā)現(xiàn)自己被綠了躬拢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡见间,死狀恐怖聊闯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情米诉,我是刑警寧澤菱蔬,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站史侣,受9級特大地震影響拴泌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惊橱,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蚪腐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧税朴,春花似錦回季、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卓囚,卻和暖如春瘾杭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哪亿。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工粥烁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝇棉。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓讨阻,卻偏偏與公主長得像玫镐,于是被迫代替她去往敵國和親氧苍。 傳聞我的和親對象是個殘疾皇子衡便,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容