浅析单因素方差分析中的多重比较

本脚本侧重于单因素方差分析中多重比较方法的运用;
就不展示数据正态性及齐次性的运算了(默认都符合,一般理化数据是都符合的);
有的人喜欢用Tukey检验,但会遇到一些不符合预期的问题;
让我们抽丝剥茧的来理清这些个问题,尤其注重阅读下面的讨论说明(说不定你就遇到过这样的问题);
这里用的数据涉及到多个α多样性,多个的处理(若你是做基因你可以理解成多个采样地的多个基因)同时进行多重比较。

代码和测试数据下载:http://210.75.224.110/github/Note/R/multcomp.zip

library(ggplot2)
library(ggprism)
dat <- read.table('./alpha.txt',row.names = 1,header = T,stringsAsFactors = F)#读入α多样性数据
head(dat, n = 3)
design <- read.table('./metadata.tsv',row.names = 1,header = T,stringsAsFactors = F)#读入试验设计文件
head(design, n = 3)
dat <- merge(dat,design,by='row.names')#按照行名合并文件
head(dat, n = 3)
library(reshape2)
dat <- melt(dat,id.vars = -c(2:7),variable.name = 'alpha')#宽数据变长数据
head(dat, n = 3)
dat$alpha <- as.factor(dat$alpha)#将α列转化成因子
names(dat)[4] <- 'v'#给value重新赋列名
head(dat, n = 3)

函数和参数简介

函数参数设置:

  • data就是上面整好的数据,

  • group是你的分组信息列,比如α多样性的种类(或不同的基因),

  • compare是每个α多样性要比较的不同处理(或每个gene要比较的不同处理),

  • value 值就是要比较的α多样性/gene拷贝数的数值。

整体思想如下(例如本数据):
首先给输入数据dat,根据alpha列分成不同的小子集,每个小子集比较不同Group下v值的差异情况,最后汇总输出。

# 1 -----------------------------------------------------------------------
ONE_Tukey_HSD1 <- function(data,group,compare,value){library(multcomp)#Tukey检验需要用到这个包来标显著性字母标记a <- data.frame(stringsAsFactors = F)#做一个空的数据框type <- unique(data[,group])#统计需要运行多重比较的次数for (i in type)#进行type次多重比较{g1=comparesub_dat <- data[data[,group]==i,]#根据指定的i去取相应的数据集出来#fit <- aov(sub_dat[,value] ~ sub_dat[,compare] )names(sub_dat)[names(sub_dat)==compare] <- 'g1' ## 重命名方便后面使用names(sub_dat)[names(sub_dat)==value] <- 'value' ## 重命名方便后面使用sub_dat$g1 <- factor(sub_dat$g1)#将列转化成因子以进行多重比较fit <- aov(value ~ g1,data = sub_dat )#方差分析#Tukey_HSD = TukeyHSD(fit, ordered = TRUE, conf.level = 0.95)options(warn = -1)tuk <- cld(glht(fit, alternative = 'two.sided', linfct = mcp(g1 = 'Tukey')), decreasing = TRUE)#Tukey检验多重比较Tukey.labels <- data.frame(Letters=tuk$mcletters$Letters, stringsAsFactors = FALSE)#获取多重比较字母标注Tukey.labels$compare = rownames(Tukey.labels)## 提取字母分组行名为group组名Tukey.labels$type <- imean_sd <- merge(aggregate(sub_dat[['value']],by=list(sub_dat[,'g1']),FUN=sd),#获取数据标准差aggregate(sub_dat[['value']],by=list(sub_dat[,'g1']),FUN=mean),by="Group.1"#获取数据均值)names(mean_sd) <- c('compare','std','mean')#列名重命名a <- rbind(a,merge(mean_sd,Tukey.labels,by='compare'))#合并数据}names(a) <- c(compare,'std','mean','Letters',group)#列名重命名return(a)
}# 2 -----------------------------------------------------------------------ONE_Tukey_HSD2 <- function(data,group,compare,value){library(multcompView)a <- data.frame(stringsAsFactors = F)type <- unique(data[,group])for (i in type){g1=comparesub_dat <- data[data[,group]==i,]#fit <- aov(sub_dat[,value] ~ sub_dat[,compare] )## 重命名方便后面使用names(sub_dat)[names(sub_dat)==compare] <- 'g1'names(sub_dat)[names(sub_dat)==value] <- 'value'sub_dat$g1 <- factor(sub_dat$g1)fit <- aov(value ~ g1,data = sub_dat )Tukey_HSD = TukeyHSD(fit, ordered = TRUE, conf.level = 0.95)options(warn = -1)tuk <- multcompLetters2(value ~ g1, Tukey_HSD$g1[,"p adj"], sub_dat)#tuk <- cld(glht(fit, alternative = 'two.sided', linfct = mcp(g1 = 'Tukey')), decreasing = TRUE)Tukey.labels <- data.frame(tuk['Letters'], stringsAsFactors = FALSE)## 提取字母分组行名为group组名Tukey.labels$compare = rownames(Tukey.labels)Tukey.labels$type <- imean_sd <- merge(aggregate(sub_dat[['value']],by=list(sub_dat[,'g1']),FUN=sd),aggregate(sub_dat[['value']],by=list(sub_dat[,'g1']),FUN=mean),by="Group.1")names(mean_sd) <- c('compare','std','mean')a <- rbind(a,merge(mean_sd,Tukey.labels,by='compare'))}names(a) <- c(compare,'std','mean','Letters',group)return(a)
}

