scRNA-Seq | 指定 2 組cluster 比較富集分析

一简僧、準備工作

1. 軟件包安裝

if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("clusterProfiler")
BiocManager::install("org.Hs.eg.db")
BiocManager::install("pathview")
install.packages("msigdbr")
install.packages("ggnewscale")

library(Seurat)
library(tidyverse)
library(clusterProfiler)
library(pathview)
library(enrichplot)
library(msigdbr)

2. 尋找差異表達基因

差異分析參考

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

path_to_pbmc_rds = "sce_final.rds"
pbmc <- readRDS(path_to_pbmc_rds)

篩選差異基因

## 在尋找差異基因之前涎劈,把默認的assay切換為RNA。
DefaultAssay(pbmc) <- 'RNA'

## 定義好你想要在哪一個分群基礎(chǔ)上找差異表達基因
Idents(pbmc) <- 'seurat_clusters' 

## 在不同cluster/或者celltype中找差異表達基因
only.pos = TRUE           # 只找上調(diào)的差異表達基因
logfc.threshold = 0.25    # 差異基因的avg_log2FC必須要大于0.25

# 對所有Cluster依次進行差異表達分析谅海,將所有Cluster分為兩類蹦浦,我與非我
# all.clusters.markers <- FindAllMarkers(pbmc, only.pos = T, logfc.threshold = logfc.threshold)
# head(all.clusters.markers)

# 只對指定的Cluster進行差異表達分析
markers <- FindMarkers(pbmc, ident.1 = 1, ident.2 = 2, only.pos = T)
head(markers)

markers = markers %>% rownames_to_column('gene') %>% filter(p_val_adj < 0.05)
head(markers)

注:

  • readRDS() 函數(shù)讀取*.rds對象.rds與.rdata都是R語言特有的數(shù)據(jù)保存格式蝌诡,前者只能保存單一對象枫吧,此處用于獲取上次教程保存的Seurat對象九杂;后者可以保存某次R運行過程中所有的環(huán)境變量,可以下次重復(fù)使用甥捺,不用重復(fù)從頭執(zhí)行代碼镰禾。

  • DefaultAssay() 函數(shù)常見的參數(shù)有"RNA"和"integrated"唱逢。在尋找差異基因之前惶我,把默認的assay切換為RNA,意味著后續(xù)的處理將使用原始Count值盯蝴。設(shè)置為integrated意味著使用整合后的數(shù)據(jù)進行后續(xù)操作听怕,此類數(shù)據(jù)可以認為是經(jīng)過批處理過的尿瞭。

  • FindAllMarkers()FindMarkers()函數(shù):

    • FindAllMarkers()對所有Cluster依次進行差異表達分析,將所有Cluster分為兩類黑竞,我與非我很魂。比如對Cluster0進行分析時檐涝,其余Cluster1~7被認為是另一個整體。
    • FindMarkers()僅對指定的Cluster進行分析凡纳。
  • 差異表達分析理論:

    • FoldChange(FC帝蒿,姑且翻譯為差異倍數(shù))葛超,相同基因在不同樣本組(可以是疾病組與正常組,也可以是這里的兩個Clusters)中平均表達量差異倍數(shù),是A/B的倍數(shù)關(guān)系胖替。
    • 常見的差異倍數(shù)是將上述平均表達量的倍數(shù)關(guān)系進行取log2(FC)豫缨。
    • 根據(jù)對數(shù)圖像可以發(fā)現(xiàn)好芭,當x趨近于0時,y趨近于-∞招狸,因此看到的最終差異倍數(shù)往往是log2[(A+1)/(B+1)]裙戏。
    • 最終差異表達基因根據(jù)提前設(shè)定好的logFC和p值閾值即可得到厕诡。

差異表達分析結(jié)果解讀:

  • 對Cluster1和2進行差異表達分析灵嫌,行名是差異表達基因,列名分別為p值猖凛,log2FC平均值形病,pct.1與pct.2表示相應(yīng)基因在兩個Cluster中的表達比例(即多少細胞表達了該基因),矯正p值(是一種更嚴格的p值量瓜,可替代p值作為篩選條件)绍傲。
  • “markers = markers %>% rownames_to_column('gene') %>% filter(p_val_adj < 0.05)”作用依次為將行名作為列內(nèi)容添加到dataframe中耍共,相應(yīng)的數(shù)據(jù)維度增加一列试读,該新增列列名為'gene'钩骇,最后根據(jù)矯正p值小于0.05篩選差異基因。
  • “%>%”符號類似于Linux中管道符的作用银亲,將數(shù)據(jù)從上游傳到下游纽匙。

