当我们用R语言进行方差分析时,若得出的结论是拒绝H0,则说明n个均值之间有显著差异。为了知道究竟是哪些组间的均数有差异,就需要对多个均值进行比较,即多重比较。
多重比较的方法有许多,选用何种方法与试验设计的目的有关。
在试验设计之初,就已经明确要比较某几个组均数间是否有差异,称为事前比较。常用的事前比较方法有LSD、和Dunnett法。
若是在做了整体检验后,发现结果存在统计学差异,我们想要知道哪些组间的均数有差异,称为事后比较。常用的事后比较方法有SNK、Duncan、Turkey、Scheffe法。
Bonferroni法在事前比较和事后比较均适用。
接下来小编就用单因素方差分析的多重比较来为大家介绍这几种方法。
以R语言multcomp包中的cholesterol数据集为例进行方差分析及其多重比较。
数据介绍:Cholesterol数据集是一个完全随机试验设计的结果数据,一共50个患者接受降脂治疗五种疗法中的种疗法。其中三种治疗方法的治疗药物相同,采用不同剂量,分别是20mg一天一次(1time), 10mg一天两次(2imes)和5mg一天四次(4ime),剩下的两种方式(dnugD和dnugE) 代表候选药物。试验目的是要研究哪一种药物疗法降脂效果最好。
首先加载数据集
library(multcomp) data(cholesterol) head(cholesterol)
接下来通过方差分析的函数aov( )进行方差分析(做方差分析之前应先做正态性和方差齐性检验,在这里不做叙述)
aov.model<-aov(response~trt,data = cholesterol) aov.model
从结果可以看出F=32.43,p= 9.82e-13<0.05,说明拒绝原假设,说明五种药物疗法的效果不同。
这里向大家介绍7种多重比较方法。
1.LSD法
LSD法即最小显著差数检验法,该法比较灵敏,是t检验的简单变形,未对检验水准做出任何校正,只是为所有组的均数统一估计了一个更为稳健的标准误。要求组间的标本数必须相同,适用于被指定组间的比较检定。
用法:加载agricolae包,使用LSD.test。
语法为:
LSD.test(y, trt, DFerror, MSerror, alpha = 0.05, p.adj=c("none","holm","hommel", "hochberg", "bonferroni", "BH", "BY", "fdr"), …)
其中y为方差分析对象, trt为要进行多重比较的分组变量,p.adj可以选定P值矫正方法。当p.adj="none"时,为LSD法,p.adj="bonferroni"时为Bonferroni法。
代码:
library(agricolae) LD <- LSD.test(aov.model, "trt", p.adj = "none" ) # 进行多重比较,不矫正P值, LD$groups # 结果显示:标记字母法 plot(LD) # 可视化展示
从结果可以看出五种治疗方法的疗效存在差异。
2. Dunnett法
该方法用于多个试验组与一个对照组间的比较。
用法:加载multcomp使用glht()函数
语法为:
glht(model, linfct, alternative = c("two.sided", "less", "greater"), ...)
其中model为方差分析对象,linfct设置要进行多重比较的分组变量和方法。
代码:
library(multcomp) DT <- glht(aov.model, linfct = mcp(trt = 'Dunnett'), alternative = 'two.side')#virus是分组变量,方法为Dunnett summary(DT) par(pin=c(3,3)) #设置图画输出大小 plot(DT)#可视化
结果表明:除2times方法与1time治疗方法均值差异显著;其他三种治疗方法均与1time治疗方法均值差异显著。从图中可以看出,置信区间包含0的两个处理组差异不显著。
3. SNK法
实质上是根据预先制定的准则将各组均数分为多个子集, 利用Studentized Range分布来进行假设检验,控制了犯I类错误地概率。推荐优先用Tukey检验
用法:加载agricolae包使用SNK.test()函数
语法为:
SNK.test(y, trt, alpha = 0.05, …)
其中y为方差分析对象,trt为要进行多重比较的分组变量
代码:
library(agricolae) SK<-SNK.test(aov.model,"trt")#进行多重比较,不矫正P值 SK$group#结果显示:标记字母法 plot(SK)#可视化
程序运行结果与LSD的结果类似。
4. Duncan法(新复极差法)(SSR)
Duncan法计算简便,尤其是当各组例数不等时。指定一系列的"range"值,逐步进行计算比较得出结论。
用法:加载agricolae包使用duncan.test()函数
语法为:
duncan.test(y, trt, …)
其中y为方差分析对象,trt为要进行多重比较的分组变量
代码:
library(agricolae) DN <-duncan.test (aov.model,"trt") DN$group#结果显示:标记字母法 plot(DN)#可视化
程序运行结果与LSD的结果类似。
5. Turkey法
适用于将进行比较的组间完全对等关系的情况,具有相同的标本数是进行检定的前提。
Tukey的检验特点:所有各组的样本数相等;各组样本均数之间的全面比较;可能产生较多的假阴性结论。
用法:使用TukeyHSD ()函数
语法为:
TukeyHSD(model)
其中model为方差分析对象
代码:
TK=TukeyHSD(aov.model) TK plot(TK)#可视化
结果显示2times方法与1time方法,4times方法与2times方法,drugD方法与4times方法的均值差异不显著。从图中可以看出,置信区间包含0的两个处理组差异不显著。
6. Scheffe法
适用于需要进行全体组间比较检定。Scheffe法在需要进行比较的个数多于平均值个数时,比BonfeDoni法更容易得到明确的判断。另外,在F差检验的结果不显著时,也可以判断某组间是否存在差异等特点。在各组样本数相等或不等时均可以,但是以各组样本数不相等使用较多。
用法:加载agricolae包使用scheffe.test()函数
语法为:
duncan.test(y, trt, …)
其中y为方差分析对象,trt为要进行多重比较的分组变量
代码:
library(agricolae) SE <-scheffe.test (aov.model,"trt") SE$group#结果显示:标记字母法 plot(SE)#可视化
结果显示drugD方法与4times方法,4times方法与2times方法,2times方法与1time方法的均值差异不显著。
7. Bonferroni法
这个方法是LSD法的改良法,适用于全体组间比较检定。
将LSD.test中p.adj设置为"bonferroni"即为Bonferroni法。
代码:
library(agricolae) BI <- LSD.test(aov.model,"trt",p.adj="bonferroni")#进行多重比较,不矫正P值 BI$group#结果显示:标记字母法 plot(BI)#可视化
程序运行结果与Scheffe类似。
大家发现有些多重比较方法的结果不相同,主要原因是因为各比较方法的使用条件不同。因此,这就需要大家根据试验设计目的以及各种多重比较方法的使用条件和特点来选择合适的方法。
大家有什么疑问可以在评论区留言,我们一起进步!!!
,