ONE_Tukey_HSD1函数

这个函数核心
是cld(glht(fit, alternative = ‘two.sided’, linfct = mcp(g1 = ‘Tukey’)), decreasing = TRUE),
不会出现c>b>a情况(因为decreasing = TRUE,当然有的人喜欢这样标,)和乱标字母(比如对于mean最低的点
并不一定标记成c(a>b>c时)或并不一定标记成a(c>b>a时),其只能保证有差异的数据一定是不同字母),
但是多重比较出现“ac”标注,没法解决。

ONE_Tukey_HSD2函数

而ONE_Tukey_HSD2核心是这个 multcompLetters2(value ~ g1, Tukey_HSD$g1[,”p adj”], sub_dat),
multcompLetters2这个函数隶属于multcompView包,与 multcompLetters不同的是
multcompLetters2可以接受formula,而multcompLetters只接受一个两两比较的p值的数据框,
且可能多重比较时出现“ac”标注,以及出现c>b>a情况和乱标字母(比如对于mean最低的点
并不一定标记成c(a>b>c时)或并不一定标记成a(c>b>a时),其只能保证有差异的数据一定是不同字母)。

当然多重比较好多方法,不要局限于一种方法,
例如下面的第三种可以用library(agricolae)包中的LSD检验(用的“BH”校正),

当然也可以用library(agricolae)包中的
【Duncan法】(新复极差法)(SSR);
【SNK法】(Student-Newman-Keuls);
【Scheffe检验】;

这三种多重比较方法同LSD检验的用法一样都可以避免出现上面提到的三种情况即:

1、 a、b、c的顺序不会出现c>b>a;

2、不会出现乱标字母(比如对于mean最低的点并不一定标记成c(a>b>c时)或
并不一定标记成a(c>b>a时),其只能保证有差异的数据一定是不同字母);

3、多重比较时出现“ac”标注。

ONE_LSD函数

