查看原文
其他

16s分析之差异OTU 挑选(edgeR)

文涛 微生信生物 2022-05-08

16s分析到多样性后我们就开始对差异OTU 进行挑选

 

基于原始count数目,我们参考两个包来做差异分析:

library(DESeq2)

library(edgeR)

 

这里当时是首先使用edgeR包做的,下面我们来使用这个包做一次差异分析

现在我们读入进入工作目录并读入文件

#使用edgr统计差异otu

setwd("E:/Shared_Folder/HG_usearch_HG")

# 读入实验设计

design =read.table("map_lxdjhg.txt", header=T, row.names= 1,sep="\t")

# 读取OTU,全部otu表没有抽平

otu_table =read.delim("otu_table.txt", row.names= 1,sep="\t",header=T,check.names=F)

为什么需要做这一步,edgeR并不是很智能,需要变量一样,并且连排列顺序都一样

# 过滤数据并排序

idx =rownames(design) %in% colnames(otu_table)

#提取分组文件

sub_design =design[idx,]

#提取OTUtable文件

count =otu_table[, rownames(sub_design)]

head(count)

这次我们载入这个包

library(edgeR)

两个重点,第一个是数据整理到DGEList中,这是一个列表,注意列表提取数据方式

# create DGElist

d =DGEList(counts=count, group=sub_design$SampleType)

d =calcNormFactors(d)#默认为TMM标准化

另一个就是完成实验分组矩阵的构建

# 生成实验设计矩阵

#生成矩阵

design.mat =model.matrix(~ 0 + d$samples$group)

#矩阵命名

colnames(design.mat)=levels(design$SampleType)


d2 =estimateGLMCommonDisp(d, design.mat)

d2 =estimateGLMTagwiseDisp(d2, design.mat)

fit = glmFit(d2,design.mat)

# 设置比较组

BvsA <-makeContrasts(contrasts = "GF5-GC5",levels=design.mat)#注意是以GF1为对照做的比较

# 组间比较,统计Foldchange, Pvalue

lrt =glmLRT(fit,contrast=BvsA)


# FDR检验,控制假阳性率小于5%

de_lrt =decideTestsDGE(lrt, adjust.method="fdr", p.value=0.05,lfc=0)#lfc=0这个是默认值

summary(de_lrt)

 

# 导出计算结果

x=lrt$table

x$sig=de_lrt

#这里加一列调整后的p

x <- cbind(x,padj = p.adjust(x$PValue, method = "fdr"))

enriched =row.names(subset(x,sig==1))

depleted =row.names(subset(x,sig==-1))

x$level =as.factor(ifelse(x$sig==1, "enriched",ifelse(x$sig==-1,"depleted","nosig")))

做一张完整的差异分析表格一定要有OTU分类信息

setwd("E:/Shared_Folder/HG_usearch_HG/uclust_assigned_taxonomy")

#在加入这个文件taxonomy时,去除后面两列不相干的列

# 读取taxonomy,并添加各列名称

taxonomy =read.delim("rep_seqs_tax.txt", row.names= 1,header=F,sep="\t")

head(taxonomy)

#发现这个注释文件并不适用于直接作图。

#采用excel将其分列处理,并且删去最后一列,才可以运行

colnames(taxonomy)=c("kingdom","phylum","class","order","family","genus","species")

# 标记差异OTU类型

x$otu =rownames(x)

 

 

#使用dplyr包,很好用的数据整理包

library(dplyr)

taxonomy$id=rownames(taxonomy)

rownames(taxonomy)= taxonomy$id

idx =rownames(taxonomy) %in% x$otu

tax =taxonomy[idx, ]

# 手动筛选显著的组

x =x[rownames(tax), ]

x$phylum =gsub("p__","",tax$phylum,perl=TRUE)

x$class =gsub("c__","",tax$class,perl=TRUE)

x$order =gsub("o__","",tax$order,perl=TRUE)

x$family =gsub("f__","",tax$family,perl=TRUE)

x$genus =gsub("g__","",tax$genus,perl=TRUE)

x$species =gsub("s__","",tax$species,perl=TRUE)

head(x)

x$otu  <- NULL

 

输出一张完整的OTU差异表格

write.table(x,"otu差异统计表格GC5-GF5.txt",quote= FALSE,row.names = T,

            col.names = T,sep = "\t")

这个当然不算完成,加上我们的相对丰度

#加上相对丰度值,同样没有计算均值,通过excel解决

WT =read.table("otu差异统计表格GF5-GC5.txt", header=T, row.names= 1, sep="\t")

head(WT)

setwd("E:/Shared_Folder/HG_usearch_HG")

otu_table =read.delim("otu_table.txt", row.names= 1,sep="\t",header=T,check.names=F)

design =read.table("map_lxdjhg.txt", header=T, row.names= 1,sep="\t")

# 过滤数据并排序

idx =rownames(design) %in% colnames(otu_table)

idx

sub_design =design[idx,]

count =otu_table[, rownames(sub_design)]

# 转换原始数据为百分比

norm =t(t(count)/colSums(count,na=T))# * 100 # normalization to total 100

 

index =merge(norm,WT, by="row.names",all=F)

head(index)

write.table(index,"otu差异统计表格GF5-GC5.txt",quote= FALSE,row.names = T,

            col.names = T,sep = "\t")

去掉不显著的otu

# 去除不显著的OTU

edgr =read.table("otu差异统计表格GF5-GC5.txt", header=T, row.names= 1, sep="\t")

head(edgr)

#匹配第一行中含有nosig的行

edgr1<-edgr[grep(pattern="nosig",edgr[,25]),]  

#做一个判别,将没有NA的行输出为TRUE

idx = !edgr[,25]%in% edgr1[,25]#前一个数据集的行名和都一个数据集的列名做匹配,输出逻辑变量

#选择T的行

edgr2=edgr[idx,]

head(edgr2)

write.table(edgr2,"otu差异统计表格GF5-GC5.txt",quote= FALSE,row.names = T,

            col.names = T,sep = "\t")

 



学习永无止境,分享永不停歇!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存