R语言差异检验:单因素方差分析


t检验可以解决单样本、双样本时的均数比较。当要比较的组多于两个时,t检验方法就难以满足这种需求,此时就需要使用方差分析来进行参数检验。

它比较的是组间差异。

方差分析介绍

方差分析(Analysis of Variance,简称ANOVA),又称“变异数分析”,是R.A.Fisher发明的,用于两个及两个以上样本均数差别的显著性检验。

适用条件

  • 独立性
  • 正态性
  • 方差齐性

方差分析对样本独立性要求较高。

对正态分布是稳健的,样本正态性不会太大影响方差分析结果。

方差齐性方面,一般而言,只要最大/最小方差之比小于3,分析结果都是稳定的。

分类

  • 单因素ANOVA
  • 双因素ANOVA
  • 协方差分析
  • 多元方差分析
  • 重复测量方差分析

R语言

方差分析在R语言中用aov函数实现。

格式:
aov(formula,data=dataframe)

formula为表达式。表达式可以使用的特殊符号如下:

符号 用法
~ 分隔符号,左边为响应变量,右边为解释变量。例如,用A、B、C预测y,代码为y~A+B+C
: 表示变量的交互项。例如用A、B和A与B的交互项来预测y,代码为y~A+B+A:B
* 表示所有可能的交互项。
^ 表示交互项达到某个次数。代码y(A+B+C)^2可展开为yA+B+C+A:B+A:C+B:C
. 表示包含除了因变量外的所有变量。例如,若一个数据框包含变量y、A、B和C,代码y~.可展开为y ~A+B+C

单因素方差分析示例

出于组间差异性检验的目的,为了方便仅展示单因素方差分析示例。
单因素方差分析即一个自变量一个因变量的方差分析。自变量为分类变量,因变量为连续变量。

数据集

所使用数据集multcomp包中cholesterol数据集。
数据集中,50名患者分别接受降低胆固醇药物治疗(trt)五种疗法中的一种疗法。其中三种治疗条件使用药物相同,分别是20mg一天一次、10mg一天两次、5mg一天四次。剩下的两种方式(drugD和drugE)代表候选药物。问哪种药物疗法降低胆固醇(因变量)最多。药物之间药效是否存在差异。

示例

#载入包
library(multcomp)
#绑定数据集
attach(cholesterol)
#查看各组样本大小
table(trt)
trt
 1time 2times 4times  drugD  drugE 
    10     10     10     10     10 
#查看各组均值
aggregate(response,by=list(trt),FUN=mean)
  Group.1        x
1   1time  5.78197
2  2times  9.22497
3  4times 12.37478
4   drugD 15.36117
5   drugE 20.94752
#查看各组标准差
aggregate(response,by=list(trt),FUN=sd)
  Group.1        x
1   1time 2.878113
2  2times 3.483054
3  4times 2.923119
4   drugD 3.454636
5   drugE 3.345003
#检验组间差异(ANOVA)
fit <- aov(response~trt)
#查看拟合情况
summary(fit)
            Df Sum Sq Mean Sq F value   Pr(>F)    
trt          4 1351.4   337.8   32.43 9.82e-13 ***
Residuals   45  468.8    10.4                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#绘制各组均值及其置信区间图形
#载入gplots
library(gplots)
#绘图
plotmeans(response~trt,xlab = 'Treatment',ylab = 'Response',main='Mean Plot\nwith 95% CI')
#解除绑定
detach(cholesterol)

在这里插入图片描述
由上图可见各组药物药效之间95%置信区间的差异。

置信区间与假设检验是互补关系。置信区间回答量的问题,即总体均数范围在哪里。
假设检验回答质的问题,即总体均数之间是否存在差异,以及在统计上确认这种差异的把握有多大。

多重比较

由ANOVA模型可知,五种药物疗法效果不同。具体差异需要进行多重比较。

  • R自带的函数TukeyHSD()函数提供各组均值差异的成对检验。

    • TukeyHSD(fit)查看具体数值
    • plot(TukeyHSD(fit))差异可视化
  • multcomp包glht()函数提供多重均值比较更为全面的方法,即适用于线性模型,也适用于广义线性模型。

以 multcomp包glht()函数为例做展示

library(multcomp)
par(mar=c(5,4,6,2))
tuk <- glht(fit,linfct=mcp(trt='Tukey'))
plot(cld(tuk,level=0.5),col='lightgrey')

图中,有相同字母的组说明均值差异不显著。
在这里插入图片描述

评估检验的假设条件

  • 独立性
    由实验设计环节进行控制
  • 正态性

使用car包qqplot()函数。要求用lm()拟合

#载入包
library(car)
#调用qqplot函数
qqPlot(lm(response~trt,data = cholesterol),simulate=TRUE,
+        main='Q-Q Plot',labels=FALSE)

由图可知数据落在95%置信区间范围,说明满足正态性假设。
在这里插入图片描述

  • 方差齐性

用Bartlett球形检验

bartlett.test(response~trt,data=cholesterol)

	Bartlett test of homogeneity of variances

data:  response by trt
Bartlett's K-squared = 0.57975, df = 4, p-value =
0.9653
#P大于0.05,说明方差齐性

方差齐性对离群点非常敏感。可利用car包中outlierTest()函数来检测离群点

library(car)
outlierTest(fit)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
   rstudent unadjusted p-value Bonferroni p
19 2.251149           0.029422           NA
#没有证据说明胆固醇数据中含有离群点(当p>1时将产生NA)

R R语言小白速通
R 懂点R语言
欢迎分享收藏关注

发布了38 篇原创文章 · 获赞 13 · 访问量 3295

猜你喜欢

转载自blog.csdn.net/renewallee/article/details/103003143