# 3 -----------------------------------------------------------------------
ONE_LSD <- function(data,group,compare,value){library(agricolae)a <- data.frame(stringsAsFactors = F)type <- unique(data[,group])for (i in type){# sub_dat <- subset(data,group == i)sub_dat <- data[data[,group]==i,]# fit <- aov(value ~ compare,sub_dat)fit <- aov(sub_dat[,value] ~ sub_dat[,compare] )out <- LSD.test(fit,'sub_dat[, compare]',p.adj='BH')#进行了p值校正#out$groups就可获取多重比较字母列表out$groups$type <- iout$groups$compare <- rownames(out$groups)a <- rbind(a,merge(out$means[,1:2], out$groups,by='sub_dat[, value]'))}names(a) <- c('mean','std','lsd',group,compare)return(a)
}

alpha多样性在不同处理下的差别

运行,这里拿alpha多样性测试,看不同alpha多样性在不同处理下的差别。

#1
#df1 <- ONE_Tukey_HSD1(data=dat,group='alpha',compare='Group',value='v')
df1 <- ONE_Tukey_HSD1(dat,'alpha','Group','v')

在此可以查看各个α多样性下不同处理间的多重比较字母标注结果,这也是本脚本的亮点之一

数据量很大的情况下,可以直接查看差异情况,不用一个个的做出图再点开看,很是方便。

df1

p1 = ggplot(dat)+geom_boxplot(aes(x=Group,y=v,fill=Group))+geom_text(data=df1,aes(x=Group,y=mean+1.3*std,label=Letters))+facet_wrap(.~alpha,scales = "free_y")+ labs(x='Group',y='AlphaDiv')+ggprism::theme_prism()+theme(axis.text.x = element_text(angle = 45))

本图一张即可包含所有数据情况,方便查看

p1

#2
#df2 <- ONE_Tukey_HSD2(data=dat,group='alpha',compare='Group',value='v')
df2 <- ONE_Tukey_HSD2(dat,'alpha','Group','v')
df2

p2 = ggplot(dat)+geom_boxplot(aes(x=Group,y=v,fill=Group))+geom_text(data=df2,aes(x=Group,y=mean+1.3*std,label=Letters))+facet_wrap(.~alpha,scales = "free_y")+ labs(x='Group',y='AlphaDiv')+ggprism::theme_prism()+theme(axis.text.x = element_text(angle = 45))
p2

#3
#df3 <- ONE_LSD(data=dat,group='alpha',compare='Group',value='v')
df3 <- ONE_LSD(dat,'alpha','Group','v')
df3

p3 = ggplot(dat)+geom_boxplot(aes(x=Group,y=v,fill=Group))+geom_text(data=df3,aes(x=Group,y=mean+1.3*std,label=lsd))+facet_wrap(.~alpha,scales = "free_y")+ labs(x='Group',y='AlphaDiv')+ggprism::theme_prism()+theme(axis.text.x = element_text(angle = 45))
p3


Output figure width and height
Letter纸图片尺寸为单栏89 mm,双栏183 mm,页面最宽为247 mm
推荐比例16:10,即半版89 mm x 56 mm; 183 mm x 114 mm

# ggsave("./alpha1.pdf", p1, width = 350, height = 200, units = "mm")
# ggsave("./alpha2.pdf", p2, width = 350, height = 200, units = "mm")
# ggsave("./alpha3.pdf", p3, width = 350, height = 200, units = "mm")

参考资料

EasyAmplicon/script/alpha_boxplot.R

差异分析、显著性标记及统计作图的自动实现R代码示例

multcompView: Visualizations of Paired Comparisons

作者:flyfly、旭日阳光

责编:马腾飞 南京农业大学

审核:刘永鑫 中科院遗传发育所

猜你喜欢

10000+:菌群分析 宝宝与猫狗 梅毒狂想曲 提DNA发Nature Cell专刊 肠道指挥大脑

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:学术图表 高分文章 生信宝典 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树

必备技能:提问 搜索  Endnote

文献阅读 热心肠 SemanticScholar Geenmedical

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在线工具:16S预测培养基 生信绘图

科研经验:云笔记  云协作 公众号

编程模板: Shell  R Perl

生物科普:  肠道细菌 人体上的生命 生命大跃进  细胞暗战 人体奥秘

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。PI请明示身份,另有海内外微生物相关PI群供大佬合作交流。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

点击阅读原文,跳转最新文章目录阅读

浅析R语言单因素方差分析中的多重比较相关推荐

  1. R语言单因素方差分析(One-Way ANOVA)实战:探索性数据分析(EDA)、单因素方差分析模型结果解读(检查模型假设)、分析不同分组的差异TukeyHSD、单因素方差分析的结果总结

    R语言单因素方差分析(One-Way ANOVA)实战:探索性数据分析(EDA).单因素方差分析模型结果解读(检查模型假设).分析不同分组的差异TukeyHSD.单因素方差分析的结果总结 目录 R语言 ...

  2. R语言单因素方差分析与协方差分析

    R语言单因素方差分析与协方差分析 条件: 各个样本是相互独立的随机: 各个样本来自正态总体: 具有方差齐性: 用途: 检验两个或多样本均数间的差异有无统计学意义:注:本均数的比较可以采用 t检验或 F ...

  3. R语言生存分析中的OR值是什么?如何解读?

    R语言生存分析中的OR值是什么?如何解读? 目录 R语言生存分析中的OR值是什么?如何解读? #从Logistic模型说起

  4. R语言单因素方差分析及两两比较

    一.导语 两个样本均数的比较用t检验,那么多个样本均数的比较应该采用什么方法分析呢?就是接下来介绍的方差分析.方差分析由统计学家R.A.Fisher提出,又称为F检验.是通过对数据变异的分析来推断两个 ...

  5. R语言单因素方差分析(附代码)

    单因素方差分析 概念不给大家赘述了,可自行查阅相关书籍. 直接上题目: 题目 pseudomonas aeruginosa菌在样本A中的丰度为:0.014,0.015,0.017:在样本B中的丰度为: ...

  6. 浅析R语言非参数检验的多组比较及分面与分组的图形艺术

    浅析R语言多组定量资料非参数检验的多组比较及簇状柱形图显著性字母标记之分面与分组的图形艺术 R语言多组定量资料非参数检验的多组比较 非参数检验的应用 本流程是在刘永鑫老师提供的代码资料指导下完成 测试 ...

  7. R语言效用分析 ( 效能分析、Power analysis)、除了pwr包之外还有其它包、例如、基因研究中的效能分析、MBESS包可用于各种形式的效能分析和最少样本量确定、其他效用分析包的简要介绍

    R语言效用分析 ( 效能分析.Power analysis).除了pwr包之外还有其它包.例如.基因研究中的效能分析(power analysis).MBESS包可用于各种形式的效能分析(power ...

  8. R语言e1071包中的支持向量机:构建nu-classification类型的支持向量机SVM并分析不同nu值惩罚下模型分类螺旋线型(sprials)线性不可分数据集的表现

    R语言e1071包中的支持向量机:构建nu-classification类型的支持向量机SVM并分析不同nu值惩罚下模型分类螺旋线型(sprials)线性不可分数据集的表现 目录

  9. R语言e1071包中的支持向量机:仿真数据(螺旋线性不可分数据集)、简单线性核的支持向量机SVM(模型在测试集上的表现、可视化模型预测的结果、添加超平面区域与原始数据标签进行对比分析)、如何改进核函数

    R语言e1071包中的支持向量机:仿真数据(螺旋线性不可分数据集).简单线性核的支持向量机SVM(模型在测试集上的表现.可视化模型预测的结果.添加超平面区域与原始数据标签进行对比分析).如何改进核函数 ...

  10. r语言在java中的实现_R语言在现实中的应用

    R语言在现实中的应用有哪些?主要有以下几种 - 1.数据科学 "哈佛商业评论"将数据科学家命名为"21世纪最性感的工作". Glassdoor将其命名为2016 ...

最新文章

  1. java加密解密与数字证书的操作
  2. 自己动手实现自旋锁(spinlock)
  3. easyui左侧导航菜单右侧载入百度地图项目框架
  4. 复合机 涂布机_涂布复合机适用的范围在那些地方?
  5. 5、android使用意图传递数据之全局变量传递
  6. jira7.12.1安装与破解
  7. 2017.11.24
  8. 8 定制10MINs 3
  9. bootstrap表格插件php,深入了解Bootstrap table表格插件(一)
  10. 转:敏捷方式scrum 方案
  11. 分库分表 or 中间件 ?
  12. mac 安装zkcli_mac zookeeper安装使用
  13. fh 幅频特性曲线怎么画fl_测量rc带通滤波器的幅频特性和相频特性-电子科技大学.ppt...
  14. 有了这些组件和模板,天下没有难做的移动端驾驶舱
  15. Python中过滤列表中全部奇数
  16. 4199病毒如何清除
  17. kronecker delta函数
  18. 设计模式--创建型设计模式
  19. MySQL Error:1677
  20. Linux内核自带SPI设备驱动测试程序分析:spidev_test.c

热门文章

  1. 对于离散行业如何选型MES系统,你知道吗?
  2. SSR远程登陆服务器配置
  3. linux 不换行显示数据库,linux下怎么在不按回车情况下就能读取字符读取到字符不回显...
  4. 如何用计算机完成一篇文稿制作手写作业,怎样把手写作文快速弄成电子版
  5. 什么是负边沿触发_负边沿jk触发器功能测试
  6. 智能优化算法的常用改进方法
  7. Excel数据批量导入导出(基础版)
  8. 互联网在线地图平台对比分析
  9. 手机识别图片文字的方法
  10. 云真机可以帮助测试解决什么问题?