R語言數據分析與挖掘(第五章):方差分析(1)——單因素方差分析

  • 2019 年 12 月 13 日
  • 筆記

方差分析(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()的基本將寫格式為;

leveneTest(y, data...)

其中,y指定用於方差分析的模型公式, data指定用於檢驗的數據對象。

R中有多種方法實現方差分析,如利用函數aov()、anova()和onewey.test()進行分析,下面將對這些函數的具體用法進行詳細介紹。

首先介紹函數oneway.test(),該函數的基本書寫格式為:

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進行單因素方差分析,首次使用該包需要下載並載入:

>install,packages ("multcomp" )  >library (multcomp)

數據集cbolesterol是關於不同治療方法的膽固醇降低效果的臨床數據,共有50行觀測值和兩列變數,列變數分別是治療方法(trt) 和膽固醇降低情況(response),變數trt中共有5個水平,分別用1time.2timnes, 4times, dnugD 和drugE表示。數據的基水情況如下:

> 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
boxplot(response~trt,data=cholesterol,col=c(2:6))

下面對數據進行方差齊性檢驗:

> 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()做方差分析來比較不同治療方法的膽固醇降低效果是否有差異顯著。

> 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函數的書寫格式為:

aov(formula, data = NULL, projections = FALSE, qr = TRUE,      contrasts = NULL, ...)
> 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()函數實現。

> 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