Cluster1和2差異表達分析結(jié)果
差異表達基因閾值過濾

ID 轉(zhuǎn)換

# 加載物種包
# 根據(jù)物種來指定
OrgDb = "org.Hs.eg.db" 

# 基因Symbol轉(zhuǎn)化為基因ENTREZID
gene_convert <- bitr(markers$gene, fromType = 'SYMBOL', toType = 'ENTREZID', OrgDb = OrgDb)

# 合并兩個表格
markers = markers%>%left_join(gene_convert,by=c("gene"="SYMBOL"))
head(markers )

二烛缔、富集分析

1. GO富集分析

注意:進行GO分析時需要使用轉(zhuǎn)換后的基因 ENTREZID

# GO
# posiible value: BP, CC, MF, all
ont = "BP" 

go.results <- enrichGO(markers$ENTREZID, keyType="ENTREZID",
                       ont="BP",OrgD = OrgDb, readable = TRUE)
go.results


dotplot(go.results)
barplot(go.results, showCategory = 10)
emapplot(pairwise_termsim(go.results))

GO富集分析可分為三個層次BP, CC, MF力穗,實際使用enrichGO() 函數(shù)進行富集分析時可通過指定BP, CC, MF,all四個參數(shù)当窗。此處僅使用BP舉例說明崖面。

markers = markers%>%left_join(gene_convert,by=c("gene"="SYMBOL")) 作用:

  • “gene_convert”數(shù)據(jù)框中包含基因Symbol和基因ENTREZID信息,markers數(shù)據(jù)框中包含差異表達基因信息庶香,兩者均含有基因但是列名不同赶掖。通過管道符及左聯(lián)函數(shù)將兩個數(shù)據(jù)框信息合并,見下圖陪白。
基因名轉(zhuǎn)換及合并
三個層次結(jié)果圖片一起畫

參考
org.Hs.eg.db

#GO富集分析
go.results <- enrichGO(gene = markers$ENTREZID, 
               OrgDb = OrgDb , 
               pvalueCutoff =0.05, 
               qvalueCutoff = 0.05,
               ont="all",
               readable =T)
write.table(go.results,file="GO.txt",sep="\t",quote=F,row.names = F)          #保存富集結(jié)果
 
#柱狀圖
# tiff(file="barplot.tiff",width = 26,height = 20,units ="cm",compression="lzw",bg="white",res=600)
pdf(file="barplot.pdf",width = 10,height = 8)
barplot(go.results, drop = TRUE, showCategory =10,split="ONTOLOGY") + facet_grid(ONTOLOGY~., scale='free')
dev.off()
 
#氣泡圖
# tiff(file="dotplot.tiff",width = 26,height = 20,units ="cm",compression="lzw",bg="white",res=600)
pdf(file="dotplot.pdf",width = 10,height = 8)
dotplot(go.results,showCategory = 10,split="ONTOLOGY") + facet_grid(ONTOLOGY~., scale='free')
dev.off()

#熱圖
tiff(file="heatplot.tiff",width = 40,height = 20,units ="cm",compression="lzw",bg="white",res=600)
heatplot(go.results,showCategory =20, foldChange=2,color = "pvalue")
dev.off()

柱狀圖:這張圖可以看出在CC,MF,BP中各個功能的terms富集的基因程度。橫坐標是富集在GO term中的基因數(shù)左邊的是GO的功能序厉,右邊是GO屬于什么數(shù)據(jù)庫以及可以看出顏色所代表的含義毕箍,越紅代表越顯著.

氣泡圖:可以到CC,BP,MF下的各個terms富集的基因數(shù)量和表達情況而柑。橫坐標代表基因所占的比例牺堰,右邊可以看出點的大小所代表的含義颅围,點越大睛榄,富集的基因越多,顏色越紅代表富集越顯著。

熱圖:可以看到每個基因在不同的GO的terms的表達程度茎辐,這可以選擇表達程度最好的幾個基因進行分析拖陆。

2. KEGG富集分析

KEGG富集分析過程與GO類似

organism = "hsa" # 對應(yīng)KEGG數(shù)據(jù)庫里的物種縮寫
kegg.results <- enrichKEGG(markers$ENTREZID, organism = organism)
write.table(kegg.results,file="KEGG.txt",sep="\t",quote=F,row.names = F)   # 保存富集結(jié)果
kegg.results <- setReadable(kegg.results, OrgDb = OrgDb, keyType='ENTREZID')

