DESeq2篩選差異OTU

1.DESeq包安裝

install.packages("BiocManager")
library(BiocManager)
BiocManager::install("DESeq2")
library(DESeq2)

2.數據準備

共需要兩份數據文件

a.OTU丰度表格,otutab.txt;(每一列爲一個樣本,每一行爲一種OTU,交叉區域爲每種OTU在各樣本中的丰度,DESeq2計算時只能識別整數,不識別小數,所以請不要使用相對丰度表格)

b.樣本分組信息表格,即metadata.txt。(行爲樣本名稱,第二列爲各樣本對應的分組信息)

3.常規流程

a. 讀入文件

otu_file <- read.delim('otutab.txt', row.names = 1, sep = '\t', stringsAsFactors = FALSE, check.names = FALSE)
group_file <- read.delim('metadata.txt', row.names = 1, sep = '\t')

b. 使用?? DESeq2參閱官方說明文檔中的常規流程

Step 1,使用DESeqDataSet(),構建DESeq2存儲read數的數據集;

Step 2,使用DESeq(),基於負二項式(Negative Binomial或稱 Gamma-Poisson)分佈,對數據(本示例中爲OTU丰度數據)進行DESeq差異分析;

Step 3,使用results(),用於在DESeq分析中提取結果。

4.png

 

library(DESeq2)
dds <- DESeqDataSetFromMatrix(countData = otu_file, colData = group_file, design = ~group)#構建 DESeqDataSet 對象  
dds <- DESeq(dds) #差異分析
suppressMessages(dds)

c.結果查看

接下來,我們要查看總體結果,並根據p-value進行重新排序。利用summary命令統計顯示一共多少個OTU上調和下調

res <- results(dds, contrast=c('group', 'treat', 'control'))#提取分析結果
res = res[order(res$pvalue),]
res #查看結果
summary(res)  #簡要統計結果
table(res$padj<0.05) #查看fdr校正後的P<0.05的個數

d.提取差異OTU並進行註釋

獲取padj(p值經過多重校驗校正後的值)小於0.05,表達倍數取以2爲對數後大於1或者小於-1的差異OTU

diff_OTU_deseq2 <-subset(res, padj < 0.05 & abs(log2FoldChange) > 1)
#或
# diff_OTU_deseq2 <-subset(res,padj < 0.05 & (log2FoldChange > 1 | log2FoldChange < -1))
dim(diff_OTU_deseq2)
head(diff_OTU_deseq2)
write.csv(diff_OTU_deseq2,file= "DEG_treat_vs_control.csv")

e.合併結果

resdata <-  merge(as.data.frame(res),as.data.frame(counts(dds,normalize=TRUE)),by="row.names",sort=FALSE)
write.table(resdata,file= "DESeq2_Group_genus.txt",sep="\t",quote=F,row.names=F)

4.火山圖繪製

首先在上文得到的轉化爲數據框類型的DESeq2差異分析結果“resdata”的基礎上,根據其中log2FoldChange、padj這兩個重要的指標,對OTU進行分類.

for (i in 1:nrow(resdata)) {
    if (abs(resdata[i,'log2FoldChange']) >= 0.5) resdata[i,'select_change'] <- 'y' else resdata[i,'select_change'] <- 'n'
    if (resdata[i,'padj'] %in% NA | abs(resdata[i,'padj']) >= 0.05) resdata[i,'select_pvalue'] <- 'n' else resdata[i,'select_pvalue'] <- 'y'
    resdata[i,'select'] <- paste(resdata[i,'select_change'], resdata[i,'select_pvalue'], sep = '')
}

對於每個OTU,若log2FoldChange < 0.5,即該OTU在兩組間的丰度差異倍數低於2(默認情況下,將差異倍數2判定爲分界點),則在“resdata”的“select_change”列標記爲“n”,反之爲“y”;若padj >= 0.05,即校正後的顯著性p值未低於0.05的顯著性水平,則在“resdata”的“select_pvalue”列標記爲“n”,反之爲“y”。

同時合併“select_change”和“select_pvalue”的結果,可得到“nn”(p >= 0.05,FC < 2)、“ny”(p < 0.05,FC < 2)、“yn”(p >= 0.05,FC >= 2)、“yy”(p < 0.05,FC >= 2)四種組合。

library(ggplot2)
 
##ggplot2 差異火山圖
resdata$select <- factor(resdata$select, levels = c('nn', 'ny', 'yn', 'yy'), labels = c('p >= 0.05, FC < 2', 'p < 0.05, FC < 2', 'p >= 0.05, FC >= 2', 'p < 0.05, FC >= 2'))
 
#縱軸爲顯著性 p 值
volcano_plot_pvalue <- ggplot(resdata, aes(log2FoldChange, -log(padj, 10))) +
geom_point(aes(color = select), alpha = 0.6) +
scale_color_manual(values = c('gray30', 'green4', 'red2', 'blue2')) +
theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent')) +
theme(legend.title = element_blank(), legend.key = element_rect(fill = 'transparent'), legend.background = element_rect(fill = 'transparent')) +
geom_vline(xintercept = c(-0.5, 0.5), color = 'gray', size = 0.5) + 
geom_hline(yintercept = -log(0.05, 10), color = 'gray', size = 0.5) +
labs(x = 'log2 Fold Change', y = '-log10 p-value')
 
ggsave('volcano_plot_pvalue.png', volcano_plot_pvalue, width = 6, height = 5)

10.png

第二種繪圖方式

 可在火山圖上添加標籤,以我的數據爲例

with(resdata, plot(log2FoldChange, -log10(pvalue), pch=20, main="Volcano plot", xlim=c(-2.5,4)))

# Add colored points: red if padj<0.05, orange of log2FC>1, green if both)
with(subset(resdata, padj<.05 ), points(log2FoldChange, -log10(pvalue), pch=20, col="red"))
with(subset(resdata, abs(log2FoldChange)>1), points(log2FoldChange, -log10(pvalue), pch=20, col="orange"))
with(subset(resdata, padj<.05 & abs(log2FoldChange)>1), points(log2FoldChange, -log10(pvalue), pch=20, col="green"))

# Label points with the textxy function from the calibrate plot
library(calibrate)
with(subset(resdata, padj<.05 & abs(log2FoldChange)>1.5), textxy(log2FoldChange, -log10(pvalue), labs=ID, cex=.8))

 

繪圖方式三

rm(list = ls())
library(ggplot2)
resdata$color <- ifelse(resdata$padj<0.05 & abs(resdata$log2FoldChange)>= 1,ifelse(resdata$log2FoldChange > 1,'red','blue'),'gray')
color <- c(red = "red",gray = "gray",blue = "blue")

p <- ggplot(resdata, aes(log2FoldChange, -log10(padj), col = color)) +
  geom_point() +
  theme_bw() +
  scale_color_manual(values = color) +
  labs(x="log2 (fold change)",y="-log10 (q-value)") +
  geom_hline(yintercept = -log10(0.05), lty=4,col="grey",lwd=0.6) +
  geom_vline(xintercept = c(-1, 1), lty=4,col="grey",lwd=0.6) +
  theme(legend.position = "none",
        panel.grid=element_blank(),
        axis.title = element_text(size = 16),
        axis.text = element_text(size = 14))
p

參考來源:http://blog.sciencenet.cn/blog-3406804-1163479.html

https://www.jianshu.com/p/3a0e1e3e41d0

關於EdgeR分析差異OTU詳見博文https://www.jianshu.com/p/e6bc48d8573e

發佈了46 篇原創文章 · 獲贊 77 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章