R语言数据分析与挖掘(第五章):方差分析(1)——单因素方差分析

2019-12-13 12:15:54 浏览数 (1)

方差分析(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

0 人点赞