#柱狀圖
#tiff(file="barplot.tiff",width = 20,height = 12,units ="cm",compression="lzw",bg="white",res=600)
pdf(file="barplot.pdf",width = 10,height = 7)
barplot(kegg.results, drop = TRUE, showCategory = 30)
dev.off()

#氣泡圖
#tiff(file="dotplot.tiff",width = 20,height = 12,units ="cm",compression="lzw",bg="white",res=600)
pdf(file="bubble.pdf",width = 10,height = 7)
dotplot(kegg.results, showCategory = 30)
dev.off()

#熱圖
tiff(file="heatplot.tiff",width = 25,height = 15,units ="cm",compression="lzw",bg="white",res=600)
heatplot(kegg.results, showCategory =20, foldChange=cor)
dev.off()


#通路圖
library("pathview")
keggxls=read.table("KEGG.txt",sep="\t",header=T)
for(i in keggxls$ID){
  pv.out <- pathview(gene.data = cor, pathway.id = i, species = "hsa", out.suffix = "pathview")
}

kegg的通路里有的只是基因的id卻不是基因的名字依啰,所以需要轉(zhuǎn)化基因的id店枣,參考

可視化其中一個通路:

diff_genes_avg_logFC = markers$avg_log2FC
head(diff_genes_avg_logFC)

names(diff_genes_avg_logFC) = markers$ENTREZID
head(diff_genes_avg_logFC)

pathview(gene.data = diff_genes_avg_logFC, species = organism, pathway.id = kegg.results@result$ID[3])

3. GSEA富集分析

GSEA富集分析與GO/KEGG通路富集分析的區(qū)別:

  • 兩者的區(qū)別在于Pathway包含基因間互作信息长豁,Gene set只是一個單純的彼此獨立的集合蕉斜。就像新生第一次組成一個班宅此,彼此不認識爬范,相互沒聯(lián)系青瀑,就是Gene set,經(jīng)過一段時間相處彼此熟絡(luò)起來枝嘶,就是Pathway群扶。
  • GSEA使用的背景基因稱為Gene set竞阐,GO/KEGG使用的背景基因稱為Pathway暑劝。
  • 另外担猛,GSEA富集分析不用進行差異表達基因的尋找,但是需要將基因按照log2FC進行排序智嚷。
將基因按照log2FC進行排序
# markers for GSEA
## 至少多少比例的細胞表達這個基因盏道,過濾一些只在極少數(shù)細胞中有表達的基因
min.pct = 0.01 
## 過濾掉在兩組中幾乎沒有差異的基因
logfc.threshold = 0.01 
markers.for.gsea <- FindMarkers(pbmc, ident.1 = 1, ident.2 = 2, min.pct = min.pct, logfc.threshold=logfc.threshold)
# GSEA 要求輸入的是一個排好序的列表
Markers_genelist <- markers.for.gsea$avg_log2FC
names(Markers_genelist)= rownames(markers.for.gsea)
Markers_genelist <- sort(Markers_genelist, decreasing = T)

雖然說GSEA分析不用進行差異表達基因的尋找猜嘱,但是為了減少計算量還是提前過濾只在極少數(shù)細胞中表達的基因。

  • 通過“min.pct = 0.01”和“l(fā)ogfc.threshold = 0.01”參數(shù)指定弦撩。
  • 如果擔心過濾掉有意義的基因此處可以將兩個參數(shù)設(shè)為0益楼,此處進行FindMarkers()操作主要是想得到基因的log2FC用于排序点晴。
進行GSEA富集分析
GSEA原理
MSigDB數(shù)據(jù)庫可選基因集

導(dǎo)入MSigDB


m_df = msigdbr(species = 'Homo sapiens' , category = "C2")
mf_df= m_df %>% dplyr::select(gs_name,gene_symbol)
colnames(mf_df)<-c("term","gene")
gsea.results <- GSEA(Markers_genelist, TERM2GENE = mf_df)
gsea.results

gseaplot(gsea.results, gsea.results@result$ID[3])

