16S 基础知识、分析工具和分析流程详解
工作中有个真理:如果你连自己所做的工作的来龙去脉都讲不清楚,那你是绝对不可能把这份工作做好的。
这适用于任何行业。如果你支支吾吾,讲不清楚,那么说难听点,你在混日子,没有静下心来工作。
检验标准:随时向别人解释你的工作,让别人提出尖锐的问题,看你是不是答不上来。
16S概念
- 什么是16S?S是什么意思?
- 16S分析是用来干嘛的?能分析什么?
- 16S大致的分析原理是什么?
有点生物学基础的会知道16S和核糖体有关,但大多数还是搞不清楚它们之间的关系。
先明确一些概念:
核糖体:Ribosome,由 RNA(rRNA)和蛋白质 组成,配合 tRNA 来翻译 mRNA。核糖体按沉降系数来分类,S就是沉降系数,原核70S,真核80S。我们一般研究微生物,70S,由50S和30S两个亚基组成。再细分为 5S、16S、23S,我们的 16S 就是指核糖体的亚基的一个组分,16S rRNA。(记住,这是原核生物核糖体的一个组分)
16S rRNA:这并不是我们的研究对象,因为我们测序的不是它,而是它对应在DNA双链上的基因序列,
16S rDNA。可以这样理解,我们所说的16S 就是指 16S rDNA。
分子钟:即氨基酸在单位时间以同样的速度进行置换。16S 的进化具有良好的时钟性质,在结构与功能上具有高度的保守性,在大多数原核生物中rDNA都具有多个拷贝,5S、16S、23S rDNA的拷贝数相同。16S rDNA由于大小适中,约1.5Kb左右,既能体现不同菌属之间的差异,又能利用测序技术较容易地得到其序列,故被细菌学家和分类学家接受。(来源百度)
所以,16S测序的大致逻辑就是:
拿到一个样品,我们捕获其16S区域(引物PCR),然后测序,16S既然有极好的保守性,那就可以用于鉴别不同的物种(相当于一个物种的独一无二的条形码)(有很大一部分是鉴定不到物种的)。
分析逻辑就是聚类成OTU,然后注释(比对已知数据库),后续分析。
偶然看到一篇好的科普文,转载一下:来自伯豪生物
1、16S
通常所说的16S是指16S rDNA(或16S rRNA),16S rRNA 基因是编码原核生物核糖体小亚基的基因,长度约1542bp,包括9个可变区和10个保守区,保守区序列反映了物种间的亲缘关系,而可变区序列则能反映物种间的差异。
因16S rDNA分子大小适中,突变率小,故成为细菌系统发育和分类鉴定最常用的标签。
16S测序是指选择16S rDNA某个或某几个变异区域,选择通用引物对环境样本(肠道、土壤、水体等)微生物进行PCR扩增,然后对PCR产物进行高通量测序,并将得到的测序数据与已有的16S rDNA数据库进行比对分析,从而对环境群落多样性进行研究,核心是物种分析,包括微生物的种类,不同种类间的相对丰度,不同分组间的物种差异以及系统进化等。
16S rDNA序列结构
2、OTU
OTU即Operational Taxonomic Units的缩写(千万表手滑写成OUT,否则就OUT了),在系统发生学或群体遗传学研究中,为了便于进行分析,人为给某一个分类单元(品系,属,种、分组等)设置的同一标志。理论上一个OTU代表一个微生物物种。
通过测序获得的大量reads,如何才能转变为我们需要的物种信息呢?首先需要对这些reads进行归类(cluster),通常在97%的相似水平划分为不同的OTU,将OTU代表序列与相应的微生物数据库比对(Silva、RDP、Greengene等),得到每个样本所含的物种信息,进而进行后续生物信息统计分析。
3、Q值
Q值评估用来测序的碱基质量,Q值与测序错误E值之间关系为如果一个碱基的Q值为20,那表示这个碱基的可能测错的可能性为1%。实际操作中常用Q20/Q30作为标准,Q20大于90%妥妥的。
4、Coverage
Coverage值是指各样本文库的覆盖率,数值越高,则样本中序列被检测出来的概率越高,该数值可反映本次测序结果是否代表样本的真实情况。数值越接近于100%,代表本次测序结果越符合样本中微生物的实际情况。
5、Alpha-diversity
Alpha多样性用于度量群落生态单样本的物种多样性,是反映丰富度和均匀度的综合指标。
菌群丰富度(Community richness)指数有:Chao、Ace,Chao或Ace指数越大,说明菌群丰富度越高。
菌群多样性(Community diversity)指数有:Shannon、Simpson,Shannon值越大,说明群落多样性越高;Simpson指数值越大,说明菌群多样性越低。
根据各样本生成的OTU,对样本序列进行随机取样,以取出的序列数及这些序列所能代表的OTU数构建曲线,计算样本的Alpha多样性。
通常Alpha多样性指数均以表格形式呈现,这显然不利于论文颜值的提升,那么可以将Alpha多样性指数结合起来,出个箱线图(Box-plot)或可有所帮助。
6、Beta-diversity
Beta多样性用于不同生态系统之间多样性的比较,利用各样本序列间的进化关系及丰度信息来计算样本间距离,反映样本(组)间是否具有显著的微生物群落差异。目前应用比较多的是PCA、PCoA、NMDS分析等。由于微生物多样性研究通常会涉及到大样本数量的样本,因此通过Beta-diversity分析可以直观地反映样本组间的差异情况。距离越远,微生物群落差异越大,即相似性越高。
7、LEfSe
LEfSe分析即LDA Effect Size分析,多用于多个分组(≧2)之间的比较,或者进行亚组比较分析,进而找到组间在丰度上有显著差异的物种(biomaker)。
基本过程是首先在多组样本中采用非参数因子Kruskal-Wallis秩和检验检测不同分组间丰度差异显著的物种;然后基于获得的显著差异物种,利用成组的Wilcoxon秩和检验进行组间差异分析;最后采用线性判别分析(LDA)对数据进行降维并评估差异显著的物种的影响力大小(即LDA score)。
LEfSe分析包含了不同分类学水平(门到属或者种)的物种信息,并且是显著差异的物种,因而是一项信息量大、采用率(biger)高的分析,值得拥有~~~
16S分析流程
建库测序暂且跳过,一下是我们拿到测序数据后的分析步骤:
- 过滤Filter
- 连接Connect Tags
- 聚类OTU Cluster
- 分类Taxonomy
- 多样性Alpha_Beta
- 。。。
Hiseq 的 16S分析流程已经比较成熟了,网上能搜到一些pipeline。
PacBio的 16S分析是最近才开发出来的。
参考文章:High-resolution phylogenetic microbial community profiling
以下是该文章的分析流程:
可以看到,PacBio 16S中大部分都在使用 mothur,这真是个好工具啊,还有详细的教程。
还有详细的数据库: Alignment database(greengenes 和 SILVA)
16S分析细节
- step01.OTU_Cluster.sh
- step02.OTU_Taxonomy.sh
- step03.Alpha_Diversity.sh
- step04.OTU_Analysis.sh
以下一次详解:
step01.OTU_Cluster.sh 的核心就是聚类得到 OTU,使用的是mothur,步骤很多。
得到OTU后,将原来的序列比对回得到的OTU上。
usearch7.0.1090/usearch7.0.1090_i86linux32 -usearch_global ./1.Clean_Tags/All_Sample.fasta -db ./2.OTU_Cluster/OTU.fasta -strand both -id 0.97 -uc ./2.OTU_Cluster/global.map.uc
usearch_global command
转化格式
bin/usearch7.0.1090/uc2otutab.py ./2.OTU_Cluster/global.map.uc > ./2.OTU_Cluster/OTU_shared_all.xls
待续~
参考:
16Sr DNA 百科
附录:
稀释性曲线(rarefaction curve)
稀释性曲线(rarefaction curve):一般是从样本中随机抽取一定数量的个体,统计出这些个体所代表物种数目,并以个体数与物种数来构建曲线。它可以用来比较测序数量不同的样本物种的丰富度,也可以用来说明样本的取样大小是否合理。分析采用对优化序列进行随机抽样的方法,以抽到的序列数与它们所能代表OTU的数目构建rarefaction curve。稀释性曲线图中,当曲线趋向平坦时,说明取样的数量合理,更多的取样只会产生少量新的OTU,反之则表明继续取样还可能产生较多新的OTU。因此,通过作稀释性曲线,可以得出样品的取样深度情况。 默认是在 97%相似性水平下划分OUT并制作各样品的稀疏曲线。
画OTU Rank curve
data <- read.table("Sample.OTU_rank_percent.xls",header=T,check.names=F) data <- t(data) data <- data[rowSums(is.na(data)) != 16,] library("RColorBrewer") col=c("#00FF40FF","#FF0000FF","#00FFFFFF") x_point=as.numeric(rownames(data)) x=max(x_point,na.rm=T) x=x*1.1 y=max(data[,1:ncol(data)],na.rm=T) pdf("Sample.OTU_rank.pdf",width=6+1*1,height=6) par(mai=c(1,1,0.5,1*1)) par("usr") plot(x,y,xlim=c(0,x),ylim=c(0.0005,100),type="n",xlab="Number of OTUs",ylab="Relative abundance(%)",main="OTU Rank Curve",tcl=-0.2,mgp=c(3,0.3,0),cex.lab=1.2,las=1,log="y",yaxt="n") axis(2,tcl=-0.2,at=c(0.001,0.01,0.1,1,10,100),labels=c(0.001,0.01,0.1,1,10,100),las=1,hadj=0.6) points(x_point,data[,1],lwd=2,lty=1,cex=0.6,col=col[1],type="l") #C1 points(x_point,data[,2],lwd=2,lty=1,cex=0.6,col=col[2],type="l") #C3.1 points(x_point,data[,3],lwd=2,lty=1,cex=0.6,col=col[3],type="l") #C3.2 legend(par("usr")[2],10^par("usr")[4],legend=colnames(data),col=col[1:3],pch=15,pt.cex=1.2,cex=0.9,bty="n",ncol=1,xpd=TRUE) dev.off() png("Sample.OTU_rank.png",type="cairo",width=6+1*1,height=6,units="in",res=120) par(mai=c(1,1,0.5,1*1)) plot(x,y,xlim=c(0,x),ylim=c(0.0005,100),type="n",xlab="Number of OTUs",ylab="Relative abundance(%)",main="OTU Rank Curve",tcl=-0.2,mgp=c(3,0.3,0),cex.lab=1.2,las=1,log="y",yaxt="n") axis(2,tcl=-0.2,at=c(0.001,0.01,0.1,1,10,100),labels=c(0.001,0.01,0.1,1,10,100),las=1,hadj=0.6) points(x_point,data[,1],lwd=2,lty=1,cex=0.6,col=col[1],type="l") #C1 points(x_point,data[,2],lwd=2,lty=1,cex=0.6,col=col[2],type="l") #C3.1 points(x_point,data[,3],lwd=2,lty=1,cex=0.6,col=col[3],type="l") #C3.2 legend(par("usr")[2],10^par("usr")[4],legend=colnames(data),col=col[1:16],pch=15,pt.cex=1.2,cex=0.9,bty="n",ncol=1,xpd=TRUE) dev.off()