方差分析(analysis of variation,简写为ANOVA)又称变异数分析或F检验,用于两个及两个以上样本均值差别的显著性检验,从函数的形式看,方差分析和回归都是广义线性模型的特例,回归分析lm()也能作方差分析。其目的是推断两组或多组数据的总体均值是否相同,检验两个或多个样本均值的差异是否有统计学意义。方差分析的基本思路为:将试验数据的总变异分解为来源于不同因素的相应变异,并作出数量估计,从而明确各个变异因素在总变异中所占的重要程度;也就是将试验数据的总变异方差分解成各变因方差,并以其中的误差方差作为和其他变因方差比较的标准,以推断其它变因所引起的变异量是否真实的一种统计分析方法。把对试验结果发生影响和起作用的自变量称为因素(factor),即我们所要检验的对象。如果方差分析研究的是一个因素对于试验结果的影响和作用,就称为单因素方差分析。因素的不同选择方案称之为因素的水平(level of factor)或处理(treatment)。因素的水平实际上就是因素的取值或者是因素的分组。样本数据之间差异如果是由于抽样的随机性造成的,称之为随机误差;如果是由于因素水平本身不同引起的差异,称之为系统误差。
单因素方差分析概述
单因素方差分析是指对单因素试验结果进行分析,检验因素对试验结果有无显著性影响的方法。单因素方差分析是用来检验多个平均数之间的差异,从而确定因素对试验结果有无显著性影响的一种统计方法。对于完全随机设计试验且处理数大于2时可以用单因素方差分析(等于2 时用t检验)。离差平方和的分解公式为:SST(总和)=SSR(组间) SSE(组内),F统计量为MSR/MSE,MSR=SSR/k-1,MSE=SSE/n-k。其中SST为总离差、SSR为组间平方和、SSE为组内平方和或残差平方和、MSR为组间均方差、MSE为组内均方差。
函数介绍
对于非正态分布的数据,一般采用Levenc检验法,且该检验同样适用于正态数据的检验。R中进行Levene检验的函数为leveneTest(),该函数包合在car 包中,使用前需要加载。
函数leveneTest()的基本将写格式为;
代码语言:javascript复制leveneTest(y, data...)
其中,y指定用于方差分析的模型公式, data指定用于检验的数据对象。
R中有多种方法实现方差分析,如利用函数aov()、anova()和onewey.test()进行分析,下面将对这些函数的具体用法进行详细介绍。
首先介绍函数oneway.test(),该函数的基本书写格式为:
代码语言:javascript复制onexay.test(formula, data, subset, na.action, vat .equal=FALSE)
参数介绍:
Fomula:指定用于方差分析的模型公式,一般是以“Ihs ~ rhs"的形式,在单因素方差分析中即为“X~A”的形式,X表示样本观测值,A表示影响因素:
Data:指定用于分析的数据对象;
Subset:一个向量,指定参数data中需要被包含在模型中的观测数据;
Na.action: 一个函数,指定缺失数据的处理方法,若为NULL,则使用函数
na.omit()删除缺失数据;
Var.equal:逻辑值,指定是否将样本观测位中的方差视为相等,若为TRUE,
则执行单因素方差分析中平均值的简单F检验,若为FALSE,则执行Welch (1951)的近似方法,默认位为FALSE。
综合案例:不同治疗方法下胆固醇降低效果的差异性分析
下面利用R语言包multcomp中数据集cholcsterol进行单因素方差分析,首次使用该包需要下载并加载:
代码语言:javascript复制>install,packages ("multcomp" )
>library (multcomp)
数据集cbolesterol是关于不同治疗方法的胆固醇降低效果的临床数据,共有50行观测值和两列变量,列变量分别是治疗方法(trt) 和胆固醇降低情况(response),变量trt中共有5个水平,分别用1time.2timnes, 4times, dnugD 和drugE表示。数据的基水情况如下:
代码语言:javascript复制> data(cholesterol)
> dim(cholesterol)
[1] 50 2
> head(cholesterol)
trt response
1 1time 3.8612
2 1time 10.3868
3 1time 5.9059
4 1time 3.0609
5 1time 7.7204
6 1time 2.7139
代码语言:javascript复制boxplot(response~trt,data=cholesterol,col=c(2:6))
下面对数据进行方差齐性检验:
代码语言:javascript复制> library(car)
> leveneTest(response~trt,data=cholesterol)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 4 0.0755 0.9893
45
输出结果显示,p值为0.9893,大于给定的显著性水平0.05,故不能拒绝原假设,即认为不同水平下的数据是等方差的。
下面利用函数oneway.test()做方差分析来比较不同治疗方法的胆固醇降低效果是否有差异显著。
代码语言:javascript复制> oneway.test(response~trt,data=cholesterol,var.equal = TRUE)
One-way analysis of means
data: response and trt
F = 32.433, num df = 4, denom df = 45, p-value = 9.819e-13
F = 32.433,对应的p值小于0.05,故拒绝原假设。
上面的分析还可以用aov函数实现。aov函数的书写格式为:
代码语言:javascript复制aov(formula, data = NULL, projections = FALSE, qr = TRUE,
contrasts = NULL, ...)
代码语言:javascript复制> fit<-aov(response~trt,data=cholesterol)
> 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
上面结果中Residuals表示残差。检验结果查看trt对于的行,同样得到F = 32.43,对应的p值小于0.05,故拒绝原假设。
最后上面结果还能能利用anova()函数实现。
代码语言:javascript复制> anova(lm(response~trt,data=cholesterol))
Analysis of Variance Table
Response: response
Df Sum Sq Mean Sq F value Pr(>F)
trt 4 1351.37 337.84 32.433 9.819e-13 ***
Residuals 45 468.75 10.42
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1