# 保存富集結(jié)果
write_csv(gsea.results %>% data.frame, "gsea_results.csv")
  • msigdbr()作用:獲取接下來用于注釋的MSigDB背景數(shù)據(jù)集,可以通過“category”參數(shù)指定數(shù)據(jù)集族跛。

  • GSEA()函數(shù)作用:進行GSEA富集分析锐墙,參數(shù)“Markers_genelist”中包含按log2FC排序好的基因溪北,參數(shù)“TERM2GENE”中包含基因集與基因集中所有的基因信息。

  • gseaplot()函數(shù)作用:結(jié)果圖有兩個部分,上半部分橫坐標為待富集的基因敦锌,縱坐標是log2FC乙墙,可以看到基因是按log2FC降序排序好的生均。

  • 下半部分马胧,橫坐標反應(yīng)基因在基因集中命中的情況,如果命中坐標軸上就出現(xiàn)一天豎線蛙粘,縱坐標表示富集得分(ES,Enrich Score),命中就+某值出牧,沒命中就-某值。

  • 結(jié)合上下兩部分來看评抚,我們知道此處觀察Cluster1與2之間的差異表達情況慨代,當log2FC大于0時边翼,差異基因列表中的基因更多出現(xiàn)在C2參考基因集中组底,此時FC比值大于1,即基因在Cluster1中更顯著表達江滨。[圖片上傳中...(image-e53601-1679814952079-0)]

  • 可視化“gsea.results@result$ID[3]”該條基因集的富集結(jié)果唬滑。

  • 結(jié)果圖解讀:

這個圖分為三個部分

  • 第一部分:為基因 Enrichment Score 的折線圖晶密,橫軸為該基因下的每個基因模她,縱軸為對應(yīng)的 Running ES侈净,在折線圖中有個峰值,該峰值就是這個基因集的 Enrichemnt score畜侦,峰值之前的基因就是該基因集下的核心基因旋膳,核心基因就是在單細胞很重要很關(guān)鍵的基因,如果基因在頂部富集咏连,我們可以說祟滴,從總體上看垄懂,該基因集是上調(diào)趨勢,反之桶蛔,如果在底部富集仔雷,則是下調(diào)趨勢舔示;

  • 第二部分:也就是hit值惕稻,也就是圖中的黑線出現(xiàn)的位置俺祠,這個黑線可以看出第一部分每次折現(xiàn)點的基因的位置

  • 第三部分:這是rank值圖,采用了 Signal2Noise 算法淌铐,我對他的理解是腿准,縱軸它反映了基因集中的每個基因的相對表達量,橫軸可以看出這是這個基因在基因數(shù)據(jù)集中出現(xiàn)的位置加叁。

三它匕、GO/KEGG富集分析與GSEA區(qū)別

1. 概念

GO:是基因本體聯(lián)合會所建立的數(shù)據(jù)庫豫柬,旨在建立一個適用于各種物種的扑浸,對基因和蛋白質(zhì)功能進行限定和描述的喝噪,并能隨著研究不斷深入而更新的語義詞匯標準酝惧。GO 提供了一系列的語義用于描述基因功能的概念/類晚唇,以及這些概念之間的關(guān)系盗似。

KEGG:(京都基因與基因組百科全書)是了解高級功能和生物系統(tǒng)赫舒,從分子水平信息,尤其是大型分子數(shù)據(jù)集生成的基因組測序和其他高通量實驗技術(shù)的實用程序數(shù)據(jù)庫資源并鸵,是國際最常用的生物信息數(shù)據(jù)庫之一园担,以“理解生物系統(tǒng)的高級功能和實用程序資源庫”著稱弯汰。

GSEA:基因集富集分析湖雹,用于確定先驗基因集是否在兩種生物狀態(tài)(例如表型)之間差異顯著摔吏。

2. 區(qū)別

GO/KEGG差異基因的一刀切法——僅關(guān)注少數(shù)幾個顯著上調(diào)或下調(diào)的基因征讲,容易遺漏部分差異表達不顯著卻有重要生物學(xué)意義的基因诗箍,忽略一些基因的生物特性、基因調(diào)控網(wǎng)絡(luò)之間的關(guān)系及基因功能和意義等有價值的信息

GSEA不需要指定明確的差異基因閾值,算法根據(jù)實際整體趨勢分析筷狼。

參考:
https://mp.weixin.qq.com/s/ov-tLoxxK2laBm4NHjUS0Q
https://mp.weixin.qq.com/s/kP7qORDcLNFg4IDoy7m0PQ
https://mp.weixin.qq.com/s/oyj45DLIb-MNAw0LV1-VIA
https://mp.weixin.qq.com/s/pBvhxcTv0crH2VgwJRUN-Q
https://mp.weixin.qq.com/s/RvltqYd4PeECgW6yLoB2Lw
https://mp.weixin.qq.com/s/IowGCKgy-re2tzWDk35lJw
https://mp.weixin.qq.com/s/9jLQFuVATuXcvH-bVvwsRQ
https://mp.weixin.qq.com/s/JhFJJiQL-9Z6uDq4DjsgVA
https://mp.weixin.qq.com/s/QbSgYG_y1wsrMqdzGBRrQg

最后編輯于
?著作權(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)自己被綠了。 大學(xué)時的朋友給我發(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)容