最近很多剛了解生信的同學問喵學姐:看了一些文獻,文獻里的各種圖怎么看呀,完全看不懂。今天喵學姐就來給大家講一講我們平時做的最基礎的差異分析——火山圖
火山圖(Volcano plot)是散點圖的一種,它將統計測試中的統計顯著性量度(如p-value)和變化幅度相結合,從而能夠幫助快速直觀地識別那些變化幅度較大且具有統計學意義的數據點(代謝物等)。是一種單變量統計分析方法,常應用于研究基因組、轉錄組、代謝組、蛋白質組等數據分析。
?火山圖長啥樣??
先給大家看看最最最常見的一種,基礎款:
有的人可能覺得,這不就是高級一點的散點圖+三根虛線+花里胡哨的顏色嗎?
NO NO NO,火山圖可不光只有上面那一種,
▲別人家的火山圖,是不是很美
▲別人的火山圖里竟然還有反比例函數閾值線
▲這一排火山圖放在一起是不是很有氣勢
?火山圖有啥用??
分析數據用散點圖表示看不大明白?
想要表現數據間有統計學意義的明顯差異?
我們給散點圖換個樣子,分區劃線做成?火山圖?優勢這不就來了?
火山圖是生信文章中最常見的表達圖,它最直觀的作用就是展示組間差異的物質。
比如找到腫瘤細胞跟正常細胞的差異基因,或是研究疾病組跟正常組之間的差異表達基因情況。
繪制火山圖通常需要兩個關鍵指標,
①差異倍數Fold Change值
②假設檢驗P值
?火山圖怎么看??
用之前講過的一篇非腫瘤思路文獻來舉例,:4分+非腫瘤純生信,GEO數據集+鐵死亡+cytoscape調控網絡+miRNA+轉錄因子
這張圖展現了精神分裂組與正常組之間的差異表達基因,
其中每個點代表一個基因。
藍色的點代表顯著下調的基因,紅色的點代表顯著上調的基因,而灰色的點就表示無顯著差異的基因。
那我們怎么去判斷它是顯著上調還是顯著下調呢?
這就涉及到兩個坐標軸,
②?橫坐標Log2? (Fold Change)
②縱坐標-log10 (P value)
橫坐標為log2FC值即差異倍數值。表示兩個分組之間的差異倍數,其絕對值越大說明某基因在兩組之間的表達差異也越大。該值為正時,表示差異上調;該值為負時,表示差異下調。
縱坐標為-log10(P-value)值,表示某個基因在比較分組之間的表達差異是否足夠顯著,一般認為p-value<0.05為顯著。
根據作者設置的閾值:log2FC的絕對值為0.1,p值<0.05,因此灰色部分的基因不滿足條件。
因此,橫著看基因與對照組的差異,豎著看有無統計學意義,在欣賞火山圖時,我們只需要關注左上和右上兩區,然后再研究這兩塊的基因就好啦。
?火山圖怎么做??
之前的推文已經為大家詳細講解了整篇文獻的思路框架,也教大家學習了GEO數據庫以及數據集的下載。
現在呢,我們就要開始復現文章的結果圖了,先來做GEO數據差異基因的分析,今天會使用兩個方法教大家繪制火山圖。
①使用GEO2R繪制火山圖
Step 1. 找到數據集
文獻中作者用到的數據集是GSE27383,我們直接在GEO數據庫搜索這個數據集。
它包含了精神分裂癥患者的信息和健康對照者的患者信息。
Step 2. 使用GEO2R進行分析
直接點擊GEO2R,
因為需要做兩組之間的差異基因,所以要對組別進行定義。
Step 3. 對組別進行定義
首先在Define groups定義精神分裂癥組別,命名為SCH,點擊enter鍵,將正常對照組命名為HC。
然后,把相應的樣本歸屬到不同組別中。直接選中相應的精神分裂癥的樣本,把這43個樣本歸屬到SCH組別中。
接著同樣的操作,把正常對造組的29個樣本歸屬到HC。
Step 4. 分析生成火山圖
然后點擊Analyze分析,就可以生成相應的火山圖,底下是所有的差異基因信息。包括基因探針名、校正的P值、P值、T檢驗、logFC值、基因名,直接下載就可以得到所有的差異基因的信息了。
直接將它復制到excel表格中打開。可以看到一共有45000多個差異基因,但它們并不都參與精神分裂癥的發生。
Step 5. 設置閾值,篩選差異基因
第一種方法:手動設置閾值
我們需要根據文獻中作者設置的閾值:p<0.05 and ︱logFC︱>0.1,從這兩個層面去限定閾值作為精神分裂癥與健康對造組之間的顯著差異基因。
對剛剛下載的數據進行篩選,首先使用ABS函數對logFC進行絕對值計算。
然后根據作者設置的閾值篩選我們想要的顯著性的差異基因。
最終得到4000多個參與精神分裂癥的顯著差異基因。
第二種方法:直接在GEO2R網站上設置閾值
點擊Options這一欄,并在界面右側進行閾值設置。
0.05為cut-off值, log2FC值為0.1。
點擊分析后出來的火山圖可以直接下載使用。
Step 6. 差異基因數據下載
底部是經過設置閾值后呈現的所有基因情況,也可以直接下載。
②使用在線分析平臺繪制火山圖
Step 1. 打開桑格助手分析工具http://vip.sangerbox.com/home.html
對于沒有 GEO2R 這個功能的數據集,我們可以直接在桑格助手在線平臺去做差異基因分析,只要上傳表達譜,然后輸入組別信息,就可以得到相應的差異基因情況了。
點擊?工具列表-limma差異分析工具?進入使用界面。
Step 2. 上傳表達譜信息以及組別信息
上傳處理好的表達譜文件。表達譜加載完后,左邊這一列默認為表達譜里的所有樣本。
這時我們需要用到臨床數據來分別定義精神分裂癥組別和健康對照組別。
打開從GEO數據庫下載的臨床數據集進行組別定義。在右邊新建一列,先把健康對照組篩選出來,組別命名為HC,然后對空白處的精神分裂組命名為SCH。
再把組別信息復制到桑格助手里面,這樣我們所需要的數據就準備好了。
Step 3. 設置閾值
在右邊的實驗設計選擇實驗組vs對照組,差異方法選擇limma檢驗。然后開始分析,進行命名并確認。
此處需要點擊選擇比較組來顯示火山圖,PS:因為火山圖耗的耗費的內存比較大,所以默認不顯示。
左側為所有的差異基因信息,右邊為火山圖。也可以選擇閾值參數,作者限定的是logFC值,PS:這個工具有一個缺點就是不能定義logFC值,只能定差異倍數,我們一般分析都認為若差異倍數為兩倍則顯著上調或顯著下調。
但是在此數據集中,我們設置差異倍數為2即log2FC為1的時候,基本上沒有顯著性差異的基因,所以說在文章中,作者就放寬了條件限制,設置為log2FC= 0.1 and p<0.05。
Step 4. 基因差異信息下載
頁面底部為基因差異信息,可以展現出就是在不同閾值設置的情況下相應的差異倍數上調或下調的基因數量。
在右邊,有未設置閾值/設置閾值后的所有的顯著性差異基因數據情況,都可以直接下載使用。
END
只要原始數據準備好,閾值設置好,大家也可以使用其他的在線分析平臺去繪制火山圖,喵學姐在這里就不贅述了。
火山圖繪制的底層邏輯已經告訴大家了,后面大家也可以更近一層,學習用代碼把火山圖做的更好看。
后面喵學姐再慢慢給大家講解其他的結果圖,新來的同學們可以悄悄點個關注~
最后附上雙曲線火山圖代碼
library(ggplot2)
volcano_plot <- function(df, pvalue_threshold = 0.05, foldchange_threshold = 1) {
? xmax <- max(abs(na.omit(df$log2foldchange))) + 0.2
? xmin <- min(abs(na.omit(df$log2foldchange)), 0.0001)
? x <- seq(xmin, xmax, by = 0.0001)
? y <- 1/x + (-log10(pvalue_threshold))
? curve_xy <- rbind(data.frame(xpos = x + foldchange_threshold, ypos = y),
? ? ? ? ? ? ? ? ? ? data.frame(xpos = -(x + foldchange_threshold), ypos = y))
? df$curve_y <- ifelse(df$log2foldchange > 0,
? ? ? ? ? ? ? ? ? ? ? ?1/(df$log2foldchange - foldchange_threshold) + (-log10(pvalue_threshold)),
? ? ? ? ? ? ? ? ? ? ? ?1/(-df$log2foldchange - foldchange_threshold) + (-log10(pvalue_threshold)))
? df$curve_group <- ifelse(-log10(df$pvalue) > df$curve_y & df$log2foldchange > foldchange_threshold, 'up',
? ? ? ? ? ? ? ? ? ? ? ? ? ?ifelse(-log10(df$pvalue) > df$curve_y & df$log2foldchange < -foldchange_threshold, 'down', 'nosignif'))? ?
? df$pvalue <- -log10(df$pvalue)
? p <- ggplot(df, aes(x = log2foldchange, y = pvalue, color = curve_group)) +
? ? geom_point(size = 1) +
? ? geom_line(data = curve_xy, aes(x = xpos, y = ypos), lty = 3, col = "black", lwd = 0.6) +
? ? scale_color_manual(values = c('up'='red', 'down'='blue', 'nosignif'='gray')) +
? ? xlim(-xmax, xmax) +??
? ? ylim(0, 30) +
? ? labs(x = "log2(FoldChange)", y = "-log10(P-value)") +?
? ? theme_bw() +
? ? theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
? ? ? ? ? legend.spacing.x = unit(0.05, 'cm'), plot.title = element_text(hjust = 0.5),
? ? ? ? ? legend.text = element_text(size = 8)) +?
? ? guides(color = guide_legend(override.aes = list(size = 2), title = NULL))
? return(p)
}
data <- read.table('desktop/sample_dge.txt',header=T,stringsAsFactors=F,sep='\t')
head(data)
? ? ? ? ? ? ? ? ? ? ? ? ?gene? ? ? ?pvalue log2foldchange
1? ?ENSG00000000003.15 TSPAN6 6.954955e-04? ? ? 1.0305811
2? ? ? ENSG00000000005.6 TNMD 1.103522e-01? ? ?-2.1289526
3? ? ?ENSG00000000419.12 DPM1 7.168680e-02? ? ? 0.5515042
4? ? ENSG00000000457.14 SCYL3 5.743836e-01? ? ? 0.1453620
5 ENSG00000000460.17 C1orf112 1.173320e-06? ? ? 2.1643651
6? ? ? ENSG00000000938.13 FGR 1.388476e-13? ? ?-4.0345022
p <- volcano_plot(data)
p
本文使用 文章同步助手 同步