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

前面,我们仔细学习了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)

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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容