美文网首页微生物16S/宏基因组/代谢组R 语言
菌群多样性分析---Alpha多样性计算

菌群多样性分析---Alpha多样性计算

作者: jjjscuedu | 来源:发表于2022-11-28 11:13 被阅读0次

    前面,我们仔细学习了Alpha多样性的一些常见指数,今天我们尝试用R来计算这些常用指数。

    library(vegan)

    library(picante)

    library(reshape2)

    library(ggplot2)

    library(tidyverse)

    library(ggpubr)

    我们今天用一个简单的OTU的丰度数据来做测试。

    #读入物种数据

    otu <- read.delim("otu_table.tsv", row.names = 1, sep = '\t', stringsAsFactors = FALSE, check.names = FALSE)

    otu <- t(otu)

    ##物种丰富度 Richness 指数

    richness <- rowSums(otu > 0)

    #或

    richness <- estimateR(otu)[1, ]

    ##Shannon(以下 Shannon 公式的对数底数均设使用 e,在 R 中即表示为 exp(1))

    #Shannon 指数

    shannon_index <- diversity(otu, index = 'shannon', base = exp(1))

    #Shannon 多样性

    shannon_diversity <- exp(1)^shannon_index

    #Shannon 均匀度(Pielou 均匀度)

    pielou <- shannon_index / log(richness, exp(1))

    ##Simpson

    #Gini-Simpson 指数(一般用这个)

    gini_simpson_index <- diversity(otu, index = 'simpson')

    #经典 Simpson 指数

    simpson_index <- 1 - gini_simpson_index

    #Invsimpson 指数(Gini-Simpson 的倒数)

    invsimpson_index <- 1 / gini_simpson_index

    #或

    invsimpson_index <- diversity(otu, index = 'invsimpson')

    #Simpson 多样性

    simpson_diversity <- 1 / (1 - gini_simpson_index)

    #Simpson 均匀度(equitability 均匀度)

    equitability <- 1 / (richness * (1 - gini_simpson_index))

    ##Chao1 & ACE

    #Chao1 指数

    chao1 <- estimateR(otu)[2, ]

    #ACE 指数

    ace <- estimateR(otu)[4, ]

    ##goods_coverage 指数

    goods_coverage <- 1 - rowSums(otu == 1) / rowSums(otu)

    ##谱系多样性(与上述相比,还需指定进化树文件)

    tree <- read.tree("rooted_tree.tre")

    pd_whole_tree <- pd(otu, tree, include.root = FALSE)

    为了方便,我们现在把这些指数封装起来,封装到一个文件中,一起计算:

    alpha <- function(x, tree = NULL, base = exp(1)) {

            est <- estimateR(x)

            Richness <- est[1, ]

            Chao1 <- est[2, ]

            ACE <- est[4, ]

            Shannon <- diversity(x, index = 'shannon', base = base)

            Simpson <- diversity(x, index = 'simpson')    #Gini-Simpson 指数

            Pielou <- Shannon / log(Richness, base)

            goods_coverage <- 1 - rowSums(x == 1) / rowSums(x)

            result <- data.frame(Richness, Shannon, Simpson, Pielou, Chao1, ACE, goods_coverage)

            if (!is.null(tree)) {

                    PD_whole_tree <- pd(x, tree, include.root = FALSE)[1]

                    names(PD_whole_tree) <- 'PD_whole_tree'

                    result <- cbind(result, PD_whole_tree)

            }

            result

    }

    #所以,我们现在使用封装好的函数,就可以一步计算所有样品的alpha指数了

    #加载 OTU 丰度表和进化树文件

    otu <- read.delim("otu_table.tsv", row.names = 1, sep = '\t', stringsAsFactors = FALSE, check.names = FALSE)

    otu <- t(otu)

    tree <- read.tree("rooted_tree.tre")

    samples_df <- read.delim("group.xls",header = T,sep="\t")  #这个不是必须的,我加载了样品的分类文件,主要是为了后面画图用的。文件内容很简单

    colnames(samples_df)<- c("ID","group")

    #不包含谱系多样性,无需指定进化树;Shannon 公式的 log 底数我们使用 2

    alpha_all <- alpha(otu, base = 2)

    #包含谱系多样性时,指定进化树文件;Shannon 公式的 log 底数我们使用 2

    alpha_all <- alpha(otu, tree, base = 2)

    alpha_all$ID <- rownames(alpha_all)   #为了后面合并用

    通过调用自己定义的alpha函数,我们便可以得到所有样品的常用的alpha指数值。

    #输出保存在本地

    write.csv(alpha_all, 'alpha.csv', quote = FALSE)

    #下面,我们对每一个指数在样品组内进行对比,看一下有没有显著性差异。其实,也可以分面的,但是在分面的过程中发现,他们共用一个纵坐标,但是参数的scale差别太大,不适合共用一个纵坐标,所以写了个for循环,单独生成了一个小提琴图,然后拼在了一起。

    alpha_all2 <- melt(alpha_all,id="ID")

    alpha_all3 <- merge(alpha_all2, samples_df, by = "ID")

    class <- unique(alpha_all3$variable)

    p_list <- list()

    index <- 1

    for(i in class)

    {

      cat("i",i,"\n")

      cat("index",index,"\n")

      alpha_tmp <- alpha_all3 %>% filter(variable == i)

      fit <- aov(value~group, alpha_tmp)

      p_value <- round(summary(fit)[[1]][1,5],3)

      p <- ggplot(data = alpha_tmp, aes(x = group, y = value)) +

                  geom_violin(aes(fill=group),trim=F,show.legend = FALSE)+

                  geom_boxplot(width=0.03,fill="white")+

                  labs(title = paste0(i,":"," p = ",p_value))+

                  xlab(NULL)+ylab(NULL)+

                  theme(text = element_text(size = 15))+

                  theme(plot.title = element_text(hjust = 0.5))

      p_list[[index]] <- p

      index <- index+1

    }

    library(cowplot)

    p <- plot_grid(p_list[[1]], p_list[[2]], p_list[[3]], p_list[[4]], p_list[[5]], p_list[[6]],p_list[[7]],p_list[[8]], ncol = 2)

    ggsave("plot.pdf", plot = p, height = 10, width = 9)

    从图中,我们便可以明显的对比不同指数在不同样品组之间的差异情况了。

    相关文章

      网友评论

        本文标题:菌群多样性分析---Alpha多样性计算

        本文链接:https://www.haomeiwen.com/subject/bvvcfdtx.html